From 21f58e7e1dae8a9d663dbbc73ec599cac667c634 Mon Sep 17 00:00:00 2001 From: "xb.Q" <3099068075@qq.com> Date: Fri, 7 Nov 2025 01:54:49 +0800 Subject: [PATCH 1/2] no message --- App.vue | 94 +- UNI_APP_BUILD_FIX.md | 44 + components/PushNotification.vue | 3 +- config/environment.d.ts | 29 + config/environment.js | 72 +- config/network.d.ts | 19 + config/network.js | 40 +- config/server.js | 5 +- dist/dev/mp-weixin/index.html | 82 + entry-server.js | 10 + main.ts | 295 +- manifest.json | 21 +- node_modules/.yarn-integrity | 18 - .../lib/identifier.js | 8 +- .../lib/identifier.js.map | 2 +- .../helper-validator-identifier/package.json | 4 +- .../@babel/parser/bin/babel-parser.js | 2 +- node_modules/@babel/parser/lib/index.js | 11401 ++++++++-------- node_modules/@babel/parser/lib/index.js.map | 2 +- node_modules/@babel/parser/package.json | 14 +- .../@babel/parser/typings/babel-parser.d.ts | 324 +- .../types/lib/asserts/generated/index.js | 22 +- .../types/lib/asserts/generated/index.js.map | 2 +- .../types/lib/ast-types/generated/index.js | 2 +- .../lib/ast-types/generated/index.js.map | 2 +- .../types/lib/builders/generated/index.js | 2002 ++- .../types/lib/builders/generated/index.js.map | 2 +- .../types/lib/builders/generated/lowercase.js | 2896 ---- .../lib/builders/generated/lowercase.js.map | 1 - .../types/lib/builders/generated/uppercase.js | 1792 ++- .../lib/builders/generated/uppercase.js.map | 2 +- .../@babel/types/lib/builders/validateNode.js | 6 +- .../types/lib/builders/validateNode.js.map | 2 +- .../types/lib/constants/generated/index.js | 3 +- .../lib/constants/generated/index.js.map | 2 +- .../@babel/types/lib/constants/index.js | 8 +- .../@babel/types/lib/constants/index.js.map | 2 +- .../gatherSequenceExpressions.js.map | 2 +- .../types/lib/converters/toExpression.js | 1 - .../types/lib/converters/toExpression.js.map | 2 +- .../converters/toSequenceExpression.js.map | 2 +- .../types/lib/converters/valueToNode.js | 19 +- .../types/lib/converters/valueToNode.js.map | 2 +- .../@babel/types/lib/definitions/core.js | 376 +- .../@babel/types/lib/definitions/core.js.map | 2 +- .../types/lib/definitions/experimental.js | 40 +- .../types/lib/definitions/experimental.js.map | 2 +- .../@babel/types/lib/definitions/flow.js | 42 +- .../@babel/types/lib/definitions/flow.js.map | 2 +- .../@babel/types/lib/definitions/index.js | 22 +- .../@babel/types/lib/definitions/index.js.map | 2 +- .../@babel/types/lib/definitions/jsx.js | 25 +- .../@babel/types/lib/definitions/jsx.js.map | 2 +- .../@babel/types/lib/definitions/misc.js | 5 +- .../@babel/types/lib/definitions/misc.js.map | 2 +- .../types/lib/definitions/typescript.js | 125 +- .../types/lib/definitions/typescript.js.map | 2 +- .../@babel/types/lib/definitions/utils.js | 81 +- .../@babel/types/lib/definitions/utils.js.map | 2 +- .../@babel/types/lib/index-legacy.d.ts | 133 +- node_modules/@babel/types/lib/index.d.ts | 3841 +++--- node_modules/@babel/types/lib/index.js | 34 +- node_modules/@babel/types/lib/index.js.flow | 136 +- node_modules/@babel/types/lib/index.js.map | 2 +- .../typescript/removeTypeDuplicates.js | 17 +- .../typescript/removeTypeDuplicates.js.map | 2 +- .../lib/retrievers/getBindingIdentifiers.js | 1 - .../retrievers/getBindingIdentifiers.js.map | 2 +- .../@babel/types/lib/traverse/traverseFast.js | 24 +- .../types/lib/traverse/traverseFast.js.map | 2 +- .../types/lib/utils/deprecationWarning.js | 6 +- .../types/lib/utils/deprecationWarning.js.map | 2 +- .../types/lib/validators/generated/index.js | 55 +- .../lib/validators/generated/index.js.map | 2 +- .../@babel/types/lib/validators/is.js | 2 +- .../@babel/types/lib/validators/is.js.map | 2 +- .../@babel/types/lib/validators/isLet.js | 8 +- .../@babel/types/lib/validators/isLet.js.map | 2 +- .../types/lib/validators/isPlaceholderType.js | 6 +- .../lib/validators/isPlaceholderType.js.map | 2 +- .../@babel/types/lib/validators/isType.js | 7 +- .../@babel/types/lib/validators/isType.js.map | 2 +- .../@babel/types/lib/validators/isVar.js | 12 +- .../@babel/types/lib/validators/isVar.js.map | 2 +- .../types/lib/validators/matchesPattern.js | 12 +- .../lib/validators/matchesPattern.js.map | 2 +- .../@babel/types/lib/validators/validate.js | 20 +- .../types/lib/validators/validate.js.map | 2 +- node_modules/@babel/types/package.json | 29 +- .../dist/sourcemap-codec.umd.js | 20 +- .../dist/sourcemap-codec.umd.js.map | 2 +- .../@jridgewell/sourcemap-codec/package.json | 8 +- .../compiler-core/dist/compiler-core.cjs.js | 925 +- .../dist/compiler-core.cjs.prod.js | 912 +- .../compiler-core/dist/compiler-core.d.ts | 105 +- .../dist/compiler-core.esm-bundler.js | 764 +- node_modules/@vue/compiler-core/package.json | 10 +- node_modules/@vue/compiler-dom/README.md | 2 +- .../compiler-dom/dist/compiler-dom.cjs.js | 274 +- .../dist/compiler-dom.cjs.prod.js | 97 +- .../dist/compiler-dom.esm-browser.js | 1009 +- .../dist/compiler-dom.esm-browser.prod.js | 14 +- .../dist/compiler-dom.esm-bundler.js | 222 +- .../compiler-dom/dist/compiler-dom.global.js | 1011 +- .../dist/compiler-dom.global.prod.js | 14 +- node_modules/@vue/compiler-dom/package.json | 6 +- .../compiler-sfc/dist/compiler-sfc.cjs.js | 132 +- .../@vue/compiler-sfc/dist/compiler-sfc.d.ts | 2 +- .../dist/compiler-sfc.esm-browser.js | 606 +- node_modules/@vue/compiler-sfc/package.json | 18 +- node_modules/@vue/compiler-ssr/README.md | 2 +- .../compiler-ssr/dist/compiler-ssr.cjs.js | 113 +- node_modules/@vue/compiler-ssr/package.json | 6 +- .../dist/server-renderer.cjs.js | 4 +- .../dist/server-renderer.cjs.prod.js | 2 +- .../dist/server-renderer.esm-browser.js | 156 +- .../dist/server-renderer.esm-browser.prod.js | 4 +- .../dist/server-renderer.esm-bundler.js | 4 +- .../@vue/server-renderer/package.json | 8 +- node_modules/@vue/shared/dist/shared.cjs.js | 11 +- .../@vue/shared/dist/shared.cjs.prod.js | 11 +- node_modules/@vue/shared/dist/shared.d.ts | 1 - .../@vue/shared/dist/shared.esm-bundler.js | 11 +- node_modules/@vue/shared/package.json | 2 +- node_modules/magic-string/README.md | 104 +- .../magic-string/dist/magic-string.cjs.d.ts | 479 +- .../magic-string/dist/magic-string.cjs.js | 98 +- .../magic-string/dist/magic-string.cjs.js.map | 2 +- .../magic-string/dist/magic-string.es.d.mts | 479 +- .../magic-string/dist/magic-string.es.mjs | 98 +- .../magic-string/dist/magic-string.es.mjs.map | 2 +- .../magic-string/dist/magic-string.umd.js | 98 +- .../magic-string/dist/magic-string.umd.js.map | 2 +- node_modules/magic-string/package.json | 48 +- node_modules/picocolors/README.md | 160 +- node_modules/picocolors/package.json | 30 +- node_modules/picocolors/picocolors.js | 108 +- node_modules/picocolors/types.d.ts | 51 - package-lock.json | 8592 +++++++----- pages.json | 2 +- pages.zip | Bin 311737 -> 0 bytes pages/auth/login/index.vue | 120 +- pages/business/sponsorship/index.vue | 2 +- .../index.vue" | 573 - .../test-websocket.vue" | 290 - pages/company/index.vue | 5 + pages/index/index.vue | 397 +- pages/message/components/ActionMessage.vue | 49 + pages/message/components/BottomDecoration.vue | 28 + pages/message/components/EmptyState.vue | 56 + pages/message/components/ErrorState.vue | 54 + .../message/components/ExamScheduleDialog.vue | 326 + pages/message/components/LoadingState.vue | 73 + pages/message/components/MessageCard.vue | 487 + pages/message/components/MessageFilters.vue | 236 + pages/message/components/MessageTabs.vue | 271 + pages/message/components/Pagination.vue | 191 + pages/message/components/ReasonDialog.vue | 339 + .../components/TaskModificationModal.vue | 92 + .../components/TeamInvitationModal.vue | 144 + pages/message/components/VoteModal.vue | 760 + pages/message/components/WorkVerifyDialog.vue | 362 + pages/message/composables/useExamSchedule.js | 197 + .../message/composables/useMessageActions.js | 327 + pages/message/composables/useMessageData.js | 447 + .../message/composables/useMessageFilters.js | 245 + .../message/composables/useMessageHandlers.js | 911 ++ .../composables/useMessageModalHandlers.js | 57 + pages/message/composables/usePagination.js | 107 + pages/message/composables/useReasonDialog.js | 262 + .../composables/useTaskModification.js | 119 + .../message/composables/useTeamInvitation.js | 318 + pages/message/composables/useUserInfo.js | 158 + pages/message/composables/useVoteModal.js | 565 + .../composables/useWorkVerification.js | 216 + pages/message/index.vue | 6597 +-------- pages/message/utils/apiHelpers.js | 173 + pages/message/utils/messageFormatters.js | 190 + pages/message/utils/messageHelpers.js | 340 + pages/push/recent/index.vue | 2 + pages/task/detail/REFACTOR_SUMMARY.md | 125 - pages/task/detail/STYLE_DISTRIBUTION.md | 122 + .../detail/components/ActiveVotesSection.vue | 423 + .../detail/components/ApplyCompleteForm.vue | 127 + .../components/ApplyCompletePreview.vue | 173 + .../detail/components/CancelRequestModal.vue | 196 + .../components/ChallengeApplicationForm.vue | 635 + .../task/detail/components/EditTaskModal.vue | 264 + .../detail/components/FriendSearchSection.vue | 304 + .../detail/components/QuickActionsBar.vue | 55 + .../detail/components/TaskActionsSection.vue | 144 + .../detail/components/TaskBadgesSection.vue | 72 + pages/task/detail/components/TaskHeader.vue | 114 +- .../detail/components/TaskInfoSection.vue | 96 + .../task/detail/components/TaskMapSection.vue | 630 + .../detail/components/TeamApplicationForm.vue | 584 + .../detail/components/TeamMembersSection.vue | 252 + .../detail/components/VoteHistorySection.vue | 233 + .../detail/components/WorkRecordsSection.vue | 147 + .../composables/useBadgeContributors.js | 145 + .../composables/useBadgeInitialization.js | 46 + .../task/detail/composables/useFormatUtils.js | 75 + .../detail/composables/useFriendSearch.js | 189 + .../task/detail/composables/useTaskActions.js | 145 + .../detail/composables/useTaskApplication.js | 234 + .../detail/composables/useTaskCompletion.js | 431 + .../useTaskCompletionOperations.js | 83 + .../composables/useTaskDataTransform.js | 42 + .../task/detail/composables/useTaskDetail.js | 194 + .../composables/useTaskDetailExports.js | 653 + .../detail/composables/useTaskDetailSetup.js | 376 + pages/task/detail/composables/useTaskEdit.js | 138 + .../task/detail/composables/useTaskHelpers.js | 47 + .../detail/composables/useTaskLifecycle.js | 103 + pages/task/detail/composables/useTaskMap.js | 114 + .../detail/composables/useTaskPermissions.js | 287 + .../task/detail/composables/useTaskStatus.js | 109 + pages/task/detail/composables/useTaskUtils.js | 108 + .../detail/composables/useTeamCreation.js | 210 + .../detail/composables/useTeamManagement.js | 294 +- .../detail/composables/useTeamOperations.js | 296 + .../detail/composables/useUserInfoCache.js | 118 + .../task/detail/composables/useVoteHelpers.js | 115 + .../detail/composables/useVoteOperations.js | 156 + .../task/detail/composables/useVoteSystem.js | 337 +- .../composables/useWebSocketHandlers.js | 260 + .../detail/composables/useWorkOperations.js | 69 + .../task/detail/composables/useWorkRecords.js | 66 +- pages/task/detail/index-backup.vue | 4712 ------- pages/task/detail/index-refactored.vue | 577 - pages/task/detail/index-simple.vue | 352 - pages/task/detail/index.vue | 8505 +++--------- src/manifest.json | 9 +- src/pages.json | 2 +- store/user.ts | 32 + tsconfig.json | 6 +- .../dist/cache/.vite/deps/_metadata.json | 8 - unpackage/dist/cache/.vite/deps/package.json | 3 - vite.config.js | 16 +- vite.config.js.backup | 48 + 240 files changed, 41561 insertions(+), 40136 deletions(-) create mode 100644 UNI_APP_BUILD_FIX.md create mode 100644 config/environment.d.ts create mode 100644 config/network.d.ts create mode 100644 dist/dev/mp-weixin/index.html create mode 100644 entry-server.js delete mode 100644 node_modules/.yarn-integrity delete mode 100644 node_modules/@babel/types/lib/builders/generated/lowercase.js delete mode 100644 node_modules/@babel/types/lib/builders/generated/lowercase.js.map delete mode 100644 node_modules/picocolors/types.d.ts delete mode 100644 pages.zip delete mode 100644 "pages/chat - \345\211\257\346\234\254/index.vue" delete mode 100644 "pages/chat - \345\211\257\346\234\254/test-websocket.vue" create mode 100644 pages/message/components/ActionMessage.vue create mode 100644 pages/message/components/BottomDecoration.vue create mode 100644 pages/message/components/EmptyState.vue create mode 100644 pages/message/components/ErrorState.vue create mode 100644 pages/message/components/ExamScheduleDialog.vue create mode 100644 pages/message/components/LoadingState.vue create mode 100644 pages/message/components/MessageCard.vue create mode 100644 pages/message/components/MessageFilters.vue create mode 100644 pages/message/components/MessageTabs.vue create mode 100644 pages/message/components/Pagination.vue create mode 100644 pages/message/components/ReasonDialog.vue create mode 100644 pages/message/components/TaskModificationModal.vue create mode 100644 pages/message/components/TeamInvitationModal.vue create mode 100644 pages/message/components/VoteModal.vue create mode 100644 pages/message/components/WorkVerifyDialog.vue create mode 100644 pages/message/composables/useExamSchedule.js create mode 100644 pages/message/composables/useMessageActions.js create mode 100644 pages/message/composables/useMessageData.js create mode 100644 pages/message/composables/useMessageFilters.js create mode 100644 pages/message/composables/useMessageHandlers.js create mode 100644 pages/message/composables/useMessageModalHandlers.js create mode 100644 pages/message/composables/usePagination.js create mode 100644 pages/message/composables/useReasonDialog.js create mode 100644 pages/message/composables/useTaskModification.js create mode 100644 pages/message/composables/useTeamInvitation.js create mode 100644 pages/message/composables/useUserInfo.js create mode 100644 pages/message/composables/useVoteModal.js create mode 100644 pages/message/composables/useWorkVerification.js create mode 100644 pages/message/utils/apiHelpers.js create mode 100644 pages/message/utils/messageFormatters.js create mode 100644 pages/message/utils/messageHelpers.js delete mode 100644 pages/task/detail/REFACTOR_SUMMARY.md create mode 100644 pages/task/detail/STYLE_DISTRIBUTION.md create mode 100644 pages/task/detail/components/ActiveVotesSection.vue create mode 100644 pages/task/detail/components/ApplyCompleteForm.vue create mode 100644 pages/task/detail/components/ApplyCompletePreview.vue create mode 100644 pages/task/detail/components/CancelRequestModal.vue create mode 100644 pages/task/detail/components/ChallengeApplicationForm.vue create mode 100644 pages/task/detail/components/EditTaskModal.vue create mode 100644 pages/task/detail/components/FriendSearchSection.vue create mode 100644 pages/task/detail/components/QuickActionsBar.vue create mode 100644 pages/task/detail/components/TaskActionsSection.vue create mode 100644 pages/task/detail/components/TaskBadgesSection.vue create mode 100644 pages/task/detail/components/TaskInfoSection.vue create mode 100644 pages/task/detail/components/TaskMapSection.vue create mode 100644 pages/task/detail/components/TeamApplicationForm.vue create mode 100644 pages/task/detail/components/TeamMembersSection.vue create mode 100644 pages/task/detail/components/VoteHistorySection.vue create mode 100644 pages/task/detail/components/WorkRecordsSection.vue create mode 100644 pages/task/detail/composables/useBadgeContributors.js create mode 100644 pages/task/detail/composables/useBadgeInitialization.js create mode 100644 pages/task/detail/composables/useFormatUtils.js create mode 100644 pages/task/detail/composables/useFriendSearch.js create mode 100644 pages/task/detail/composables/useTaskActions.js create mode 100644 pages/task/detail/composables/useTaskApplication.js create mode 100644 pages/task/detail/composables/useTaskCompletion.js create mode 100644 pages/task/detail/composables/useTaskCompletionOperations.js create mode 100644 pages/task/detail/composables/useTaskDataTransform.js create mode 100644 pages/task/detail/composables/useTaskDetail.js create mode 100644 pages/task/detail/composables/useTaskDetailExports.js create mode 100644 pages/task/detail/composables/useTaskDetailSetup.js create mode 100644 pages/task/detail/composables/useTaskEdit.js create mode 100644 pages/task/detail/composables/useTaskHelpers.js create mode 100644 pages/task/detail/composables/useTaskLifecycle.js create mode 100644 pages/task/detail/composables/useTaskMap.js create mode 100644 pages/task/detail/composables/useTaskPermissions.js create mode 100644 pages/task/detail/composables/useTaskStatus.js create mode 100644 pages/task/detail/composables/useTaskUtils.js create mode 100644 pages/task/detail/composables/useTeamCreation.js create mode 100644 pages/task/detail/composables/useTeamOperations.js create mode 100644 pages/task/detail/composables/useUserInfoCache.js create mode 100644 pages/task/detail/composables/useVoteHelpers.js create mode 100644 pages/task/detail/composables/useVoteOperations.js create mode 100644 pages/task/detail/composables/useWebSocketHandlers.js create mode 100644 pages/task/detail/composables/useWorkOperations.js delete mode 100644 pages/task/detail/index-backup.vue delete mode 100644 pages/task/detail/index-refactored.vue delete mode 100644 pages/task/detail/index-simple.vue delete mode 100644 unpackage/dist/cache/.vite/deps/_metadata.json delete mode 100644 unpackage/dist/cache/.vite/deps/package.json create mode 100644 vite.config.js.backup diff --git a/App.vue b/App.vue index 76e1a44b..4c4cad38 100644 --- a/App.vue +++ b/App.vue @@ -7,7 +7,7 @@ - diff --git a/UNI_APP_BUILD_FIX.md b/UNI_APP_BUILD_FIX.md new file mode 100644 index 00000000..808dbdc4 --- /dev/null +++ b/UNI_APP_BUILD_FIX.md @@ -0,0 +1,44 @@ +# uni-app 构建错误修复说明 + +## 问题描述 +在构建 uni-app 项目时遇到以下错误: +``` +[plugin:uni:mp-pages-json] The "fileName" or "name" properties of emitted chunks and assets must be strings that are neither absolute nor relative paths, received "../../node-modules/@dcloudio/uni-ui/lib/uni-nav-bar/uni-nav-bar.json". +``` + +## 原因分析 +这是 `@dcloudio/vite-plugin-uni` 插件的一个已知 bug。在处理 `easycom` 自动导入的 uni-ui 组件时,插件在生成小程序页面 JSON 配置文件时使用了相对路径作为文件名,违反了 Rollup 的规范。 + +## 解决方案 + +### 方案 1:更新插件版本(推荐) +```bash +npm update @dcloudio/vite-plugin-uni @dcloudio/uni-ui +``` + +### 方案 2:修改 easycom 配置 +如果更新插件无效,可以尝试在 `pages.json` 中调整 `easycom` 配置: + +```json +{ + "easycom": { + "autoscan": false, // 禁用自动扫描 + "custom": { + "^uni-(.*)": "@dcloudio/uni-ui/lib/uni-$1/uni-$1.vue" + } + } +} +``` + +然后手动导入需要的 uni-ui 组件。 + +### 方案 3:报告 Bug +如果问题持续存在,建议在以下地址报告: +- DCloud 官方论坛:https://ask.dcloud.net.cn/ +- GitHub Issues:https://github.com/dcloudio/uni-app/issues + +## 当前项目状态 +已添加了多层防护机制(vite.config.js 中的修复插件),但由于错误发生在插件内部验证阶段,无法完全拦截。 + +建议优先尝试更新插件版本。 + diff --git a/components/PushNotification.vue b/components/PushNotification.vue index b0216a2b..74d0c5c9 100644 --- a/components/PushNotification.vue +++ b/components/PushNotification.vue @@ -286,7 +286,8 @@ const connectWebSocket = () => { const userId = userStore.userInfo?.uid if (!userId) return - const wsUrl = `ws://192.168.2.2:8080/ws/task-push?userId=${userId}` + // 使用环境配置中的 WebSocket URL + const wsUrl = `${NETWORK_CONFIG.WS_URL}/ws/task-push?userId=${userId}` websocket = new WebSocket(wsUrl) websocket.onopen = () => { diff --git a/config/environment.d.ts b/config/environment.d.ts new file mode 100644 index 00000000..d542fb40 --- /dev/null +++ b/config/environment.d.ts @@ -0,0 +1,29 @@ +// 环境配置类型声明 +export declare const ENVIRONMENTS: { + DEVELOPMENT: string; + PRODUCTION: string; + TEST: string; +}; + +export declare const MANUAL_ENV: string; + +export interface EnvConfig { + name: string; + apiBaseUrl: string; + wsUrl: string; + debug: boolean; + timeout: number; + maxRetries: number; + retryInterval: number; +} + +export declare const ENV_CONFIG: { + [key: string]: EnvConfig; +}; + +export declare function getCurrentEnvironment(): string; +export declare function getCurrentConfig(): EnvConfig; +export declare function setEnvironment(env: string): boolean; +export declare function getAvailableEnvironments(): Array<{ key: string } & EnvConfig>; +export declare function switchEnvironment(env: string): boolean; + diff --git a/config/environment.js b/config/environment.js index 7c022b88..ca9d76fe 100644 --- a/config/environment.js +++ b/config/environment.js @@ -12,6 +12,20 @@ export const MANUAL_ENV = 'development'; export const ENV_CONFIG = { [ENVIRONMENTS.DEVELOPMENT]: { name: '开发环境', + // 小程序开发:请在微信开发者工具中开启"不校验合法域名" + // 设置路径:微信开发者工具 -> 设置 -> 项目设置 -> 勾选"不校验合法域名" + // Android 模拟器:使用 10.0.2.2 访问宿主机(由 getCurrentConfig 动态设置) + // iOS 模拟器/浏览器/小程序:使用 127.0.0.1 + apiBaseUrl: 'http://127.0.0.1:8080', // 默认值,会在 getCurrentConfig 中根据平台调整 + wsUrl: 'ws://127.0.0.1:8080', // 默认值,会在 getCurrentConfig 中根据平台调整 + debug: true, + timeout: 30000, + maxRetries: 5, + retryInterval: 1000 + }, + // 本地 IP 开发环境(需要在微信开发者工具中开启"不校验合法域名") + 'development-ip': { + name: '开发环境(IP)', apiBaseUrl: 'http://192.168.2.2:8080', wsUrl: 'ws://192.168.2.2:8080', debug: true, @@ -54,7 +68,7 @@ export const getCurrentEnvironment = () => { // 2) 根据域名判断环境 const hostname = (typeof window !== 'undefined' && window.location?.hostname) || ''; - if (hostname.includes('localhost') || hostname.includes('192.168.2.2')) { + if (hostname.includes('localhost') || hostname.includes('127.0.0.1') || hostname.includes('192.168.2.2')) { return ENVIRONMENTS.DEVELOPMENT; } else if (hostname.includes('test.')) { return ENVIRONMENTS.TEST; @@ -66,17 +80,67 @@ export const getCurrentEnvironment = () => { // 获取当前环境配置 export const getCurrentConfig = () => { const env = getCurrentEnvironment(); - return ENV_CONFIG[env]; + const config = ENV_CONFIG[env]; + + // 如果是开发环境,需要根据平台动态调整 API 和 WS URL + if (env === ENVIRONMENTS.DEVELOPMENT) { + let apiBaseUrl = config.apiBaseUrl; + let wsUrl = config.wsUrl; + + // 检测平台并适配地址 + try { + // #ifdef APP-PLUS + const systemInfo = uni.getSystemInfoSync(); + // Android 模拟器/真机需要使用 10.0.2.2 访问宿主机 + if (systemInfo.platform === 'android') { + apiBaseUrl = 'http://10.0.2.2:8080'; + wsUrl = 'ws://10.0.2.2:8080'; + // 注意:这里使用 config.debug 而不是 NETWORK_CONFIG.DEBUG,因为此时 NETWORK_CONFIG 还未创建 + if (config.debug) { + console.log('[环境配置] 检测到 Android 平台,使用 10.0.2.2 访问宿主机'); + } + } else if (systemInfo.platform === 'ios') { + // iOS 模拟器可以使用 127.0.0.1 或 localhost + apiBaseUrl = 'http://127.0.0.1:8080'; + wsUrl = 'ws://127.0.0.1:8080'; + if (config.debug) { + console.log('[环境配置] 检测到 iOS 平台,使用 127.0.0.1'); + } + } + // #endif + + // #ifndef APP-PLUS + // 非 APP 平台(H5、小程序等)使用 127.0.0.1 + if (config.debug) { + console.log('[环境配置] 非 APP 平台,使用 127.0.0.1'); + } + // #endif + } catch (e) { + if (config.debug) { + console.warn('[环境配置] 获取系统信息失败,使用默认地址:', e); + } + } + + return { + ...config, + apiBaseUrl, + wsUrl + }; + } + + return config; }; // 设置环境(本地覆盖) export const setEnvironment = (env) => { if (ENV_CONFIG[env]) { uni.setStorageSync('app_environment', env); - console.log(`环境已切换到: ${ENV_CONFIG[env].name}`); + // 环境切换是重要操作,始终显示日志 + console.log(`[环境配置] 环境已切换到: ${ENV_CONFIG[env].name}`); return true; } - console.error(`无效的环境: ${env}`); + // 错误信息始终显示 + console.error(`[环境配置] 无效的环境: ${env}`); return false; }; diff --git a/config/network.d.ts b/config/network.d.ts new file mode 100644 index 00000000..6a5bd8bf --- /dev/null +++ b/config/network.d.ts @@ -0,0 +1,19 @@ +// 网络配置类型声明 +export interface NetworkConfig { + API_BASE_URL: string; + WS_URL: string; + TIMEOUT: number; + MAX_RETRIES: number; + RETRY_INTERVAL: number; + DEBUG: boolean; + DEFAULT_HEADERS: { + 'Content-Type': string; + 'Accept': string; + 'X-Requested-With': string; + }; +} + +declare const NETWORK_CONFIG: NetworkConfig; + +export { NETWORK_CONFIG }; + diff --git a/config/network.js b/config/network.js index 2bc42c62..a2ec913d 100644 --- a/config/network.js +++ b/config/network.js @@ -68,16 +68,22 @@ export const createRequest = (options = {}) => { header: finalHeader, timeout, success: (result) => { - console.log(`请求成功: ${method} ${fullUrl}`, result); + if (NETWORK_CONFIG.DEBUG) { + console.log(`请求成功: ${method} ${fullUrl}`, result); + } resolve(result); }, fail: (error) => { - console.error(`请求失败: ${method} ${fullUrl}`, error); + if (NETWORK_CONFIG.DEBUG) { + console.error(`请求失败: ${method} ${fullUrl}`, error); + } // 如果是网络错误且还有重试次数,则重试 if (retryCount < retries && (error.errMsg.includes('fail') || error.errMsg.includes('timeout'))) { retryCount++; - console.log(`第 ${retryCount} 次重试: ${method} ${fullUrl}`); + if (NETWORK_CONFIG.DEBUG) { + console.log(`第 ${retryCount} 次重试: ${method} ${fullUrl}`); + } setTimeout(makeRequest, NETWORK_CONFIG.RETRY_INTERVAL); } else { reject(error); @@ -95,7 +101,9 @@ export const checkNetworkStatus = () => { return new Promise((resolve) => { uni.getNetworkType({ success: (res) => { - console.log('网络类型:', res.networkType); + if (NETWORK_CONFIG.DEBUG) { + console.log('网络类型:', res.networkType); + } if (res.networkType === 'none') { uni.showToast({ title: '网络连接失败,请检查网络设置', @@ -108,7 +116,9 @@ export const checkNetworkStatus = () => { } }, fail: (error) => { - console.error('网络状态检查失败:', error); + if (NETWORK_CONFIG.DEBUG) { + console.error('网络状态检查失败:', error); + } uni.showToast({ title: '网络状态检查失败', icon: 'none', @@ -128,10 +138,14 @@ export const testNetworkConnection = async () => { method: 'GET', timeout: 5000 }); - console.log('网络连接测试成功:', result); + if (NETWORK_CONFIG.DEBUG) { + console.log('网络连接测试成功:', result); + } return true; } catch (error) { - console.error('网络连接测试失败:', error); + if (NETWORK_CONFIG.DEBUG) { + console.error('网络连接测试失败:', error); + } return false; } }; @@ -154,7 +168,9 @@ export const loginRequest = async (loginData) => { return result; } catch (error) { - console.error('登录请求失败:', error); + if (NETWORK_CONFIG.DEBUG) { + console.error('登录请求失败:', error); + } throw error; } }; @@ -171,7 +187,9 @@ export const sendCodeRequest = async (identifier) => { return result; } catch (error) { - console.error('发送验证码失败:', error); + if (NETWORK_CONFIG.DEBUG) { + console.error('发送验证码失败:', error); + } throw error; } }; @@ -187,7 +205,9 @@ export const getFaceActionRequest = async () => { return result; } catch (error) { - console.error('获取人脸识别动作失败:', error); + if (NETWORK_CONFIG.DEBUG) { + console.error('获取人脸识别动作失败:', error); + } throw error; } }; diff --git a/config/server.js b/config/server.js index 7db41c9e..70403e6d 100644 --- a/config/server.js +++ b/config/server.js @@ -2,8 +2,8 @@ export const SERVER_CONFIG = { // 开发环境配置 development: { - baseUrl: 'http://192.168.2.2:8080', - imageBaseUrl: 'http://192.168.2.2:8080' + baseUrl: 'http://127.0.0.1:8080', + imageBaseUrl: 'http://127.0.0.1:8080' }, // 生产环境配置 production: { @@ -18,6 +18,7 @@ function getCurrentConfig() { // 这里简单判断,实际项目中可能需要更复杂的逻辑 const isDev = process.env.NODE_ENV === 'development' || window.location.hostname === 'localhost' || + window.location.hostname === '127.0.0.1' || window.location.hostname === '192.168.2.2'; return isDev ? SERVER_CONFIG.development : SERVER_CONFIG.production; diff --git a/dist/dev/mp-weixin/index.html b/dist/dev/mp-weixin/index.html new file mode 100644 index 00000000..ebd611ef --- /dev/null +++ b/dist/dev/mp-weixin/index.html @@ -0,0 +1,82 @@ + + + + + + SKILLITH + + + + +
+ +
+
+
正在加载...
+
+
+ + + + diff --git a/entry-server.js b/entry-server.js new file mode 100644 index 00000000..d94bbf1c --- /dev/null +++ b/entry-server.js @@ -0,0 +1,10 @@ +// SSR entry server placeholder for uni-app +// This file is required by @dcloudio/vite-plugin-uni for SSR builds +// For mini-program builds, this file can be empty + +export default { + render() { + return '' + } +} + diff --git a/main.ts b/main.ts index 545131fe..3cf14f5a 100644 --- a/main.ts +++ b/main.ts @@ -2,8 +2,9 @@ import { createSSRApp } from 'vue' import { createPinia } from 'pinia' import './style.css' import App from './App.vue' -import { MessageType, MessageStatus, MessageUtils } from './utils/messageTypes' +import { MessageType, VoteMessageStatus, MessageUtils } from './utils/messageTypes' import SponsorBanner from './components/SponsorBanner.vue' +// @ts-ignore - network.js 是 JavaScript 文件,类型声明在 network.d.ts import { NETWORK_CONFIG } from './config/network.js' // 兼容 Node/H5/小程序端全局对象 @@ -35,8 +36,7 @@ declare global { handleApprove: (id: number, type: number) => Promise handleReject: (id: number, type: number) => Promise } - function getApp(): any - function getCurrentPages(): any[] + // getApp 和 getCurrentPages 已在 @dcloudio/types 中声明,这里不需要重复声明 interface Window { __VUE_APP__?: any __SPONSOR_BANNER__?: any @@ -234,7 +234,9 @@ const handleReject = async (id: number, type: number) => { // 刷新任务相关页面的函数 const refreshTaskRelatedPages = () => { - console.log('🔄 刷新任务相关页面') + if (NETWORK_CONFIG.DEBUG) { + console.log('🔄 刷新任务相关页面') + } // 发送全局事件通知所有页面刷新 uni.$emit('task-related-update', { @@ -283,11 +285,15 @@ const refreshTaskRelatedPages = () => { const connectWebSocket = () => { const token = uni.getStorageSync('accessToken') if (!token) { - console.log('未找到 token,暂不建立 WebSocket 连接') + if (NETWORK_CONFIG.DEBUG) { + console.log('未找到 token,暂不建立 WebSocket 连接') + } return null } - console.log('开始建立 WebSocket 连接...') + if (NETWORK_CONFIG.DEBUG) { + console.log('开始建立 WebSocket 连接...') + } let retryCount = 0 const maxRetries = 5 const retryDelay = 5000 @@ -307,35 +313,89 @@ const connectWebSocket = () => { }; const tryConnect = () => { - console.log('🔍 尝试建立WebSocket连接...') - console.log('🔍 当前重试次数:', retryCount) - console.log('🔍 最大重试次数:', maxRetries) - console.log('🔍 是否正在连接:', isConnecting) + if (NETWORK_CONFIG.DEBUG) { + console.log('🔍 尝试建立WebSocket连接...') + console.log('🔍 当前重试次数:', retryCount) + console.log('🔍 最大重试次数:', maxRetries) + console.log('🔍 是否正在连接:', isConnecting) + } if (isConnecting) { - console.log('🔍 正在连接中,跳过') + if (NETWORK_CONFIG.DEBUG) { + console.log('🔍 正在连接中,跳过') + } return null } if (retryCount >= maxRetries) { - console.error('🔍 WebSocket 连接重试次数已达上限') + if (NETWORK_CONFIG.DEBUG) { + console.error('🔍 WebSocket 连接重试次数已达上限') + } return null } isConnecting = true - console.log('🔍 开始创建WebSocket连接...') - console.log('🔍 连接URL:', `${NETWORK_CONFIG.WS_URL}/ws?token=${token}`) + // 构建 WebSocket URL + // 注意:微信小程序对 WebSocket 有严格限制,本地 IP 可能无法连接 + // 在开发环境中,如果连接失败,可以静默处理,不影响应用使用 + let wsUrl = `${NETWORK_CONFIG.WS_URL}/ws?token=${token}` + + // 小程序环境下,如果 WS_URL 是 ws:// 协议的本地 IP,可能需要特殊处理 + // #ifdef MP-WEIXIN + // 微信小程序对 WebSocket 的限制: + // 1. 必须使用 wss:// 协议(生产环境) + // 2. 本地开发时,即使开启"不校验合法域名",ws:// 协议的本地 IP 也可能被阻止 + // 3. 可以尝试使用 localhost 或者直接禁用 WebSocket(使用轮询代替) + if (wsUrl.startsWith('ws://192.168.') || wsUrl.startsWith('ws://10.') || wsUrl.startsWith('ws://172.')) { + if (NETWORK_CONFIG.DEBUG) { + console.warn('⚠️ 微信小程序环境下,本地 IP 的 WebSocket 连接可能无法建立') + console.warn('⚠️ 建议:1) 使用 localhost 代替 IP;2) 或者在生产环境使用 wss://') + console.warn('⚠️ 当前将尝试连接,如果失败将静默处理,不影响应用使用') + } + } + // #endif + + if (NETWORK_CONFIG.DEBUG) { + console.log('🔍 开始创建WebSocket连接...') + console.log('🔍 连接URL:', wsUrl) + } socketTask = uni.connectSocket({ - url: `${NETWORK_CONFIG.WS_URL}/ws?token=${token}`, + url: wsUrl, success: () => { - console.log('🔍 WebSocket 连接请求已发送') + if (NETWORK_CONFIG.DEBUG) { + console.log('🔍 WebSocket 连接请求已发送') + } }, fail: (error) => { - console.error('🔍 WebSocket 连接请求失败:', error) + if (NETWORK_CONFIG.DEBUG) { + console.error('🔍 WebSocket 连接请求失败:', error) + } isConnecting = false + + // 如果是本地开发环境的连接失败,静默处理,不重试 + // #ifdef MP-WEIXIN + if (wsUrl.includes('192.168.') || wsUrl.includes('localhost') || wsUrl.includes('127.0.0.1')) { + if (NETWORK_CONFIG.DEBUG) { + console.warn('⚠️ 本地 WebSocket 连接失败,这是正常的(小程序限制)') + console.warn('⚠️ 应用将继续正常工作,消息将使用 HTTP 轮询方式更新') + } + return null // 不重试 + } + // #endif + retryCount++ - console.log(`🔍 将在 ${retryDelay/1000} 秒后进行第 ${retryCount} 次重试`) - setTimeout(tryConnect, retryDelay) + if (retryCount < maxRetries) { + if (NETWORK_CONFIG.DEBUG) { + console.log(`🔍 将在 ${retryDelay/1000} 秒后进行第 ${retryCount} 次重试`) + } + setTimeout(tryConnect, retryDelay) + } else { + if (NETWORK_CONFIG.DEBUG) { + console.error('🔍 WebSocket 连接重试次数已达上限,停止重试') + console.warn('⚠️ WebSocket 连接失败,应用将继续正常工作') + console.warn('⚠️ 消息更新将使用 HTTP 轮询方式,不影响核心功能') + } + } } }) @@ -345,29 +405,37 @@ const connectWebSocket = () => { } socketTask.onOpen(() => { - console.log('🔍 WebSocket 连接已打开') - console.log('🔍 WebSocket readyState:', (socketTask as any).readyState) + if (NETWORK_CONFIG.DEBUG) { + console.log('🔍 WebSocket 连接已打开') + console.log('🔍 WebSocket readyState:', (socketTask as any).readyState) + } retryCount = 0 isConnecting = false }) socketTask.onMessage((res: any) => { try { - console.log('🔍 WebSocket原始消息:', res.data) - console.log('🔍 消息类型:', typeof res.data) - console.log('🔍 消息长度:', res.data?.length) - console.log('🔍 消息内容预览:', res.data?.substring(0, 100)) + if (NETWORK_CONFIG.DEBUG) { + console.log('🔍 WebSocket原始消息:', res.data) + console.log('🔍 消息类型:', typeof res.data) + console.log('🔍 消息长度:', res.data?.length) + console.log('🔍 消息内容预览:', res.data?.substring(0, 100)) + } const message = JSON.parse(res.data) - console.log('🔍 解析后的消息:', message) - console.log('🔍 消息类型检查:', message.type) - console.log('🔍 消息ID:', message.id) + if (NETWORK_CONFIG.DEBUG) { + console.log('🔍 解析后的消息:', message) + console.log('🔍 消息类型检查:', message.type) + console.log('🔍 消息ID:', message.id) + } // 消息去重:检查是否已经处理过相同的消息 if (message.id) { const messageKey = `processed_${message.id}` if (uni.getStorageSync(messageKey)) { - console.log('消息已处理过,跳过:', message.id) + if (NETWORK_CONFIG.DEBUG) { + console.log('消息已处理过,跳过:', message.id) + } return } // 标记消息为已处理 @@ -379,86 +447,100 @@ const connectWebSocket = () => { } if (message.type === 'task-progress') { - console.log('收到任务进度更新:', message) + if (NETWORK_CONFIG.DEBUG) { + console.log('收到任务进度更新:', message) + } uni.$emit('task-progress-update', message) return } // 处理聊天消息(type为chatmessage) if (message.type === 'chatmessage' && message.message) { - console.log('收到聊天消息:', message) + if (NETWORK_CONFIG.DEBUG) { + console.log('收到聊天消息:', message) + } uni.$emit('chatMessage', message) return } // 处理通知消息(type为message,有id、title等字段) if (message.type === 'message' && (message.id || message.title)) { - console.log('收到通知消息:', message) + if (NETWORK_CONFIG.DEBUG) { + console.log('收到通知消息:', message) + } // 通知消息会在下面的逻辑中处理 } if (message.type === 'message_sent') { - console.log('收到消息发送确认:', message) + if (NETWORK_CONFIG.DEBUG) { + console.log('收到消息发送确认:', message) + } uni.$emit('messageSent', message) return } if (message.type === 'error') { - console.log('收到错误消息:', message) + if (NETWORK_CONFIG.DEBUG) { + console.log('收到错误消息:', message) + } uni.$emit('websocketError', message) return } // 处理团队成员加入消息 if (message.type === 'team_member_joined') { - console.log('收到团队成员加入消息:', message) + if (NETWORK_CONFIG.DEBUG) { + console.log('收到团队成员加入消息:', message) + } uni.$emit('team-member-joined', message) return } // 处理团队成员退出消息 if (message.type === 'team_member_left') { - console.log('收到团队成员退出消息:', message) + if (NETWORK_CONFIG.DEBUG) { + console.log('收到团队成员退出消息:', message) + } uni.$emit('team-member-left', message) return } // 处理团队成员被移除消息 if (message.type === 'team_member_removed') { - console.log('收到团队成员被移除消息:', message) + if (NETWORK_CONFIG.DEBUG) { + console.log('收到团队成员被移除消息:', message) + } uni.$emit('team-member-removed', message) return } // 处理团队投票发起消息 if (message.type === 'team_vote_initiated') { - console.log('收到团队投票发起消息:', message) + if (NETWORK_CONFIG.DEBUG) { + console.log('收到团队投票发起消息:', message) + } uni.$emit('team-vote-initiated', message) return } // 处理团队投票结果消息 if (message.type === 'team_vote_result') { - console.log('收到团队投票结果消息:', message) + if (NETWORK_CONFIG.DEBUG) { + console.log('收到团队投票结果消息:', message) + } uni.$emit('team-vote-result', message) return } if (message.type === 'sponsor_success') { - console.log('🎉 收到赞助成功消息:', message) - console.log('🎉 message.level 值:', message.level, '类型:', typeof message.level) - console.log('🎉 message.level 是否为空:', message.level === '', '是否为null:', message.level === null, '是否为undefined:', message.level === undefined) + if (NETWORK_CONFIG.DEBUG) { + console.log('🎉 收到赞助成功消息:', message) + } // 使用和普通消息通知一样的方式:直接显示 const sponsorText = `${message.sponsorName} 赞助了 ¥${message.amount} (${message.sponsorType})` const levelText = (message.level && message.level !== '' && message.level !== null && message.level !== undefined) ? ` - 等级${message.level}` : '' - console.log('🎉 准备显示Toast:', sponsorText + levelText) - console.log('🎉 Toast标题长度:', (sponsorText + levelText).length) - - // 显示赞助成功提示 - 使用uni.showToast,简单可靠 - console.log('🎉 开始显示Toast...') - // 根据赞助金额显示不同样式的Toast let toastTitle = sponsorText + levelText let toastIcon: 'success' | 'none' | 'loading' | 'error' = 'success' @@ -474,8 +556,6 @@ const connectWebSocket = () => { } // 三重播报:Toast + 炫酷横幅 + 原生通知 - console.log('🎉 使用三重播报显示赞助信息') - // 方式1:Toast播报(轻量级) uni.showToast({ title: toastTitle, @@ -487,7 +567,6 @@ const connectWebSocket = () => { try { const app = getApp() if (app && app.__SPONSOR_BANNER__) { - console.log('🎉 使用炫酷横幅显示') app.__SPONSOR_BANNER__.showSponsorBanner( message.amount, message.sponsorName, @@ -496,18 +575,17 @@ const connectWebSocket = () => { message.avatarUrl || '', message.duration || 5000 ) - } else { - console.log('🎉 炫酷横幅未找到') } } catch (error) { - console.log('🎉 获取炫酷横幅失败:', error) + if (NETWORK_CONFIG.DEBUG) { + console.log('🎉 获取炫酷横幅失败:', error) + } } // 方式3:原生通知播报(详细信息) try { const app = getApp() if (app && app.__NATIVE_NOTIFICATION__) { - console.log('🎉 使用原生通知显示') if (message.level >= 4) { // 高等级使用组合通知 app.__NATIVE_NOTIFICATION__.showCombo(message) @@ -521,15 +599,13 @@ const connectWebSocket = () => { // 低等级使用简单Modal app.__NATIVE_NOTIFICATION__.show(message) } - } else { - console.log('🎉 原生通知未找到') } } catch (error) { - console.log('🎉 获取原生通知失败:', error) + if (NETWORK_CONFIG.DEBUG) { + console.log('🎉 获取原生通知失败:', error) + } } - console.log('🎉 三重播报已显示:', toastTitle) - // 同时发送事件给组件(如果组件存在的话) uni.$emit('sponsor-success', message) @@ -576,31 +652,76 @@ const connectWebSocket = () => { }) } } catch (error) { - console.error('处理 WebSocket 消息失败:', error) + if (NETWORK_CONFIG.DEBUG) { + console.error('处理 WebSocket 消息失败:', error) + } } }) socketTask.onError((error: any) => { - console.error('🔍 WebSocket 发生错误:', error) - console.error('🔍 WebSocket readyState:', (socketTask as any).readyState) + if (NETWORK_CONFIG.DEBUG) { + console.error('🔍 WebSocket 发生错误:', error) + console.error('🔍 WebSocket readyState:', (socketTask as any).readyState) + } isConnecting = false + + // 小程序环境下,本地 WebSocket 错误静默处理 + // #ifdef MP-WEIXIN + if (wsUrl.includes('192.168.') || wsUrl.includes('localhost') || wsUrl.includes('127.0.0.1')) { + if (NETWORK_CONFIG.DEBUG) { + console.warn('⚠️ 本地 WebSocket 连接错误,这是正常的(小程序限制)') + console.warn('⚠️ 应用将继续正常工作,消息将使用 HTTP 轮询方式更新') + } + return // 不重试 + } + // #endif + retryCount++ if (retryCount < maxRetries) { - console.log(`将在 ${retryDelay/1000} 秒后进行第 ${retryCount} 次重试`) + if (NETWORK_CONFIG.DEBUG) { + console.log(`将在 ${retryDelay/1000} 秒后进行第 ${retryCount} 次重试`) + } setTimeout(tryConnect, retryDelay) } else { - console.error('WebSocket 连接失败次数过多,停止重试') + if (NETWORK_CONFIG.DEBUG) { + console.error('WebSocket 连接失败次数过多,停止重试') + console.warn('⚠️ WebSocket 连接失败,应用将继续正常工作') + console.warn('⚠️ 消息更新将使用 HTTP 轮询方式,不影响核心功能') + } + // 不显示错误提示给用户,因为这不是致命错误 + // 应用可以通过 HTTP 轮询继续工作 } }) socketTask.onClose(() => { - console.log('🔍 WebSocket 连接已关闭') - console.log('🔍 WebSocket readyState:', (socketTask as any).readyState) + if (NETWORK_CONFIG.DEBUG) { + console.log('🔍 WebSocket 连接已关闭') + console.log('🔍 WebSocket readyState:', (socketTask as any).readyState) + } isConnecting = false + + // 小程序环境下,本地 WebSocket 关闭不重试 + // #ifdef MP-WEIXIN + if (wsUrl.includes('192.168.') || wsUrl.includes('localhost') || wsUrl.includes('127.0.0.1')) { + if (NETWORK_CONFIG.DEBUG) { + console.warn('⚠️ 本地 WebSocket 连接已关闭,不进行重试(小程序限制)') + console.warn('⚠️ 应用将继续正常工作,消息将使用 HTTP 轮询方式更新') + } + return // 不重试 + } + // #endif + if (retryCount < maxRetries) { retryCount++ - console.log(`将在 ${retryDelay/1000} 秒后进行第 ${retryCount} 次重试`) + if (NETWORK_CONFIG.DEBUG) { + console.log(`将在 ${retryDelay/1000} 秒后进行第 ${retryCount} 次重试`) + } setTimeout(tryConnect, retryDelay) + } else { + if (NETWORK_CONFIG.DEBUG) { + console.warn('⚠️ WebSocket 连接关闭,重试次数已达上限') + console.warn('⚠️ 应用将继续正常工作,消息将使用 HTTP 轮询方式更新') + } } }) @@ -609,17 +730,23 @@ const connectWebSocket = () => { // 监听发送WebSocket消息事件 ;(uni as any).$on('sendWebSocketMessage', (message: any) => { - console.log('🔍 收到发送消息请求:', message) - console.log('🔍 WebSocket状态:', (socketTask as any)?.readyState) + if (NETWORK_CONFIG.DEBUG) { + console.log('🔍 收到发送消息请求:', message) + console.log('🔍 WebSocket状态:', (socketTask as any)?.readyState) + } if (socketTask && (socketTask as any).readyState === 1) { - console.log('🔍 通过全局WebSocket发送消息:', message) + if (NETWORK_CONFIG.DEBUG) { + console.log('🔍 通过全局WebSocket发送消息:', message) + } ;(socketTask as any).send({ data: JSON.stringify(message) }) } else { - console.error('🔍 全局WebSocket未连接,无法发送消息') - console.error('🔍 socketTask:', socketTask) - console.error('🔍 readyState:', (socketTask as any)?.readyState) + if (NETWORK_CONFIG.DEBUG) { + console.error('🔍 全局WebSocket未连接,无法发送消息') + console.error('🔍 socketTask:', socketTask) + console.error('🔍 readyState:', (socketTask as any)?.readyState) + } } }) @@ -655,21 +782,29 @@ const formatTime = (t: string) => { export function createApp() { - console.log('开始创建应用...') + if (NETWORK_CONFIG.DEBUG) { + console.log('开始创建应用...') + } const app = createSSRApp(App) // 先创建 Pinia 实例 const pinia = createPinia() - console.log('🎉 Pinia 实例已创建') + if (NETWORK_CONFIG.DEBUG) { + console.log('🎉 Pinia 实例已创建') + } // 使用 Pinia app.use(pinia) - console.log('🎉 Pinia 已注册到应用') + if (NETWORK_CONFIG.DEBUG) { + console.log('🎉 Pinia 已注册到应用') + } // 注册全局组件 app.component('SponsorBanner', SponsorBanner) - console.log('🎉 已注册SponsorBanner组件') + if (NETWORK_CONFIG.DEBUG) { + console.log('🎉 已注册SponsorBanner组件') + } // 设置全局请求拦截器(使用类型断言避免TypeScript错误) ;(uni as any).addInterceptor?.('request', { @@ -686,7 +821,9 @@ export function createApp() { } } }); - console.log('🎉 已设置全局请求拦截器') + if (NETWORK_CONFIG.DEBUG) { + console.log('🎉 已设置全局请求拦截器') + } // 初始化 WebSocket 客户端 const websocket = connectWebSocket() diff --git a/manifest.json b/manifest.json index 8977f9e1..2b432875 100644 --- a/manifest.json +++ b/manifest.json @@ -5,7 +5,6 @@ "versionName" : "1.0.0", "versionCode" : "100", "transformPx" : false, - /* 5+App特有相关 */ "app-plus" : { "usingComponents" : true, "nvueStyleCompiler" : "uni-app", @@ -16,11 +15,8 @@ "autoclose" : true, "delay" : 0 }, - /* 模块配置 */ "modules" : {}, - /* 应用发布信息 */ "distribute" : { - /* android打包配置 */ "android" : { "permissions" : [ "", @@ -40,20 +36,16 @@ "" ] }, - /* ios打包配置 */ "ios" : { "dSYMs" : false, "privacyDescription" : { "NSCameraUsageDescription" : "需要使用您的相机进行人脸识别" } }, - /* SDK配置 */ "sdkConfigs" : {} } }, - /* 快应用特有相关 */ "quickapp" : {}, - /* 小程序特有相关 */ "mp-weixin" : { "appid" : "wxc9be1c713bf06e7e", "setting" : { @@ -96,15 +88,18 @@ "lazyCodeLoading" : "requiredComponents" }, "usingComponents" : true, + "requiredPrivateInfos" : [ "getLocation", "chooseLocation" ], "permission" : { - "scope.camera" : { - "desc" : "需要使用您的相机进行人脸识别" - }, "scope.userLocation" : { - "desc" : "需要获取您的位置信息,用于推荐附近的任务" + "desc" : "你的位置信息将用于小程序位置接口的效果" } }, - "requiredPrivateInfos" : [ "getLocation", "chooseLocation" ] + "networkTimeout" : { + "request" : 60000, + "connectSocket" : 60000, + "uploadFile" : 60000, + "downloadFile" : 60000 + } }, "mp-alipay" : { "usingComponents" : true diff --git a/node_modules/.yarn-integrity b/node_modules/.yarn-integrity deleted file mode 100644 index e82fcf42..00000000 --- a/node_modules/.yarn-integrity +++ /dev/null @@ -1,18 +0,0 @@ -{ - "systemParams": "win32-x64-108", - "modulesFolders": [ - "node_modules" - ], - "flags": [], - "linkedModules": [], - "topLevelPatterns": [ - "@amap/amap-jsapi-loader@^1.0.1", - "@qiun/ucharts@^2.5.0-20230101" - ], - "lockfileEntries": { - "@amap/amap-jsapi-loader@^1.0.1": "https://registry.npmjs.org/@amap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.1.tgz", - "@qiun/ucharts@^2.5.0-20230101": "https://registry.npmjs.org/@qiun/ucharts/-/ucharts-2.5.0-20230101.tgz" - }, - "files": [], - "artifacts": {} -} \ No newline at end of file diff --git a/node_modules/@babel/helper-validator-identifier/lib/identifier.js b/node_modules/@babel/helper-validator-identifier/lib/identifier.js index fdb9aece..b12e6e4b 100644 --- a/node_modules/@babel/helper-validator-identifier/lib/identifier.js +++ b/node_modules/@babel/helper-validator-identifier/lib/identifier.js @@ -6,13 +6,13 @@ Object.defineProperty(exports, "__esModule", { exports.isIdentifierChar = isIdentifierChar; exports.isIdentifierName = isIdentifierName; exports.isIdentifierStart = isIdentifierStart; -let nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088e\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c8a\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7cd\ua7d0\ua7d1\ua7d3\ua7d5-\ua7dc\ua7f2-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; -let nonASCIIidentifierChars = "\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0897-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\u30fb\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f\uff65"; +let nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088f\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5c\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdc-\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c8a\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7dc\ua7f1-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; +let nonASCIIidentifierChars = "\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0897-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1add\u1ae0-\u1aeb\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\u30fb\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f\uff65"; const nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]"); const nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]"); nonASCIIidentifierStartChars = nonASCIIidentifierChars = null; -const astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 4, 51, 13, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 39, 27, 10, 22, 251, 41, 7, 1, 17, 2, 60, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 31, 9, 2, 0, 3, 0, 2, 37, 2, 0, 26, 0, 2, 0, 45, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 200, 32, 32, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 26, 3994, 6, 582, 6842, 29, 1763, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 433, 44, 212, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 42, 9, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 229, 29, 3, 0, 496, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 4191]; -const astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 7, 9, 32, 4, 318, 1, 80, 3, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 68, 8, 2, 0, 3, 0, 2, 3, 2, 4, 2, 0, 15, 1, 83, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 7, 19, 58, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 343, 9, 54, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 10, 5350, 0, 7, 14, 11465, 27, 2343, 9, 87, 9, 39, 4, 60, 6, 26, 9, 535, 9, 470, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4178, 9, 519, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 245, 1, 2, 9, 726, 6, 110, 6, 6, 9, 4759, 9, 787719, 239]; +const astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 4, 51, 13, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 7, 25, 39, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 39, 27, 10, 22, 251, 41, 7, 1, 17, 5, 57, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 31, 9, 2, 0, 3, 0, 2, 37, 2, 0, 26, 0, 2, 0, 45, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 200, 32, 32, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 24, 43, 261, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 26, 3994, 6, 582, 6842, 29, 1763, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 433, 44, 212, 63, 33, 24, 3, 24, 45, 74, 6, 0, 67, 12, 65, 1, 2, 0, 15, 4, 10, 7381, 42, 31, 98, 114, 8702, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 229, 29, 3, 0, 208, 30, 2, 2, 2, 1, 2, 6, 3, 4, 10, 1, 225, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4381, 3, 5773, 3, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 8489]; +const astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 7, 9, 32, 4, 318, 1, 78, 5, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 68, 8, 2, 0, 3, 0, 2, 3, 2, 4, 2, 0, 15, 1, 83, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 7, 19, 58, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 199, 7, 137, 9, 54, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 55, 9, 266, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 10, 5350, 0, 7, 14, 11465, 27, 2343, 9, 87, 9, 39, 4, 60, 6, 26, 9, 535, 9, 470, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4178, 9, 519, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 245, 1, 2, 9, 233, 0, 3, 0, 8, 1, 6, 0, 475, 6, 110, 6, 6, 9, 4759, 9, 787719, 239]; function isInAstralSet(code, set) { let pos = 0x10000; for (let i = 0, length = set.length; i < length; i += 2) { diff --git a/node_modules/@babel/helper-validator-identifier/lib/identifier.js.map b/node_modules/@babel/helper-validator-identifier/lib/identifier.js.map index ecf09522..71d32ff2 100644 --- a/node_modules/@babel/helper-validator-identifier/lib/identifier.js.map +++ b/node_modules/@babel/helper-validator-identifier/lib/identifier.js.map @@ -1 +1 @@ -{"version":3,"names":["nonASCIIidentifierStartChars","nonASCIIidentifierChars","nonASCIIidentifierStart","RegExp","nonASCIIidentifier","astralIdentifierStartCodes","astralIdentifierCodes","isInAstralSet","code","set","pos","i","length","isIdentifierStart","test","String","fromCharCode","isIdentifierChar","isIdentifierName","name","isFirst","cp","charCodeAt","trail"],"sources":["../src/identifier.ts"],"sourcesContent":["// We inline this package\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport * as charCodes from \"charcodes\";\n\n// ## Character categories\n\n// Big ugly regular expressions that match characters in the\n// whitespace, identifier, and identifier-start categories. These\n// are only applied when a character is found to actually have a\n// code point between 0x80 and 0xffff.\n// Generated by `scripts/generate-identifier-regex.cjs`.\n\n/* prettier-ignore */\nlet nonASCIIidentifierStartChars = \"\\xaa\\xb5\\xba\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\u02c1\\u02c6-\\u02d1\\u02e0-\\u02e4\\u02ec\\u02ee\\u0370-\\u0374\\u0376\\u0377\\u037a-\\u037d\\u037f\\u0386\\u0388-\\u038a\\u038c\\u038e-\\u03a1\\u03a3-\\u03f5\\u03f7-\\u0481\\u048a-\\u052f\\u0531-\\u0556\\u0559\\u0560-\\u0588\\u05d0-\\u05ea\\u05ef-\\u05f2\\u0620-\\u064a\\u066e\\u066f\\u0671-\\u06d3\\u06d5\\u06e5\\u06e6\\u06ee\\u06ef\\u06fa-\\u06fc\\u06ff\\u0710\\u0712-\\u072f\\u074d-\\u07a5\\u07b1\\u07ca-\\u07ea\\u07f4\\u07f5\\u07fa\\u0800-\\u0815\\u081a\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086a\\u0870-\\u0887\\u0889-\\u088e\\u08a0-\\u08c9\\u0904-\\u0939\\u093d\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098c\\u098f\\u0990\\u0993-\\u09a8\\u09aa-\\u09b0\\u09b2\\u09b6-\\u09b9\\u09bd\\u09ce\\u09dc\\u09dd\\u09df-\\u09e1\\u09f0\\u09f1\\u09fc\\u0a05-\\u0a0a\\u0a0f\\u0a10\\u0a13-\\u0a28\\u0a2a-\\u0a30\\u0a32\\u0a33\\u0a35\\u0a36\\u0a38\\u0a39\\u0a59-\\u0a5c\\u0a5e\\u0a72-\\u0a74\\u0a85-\\u0a8d\\u0a8f-\\u0a91\\u0a93-\\u0aa8\\u0aaa-\\u0ab0\\u0ab2\\u0ab3\\u0ab5-\\u0ab9\\u0abd\\u0ad0\\u0ae0\\u0ae1\\u0af9\\u0b05-\\u0b0c\\u0b0f\\u0b10\\u0b13-\\u0b28\\u0b2a-\\u0b30\\u0b32\\u0b33\\u0b35-\\u0b39\\u0b3d\\u0b5c\\u0b5d\\u0b5f-\\u0b61\\u0b71\\u0b83\\u0b85-\\u0b8a\\u0b8e-\\u0b90\\u0b92-\\u0b95\\u0b99\\u0b9a\\u0b9c\\u0b9e\\u0b9f\\u0ba3\\u0ba4\\u0ba8-\\u0baa\\u0bae-\\u0bb9\\u0bd0\\u0c05-\\u0c0c\\u0c0e-\\u0c10\\u0c12-\\u0c28\\u0c2a-\\u0c39\\u0c3d\\u0c58-\\u0c5a\\u0c5d\\u0c60\\u0c61\\u0c80\\u0c85-\\u0c8c\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cbd\\u0cdd\\u0cde\\u0ce0\\u0ce1\\u0cf1\\u0cf2\\u0d04-\\u0d0c\\u0d0e-\\u0d10\\u0d12-\\u0d3a\\u0d3d\\u0d4e\\u0d54-\\u0d56\\u0d5f-\\u0d61\\u0d7a-\\u0d7f\\u0d85-\\u0d96\\u0d9a-\\u0db1\\u0db3-\\u0dbb\\u0dbd\\u0dc0-\\u0dc6\\u0e01-\\u0e30\\u0e32\\u0e33\\u0e40-\\u0e46\\u0e81\\u0e82\\u0e84\\u0e86-\\u0e8a\\u0e8c-\\u0ea3\\u0ea5\\u0ea7-\\u0eb0\\u0eb2\\u0eb3\\u0ebd\\u0ec0-\\u0ec4\\u0ec6\\u0edc-\\u0edf\\u0f00\\u0f40-\\u0f47\\u0f49-\\u0f6c\\u0f88-\\u0f8c\\u1000-\\u102a\\u103f\\u1050-\\u1055\\u105a-\\u105d\\u1061\\u1065\\u1066\\u106e-\\u1070\\u1075-\\u1081\\u108e\\u10a0-\\u10c5\\u10c7\\u10cd\\u10d0-\\u10fa\\u10fc-\\u1248\\u124a-\\u124d\\u1250-\\u1256\\u1258\\u125a-\\u125d\\u1260-\\u1288\\u128a-\\u128d\\u1290-\\u12b0\\u12b2-\\u12b5\\u12b8-\\u12be\\u12c0\\u12c2-\\u12c5\\u12c8-\\u12d6\\u12d8-\\u1310\\u1312-\\u1315\\u1318-\\u135a\\u1380-\\u138f\\u13a0-\\u13f5\\u13f8-\\u13fd\\u1401-\\u166c\\u166f-\\u167f\\u1681-\\u169a\\u16a0-\\u16ea\\u16ee-\\u16f8\\u1700-\\u1711\\u171f-\\u1731\\u1740-\\u1751\\u1760-\\u176c\\u176e-\\u1770\\u1780-\\u17b3\\u17d7\\u17dc\\u1820-\\u1878\\u1880-\\u18a8\\u18aa\\u18b0-\\u18f5\\u1900-\\u191e\\u1950-\\u196d\\u1970-\\u1974\\u1980-\\u19ab\\u19b0-\\u19c9\\u1a00-\\u1a16\\u1a20-\\u1a54\\u1aa7\\u1b05-\\u1b33\\u1b45-\\u1b4c\\u1b83-\\u1ba0\\u1bae\\u1baf\\u1bba-\\u1be5\\u1c00-\\u1c23\\u1c4d-\\u1c4f\\u1c5a-\\u1c7d\\u1c80-\\u1c8a\\u1c90-\\u1cba\\u1cbd-\\u1cbf\\u1ce9-\\u1cec\\u1cee-\\u1cf3\\u1cf5\\u1cf6\\u1cfa\\u1d00-\\u1dbf\\u1e00-\\u1f15\\u1f18-\\u1f1d\\u1f20-\\u1f45\\u1f48-\\u1f4d\\u1f50-\\u1f57\\u1f59\\u1f5b\\u1f5d\\u1f5f-\\u1f7d\\u1f80-\\u1fb4\\u1fb6-\\u1fbc\\u1fbe\\u1fc2-\\u1fc4\\u1fc6-\\u1fcc\\u1fd0-\\u1fd3\\u1fd6-\\u1fdb\\u1fe0-\\u1fec\\u1ff2-\\u1ff4\\u1ff6-\\u1ffc\\u2071\\u207f\\u2090-\\u209c\\u2102\\u2107\\u210a-\\u2113\\u2115\\u2118-\\u211d\\u2124\\u2126\\u2128\\u212a-\\u2139\\u213c-\\u213f\\u2145-\\u2149\\u214e\\u2160-\\u2188\\u2c00-\\u2ce4\\u2ceb-\\u2cee\\u2cf2\\u2cf3\\u2d00-\\u2d25\\u2d27\\u2d2d\\u2d30-\\u2d67\\u2d6f\\u2d80-\\u2d96\\u2da0-\\u2da6\\u2da8-\\u2dae\\u2db0-\\u2db6\\u2db8-\\u2dbe\\u2dc0-\\u2dc6\\u2dc8-\\u2dce\\u2dd0-\\u2dd6\\u2dd8-\\u2dde\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303c\\u3041-\\u3096\\u309b-\\u309f\\u30a1-\\u30fa\\u30fc-\\u30ff\\u3105-\\u312f\\u3131-\\u318e\\u31a0-\\u31bf\\u31f0-\\u31ff\\u3400-\\u4dbf\\u4e00-\\ua48c\\ua4d0-\\ua4fd\\ua500-\\ua60c\\ua610-\\ua61f\\ua62a\\ua62b\\ua640-\\ua66e\\ua67f-\\ua69d\\ua6a0-\\ua6ef\\ua717-\\ua71f\\ua722-\\ua788\\ua78b-\\ua7cd\\ua7d0\\ua7d1\\ua7d3\\ua7d5-\\ua7dc\\ua7f2-\\ua801\\ua803-\\ua805\\ua807-\\ua80a\\ua80c-\\ua822\\ua840-\\ua873\\ua882-\\ua8b3\\ua8f2-\\ua8f7\\ua8fb\\ua8fd\\ua8fe\\ua90a-\\ua925\\ua930-\\ua946\\ua960-\\ua97c\\ua984-\\ua9b2\\ua9cf\\ua9e0-\\ua9e4\\ua9e6-\\ua9ef\\ua9fa-\\ua9fe\\uaa00-\\uaa28\\uaa40-\\uaa42\\uaa44-\\uaa4b\\uaa60-\\uaa76\\uaa7a\\uaa7e-\\uaaaf\\uaab1\\uaab5\\uaab6\\uaab9-\\uaabd\\uaac0\\uaac2\\uaadb-\\uaadd\\uaae0-\\uaaea\\uaaf2-\\uaaf4\\uab01-\\uab06\\uab09-\\uab0e\\uab11-\\uab16\\uab20-\\uab26\\uab28-\\uab2e\\uab30-\\uab5a\\uab5c-\\uab69\\uab70-\\uabe2\\uac00-\\ud7a3\\ud7b0-\\ud7c6\\ud7cb-\\ud7fb\\uf900-\\ufa6d\\ufa70-\\ufad9\\ufb00-\\ufb06\\ufb13-\\ufb17\\ufb1d\\ufb1f-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40\\ufb41\\ufb43\\ufb44\\ufb46-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\\uffda-\\uffdc\";\n/* prettier-ignore */\nlet nonASCIIidentifierChars = \"\\xb7\\u0300-\\u036f\\u0387\\u0483-\\u0487\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u0669\\u0670\\u06d6-\\u06dc\\u06df-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u06f0-\\u06f9\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07c0-\\u07c9\\u07eb-\\u07f3\\u07fd\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0859-\\u085b\\u0897-\\u089f\\u08ca-\\u08e1\\u08e3-\\u0903\\u093a-\\u093c\\u093e-\\u094f\\u0951-\\u0957\\u0962\\u0963\\u0966-\\u096f\\u0981-\\u0983\\u09bc\\u09be-\\u09c4\\u09c7\\u09c8\\u09cb-\\u09cd\\u09d7\\u09e2\\u09e3\\u09e6-\\u09ef\\u09fe\\u0a01-\\u0a03\\u0a3c\\u0a3e-\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a66-\\u0a71\\u0a75\\u0a81-\\u0a83\\u0abc\\u0abe-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\\u0ae2\\u0ae3\\u0ae6-\\u0aef\\u0afa-\\u0aff\\u0b01-\\u0b03\\u0b3c\\u0b3e-\\u0b44\\u0b47\\u0b48\\u0b4b-\\u0b4d\\u0b55-\\u0b57\\u0b62\\u0b63\\u0b66-\\u0b6f\\u0b82\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd7\\u0be6-\\u0bef\\u0c00-\\u0c04\\u0c3c\\u0c3e-\\u0c44\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0c66-\\u0c6f\\u0c81-\\u0c83\\u0cbc\\u0cbe-\\u0cc4\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0ce6-\\u0cef\\u0cf3\\u0d00-\\u0d03\\u0d3b\\u0d3c\\u0d3e-\\u0d44\\u0d46-\\u0d48\\u0d4a-\\u0d4d\\u0d57\\u0d62\\u0d63\\u0d66-\\u0d6f\\u0d81-\\u0d83\\u0dca\\u0dcf-\\u0dd4\\u0dd6\\u0dd8-\\u0ddf\\u0de6-\\u0def\\u0df2\\u0df3\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0e50-\\u0e59\\u0eb1\\u0eb4-\\u0ebc\\u0ec8-\\u0ece\\u0ed0-\\u0ed9\\u0f18\\u0f19\\u0f20-\\u0f29\\u0f35\\u0f37\\u0f39\\u0f3e\\u0f3f\\u0f71-\\u0f84\\u0f86\\u0f87\\u0f8d-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102b-\\u103e\\u1040-\\u1049\\u1056-\\u1059\\u105e-\\u1060\\u1062-\\u1064\\u1067-\\u106d\\u1071-\\u1074\\u1082-\\u108d\\u108f-\\u109d\\u135d-\\u135f\\u1369-\\u1371\\u1712-\\u1715\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b4-\\u17d3\\u17dd\\u17e0-\\u17e9\\u180b-\\u180d\\u180f-\\u1819\\u18a9\\u1920-\\u192b\\u1930-\\u193b\\u1946-\\u194f\\u19d0-\\u19da\\u1a17-\\u1a1b\\u1a55-\\u1a5e\\u1a60-\\u1a7c\\u1a7f-\\u1a89\\u1a90-\\u1a99\\u1ab0-\\u1abd\\u1abf-\\u1ace\\u1b00-\\u1b04\\u1b34-\\u1b44\\u1b50-\\u1b59\\u1b6b-\\u1b73\\u1b80-\\u1b82\\u1ba1-\\u1bad\\u1bb0-\\u1bb9\\u1be6-\\u1bf3\\u1c24-\\u1c37\\u1c40-\\u1c49\\u1c50-\\u1c59\\u1cd0-\\u1cd2\\u1cd4-\\u1ce8\\u1ced\\u1cf4\\u1cf7-\\u1cf9\\u1dc0-\\u1dff\\u200c\\u200d\\u203f\\u2040\\u2054\\u20d0-\\u20dc\\u20e1\\u20e5-\\u20f0\\u2cef-\\u2cf1\\u2d7f\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\u30fb\\ua620-\\ua629\\ua66f\\ua674-\\ua67d\\ua69e\\ua69f\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua823-\\ua827\\ua82c\\ua880\\ua881\\ua8b4-\\ua8c5\\ua8d0-\\ua8d9\\ua8e0-\\ua8f1\\ua8ff-\\ua909\\ua926-\\ua92d\\ua947-\\ua953\\ua980-\\ua983\\ua9b3-\\ua9c0\\ua9d0-\\ua9d9\\ua9e5\\ua9f0-\\ua9f9\\uaa29-\\uaa36\\uaa43\\uaa4c\\uaa4d\\uaa50-\\uaa59\\uaa7b-\\uaa7d\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uaaeb-\\uaaef\\uaaf5\\uaaf6\\uabe3-\\uabea\\uabec\\uabed\\uabf0-\\uabf9\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe2f\\ufe33\\ufe34\\ufe4d-\\ufe4f\\uff10-\\uff19\\uff3f\\uff65\";\n\nconst nonASCIIidentifierStart = new RegExp(\n \"[\" + nonASCIIidentifierStartChars + \"]\",\n);\nconst nonASCIIidentifier = new RegExp(\n \"[\" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + \"]\",\n);\n\nnonASCIIidentifierStartChars = nonASCIIidentifierChars = null;\n\n// These are a run-length and offset-encoded representation of the\n// >0xffff code points that are a valid part of identifiers. The\n// offset starts at 0x10000, and each pair of numbers represents an\n// offset to the next range, and then a size of the range. They were\n// generated by `scripts/generate-identifier-regex.cjs`.\n/* prettier-ignore */\nconst astralIdentifierStartCodes = [0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,14,29,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,13,10,2,14,2,6,2,1,2,10,2,14,2,6,2,1,4,51,13,310,10,21,11,7,25,5,2,41,2,8,70,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,71,55,7,1,65,0,16,3,2,2,2,28,43,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,14,35,39,27,10,22,251,41,7,1,17,2,60,28,11,0,9,21,43,17,47,20,28,22,13,52,58,1,3,0,14,44,33,24,27,35,30,0,3,0,9,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,20,1,64,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,31,9,2,0,3,0,2,37,2,0,26,0,2,0,45,52,19,3,21,2,31,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,14,0,72,26,38,6,186,43,117,63,32,7,3,0,3,7,2,1,2,23,16,0,2,0,95,7,3,38,17,0,2,0,29,0,11,39,8,0,22,0,12,45,20,0,19,72,200,32,32,8,2,36,18,0,50,29,113,6,2,1,2,37,22,0,26,5,2,1,2,31,15,0,328,18,16,0,2,12,2,33,125,0,80,921,103,110,18,195,2637,96,16,1071,18,5,26,3994,6,582,6842,29,1763,568,8,30,18,78,18,29,19,47,17,3,32,20,6,18,433,44,212,63,129,74,6,0,67,12,65,1,2,0,29,6135,9,1237,42,9,8936,3,2,6,2,1,2,290,16,0,30,2,3,0,15,3,9,395,2309,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,1845,30,7,5,262,61,147,44,11,6,17,0,322,29,19,43,485,27,229,29,3,0,496,6,2,3,2,1,2,14,2,196,60,67,8,0,1205,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42719,33,4153,7,221,3,5761,15,7472,16,621,2467,541,1507,4938,6,4191];\n/* prettier-ignore */\nconst astralIdentifierCodes = [509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,574,3,9,9,7,9,32,4,318,1,80,3,71,10,50,3,123,2,54,14,32,10,3,1,11,3,46,10,8,0,46,9,7,2,37,13,2,9,6,1,45,0,13,2,49,13,9,3,2,11,83,11,7,0,3,0,158,11,6,9,7,3,56,1,2,6,3,1,3,2,10,0,11,1,3,6,4,4,68,8,2,0,3,0,2,3,2,4,2,0,15,1,83,17,10,9,5,0,82,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,7,19,58,14,5,9,243,14,166,9,71,5,2,1,3,3,2,0,2,1,13,9,120,6,3,6,4,0,29,9,41,6,2,3,9,0,10,10,47,15,343,9,54,7,2,7,17,9,57,21,2,13,123,5,4,0,2,1,2,6,2,0,9,9,49,4,2,1,2,4,9,9,330,3,10,1,2,0,49,6,4,4,14,10,5350,0,7,14,11465,27,2343,9,87,9,39,4,60,6,26,9,535,9,470,0,2,54,8,3,82,0,12,1,19628,1,4178,9,519,45,3,22,543,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,101,0,161,6,10,9,357,0,62,13,499,13,245,1,2,9,726,6,110,6,6,9,4759,9,787719,239];\n\n// This has a complexity linear to the value of the code. The\n// assumption is that looking up astral identifier characters is\n// rare.\nfunction isInAstralSet(code: number, set: readonly number[]): boolean {\n let pos = 0x10000;\n for (let i = 0, length = set.length; i < length; i += 2) {\n pos += set[i];\n if (pos > code) return false;\n\n pos += set[i + 1];\n if (pos >= code) return true;\n }\n return false;\n}\n\n// Test whether a given character code starts an identifier.\n\nexport function isIdentifierStart(code: number): boolean {\n if (code < charCodes.uppercaseA) return code === charCodes.dollarSign;\n if (code <= charCodes.uppercaseZ) return true;\n if (code < charCodes.lowercaseA) return code === charCodes.underscore;\n if (code <= charCodes.lowercaseZ) return true;\n if (code <= 0xffff) {\n return (\n code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code))\n );\n }\n return isInAstralSet(code, astralIdentifierStartCodes);\n}\n\n// Test whether a given character is part of an identifier.\n\nexport function isIdentifierChar(code: number): boolean {\n if (code < charCodes.digit0) return code === charCodes.dollarSign;\n if (code < charCodes.colon) return true;\n if (code < charCodes.uppercaseA) return false;\n if (code <= charCodes.uppercaseZ) return true;\n if (code < charCodes.lowercaseA) return code === charCodes.underscore;\n if (code <= charCodes.lowercaseZ) return true;\n if (code <= 0xffff) {\n return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code));\n }\n return (\n isInAstralSet(code, astralIdentifierStartCodes) ||\n isInAstralSet(code, astralIdentifierCodes)\n );\n}\n\n// Test whether a given string is a valid identifier name\n\nexport function isIdentifierName(name: string): boolean {\n let isFirst = true;\n for (let i = 0; i < name.length; i++) {\n // The implementation is based on\n // https://source.chromium.org/chromium/chromium/src/+/master:v8/src/builtins/builtins-string-gen.cc;l=1455;drc=221e331b49dfefadbc6fa40b0c68e6f97606d0b3;bpv=0;bpt=1\n // We reimplement `codePointAt` because `codePointAt` is a V8 builtin which is not inlined by TurboFan (as of M91)\n // since `name` is mostly ASCII, an inlined `charCodeAt` wins here\n let cp = name.charCodeAt(i);\n if ((cp & 0xfc00) === 0xd800 && i + 1 < name.length) {\n const trail = name.charCodeAt(++i);\n if ((trail & 0xfc00) === 0xdc00) {\n cp = 0x10000 + ((cp & 0x3ff) << 10) + (trail & 0x3ff);\n }\n }\n if (isFirst) {\n isFirst = false;\n if (!isIdentifierStart(cp)) {\n return false;\n }\n } else if (!isIdentifierChar(cp)) {\n return false;\n }\n }\n return !isFirst;\n}\n"],"mappings":";;;;;;;;AAaA,IAAIA,4BAA4B,GAAG,8qIAA8qI;AAEjtI,IAAIC,uBAAuB,GAAG,+kFAA+kF;AAE7mF,MAAMC,uBAAuB,GAAG,IAAIC,MAAM,CACxC,GAAG,GAAGH,4BAA4B,GAAG,GACvC,CAAC;AACD,MAAMI,kBAAkB,GAAG,IAAID,MAAM,CACnC,GAAG,GAAGH,4BAA4B,GAAGC,uBAAuB,GAAG,GACjE,CAAC;AAEDD,4BAA4B,GAAGC,uBAAuB,GAAG,IAAI;AAQ7D,MAAMI,0BAA0B,GAAG,CAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,IAAI,EAAC,EAAE,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,GAAG,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,IAAI,EAAC,EAAE,EAAC,CAAC,EAAC,IAAI,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,IAAI,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,IAAI,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,IAAI,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,IAAI,EAAC,KAAK,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,CAAC,EAAC,IAAI,CAAC;AAEjkD,MAAMC,qBAAqB,GAAG,CAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,IAAI,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAA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","ignoreList":[]} \ No newline at end of file +{"version":3,"names":["nonASCIIidentifierStartChars","nonASCIIidentifierChars","nonASCIIidentifierStart","RegExp","nonASCIIidentifier","astralIdentifierStartCodes","astralIdentifierCodes","isInAstralSet","code","set","pos","i","length","isIdentifierStart","test","String","fromCharCode","isIdentifierChar","isIdentifierName","name","isFirst","cp","charCodeAt","trail"],"sources":["../src/identifier.ts"],"sourcesContent":["// We inline this package\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport * as charCodes from \"charcodes\";\n\n// ## Character categories\n\n// Big ugly regular expressions that match characters in the\n// whitespace, identifier, and identifier-start categories. These\n// are only applied when a character is found to actually have a\n// code point between 0x80 and 0xffff.\n// Generated by `scripts/generate-identifier-regex.cjs`.\n\n/* prettier-ignore */\nlet nonASCIIidentifierStartChars = \"\\xaa\\xb5\\xba\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\u02c1\\u02c6-\\u02d1\\u02e0-\\u02e4\\u02ec\\u02ee\\u0370-\\u0374\\u0376\\u0377\\u037a-\\u037d\\u037f\\u0386\\u0388-\\u038a\\u038c\\u038e-\\u03a1\\u03a3-\\u03f5\\u03f7-\\u0481\\u048a-\\u052f\\u0531-\\u0556\\u0559\\u0560-\\u0588\\u05d0-\\u05ea\\u05ef-\\u05f2\\u0620-\\u064a\\u066e\\u066f\\u0671-\\u06d3\\u06d5\\u06e5\\u06e6\\u06ee\\u06ef\\u06fa-\\u06fc\\u06ff\\u0710\\u0712-\\u072f\\u074d-\\u07a5\\u07b1\\u07ca-\\u07ea\\u07f4\\u07f5\\u07fa\\u0800-\\u0815\\u081a\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086a\\u0870-\\u0887\\u0889-\\u088f\\u08a0-\\u08c9\\u0904-\\u0939\\u093d\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098c\\u098f\\u0990\\u0993-\\u09a8\\u09aa-\\u09b0\\u09b2\\u09b6-\\u09b9\\u09bd\\u09ce\\u09dc\\u09dd\\u09df-\\u09e1\\u09f0\\u09f1\\u09fc\\u0a05-\\u0a0a\\u0a0f\\u0a10\\u0a13-\\u0a28\\u0a2a-\\u0a30\\u0a32\\u0a33\\u0a35\\u0a36\\u0a38\\u0a39\\u0a59-\\u0a5c\\u0a5e\\u0a72-\\u0a74\\u0a85-\\u0a8d\\u0a8f-\\u0a91\\u0a93-\\u0aa8\\u0aaa-\\u0ab0\\u0ab2\\u0ab3\\u0ab5-\\u0ab9\\u0abd\\u0ad0\\u0ae0\\u0ae1\\u0af9\\u0b05-\\u0b0c\\u0b0f\\u0b10\\u0b13-\\u0b28\\u0b2a-\\u0b30\\u0b32\\u0b33\\u0b35-\\u0b39\\u0b3d\\u0b5c\\u0b5d\\u0b5f-\\u0b61\\u0b71\\u0b83\\u0b85-\\u0b8a\\u0b8e-\\u0b90\\u0b92-\\u0b95\\u0b99\\u0b9a\\u0b9c\\u0b9e\\u0b9f\\u0ba3\\u0ba4\\u0ba8-\\u0baa\\u0bae-\\u0bb9\\u0bd0\\u0c05-\\u0c0c\\u0c0e-\\u0c10\\u0c12-\\u0c28\\u0c2a-\\u0c39\\u0c3d\\u0c58-\\u0c5a\\u0c5c\\u0c5d\\u0c60\\u0c61\\u0c80\\u0c85-\\u0c8c\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cbd\\u0cdc-\\u0cde\\u0ce0\\u0ce1\\u0cf1\\u0cf2\\u0d04-\\u0d0c\\u0d0e-\\u0d10\\u0d12-\\u0d3a\\u0d3d\\u0d4e\\u0d54-\\u0d56\\u0d5f-\\u0d61\\u0d7a-\\u0d7f\\u0d85-\\u0d96\\u0d9a-\\u0db1\\u0db3-\\u0dbb\\u0dbd\\u0dc0-\\u0dc6\\u0e01-\\u0e30\\u0e32\\u0e33\\u0e40-\\u0e46\\u0e81\\u0e82\\u0e84\\u0e86-\\u0e8a\\u0e8c-\\u0ea3\\u0ea5\\u0ea7-\\u0eb0\\u0eb2\\u0eb3\\u0ebd\\u0ec0-\\u0ec4\\u0ec6\\u0edc-\\u0edf\\u0f00\\u0f40-\\u0f47\\u0f49-\\u0f6c\\u0f88-\\u0f8c\\u1000-\\u102a\\u103f\\u1050-\\u1055\\u105a-\\u105d\\u1061\\u1065\\u1066\\u106e-\\u1070\\u1075-\\u1081\\u108e\\u10a0-\\u10c5\\u10c7\\u10cd\\u10d0-\\u10fa\\u10fc-\\u1248\\u124a-\\u124d\\u1250-\\u1256\\u1258\\u125a-\\u125d\\u1260-\\u1288\\u128a-\\u128d\\u1290-\\u12b0\\u12b2-\\u12b5\\u12b8-\\u12be\\u12c0\\u12c2-\\u12c5\\u12c8-\\u12d6\\u12d8-\\u1310\\u1312-\\u1315\\u1318-\\u135a\\u1380-\\u138f\\u13a0-\\u13f5\\u13f8-\\u13fd\\u1401-\\u166c\\u166f-\\u167f\\u1681-\\u169a\\u16a0-\\u16ea\\u16ee-\\u16f8\\u1700-\\u1711\\u171f-\\u1731\\u1740-\\u1751\\u1760-\\u176c\\u176e-\\u1770\\u1780-\\u17b3\\u17d7\\u17dc\\u1820-\\u1878\\u1880-\\u18a8\\u18aa\\u18b0-\\u18f5\\u1900-\\u191e\\u1950-\\u196d\\u1970-\\u1974\\u1980-\\u19ab\\u19b0-\\u19c9\\u1a00-\\u1a16\\u1a20-\\u1a54\\u1aa7\\u1b05-\\u1b33\\u1b45-\\u1b4c\\u1b83-\\u1ba0\\u1bae\\u1baf\\u1bba-\\u1be5\\u1c00-\\u1c23\\u1c4d-\\u1c4f\\u1c5a-\\u1c7d\\u1c80-\\u1c8a\\u1c90-\\u1cba\\u1cbd-\\u1cbf\\u1ce9-\\u1cec\\u1cee-\\u1cf3\\u1cf5\\u1cf6\\u1cfa\\u1d00-\\u1dbf\\u1e00-\\u1f15\\u1f18-\\u1f1d\\u1f20-\\u1f45\\u1f48-\\u1f4d\\u1f50-\\u1f57\\u1f59\\u1f5b\\u1f5d\\u1f5f-\\u1f7d\\u1f80-\\u1fb4\\u1fb6-\\u1fbc\\u1fbe\\u1fc2-\\u1fc4\\u1fc6-\\u1fcc\\u1fd0-\\u1fd3\\u1fd6-\\u1fdb\\u1fe0-\\u1fec\\u1ff2-\\u1ff4\\u1ff6-\\u1ffc\\u2071\\u207f\\u2090-\\u209c\\u2102\\u2107\\u210a-\\u2113\\u2115\\u2118-\\u211d\\u2124\\u2126\\u2128\\u212a-\\u2139\\u213c-\\u213f\\u2145-\\u2149\\u214e\\u2160-\\u2188\\u2c00-\\u2ce4\\u2ceb-\\u2cee\\u2cf2\\u2cf3\\u2d00-\\u2d25\\u2d27\\u2d2d\\u2d30-\\u2d67\\u2d6f\\u2d80-\\u2d96\\u2da0-\\u2da6\\u2da8-\\u2dae\\u2db0-\\u2db6\\u2db8-\\u2dbe\\u2dc0-\\u2dc6\\u2dc8-\\u2dce\\u2dd0-\\u2dd6\\u2dd8-\\u2dde\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303c\\u3041-\\u3096\\u309b-\\u309f\\u30a1-\\u30fa\\u30fc-\\u30ff\\u3105-\\u312f\\u3131-\\u318e\\u31a0-\\u31bf\\u31f0-\\u31ff\\u3400-\\u4dbf\\u4e00-\\ua48c\\ua4d0-\\ua4fd\\ua500-\\ua60c\\ua610-\\ua61f\\ua62a\\ua62b\\ua640-\\ua66e\\ua67f-\\ua69d\\ua6a0-\\ua6ef\\ua717-\\ua71f\\ua722-\\ua788\\ua78b-\\ua7dc\\ua7f1-\\ua801\\ua803-\\ua805\\ua807-\\ua80a\\ua80c-\\ua822\\ua840-\\ua873\\ua882-\\ua8b3\\ua8f2-\\ua8f7\\ua8fb\\ua8fd\\ua8fe\\ua90a-\\ua925\\ua930-\\ua946\\ua960-\\ua97c\\ua984-\\ua9b2\\ua9cf\\ua9e0-\\ua9e4\\ua9e6-\\ua9ef\\ua9fa-\\ua9fe\\uaa00-\\uaa28\\uaa40-\\uaa42\\uaa44-\\uaa4b\\uaa60-\\uaa76\\uaa7a\\uaa7e-\\uaaaf\\uaab1\\uaab5\\uaab6\\uaab9-\\uaabd\\uaac0\\uaac2\\uaadb-\\uaadd\\uaae0-\\uaaea\\uaaf2-\\uaaf4\\uab01-\\uab06\\uab09-\\uab0e\\uab11-\\uab16\\uab20-\\uab26\\uab28-\\uab2e\\uab30-\\uab5a\\uab5c-\\uab69\\uab70-\\uabe2\\uac00-\\ud7a3\\ud7b0-\\ud7c6\\ud7cb-\\ud7fb\\uf900-\\ufa6d\\ufa70-\\ufad9\\ufb00-\\ufb06\\ufb13-\\ufb17\\ufb1d\\ufb1f-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40\\ufb41\\ufb43\\ufb44\\ufb46-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\\uffda-\\uffdc\";\n/* prettier-ignore */\nlet nonASCIIidentifierChars = \"\\xb7\\u0300-\\u036f\\u0387\\u0483-\\u0487\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u0669\\u0670\\u06d6-\\u06dc\\u06df-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u06f0-\\u06f9\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07c0-\\u07c9\\u07eb-\\u07f3\\u07fd\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0859-\\u085b\\u0897-\\u089f\\u08ca-\\u08e1\\u08e3-\\u0903\\u093a-\\u093c\\u093e-\\u094f\\u0951-\\u0957\\u0962\\u0963\\u0966-\\u096f\\u0981-\\u0983\\u09bc\\u09be-\\u09c4\\u09c7\\u09c8\\u09cb-\\u09cd\\u09d7\\u09e2\\u09e3\\u09e6-\\u09ef\\u09fe\\u0a01-\\u0a03\\u0a3c\\u0a3e-\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a66-\\u0a71\\u0a75\\u0a81-\\u0a83\\u0abc\\u0abe-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\\u0ae2\\u0ae3\\u0ae6-\\u0aef\\u0afa-\\u0aff\\u0b01-\\u0b03\\u0b3c\\u0b3e-\\u0b44\\u0b47\\u0b48\\u0b4b-\\u0b4d\\u0b55-\\u0b57\\u0b62\\u0b63\\u0b66-\\u0b6f\\u0b82\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd7\\u0be6-\\u0bef\\u0c00-\\u0c04\\u0c3c\\u0c3e-\\u0c44\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0c66-\\u0c6f\\u0c81-\\u0c83\\u0cbc\\u0cbe-\\u0cc4\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0ce6-\\u0cef\\u0cf3\\u0d00-\\u0d03\\u0d3b\\u0d3c\\u0d3e-\\u0d44\\u0d46-\\u0d48\\u0d4a-\\u0d4d\\u0d57\\u0d62\\u0d63\\u0d66-\\u0d6f\\u0d81-\\u0d83\\u0dca\\u0dcf-\\u0dd4\\u0dd6\\u0dd8-\\u0ddf\\u0de6-\\u0def\\u0df2\\u0df3\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0e50-\\u0e59\\u0eb1\\u0eb4-\\u0ebc\\u0ec8-\\u0ece\\u0ed0-\\u0ed9\\u0f18\\u0f19\\u0f20-\\u0f29\\u0f35\\u0f37\\u0f39\\u0f3e\\u0f3f\\u0f71-\\u0f84\\u0f86\\u0f87\\u0f8d-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102b-\\u103e\\u1040-\\u1049\\u1056-\\u1059\\u105e-\\u1060\\u1062-\\u1064\\u1067-\\u106d\\u1071-\\u1074\\u1082-\\u108d\\u108f-\\u109d\\u135d-\\u135f\\u1369-\\u1371\\u1712-\\u1715\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b4-\\u17d3\\u17dd\\u17e0-\\u17e9\\u180b-\\u180d\\u180f-\\u1819\\u18a9\\u1920-\\u192b\\u1930-\\u193b\\u1946-\\u194f\\u19d0-\\u19da\\u1a17-\\u1a1b\\u1a55-\\u1a5e\\u1a60-\\u1a7c\\u1a7f-\\u1a89\\u1a90-\\u1a99\\u1ab0-\\u1abd\\u1abf-\\u1add\\u1ae0-\\u1aeb\\u1b00-\\u1b04\\u1b34-\\u1b44\\u1b50-\\u1b59\\u1b6b-\\u1b73\\u1b80-\\u1b82\\u1ba1-\\u1bad\\u1bb0-\\u1bb9\\u1be6-\\u1bf3\\u1c24-\\u1c37\\u1c40-\\u1c49\\u1c50-\\u1c59\\u1cd0-\\u1cd2\\u1cd4-\\u1ce8\\u1ced\\u1cf4\\u1cf7-\\u1cf9\\u1dc0-\\u1dff\\u200c\\u200d\\u203f\\u2040\\u2054\\u20d0-\\u20dc\\u20e1\\u20e5-\\u20f0\\u2cef-\\u2cf1\\u2d7f\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\u30fb\\ua620-\\ua629\\ua66f\\ua674-\\ua67d\\ua69e\\ua69f\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua823-\\ua827\\ua82c\\ua880\\ua881\\ua8b4-\\ua8c5\\ua8d0-\\ua8d9\\ua8e0-\\ua8f1\\ua8ff-\\ua909\\ua926-\\ua92d\\ua947-\\ua953\\ua980-\\ua983\\ua9b3-\\ua9c0\\ua9d0-\\ua9d9\\ua9e5\\ua9f0-\\ua9f9\\uaa29-\\uaa36\\uaa43\\uaa4c\\uaa4d\\uaa50-\\uaa59\\uaa7b-\\uaa7d\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uaaeb-\\uaaef\\uaaf5\\uaaf6\\uabe3-\\uabea\\uabec\\uabed\\uabf0-\\uabf9\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe2f\\ufe33\\ufe34\\ufe4d-\\ufe4f\\uff10-\\uff19\\uff3f\\uff65\";\n\nconst nonASCIIidentifierStart = new RegExp(\n \"[\" + nonASCIIidentifierStartChars + \"]\",\n);\nconst nonASCIIidentifier = new RegExp(\n \"[\" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + \"]\",\n);\n\nnonASCIIidentifierStartChars = nonASCIIidentifierChars = null;\n\n// These are a run-length and offset-encoded representation of the\n// >0xffff code points that are a valid part of identifiers. The\n// offset starts at 0x10000, and each pair of numbers represents an\n// offset to the next range, and then a size of the range. They were\n// generated by `scripts/generate-identifier-regex.cjs`.\n/* prettier-ignore */\nconst astralIdentifierStartCodes = [0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,14,29,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,13,10,2,14,2,6,2,1,2,10,2,14,2,6,2,1,4,51,13,310,10,21,11,7,25,5,2,41,2,8,70,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,7,25,39,55,7,1,65,0,16,3,2,2,2,28,43,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,14,35,39,27,10,22,251,41,7,1,17,5,57,28,11,0,9,21,43,17,47,20,28,22,13,52,58,1,3,0,14,44,33,24,27,35,30,0,3,0,9,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,20,1,64,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,31,9,2,0,3,0,2,37,2,0,26,0,2,0,45,52,19,3,21,2,31,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,14,0,72,26,38,6,186,43,117,63,32,7,3,0,3,7,2,1,2,23,16,0,2,0,95,7,3,38,17,0,2,0,29,0,11,39,8,0,22,0,12,45,20,0,19,72,200,32,32,8,2,36,18,0,50,29,113,6,2,1,2,37,22,0,26,5,2,1,2,31,15,0,24,43,261,18,16,0,2,12,2,33,125,0,80,921,103,110,18,195,2637,96,16,1071,18,5,26,3994,6,582,6842,29,1763,568,8,30,18,78,18,29,19,47,17,3,32,20,6,18,433,44,212,63,33,24,3,24,45,74,6,0,67,12,65,1,2,0,15,4,10,7381,42,31,98,114,8702,3,2,6,2,1,2,290,16,0,30,2,3,0,15,3,9,395,2309,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,1845,30,7,5,262,61,147,44,11,6,17,0,322,29,19,43,485,27,229,29,3,0,208,30,2,2,2,1,2,6,3,4,10,1,225,6,2,3,2,1,2,14,2,196,60,67,8,0,1205,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42719,33,4381,3,5773,3,7472,16,621,2467,541,1507,4938,6,8489];\n/* prettier-ignore */\nconst astralIdentifierCodes = [509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,574,3,9,9,7,9,32,4,318,1,78,5,71,10,50,3,123,2,54,14,32,10,3,1,11,3,46,10,8,0,46,9,7,2,37,13,2,9,6,1,45,0,13,2,49,13,9,3,2,11,83,11,7,0,3,0,158,11,6,9,7,3,56,1,2,6,3,1,3,2,10,0,11,1,3,6,4,4,68,8,2,0,3,0,2,3,2,4,2,0,15,1,83,17,10,9,5,0,82,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,7,19,58,14,5,9,243,14,166,9,71,5,2,1,3,3,2,0,2,1,13,9,120,6,3,6,4,0,29,9,41,6,2,3,9,0,10,10,47,15,199,7,137,9,54,7,2,7,17,9,57,21,2,13,123,5,4,0,2,1,2,6,2,0,9,9,49,4,2,1,2,4,9,9,55,9,266,3,10,1,2,0,49,6,4,4,14,10,5350,0,7,14,11465,27,2343,9,87,9,39,4,60,6,26,9,535,9,470,0,2,54,8,3,82,0,12,1,19628,1,4178,9,519,45,3,22,543,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,101,0,161,6,10,9,357,0,62,13,499,13,245,1,2,9,233,0,3,0,8,1,6,0,475,6,110,6,6,9,4759,9,787719,239];\n\n// This has a complexity linear to the value of the code. The\n// assumption is that looking up astral identifier characters is\n// rare.\nfunction isInAstralSet(code: number, set: readonly number[]): boolean {\n let pos = 0x10000;\n for (let i = 0, length = set.length; i < length; i += 2) {\n pos += set[i];\n if (pos > code) return false;\n\n pos += set[i + 1];\n if (pos >= code) return true;\n }\n return false;\n}\n\n// Test whether a given character code starts an identifier.\n\nexport function isIdentifierStart(code: number): boolean {\n if (code < charCodes.uppercaseA) return code === charCodes.dollarSign;\n if (code <= charCodes.uppercaseZ) return true;\n if (code < charCodes.lowercaseA) return code === charCodes.underscore;\n if (code <= charCodes.lowercaseZ) return true;\n if (code <= 0xffff) {\n return (\n code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code))\n );\n }\n return isInAstralSet(code, astralIdentifierStartCodes);\n}\n\n// Test whether a given character is part of an identifier.\n\nexport function isIdentifierChar(code: number): boolean {\n if (code < charCodes.digit0) return code === charCodes.dollarSign;\n if (code < charCodes.colon) return true;\n if (code < charCodes.uppercaseA) return false;\n if (code <= charCodes.uppercaseZ) return true;\n if (code < charCodes.lowercaseA) return code === charCodes.underscore;\n if (code <= charCodes.lowercaseZ) return true;\n if (code <= 0xffff) {\n return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code));\n }\n return (\n isInAstralSet(code, astralIdentifierStartCodes) ||\n isInAstralSet(code, astralIdentifierCodes)\n );\n}\n\n// Test whether a given string is a valid identifier name\n\nexport function isIdentifierName(name: string): boolean {\n let isFirst = true;\n for (let i = 0; i < name.length; i++) {\n // The implementation is based on\n // https://source.chromium.org/chromium/chromium/src/+/master:v8/src/builtins/builtins-string-gen.cc;l=1455;drc=221e331b49dfefadbc6fa40b0c68e6f97606d0b3;bpv=0;bpt=1\n // We reimplement `codePointAt` because `codePointAt` is a V8 builtin which is not inlined by TurboFan (as of M91)\n // since `name` is mostly ASCII, an inlined `charCodeAt` wins here\n let cp = name.charCodeAt(i);\n if ((cp & 0xfc00) === 0xd800 && i + 1 < name.length) {\n const trail = name.charCodeAt(++i);\n if ((trail & 0xfc00) === 0xdc00) {\n cp = 0x10000 + ((cp & 0x3ff) << 10) + (trail & 0x3ff);\n }\n }\n if (isFirst) {\n isFirst = false;\n if (!isIdentifierStart(cp)) {\n return false;\n }\n } else if (!isIdentifierChar(cp)) {\n return false;\n }\n }\n return !isFirst;\n}\n"],"mappings":";;;;;;;;AAaA,IAAIA,4BAA4B,GAAG,spIAAspI;AAEzrI,IAAIC,uBAAuB,GAAG,4lFAA4lF;AAE1nF,MAAMC,uBAAuB,GAAG,IAAIC,MAAM,CACxC,GAAG,GAAGH,4BAA4B,GAAG,GACvC,CAAC;AACD,MAAMI,kBAAkB,GAAG,IAAID,MAAM,CACnC,GAAG,GAAGH,4BAA4B,GAAGC,uBAAuB,GAAG,GACjE,CAAC;AAEDD,4BAA4B,GAAGC,uBAAuB,GAAG,IAAI;AAQ7D,MAAMI,0BAA0B,GAAG,CAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,GAAG,EAAC,GAAG,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,IAAI,EAAC,EAAE,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,GAAG,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,IAAI,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,IAAI,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,IAAI,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,IAAI,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,IAAI,EAAC,KAAK,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,IAAI,EAAC,CAAC,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,IAAI,EAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,CAAC,EAAC,IAAI,CAAC;AAEjnD,MAAMC,qBAAqB,GAAG,CAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,IAAI,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,KAAK,EAAC,CAAC,EAAC,IAAI,EAAC,CAAC,EAAC,GAAG,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAA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","ignoreList":[]} \ No newline at end of file diff --git a/node_modules/@babel/helper-validator-identifier/package.json b/node_modules/@babel/helper-validator-identifier/package.json index 316dff68..1aea38db 100644 --- a/node_modules/@babel/helper-validator-identifier/package.json +++ b/node_modules/@babel/helper-validator-identifier/package.json @@ -1,6 +1,6 @@ { "name": "@babel/helper-validator-identifier", - "version": "7.27.1", + "version": "7.28.5", "description": "Validate identifier/keywords name", "repository": { "type": "git", @@ -20,7 +20,7 @@ "./package.json": "./package.json" }, "devDependencies": { - "@unicode/unicode-16.0.0": "^1.0.0", + "@unicode/unicode-17.0.0": "^1.6.10", "charcodes": "^0.2.0" }, "engines": { diff --git a/node_modules/@babel/parser/bin/babel-parser.js b/node_modules/@babel/parser/bin/babel-parser.js index 4808c5ee..3aca3145 100644 --- a/node_modules/@babel/parser/bin/babel-parser.js +++ b/node_modules/@babel/parser/bin/babel-parser.js @@ -1,5 +1,5 @@ #!/usr/bin/env node -/* eslint-disable no-var, unicorn/prefer-node-protocol */ +/* eslint no-var: 0 */ var parser = require(".."); var fs = require("fs"); diff --git a/node_modules/@babel/parser/lib/index.js b/node_modules/@babel/parser/lib/index.js index 41c94cd7..3b5c6bc8 100644 --- a/node_modules/@babel/parser/lib/index.js +++ b/node_modules/@babel/parser/lib/index.js @@ -7,7 +7,7 @@ function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { - if (-1 !== e.indexOf(n)) continue; + if (e.includes(n)) continue; t[n] = r[n]; } return t; @@ -88,6 +88,7 @@ var StandardErrors = { AwaitExpressionFormalParameter: "'await' is not allowed in async function parameters.", AwaitUsingNotInAsyncContext: "'await using' is only allowed within async functions and at the top levels of modules.", AwaitNotInAsyncContext: "'await' is only allowed within async functions and at the top levels of modules.", + AwaitNotInAsyncFunction: "'await' is only allowed within async functions.", BadGetterArity: "A 'get' accessor must not have any formal parameters.", BadSetterArity: "A 'set' accessor must have exactly one formal parameter.", BadSetterRestParameter: "A 'set' accessor function argument must not be a rest parameter.", @@ -116,6 +117,9 @@ var StandardErrors = { }) => `\`${exportName}\` has already been exported. Exported identifiers must be unique.`, DuplicateProto: "Redefinition of __proto__ property.", DuplicateRegExpFlags: "Duplicate regular expression flag.", + DynamicImportPhaseRequiresImportExpressions: ({ + phase + }) => `'import.${phase}(...)' can only be parsed when using the 'createImportExpressions' option.`, ElementAfterRest: "Rest element must be last element.", EscapedCharNotAnIdentifier: "Invalid Unicode escape.", ExportBindingIsString: ({ @@ -135,11 +139,14 @@ var StandardErrors = { }) => `Unsyntactic ${type === "BreakStatement" ? "break" : "continue"}.`, IllegalLanguageModeDirective: "Illegal 'use strict' directive in function with non-simple parameter list.", IllegalReturn: "'return' outside of function.", - ImportAttributesUseAssert: "The `assert` keyword in import attributes is deprecated and it has been replaced by the `with` keyword. You can enable the `deprecatedImportAssert` parser plugin to suppress this error.", + ImportAttributesUseAssert: "The `assert` keyword in import attributes is deprecated and it has been replaced by the `with` keyword. You can enable the `deprecatedAssertSyntax: true` option in the import attributes plugin to suppress this error.", ImportBindingIsString: ({ importName }) => `A string literal cannot be used as an imported binding.\n- Did you mean \`import { "${importName}" as foo }\`?`, - ImportCallArity: `\`import()\` requires exactly one or two arguments.`, + ImportCallArgumentTrailingComma: "Trailing comma is disallowed inside import(...) arguments.", + ImportCallArity: ({ + maxArgumentCount + }) => `\`import()\` requires exactly ${maxArgumentCount === 1 ? "one argument" : "one or two arguments"}.`, ImportCallNotNewExpression: "Cannot use new with import(...).", ImportCallSpreadArgument: "`...` is not allowed in `import()`.", ImportJSONBindingNotDefault: "A JSON module can only be imported with `default`.", @@ -148,7 +155,6 @@ var StandardErrors = { IncompatibleRegExpUVFlags: "The 'u' and 'v' regular expression flags cannot be enabled at the same time.", InvalidBigIntLiteral: "Invalid BigIntLiteral.", InvalidCodePoint: "Code point out of bounds.", - InvalidCoverDiscardElement: "'void' must be followed by an expression when not used in a binding position.", InvalidCoverInitializedName: "Invalid shorthand property initializer.", InvalidDecimal: "Invalid decimal.", InvalidDigit: ({ @@ -265,8 +271,7 @@ var StandardErrors = { unexpected }) => `Unexpected token${unexpected ? ` '${unexpected}'.` : ""}${expected ? `, expected "${expected}"` : ""}`, UnexpectedTokenUnaryExponentiation: "Illegal expression. Wrap left hand side or entire exponentiation in parentheses.", - UnexpectedUsingDeclaration: "Using declaration cannot appear in the top level when source type is `script` or in the bare case statement.", - UnexpectedVoidPattern: "Unexpected void binding.", + UnexpectedUsingDeclaration: "Using declaration cannot appear in the top level when source type is `script`.", UnsupportedBind: "Binding should be performed on object property.", UnsupportedDecoratorExport: "A decorated export must export a class declaration.", UnsupportedDefaultExport: "Only expressions, functions or classes are allowed as the `default` export.", @@ -287,11 +292,8 @@ var StandardErrors = { VarRedeclaration: ({ identifierName }) => `Identifier '${identifierName}' has already been declared.`, - VoidPatternCatchClauseParam: "A void binding can not be the catch clause parameter. Use `try { ... } catch { ... }` if you want to discard the caught error.", - VoidPatternInitializer: "A void binding may not have an initializer.", YieldBindingIdentifier: "Can not use 'yield' as identifier inside a generator.", YieldInParameter: "Yield expression is not allowed in formal parameters.", - YieldNotInGeneratorFunction: "'yield' is only allowed within generator functions.", ZeroDigitNumericSeparator: "Numeric separator can not be used after leading 0." }; var StrictModeErrors = { @@ -307,14 +309,8 @@ var StrictModeErrors = { StrictOctalLiteral: "Legacy octal literals are not allowed in strict mode.", StrictWith: "'with' in strict mode." }; -var ParseExpressionErrors = { - ParseExpressionEmptyInput: "Unexpected parseExpression() input: The input is empty or contains only comments.", - ParseExpressionExpectsEOF: ({ - unexpected - }) => `Unexpected parseExpression() input: The input should contain exactly one expression, but the first expression is followed by the unexpected character \`${String.fromCodePoint(unexpected)}\`.` -}; const UnparenthesizedPipeBodyDescriptions = new Set(["ArrowFunctionExpression", "AssignmentExpression", "ConditionalExpression", "YieldExpression"]); -var PipelineOperatorErrors = Object.assign({ +var PipelineOperatorErrors = { PipeBodyIsTighter: "Unexpected yield after pipeline body; any yield expression acting as Hack-style pipe body must be parenthesized due to its loose operator precedence.", PipeTopicRequiresHackPipes: 'Topic reference is used, but the pipelineOperator plugin was not passed a "proposal": "hack" or "smart" option.', PipeTopicUnbound: "Topic reference is unbound; it must be inside a pipe body.", @@ -326,15 +322,14 @@ var PipelineOperatorErrors = Object.assign({ type }) => `Hack-style pipe body cannot be an unparenthesized ${toNodeDescription({ type - })}; please wrap it in parentheses.` -}, { + })}; please wrap it in parentheses.`, PipelineBodyNoArrow: 'Unexpected arrow "=>" after pipeline body; arrow function in pipeline body must be parenthesized.', PipelineBodySequenceExpression: "Pipeline body may not be a comma-separated sequence expression.", PipelineHeadSequenceExpression: "Pipeline head should not be a comma-separated sequence expression.", PipelineTopicUnused: "Pipeline is in topic style but does not use topic reference.", PrimaryTopicNotAllowed: "Topic reference was used in a lexical context without topic binding.", PrimaryTopicRequiresSmartPipeline: 'Topic reference is used, but the pipelineOperator plugin was not passed a "proposal": "hack" or "smart" option.' -}); +}; const _excluded = ["message"]; function defineHidden(obj, key, value) { Object.defineProperty(obj, key, { @@ -427,67 +422,7 @@ function ParseErrorEnum(argument, syntaxPlugin) { } return ParseErrorConstructors; } -const Errors = Object.assign({}, ParseErrorEnum(ModuleErrors), ParseErrorEnum(StandardErrors), ParseErrorEnum(StrictModeErrors), ParseErrorEnum(ParseExpressionErrors), ParseErrorEnum`pipelineOperator`(PipelineOperatorErrors)); -function createDefaultOptions() { - return { - sourceType: "script", - sourceFilename: undefined, - startIndex: 0, - startColumn: 0, - startLine: 1, - allowAwaitOutsideFunction: false, - allowReturnOutsideFunction: false, - allowNewTargetOutsideFunction: false, - allowImportExportEverywhere: false, - allowSuperOutsideMethod: false, - allowUndeclaredExports: false, - allowYieldOutsideFunction: false, - plugins: [], - strictMode: null, - ranges: false, - tokens: false, - createImportExpressions: false, - createParenthesizedExpressions: false, - errorRecovery: false, - attachComment: true, - annexB: true - }; -} -function getOptions(opts) { - const options = createDefaultOptions(); - if (opts == null) { - return options; - } - if (opts.annexB != null && opts.annexB !== false) { - throw new Error("The `annexB` option can only be set to `false`."); - } - for (const key of Object.keys(options)) { - if (opts[key] != null) options[key] = opts[key]; - } - if (options.startLine === 1) { - if (opts.startIndex == null && options.startColumn > 0) { - options.startIndex = options.startColumn; - } else if (opts.startColumn == null && options.startIndex > 0) { - options.startColumn = options.startIndex; - } - } else if (opts.startColumn == null || opts.startIndex == null) { - if (opts.startIndex != null) { - throw new Error("With a `startLine > 1` you must also specify `startIndex` and `startColumn`."); - } - } - if (options.sourceType === "commonjs") { - if (opts.allowAwaitOutsideFunction != null) { - throw new Error("The `allowAwaitOutsideFunction` option cannot be used with `sourceType: 'commonjs'`."); - } - if (opts.allowReturnOutsideFunction != null) { - throw new Error("`sourceType: 'commonjs'` implies `allowReturnOutsideFunction: true`, please remove the `allowReturnOutsideFunction` option or use `sourceType: 'script'`."); - } - if (opts.allowNewTargetOutsideFunction != null) { - throw new Error("`sourceType: 'commonjs'` implies `allowNewTargetOutsideFunction: true`, please remove the `allowNewTargetOutsideFunction` option or use `sourceType: 'script'`."); - } - } - return options; -} +const Errors = Object.assign({}, ParseErrorEnum(ModuleErrors), ParseErrorEnum(StandardErrors), ParseErrorEnum(StrictModeErrors), ParseErrorEnum`pipelineOperator`(PipelineOperatorErrors)); const { defineProperty } = Object; @@ -507,7 +442,7 @@ function toESTreeLocation(node) { var estree = superClass => class ESTreeParserMixin extends superClass { parse() { const file = toESTreeLocation(super.parse()); - if (this.optionFlags & 256) { + if (this.options.tokens) { file.tokens = file.tokens.map(toESTreeLocation); } return file; @@ -559,43 +494,19 @@ var estree = superClass => class ESTreeParserMixin extends superClass { parseBooleanLiteral(value) { return this.estreeParseLiteral(value); } - estreeParseChainExpression(node, endLoc) { - const chain = this.startNodeAtNode(node); - chain.expression = node; - return this.finishNodeAt(chain, "ChainExpression", endLoc); - } directiveToStmt(directive) { const expression = directive.value; delete directive.value; - this.castNodeTo(expression, "Literal"); + expression.type = "Literal"; expression.raw = expression.extra.raw; expression.value = expression.extra.expressionValue; - const stmt = this.castNodeTo(directive, "ExpressionStatement"); + const stmt = directive; + stmt.type = "ExpressionStatement"; stmt.expression = expression; stmt.directive = expression.extra.rawValue; delete expression.extra; return stmt; } - fillOptionalPropertiesForTSESLint(node) {} - cloneEstreeStringLiteral(node) { - const { - start, - end, - loc, - range, - raw, - value - } = node; - const cloned = Object.create(node.constructor.prototype); - cloned.type = "Literal"; - cloned.start = start; - cloned.end = end; - cloned.loc = loc; - cloned.range = range; - cloned.raw = raw; - cloned.value = value; - return cloned; - } initFunction(node, isAsync) { super.initFunction(node, isAsync); node.expression = false; @@ -620,6 +531,14 @@ var estree = superClass => class ESTreeParserMixin extends superClass { node.body = directiveStatements.concat(node.body); delete node.directives; } + pushClassMethod(classBody, method, isGenerator, isAsync, isConstructor, allowsDirectSuper) { + this.parseMethod(method, isGenerator, isAsync, isConstructor, allowsDirectSuper, "ClassMethod", true); + if (method.typeParameters) { + method.value.typeParameters = method.typeParameters; + delete method.typeParameters; + } + classBody.body.push(method); + } parsePrivateName() { const node = super.parsePrivateName(); { @@ -634,7 +553,8 @@ var estree = superClass => class ESTreeParserMixin extends superClass { node = node; delete node.id; node.name = name; - return this.castNodeTo(node, "PrivateIdentifier"); + node.type = "PrivateIdentifier"; + return node; } isPrivateName(node) { { @@ -666,29 +586,13 @@ var estree = superClass => class ESTreeParserMixin extends superClass { let funcNode = this.startNode(); funcNode.kind = node.kind; funcNode = super.parseMethod(funcNode, isGenerator, isAsync, isConstructor, allowDirectSuper, type, inClassScope); + funcNode.type = "FunctionExpression"; delete funcNode.kind; - const { - typeParameters - } = node; - if (typeParameters) { - delete node.typeParameters; - funcNode.typeParameters = typeParameters; - this.resetStartLocationFromNode(funcNode, typeParameters); - } - const valueNode = this.castNodeTo(funcNode, "FunctionExpression"); - node.value = valueNode; + node.value = funcNode; if (type === "ClassPrivateMethod") { node.computed = false; } - if (type === "ObjectMethod") { - if (node.kind === "method") { - node.kind = "init"; - } - node.shorthand = false; - return this.finishNode(node, "Property"); - } else { - return this.finishNode(node, "MethodDefinition"); - } + return this.finishNode(node, "MethodDefinition"); } nameIsConstructor(key) { if (key.type === "Literal") return key.value === "constructor"; @@ -701,9 +605,7 @@ var estree = superClass => class ESTreeParserMixin extends superClass { return propertyNode; } } - { - this.castNodeTo(propertyNode, "PropertyDefinition"); - } + propertyNode.type = "PropertyDefinition"; return propertyNode; } parseClassPrivateProperty(...args) { @@ -713,39 +615,29 @@ var estree = superClass => class ESTreeParserMixin extends superClass { return propertyNode; } } - { - this.castNodeTo(propertyNode, "PropertyDefinition"); - } + propertyNode.type = "PropertyDefinition"; propertyNode.computed = false; return propertyNode; } - parseClassAccessorProperty(node) { - const accessorPropertyNode = super.parseClassAccessorProperty(node); - { - if (!this.getPluginOption("estree", "classFeatures")) { - return accessorPropertyNode; + parseObjectMethod(prop, isGenerator, isAsync, isPattern, isAccessor) { + const node = super.parseObjectMethod(prop, isGenerator, isAsync, isPattern, isAccessor); + if (node) { + node.type = "Property"; + if (node.kind === "method") { + node.kind = "init"; } + node.shorthand = false; } - if (accessorPropertyNode.abstract && this.hasPlugin("typescript")) { - delete accessorPropertyNode.abstract; - this.castNodeTo(accessorPropertyNode, "TSAbstractAccessorProperty"); - } else { - this.castNodeTo(accessorPropertyNode, "AccessorProperty"); - } - return accessorPropertyNode; + return node; } parseObjectProperty(prop, startLoc, isPattern, refExpressionErrors) { const node = super.parseObjectProperty(prop, startLoc, isPattern, refExpressionErrors); if (node) { node.kind = "init"; - this.castNodeTo(node, "Property"); + node.type = "Property"; } return node; } - finishObjectProperty(node) { - node.kind = "init"; - return this.finishNode(node, "Property"); - } isValidLVal(type, isUnparenthesizedInAssign, binding) { return type === "Property" ? "value" : super.isValidLVal(type, isUnparenthesizedInAssign, binding); } @@ -781,17 +673,15 @@ var estree = superClass => class ESTreeParserMixin extends superClass { finishCallExpression(unfinished, optional) { const node = super.finishCallExpression(unfinished, optional); if (node.callee.type === "Import") { - var _ref, _ref2; - this.castNodeTo(node, "ImportExpression"); + node.type = "ImportExpression"; node.source = node.arguments[0]; - node.options = (_ref = node.arguments[1]) != null ? _ref : null; - node.attributes = (_ref2 = node.arguments[1]) != null ? _ref2 : null; + if (this.hasPlugin("importAttributes") || this.hasPlugin("importAssertions")) { + var _ref, _ref2; + node.options = (_ref = node.arguments[1]) != null ? _ref : null; + node.attributes = (_ref2 = node.arguments[1]) != null ? _ref2 : null; + } delete node.arguments; delete node.callee; - } else if (node.type === "OptionalCallExpression") { - this.castNodeTo(node, "CallExpression"); - } else { - node.optional = false; } return node; } @@ -810,7 +700,7 @@ var estree = superClass => class ESTreeParserMixin extends superClass { break; case "ExportNamedDeclaration": if (node.specifiers.length === 1 && node.specifiers[0].type === "ExportNamespaceSpecifier") { - this.castNodeTo(node, "ExportAllDeclaration"); + node.type = "ExportAllDeclaration"; node.exported = node.specifiers[0].exported; delete node.specifiers; } @@ -828,18 +718,18 @@ var estree = superClass => class ESTreeParserMixin extends superClass { } return node; } - stopParseSubscript(base, state) { - const node = super.stopParseSubscript(base, state); + parseSubscript(base, startLoc, noCalls, state) { + const node = super.parseSubscript(base, startLoc, noCalls, state); if (state.optionalChainMember) { - return this.estreeParseChainExpression(node, base.loc.end); - } - return node; - } - parseMember(base, startLoc, state, computed, optional) { - const node = super.parseMember(base, startLoc, state, computed, optional); - if (node.type === "OptionalMemberExpression") { - this.castNodeTo(node, "MemberExpression"); - } else { + if (node.type === "OptionalMemberExpression" || node.type === "OptionalCallExpression") { + node.type = node.type.substring(8); + } + if (state.stop) { + const chain = this.startNodeAtNode(node); + chain.expression = node; + return this.finishNode(chain, "ChainExpression"); + } + } else if (node.type === "MemberExpression" || node.type === "CallExpression") { node.optional = false; } return node; @@ -862,30 +752,9 @@ var estree = superClass => class ESTreeParserMixin extends superClass { isObjectMethod(node) { return node.type === "Property" && (node.method || node.kind === "get" || node.kind === "set"); } - castNodeTo(node, type) { - const result = super.castNodeTo(node, type); - this.fillOptionalPropertiesForTSESLint(result); - return result; - } - cloneIdentifier(node) { - const cloned = super.cloneIdentifier(node); - this.fillOptionalPropertiesForTSESLint(cloned); - return cloned; - } - cloneStringLiteral(node) { - if (node.type === "Literal") { - return this.cloneEstreeStringLiteral(node); - } - return super.cloneStringLiteral(node); - } finishNodeAt(node, type, endLoc) { return toESTreeLocation(super.finishNodeAt(node, type, endLoc)); } - finishNode(node, type) { - const result = super.finishNode(node, type); - this.fillOptionalPropertiesForTSESLint(result); - return result; - } resetStartLocation(node, startLoc) { super.resetStartLocation(node, startLoc); toESTreeLocation(node); @@ -1352,9 +1221,6 @@ const tt = { name: createToken("name", { startsExpr }), - placeholder: createToken("%%", { - startsExpr - }), string: createToken("string", { startsExpr }), @@ -1376,24 +1242,27 @@ const tt = { eof: createToken("eof"), jsxName: createToken("jsxName"), jsxText: createToken("jsxText", { - beforeExpr + beforeExpr: true }), jsxTagStart: createToken("jsxTagStart", { - startsExpr + startsExpr: true }), - jsxTagEnd: createToken("jsxTagEnd") + jsxTagEnd: createToken("jsxTagEnd"), + placeholder: createToken("%%", { + startsExpr: true + }) }; function tokenIsIdentifier(token) { - return token >= 93 && token <= 133; + return token >= 93 && token <= 132; } function tokenKeywordOrIdentifierIsKeyword(token) { return token <= 92; } function tokenIsKeywordOrIdentifier(token) { - return token >= 58 && token <= 133; + return token >= 58 && token <= 132; } function tokenIsLiteralPropertyName(token) { - return token >= 58 && token <= 137; + return token >= 58 && token <= 136; } function tokenComesBeforeExpression(token) { return tokenBeforeExprs[token]; @@ -1457,17 +1326,17 @@ function getExportedToken(token) { context.push(types.template); } }; - tokenTypes[143].updateContext = context => { + tokenTypes[142].updateContext = context => { context.push(types.j_expr, types.j_oTag); }; } -let nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088e\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c8a\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7cd\ua7d0\ua7d1\ua7d3\ua7d5-\ua7dc\ua7f2-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; -let nonASCIIidentifierChars = "\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0897-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\u30fb\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f\uff65"; +let nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088e\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ca\ua7d0\ua7d1\ua7d3\ua7d5-\ua7d9\ua7f2-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; +let nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0898-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\u30fb\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f\uff65"; const nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]"); const nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]"); nonASCIIidentifierStartChars = nonASCIIidentifierChars = null; -const astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 4, 51, 13, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 39, 27, 10, 22, 251, 41, 7, 1, 17, 2, 60, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 31, 9, 2, 0, 3, 0, 2, 37, 2, 0, 26, 0, 2, 0, 45, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 200, 32, 32, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 26, 3994, 6, 582, 6842, 29, 1763, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 433, 44, 212, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 42, 9, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 229, 29, 3, 0, 496, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 4191]; -const astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 7, 9, 32, 4, 318, 1, 80, 3, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 68, 8, 2, 0, 3, 0, 2, 3, 2, 4, 2, 0, 15, 1, 83, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 7, 19, 58, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 343, 9, 54, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 10, 5350, 0, 7, 14, 11465, 27, 2343, 9, 87, 9, 39, 4, 60, 6, 26, 9, 535, 9, 470, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4178, 9, 519, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 245, 1, 2, 9, 726, 6, 110, 6, 6, 9, 4759, 9, 787719, 239]; +const astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 68, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 4026, 582, 8634, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 757, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 4191]; +const astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 370, 1, 81, 2, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 193, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 84, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 406, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 9, 5351, 0, 7, 14, 13835, 9, 87, 9, 39, 4, 60, 6, 26, 9, 1014, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4706, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 983, 6, 110, 6, 6, 9, 4759, 9, 787719, 239]; function isInAstralSet(code, set) { let pos = 0x10000; for (let i = 0, length = set.length; i < length; i += 2) { @@ -1559,9 +1428,6 @@ class ScopeHandler { get allowDirectSuper() { return (this.currentThisScopeFlags() & 32) > 0; } - get allowNewTarget() { - return (this.currentThisScopeFlags() & 512) > 0; - } get inClass() { return (this.currentThisScopeFlags() & 64) > 0; } @@ -1577,7 +1443,7 @@ class ScopeHandler { if (flags & 128) { return true; } - if (flags & (1667 | 64)) { + if (flags & (387 | 64)) { return false; } } @@ -1585,9 +1451,6 @@ class ScopeHandler { get inNonArrowFunction() { return (this.currentThisScopeFlags() & 2) > 0; } - get inBareCaseStatement() { - return (this.currentScope().flags & 256) > 0; - } get treatFunctionsAsVar() { return this.treatFunctionsAsVarInScope(this.currentScope()); } @@ -1627,7 +1490,7 @@ class ScopeHandler { this.checkRedeclarationInScope(scope, name, bindingType, loc); scope.names.set(name, (scope.names.get(name) || 0) | 1); this.maybeExportDefined(scope, name); - if (scope.flags & 1667) break; + if (scope.flags & 387) break; } } if (this.parser.inModule && scope.flags & 1) { @@ -1674,7 +1537,7 @@ class ScopeHandler { const { flags } = this.scopeStack[i]; - if (flags & 1667) { + if (flags & 387) { return flags; } } @@ -1684,7 +1547,7 @@ class ScopeHandler { const { flags } = this.scopeStack[i]; - if (flags & (1667 | 64) && !(flags & 4)) { + if (flags & (387 | 64) && !(flags & 4)) { return flags; } } @@ -1724,5473 +1587,5402 @@ class FlowScopeHandler extends ScopeHandler { } } } -const reservedTypes = new Set(["_", "any", "bool", "boolean", "empty", "extends", "false", "interface", "mixed", "null", "number", "static", "string", "true", "typeof", "void"]); -const FlowErrors = ParseErrorEnum`flow`({ - AmbiguousConditionalArrow: "Ambiguous expression: wrap the arrow functions in parentheses to disambiguate.", - AmbiguousDeclareModuleKind: "Found both `declare module.exports` and `declare export` in the same module. Modules can only have 1 since they are either an ES module or they are a CommonJS module.", - AssignReservedType: ({ - reservedType - }) => `Cannot overwrite reserved type ${reservedType}.`, - DeclareClassElement: "The `declare` modifier can only appear on class fields.", - DeclareClassFieldInitializer: "Initializers are not allowed in fields with the `declare` modifier.", - DuplicateDeclareModuleExports: "Duplicate `declare module.exports` statement.", - EnumBooleanMemberNotInitialized: ({ - memberName, - enumName - }) => `Boolean enum members need to be initialized. Use either \`${memberName} = true,\` or \`${memberName} = false,\` in enum \`${enumName}\`.`, - EnumDuplicateMemberName: ({ - memberName, - enumName - }) => `Enum member names need to be unique, but the name \`${memberName}\` has already been used before in enum \`${enumName}\`.`, - EnumInconsistentMemberValues: ({ - enumName - }) => `Enum \`${enumName}\` has inconsistent member initializers. Either use no initializers, or consistently use literals (either booleans, numbers, or strings) for all member initializers.`, - EnumInvalidExplicitType: ({ - invalidEnumType, - enumName - }) => `Enum type \`${invalidEnumType}\` is not valid. Use one of \`boolean\`, \`number\`, \`string\`, or \`symbol\` in enum \`${enumName}\`.`, - EnumInvalidExplicitTypeUnknownSupplied: ({ - enumName - }) => `Supplied enum type is not valid. Use one of \`boolean\`, \`number\`, \`string\`, or \`symbol\` in enum \`${enumName}\`.`, - EnumInvalidMemberInitializerPrimaryType: ({ - enumName, - memberName, - explicitType - }) => `Enum \`${enumName}\` has type \`${explicitType}\`, so the initializer of \`${memberName}\` needs to be a ${explicitType} literal.`, - EnumInvalidMemberInitializerSymbolType: ({ - enumName, - memberName - }) => `Symbol enum members cannot be initialized. Use \`${memberName},\` in enum \`${enumName}\`.`, - EnumInvalidMemberInitializerUnknownType: ({ - enumName, - memberName - }) => `The enum member initializer for \`${memberName}\` needs to be a literal (either a boolean, number, or string) in enum \`${enumName}\`.`, - EnumInvalidMemberName: ({ - enumName, - memberName, - suggestion - }) => `Enum member names cannot start with lowercase 'a' through 'z'. Instead of using \`${memberName}\`, consider using \`${suggestion}\`, in enum \`${enumName}\`.`, - EnumNumberMemberNotInitialized: ({ - enumName, - memberName - }) => `Number enum members need to be initialized, e.g. \`${memberName} = 1\` in enum \`${enumName}\`.`, - EnumStringMemberInconsistentlyInitialized: ({ - enumName - }) => `String enum members need to consistently either all use initializers, or use no initializers, in enum \`${enumName}\`.`, - GetterMayNotHaveThisParam: "A getter cannot have a `this` parameter.", - ImportReflectionHasImportType: "An `import module` declaration can not use `type` or `typeof` keyword.", - ImportTypeShorthandOnlyInPureImport: "The `type` and `typeof` keywords on named imports can only be used on regular `import` statements. It cannot be used with `import type` or `import typeof` statements.", - InexactInsideExact: "Explicit inexact syntax cannot appear inside an explicit exact object type.", - InexactInsideNonObject: "Explicit inexact syntax cannot appear in class or interface definitions.", - InexactVariance: "Explicit inexact syntax cannot have variance.", - InvalidNonTypeImportInDeclareModule: "Imports within a `declare module` body must always be `import type` or `import typeof`.", - MissingTypeParamDefault: "Type parameter declaration needs a default, since a preceding type parameter declaration has a default.", - NestedDeclareModule: "`declare module` cannot be used inside another `declare module`.", - NestedFlowComment: "Cannot have a flow comment inside another flow comment.", - PatternIsOptional: Object.assign({ - message: "A binding pattern parameter cannot be optional in an implementation signature." - }, { - reasonCode: "OptionalBindingPattern" - }), - SetterMayNotHaveThisParam: "A setter cannot have a `this` parameter.", - SpreadVariance: "Spread properties cannot have variance.", - ThisParamAnnotationRequired: "A type annotation is required for the `this` parameter.", - ThisParamBannedInConstructor: "Constructors cannot have a `this` parameter; constructors don't bind `this` like other functions.", - ThisParamMayNotBeOptional: "The `this` parameter cannot be optional.", - ThisParamMustBeFirst: "The `this` parameter must be the first function parameter.", - ThisParamNoDefault: "The `this` parameter may not have a default value.", - TypeBeforeInitializer: "Type annotations must come before default assignments, e.g. instead of `age = 25: number` use `age: number = 25`.", - TypeCastInPattern: "The type cast expression is expected to be wrapped with parenthesis.", - UnexpectedExplicitInexactInObject: "Explicit inexact syntax must appear at the end of an inexact object.", - UnexpectedReservedType: ({ - reservedType - }) => `Unexpected reserved type ${reservedType}.`, - UnexpectedReservedUnderscore: "`_` is only allowed as a type argument to call or new.", - UnexpectedSpaceBetweenModuloChecks: "Spaces between `%` and `checks` are not allowed here.", - UnexpectedSpreadType: "Spread operator cannot appear in class or interface definitions.", - UnexpectedSubtractionOperand: 'Unexpected token, expected "number" or "bigint".', - UnexpectedTokenAfterTypeParameter: "Expected an arrow function after this type parameter declaration.", - UnexpectedTypeParameterBeforeAsyncArrowFunction: "Type parameters must come after the async keyword, e.g. instead of ` async () => {}`, use `async () => {}`.", - UnsupportedDeclareExportKind: ({ - unsupportedExportKind, - suggestion - }) => `\`declare export ${unsupportedExportKind}\` is not supported. Use \`${suggestion}\` instead.`, - UnsupportedStatementInDeclareModule: "Only declares and type imports are allowed inside declare module.", - UnterminatedFlowComment: "Unterminated flow-comment." -}); -function isEsModuleType(bodyElement) { - return bodyElement.type === "DeclareExportAllDeclaration" || bodyElement.type === "DeclareExportDeclaration" && (!bodyElement.declaration || bodyElement.declaration.type !== "TypeAlias" && bodyElement.declaration.type !== "InterfaceDeclaration"); -} -function hasTypeImportKind(node) { - return node.importKind === "type" || node.importKind === "typeof"; -} -const exportSuggestions = { - const: "declare export var", - let: "declare export var", - type: "export type", - interface: "export interface" -}; -function partition(list, test) { - const list1 = []; - const list2 = []; - for (let i = 0; i < list.length; i++) { - (test(list[i], i, list) ? list1 : list2).push(list[i]); - } - return [list1, list2]; -} -const FLOW_PRAGMA_REGEX = /\*?\s*@((?:no)?flow)\b/; -var flow = superClass => class FlowParserMixin extends superClass { - constructor(...args) { - super(...args); - this.flowPragma = undefined; - } - getScopeHandler() { - return FlowScopeHandler; - } - shouldParseTypes() { - return this.getPluginOption("flow", "all") || this.flowPragma === "flow"; +class BaseParser { + constructor() { + this.sawUnambiguousESM = false; + this.ambiguousScriptDifferentAst = false; } - finishToken(type, val) { - if (type !== 134 && type !== 13 && type !== 28) { - if (this.flowPragma === undefined) { - this.flowPragma = null; + hasPlugin(pluginConfig) { + if (typeof pluginConfig === "string") { + return this.plugins.has(pluginConfig); + } else { + const [pluginName, pluginOptions] = pluginConfig; + if (!this.hasPlugin(pluginName)) { + return false; } - } - super.finishToken(type, val); - } - addComment(comment) { - if (this.flowPragma === undefined) { - const matches = FLOW_PRAGMA_REGEX.exec(comment.value); - if (!matches) ;else if (matches[1] === "flow") { - this.flowPragma = "flow"; - } else if (matches[1] === "noflow") { - this.flowPragma = "noflow"; - } else { - throw new Error("Unexpected flow pragma"); + const actualOptions = this.plugins.get(pluginName); + for (const key of Object.keys(pluginOptions)) { + if ((actualOptions == null ? void 0 : actualOptions[key]) !== pluginOptions[key]) { + return false; + } } + return true; } - super.addComment(comment); } - flowParseTypeInitialiser(tok) { - const oldInType = this.state.inType; - this.state.inType = true; - this.expect(tok || 14); - const type = this.flowParseType(); - this.state.inType = oldInType; - return type; + getPluginOption(plugin, name) { + var _this$plugins$get; + return (_this$plugins$get = this.plugins.get(plugin)) == null ? void 0 : _this$plugins$get[name]; } - flowParsePredicate() { - const node = this.startNode(); - const moduloLoc = this.state.startLoc; - this.next(); - this.expectContextual(110); - if (this.state.lastTokStartLoc.index > moduloLoc.index + 1) { - this.raise(FlowErrors.UnexpectedSpaceBetweenModuloChecks, moduloLoc); - } - if (this.eat(10)) { - node.value = super.parseExpression(); - this.expect(11); - return this.finishNode(node, "DeclaredPredicate"); - } else { - return this.finishNode(node, "InferredPredicate"); - } +} +function setTrailingComments(node, comments) { + if (node.trailingComments === undefined) { + node.trailingComments = comments; + } else { + node.trailingComments.unshift(...comments); } - flowParseTypeAndPredicateInitialiser() { - const oldInType = this.state.inType; - this.state.inType = true; - this.expect(14); - let type = null; - let predicate = null; - if (this.match(54)) { - this.state.inType = oldInType; - predicate = this.flowParsePredicate(); - } else { - type = this.flowParseType(); - this.state.inType = oldInType; - if (this.match(54)) { - predicate = this.flowParsePredicate(); - } - } - return [type, predicate]; +} +function setLeadingComments(node, comments) { + if (node.leadingComments === undefined) { + node.leadingComments = comments; + } else { + node.leadingComments.unshift(...comments); } - flowParseDeclareClass(node) { - this.next(); - this.flowParseInterfaceish(node, true); - return this.finishNode(node, "DeclareClass"); +} +function setInnerComments(node, comments) { + if (node.innerComments === undefined) { + node.innerComments = comments; + } else { + node.innerComments.unshift(...comments); } - flowParseDeclareFunction(node) { - this.next(); - const id = node.id = this.parseIdentifier(); - const typeNode = this.startNode(); - const typeContainer = this.startNode(); - if (this.match(47)) { - typeNode.typeParameters = this.flowParseTypeParameterDeclaration(); - } else { - typeNode.typeParameters = null; +} +function adjustInnerComments(node, elements, commentWS) { + let lastElement = null; + let i = elements.length; + while (lastElement === null && i > 0) { + lastElement = elements[--i]; + } + if (lastElement === null || lastElement.start > commentWS.start) { + setInnerComments(node, commentWS.comments); + } else { + setTrailingComments(lastElement, commentWS.comments); + } +} +class CommentsParser extends BaseParser { + addComment(comment) { + if (this.filename) comment.loc.filename = this.filename; + const { + commentsLen + } = this.state; + if (this.comments.length !== commentsLen) { + this.comments.length = commentsLen; } - this.expect(10); - const tmp = this.flowParseFunctionTypeParams(); - typeNode.params = tmp.params; - typeNode.rest = tmp.rest; - typeNode.this = tmp._this; - this.expect(11); - [typeNode.returnType, node.predicate] = this.flowParseTypeAndPredicateInitialiser(); - typeContainer.typeAnnotation = this.finishNode(typeNode, "FunctionTypeAnnotation"); - id.typeAnnotation = this.finishNode(typeContainer, "TypeAnnotation"); - this.resetEndLocation(id); - this.semicolon(); - this.scope.declareName(node.id.name, 2048, node.id.loc.start); - return this.finishNode(node, "DeclareFunction"); + this.comments.push(comment); + this.state.commentsLen++; } - flowParseDeclare(node, insideModule) { - if (this.match(80)) { - return this.flowParseDeclareClass(node); - } else if (this.match(68)) { - return this.flowParseDeclareFunction(node); - } else if (this.match(74)) { - return this.flowParseDeclareVariable(node); - } else if (this.eatContextual(127)) { - if (this.match(16)) { - return this.flowParseDeclareModuleExports(node); + processComment(node) { + const { + commentStack + } = this.state; + const commentStackLength = commentStack.length; + if (commentStackLength === 0) return; + let i = commentStackLength - 1; + const lastCommentWS = commentStack[i]; + if (lastCommentWS.start === node.end) { + lastCommentWS.leadingNode = node; + i--; + } + const { + start: nodeStart + } = node; + for (; i >= 0; i--) { + const commentWS = commentStack[i]; + const commentEnd = commentWS.end; + if (commentEnd > nodeStart) { + commentWS.containingNode = node; + this.finalizeComment(commentWS); + commentStack.splice(i, 1); } else { - if (insideModule) { - this.raise(FlowErrors.NestedDeclareModule, this.state.lastTokStartLoc); + if (commentEnd === nodeStart) { + commentWS.trailingNode = node; } - return this.flowParseDeclareModule(node); + break; } - } else if (this.isContextual(130)) { - return this.flowParseDeclareTypeAlias(node); - } else if (this.isContextual(131)) { - return this.flowParseDeclareOpaqueType(node); - } else if (this.isContextual(129)) { - return this.flowParseDeclareInterface(node); - } else if (this.match(82)) { - return this.flowParseDeclareExportDeclaration(node, insideModule); - } else { - this.unexpected(); } } - flowParseDeclareVariable(node) { - this.next(); - node.id = this.flowParseTypeAnnotatableIdentifier(true); - this.scope.declareName(node.id.name, 5, node.id.loc.start); - this.semicolon(); - return this.finishNode(node, "DeclareVariable"); - } - flowParseDeclareModule(node) { - this.scope.enter(0); - if (this.match(134)) { - node.id = super.parseExprAtom(); + finalizeComment(commentWS) { + const { + comments + } = commentWS; + if (commentWS.leadingNode !== null || commentWS.trailingNode !== null) { + if (commentWS.leadingNode !== null) { + setTrailingComments(commentWS.leadingNode, comments); + } + if (commentWS.trailingNode !== null) { + setLeadingComments(commentWS.trailingNode, comments); + } } else { - node.id = this.parseIdentifier(); - } - const bodyNode = node.body = this.startNode(); - const body = bodyNode.body = []; - this.expect(5); - while (!this.match(8)) { - let bodyNode = this.startNode(); - if (this.match(83)) { - this.next(); - if (!this.isContextual(130) && !this.match(87)) { - this.raise(FlowErrors.InvalidNonTypeImportInDeclareModule, this.state.lastTokStartLoc); + const { + containingNode: node, + start: commentStart + } = commentWS; + if (this.input.charCodeAt(commentStart - 1) === 44) { + switch (node.type) { + case "ObjectExpression": + case "ObjectPattern": + case "RecordExpression": + adjustInnerComments(node, node.properties, commentWS); + break; + case "CallExpression": + case "OptionalCallExpression": + adjustInnerComments(node, node.arguments, commentWS); + break; + case "FunctionDeclaration": + case "FunctionExpression": + case "ArrowFunctionExpression": + case "ObjectMethod": + case "ClassMethod": + case "ClassPrivateMethod": + adjustInnerComments(node, node.params, commentWS); + break; + case "ArrayExpression": + case "ArrayPattern": + case "TupleExpression": + adjustInnerComments(node, node.elements, commentWS); + break; + case "ExportNamedDeclaration": + case "ImportDeclaration": + adjustInnerComments(node, node.specifiers, commentWS); + break; + default: + { + setInnerComments(node, comments); + } } - super.parseImport(bodyNode); } else { - this.expectContextual(125, FlowErrors.UnsupportedStatementInDeclareModule); - bodyNode = this.flowParseDeclare(bodyNode, true); + setInnerComments(node, comments); } - body.push(bodyNode); } - this.scope.exit(); - this.expect(8); - this.finishNode(bodyNode, "BlockStatement"); - let kind = null; - let hasModuleExport = false; - body.forEach(bodyElement => { - if (isEsModuleType(bodyElement)) { - if (kind === "CommonJS") { - this.raise(FlowErrors.AmbiguousDeclareModuleKind, bodyElement); - } - kind = "ES"; - } else if (bodyElement.type === "DeclareModuleExports") { - if (hasModuleExport) { - this.raise(FlowErrors.DuplicateDeclareModuleExports, bodyElement); - } - if (kind === "ES") { - this.raise(FlowErrors.AmbiguousDeclareModuleKind, bodyElement); - } - kind = "CommonJS"; - hasModuleExport = true; - } - }); - node.kind = kind || "CommonJS"; - return this.finishNode(node, "DeclareModule"); } - flowParseDeclareExportDeclaration(node, insideModule) { - this.expect(82); - if (this.eat(65)) { - if (this.match(68) || this.match(80)) { - node.declaration = this.flowParseDeclare(this.startNode()); - } else { - node.declaration = this.flowParseType(); - this.semicolon(); - } - node.default = true; - return this.finishNode(node, "DeclareExportDeclaration"); - } else { - if (this.match(75) || this.isLet() || (this.isContextual(130) || this.isContextual(129)) && !insideModule) { - const label = this.state.value; - throw this.raise(FlowErrors.UnsupportedDeclareExportKind, this.state.startLoc, { - unsupportedExportKind: label, - suggestion: exportSuggestions[label] - }); - } - if (this.match(74) || this.match(68) || this.match(80) || this.isContextual(131)) { - node.declaration = this.flowParseDeclare(this.startNode()); - node.default = false; - return this.finishNode(node, "DeclareExportDeclaration"); - } else if (this.match(55) || this.match(5) || this.isContextual(129) || this.isContextual(130) || this.isContextual(131)) { - node = this.parseExport(node, null); - if (node.type === "ExportNamedDeclaration") { - node.default = false; - delete node.exportKind; - return this.castNodeTo(node, "DeclareExportDeclaration"); - } else { - return this.castNodeTo(node, "DeclareExportAllDeclaration"); - } - } + finalizeRemainingComments() { + const { + commentStack + } = this.state; + for (let i = commentStack.length - 1; i >= 0; i--) { + this.finalizeComment(commentStack[i]); } - this.unexpected(); - } - flowParseDeclareModuleExports(node) { - this.next(); - this.expectContextual(111); - node.typeAnnotation = this.flowParseTypeAnnotation(); - this.semicolon(); - return this.finishNode(node, "DeclareModuleExports"); - } - flowParseDeclareTypeAlias(node) { - this.next(); - const finished = this.flowParseTypeAlias(node); - this.castNodeTo(finished, "DeclareTypeAlias"); - return finished; - } - flowParseDeclareOpaqueType(node) { - this.next(); - const finished = this.flowParseOpaqueType(node, true); - this.castNodeTo(finished, "DeclareOpaqueType"); - return finished; - } - flowParseDeclareInterface(node) { - this.next(); - this.flowParseInterfaceish(node, false); - return this.finishNode(node, "DeclareInterface"); + this.state.commentStack = []; } - flowParseInterfaceish(node, isClass) { - node.id = this.flowParseRestrictedIdentifier(!isClass, true); - this.scope.declareName(node.id.name, isClass ? 17 : 8201, node.id.loc.start); - if (this.match(47)) { - node.typeParameters = this.flowParseTypeParameterDeclaration(); - } else { - node.typeParameters = null; - } - node.extends = []; - if (this.eat(81)) { - do { - node.extends.push(this.flowParseInterfaceExtends()); - } while (!isClass && this.eat(12)); + resetPreviousNodeTrailingComments(node) { + const { + commentStack + } = this.state; + const { + length + } = commentStack; + if (length === 0) return; + const commentWS = commentStack[length - 1]; + if (commentWS.leadingNode === node) { + commentWS.leadingNode = null; } - if (isClass) { - node.implements = []; - node.mixins = []; - if (this.eatContextual(117)) { - do { - node.mixins.push(this.flowParseInterfaceExtends()); - } while (this.eat(12)); - } - if (this.eatContextual(113)) { - do { - node.implements.push(this.flowParseInterfaceExtends()); - } while (this.eat(12)); - } + } + resetPreviousIdentifierLeadingComments(node) { + const { + commentStack + } = this.state; + const { + length + } = commentStack; + if (length === 0) return; + if (commentStack[length - 1].trailingNode === node) { + commentStack[length - 1].trailingNode = null; + } else if (length >= 2 && commentStack[length - 2].trailingNode === node) { + commentStack[length - 2].trailingNode = null; } - node.body = this.flowParseObjectType({ - allowStatic: isClass, - allowExact: false, - allowSpread: false, - allowProto: isClass, - allowInexact: false - }); } - flowParseInterfaceExtends() { - const node = this.startNode(); - node.id = this.flowParseQualifiedTypeIdentifier(); - if (this.match(47)) { - node.typeParameters = this.flowParseTypeParameterInstantiation(); - } else { - node.typeParameters = null; + takeSurroundingComments(node, start, end) { + const { + commentStack + } = this.state; + const commentStackLength = commentStack.length; + if (commentStackLength === 0) return; + let i = commentStackLength - 1; + for (; i >= 0; i--) { + const commentWS = commentStack[i]; + const commentEnd = commentWS.end; + const commentStart = commentWS.start; + if (commentStart === end) { + commentWS.leadingNode = node; + } else if (commentEnd === start) { + commentWS.trailingNode = node; + } else if (commentEnd < start) { + break; + } } - return this.finishNode(node, "InterfaceExtends"); } - flowParseInterface(node) { - this.flowParseInterfaceish(node, false); - return this.finishNode(node, "InterfaceDeclaration"); +} +const lineBreak = /\r\n|[\r\n\u2028\u2029]/; +const lineBreakG = new RegExp(lineBreak.source, "g"); +function isNewLine(code) { + switch (code) { + case 10: + case 13: + case 8232: + case 8233: + return true; + default: + return false; } - checkNotUnderscore(word) { - if (word === "_") { - this.raise(FlowErrors.UnexpectedReservedUnderscore, this.state.startLoc); +} +function hasNewLine(input, start, end) { + for (let i = start; i < end; i++) { + if (isNewLine(input.charCodeAt(i))) { + return true; } } - checkReservedType(word, startLoc, declaration) { - if (!reservedTypes.has(word)) return; - this.raise(declaration ? FlowErrors.AssignReservedType : FlowErrors.UnexpectedReservedType, startLoc, { - reservedType: word - }); + return false; +} +const skipWhiteSpace = /(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g; +const skipWhiteSpaceInLine = /(?:[^\S\n\r\u2028\u2029]|\/\/.*|\/\*.*?\*\/)*/g; +function isWhitespace(code) { + switch (code) { + case 0x0009: + case 0x000b: + case 0x000c: + case 32: + case 160: + case 5760: + case 0x2000: + case 0x2001: + case 0x2002: + case 0x2003: + case 0x2004: + case 0x2005: + case 0x2006: + case 0x2007: + case 0x2008: + case 0x2009: + case 0x200a: + case 0x202f: + case 0x205f: + case 0x3000: + case 0xfeff: + return true; + default: + return false; } - flowParseRestrictedIdentifier(liberal, declaration) { - this.checkReservedType(this.state.value, this.state.startLoc, declaration); - return this.parseIdentifier(liberal); +} +class State { + constructor() { + this.flags = 1024; + this.curLine = void 0; + this.lineStart = void 0; + this.startLoc = void 0; + this.endLoc = void 0; + this.errors = []; + this.potentialArrowAt = -1; + this.noArrowAt = []; + this.noArrowParamsConversionAt = []; + this.topicContext = { + maxNumOfResolvableTopics: 0, + maxTopicIndex: null + }; + this.labels = []; + this.commentsLen = 0; + this.commentStack = []; + this.pos = 0; + this.type = 139; + this.value = null; + this.start = 0; + this.end = 0; + this.lastTokEndLoc = null; + this.lastTokStartLoc = null; + this.context = [types.brace]; + this.firstInvalidTemplateEscapePos = null; + this.strictErrors = new Map(); + this.tokensLength = 0; } - flowParseTypeAlias(node) { - node.id = this.flowParseRestrictedIdentifier(false, true); - this.scope.declareName(node.id.name, 8201, node.id.loc.start); - if (this.match(47)) { - node.typeParameters = this.flowParseTypeParameterDeclaration(); - } else { - node.typeParameters = null; - } - node.right = this.flowParseTypeInitialiser(29); - this.semicolon(); - return this.finishNode(node, "TypeAlias"); + get strict() { + return (this.flags & 1) > 0; } - flowParseOpaqueType(node, declare) { - this.expectContextual(130); - node.id = this.flowParseRestrictedIdentifier(true, true); - this.scope.declareName(node.id.name, 8201, node.id.loc.start); - if (this.match(47)) { - node.typeParameters = this.flowParseTypeParameterDeclaration(); - } else { - node.typeParameters = null; - } - node.supertype = null; - if (this.match(14)) { - node.supertype = this.flowParseTypeInitialiser(14); - } - node.impltype = null; - if (!declare) { - node.impltype = this.flowParseTypeInitialiser(29); - } - this.semicolon(); - return this.finishNode(node, "OpaqueType"); + set strict(v) { + if (v) this.flags |= 1;else this.flags &= -2; } - flowParseTypeParameter(requireDefault = false) { - const nodeStartLoc = this.state.startLoc; - const node = this.startNode(); - const variance = this.flowParseVariance(); - const ident = this.flowParseTypeAnnotatableIdentifier(); - node.name = ident.name; - node.variance = variance; - node.bound = ident.typeAnnotation; - if (this.match(29)) { - this.eat(29); - node.default = this.flowParseType(); - } else { - if (requireDefault) { - this.raise(FlowErrors.MissingTypeParamDefault, nodeStartLoc); - } - } - return this.finishNode(node, "TypeParameter"); + init({ + strictMode, + sourceType, + startLine, + startColumn + }) { + this.strict = strictMode === false ? false : strictMode === true ? true : sourceType === "module"; + this.curLine = startLine; + this.lineStart = -startColumn; + this.startLoc = this.endLoc = new Position(startLine, startColumn, 0); } - flowParseTypeParameterDeclaration() { - const oldInType = this.state.inType; - const node = this.startNode(); - node.params = []; - this.state.inType = true; - if (this.match(47) || this.match(143)) { - this.next(); - } else { - this.unexpected(); - } - let defaultRequired = false; - do { - const typeParameter = this.flowParseTypeParameter(defaultRequired); - node.params.push(typeParameter); - if (typeParameter.default) { - defaultRequired = true; - } - if (!this.match(48)) { - this.expect(12); - } - } while (!this.match(48)); - this.expect(48); - this.state.inType = oldInType; - return this.finishNode(node, "TypeParameterDeclaration"); + get maybeInArrowParameters() { + return (this.flags & 2) > 0; } - flowInTopLevelContext(cb) { - if (this.curContext() !== types.brace) { - const oldContext = this.state.context; - this.state.context = [oldContext[0]]; - try { - return cb(); - } finally { - this.state.context = oldContext; - } - } else { - return cb(); - } + set maybeInArrowParameters(v) { + if (v) this.flags |= 2;else this.flags &= -3; } - flowParseTypeParameterInstantiationInExpression() { - if (this.reScan_lt() !== 47) return; - return this.flowParseTypeParameterInstantiation(); + get inType() { + return (this.flags & 4) > 0; } - flowParseTypeParameterInstantiation() { - const node = this.startNode(); - const oldInType = this.state.inType; - this.state.inType = true; - node.params = []; - this.flowInTopLevelContext(() => { - this.expect(47); - const oldNoAnonFunctionType = this.state.noAnonFunctionType; - this.state.noAnonFunctionType = false; - while (!this.match(48)) { - node.params.push(this.flowParseType()); - if (!this.match(48)) { - this.expect(12); - } - } - this.state.noAnonFunctionType = oldNoAnonFunctionType; - }); - this.state.inType = oldInType; - if (!this.state.inType && this.curContext() === types.brace) { - this.reScan_lt_gt(); - } - this.expect(48); - return this.finishNode(node, "TypeParameterInstantiation"); + set inType(v) { + if (v) this.flags |= 4;else this.flags &= -5; } - flowParseTypeParameterInstantiationCallOrNew() { - if (this.reScan_lt() !== 47) return; - const node = this.startNode(); - const oldInType = this.state.inType; - node.params = []; - this.state.inType = true; - this.expect(47); - while (!this.match(48)) { - node.params.push(this.flowParseTypeOrImplicitInstantiation()); - if (!this.match(48)) { - this.expect(12); - } - } - this.expect(48); - this.state.inType = oldInType; - return this.finishNode(node, "TypeParameterInstantiation"); + get noAnonFunctionType() { + return (this.flags & 8) > 0; } - flowParseInterfaceType() { - const node = this.startNode(); - this.expectContextual(129); - node.extends = []; - if (this.eat(81)) { - do { - node.extends.push(this.flowParseInterfaceExtends()); - } while (this.eat(12)); - } - node.body = this.flowParseObjectType({ - allowStatic: false, - allowExact: false, - allowSpread: false, - allowProto: false, - allowInexact: false - }); - return this.finishNode(node, "InterfaceTypeAnnotation"); + set noAnonFunctionType(v) { + if (v) this.flags |= 8;else this.flags &= -9; } - flowParseObjectPropertyKey() { - return this.match(135) || this.match(134) ? super.parseExprAtom() : this.parseIdentifier(true); + get hasFlowComment() { + return (this.flags & 16) > 0; } - flowParseObjectTypeIndexer(node, isStatic, variance) { - node.static = isStatic; - if (this.lookahead().type === 14) { - node.id = this.flowParseObjectPropertyKey(); - node.key = this.flowParseTypeInitialiser(); - } else { - node.id = null; - node.key = this.flowParseType(); - } - this.expect(3); - node.value = this.flowParseTypeInitialiser(); - node.variance = variance; - return this.finishNode(node, "ObjectTypeIndexer"); + set hasFlowComment(v) { + if (v) this.flags |= 16;else this.flags &= -17; } - flowParseObjectTypeInternalSlot(node, isStatic) { - node.static = isStatic; - node.id = this.flowParseObjectPropertyKey(); - this.expect(3); - this.expect(3); - if (this.match(47) || this.match(10)) { - node.method = true; - node.optional = false; - node.value = this.flowParseObjectTypeMethodish(this.startNodeAt(node.loc.start)); - } else { - node.method = false; - if (this.eat(17)) { - node.optional = true; - } - node.value = this.flowParseTypeInitialiser(); - } - return this.finishNode(node, "ObjectTypeInternalSlot"); + get isAmbientContext() { + return (this.flags & 32) > 0; } - flowParseObjectTypeMethodish(node) { - node.params = []; - node.rest = null; - node.typeParameters = null; - node.this = null; - if (this.match(47)) { - node.typeParameters = this.flowParseTypeParameterDeclaration(); - } - this.expect(10); - if (this.match(78)) { - node.this = this.flowParseFunctionTypeParam(true); - node.this.name = null; - if (!this.match(11)) { - this.expect(12); - } - } - while (!this.match(11) && !this.match(21)) { - node.params.push(this.flowParseFunctionTypeParam(false)); - if (!this.match(11)) { - this.expect(12); - } - } - if (this.eat(21)) { - node.rest = this.flowParseFunctionTypeParam(false); - } - this.expect(11); - node.returnType = this.flowParseTypeInitialiser(); - return this.finishNode(node, "FunctionTypeAnnotation"); + set isAmbientContext(v) { + if (v) this.flags |= 32;else this.flags &= -33; } - flowParseObjectTypeCallProperty(node, isStatic) { - const valueNode = this.startNode(); - node.static = isStatic; - node.value = this.flowParseObjectTypeMethodish(valueNode); - return this.finishNode(node, "ObjectTypeCallProperty"); + get inAbstractClass() { + return (this.flags & 64) > 0; } - flowParseObjectType({ - allowStatic, - allowExact, - allowSpread, - allowProto, - allowInexact - }) { - const oldInType = this.state.inType; - this.state.inType = true; - const nodeStart = this.startNode(); - nodeStart.callProperties = []; - nodeStart.properties = []; - nodeStart.indexers = []; - nodeStart.internalSlots = []; - let endDelim; - let exact; - let inexact = false; - if (allowExact && this.match(6)) { - this.expect(6); - endDelim = 9; - exact = true; - } else { - this.expect(5); - endDelim = 8; - exact = false; - } - nodeStart.exact = exact; - while (!this.match(endDelim)) { - let isStatic = false; - let protoStartLoc = null; - let inexactStartLoc = null; - const node = this.startNode(); - if (allowProto && this.isContextual(118)) { - const lookahead = this.lookahead(); - if (lookahead.type !== 14 && lookahead.type !== 17) { - this.next(); - protoStartLoc = this.state.startLoc; - allowStatic = false; - } - } - if (allowStatic && this.isContextual(106)) { - const lookahead = this.lookahead(); - if (lookahead.type !== 14 && lookahead.type !== 17) { - this.next(); - isStatic = true; - } - } - const variance = this.flowParseVariance(); - if (this.eat(0)) { - if (protoStartLoc != null) { - this.unexpected(protoStartLoc); - } - if (this.eat(0)) { - if (variance) { - this.unexpected(variance.loc.start); - } - nodeStart.internalSlots.push(this.flowParseObjectTypeInternalSlot(node, isStatic)); - } else { - nodeStart.indexers.push(this.flowParseObjectTypeIndexer(node, isStatic, variance)); - } - } else if (this.match(10) || this.match(47)) { - if (protoStartLoc != null) { - this.unexpected(protoStartLoc); - } - if (variance) { - this.unexpected(variance.loc.start); - } - nodeStart.callProperties.push(this.flowParseObjectTypeCallProperty(node, isStatic)); - } else { - let kind = "init"; - if (this.isContextual(99) || this.isContextual(104)) { - const lookahead = this.lookahead(); - if (tokenIsLiteralPropertyName(lookahead.type)) { - kind = this.state.value; - this.next(); - } - } - const propOrInexact = this.flowParseObjectTypeProperty(node, isStatic, protoStartLoc, variance, kind, allowSpread, allowInexact != null ? allowInexact : !exact); - if (propOrInexact === null) { - inexact = true; - inexactStartLoc = this.state.lastTokStartLoc; - } else { - nodeStart.properties.push(propOrInexact); - } - } - this.flowObjectTypeSemicolon(); - if (inexactStartLoc && !this.match(8) && !this.match(9)) { - this.raise(FlowErrors.UnexpectedExplicitInexactInObject, inexactStartLoc); - } - } - this.expect(endDelim); - if (allowSpread) { - nodeStart.inexact = inexact; - } - const out = this.finishNode(nodeStart, "ObjectTypeAnnotation"); - this.state.inType = oldInType; - return out; + set inAbstractClass(v) { + if (v) this.flags |= 64;else this.flags &= -65; } - flowParseObjectTypeProperty(node, isStatic, protoStartLoc, variance, kind, allowSpread, allowInexact) { - if (this.eat(21)) { - const isInexactToken = this.match(12) || this.match(13) || this.match(8) || this.match(9); - if (isInexactToken) { - if (!allowSpread) { - this.raise(FlowErrors.InexactInsideNonObject, this.state.lastTokStartLoc); - } else if (!allowInexact) { - this.raise(FlowErrors.InexactInsideExact, this.state.lastTokStartLoc); - } - if (variance) { - this.raise(FlowErrors.InexactVariance, variance); - } - return null; - } - if (!allowSpread) { - this.raise(FlowErrors.UnexpectedSpreadType, this.state.lastTokStartLoc); - } - if (protoStartLoc != null) { - this.unexpected(protoStartLoc); - } - if (variance) { - this.raise(FlowErrors.SpreadVariance, variance); - } - node.argument = this.flowParseType(); - return this.finishNode(node, "ObjectTypeSpreadProperty"); - } else { - node.key = this.flowParseObjectPropertyKey(); - node.static = isStatic; - node.proto = protoStartLoc != null; - node.kind = kind; - let optional = false; - if (this.match(47) || this.match(10)) { - node.method = true; - if (protoStartLoc != null) { - this.unexpected(protoStartLoc); - } - if (variance) { - this.unexpected(variance.loc.start); - } - node.value = this.flowParseObjectTypeMethodish(this.startNodeAt(node.loc.start)); - if (kind === "get" || kind === "set") { - this.flowCheckGetterSetterParams(node); - } - if (!allowSpread && node.key.name === "constructor" && node.value.this) { - this.raise(FlowErrors.ThisParamBannedInConstructor, node.value.this); - } - } else { - if (kind !== "init") this.unexpected(); - node.method = false; - if (this.eat(17)) { - optional = true; - } - node.value = this.flowParseTypeInitialiser(); - node.variance = variance; - } - node.optional = optional; - return this.finishNode(node, "ObjectTypeProperty"); - } + get inDisallowConditionalTypesContext() { + return (this.flags & 128) > 0; } - flowCheckGetterSetterParams(property) { - const paramCount = property.kind === "get" ? 0 : 1; - const length = property.value.params.length + (property.value.rest ? 1 : 0); - if (property.value.this) { - this.raise(property.kind === "get" ? FlowErrors.GetterMayNotHaveThisParam : FlowErrors.SetterMayNotHaveThisParam, property.value.this); - } - if (length !== paramCount) { - this.raise(property.kind === "get" ? Errors.BadGetterArity : Errors.BadSetterArity, property); - } - if (property.kind === "set" && property.value.rest) { - this.raise(Errors.BadSetterRestParameter, property); - } + set inDisallowConditionalTypesContext(v) { + if (v) this.flags |= 128;else this.flags &= -129; } - flowObjectTypeSemicolon() { - if (!this.eat(13) && !this.eat(12) && !this.match(8) && !this.match(9)) { - this.unexpected(); - } + get soloAwait() { + return (this.flags & 256) > 0; } - flowParseQualifiedTypeIdentifier(startLoc, id) { - startLoc != null ? startLoc : startLoc = this.state.startLoc; - let node = id || this.flowParseRestrictedIdentifier(true); - while (this.eat(16)) { - const node2 = this.startNodeAt(startLoc); - node2.qualification = node; - node2.id = this.flowParseRestrictedIdentifier(true); - node = this.finishNode(node2, "QualifiedTypeIdentifier"); - } - return node; + set soloAwait(v) { + if (v) this.flags |= 256;else this.flags &= -257; } - flowParseGenericType(startLoc, id) { - const node = this.startNodeAt(startLoc); - node.typeParameters = null; - node.id = this.flowParseQualifiedTypeIdentifier(startLoc, id); - if (this.match(47)) { - node.typeParameters = this.flowParseTypeParameterInstantiation(); - } - return this.finishNode(node, "GenericTypeAnnotation"); + get inFSharpPipelineDirectBody() { + return (this.flags & 512) > 0; } - flowParseTypeofType() { - const node = this.startNode(); - this.expect(87); - node.argument = this.flowParsePrimaryType(); - return this.finishNode(node, "TypeofTypeAnnotation"); + set inFSharpPipelineDirectBody(v) { + if (v) this.flags |= 512;else this.flags &= -513; } - flowParseTupleType() { - const node = this.startNode(); - node.types = []; - this.expect(0); - while (this.state.pos < this.length && !this.match(3)) { - node.types.push(this.flowParseType()); - if (this.match(3)) break; - this.expect(12); - } - this.expect(3); - return this.finishNode(node, "TupleTypeAnnotation"); + get canStartJSXElement() { + return (this.flags & 1024) > 0; } - flowParseFunctionTypeParam(first) { - let name = null; - let optional = false; - let typeAnnotation = null; - const node = this.startNode(); - const lh = this.lookahead(); - const isThis = this.state.type === 78; - if (lh.type === 14 || lh.type === 17) { - if (isThis && !first) { - this.raise(FlowErrors.ThisParamMustBeFirst, node); - } - name = this.parseIdentifier(isThis); - if (this.eat(17)) { - optional = true; - if (isThis) { - this.raise(FlowErrors.ThisParamMayNotBeOptional, node); - } - } - typeAnnotation = this.flowParseTypeInitialiser(); - } else { - typeAnnotation = this.flowParseType(); - } - node.name = name; - node.optional = optional; - node.typeAnnotation = typeAnnotation; - return this.finishNode(node, "FunctionTypeParam"); + set canStartJSXElement(v) { + if (v) this.flags |= 1024;else this.flags &= -1025; } - reinterpretTypeAsFunctionTypeParam(type) { - const node = this.startNodeAt(type.loc.start); - node.name = null; - node.optional = false; - node.typeAnnotation = type; - return this.finishNode(node, "FunctionTypeParam"); + get containsEsc() { + return (this.flags & 2048) > 0; } - flowParseFunctionTypeParams(params = []) { - let rest = null; - let _this = null; - if (this.match(78)) { - _this = this.flowParseFunctionTypeParam(true); - _this.name = null; - if (!this.match(11)) { - this.expect(12); - } - } - while (!this.match(11) && !this.match(21)) { - params.push(this.flowParseFunctionTypeParam(false)); - if (!this.match(11)) { - this.expect(12); - } - } - if (this.eat(21)) { - rest = this.flowParseFunctionTypeParam(false); - } - return { - params, - rest, - _this - }; + set containsEsc(v) { + if (v) this.flags |= 2048;else this.flags &= -2049; } - flowIdentToTypeAnnotation(startLoc, node, id) { - switch (id.name) { - case "any": - return this.finishNode(node, "AnyTypeAnnotation"); - case "bool": - case "boolean": - return this.finishNode(node, "BooleanTypeAnnotation"); - case "mixed": - return this.finishNode(node, "MixedTypeAnnotation"); - case "empty": - return this.finishNode(node, "EmptyTypeAnnotation"); - case "number": - return this.finishNode(node, "NumberTypeAnnotation"); - case "string": - return this.finishNode(node, "StringTypeAnnotation"); - case "symbol": - return this.finishNode(node, "SymbolTypeAnnotation"); - default: - this.checkNotUnderscore(id.name); - return this.flowParseGenericType(startLoc, id); - } + get hasTopLevelAwait() { + return (this.flags & 4096) > 0; } - flowParsePrimaryType() { - const startLoc = this.state.startLoc; - const node = this.startNode(); - let tmp; - let type; - let isGroupedType = false; - const oldNoAnonFunctionType = this.state.noAnonFunctionType; - switch (this.state.type) { - case 5: - return this.flowParseObjectType({ - allowStatic: false, - allowExact: false, - allowSpread: true, - allowProto: false, - allowInexact: true - }); - case 6: - return this.flowParseObjectType({ - allowStatic: false, - allowExact: true, - allowSpread: true, - allowProto: false, - allowInexact: false - }); - case 0: - this.state.noAnonFunctionType = false; - type = this.flowParseTupleType(); - this.state.noAnonFunctionType = oldNoAnonFunctionType; - return type; - case 47: - { - const node = this.startNode(); - node.typeParameters = this.flowParseTypeParameterDeclaration(); - this.expect(10); - tmp = this.flowParseFunctionTypeParams(); - node.params = tmp.params; - node.rest = tmp.rest; - node.this = tmp._this; - this.expect(11); - this.expect(19); - node.returnType = this.flowParseType(); - return this.finishNode(node, "FunctionTypeAnnotation"); - } - case 10: - { - const node = this.startNode(); - this.next(); - if (!this.match(11) && !this.match(21)) { - if (tokenIsIdentifier(this.state.type) || this.match(78)) { - const token = this.lookahead().type; - isGroupedType = token !== 17 && token !== 14; - } else { - isGroupedType = true; - } - } - if (isGroupedType) { - this.state.noAnonFunctionType = false; - type = this.flowParseType(); - this.state.noAnonFunctionType = oldNoAnonFunctionType; - if (this.state.noAnonFunctionType || !(this.match(12) || this.match(11) && this.lookahead().type === 19)) { - this.expect(11); - return type; - } else { - this.eat(12); - } - } - if (type) { - tmp = this.flowParseFunctionTypeParams([this.reinterpretTypeAsFunctionTypeParam(type)]); - } else { - tmp = this.flowParseFunctionTypeParams(); - } - node.params = tmp.params; - node.rest = tmp.rest; - node.this = tmp._this; - this.expect(11); - this.expect(19); - node.returnType = this.flowParseType(); - node.typeParameters = null; - return this.finishNode(node, "FunctionTypeAnnotation"); - } - case 134: - return this.parseLiteral(this.state.value, "StringLiteralTypeAnnotation"); - case 85: - case 86: - node.value = this.match(85); - this.next(); - return this.finishNode(node, "BooleanLiteralTypeAnnotation"); - case 53: - if (this.state.value === "-") { - this.next(); - if (this.match(135)) { - return this.parseLiteralAtNode(-this.state.value, "NumberLiteralTypeAnnotation", node); - } - if (this.match(136)) { - return this.parseLiteralAtNode(-this.state.value, "BigIntLiteralTypeAnnotation", node); - } - throw this.raise(FlowErrors.UnexpectedSubtractionOperand, this.state.startLoc); - } - this.unexpected(); - return; - case 135: - return this.parseLiteral(this.state.value, "NumberLiteralTypeAnnotation"); - case 136: - return this.parseLiteral(this.state.value, "BigIntLiteralTypeAnnotation"); - case 88: - this.next(); - return this.finishNode(node, "VoidTypeAnnotation"); - case 84: - this.next(); - return this.finishNode(node, "NullLiteralTypeAnnotation"); - case 78: - this.next(); - return this.finishNode(node, "ThisTypeAnnotation"); - case 55: - this.next(); - return this.finishNode(node, "ExistsTypeAnnotation"); - case 87: - return this.flowParseTypeofType(); - default: - if (tokenIsKeyword(this.state.type)) { - const label = tokenLabelName(this.state.type); - this.next(); - return super.createIdentifier(node, label); - } else if (tokenIsIdentifier(this.state.type)) { - if (this.isContextual(129)) { - return this.flowParseInterfaceType(); - } - return this.flowIdentToTypeAnnotation(startLoc, node, this.parseIdentifier()); - } - } - this.unexpected(); + set hasTopLevelAwait(v) { + if (v) this.flags |= 4096;else this.flags &= -4097; } - flowParsePostfixType() { - const startLoc = this.state.startLoc; - let type = this.flowParsePrimaryType(); - let seenOptionalIndexedAccess = false; - while ((this.match(0) || this.match(18)) && !this.canInsertSemicolon()) { - const node = this.startNodeAt(startLoc); - const optional = this.eat(18); - seenOptionalIndexedAccess = seenOptionalIndexedAccess || optional; - this.expect(0); - if (!optional && this.match(3)) { - node.elementType = type; - this.next(); - type = this.finishNode(node, "ArrayTypeAnnotation"); + curPosition() { + return new Position(this.curLine, this.pos - this.lineStart, this.pos); + } + clone() { + const state = new State(); + state.flags = this.flags; + state.curLine = this.curLine; + state.lineStart = this.lineStart; + state.startLoc = this.startLoc; + state.endLoc = this.endLoc; + state.errors = this.errors.slice(); + state.potentialArrowAt = this.potentialArrowAt; + state.noArrowAt = this.noArrowAt.slice(); + state.noArrowParamsConversionAt = this.noArrowParamsConversionAt.slice(); + state.topicContext = this.topicContext; + state.labels = this.labels.slice(); + state.commentsLen = this.commentsLen; + state.commentStack = this.commentStack.slice(); + state.pos = this.pos; + state.type = this.type; + state.value = this.value; + state.start = this.start; + state.end = this.end; + state.lastTokEndLoc = this.lastTokEndLoc; + state.lastTokStartLoc = this.lastTokStartLoc; + state.context = this.context.slice(); + state.firstInvalidTemplateEscapePos = this.firstInvalidTemplateEscapePos; + state.strictErrors = this.strictErrors; + state.tokensLength = this.tokensLength; + return state; + } +} +var _isDigit = function isDigit(code) { + return code >= 48 && code <= 57; +}; +const forbiddenNumericSeparatorSiblings = { + decBinOct: new Set([46, 66, 69, 79, 95, 98, 101, 111]), + hex: new Set([46, 88, 95, 120]) +}; +const isAllowedNumericSeparatorSibling = { + bin: ch => ch === 48 || ch === 49, + oct: ch => ch >= 48 && ch <= 55, + dec: ch => ch >= 48 && ch <= 57, + hex: ch => ch >= 48 && ch <= 57 || ch >= 65 && ch <= 70 || ch >= 97 && ch <= 102 +}; +function readStringContents(type, input, pos, lineStart, curLine, errors) { + const initialPos = pos; + const initialLineStart = lineStart; + const initialCurLine = curLine; + let out = ""; + let firstInvalidLoc = null; + let chunkStart = pos; + const { + length + } = input; + for (;;) { + if (pos >= length) { + errors.unterminated(initialPos, initialLineStart, initialCurLine); + out += input.slice(chunkStart, pos); + break; + } + const ch = input.charCodeAt(pos); + if (isStringEnd(type, ch, input, pos)) { + out += input.slice(chunkStart, pos); + break; + } + if (ch === 92) { + out += input.slice(chunkStart, pos); + const res = readEscapedChar(input, pos, lineStart, curLine, type === "template", errors); + if (res.ch === null && !firstInvalidLoc) { + firstInvalidLoc = { + pos, + lineStart, + curLine + }; } else { - node.objectType = type; - node.indexType = this.flowParseType(); - this.expect(3); - if (seenOptionalIndexedAccess) { - node.optional = optional; - type = this.finishNode(node, "OptionalIndexedAccessType"); - } else { - type = this.finishNode(node, "IndexedAccessType"); + out += res.ch; + } + ({ + pos, + lineStart, + curLine + } = res); + chunkStart = pos; + } else if (ch === 8232 || ch === 8233) { + ++pos; + ++curLine; + lineStart = pos; + } else if (ch === 10 || ch === 13) { + if (type === "template") { + out += input.slice(chunkStart, pos) + "\n"; + ++pos; + if (ch === 13 && input.charCodeAt(pos) === 10) { + ++pos; } + ++curLine; + chunkStart = lineStart = pos; + } else { + errors.unterminated(initialPos, initialLineStart, initialCurLine); } - } - return type; - } - flowParsePrefixType() { - const node = this.startNode(); - if (this.eat(17)) { - node.typeAnnotation = this.flowParsePrefixType(); - return this.finishNode(node, "NullableTypeAnnotation"); } else { - return this.flowParsePostfixType(); - } - } - flowParseAnonFunctionWithoutParens() { - const param = this.flowParsePrefixType(); - if (!this.state.noAnonFunctionType && this.eat(19)) { - const node = this.startNodeAt(param.loc.start); - node.params = [this.reinterpretTypeAsFunctionTypeParam(param)]; - node.rest = null; - node.this = null; - node.returnType = this.flowParseType(); - node.typeParameters = null; - return this.finishNode(node, "FunctionTypeAnnotation"); + ++pos; } - return param; } - flowParseIntersectionType() { - const node = this.startNode(); - this.eat(45); - const type = this.flowParseAnonFunctionWithoutParens(); - node.types = [type]; - while (this.eat(45)) { - node.types.push(this.flowParseAnonFunctionWithoutParens()); - } - return node.types.length === 1 ? type : this.finishNode(node, "IntersectionTypeAnnotation"); - } - flowParseUnionType() { - const node = this.startNode(); - this.eat(43); - const type = this.flowParseIntersectionType(); - node.types = [type]; - while (this.eat(43)) { - node.types.push(this.flowParseIntersectionType()); - } - return node.types.length === 1 ? type : this.finishNode(node, "UnionTypeAnnotation"); + return { + pos, + str: out, + firstInvalidLoc, + lineStart, + curLine, + containsInvalid: !!firstInvalidLoc + }; +} +function isStringEnd(type, ch, input, pos) { + if (type === "template") { + return ch === 96 || ch === 36 && input.charCodeAt(pos + 1) === 123; } - flowParseType() { - const oldInType = this.state.inType; - this.state.inType = true; - const type = this.flowParseUnionType(); - this.state.inType = oldInType; - return type; + return ch === (type === "double" ? 34 : 39); +} +function readEscapedChar(input, pos, lineStart, curLine, inTemplate, errors) { + const throwOnInvalid = !inTemplate; + pos++; + const res = ch => ({ + pos, + ch, + lineStart, + curLine + }); + const ch = input.charCodeAt(pos++); + switch (ch) { + case 110: + return res("\n"); + case 114: + return res("\r"); + case 120: + { + let code; + ({ + code, + pos + } = readHexChar(input, pos, lineStart, curLine, 2, false, throwOnInvalid, errors)); + return res(code === null ? null : String.fromCharCode(code)); + } + case 117: + { + let code; + ({ + code, + pos + } = readCodePoint(input, pos, lineStart, curLine, throwOnInvalid, errors)); + return res(code === null ? null : String.fromCodePoint(code)); + } + case 116: + return res("\t"); + case 98: + return res("\b"); + case 118: + return res("\u000b"); + case 102: + return res("\f"); + case 13: + if (input.charCodeAt(pos) === 10) { + ++pos; + } + case 10: + lineStart = pos; + ++curLine; + case 8232: + case 8233: + return res(""); + case 56: + case 57: + if (inTemplate) { + return res(null); + } else { + errors.strictNumericEscape(pos - 1, lineStart, curLine); + } + default: + if (ch >= 48 && ch <= 55) { + const startPos = pos - 1; + const match = /^[0-7]+/.exec(input.slice(startPos, pos + 2)); + let octalStr = match[0]; + let octal = parseInt(octalStr, 8); + if (octal > 255) { + octalStr = octalStr.slice(0, -1); + octal = parseInt(octalStr, 8); + } + pos += octalStr.length - 1; + const next = input.charCodeAt(pos); + if (octalStr !== "0" || next === 56 || next === 57) { + if (inTemplate) { + return res(null); + } else { + errors.strictNumericEscape(startPos, lineStart, curLine); + } + } + return res(String.fromCharCode(octal)); + } + return res(String.fromCharCode(ch)); } - flowParseTypeOrImplicitInstantiation() { - if (this.state.type === 132 && this.state.value === "_") { - const startLoc = this.state.startLoc; - const node = this.parseIdentifier(); - return this.flowParseGenericType(startLoc, node); +} +function readHexChar(input, pos, lineStart, curLine, len, forceLen, throwOnInvalid, errors) { + const initialPos = pos; + let n; + ({ + n, + pos + } = readInt(input, pos, lineStart, curLine, 16, len, forceLen, false, errors, !throwOnInvalid)); + if (n === null) { + if (throwOnInvalid) { + errors.invalidEscapeSequence(initialPos, lineStart, curLine); } else { - return this.flowParseType(); + pos = initialPos - 1; } } - flowParseTypeAnnotation() { - const node = this.startNode(); - node.typeAnnotation = this.flowParseTypeInitialiser(); - return this.finishNode(node, "TypeAnnotation"); - } - flowParseTypeAnnotatableIdentifier(allowPrimitiveOverride) { - const ident = allowPrimitiveOverride ? this.parseIdentifier() : this.flowParseRestrictedIdentifier(); - if (this.match(14)) { - ident.typeAnnotation = this.flowParseTypeAnnotation(); - this.resetEndLocation(ident); + return { + code: n, + pos + }; +} +function readInt(input, pos, lineStart, curLine, radix, len, forceLen, allowNumSeparator, errors, bailOnError) { + const start = pos; + const forbiddenSiblings = radix === 16 ? forbiddenNumericSeparatorSiblings.hex : forbiddenNumericSeparatorSiblings.decBinOct; + const isAllowedSibling = radix === 16 ? isAllowedNumericSeparatorSibling.hex : radix === 10 ? isAllowedNumericSeparatorSibling.dec : radix === 8 ? isAllowedNumericSeparatorSibling.oct : isAllowedNumericSeparatorSibling.bin; + let invalid = false; + let total = 0; + for (let i = 0, e = len == null ? Infinity : len; i < e; ++i) { + const code = input.charCodeAt(pos); + let val; + if (code === 95 && allowNumSeparator !== "bail") { + const prev = input.charCodeAt(pos - 1); + const next = input.charCodeAt(pos + 1); + if (!allowNumSeparator) { + if (bailOnError) return { + n: null, + pos + }; + errors.numericSeparatorInEscapeSequence(pos, lineStart, curLine); + } else if (Number.isNaN(next) || !isAllowedSibling(next) || forbiddenSiblings.has(prev) || forbiddenSiblings.has(next)) { + if (bailOnError) return { + n: null, + pos + }; + errors.unexpectedNumericSeparator(pos, lineStart, curLine); + } + ++pos; + continue; } - return ident; - } - typeCastToParameter(node) { - node.expression.typeAnnotation = node.typeAnnotation; - this.resetEndLocation(node.expression, node.typeAnnotation.loc.end); - return node.expression; - } - flowParseVariance() { - let variance = null; - if (this.match(53)) { - variance = this.startNode(); - if (this.state.value === "+") { - variance.kind = "plus"; + if (code >= 97) { + val = code - 97 + 10; + } else if (code >= 65) { + val = code - 65 + 10; + } else if (_isDigit(code)) { + val = code - 48; + } else { + val = Infinity; + } + if (val >= radix) { + if (val <= 9 && bailOnError) { + return { + n: null, + pos + }; + } else if (val <= 9 && errors.invalidDigit(pos, lineStart, curLine, radix)) { + val = 0; + } else if (forceLen) { + val = 0; + invalid = true; } else { - variance.kind = "minus"; + break; } - this.next(); - return this.finishNode(variance, "Variance"); } - return variance; + ++pos; + total = total * radix + val; } - parseFunctionBody(node, allowExpressionBody, isMethod = false) { - if (allowExpressionBody) { - this.forwardNoArrowParamsConversionAt(node, () => super.parseFunctionBody(node, true, isMethod)); - return; - } - super.parseFunctionBody(node, false, isMethod); + if (pos === start || len != null && pos - start !== len || invalid) { + return { + n: null, + pos + }; } - parseFunctionBodyAndFinish(node, type, isMethod = false) { - if (this.match(14)) { - const typeNode = this.startNode(); - [typeNode.typeAnnotation, node.predicate] = this.flowParseTypeAndPredicateInitialiser(); - node.returnType = typeNode.typeAnnotation ? this.finishNode(typeNode, "TypeAnnotation") : null; + return { + n: total, + pos + }; +} +function readCodePoint(input, pos, lineStart, curLine, throwOnInvalid, errors) { + const ch = input.charCodeAt(pos); + let code; + if (ch === 123) { + ++pos; + ({ + code, + pos + } = readHexChar(input, pos, lineStart, curLine, input.indexOf("}", pos) - pos, true, throwOnInvalid, errors)); + ++pos; + if (code !== null && code > 0x10ffff) { + if (throwOnInvalid) { + errors.invalidCodePoint(pos, lineStart, curLine); + } else { + return { + code: null, + pos + }; + } } - return super.parseFunctionBodyAndFinish(node, type, isMethod); - } - parseStatementLike(flags) { - if (this.state.strict && this.isContextual(129)) { - const lookahead = this.lookahead(); - if (tokenIsKeywordOrIdentifier(lookahead.type)) { - const node = this.startNode(); - this.next(); - return this.flowParseInterface(node); - } - } else if (this.isContextual(126)) { - const node = this.startNode(); - this.next(); - return this.flowParseEnumDeclaration(node); - } - const stmt = super.parseStatementLike(flags); - if (this.flowPragma === undefined && !this.isValidDirective(stmt)) { - this.flowPragma = null; - } - return stmt; + } else { + ({ + code, + pos + } = readHexChar(input, pos, lineStart, curLine, 4, false, throwOnInvalid, errors)); } - parseExpressionStatement(node, expr, decorators) { - if (expr.type === "Identifier") { - if (expr.name === "declare") { - if (this.match(80) || tokenIsIdentifier(this.state.type) || this.match(68) || this.match(74) || this.match(82)) { - return this.flowParseDeclare(node); - } - } else if (tokenIsIdentifier(this.state.type)) { - if (expr.name === "interface") { - return this.flowParseInterface(node); - } else if (expr.name === "type") { - return this.flowParseTypeAlias(node); - } else if (expr.name === "opaque") { - return this.flowParseOpaqueType(node, false); - } + return { + code, + pos + }; +} +function buildPosition(pos, lineStart, curLine) { + return new Position(curLine, pos - lineStart, pos); +} +const VALID_REGEX_FLAGS = new Set([103, 109, 115, 105, 121, 117, 100, 118]); +class Token { + constructor(state) { + this.type = state.type; + this.value = state.value; + this.start = state.start; + this.end = state.end; + this.loc = new SourceLocation(state.startLoc, state.endLoc); + } +} +class Tokenizer extends CommentsParser { + constructor(options, input) { + super(); + this.isLookahead = void 0; + this.tokens = []; + this.errorHandlers_readInt = { + invalidDigit: (pos, lineStart, curLine, radix) => { + if (!this.options.errorRecovery) return false; + this.raise(Errors.InvalidDigit, buildPosition(pos, lineStart, curLine), { + radix + }); + return true; + }, + numericSeparatorInEscapeSequence: this.errorBuilder(Errors.NumericSeparatorInEscapeSequence), + unexpectedNumericSeparator: this.errorBuilder(Errors.UnexpectedNumericSeparator) + }; + this.errorHandlers_readCodePoint = Object.assign({}, this.errorHandlers_readInt, { + invalidEscapeSequence: this.errorBuilder(Errors.InvalidEscapeSequence), + invalidCodePoint: this.errorBuilder(Errors.InvalidCodePoint) + }); + this.errorHandlers_readStringContents_string = Object.assign({}, this.errorHandlers_readCodePoint, { + strictNumericEscape: (pos, lineStart, curLine) => { + this.recordStrictModeErrors(Errors.StrictNumericEscape, buildPosition(pos, lineStart, curLine)); + }, + unterminated: (pos, lineStart, curLine) => { + throw this.raise(Errors.UnterminatedString, buildPosition(pos - 1, lineStart, curLine)); } - } - return super.parseExpressionStatement(node, expr, decorators); + }); + this.errorHandlers_readStringContents_template = Object.assign({}, this.errorHandlers_readCodePoint, { + strictNumericEscape: this.errorBuilder(Errors.StrictNumericEscape), + unterminated: (pos, lineStart, curLine) => { + throw this.raise(Errors.UnterminatedTemplate, buildPosition(pos, lineStart, curLine)); + } + }); + this.state = new State(); + this.state.init(options); + this.input = input; + this.length = input.length; + this.comments = []; + this.isLookahead = false; } - shouldParseExportDeclaration() { - const { - type - } = this.state; - if (type === 126 || tokenIsFlowInterfaceOrTypeOrOpaque(type)) { - return !this.state.containsEsc; - } - return super.shouldParseExportDeclaration(); + pushToken(token) { + this.tokens.length = this.state.tokensLength; + this.tokens.push(token); + ++this.state.tokensLength; } - isExportDefaultSpecifier() { - const { - type - } = this.state; - if (type === 126 || tokenIsFlowInterfaceOrTypeOrOpaque(type)) { - return this.state.containsEsc; + next() { + this.checkKeywordEscapes(); + if (this.options.tokens) { + this.pushToken(new Token(this.state)); } - return super.isExportDefaultSpecifier(); + this.state.lastTokEndLoc = this.state.endLoc; + this.state.lastTokStartLoc = this.state.startLoc; + this.nextToken(); } - parseExportDefaultExpression() { - if (this.isContextual(126)) { - const node = this.startNode(); + eat(type) { + if (this.match(type)) { this.next(); - return this.flowParseEnumDeclaration(node); + return true; + } else { + return false; } - return super.parseExportDefaultExpression(); } - parseConditional(expr, startLoc, refExpressionErrors) { - if (!this.match(17)) return expr; - if (this.state.maybeInArrowParameters) { - const nextCh = this.lookaheadCharCode(); - if (nextCh === 44 || nextCh === 61 || nextCh === 58 || nextCh === 41) { - this.setOptionalParametersError(refExpressionErrors); - return expr; - } - } - this.expect(17); - const state = this.state.clone(); - const originalNoArrowAt = this.state.noArrowAt; - const node = this.startNodeAt(startLoc); - let { - consequent, - failed - } = this.tryParseConditionalConsequent(); - let [valid, invalid] = this.getArrowLikeExpressions(consequent); - if (failed || invalid.length > 0) { - const noArrowAt = [...originalNoArrowAt]; - if (invalid.length > 0) { - this.state = state; - this.state.noArrowAt = noArrowAt; - for (let i = 0; i < invalid.length; i++) { - noArrowAt.push(invalid[i].start); - } - ({ - consequent, - failed - } = this.tryParseConditionalConsequent()); - [valid, invalid] = this.getArrowLikeExpressions(consequent); - } - if (failed && valid.length > 1) { - this.raise(FlowErrors.AmbiguousConditionalArrow, state.startLoc); - } - if (failed && valid.length === 1) { - this.state = state; - noArrowAt.push(valid[0].start); - this.state.noArrowAt = noArrowAt; - ({ - consequent, - failed - } = this.tryParseConditionalConsequent()); - } - } - this.getArrowLikeExpressions(consequent, true); - this.state.noArrowAt = originalNoArrowAt; - this.expect(14); - node.test = expr; - node.consequent = consequent; - node.alternate = this.forwardNoArrowParamsConversionAt(node, () => this.parseMaybeAssign(undefined, undefined)); - return this.finishNode(node, "ConditionalExpression"); + match(type) { + return this.state.type === type; } - tryParseConditionalConsequent() { - this.state.noArrowParamsConversionAt.push(this.state.start); - const consequent = this.parseMaybeAssignAllowIn(); - const failed = !this.match(14); - this.state.noArrowParamsConversionAt.pop(); + createLookaheadState(state) { return { - consequent, - failed + pos: state.pos, + value: null, + type: state.type, + start: state.start, + end: state.end, + context: [this.curContext()], + inType: state.inType, + startLoc: state.startLoc, + lastTokEndLoc: state.lastTokEndLoc, + curLine: state.curLine, + lineStart: state.lineStart, + curPosition: state.curPosition }; } - getArrowLikeExpressions(node, disallowInvalid) { - const stack = [node]; - const arrows = []; - while (stack.length !== 0) { - const node = stack.pop(); - if (node.type === "ArrowFunctionExpression" && node.body.type !== "BlockStatement") { - if (node.typeParameters || !node.returnType) { - this.finishArrowValidation(node); - } else { - arrows.push(node); - } - stack.push(node.body); - } else if (node.type === "ConditionalExpression") { - stack.push(node.consequent); - stack.push(node.alternate); - } - } - if (disallowInvalid) { - arrows.forEach(node => this.finishArrowValidation(node)); - return [arrows, []]; - } - return partition(arrows, node => node.params.every(param => this.isAssignable(param, true))); + lookahead() { + const old = this.state; + this.state = this.createLookaheadState(old); + this.isLookahead = true; + this.nextToken(); + this.isLookahead = false; + const curr = this.state; + this.state = old; + return curr; } - finishArrowValidation(node) { - var _node$extra; - this.toAssignableList(node.params, (_node$extra = node.extra) == null ? void 0 : _node$extra.trailingCommaLoc, false); - this.scope.enter(514 | 4); - super.checkParams(node, false, true); - this.scope.exit(); + nextTokenStart() { + return this.nextTokenStartSince(this.state.pos); } - forwardNoArrowParamsConversionAt(node, parse) { - let result; - if (this.state.noArrowParamsConversionAt.includes(this.offsetToSourcePos(node.start))) { - this.state.noArrowParamsConversionAt.push(this.state.start); - result = parse(); - this.state.noArrowParamsConversionAt.pop(); - } else { - result = parse(); - } - return result; + nextTokenStartSince(pos) { + skipWhiteSpace.lastIndex = pos; + return skipWhiteSpace.test(this.input) ? skipWhiteSpace.lastIndex : pos; } - parseParenItem(node, startLoc) { - const newNode = super.parseParenItem(node, startLoc); - if (this.eat(17)) { - newNode.optional = true; - this.resetEndLocation(node); - } - if (this.match(14)) { - const typeCastNode = this.startNodeAt(startLoc); - typeCastNode.expression = newNode; - typeCastNode.typeAnnotation = this.flowParseTypeAnnotation(); - return this.finishNode(typeCastNode, "TypeCastExpression"); - } - return newNode; + lookaheadCharCode() { + return this.input.charCodeAt(this.nextTokenStart()); } - assertModuleNodeAllowed(node) { - if (node.type === "ImportDeclaration" && (node.importKind === "type" || node.importKind === "typeof") || node.type === "ExportNamedDeclaration" && node.exportKind === "type" || node.type === "ExportAllDeclaration" && node.exportKind === "type") { - return; - } - super.assertModuleNodeAllowed(node); + nextTokenInLineStart() { + return this.nextTokenInLineStartSince(this.state.pos); } - parseExportDeclaration(node) { - if (this.isContextual(130)) { - node.exportKind = "type"; - const declarationNode = this.startNode(); - this.next(); - if (this.match(5)) { - node.specifiers = this.parseExportSpecifiers(true); - super.parseExportFrom(node); - return null; - } else { - return this.flowParseTypeAlias(declarationNode); + nextTokenInLineStartSince(pos) { + skipWhiteSpaceInLine.lastIndex = pos; + return skipWhiteSpaceInLine.test(this.input) ? skipWhiteSpaceInLine.lastIndex : pos; + } + lookaheadInLineCharCode() { + return this.input.charCodeAt(this.nextTokenInLineStart()); + } + codePointAtPos(pos) { + let cp = this.input.charCodeAt(pos); + if ((cp & 0xfc00) === 0xd800 && ++pos < this.input.length) { + const trail = this.input.charCodeAt(pos); + if ((trail & 0xfc00) === 0xdc00) { + cp = 0x10000 + ((cp & 0x3ff) << 10) + (trail & 0x3ff); } - } else if (this.isContextual(131)) { - node.exportKind = "type"; - const declarationNode = this.startNode(); - this.next(); - return this.flowParseOpaqueType(declarationNode, false); - } else if (this.isContextual(129)) { - node.exportKind = "type"; - const declarationNode = this.startNode(); - this.next(); - return this.flowParseInterface(declarationNode); - } else if (this.isContextual(126)) { - node.exportKind = "value"; - const declarationNode = this.startNode(); - this.next(); - return this.flowParseEnumDeclaration(declarationNode); - } else { - return super.parseExportDeclaration(node); } + return cp; } - eatExportStar(node) { - if (super.eatExportStar(node)) return true; - if (this.isContextual(130) && this.lookahead().type === 55) { - node.exportKind = "type"; - this.next(); - this.next(); - return true; + setStrict(strict) { + this.state.strict = strict; + if (strict) { + this.state.strictErrors.forEach(([toParseError, at]) => this.raise(toParseError, at)); + this.state.strictErrors.clear(); } - return false; } - maybeParseExportNamespaceSpecifier(node) { - const { - startLoc - } = this.state; - const hasNamespace = super.maybeParseExportNamespaceSpecifier(node); - if (hasNamespace && node.exportKind === "type") { - this.unexpected(startLoc); - } - return hasNamespace; + curContext() { + return this.state.context[this.state.context.length - 1]; } - parseClassId(node, isStatement, optionalId) { - super.parseClassId(node, isStatement, optionalId); - if (this.match(47)) { - node.typeParameters = this.flowParseTypeParameterDeclaration(); + nextToken() { + this.skipSpace(); + this.state.start = this.state.pos; + if (!this.isLookahead) this.state.startLoc = this.state.curPosition(); + if (this.state.pos >= this.length) { + this.finishToken(139); + return; } + this.getTokenFromCode(this.codePointAtPos(this.state.pos)); } - parseClassMember(classBody, member, state) { - const { - startLoc - } = this.state; - if (this.isContextual(125)) { - if (super.parseClassMemberFromModifier(classBody, member)) { - return; - } - member.declare = true; + skipBlockComment(commentEnd) { + let startLoc; + if (!this.isLookahead) startLoc = this.state.curPosition(); + const start = this.state.pos; + const end = this.input.indexOf(commentEnd, start + 2); + if (end === -1) { + throw this.raise(Errors.UnterminatedComment, this.state.curPosition()); } - super.parseClassMember(classBody, member, state); - if (member.declare) { - if (member.type !== "ClassProperty" && member.type !== "ClassPrivateProperty" && member.type !== "PropertyDefinition") { - this.raise(FlowErrors.DeclareClassElement, startLoc); - } else if (member.value) { - this.raise(FlowErrors.DeclareClassFieldInitializer, member.value); - } + this.state.pos = end + commentEnd.length; + lineBreakG.lastIndex = start + 2; + while (lineBreakG.test(this.input) && lineBreakG.lastIndex <= end) { + ++this.state.curLine; + this.state.lineStart = lineBreakG.lastIndex; } + if (this.isLookahead) return; + const comment = { + type: "CommentBlock", + value: this.input.slice(start + 2, end), + start, + end: end + commentEnd.length, + loc: new SourceLocation(startLoc, this.state.curPosition()) + }; + if (this.options.tokens) this.pushToken(comment); + return comment; } - isIterator(word) { - return word === "iterator" || word === "asyncIterator"; - } - readIterator() { - const word = super.readWord1(); - const fullWord = "@@" + word; - if (!this.isIterator(word) || !this.state.inType) { - this.raise(Errors.InvalidIdentifier, this.state.curPosition(), { - identifierName: fullWord - }); + skipLineComment(startSkip) { + const start = this.state.pos; + let startLoc; + if (!this.isLookahead) startLoc = this.state.curPosition(); + let ch = this.input.charCodeAt(this.state.pos += startSkip); + if (this.state.pos < this.length) { + while (!isNewLine(ch) && ++this.state.pos < this.length) { + ch = this.input.charCodeAt(this.state.pos); + } } - this.finishToken(132, fullWord); + if (this.isLookahead) return; + const end = this.state.pos; + const value = this.input.slice(start + startSkip, end); + const comment = { + type: "CommentLine", + value, + start, + end, + loc: new SourceLocation(startLoc, this.state.curPosition()) + }; + if (this.options.tokens) this.pushToken(comment); + return comment; } - getTokenFromCode(code) { - const next = this.input.charCodeAt(this.state.pos + 1); - if (code === 123 && next === 124) { - this.finishOp(6, 2); - } else if (this.state.inType && (code === 62 || code === 60)) { - this.finishOp(code === 62 ? 48 : 47, 1); - } else if (this.state.inType && code === 63) { - if (next === 46) { - this.finishOp(18, 2); - } else { - this.finishOp(17, 1); + skipSpace() { + const spaceStart = this.state.pos; + const comments = []; + loop: while (this.state.pos < this.length) { + const ch = this.input.charCodeAt(this.state.pos); + switch (ch) { + case 32: + case 160: + case 9: + ++this.state.pos; + break; + case 13: + if (this.input.charCodeAt(this.state.pos + 1) === 10) { + ++this.state.pos; + } + case 10: + case 8232: + case 8233: + ++this.state.pos; + ++this.state.curLine; + this.state.lineStart = this.state.pos; + break; + case 47: + switch (this.input.charCodeAt(this.state.pos + 1)) { + case 42: + { + const comment = this.skipBlockComment("*/"); + if (comment !== undefined) { + this.addComment(comment); + if (this.options.attachComment) comments.push(comment); + } + break; + } + case 47: + { + const comment = this.skipLineComment(2); + if (comment !== undefined) { + this.addComment(comment); + if (this.options.attachComment) comments.push(comment); + } + break; + } + default: + break loop; + } + break; + default: + if (isWhitespace(ch)) { + ++this.state.pos; + } else if (ch === 45 && !this.inModule && this.options.annexB) { + const pos = this.state.pos; + if (this.input.charCodeAt(pos + 1) === 45 && this.input.charCodeAt(pos + 2) === 62 && (spaceStart === 0 || this.state.lineStart > spaceStart)) { + const comment = this.skipLineComment(3); + if (comment !== undefined) { + this.addComment(comment); + if (this.options.attachComment) comments.push(comment); + } + } else { + break loop; + } + } else if (ch === 60 && !this.inModule && this.options.annexB) { + const pos = this.state.pos; + if (this.input.charCodeAt(pos + 1) === 33 && this.input.charCodeAt(pos + 2) === 45 && this.input.charCodeAt(pos + 3) === 45) { + const comment = this.skipLineComment(4); + if (comment !== undefined) { + this.addComment(comment); + if (this.options.attachComment) comments.push(comment); + } + } else { + break loop; + } + } else { + break loop; + } } - } else if (isIteratorStart(code, next, this.input.charCodeAt(this.state.pos + 2))) { - this.state.pos += 2; - this.readIterator(); - } else { - super.getTokenFromCode(code); } - } - isAssignable(node, isBinding) { - if (node.type === "TypeCastExpression") { - return this.isAssignable(node.expression, isBinding); - } else { - return super.isAssignable(node, isBinding); + if (comments.length > 0) { + const end = this.state.pos; + const commentWhitespace = { + start: spaceStart, + end, + comments, + leadingNode: null, + trailingNode: null, + containingNode: null + }; + this.state.commentStack.push(commentWhitespace); } } - toAssignable(node, isLHS = false) { - if (!isLHS && node.type === "AssignmentExpression" && node.left.type === "TypeCastExpression") { - node.left = this.typeCastToParameter(node.left); - } - super.toAssignable(node, isLHS); - } - toAssignableList(exprList, trailingCommaLoc, isLHS) { - for (let i = 0; i < exprList.length; i++) { - const expr = exprList[i]; - if ((expr == null ? void 0 : expr.type) === "TypeCastExpression") { - exprList[i] = this.typeCastToParameter(expr); - } + finishToken(type, val) { + this.state.end = this.state.pos; + this.state.endLoc = this.state.curPosition(); + const prevType = this.state.type; + this.state.type = type; + this.state.value = val; + if (!this.isLookahead) { + this.updateContext(prevType); } - super.toAssignableList(exprList, trailingCommaLoc, isLHS); } - toReferencedList(exprList, isParenthesizedExpr) { - for (let i = 0; i < exprList.length; i++) { - var _expr$extra; - const expr = exprList[i]; - if (expr && expr.type === "TypeCastExpression" && !((_expr$extra = expr.extra) != null && _expr$extra.parenthesized) && (exprList.length > 1 || !isParenthesizedExpr)) { - this.raise(FlowErrors.TypeCastInPattern, expr.typeAnnotation); + replaceToken(type) { + this.state.type = type; + this.updateContext(); + } + readToken_numberSign() { + if (this.state.pos === 0 && this.readToken_interpreter()) { + return; + } + const nextPos = this.state.pos + 1; + const next = this.codePointAtPos(nextPos); + if (next >= 48 && next <= 57) { + throw this.raise(Errors.UnexpectedDigitAfterHash, this.state.curPosition()); + } + if (next === 123 || next === 91 && this.hasPlugin("recordAndTuple")) { + this.expectPlugin("recordAndTuple"); + if (this.getPluginOption("recordAndTuple", "syntaxType") === "bar") { + throw this.raise(next === 123 ? Errors.RecordExpressionHashIncorrectStartSyntaxType : Errors.TupleExpressionHashIncorrectStartSyntaxType, this.state.curPosition()); } + this.state.pos += 2; + if (next === 123) { + this.finishToken(7); + } else { + this.finishToken(1); + } + } else if (isIdentifierStart(next)) { + ++this.state.pos; + this.finishToken(138, this.readWord1(next)); + } else if (next === 92) { + ++this.state.pos; + this.finishToken(138, this.readWord1()); + } else { + this.finishOp(27, 1); } - return exprList; } - parseArrayLike(close, canBePattern, isTuple, refExpressionErrors) { - const node = super.parseArrayLike(close, canBePattern, isTuple, refExpressionErrors); - if (canBePattern && !this.state.maybeInArrowParameters) { - this.toReferencedList(node.elements); + readToken_dot() { + const next = this.input.charCodeAt(this.state.pos + 1); + if (next >= 48 && next <= 57) { + this.readNumber(true); + return; } - return node; - } - isValidLVal(type, isParenthesized, binding) { - return type === "TypeCastExpression" || super.isValidLVal(type, isParenthesized, binding); - } - parseClassProperty(node) { - if (this.match(14)) { - node.typeAnnotation = this.flowParseTypeAnnotation(); + if (next === 46 && this.input.charCodeAt(this.state.pos + 2) === 46) { + this.state.pos += 3; + this.finishToken(21); + } else { + ++this.state.pos; + this.finishToken(16); } - return super.parseClassProperty(node); } - parseClassPrivateProperty(node) { - if (this.match(14)) { - node.typeAnnotation = this.flowParseTypeAnnotation(); + readToken_slash() { + const next = this.input.charCodeAt(this.state.pos + 1); + if (next === 61) { + this.finishOp(31, 2); + } else { + this.finishOp(56, 1); } - return super.parseClassPrivateProperty(node); - } - isClassMethod() { - return this.match(47) || super.isClassMethod(); - } - isClassProperty() { - return this.match(14) || super.isClassProperty(); - } - isNonstaticConstructor(method) { - return !this.match(14) && super.isNonstaticConstructor(method); } - pushClassMethod(classBody, method, isGenerator, isAsync, isConstructor, allowsDirectSuper) { - if (method.variance) { - this.unexpected(method.variance.loc.start); - } - delete method.variance; - if (this.match(47)) { - method.typeParameters = this.flowParseTypeParameterDeclaration(); - } - super.pushClassMethod(classBody, method, isGenerator, isAsync, isConstructor, allowsDirectSuper); - if (method.params && isConstructor) { - const params = method.params; - if (params.length > 0 && this.isThisParam(params[0])) { - this.raise(FlowErrors.ThisParamBannedInConstructor, method); - } - } else if (method.type === "MethodDefinition" && isConstructor && method.value.params) { - const params = method.value.params; - if (params.length > 0 && this.isThisParam(params[0])) { - this.raise(FlowErrors.ThisParamBannedInConstructor, method); - } + readToken_interpreter() { + if (this.state.pos !== 0 || this.length < 2) return false; + let ch = this.input.charCodeAt(this.state.pos + 1); + if (ch !== 33) return false; + const start = this.state.pos; + this.state.pos += 1; + while (!isNewLine(ch) && ++this.state.pos < this.length) { + ch = this.input.charCodeAt(this.state.pos); } + const value = this.input.slice(start + 2, this.state.pos); + this.finishToken(28, value); + return true; } - pushClassPrivateMethod(classBody, method, isGenerator, isAsync) { - if (method.variance) { - this.unexpected(method.variance.loc.start); + readToken_mult_modulo(code) { + let type = code === 42 ? 55 : 54; + let width = 1; + let next = this.input.charCodeAt(this.state.pos + 1); + if (code === 42 && next === 42) { + width++; + next = this.input.charCodeAt(this.state.pos + 2); + type = 57; } - delete method.variance; - if (this.match(47)) { - method.typeParameters = this.flowParseTypeParameterDeclaration(); + if (next === 61 && !this.state.inType) { + width++; + type = code === 37 ? 33 : 30; } - super.pushClassPrivateMethod(classBody, method, isGenerator, isAsync); + this.finishOp(type, width); } - parseClassSuper(node) { - super.parseClassSuper(node); - if (node.superClass && (this.match(47) || this.match(51))) { - { - node.superTypeParameters = this.flowParseTypeParameterInstantiationInExpression(); + readToken_pipe_amp(code) { + const next = this.input.charCodeAt(this.state.pos + 1); + if (next === code) { + if (this.input.charCodeAt(this.state.pos + 2) === 61) { + this.finishOp(30, 3); + } else { + this.finishOp(code === 124 ? 41 : 42, 2); } + return; } - if (this.isContextual(113)) { - this.next(); - const implemented = node.implements = []; - do { - const node = this.startNode(); - node.id = this.flowParseRestrictedIdentifier(true); - if (this.match(47)) { - node.typeParameters = this.flowParseTypeParameterInstantiation(); - } else { - node.typeParameters = null; + if (code === 124) { + if (next === 62) { + this.finishOp(39, 2); + return; + } + if (this.hasPlugin("recordAndTuple") && next === 125) { + if (this.getPluginOption("recordAndTuple", "syntaxType") !== "bar") { + throw this.raise(Errors.RecordExpressionBarIncorrectEndSyntaxType, this.state.curPosition()); } - implemented.push(this.finishNode(node, "ClassImplements")); - } while (this.eat(12)); + this.state.pos += 2; + this.finishToken(9); + return; + } + if (this.hasPlugin("recordAndTuple") && next === 93) { + if (this.getPluginOption("recordAndTuple", "syntaxType") !== "bar") { + throw this.raise(Errors.TupleExpressionBarIncorrectEndSyntaxType, this.state.curPosition()); + } + this.state.pos += 2; + this.finishToken(4); + return; + } + } + if (next === 61) { + this.finishOp(30, 2); + return; } + this.finishOp(code === 124 ? 43 : 45, 1); } - checkGetterSetterParams(method) { - super.checkGetterSetterParams(method); - const params = this.getObjectOrClassMethodParams(method); - if (params.length > 0) { - const param = params[0]; - if (this.isThisParam(param) && method.kind === "get") { - this.raise(FlowErrors.GetterMayNotHaveThisParam, param); - } else if (this.isThisParam(param)) { - this.raise(FlowErrors.SetterMayNotHaveThisParam, param); + readToken_caret() { + const next = this.input.charCodeAt(this.state.pos + 1); + if (next === 61 && !this.state.inType) { + this.finishOp(32, 2); + } else if (next === 94 && this.hasPlugin(["pipelineOperator", { + proposal: "hack", + topicToken: "^^" + }])) { + this.finishOp(37, 2); + const lookaheadCh = this.input.codePointAt(this.state.pos); + if (lookaheadCh === 94) { + this.unexpected(); } + } else { + this.finishOp(44, 1); } } - parsePropertyNamePrefixOperator(node) { - node.variance = this.flowParseVariance(); - } - parseObjPropValue(prop, startLoc, isGenerator, isAsync, isPattern, isAccessor, refExpressionErrors) { - if (prop.variance) { - this.unexpected(prop.variance.loc.start); + readToken_atSign() { + const next = this.input.charCodeAt(this.state.pos + 1); + if (next === 64 && this.hasPlugin(["pipelineOperator", { + proposal: "hack", + topicToken: "@@" + }])) { + this.finishOp(38, 2); + } else { + this.finishOp(26, 1); } - delete prop.variance; - let typeParameters; - if (this.match(47) && !isAccessor) { - typeParameters = this.flowParseTypeParameterDeclaration(); - if (!this.match(10)) this.unexpected(); + } + readToken_plus_min(code) { + const next = this.input.charCodeAt(this.state.pos + 1); + if (next === code) { + this.finishOp(34, 2); + return; } - const result = super.parseObjPropValue(prop, startLoc, isGenerator, isAsync, isPattern, isAccessor, refExpressionErrors); - if (typeParameters) { - (result.value || result).typeParameters = typeParameters; + if (next === 61) { + this.finishOp(30, 2); + } else { + this.finishOp(53, 1); } - return result; } - parseFunctionParamType(param) { - if (this.eat(17)) { - if (param.type !== "Identifier") { - this.raise(FlowErrors.PatternIsOptional, param); - } - if (this.isThisParam(param)) { - this.raise(FlowErrors.ThisParamMayNotBeOptional, param); + readToken_lt() { + const { + pos + } = this.state; + const next = this.input.charCodeAt(pos + 1); + if (next === 60) { + if (this.input.charCodeAt(pos + 2) === 61) { + this.finishOp(30, 3); + return; } - param.optional = true; - } - if (this.match(14)) { - param.typeAnnotation = this.flowParseTypeAnnotation(); - } else if (this.isThisParam(param)) { - this.raise(FlowErrors.ThisParamAnnotationRequired, param); + this.finishOp(51, 2); + return; } - if (this.match(29) && this.isThisParam(param)) { - this.raise(FlowErrors.ThisParamNoDefault, param); + if (next === 61) { + this.finishOp(49, 2); + return; } - this.resetEndLocation(param); - return param; + this.finishOp(47, 1); } - parseMaybeDefault(startLoc, left) { - const node = super.parseMaybeDefault(startLoc, left); - if (node.type === "AssignmentPattern" && node.typeAnnotation && node.right.start < node.typeAnnotation.start) { - this.raise(FlowErrors.TypeBeforeInitializer, node.typeAnnotation); + readToken_gt() { + const { + pos + } = this.state; + const next = this.input.charCodeAt(pos + 1); + if (next === 62) { + const size = this.input.charCodeAt(pos + 2) === 62 ? 3 : 2; + if (this.input.charCodeAt(pos + size) === 61) { + this.finishOp(30, size + 1); + return; + } + this.finishOp(52, size); + return; } - return node; - } - checkImportReflection(node) { - super.checkImportReflection(node); - if (node.module && node.importKind !== "value") { - this.raise(FlowErrors.ImportReflectionHasImportType, node.specifiers[0].loc.start); + if (next === 61) { + this.finishOp(49, 2); + return; } + this.finishOp(48, 1); } - parseImportSpecifierLocal(node, specifier, type) { - specifier.local = hasTypeImportKind(node) ? this.flowParseRestrictedIdentifier(true, true) : this.parseIdentifier(); - node.specifiers.push(this.finishImportSpecifier(specifier, type)); - } - isPotentialImportPhase(isExport) { - if (super.isPotentialImportPhase(isExport)) return true; - if (this.isContextual(130)) { - if (!isExport) return true; - const ch = this.lookaheadCharCode(); - return ch === 123 || ch === 42; + readToken_eq_excl(code) { + const next = this.input.charCodeAt(this.state.pos + 1); + if (next === 61) { + this.finishOp(46, this.input.charCodeAt(this.state.pos + 2) === 61 ? 3 : 2); + return; } - return !isExport && this.isContextual(87); - } - applyImportPhase(node, isExport, phase, loc) { - super.applyImportPhase(node, isExport, phase, loc); - if (isExport) { - if (!phase && this.match(65)) { - return; - } - node.exportKind = phase === "type" ? phase : "value"; - } else { - if (phase === "type" && this.match(55)) this.unexpected(); - node.importKind = phase === "type" || phase === "typeof" ? phase : "value"; + if (code === 61 && next === 62) { + this.state.pos += 2; + this.finishToken(19); + return; } + this.finishOp(code === 61 ? 29 : 35, 1); } - parseImportSpecifier(specifier, importedIsString, isInTypeOnlyImport, isMaybeTypeOnly, bindingType) { - const firstIdent = specifier.imported; - let specifierTypeKind = null; - if (firstIdent.type === "Identifier") { - if (firstIdent.name === "type") { - specifierTypeKind = "type"; - } else if (firstIdent.name === "typeof") { - specifierTypeKind = "typeof"; - } - } - let isBinding = false; - if (this.isContextual(93) && !this.isLookaheadContextual("as")) { - const as_ident = this.parseIdentifier(true); - if (specifierTypeKind !== null && !tokenIsKeywordOrIdentifier(this.state.type)) { - specifier.imported = as_ident; - specifier.importKind = specifierTypeKind; - specifier.local = this.cloneIdentifier(as_ident); + readToken_question() { + const next = this.input.charCodeAt(this.state.pos + 1); + const next2 = this.input.charCodeAt(this.state.pos + 2); + if (next === 63) { + if (next2 === 61) { + this.finishOp(30, 3); } else { - specifier.imported = firstIdent; - specifier.importKind = null; - specifier.local = this.parseIdentifier(); + this.finishOp(40, 2); } + } else if (next === 46 && !(next2 >= 48 && next2 <= 57)) { + this.state.pos += 2; + this.finishToken(18); } else { - if (specifierTypeKind !== null && tokenIsKeywordOrIdentifier(this.state.type)) { - specifier.imported = this.parseIdentifier(true); - specifier.importKind = specifierTypeKind; - } else { - if (importedIsString) { - throw this.raise(Errors.ImportBindingIsString, specifier, { - importName: firstIdent.value - }); - } - specifier.imported = firstIdent; - specifier.importKind = null; - } - if (this.eatContextual(93)) { - specifier.local = this.parseIdentifier(); - } else { - isBinding = true; - specifier.local = this.cloneIdentifier(specifier.imported); - } - } - const specifierIsTypeImport = hasTypeImportKind(specifier); - if (isInTypeOnlyImport && specifierIsTypeImport) { - this.raise(FlowErrors.ImportTypeShorthandOnlyInPureImport, specifier); - } - if (isInTypeOnlyImport || specifierIsTypeImport) { - this.checkReservedType(specifier.local.name, specifier.local.loc.start, true); - } - if (isBinding && !isInTypeOnlyImport && !specifierIsTypeImport) { - this.checkReservedWord(specifier.local.name, specifier.loc.start, true, true); - } - return this.finishImportSpecifier(specifier, "ImportSpecifier"); - } - parseBindingAtom() { - switch (this.state.type) { - case 78: - return this.parseIdentifier(true); - default: - return super.parseBindingAtom(); - } - } - parseFunctionParams(node, isConstructor) { - const kind = node.kind; - if (kind !== "get" && kind !== "set" && this.match(47)) { - node.typeParameters = this.flowParseTypeParameterDeclaration(); - } - super.parseFunctionParams(node, isConstructor); - } - parseVarId(decl, kind) { - super.parseVarId(decl, kind); - if (this.match(14)) { - decl.id.typeAnnotation = this.flowParseTypeAnnotation(); - this.resetEndLocation(decl.id); - } - } - parseAsyncArrowFromCallExpression(node, call) { - if (this.match(14)) { - const oldNoAnonFunctionType = this.state.noAnonFunctionType; - this.state.noAnonFunctionType = true; - node.returnType = this.flowParseTypeAnnotation(); - this.state.noAnonFunctionType = oldNoAnonFunctionType; + ++this.state.pos; + this.finishToken(17); } - return super.parseAsyncArrowFromCallExpression(node, call); - } - shouldParseAsyncArrow() { - return this.match(14) || super.shouldParseAsyncArrow(); } - parseMaybeAssign(refExpressionErrors, afterLeftParse) { - var _jsx; - let state = null; - let jsx; - if (this.hasPlugin("jsx") && (this.match(143) || this.match(47))) { - state = this.state.clone(); - jsx = this.tryParse(() => super.parseMaybeAssign(refExpressionErrors, afterLeftParse), state); - if (!jsx.error) return jsx.node; - const { - context - } = this.state; - const currentContext = context[context.length - 1]; - if (currentContext === types.j_oTag || currentContext === types.j_expr) { - context.pop(); - } - } - if ((_jsx = jsx) != null && _jsx.error || this.match(47)) { - var _jsx2, _jsx3; - state = state || this.state.clone(); - let typeParameters; - const arrow = this.tryParse(abort => { - var _arrowExpression$extr; - typeParameters = this.flowParseTypeParameterDeclaration(); - const arrowExpression = this.forwardNoArrowParamsConversionAt(typeParameters, () => { - const result = super.parseMaybeAssign(refExpressionErrors, afterLeftParse); - this.resetStartLocationFromNode(result, typeParameters); - return result; - }); - if ((_arrowExpression$extr = arrowExpression.extra) != null && _arrowExpression$extr.parenthesized) abort(); - const expr = this.maybeUnwrapTypeCastExpression(arrowExpression); - if (expr.type !== "ArrowFunctionExpression") abort(); - expr.typeParameters = typeParameters; - this.resetStartLocationFromNode(expr, typeParameters); - return arrowExpression; - }, state); - let arrowExpression = null; - if (arrow.node && this.maybeUnwrapTypeCastExpression(arrow.node).type === "ArrowFunctionExpression") { - if (!arrow.error && !arrow.aborted) { - if (arrow.node.async) { - this.raise(FlowErrors.UnexpectedTypeParameterBeforeAsyncArrowFunction, typeParameters); + getTokenFromCode(code) { + switch (code) { + case 46: + this.readToken_dot(); + return; + case 40: + ++this.state.pos; + this.finishToken(10); + return; + case 41: + ++this.state.pos; + this.finishToken(11); + return; + case 59: + ++this.state.pos; + this.finishToken(13); + return; + case 44: + ++this.state.pos; + this.finishToken(12); + return; + case 91: + if (this.hasPlugin("recordAndTuple") && this.input.charCodeAt(this.state.pos + 1) === 124) { + if (this.getPluginOption("recordAndTuple", "syntaxType") !== "bar") { + throw this.raise(Errors.TupleExpressionBarIncorrectStartSyntaxType, this.state.curPosition()); } - return arrow.node; + this.state.pos += 2; + this.finishToken(2); + } else { + ++this.state.pos; + this.finishToken(0); + } + return; + case 93: + ++this.state.pos; + this.finishToken(3); + return; + case 123: + if (this.hasPlugin("recordAndTuple") && this.input.charCodeAt(this.state.pos + 1) === 124) { + if (this.getPluginOption("recordAndTuple", "syntaxType") !== "bar") { + throw this.raise(Errors.RecordExpressionBarIncorrectStartSyntaxType, this.state.curPosition()); + } + this.state.pos += 2; + this.finishToken(6); + } else { + ++this.state.pos; + this.finishToken(5); + } + return; + case 125: + ++this.state.pos; + this.finishToken(8); + return; + case 58: + if (this.hasPlugin("functionBind") && this.input.charCodeAt(this.state.pos + 1) === 58) { + this.finishOp(15, 2); + } else { + ++this.state.pos; + this.finishToken(14); + } + return; + case 63: + this.readToken_question(); + return; + case 96: + this.readTemplateToken(); + return; + case 48: + { + const next = this.input.charCodeAt(this.state.pos + 1); + if (next === 120 || next === 88) { + this.readRadixNumber(16); + return; + } + if (next === 111 || next === 79) { + this.readRadixNumber(8); + return; + } + if (next === 98 || next === 66) { + this.readRadixNumber(2); + return; + } + } + case 49: + case 50: + case 51: + case 52: + case 53: + case 54: + case 55: + case 56: + case 57: + this.readNumber(false); + return; + case 34: + case 39: + this.readString(code); + return; + case 47: + this.readToken_slash(); + return; + case 37: + case 42: + this.readToken_mult_modulo(code); + return; + case 124: + case 38: + this.readToken_pipe_amp(code); + return; + case 94: + this.readToken_caret(); + return; + case 43: + case 45: + this.readToken_plus_min(code); + return; + case 60: + this.readToken_lt(); + return; + case 62: + this.readToken_gt(); + return; + case 61: + case 33: + this.readToken_eq_excl(code); + return; + case 126: + this.finishOp(36, 1); + return; + case 64: + this.readToken_atSign(); + return; + case 35: + this.readToken_numberSign(); + return; + case 92: + this.readWord(); + return; + default: + if (isIdentifierStart(code)) { + this.readWord(code); + return; } - arrowExpression = arrow.node; - } - if ((_jsx2 = jsx) != null && _jsx2.node) { - this.state = jsx.failState; - return jsx.node; - } - if (arrowExpression) { - this.state = arrow.failState; - return arrowExpression; - } - if ((_jsx3 = jsx) != null && _jsx3.thrown) throw jsx.error; - if (arrow.thrown) throw arrow.error; - throw this.raise(FlowErrors.UnexpectedTokenAfterTypeParameter, typeParameters); - } - return super.parseMaybeAssign(refExpressionErrors, afterLeftParse); - } - parseArrow(node) { - if (this.match(14)) { - const result = this.tryParse(() => { - const oldNoAnonFunctionType = this.state.noAnonFunctionType; - this.state.noAnonFunctionType = true; - const typeNode = this.startNode(); - [typeNode.typeAnnotation, node.predicate] = this.flowParseTypeAndPredicateInitialiser(); - this.state.noAnonFunctionType = oldNoAnonFunctionType; - if (this.canInsertSemicolon()) this.unexpected(); - if (!this.match(19)) this.unexpected(); - return typeNode; - }); - if (result.thrown) return null; - if (result.error) this.state = result.failState; - node.returnType = result.node.typeAnnotation ? this.finishNode(result.node, "TypeAnnotation") : null; } - return super.parseArrow(node); - } - shouldParseArrow(params) { - return this.match(14) || super.shouldParseArrow(params); + throw this.raise(Errors.InvalidOrUnexpectedToken, this.state.curPosition(), { + unexpected: String.fromCodePoint(code) + }); } - setArrowFunctionParameters(node, params) { - if (this.state.noArrowParamsConversionAt.includes(this.offsetToSourcePos(node.start))) { - node.params = params; - } else { - super.setArrowFunctionParameters(node, params); - } + finishOp(type, size) { + const str = this.input.slice(this.state.pos, this.state.pos + size); + this.state.pos += size; + this.finishToken(type, str); } - checkParams(node, allowDuplicates, isArrowFunction, strictModeChanged = true) { - if (isArrowFunction && this.state.noArrowParamsConversionAt.includes(this.offsetToSourcePos(node.start))) { - return; - } - for (let i = 0; i < node.params.length; i++) { - if (this.isThisParam(node.params[i]) && i > 0) { - this.raise(FlowErrors.ThisParamMustBeFirst, node.params[i]); + readRegexp() { + const startLoc = this.state.startLoc; + const start = this.state.start + 1; + let escaped, inClass; + let { + pos + } = this.state; + for (;; ++pos) { + if (pos >= this.length) { + throw this.raise(Errors.UnterminatedRegExp, createPositionWithColumnOffset(startLoc, 1)); } - } - super.checkParams(node, allowDuplicates, isArrowFunction, strictModeChanged); - } - parseParenAndDistinguishExpression(canBeArrow) { - return super.parseParenAndDistinguishExpression(canBeArrow && !this.state.noArrowAt.includes(this.sourceToOffsetPos(this.state.start))); - } - parseSubscripts(base, startLoc, noCalls) { - if (base.type === "Identifier" && base.name === "async" && this.state.noArrowAt.includes(startLoc.index)) { - this.next(); - const node = this.startNodeAt(startLoc); - node.callee = base; - node.arguments = super.parseCallExpressionArguments(); - base = this.finishNode(node, "CallExpression"); - } else if (base.type === "Identifier" && base.name === "async" && this.match(47)) { - const state = this.state.clone(); - const arrow = this.tryParse(abort => this.parseAsyncArrowWithTypeParameters(startLoc) || abort(), state); - if (!arrow.error && !arrow.aborted) return arrow.node; - const result = this.tryParse(() => super.parseSubscripts(base, startLoc, noCalls), state); - if (result.node && !result.error) return result.node; - if (arrow.node) { - this.state = arrow.failState; - return arrow.node; + const ch = this.input.charCodeAt(pos); + if (isNewLine(ch)) { + throw this.raise(Errors.UnterminatedRegExp, createPositionWithColumnOffset(startLoc, 1)); } - if (result.node) { - this.state = result.failState; - return result.node; + if (escaped) { + escaped = false; + } else { + if (ch === 91) { + inClass = true; + } else if (ch === 93 && inClass) { + inClass = false; + } else if (ch === 47 && !inClass) { + break; + } + escaped = ch === 92; } - throw arrow.error || result.error; } - return super.parseSubscripts(base, startLoc, noCalls); - } - parseSubscript(base, startLoc, noCalls, subscriptState) { - if (this.match(18) && this.isLookaheadToken_lt()) { - subscriptState.optionalChainMember = true; - if (noCalls) { - subscriptState.stop = true; - return base; - } - this.next(); - const node = this.startNodeAt(startLoc); - node.callee = base; - node.typeArguments = this.flowParseTypeParameterInstantiationInExpression(); - this.expect(10); - node.arguments = this.parseCallExpressionArguments(); - node.optional = true; - return this.finishCallExpression(node, true); - } else if (!noCalls && this.shouldParseTypes() && (this.match(47) || this.match(51))) { - const node = this.startNodeAt(startLoc); - node.callee = base; - const result = this.tryParse(() => { - node.typeArguments = this.flowParseTypeParameterInstantiationCallOrNew(); - this.expect(10); - node.arguments = super.parseCallExpressionArguments(); - if (subscriptState.optionalChainMember) { - node.optional = false; + const content = this.input.slice(start, pos); + ++pos; + let mods = ""; + const nextPos = () => createPositionWithColumnOffset(startLoc, pos + 2 - start); + while (pos < this.length) { + const cp = this.codePointAtPos(pos); + const char = String.fromCharCode(cp); + if (VALID_REGEX_FLAGS.has(cp)) { + if (cp === 118) { + if (mods.includes("u")) { + this.raise(Errors.IncompatibleRegExpUVFlags, nextPos()); + } + } else if (cp === 117) { + if (mods.includes("v")) { + this.raise(Errors.IncompatibleRegExpUVFlags, nextPos()); + } } - return this.finishCallExpression(node, subscriptState.optionalChainMember); - }); - if (result.node) { - if (result.error) this.state = result.failState; - return result.node; + if (mods.includes(char)) { + this.raise(Errors.DuplicateRegExpFlags, nextPos()); + } + } else if (isIdentifierChar(cp) || cp === 92) { + this.raise(Errors.MalformedRegExpFlags, nextPos()); + } else { + break; } + ++pos; + mods += char; } - return super.parseSubscript(base, startLoc, noCalls, subscriptState); - } - parseNewCallee(node) { - super.parseNewCallee(node); - let targs = null; - if (this.shouldParseTypes() && this.match(47)) { - targs = this.tryParse(() => this.flowParseTypeParameterInstantiationCallOrNew()).node; - } - node.typeArguments = targs; + this.state.pos = pos; + this.finishToken(137, { + pattern: content, + flags: mods + }); } - parseAsyncArrowWithTypeParameters(startLoc) { - const node = this.startNodeAt(startLoc); - this.parseFunctionParams(node, false); - if (!this.parseArrow(node)) return; - return super.parseArrowExpression(node, undefined, true); + readInt(radix, len, forceLen = false, allowNumSeparator = true) { + const { + n, + pos + } = readInt(this.input, this.state.pos, this.state.lineStart, this.state.curLine, radix, len, forceLen, allowNumSeparator, this.errorHandlers_readInt, false); + this.state.pos = pos; + return n; } - readToken_mult_modulo(code) { - const next = this.input.charCodeAt(this.state.pos + 1); - if (code === 42 && next === 47 && this.state.hasFlowComment) { - this.state.hasFlowComment = false; - this.state.pos += 2; - this.nextToken(); - return; + readRadixNumber(radix) { + const startLoc = this.state.curPosition(); + let isBigInt = false; + this.state.pos += 2; + const val = this.readInt(radix); + if (val == null) { + this.raise(Errors.InvalidDigit, createPositionWithColumnOffset(startLoc, 2), { + radix + }); } - super.readToken_mult_modulo(code); - } - readToken_pipe_amp(code) { - const next = this.input.charCodeAt(this.state.pos + 1); - if (code === 124 && next === 125) { - this.finishOp(9, 2); + const next = this.input.charCodeAt(this.state.pos); + if (next === 110) { + ++this.state.pos; + isBigInt = true; + } else if (next === 109) { + throw this.raise(Errors.InvalidDecimal, startLoc); + } + if (isIdentifierStart(this.codePointAtPos(this.state.pos))) { + throw this.raise(Errors.NumberIdentifier, this.state.curPosition()); + } + if (isBigInt) { + const str = this.input.slice(startLoc.index, this.state.pos).replace(/[_n]/g, ""); + this.finishToken(135, str); return; } - super.readToken_pipe_amp(code); + this.finishToken(134, val); } - parseTopLevel(file, program) { - const fileNode = super.parseTopLevel(file, program); - if (this.state.hasFlowComment) { - this.raise(FlowErrors.UnterminatedFlowComment, this.state.curPosition()); + readNumber(startsWithDot) { + const start = this.state.pos; + const startLoc = this.state.curPosition(); + let isFloat = false; + let isBigInt = false; + let isDecimal = false; + let hasExponent = false; + let isOctal = false; + if (!startsWithDot && this.readInt(10) === null) { + this.raise(Errors.InvalidNumber, this.state.curPosition()); } - return fileNode; - } - skipBlockComment() { - if (this.hasPlugin("flowComments") && this.skipFlowComment()) { - if (this.state.hasFlowComment) { - throw this.raise(FlowErrors.NestedFlowComment, this.state.startLoc); + const hasLeadingZero = this.state.pos - start >= 2 && this.input.charCodeAt(start) === 48; + if (hasLeadingZero) { + const integer = this.input.slice(start, this.state.pos); + this.recordStrictModeErrors(Errors.StrictOctalLiteral, startLoc); + if (!this.state.strict) { + const underscorePos = integer.indexOf("_"); + if (underscorePos > 0) { + this.raise(Errors.ZeroDigitNumericSeparator, createPositionWithColumnOffset(startLoc, underscorePos)); + } } - this.hasFlowCommentCompletion(); - const commentSkip = this.skipFlowComment(); - if (commentSkip) { - this.state.pos += commentSkip; - this.state.hasFlowComment = true; + isOctal = hasLeadingZero && !/[89]/.test(integer); + } + let next = this.input.charCodeAt(this.state.pos); + if (next === 46 && !isOctal) { + ++this.state.pos; + this.readInt(10); + isFloat = true; + next = this.input.charCodeAt(this.state.pos); + } + if ((next === 69 || next === 101) && !isOctal) { + next = this.input.charCodeAt(++this.state.pos); + if (next === 43 || next === 45) { + ++this.state.pos; + } + if (this.readInt(10) === null) { + this.raise(Errors.InvalidOrMissingExponent, startLoc); + } + isFloat = true; + hasExponent = true; + next = this.input.charCodeAt(this.state.pos); + } + if (next === 110) { + if (isFloat || hasLeadingZero) { + this.raise(Errors.InvalidBigIntLiteral, startLoc); + } + ++this.state.pos; + isBigInt = true; + } + if (next === 109) { + this.expectPlugin("decimal", this.state.curPosition()); + if (hasExponent || hasLeadingZero) { + this.raise(Errors.InvalidDecimal, startLoc); } + ++this.state.pos; + isDecimal = true; + } + if (isIdentifierStart(this.codePointAtPos(this.state.pos))) { + throw this.raise(Errors.NumberIdentifier, this.state.curPosition()); + } + const str = this.input.slice(start, this.state.pos).replace(/[_mn]/g, ""); + if (isBigInt) { + this.finishToken(135, str); return; } - return super.skipBlockComment(this.state.hasFlowComment ? "*-/" : "*/"); + if (isDecimal) { + this.finishToken(136, str); + return; + } + const val = isOctal ? parseInt(str, 8) : parseFloat(str); + this.finishToken(134, val); } - skipFlowComment() { + readCodePoint(throwOnInvalid) { const { + code, pos - } = this.state; - let shiftToFirstNonWhiteSpace = 2; - while ([32, 9].includes(this.input.charCodeAt(pos + shiftToFirstNonWhiteSpace))) { - shiftToFirstNonWhiteSpace++; + } = readCodePoint(this.input, this.state.pos, this.state.lineStart, this.state.curLine, throwOnInvalid, this.errorHandlers_readCodePoint); + this.state.pos = pos; + return code; + } + readString(quote) { + const { + str, + pos, + curLine, + lineStart + } = readStringContents(quote === 34 ? "double" : "single", this.input, this.state.pos + 1, this.state.lineStart, this.state.curLine, this.errorHandlers_readStringContents_string); + this.state.pos = pos + 1; + this.state.lineStart = lineStart; + this.state.curLine = curLine; + this.finishToken(133, str); + } + readTemplateContinuation() { + if (!this.match(8)) { + this.unexpected(null, 8); } - const ch2 = this.input.charCodeAt(shiftToFirstNonWhiteSpace + pos); - const ch3 = this.input.charCodeAt(shiftToFirstNonWhiteSpace + pos + 1); - if (ch2 === 58 && ch3 === 58) { - return shiftToFirstNonWhiteSpace + 2; + this.state.pos--; + this.readTemplateToken(); + } + readTemplateToken() { + const opening = this.input[this.state.pos]; + const { + str, + firstInvalidLoc, + pos, + curLine, + lineStart + } = readStringContents("template", this.input, this.state.pos + 1, this.state.lineStart, this.state.curLine, this.errorHandlers_readStringContents_template); + this.state.pos = pos + 1; + this.state.lineStart = lineStart; + this.state.curLine = curLine; + if (firstInvalidLoc) { + this.state.firstInvalidTemplateEscapePos = new Position(firstInvalidLoc.curLine, firstInvalidLoc.pos - firstInvalidLoc.lineStart, firstInvalidLoc.pos); } - if (this.input.slice(shiftToFirstNonWhiteSpace + pos, shiftToFirstNonWhiteSpace + pos + 12) === "flow-include") { - return shiftToFirstNonWhiteSpace + 12; + if (this.input.codePointAt(pos) === 96) { + this.finishToken(24, firstInvalidLoc ? null : opening + str + "`"); + } else { + this.state.pos++; + this.finishToken(25, firstInvalidLoc ? null : opening + str + "${"); } - if (ch2 === 58 && ch3 !== 58) { - return shiftToFirstNonWhiteSpace; + } + recordStrictModeErrors(toParseError, at) { + const index = at.index; + if (this.state.strict && !this.state.strictErrors.has(index)) { + this.raise(toParseError, at); + } else { + this.state.strictErrors.set(index, [toParseError, at]); } - return false; } - hasFlowCommentCompletion() { - const end = this.input.indexOf("*/", this.state.pos); - if (end === -1) { - throw this.raise(Errors.UnterminatedComment, this.state.curPosition()); + readWord1(firstCode) { + this.state.containsEsc = false; + let word = ""; + const start = this.state.pos; + let chunkStart = this.state.pos; + if (firstCode !== undefined) { + this.state.pos += firstCode <= 0xffff ? 1 : 2; + } + while (this.state.pos < this.length) { + const ch = this.codePointAtPos(this.state.pos); + if (isIdentifierChar(ch)) { + this.state.pos += ch <= 0xffff ? 1 : 2; + } else if (ch === 92) { + this.state.containsEsc = true; + word += this.input.slice(chunkStart, this.state.pos); + const escStart = this.state.curPosition(); + const identifierCheck = this.state.pos === start ? isIdentifierStart : isIdentifierChar; + if (this.input.charCodeAt(++this.state.pos) !== 117) { + this.raise(Errors.MissingUnicodeEscape, this.state.curPosition()); + chunkStart = this.state.pos - 1; + continue; + } + ++this.state.pos; + const esc = this.readCodePoint(true); + if (esc !== null) { + if (!identifierCheck(esc)) { + this.raise(Errors.EscapedCharNotAnIdentifier, escStart); + } + word += String.fromCodePoint(esc); + } + chunkStart = this.state.pos; + } else { + break; + } } + return word + this.input.slice(chunkStart, this.state.pos); } - flowEnumErrorBooleanMemberNotInitialized(loc, { - enumName, - memberName - }) { - this.raise(FlowErrors.EnumBooleanMemberNotInitialized, loc, { - memberName, - enumName - }); + readWord(firstCode) { + const word = this.readWord1(firstCode); + const type = keywords$1.get(word); + if (type !== undefined) { + this.finishToken(type, tokenLabelName(type)); + } else { + this.finishToken(132, word); + } } - flowEnumErrorInvalidMemberInitializer(loc, enumContext) { - return this.raise(!enumContext.explicitType ? FlowErrors.EnumInvalidMemberInitializerUnknownType : enumContext.explicitType === "symbol" ? FlowErrors.EnumInvalidMemberInitializerSymbolType : FlowErrors.EnumInvalidMemberInitializerPrimaryType, loc, enumContext); - } - flowEnumErrorNumberMemberNotInitialized(loc, details) { - this.raise(FlowErrors.EnumNumberMemberNotInitialized, loc, details); + checkKeywordEscapes() { + const { + type + } = this.state; + if (tokenIsKeyword(type) && this.state.containsEsc) { + this.raise(Errors.InvalidEscapedReservedWord, this.state.startLoc, { + reservedWord: tokenLabelName(type) + }); + } } - flowEnumErrorStringMemberInconsistentlyInitialized(node, details) { - this.raise(FlowErrors.EnumStringMemberInconsistentlyInitialized, node, details); + raise(toParseError, at, details = {}) { + const loc = at instanceof Position ? at : at.loc.start; + const error = toParseError(loc, details); + if (!this.options.errorRecovery) throw error; + if (!this.isLookahead) this.state.errors.push(error); + return error; } - flowEnumMemberInit() { - const startLoc = this.state.startLoc; - const endOfInit = () => this.match(12) || this.match(8); - switch (this.state.type) { - case 135: - { - const literal = this.parseNumericLiteral(this.state.value); - if (endOfInit()) { - return { - type: "number", - loc: literal.loc.start, - value: literal - }; - } - return { - type: "invalid", - loc: startLoc - }; - } - case 134: - { - const literal = this.parseStringLiteral(this.state.value); - if (endOfInit()) { - return { - type: "string", - loc: literal.loc.start, - value: literal - }; - } - return { - type: "invalid", - loc: startLoc - }; - } - case 85: - case 86: - { - const literal = this.parseBooleanLiteral(this.match(85)); - if (endOfInit()) { - return { - type: "boolean", - loc: literal.loc.start, - value: literal - }; - } - return { - type: "invalid", - loc: startLoc - }; - } - default: - return { - type: "invalid", - loc: startLoc - }; + raiseOverwrite(toParseError, at, details = {}) { + const loc = at instanceof Position ? at : at.loc.start; + const pos = loc.index; + const errors = this.state.errors; + for (let i = errors.length - 1; i >= 0; i--) { + const error = errors[i]; + if (error.loc.index === pos) { + return errors[i] = toParseError(loc, details); + } + if (error.loc.index < pos) break; } + return this.raise(toParseError, at, details); } - flowEnumMemberRaw() { - const loc = this.state.startLoc; - const id = this.parseIdentifier(true); - const init = this.eat(29) ? this.flowEnumMemberInit() : { - type: "none", - loc - }; - return { - id, - init - }; + updateContext(prevType) {} + unexpected(loc, type) { + throw this.raise(Errors.UnexpectedToken, loc != null ? loc : this.state.startLoc, { + expected: type ? tokenLabelName(type) : null + }); } - flowEnumCheckExplicitTypeMismatch(loc, context, expectedType) { - const { - explicitType - } = context; - if (explicitType === null) { - return; + expectPlugin(pluginName, loc) { + if (this.hasPlugin(pluginName)) { + return true; } - if (explicitType !== expectedType) { - this.flowEnumErrorInvalidMemberInitializer(loc, context); + throw this.raise(Errors.MissingPlugin, loc != null ? loc : this.state.startLoc, { + missingPlugin: [pluginName] + }); + } + expectOnePlugin(pluginNames) { + if (!pluginNames.some(name => this.hasPlugin(name))) { + throw this.raise(Errors.MissingOneOfPlugins, this.state.startLoc, { + missingPlugin: pluginNames + }); } } - flowEnumMembers({ - enumName, - explicitType - }) { - const seenNames = new Set(); - const members = { - booleanMembers: [], - numberMembers: [], - stringMembers: [], - defaultedMembers: [] + errorBuilder(error) { + return (pos, lineStart, curLine) => { + this.raise(error, buildPosition(pos, lineStart, curLine)); }; - let hasUnknownMembers = false; - while (!this.match(8)) { - if (this.eat(21)) { - hasUnknownMembers = true; - break; - } - const memberNode = this.startNode(); - const { - id, - init - } = this.flowEnumMemberRaw(); - const memberName = id.name; - if (memberName === "") { - continue; - } - if (/^[a-z]/.test(memberName)) { - this.raise(FlowErrors.EnumInvalidMemberName, id, { - memberName, - suggestion: memberName[0].toUpperCase() + memberName.slice(1), - enumName - }); - } - if (seenNames.has(memberName)) { - this.raise(FlowErrors.EnumDuplicateMemberName, id, { - memberName, - enumName + } +} +class ClassScope { + constructor() { + this.privateNames = new Set(); + this.loneAccessors = new Map(); + this.undefinedPrivateNames = new Map(); + } +} +class ClassScopeHandler { + constructor(parser) { + this.parser = void 0; + this.stack = []; + this.undefinedPrivateNames = new Map(); + this.parser = parser; + } + current() { + return this.stack[this.stack.length - 1]; + } + enter() { + this.stack.push(new ClassScope()); + } + exit() { + const oldClassScope = this.stack.pop(); + const current = this.current(); + for (const [name, loc] of Array.from(oldClassScope.undefinedPrivateNames)) { + if (current) { + if (!current.undefinedPrivateNames.has(name)) { + current.undefinedPrivateNames.set(name, loc); + } + } else { + this.parser.raise(Errors.InvalidPrivateFieldResolution, loc, { + identifierName: name }); } - seenNames.add(memberName); - const context = { - enumName, - explicitType, - memberName - }; - memberNode.id = id; - switch (init.type) { - case "boolean": - { - this.flowEnumCheckExplicitTypeMismatch(init.loc, context, "boolean"); - memberNode.init = init.value; - members.booleanMembers.push(this.finishNode(memberNode, "EnumBooleanMember")); - break; - } - case "number": - { - this.flowEnumCheckExplicitTypeMismatch(init.loc, context, "number"); - memberNode.init = init.value; - members.numberMembers.push(this.finishNode(memberNode, "EnumNumberMember")); - break; - } - case "string": - { - this.flowEnumCheckExplicitTypeMismatch(init.loc, context, "string"); - memberNode.init = init.value; - members.stringMembers.push(this.finishNode(memberNode, "EnumStringMember")); - break; - } - case "invalid": - { - throw this.flowEnumErrorInvalidMemberInitializer(init.loc, context); - } - case "none": - { - switch (explicitType) { - case "boolean": - this.flowEnumErrorBooleanMemberNotInitialized(init.loc, context); - break; - case "number": - this.flowEnumErrorNumberMemberNotInitialized(init.loc, context); - break; - default: - members.defaultedMembers.push(this.finishNode(memberNode, "EnumDefaultedMember")); - } - } - } - if (!this.match(8)) { - this.expect(12); - } } - return { - members, - hasUnknownMembers - }; } - flowEnumStringMembers(initializedMembers, defaultedMembers, { - enumName - }) { - if (initializedMembers.length === 0) { - return defaultedMembers; - } else if (defaultedMembers.length === 0) { - return initializedMembers; - } else if (defaultedMembers.length > initializedMembers.length) { - for (const member of initializedMembers) { - this.flowEnumErrorStringMemberInconsistentlyInitialized(member, { - enumName - }); - } - return defaultedMembers; - } else { - for (const member of defaultedMembers) { - this.flowEnumErrorStringMemberInconsistentlyInitialized(member, { - enumName - }); + declarePrivateName(name, elementType, loc) { + const { + privateNames, + loneAccessors, + undefinedPrivateNames + } = this.current(); + let redefined = privateNames.has(name); + if (elementType & 3) { + const accessor = redefined && loneAccessors.get(name); + if (accessor) { + const oldStatic = accessor & 4; + const newStatic = elementType & 4; + const oldKind = accessor & 3; + const newKind = elementType & 3; + redefined = oldKind === newKind || oldStatic !== newStatic; + if (!redefined) loneAccessors.delete(name); + } else if (!redefined) { + loneAccessors.set(name, elementType); } - return initializedMembers; } - } - flowEnumParseExplicitType({ - enumName - }) { - if (!this.eatContextual(102)) return null; - if (!tokenIsIdentifier(this.state.type)) { - throw this.raise(FlowErrors.EnumInvalidExplicitTypeUnknownSupplied, this.state.startLoc, { - enumName + if (redefined) { + this.parser.raise(Errors.PrivateNameRedeclaration, loc, { + identifierName: name }); } - const { - value - } = this.state; - this.next(); - if (value !== "boolean" && value !== "number" && value !== "string" && value !== "symbol") { - this.raise(FlowErrors.EnumInvalidExplicitType, this.state.startLoc, { - enumName, - invalidEnumType: value + privateNames.add(name); + undefinedPrivateNames.delete(name); + } + usePrivateName(name, loc) { + let classScope; + for (classScope of this.stack) { + if (classScope.privateNames.has(name)) return; + } + if (classScope) { + classScope.undefinedPrivateNames.set(name, loc); + } else { + this.parser.raise(Errors.InvalidPrivateFieldResolution, loc, { + identifierName: name }); } - return value; } - flowEnumBody(node, id) { - const enumName = id.name; - const nameLoc = id.loc.start; - const explicitType = this.flowEnumParseExplicitType({ - enumName - }); - this.expect(5); - const { - members, - hasUnknownMembers - } = this.flowEnumMembers({ - enumName, - explicitType - }); - node.hasUnknownMembers = hasUnknownMembers; - switch (explicitType) { - case "boolean": - node.explicitType = true; - node.members = members.booleanMembers; - this.expect(8); - return this.finishNode(node, "EnumBooleanBody"); - case "number": - node.explicitType = true; - node.members = members.numberMembers; - this.expect(8); - return this.finishNode(node, "EnumNumberBody"); - case "string": - node.explicitType = true; - node.members = this.flowEnumStringMembers(members.stringMembers, members.defaultedMembers, { - enumName - }); - this.expect(8); - return this.finishNode(node, "EnumStringBody"); - case "symbol": - node.members = members.defaultedMembers; - this.expect(8); - return this.finishNode(node, "EnumSymbolBody"); - default: - { - const empty = () => { - node.members = []; - this.expect(8); - return this.finishNode(node, "EnumStringBody"); - }; - node.explicitType = false; - const boolsLen = members.booleanMembers.length; - const numsLen = members.numberMembers.length; - const strsLen = members.stringMembers.length; - const defaultedLen = members.defaultedMembers.length; - if (!boolsLen && !numsLen && !strsLen && !defaultedLen) { - return empty(); - } else if (!boolsLen && !numsLen) { - node.members = this.flowEnumStringMembers(members.stringMembers, members.defaultedMembers, { - enumName - }); - this.expect(8); - return this.finishNode(node, "EnumStringBody"); - } else if (!numsLen && !strsLen && boolsLen >= defaultedLen) { - for (const member of members.defaultedMembers) { - this.flowEnumErrorBooleanMemberNotInitialized(member.loc.start, { - enumName, - memberName: member.id.name - }); - } - node.members = members.booleanMembers; - this.expect(8); - return this.finishNode(node, "EnumBooleanBody"); - } else if (!boolsLen && !strsLen && numsLen >= defaultedLen) { - for (const member of members.defaultedMembers) { - this.flowEnumErrorNumberMemberNotInitialized(member.loc.start, { - enumName, - memberName: member.id.name - }); - } - node.members = members.numberMembers; - this.expect(8); - return this.finishNode(node, "EnumNumberBody"); - } else { - this.raise(FlowErrors.EnumInconsistentMemberValues, nameLoc, { - enumName - }); - return empty(); - } - } - } +} +class ExpressionScope { + constructor(type = 0) { + this.type = type; } - flowParseEnumDeclaration(node) { - const id = this.parseIdentifier(); - node.id = id; - node.body = this.flowEnumBody(this.startNode(), id); - return this.finishNode(node, "EnumDeclaration"); + canBeArrowParameterDeclaration() { + return this.type === 2 || this.type === 1; } - jsxParseOpeningElementAfterName(node) { - if (this.shouldParseTypes()) { - if (this.match(47) || this.match(51)) { - node.typeArguments = this.flowParseTypeParameterInstantiationInExpression(); - } - } - return super.jsxParseOpeningElementAfterName(node); + isCertainlyParameterDeclaration() { + return this.type === 3; } - isLookaheadToken_lt() { - const next = this.nextTokenStart(); - if (this.input.charCodeAt(next) === 60) { - const afterNext = this.input.charCodeAt(next + 1); - return afterNext !== 60 && afterNext !== 61; - } - return false; +} +class ArrowHeadParsingScope extends ExpressionScope { + constructor(type) { + super(type); + this.declarationErrors = new Map(); } - reScan_lt_gt() { + recordDeclarationError(ParsingErrorClass, at) { + const index = at.index; + this.declarationErrors.set(index, [ParsingErrorClass, at]); + } + clearDeclarationError(index) { + this.declarationErrors.delete(index); + } + iterateErrors(iterator) { + this.declarationErrors.forEach(iterator); + } +} +class ExpressionScopeHandler { + constructor(parser) { + this.parser = void 0; + this.stack = [new ExpressionScope()]; + this.parser = parser; + } + enter(scope) { + this.stack.push(scope); + } + exit() { + this.stack.pop(); + } + recordParameterInitializerError(toParseError, node) { + const origin = node.loc.start; const { - type - } = this.state; - if (type === 47) { - this.state.pos -= 1; - this.readToken_lt(); - } else if (type === 48) { - this.state.pos -= 1; - this.readToken_gt(); + stack + } = this; + let i = stack.length - 1; + let scope = stack[i]; + while (!scope.isCertainlyParameterDeclaration()) { + if (scope.canBeArrowParameterDeclaration()) { + scope.recordDeclarationError(toParseError, origin); + } else { + return; + } + scope = stack[--i]; } + this.parser.raise(toParseError, origin); } - reScan_lt() { + recordArrowParameterBindingError(error, node) { const { - type - } = this.state; - if (type === 51) { - this.state.pos -= 2; - this.finishOp(47, 1); - return 47; + stack + } = this; + const scope = stack[stack.length - 1]; + const origin = node.loc.start; + if (scope.isCertainlyParameterDeclaration()) { + this.parser.raise(error, origin); + } else if (scope.canBeArrowParameterDeclaration()) { + scope.recordDeclarationError(error, origin); + } else { + return; } - return type; } - maybeUnwrapTypeCastExpression(node) { - return node.type === "TypeCastExpression" ? node.expression : node; + recordAsyncArrowParametersError(at) { + const { + stack + } = this; + let i = stack.length - 1; + let scope = stack[i]; + while (scope.canBeArrowParameterDeclaration()) { + if (scope.type === 2) { + scope.recordDeclarationError(Errors.AwaitBindingIdentifier, at); + } + scope = stack[--i]; + } } -}; -const entities = { - __proto__: null, - quot: "\u0022", - amp: "&", - apos: "\u0027", - lt: "<", - gt: ">", - nbsp: "\u00A0", - iexcl: "\u00A1", - cent: "\u00A2", - pound: "\u00A3", - curren: "\u00A4", - yen: "\u00A5", - brvbar: "\u00A6", - sect: "\u00A7", - uml: "\u00A8", - copy: "\u00A9", - ordf: "\u00AA", - laquo: "\u00AB", - not: "\u00AC", - shy: "\u00AD", - reg: "\u00AE", - macr: "\u00AF", - deg: "\u00B0", - plusmn: "\u00B1", - sup2: "\u00B2", - sup3: "\u00B3", - acute: "\u00B4", - micro: "\u00B5", - para: "\u00B6", - middot: "\u00B7", - cedil: "\u00B8", - sup1: "\u00B9", - ordm: "\u00BA", - raquo: "\u00BB", - frac14: "\u00BC", - frac12: "\u00BD", - frac34: "\u00BE", - iquest: "\u00BF", - Agrave: "\u00C0", - Aacute: "\u00C1", - Acirc: "\u00C2", - Atilde: "\u00C3", - Auml: "\u00C4", - Aring: "\u00C5", - AElig: "\u00C6", - Ccedil: "\u00C7", - Egrave: "\u00C8", - Eacute: "\u00C9", - Ecirc: "\u00CA", - Euml: "\u00CB", - Igrave: "\u00CC", - Iacute: "\u00CD", - Icirc: "\u00CE", - Iuml: "\u00CF", - ETH: "\u00D0", - Ntilde: "\u00D1", - Ograve: "\u00D2", - Oacute: "\u00D3", - Ocirc: "\u00D4", - Otilde: "\u00D5", - Ouml: "\u00D6", - times: "\u00D7", - Oslash: "\u00D8", - Ugrave: "\u00D9", - Uacute: "\u00DA", - Ucirc: "\u00DB", - Uuml: "\u00DC", - Yacute: "\u00DD", - THORN: "\u00DE", - szlig: "\u00DF", - agrave: "\u00E0", - aacute: "\u00E1", - acirc: "\u00E2", - atilde: "\u00E3", - auml: "\u00E4", - aring: "\u00E5", - aelig: "\u00E6", - ccedil: "\u00E7", - egrave: "\u00E8", - eacute: "\u00E9", - ecirc: "\u00EA", - euml: "\u00EB", - igrave: "\u00EC", - iacute: "\u00ED", - icirc: "\u00EE", - iuml: "\u00EF", - eth: "\u00F0", - ntilde: "\u00F1", - ograve: "\u00F2", - oacute: "\u00F3", - ocirc: "\u00F4", - otilde: "\u00F5", - ouml: "\u00F6", - divide: "\u00F7", - oslash: "\u00F8", - ugrave: "\u00F9", - uacute: "\u00FA", - ucirc: "\u00FB", - uuml: "\u00FC", - yacute: "\u00FD", - thorn: "\u00FE", - yuml: "\u00FF", - OElig: "\u0152", - oelig: "\u0153", - Scaron: "\u0160", - scaron: "\u0161", - Yuml: "\u0178", - fnof: "\u0192", - circ: "\u02C6", - tilde: "\u02DC", - Alpha: "\u0391", - Beta: "\u0392", - Gamma: "\u0393", - Delta: "\u0394", - Epsilon: "\u0395", - Zeta: "\u0396", - Eta: "\u0397", - Theta: "\u0398", - Iota: "\u0399", - Kappa: "\u039A", - Lambda: "\u039B", - Mu: "\u039C", - Nu: "\u039D", - Xi: "\u039E", - Omicron: "\u039F", - Pi: "\u03A0", - Rho: "\u03A1", - Sigma: "\u03A3", - Tau: "\u03A4", - Upsilon: "\u03A5", - Phi: "\u03A6", - Chi: "\u03A7", - Psi: "\u03A8", - Omega: "\u03A9", - alpha: "\u03B1", - beta: "\u03B2", - gamma: "\u03B3", - delta: "\u03B4", - epsilon: "\u03B5", - zeta: "\u03B6", - eta: "\u03B7", - theta: "\u03B8", - iota: "\u03B9", - kappa: "\u03BA", - lambda: "\u03BB", - mu: "\u03BC", - nu: "\u03BD", - xi: "\u03BE", - omicron: "\u03BF", - pi: "\u03C0", - rho: "\u03C1", - sigmaf: "\u03C2", - sigma: "\u03C3", - tau: "\u03C4", - upsilon: "\u03C5", - phi: "\u03C6", - chi: "\u03C7", - psi: "\u03C8", - omega: "\u03C9", - thetasym: "\u03D1", - upsih: "\u03D2", - piv: "\u03D6", - ensp: "\u2002", - emsp: "\u2003", - thinsp: "\u2009", - zwnj: "\u200C", - zwj: "\u200D", - lrm: "\u200E", - rlm: "\u200F", - ndash: "\u2013", - mdash: "\u2014", - lsquo: "\u2018", - rsquo: "\u2019", - sbquo: "\u201A", - ldquo: "\u201C", - rdquo: "\u201D", - bdquo: "\u201E", - dagger: "\u2020", - Dagger: "\u2021", - bull: "\u2022", - hellip: "\u2026", - permil: "\u2030", - prime: "\u2032", - Prime: "\u2033", - lsaquo: "\u2039", - rsaquo: "\u203A", - oline: "\u203E", - frasl: "\u2044", - euro: "\u20AC", - image: "\u2111", - weierp: "\u2118", - real: "\u211C", - trade: "\u2122", - alefsym: "\u2135", - larr: "\u2190", - uarr: "\u2191", - rarr: "\u2192", - darr: "\u2193", - harr: "\u2194", - crarr: "\u21B5", - lArr: "\u21D0", - uArr: "\u21D1", - rArr: "\u21D2", - dArr: "\u21D3", - hArr: "\u21D4", - forall: "\u2200", - part: "\u2202", - exist: "\u2203", - empty: "\u2205", - nabla: "\u2207", - isin: "\u2208", - notin: "\u2209", - ni: "\u220B", - prod: "\u220F", - sum: "\u2211", - minus: "\u2212", - lowast: "\u2217", - radic: "\u221A", - prop: "\u221D", - infin: "\u221E", - ang: "\u2220", - and: "\u2227", - or: "\u2228", - cap: "\u2229", - cup: "\u222A", - int: "\u222B", - there4: "\u2234", - sim: "\u223C", - cong: "\u2245", - asymp: "\u2248", - ne: "\u2260", - equiv: "\u2261", - le: "\u2264", - ge: "\u2265", - sub: "\u2282", - sup: "\u2283", - nsub: "\u2284", - sube: "\u2286", - supe: "\u2287", - oplus: "\u2295", - otimes: "\u2297", - perp: "\u22A5", - sdot: "\u22C5", - lceil: "\u2308", - rceil: "\u2309", - lfloor: "\u230A", - rfloor: "\u230B", - lang: "\u2329", - rang: "\u232A", - loz: "\u25CA", - spades: "\u2660", - clubs: "\u2663", - hearts: "\u2665", - diams: "\u2666" -}; -const lineBreak = /\r\n|[\r\n\u2028\u2029]/; -const lineBreakG = new RegExp(lineBreak.source, "g"); -function isNewLine(code) { - switch (code) { - case 10: - case 13: - case 8232: - case 8233: + validateAsPattern() { + const { + stack + } = this; + const currentScope = stack[stack.length - 1]; + if (!currentScope.canBeArrowParameterDeclaration()) return; + currentScope.iterateErrors(([toParseError, loc]) => { + this.parser.raise(toParseError, loc); + let i = stack.length - 2; + let scope = stack[i]; + while (scope.canBeArrowParameterDeclaration()) { + scope.clearDeclarationError(loc.index); + scope = stack[--i]; + } + }); + } +} +function newParameterDeclarationScope() { + return new ExpressionScope(3); +} +function newArrowHeadScope() { + return new ArrowHeadParsingScope(1); +} +function newAsyncArrowScope() { + return new ArrowHeadParsingScope(2); +} +function newExpressionScope() { + return new ExpressionScope(); +} +class ProductionParameterHandler { + constructor() { + this.stacks = []; + } + enter(flags) { + this.stacks.push(flags); + } + exit() { + this.stacks.pop(); + } + currentFlags() { + return this.stacks[this.stacks.length - 1]; + } + get hasAwait() { + return (this.currentFlags() & 2) > 0; + } + get hasYield() { + return (this.currentFlags() & 1) > 0; + } + get hasReturn() { + return (this.currentFlags() & 4) > 0; + } + get hasIn() { + return (this.currentFlags() & 8) > 0; + } +} +function functionFlags(isAsync, isGenerator) { + return (isAsync ? 2 : 0) | (isGenerator ? 1 : 0); +} +class UtilParser extends Tokenizer { + addExtra(node, key, value, enumerable = true) { + if (!node) return; + let { + extra + } = node; + if (extra == null) { + extra = {}; + node.extra = extra; + } + if (enumerable) { + extra[key] = value; + } else { + Object.defineProperty(extra, key, { + enumerable, + value + }); + } + } + isContextual(token) { + return this.state.type === token && !this.state.containsEsc; + } + isUnparsedContextual(nameStart, name) { + const nameEnd = nameStart + name.length; + if (this.input.slice(nameStart, nameEnd) === name) { + const nextCh = this.input.charCodeAt(nameEnd); + return !(isIdentifierChar(nextCh) || (nextCh & 0xfc00) === 0xd800); + } + return false; + } + isLookaheadContextual(name) { + const next = this.nextTokenStart(); + return this.isUnparsedContextual(next, name); + } + eatContextual(token) { + if (this.isContextual(token)) { + this.next(); return true; - default: - return false; + } + return false; + } + expectContextual(token, toParseError) { + if (!this.eatContextual(token)) { + if (toParseError != null) { + throw this.raise(toParseError, this.state.startLoc); + } + this.unexpected(null, token); + } + } + canInsertSemicolon() { + return this.match(139) || this.match(8) || this.hasPrecedingLineBreak(); + } + hasPrecedingLineBreak() { + return hasNewLine(this.input, this.state.lastTokEndLoc.index, this.state.start); + } + hasFollowingLineBreak() { + return hasNewLine(this.input, this.state.end, this.nextTokenStart()); + } + isLineTerminator() { + return this.eat(13) || this.canInsertSemicolon(); + } + semicolon(allowAsi = true) { + if (allowAsi ? this.isLineTerminator() : this.eat(13)) return; + this.raise(Errors.MissingSemicolon, this.state.lastTokEndLoc); + } + expect(type, loc) { + if (!this.eat(type)) { + this.unexpected(loc, type); + } + } + tryParse(fn, oldState = this.state.clone()) { + const abortSignal = { + node: null + }; + try { + const node = fn((node = null) => { + abortSignal.node = node; + throw abortSignal; + }); + if (this.state.errors.length > oldState.errors.length) { + const failState = this.state; + this.state = oldState; + this.state.tokensLength = failState.tokensLength; + return { + node, + error: failState.errors[oldState.errors.length], + thrown: false, + aborted: false, + failState + }; + } + return { + node, + error: null, + thrown: false, + aborted: false, + failState: null + }; + } catch (error) { + const failState = this.state; + this.state = oldState; + if (error instanceof SyntaxError) { + return { + node: null, + error, + thrown: true, + aborted: false, + failState + }; + } + if (error === abortSignal) { + return { + node: abortSignal.node, + error: null, + thrown: false, + aborted: true, + failState + }; + } + throw error; + } + } + checkExpressionErrors(refExpressionErrors, andThrow) { + if (!refExpressionErrors) return false; + const { + shorthandAssignLoc, + doubleProtoLoc, + privateKeyLoc, + optionalParametersLoc + } = refExpressionErrors; + const hasErrors = !!shorthandAssignLoc || !!doubleProtoLoc || !!optionalParametersLoc || !!privateKeyLoc; + if (!andThrow) { + return hasErrors; + } + if (shorthandAssignLoc != null) { + this.raise(Errors.InvalidCoverInitializedName, shorthandAssignLoc); + } + if (doubleProtoLoc != null) { + this.raise(Errors.DuplicateProto, doubleProtoLoc); + } + if (privateKeyLoc != null) { + this.raise(Errors.UnexpectedPrivateField, privateKeyLoc); + } + if (optionalParametersLoc != null) { + this.unexpected(optionalParametersLoc); + } + } + isLiteralPropertyName() { + return tokenIsLiteralPropertyName(this.state.type); + } + isPrivateName(node) { + return node.type === "PrivateName"; + } + getPrivateNameSV(node) { + return node.id.name; + } + hasPropertyAsPrivateName(node) { + return (node.type === "MemberExpression" || node.type === "OptionalMemberExpression") && this.isPrivateName(node.property); + } + isObjectProperty(node) { + return node.type === "ObjectProperty"; + } + isObjectMethod(node) { + return node.type === "ObjectMethod"; + } + initializeScopes(inModule = this.options.sourceType === "module") { + const oldLabels = this.state.labels; + this.state.labels = []; + const oldExportedIdentifiers = this.exportedIdentifiers; + this.exportedIdentifiers = new Set(); + const oldInModule = this.inModule; + this.inModule = inModule; + const oldScope = this.scope; + const ScopeHandler = this.getScopeHandler(); + this.scope = new ScopeHandler(this, inModule); + const oldProdParam = this.prodParam; + this.prodParam = new ProductionParameterHandler(); + const oldClassScope = this.classScope; + this.classScope = new ClassScopeHandler(this); + const oldExpressionScope = this.expressionScope; + this.expressionScope = new ExpressionScopeHandler(this); + return () => { + this.state.labels = oldLabels; + this.exportedIdentifiers = oldExportedIdentifiers; + this.inModule = oldInModule; + this.scope = oldScope; + this.prodParam = oldProdParam; + this.classScope = oldClassScope; + this.expressionScope = oldExpressionScope; + }; + } + enterInitialScopes() { + let paramFlags = 0; + if (this.inModule) { + paramFlags |= 2; + } + this.scope.enter(1); + this.prodParam.enter(paramFlags); + } + checkDestructuringPrivate(refExpressionErrors) { + const { + privateKeyLoc + } = refExpressionErrors; + if (privateKeyLoc !== null) { + this.expectPlugin("destructuringPrivate", privateKeyLoc); + } } } -function hasNewLine(input, start, end) { - for (let i = start; i < end; i++) { - if (isNewLine(input.charCodeAt(i))) { - return true; +class ExpressionErrors { + constructor() { + this.shorthandAssignLoc = null; + this.doubleProtoLoc = null; + this.privateKeyLoc = null; + this.optionalParametersLoc = null; + } +} +class Node { + constructor(parser, pos, loc) { + this.type = ""; + this.start = pos; + this.end = 0; + this.loc = new SourceLocation(loc); + if (parser != null && parser.options.ranges) this.range = [pos, 0]; + if (parser != null && parser.filename) this.loc.filename = parser.filename; + } +} +const NodePrototype = Node.prototype; +{ + NodePrototype.__clone = function () { + const newNode = new Node(undefined, this.start, this.loc.start); + const keys = Object.keys(this); + for (let i = 0, length = keys.length; i < length; i++) { + const key = keys[i]; + if (key !== "leadingComments" && key !== "trailingComments" && key !== "innerComments") { + newNode[key] = this[key]; + } } + return newNode; + }; +} +function clonePlaceholder(node) { + return cloneIdentifier(node); +} +function cloneIdentifier(node) { + const { + type, + start, + end, + loc, + range, + extra, + name + } = node; + const cloned = Object.create(NodePrototype); + cloned.type = type; + cloned.start = start; + cloned.end = end; + cloned.loc = loc; + cloned.range = range; + cloned.extra = extra; + cloned.name = name; + if (type === "Placeholder") { + cloned.expectedNode = node.expectedNode; + } + return cloned; +} +function cloneStringLiteral(node) { + const { + type, + start, + end, + loc, + range, + extra + } = node; + if (type === "Placeholder") { + return clonePlaceholder(node); + } + const cloned = Object.create(NodePrototype); + cloned.type = type; + cloned.start = start; + cloned.end = end; + cloned.loc = loc; + cloned.range = range; + if (node.raw !== undefined) { + cloned.raw = node.raw; + } else { + cloned.extra = extra; } - return false; + cloned.value = node.value; + return cloned; } -const skipWhiteSpace = /(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g; -const skipWhiteSpaceInLine = /(?:[^\S\n\r\u2028\u2029]|\/\/.*|\/\*.*?\*\/)*/g; -function isWhitespace(code) { - switch (code) { - case 0x0009: - case 0x000b: - case 0x000c: - case 32: - case 160: - case 5760: - case 0x2000: - case 0x2001: - case 0x2002: - case 0x2003: - case 0x2004: - case 0x2005: - case 0x2006: - case 0x2007: - case 0x2008: - case 0x2009: - case 0x200a: - case 0x202f: - case 0x205f: - case 0x3000: - case 0xfeff: - return true; - default: - return false; +class NodeUtils extends UtilParser { + startNode() { + const loc = this.state.startLoc; + return new Node(this, loc.index, loc); + } + startNodeAt(loc) { + return new Node(this, loc.index, loc); + } + startNodeAtNode(type) { + return this.startNodeAt(type.loc.start); + } + finishNode(node, type) { + return this.finishNodeAt(node, type, this.state.lastTokEndLoc); + } + finishNodeAt(node, type, endLoc) { + node.type = type; + node.end = endLoc.index; + node.loc.end = endLoc; + if (this.options.ranges) node.range[1] = endLoc.index; + if (this.options.attachComment) this.processComment(node); + return node; + } + resetStartLocation(node, startLoc) { + node.start = startLoc.index; + node.loc.start = startLoc; + if (this.options.ranges) node.range[0] = startLoc.index; + } + resetEndLocation(node, endLoc = this.state.lastTokEndLoc) { + node.end = endLoc.index; + node.loc.end = endLoc; + if (this.options.ranges) node.range[1] = endLoc.index; + } + resetStartLocationFromNode(node, locationNode) { + this.resetStartLocation(node, locationNode.loc.start); } } -const JsxErrors = ParseErrorEnum`jsx`({ - AttributeIsEmpty: "JSX attributes must only be assigned a non-empty expression.", - MissingClosingTagElement: ({ - openingTagName - }) => `Expected corresponding JSX closing tag for <${openingTagName}>.`, - MissingClosingTagFragment: "Expected corresponding JSX closing tag for <>.", - UnexpectedSequenceExpression: "Sequence expressions cannot be directly nested inside JSX. Did you mean to wrap it in parentheses (...)?", - UnexpectedToken: ({ - unexpected, - HTMLEntity - }) => `Unexpected token \`${unexpected}\`. Did you mean \`${HTMLEntity}\` or \`{'${unexpected}'}\`?`, - UnsupportedJsxValue: "JSX value should be either an expression or a quoted JSX text.", - UnterminatedJsxContent: "Unterminated JSX contents.", - UnwrappedAdjacentJSXElements: "Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment <>...?" +const reservedTypes = new Set(["_", "any", "bool", "boolean", "empty", "extends", "false", "interface", "mixed", "null", "number", "static", "string", "true", "typeof", "void"]); +const FlowErrors = ParseErrorEnum`flow`({ + AmbiguousConditionalArrow: "Ambiguous expression: wrap the arrow functions in parentheses to disambiguate.", + AmbiguousDeclareModuleKind: "Found both `declare module.exports` and `declare export` in the same module. Modules can only have 1 since they are either an ES module or they are a CommonJS module.", + AssignReservedType: ({ + reservedType + }) => `Cannot overwrite reserved type ${reservedType}.`, + DeclareClassElement: "The `declare` modifier can only appear on class fields.", + DeclareClassFieldInitializer: "Initializers are not allowed in fields with the `declare` modifier.", + DuplicateDeclareModuleExports: "Duplicate `declare module.exports` statement.", + EnumBooleanMemberNotInitialized: ({ + memberName, + enumName + }) => `Boolean enum members need to be initialized. Use either \`${memberName} = true,\` or \`${memberName} = false,\` in enum \`${enumName}\`.`, + EnumDuplicateMemberName: ({ + memberName, + enumName + }) => `Enum member names need to be unique, but the name \`${memberName}\` has already been used before in enum \`${enumName}\`.`, + EnumInconsistentMemberValues: ({ + enumName + }) => `Enum \`${enumName}\` has inconsistent member initializers. Either use no initializers, or consistently use literals (either booleans, numbers, or strings) for all member initializers.`, + EnumInvalidExplicitType: ({ + invalidEnumType, + enumName + }) => `Enum type \`${invalidEnumType}\` is not valid. Use one of \`boolean\`, \`number\`, \`string\`, or \`symbol\` in enum \`${enumName}\`.`, + EnumInvalidExplicitTypeUnknownSupplied: ({ + enumName + }) => `Supplied enum type is not valid. Use one of \`boolean\`, \`number\`, \`string\`, or \`symbol\` in enum \`${enumName}\`.`, + EnumInvalidMemberInitializerPrimaryType: ({ + enumName, + memberName, + explicitType + }) => `Enum \`${enumName}\` has type \`${explicitType}\`, so the initializer of \`${memberName}\` needs to be a ${explicitType} literal.`, + EnumInvalidMemberInitializerSymbolType: ({ + enumName, + memberName + }) => `Symbol enum members cannot be initialized. Use \`${memberName},\` in enum \`${enumName}\`.`, + EnumInvalidMemberInitializerUnknownType: ({ + enumName, + memberName + }) => `The enum member initializer for \`${memberName}\` needs to be a literal (either a boolean, number, or string) in enum \`${enumName}\`.`, + EnumInvalidMemberName: ({ + enumName, + memberName, + suggestion + }) => `Enum member names cannot start with lowercase 'a' through 'z'. Instead of using \`${memberName}\`, consider using \`${suggestion}\`, in enum \`${enumName}\`.`, + EnumNumberMemberNotInitialized: ({ + enumName, + memberName + }) => `Number enum members need to be initialized, e.g. \`${memberName} = 1\` in enum \`${enumName}\`.`, + EnumStringMemberInconsistentlyInitialized: ({ + enumName + }) => `String enum members need to consistently either all use initializers, or use no initializers, in enum \`${enumName}\`.`, + GetterMayNotHaveThisParam: "A getter cannot have a `this` parameter.", + ImportReflectionHasImportType: "An `import module` declaration can not use `type` or `typeof` keyword.", + ImportTypeShorthandOnlyInPureImport: "The `type` and `typeof` keywords on named imports can only be used on regular `import` statements. It cannot be used with `import type` or `import typeof` statements.", + InexactInsideExact: "Explicit inexact syntax cannot appear inside an explicit exact object type.", + InexactInsideNonObject: "Explicit inexact syntax cannot appear in class or interface definitions.", + InexactVariance: "Explicit inexact syntax cannot have variance.", + InvalidNonTypeImportInDeclareModule: "Imports within a `declare module` body must always be `import type` or `import typeof`.", + MissingTypeParamDefault: "Type parameter declaration needs a default, since a preceding type parameter declaration has a default.", + NestedDeclareModule: "`declare module` cannot be used inside another `declare module`.", + NestedFlowComment: "Cannot have a flow comment inside another flow comment.", + PatternIsOptional: Object.assign({ + message: "A binding pattern parameter cannot be optional in an implementation signature." + }, { + reasonCode: "OptionalBindingPattern" + }), + SetterMayNotHaveThisParam: "A setter cannot have a `this` parameter.", + SpreadVariance: "Spread properties cannot have variance.", + ThisParamAnnotationRequired: "A type annotation is required for the `this` parameter.", + ThisParamBannedInConstructor: "Constructors cannot have a `this` parameter; constructors don't bind `this` like other functions.", + ThisParamMayNotBeOptional: "The `this` parameter cannot be optional.", + ThisParamMustBeFirst: "The `this` parameter must be the first function parameter.", + ThisParamNoDefault: "The `this` parameter may not have a default value.", + TypeBeforeInitializer: "Type annotations must come before default assignments, e.g. instead of `age = 25: number` use `age: number = 25`.", + TypeCastInPattern: "The type cast expression is expected to be wrapped with parenthesis.", + UnexpectedExplicitInexactInObject: "Explicit inexact syntax must appear at the end of an inexact object.", + UnexpectedReservedType: ({ + reservedType + }) => `Unexpected reserved type ${reservedType}.`, + UnexpectedReservedUnderscore: "`_` is only allowed as a type argument to call or new.", + UnexpectedSpaceBetweenModuloChecks: "Spaces between `%` and `checks` are not allowed here.", + UnexpectedSpreadType: "Spread operator cannot appear in class or interface definitions.", + UnexpectedSubtractionOperand: 'Unexpected token, expected "number" or "bigint".', + UnexpectedTokenAfterTypeParameter: "Expected an arrow function after this type parameter declaration.", + UnexpectedTypeParameterBeforeAsyncArrowFunction: "Type parameters must come after the async keyword, e.g. instead of ` async () => {}`, use `async () => {}`.", + UnsupportedDeclareExportKind: ({ + unsupportedExportKind, + suggestion + }) => `\`declare export ${unsupportedExportKind}\` is not supported. Use \`${suggestion}\` instead.`, + UnsupportedStatementInDeclareModule: "Only declares and type imports are allowed inside declare module.", + UnterminatedFlowComment: "Unterminated flow-comment." }); -function isFragment(object) { - return object ? object.type === "JSXOpeningFragment" || object.type === "JSXClosingFragment" : false; +function isEsModuleType(bodyElement) { + return bodyElement.type === "DeclareExportAllDeclaration" || bodyElement.type === "DeclareExportDeclaration" && (!bodyElement.declaration || bodyElement.declaration.type !== "TypeAlias" && bodyElement.declaration.type !== "InterfaceDeclaration"); } -function getQualifiedJSXName(object) { - if (object.type === "JSXIdentifier") { - return object.name; +function hasTypeImportKind(node) { + return node.importKind === "type" || node.importKind === "typeof"; +} +const exportSuggestions = { + const: "declare export var", + let: "declare export var", + type: "export type", + interface: "export interface" +}; +function partition(list, test) { + const list1 = []; + const list2 = []; + for (let i = 0; i < list.length; i++) { + (test(list[i], i, list) ? list1 : list2).push(list[i]); } - if (object.type === "JSXNamespacedName") { - return object.namespace.name + ":" + object.name.name; + return [list1, list2]; +} +const FLOW_PRAGMA_REGEX = /\*?\s*@((?:no)?flow)\b/; +var flow = superClass => class FlowParserMixin extends superClass { + constructor(...args) { + super(...args); + this.flowPragma = undefined; } - if (object.type === "JSXMemberExpression") { - return getQualifiedJSXName(object.object) + "." + getQualifiedJSXName(object.property); + getScopeHandler() { + return FlowScopeHandler; } - throw new Error("Node had unexpected type: " + object.type); -} -var jsx = superClass => class JSXParserMixin extends superClass { - jsxReadToken() { - let out = ""; - let chunkStart = this.state.pos; - for (;;) { - if (this.state.pos >= this.length) { - throw this.raise(JsxErrors.UnterminatedJsxContent, this.state.startLoc); - } - const ch = this.input.charCodeAt(this.state.pos); - switch (ch) { - case 60: - case 123: - if (this.state.pos === this.state.start) { - if (ch === 60 && this.state.canStartJSXElement) { - ++this.state.pos; - this.finishToken(143); - } else { - super.getTokenFromCode(ch); - } - return; - } - out += this.input.slice(chunkStart, this.state.pos); - this.finishToken(142, out); - return; - case 38: - out += this.input.slice(chunkStart, this.state.pos); - out += this.jsxReadEntity(); - chunkStart = this.state.pos; - break; - case 62: - case 125: - default: - if (isNewLine(ch)) { - out += this.input.slice(chunkStart, this.state.pos); - out += this.jsxReadNewLine(true); - chunkStart = this.state.pos; - } else { - ++this.state.pos; - } - } - } + shouldParseTypes() { + return this.getPluginOption("flow", "all") || this.flowPragma === "flow"; } - jsxReadNewLine(normalizeCRLF) { - const ch = this.input.charCodeAt(this.state.pos); - let out; - ++this.state.pos; - if (ch === 13 && this.input.charCodeAt(this.state.pos) === 10) { - ++this.state.pos; - out = normalizeCRLF ? "\n" : "\r\n"; - } else { - out = String.fromCharCode(ch); - } - ++this.state.curLine; - this.state.lineStart = this.state.pos; - return out; + shouldParseEnums() { + return !!this.getPluginOption("flow", "enums"); } - jsxReadString(quote) { - let out = ""; - let chunkStart = ++this.state.pos; - for (;;) { - if (this.state.pos >= this.length) { - throw this.raise(Errors.UnterminatedString, this.state.startLoc); - } - const ch = this.input.charCodeAt(this.state.pos); - if (ch === quote) break; - if (ch === 38) { - out += this.input.slice(chunkStart, this.state.pos); - out += this.jsxReadEntity(); - chunkStart = this.state.pos; - } else if (isNewLine(ch)) { - out += this.input.slice(chunkStart, this.state.pos); - out += this.jsxReadNewLine(false); - chunkStart = this.state.pos; - } else { - ++this.state.pos; + finishToken(type, val) { + if (type !== 133 && type !== 13 && type !== 28) { + if (this.flowPragma === undefined) { + this.flowPragma = null; } } - out += this.input.slice(chunkStart, this.state.pos++); - this.finishToken(134, out); + super.finishToken(type, val); } - jsxReadEntity() { - const startPos = ++this.state.pos; - if (this.codePointAtPos(this.state.pos) === 35) { - ++this.state.pos; - let radix = 10; - if (this.codePointAtPos(this.state.pos) === 120) { - radix = 16; - ++this.state.pos; - } - const codePoint = this.readInt(radix, undefined, false, "bail"); - if (codePoint !== null && this.codePointAtPos(this.state.pos) === 59) { - ++this.state.pos; - return String.fromCodePoint(codePoint); - } - } else { - let count = 0; - let semi = false; - while (count++ < 10 && this.state.pos < this.length && !(semi = this.codePointAtPos(this.state.pos) === 59)) { - ++this.state.pos; - } - if (semi) { - const desc = this.input.slice(startPos, this.state.pos); - const entity = entities[desc]; - ++this.state.pos; - if (entity) { - return entity; - } + addComment(comment) { + if (this.flowPragma === undefined) { + const matches = FLOW_PRAGMA_REGEX.exec(comment.value); + if (!matches) ;else if (matches[1] === "flow") { + this.flowPragma = "flow"; + } else if (matches[1] === "noflow") { + this.flowPragma = "noflow"; + } else { + throw new Error("Unexpected flow pragma"); } } - this.state.pos = startPos; - return "&"; + super.addComment(comment); } - jsxReadWord() { - let ch; - const start = this.state.pos; - do { - ch = this.input.charCodeAt(++this.state.pos); - } while (isIdentifierChar(ch) || ch === 45); - this.finishToken(141, this.input.slice(start, this.state.pos)); + flowParseTypeInitialiser(tok) { + const oldInType = this.state.inType; + this.state.inType = true; + this.expect(tok || 14); + const type = this.flowParseType(); + this.state.inType = oldInType; + return type; } - jsxParseIdentifier() { + flowParsePredicate() { const node = this.startNode(); - if (this.match(141)) { - node.name = this.state.value; - } else if (tokenIsKeyword(this.state.type)) { - node.name = tokenLabelName(this.state.type); - } else { - this.unexpected(); - } - this.next(); - return this.finishNode(node, "JSXIdentifier"); - } - jsxParseNamespacedName() { - const startLoc = this.state.startLoc; - const name = this.jsxParseIdentifier(); - if (!this.eat(14)) return name; - const node = this.startNodeAt(startLoc); - node.namespace = name; - node.name = this.jsxParseIdentifier(); - return this.finishNode(node, "JSXNamespacedName"); - } - jsxParseElementName() { - const startLoc = this.state.startLoc; - let node = this.jsxParseNamespacedName(); - if (node.type === "JSXNamespacedName") { - return node; - } - while (this.eat(16)) { - const newNode = this.startNodeAt(startLoc); - newNode.object = node; - newNode.property = this.jsxParseIdentifier(); - node = this.finishNode(newNode, "JSXMemberExpression"); - } - return node; - } - jsxParseAttributeValue() { - let node; - switch (this.state.type) { - case 5: - node = this.startNode(); - this.setContext(types.brace); - this.next(); - node = this.jsxParseExpressionContainer(node, types.j_oTag); - if (node.expression.type === "JSXEmptyExpression") { - this.raise(JsxErrors.AttributeIsEmpty, node); - } - return node; - case 143: - case 134: - return this.parseExprAtom(); - default: - throw this.raise(JsxErrors.UnsupportedJsxValue, this.state.startLoc); - } - } - jsxParseEmptyExpression() { - const node = this.startNodeAt(this.state.lastTokEndLoc); - return this.finishNodeAt(node, "JSXEmptyExpression", this.state.startLoc); - } - jsxParseSpreadChild(node) { + const moduloLoc = this.state.startLoc; this.next(); - node.expression = this.parseExpression(); - this.setContext(types.j_expr); - this.state.canStartJSXElement = true; - this.expect(8); - return this.finishNode(node, "JSXSpreadChild"); - } - jsxParseExpressionContainer(node, previousContext) { - if (this.match(8)) { - node.expression = this.jsxParseEmptyExpression(); - } else { - const expression = this.parseExpression(); - node.expression = expression; + this.expectContextual(110); + if (this.state.lastTokStartLoc.index > moduloLoc.index + 1) { + this.raise(FlowErrors.UnexpectedSpaceBetweenModuloChecks, moduloLoc); } - this.setContext(previousContext); - this.state.canStartJSXElement = true; - this.expect(8); - return this.finishNode(node, "JSXExpressionContainer"); - } - jsxParseAttribute() { - const node = this.startNode(); - if (this.match(5)) { - this.setContext(types.brace); - this.next(); - this.expect(21); - node.argument = this.parseMaybeAssignAllowIn(); - this.setContext(types.j_oTag); - this.state.canStartJSXElement = true; - this.expect(8); - return this.finishNode(node, "JSXSpreadAttribute"); + if (this.eat(10)) { + node.value = super.parseExpression(); + this.expect(11); + return this.finishNode(node, "DeclaredPredicate"); + } else { + return this.finishNode(node, "InferredPredicate"); } - node.name = this.jsxParseNamespacedName(); - node.value = this.eat(29) ? this.jsxParseAttributeValue() : null; - return this.finishNode(node, "JSXAttribute"); } - jsxParseOpeningElementAt(startLoc) { - const node = this.startNodeAt(startLoc); - if (this.eat(144)) { - return this.finishNode(node, "JSXOpeningFragment"); + flowParseTypeAndPredicateInitialiser() { + const oldInType = this.state.inType; + this.state.inType = true; + this.expect(14); + let type = null; + let predicate = null; + if (this.match(54)) { + this.state.inType = oldInType; + predicate = this.flowParsePredicate(); + } else { + type = this.flowParseType(); + this.state.inType = oldInType; + if (this.match(54)) { + predicate = this.flowParsePredicate(); + } } - node.name = this.jsxParseElementName(); - return this.jsxParseOpeningElementAfterName(node); + return [type, predicate]; } - jsxParseOpeningElementAfterName(node) { - const attributes = []; - while (!this.match(56) && !this.match(144)) { - attributes.push(this.jsxParseAttribute()); - } - node.attributes = attributes; - node.selfClosing = this.eat(56); - this.expect(144); - return this.finishNode(node, "JSXOpeningElement"); + flowParseDeclareClass(node) { + this.next(); + this.flowParseInterfaceish(node, true); + return this.finishNode(node, "DeclareClass"); } - jsxParseClosingElementAt(startLoc) { - const node = this.startNodeAt(startLoc); - if (this.eat(144)) { - return this.finishNode(node, "JSXClosingFragment"); + flowParseDeclareFunction(node) { + this.next(); + const id = node.id = this.parseIdentifier(); + const typeNode = this.startNode(); + const typeContainer = this.startNode(); + if (this.match(47)) { + typeNode.typeParameters = this.flowParseTypeParameterDeclaration(); + } else { + typeNode.typeParameters = null; } - node.name = this.jsxParseElementName(); - this.expect(144); - return this.finishNode(node, "JSXClosingElement"); + this.expect(10); + const tmp = this.flowParseFunctionTypeParams(); + typeNode.params = tmp.params; + typeNode.rest = tmp.rest; + typeNode.this = tmp._this; + this.expect(11); + [typeNode.returnType, node.predicate] = this.flowParseTypeAndPredicateInitialiser(); + typeContainer.typeAnnotation = this.finishNode(typeNode, "FunctionTypeAnnotation"); + id.typeAnnotation = this.finishNode(typeContainer, "TypeAnnotation"); + this.resetEndLocation(id); + this.semicolon(); + this.scope.declareName(node.id.name, 2048, node.id.loc.start); + return this.finishNode(node, "DeclareFunction"); } - jsxParseElementAt(startLoc) { - const node = this.startNodeAt(startLoc); - const children = []; - const openingElement = this.jsxParseOpeningElementAt(startLoc); - let closingElement = null; - if (!openingElement.selfClosing) { - contents: for (;;) { - switch (this.state.type) { - case 143: - startLoc = this.state.startLoc; - this.next(); - if (this.eat(56)) { - closingElement = this.jsxParseClosingElementAt(startLoc); - break contents; - } - children.push(this.jsxParseElementAt(startLoc)); - break; - case 142: - children.push(this.parseLiteral(this.state.value, "JSXText")); - break; - case 5: - { - const node = this.startNode(); - this.setContext(types.brace); - this.next(); - if (this.match(21)) { - children.push(this.jsxParseSpreadChild(node)); - } else { - children.push(this.jsxParseExpressionContainer(node, types.j_expr)); - } - break; - } - default: - this.unexpected(); - } - } - if (isFragment(openingElement) && !isFragment(closingElement) && closingElement !== null) { - this.raise(JsxErrors.MissingClosingTagFragment, closingElement); - } else if (!isFragment(openingElement) && isFragment(closingElement)) { - this.raise(JsxErrors.MissingClosingTagElement, closingElement, { - openingTagName: getQualifiedJSXName(openingElement.name) - }); - } else if (!isFragment(openingElement) && !isFragment(closingElement)) { - if (getQualifiedJSXName(closingElement.name) !== getQualifiedJSXName(openingElement.name)) { - this.raise(JsxErrors.MissingClosingTagElement, closingElement, { - openingTagName: getQualifiedJSXName(openingElement.name) - }); + flowParseDeclare(node, insideModule) { + if (this.match(80)) { + return this.flowParseDeclareClass(node); + } else if (this.match(68)) { + return this.flowParseDeclareFunction(node); + } else if (this.match(74)) { + return this.flowParseDeclareVariable(node); + } else if (this.eatContextual(127)) { + if (this.match(16)) { + return this.flowParseDeclareModuleExports(node); + } else { + if (insideModule) { + this.raise(FlowErrors.NestedDeclareModule, this.state.lastTokStartLoc); } + return this.flowParseDeclareModule(node); } - } - if (isFragment(openingElement)) { - node.openingFragment = openingElement; - node.closingFragment = closingElement; + } else if (this.isContextual(130)) { + return this.flowParseDeclareTypeAlias(node); + } else if (this.isContextual(131)) { + return this.flowParseDeclareOpaqueType(node); + } else if (this.isContextual(129)) { + return this.flowParseDeclareInterface(node); + } else if (this.match(82)) { + return this.flowParseDeclareExportDeclaration(node, insideModule); } else { - node.openingElement = openingElement; - node.closingElement = closingElement; - } - node.children = children; - if (this.match(47)) { - throw this.raise(JsxErrors.UnwrappedAdjacentJSXElements, this.state.startLoc); + this.unexpected(); } - return isFragment(openingElement) ? this.finishNode(node, "JSXFragment") : this.finishNode(node, "JSXElement"); } - jsxParseElement() { - const startLoc = this.state.startLoc; + flowParseDeclareVariable(node) { this.next(); - return this.jsxParseElementAt(startLoc); - } - setContext(newContext) { - const { - context - } = this.state; - context[context.length - 1] = newContext; + node.id = this.flowParseTypeAnnotatableIdentifier(true); + this.scope.declareName(node.id.name, 5, node.id.loc.start); + this.semicolon(); + return this.finishNode(node, "DeclareVariable"); } - parseExprAtom(refExpressionErrors) { - if (this.match(143)) { - return this.jsxParseElement(); - } else if (this.match(47) && this.input.charCodeAt(this.state.pos) !== 33) { - this.replaceToken(143); - return this.jsxParseElement(); + flowParseDeclareModule(node) { + this.scope.enter(0); + if (this.match(133)) { + node.id = super.parseExprAtom(); } else { - return super.parseExprAtom(refExpressionErrors); - } - } - skipSpace() { - const curContext = this.curContext(); - if (!curContext.preserveSpace) super.skipSpace(); - } - getTokenFromCode(code) { - const context = this.curContext(); - if (context === types.j_expr) { - this.jsxReadToken(); - return; + node.id = this.parseIdentifier(); } - if (context === types.j_oTag || context === types.j_cTag) { - if (isIdentifierStart(code)) { - this.jsxReadWord(); - return; - } - if (code === 62) { - ++this.state.pos; - this.finishToken(144); - return; - } - if ((code === 34 || code === 39) && context === types.j_oTag) { - this.jsxReadString(code); - return; + const bodyNode = node.body = this.startNode(); + const body = bodyNode.body = []; + this.expect(5); + while (!this.match(8)) { + let bodyNode = this.startNode(); + if (this.match(83)) { + this.next(); + if (!this.isContextual(130) && !this.match(87)) { + this.raise(FlowErrors.InvalidNonTypeImportInDeclareModule, this.state.lastTokStartLoc); + } + super.parseImport(bodyNode); + } else { + this.expectContextual(125, FlowErrors.UnsupportedStatementInDeclareModule); + bodyNode = this.flowParseDeclare(bodyNode, true); } + body.push(bodyNode); } - if (code === 60 && this.state.canStartJSXElement && this.input.charCodeAt(this.state.pos + 1) !== 33) { - ++this.state.pos; - this.finishToken(143); - return; - } - super.getTokenFromCode(code); + this.scope.exit(); + this.expect(8); + this.finishNode(bodyNode, "BlockStatement"); + let kind = null; + let hasModuleExport = false; + body.forEach(bodyElement => { + if (isEsModuleType(bodyElement)) { + if (kind === "CommonJS") { + this.raise(FlowErrors.AmbiguousDeclareModuleKind, bodyElement); + } + kind = "ES"; + } else if (bodyElement.type === "DeclareModuleExports") { + if (hasModuleExport) { + this.raise(FlowErrors.DuplicateDeclareModuleExports, bodyElement); + } + if (kind === "ES") { + this.raise(FlowErrors.AmbiguousDeclareModuleKind, bodyElement); + } + kind = "CommonJS"; + hasModuleExport = true; + } + }); + node.kind = kind || "CommonJS"; + return this.finishNode(node, "DeclareModule"); } - updateContext(prevType) { - const { - context, - type - } = this.state; - if (type === 56 && prevType === 143) { - context.splice(-2, 2, types.j_cTag); - this.state.canStartJSXElement = false; - } else if (type === 143) { - context.push(types.j_oTag); - } else if (type === 144) { - const out = context[context.length - 1]; - if (out === types.j_oTag && prevType === 56 || out === types.j_cTag) { - context.pop(); - this.state.canStartJSXElement = context[context.length - 1] === types.j_expr; - } else { - this.setContext(types.j_expr); - this.state.canStartJSXElement = true; + flowParseDeclareExportDeclaration(node, insideModule) { + this.expect(82); + if (this.eat(65)) { + if (this.match(68) || this.match(80)) { + node.declaration = this.flowParseDeclare(this.startNode()); + } else { + node.declaration = this.flowParseType(); + this.semicolon(); } + node.default = true; + return this.finishNode(node, "DeclareExportDeclaration"); } else { - this.state.canStartJSXElement = tokenComesBeforeExpression(type); + if (this.match(75) || this.isLet() || (this.isContextual(130) || this.isContextual(129)) && !insideModule) { + const label = this.state.value; + throw this.raise(FlowErrors.UnsupportedDeclareExportKind, this.state.startLoc, { + unsupportedExportKind: label, + suggestion: exportSuggestions[label] + }); + } + if (this.match(74) || this.match(68) || this.match(80) || this.isContextual(131)) { + node.declaration = this.flowParseDeclare(this.startNode()); + node.default = false; + return this.finishNode(node, "DeclareExportDeclaration"); + } else if (this.match(55) || this.match(5) || this.isContextual(129) || this.isContextual(130) || this.isContextual(131)) { + node = this.parseExport(node, null); + if (node.type === "ExportNamedDeclaration") { + node.type = "ExportDeclaration"; + node.default = false; + delete node.exportKind; + } + node.type = "Declare" + node.type; + return node; + } } + this.unexpected(); } -}; -class TypeScriptScope extends Scope { - constructor(...args) { - super(...args); - this.tsNames = new Map(); - } -} -class TypeScriptScopeHandler extends ScopeHandler { - constructor(...args) { - super(...args); - this.importsStack = []; - } - createScope(flags) { - this.importsStack.push(new Set()); - return new TypeScriptScope(flags); + flowParseDeclareModuleExports(node) { + this.next(); + this.expectContextual(111); + node.typeAnnotation = this.flowParseTypeAnnotation(); + this.semicolon(); + return this.finishNode(node, "DeclareModuleExports"); } - enter(flags) { - if (flags === 1024) { - this.importsStack.push(new Set()); - } - super.enter(flags); + flowParseDeclareTypeAlias(node) { + this.next(); + const finished = this.flowParseTypeAlias(node); + finished.type = "DeclareTypeAlias"; + return finished; } - exit() { - const flags = super.exit(); - if (flags === 1024) { - this.importsStack.pop(); - } - return flags; + flowParseDeclareOpaqueType(node) { + this.next(); + const finished = this.flowParseOpaqueType(node, true); + finished.type = "DeclareOpaqueType"; + return finished; } - hasImport(name, allowShadow) { - const len = this.importsStack.length; - if (this.importsStack[len - 1].has(name)) { - return true; - } - if (!allowShadow && len > 1) { - for (let i = 0; i < len - 1; i++) { - if (this.importsStack[i].has(name)) return true; - } - } - return false; + flowParseDeclareInterface(node) { + this.next(); + this.flowParseInterfaceish(node, false); + return this.finishNode(node, "DeclareInterface"); } - declareName(name, bindingType, loc) { - if (bindingType & 4096) { - if (this.hasImport(name, true)) { - this.parser.raise(Errors.VarRedeclaration, loc, { - identifierName: name - }); - } - this.importsStack[this.importsStack.length - 1].add(name); - return; - } - const scope = this.currentScope(); - let type = scope.tsNames.get(name) || 0; - if (bindingType & 1024) { - this.maybeExportDefined(scope, name); - scope.tsNames.set(name, type | 16); - return; - } - super.declareName(name, bindingType, loc); - if (bindingType & 2) { - if (!(bindingType & 1)) { - this.checkRedeclarationInScope(scope, name, bindingType, loc); - this.maybeExportDefined(scope, name); - } - type = type | 1; - } - if (bindingType & 256) { - type = type | 2; - } - if (bindingType & 512) { - type = type | 4; + flowParseInterfaceish(node, isClass) { + node.id = this.flowParseRestrictedIdentifier(!isClass, true); + this.scope.declareName(node.id.name, isClass ? 17 : 8201, node.id.loc.start); + if (this.match(47)) { + node.typeParameters = this.flowParseTypeParameterDeclaration(); + } else { + node.typeParameters = null; } - if (bindingType & 128) { - type = type | 8; + node.extends = []; + if (this.eat(81)) { + do { + node.extends.push(this.flowParseInterfaceExtends()); + } while (!isClass && this.eat(12)); } - if (type) scope.tsNames.set(name, type); - } - isRedeclaredInScope(scope, name, bindingType) { - const type = scope.tsNames.get(name); - if ((type & 2) > 0) { - if (bindingType & 256) { - const isConst = !!(bindingType & 512); - const wasConst = (type & 4) > 0; - return isConst !== wasConst; + if (isClass) { + node.implements = []; + node.mixins = []; + if (this.eatContextual(117)) { + do { + node.mixins.push(this.flowParseInterfaceExtends()); + } while (this.eat(12)); } - return true; - } - if (bindingType & 128 && (type & 8) > 0) { - if (scope.names.get(name) & 2) { - return !!(bindingType & 1); - } else { - return false; + if (this.eatContextual(113)) { + do { + node.implements.push(this.flowParseInterfaceExtends()); + } while (this.eat(12)); } } - if (bindingType & 2 && (type & 1) > 0) { - return true; - } - return super.isRedeclaredInScope(scope, name, bindingType); + node.body = this.flowParseObjectType({ + allowStatic: isClass, + allowExact: false, + allowSpread: false, + allowProto: isClass, + allowInexact: false + }); } - checkLocalExport(id) { - const { - name - } = id; - if (this.hasImport(name)) return; - const len = this.scopeStack.length; - for (let i = len - 1; i >= 0; i--) { - const scope = this.scopeStack[i]; - const type = scope.tsNames.get(name); - if ((type & 1) > 0 || (type & 16) > 0) { - return; - } + flowParseInterfaceExtends() { + const node = this.startNode(); + node.id = this.flowParseQualifiedTypeIdentifier(); + if (this.match(47)) { + node.typeParameters = this.flowParseTypeParameterInstantiation(); + } else { + node.typeParameters = null; } - super.checkLocalExport(id); - } -} -class ProductionParameterHandler { - constructor() { - this.stacks = []; - } - enter(flags) { - this.stacks.push(flags); - } - exit() { - this.stacks.pop(); - } - currentFlags() { - return this.stacks[this.stacks.length - 1]; + return this.finishNode(node, "InterfaceExtends"); } - get hasAwait() { - return (this.currentFlags() & 2) > 0; + flowParseInterface(node) { + this.flowParseInterfaceish(node, false); + return this.finishNode(node, "InterfaceDeclaration"); } - get hasYield() { - return (this.currentFlags() & 1) > 0; + checkNotUnderscore(word) { + if (word === "_") { + this.raise(FlowErrors.UnexpectedReservedUnderscore, this.state.startLoc); + } } - get hasReturn() { - return (this.currentFlags() & 4) > 0; + checkReservedType(word, startLoc, declaration) { + if (!reservedTypes.has(word)) return; + this.raise(declaration ? FlowErrors.AssignReservedType : FlowErrors.UnexpectedReservedType, startLoc, { + reservedType: word + }); } - get hasIn() { - return (this.currentFlags() & 8) > 0; + flowParseRestrictedIdentifier(liberal, declaration) { + this.checkReservedType(this.state.value, this.state.startLoc, declaration); + return this.parseIdentifier(liberal); } -} -function functionFlags(isAsync, isGenerator) { - return (isAsync ? 2 : 0) | (isGenerator ? 1 : 0); -} -class BaseParser { - constructor() { - this.sawUnambiguousESM = false; - this.ambiguousScriptDifferentAst = false; + flowParseTypeAlias(node) { + node.id = this.flowParseRestrictedIdentifier(false, true); + this.scope.declareName(node.id.name, 8201, node.id.loc.start); + if (this.match(47)) { + node.typeParameters = this.flowParseTypeParameterDeclaration(); + } else { + node.typeParameters = null; + } + node.right = this.flowParseTypeInitialiser(29); + this.semicolon(); + return this.finishNode(node, "TypeAlias"); } - sourceToOffsetPos(sourcePos) { - return sourcePos + this.startIndex; + flowParseOpaqueType(node, declare) { + this.expectContextual(130); + node.id = this.flowParseRestrictedIdentifier(true, true); + this.scope.declareName(node.id.name, 8201, node.id.loc.start); + if (this.match(47)) { + node.typeParameters = this.flowParseTypeParameterDeclaration(); + } else { + node.typeParameters = null; + } + node.supertype = null; + if (this.match(14)) { + node.supertype = this.flowParseTypeInitialiser(14); + } + node.impltype = null; + if (!declare) { + node.impltype = this.flowParseTypeInitialiser(29); + } + this.semicolon(); + return this.finishNode(node, "OpaqueType"); } - offsetToSourcePos(offsetPos) { - return offsetPos - this.startIndex; + flowParseTypeParameter(requireDefault = false) { + const nodeStartLoc = this.state.startLoc; + const node = this.startNode(); + const variance = this.flowParseVariance(); + const ident = this.flowParseTypeAnnotatableIdentifier(); + node.name = ident.name; + node.variance = variance; + node.bound = ident.typeAnnotation; + if (this.match(29)) { + this.eat(29); + node.default = this.flowParseType(); + } else { + if (requireDefault) { + this.raise(FlowErrors.MissingTypeParamDefault, nodeStartLoc); + } + } + return this.finishNode(node, "TypeParameter"); } - hasPlugin(pluginConfig) { - if (typeof pluginConfig === "string") { - return this.plugins.has(pluginConfig); + flowParseTypeParameterDeclaration() { + const oldInType = this.state.inType; + const node = this.startNode(); + node.params = []; + this.state.inType = true; + if (this.match(47) || this.match(142)) { + this.next(); } else { - const [pluginName, pluginOptions] = pluginConfig; - if (!this.hasPlugin(pluginName)) { - return false; + this.unexpected(); + } + let defaultRequired = false; + do { + const typeParameter = this.flowParseTypeParameter(defaultRequired); + node.params.push(typeParameter); + if (typeParameter.default) { + defaultRequired = true; } - const actualOptions = this.plugins.get(pluginName); - for (const key of Object.keys(pluginOptions)) { - if ((actualOptions == null ? void 0 : actualOptions[key]) !== pluginOptions[key]) { - return false; - } + if (!this.match(48)) { + this.expect(12); } - return true; - } + } while (!this.match(48)); + this.expect(48); + this.state.inType = oldInType; + return this.finishNode(node, "TypeParameterDeclaration"); } - getPluginOption(plugin, name) { - var _this$plugins$get; - return (_this$plugins$get = this.plugins.get(plugin)) == null ? void 0 : _this$plugins$get[name]; + flowParseTypeParameterInstantiation() { + const node = this.startNode(); + const oldInType = this.state.inType; + node.params = []; + this.state.inType = true; + this.expect(47); + const oldNoAnonFunctionType = this.state.noAnonFunctionType; + this.state.noAnonFunctionType = false; + while (!this.match(48)) { + node.params.push(this.flowParseType()); + if (!this.match(48)) { + this.expect(12); + } + } + this.state.noAnonFunctionType = oldNoAnonFunctionType; + this.expect(48); + this.state.inType = oldInType; + return this.finishNode(node, "TypeParameterInstantiation"); } -} -function setTrailingComments(node, comments) { - if (node.trailingComments === undefined) { - node.trailingComments = comments; - } else { - node.trailingComments.unshift(...comments); + flowParseTypeParameterInstantiationCallOrNew() { + const node = this.startNode(); + const oldInType = this.state.inType; + node.params = []; + this.state.inType = true; + this.expect(47); + while (!this.match(48)) { + node.params.push(this.flowParseTypeOrImplicitInstantiation()); + if (!this.match(48)) { + this.expect(12); + } + } + this.expect(48); + this.state.inType = oldInType; + return this.finishNode(node, "TypeParameterInstantiation"); } -} -function setLeadingComments(node, comments) { - if (node.leadingComments === undefined) { - node.leadingComments = comments; - } else { - node.leadingComments.unshift(...comments); + flowParseInterfaceType() { + const node = this.startNode(); + this.expectContextual(129); + node.extends = []; + if (this.eat(81)) { + do { + node.extends.push(this.flowParseInterfaceExtends()); + } while (this.eat(12)); + } + node.body = this.flowParseObjectType({ + allowStatic: false, + allowExact: false, + allowSpread: false, + allowProto: false, + allowInexact: false + }); + return this.finishNode(node, "InterfaceTypeAnnotation"); } -} -function setInnerComments(node, comments) { - if (node.innerComments === undefined) { - node.innerComments = comments; - } else { - node.innerComments.unshift(...comments); + flowParseObjectPropertyKey() { + return this.match(134) || this.match(133) ? super.parseExprAtom() : this.parseIdentifier(true); } -} -function adjustInnerComments(node, elements, commentWS) { - let lastElement = null; - let i = elements.length; - while (lastElement === null && i > 0) { - lastElement = elements[--i]; + flowParseObjectTypeIndexer(node, isStatic, variance) { + node.static = isStatic; + if (this.lookahead().type === 14) { + node.id = this.flowParseObjectPropertyKey(); + node.key = this.flowParseTypeInitialiser(); + } else { + node.id = null; + node.key = this.flowParseType(); + } + this.expect(3); + node.value = this.flowParseTypeInitialiser(); + node.variance = variance; + return this.finishNode(node, "ObjectTypeIndexer"); } - if (lastElement === null || lastElement.start > commentWS.start) { - setInnerComments(node, commentWS.comments); - } else { - setTrailingComments(lastElement, commentWS.comments); + flowParseObjectTypeInternalSlot(node, isStatic) { + node.static = isStatic; + node.id = this.flowParseObjectPropertyKey(); + this.expect(3); + this.expect(3); + if (this.match(47) || this.match(10)) { + node.method = true; + node.optional = false; + node.value = this.flowParseObjectTypeMethodish(this.startNodeAt(node.loc.start)); + } else { + node.method = false; + if (this.eat(17)) { + node.optional = true; + } + node.value = this.flowParseTypeInitialiser(); + } + return this.finishNode(node, "ObjectTypeInternalSlot"); } -} -class CommentsParser extends BaseParser { - addComment(comment) { - if (this.filename) comment.loc.filename = this.filename; - const { - commentsLen - } = this.state; - if (this.comments.length !== commentsLen) { - this.comments.length = commentsLen; + flowParseObjectTypeMethodish(node) { + node.params = []; + node.rest = null; + node.typeParameters = null; + node.this = null; + if (this.match(47)) { + node.typeParameters = this.flowParseTypeParameterDeclaration(); } - this.comments.push(comment); - this.state.commentsLen++; + this.expect(10); + if (this.match(78)) { + node.this = this.flowParseFunctionTypeParam(true); + node.this.name = null; + if (!this.match(11)) { + this.expect(12); + } + } + while (!this.match(11) && !this.match(21)) { + node.params.push(this.flowParseFunctionTypeParam(false)); + if (!this.match(11)) { + this.expect(12); + } + } + if (this.eat(21)) { + node.rest = this.flowParseFunctionTypeParam(false); + } + this.expect(11); + node.returnType = this.flowParseTypeInitialiser(); + return this.finishNode(node, "FunctionTypeAnnotation"); } - processComment(node) { - const { - commentStack - } = this.state; - const commentStackLength = commentStack.length; - if (commentStackLength === 0) return; - let i = commentStackLength - 1; - const lastCommentWS = commentStack[i]; - if (lastCommentWS.start === node.end) { - lastCommentWS.leadingNode = node; - i--; + flowParseObjectTypeCallProperty(node, isStatic) { + const valueNode = this.startNode(); + node.static = isStatic; + node.value = this.flowParseObjectTypeMethodish(valueNode); + return this.finishNode(node, "ObjectTypeCallProperty"); + } + flowParseObjectType({ + allowStatic, + allowExact, + allowSpread, + allowProto, + allowInexact + }) { + const oldInType = this.state.inType; + this.state.inType = true; + const nodeStart = this.startNode(); + nodeStart.callProperties = []; + nodeStart.properties = []; + nodeStart.indexers = []; + nodeStart.internalSlots = []; + let endDelim; + let exact; + let inexact = false; + if (allowExact && this.match(6)) { + this.expect(6); + endDelim = 9; + exact = true; + } else { + this.expect(5); + endDelim = 8; + exact = false; } - const { - start: nodeStart - } = node; - for (; i >= 0; i--) { - const commentWS = commentStack[i]; - const commentEnd = commentWS.end; - if (commentEnd > nodeStart) { - commentWS.containingNode = node; - this.finalizeComment(commentWS); - commentStack.splice(i, 1); + nodeStart.exact = exact; + while (!this.match(endDelim)) { + let isStatic = false; + let protoStartLoc = null; + let inexactStartLoc = null; + const node = this.startNode(); + if (allowProto && this.isContextual(118)) { + const lookahead = this.lookahead(); + if (lookahead.type !== 14 && lookahead.type !== 17) { + this.next(); + protoStartLoc = this.state.startLoc; + allowStatic = false; + } + } + if (allowStatic && this.isContextual(106)) { + const lookahead = this.lookahead(); + if (lookahead.type !== 14 && lookahead.type !== 17) { + this.next(); + isStatic = true; + } + } + const variance = this.flowParseVariance(); + if (this.eat(0)) { + if (protoStartLoc != null) { + this.unexpected(protoStartLoc); + } + if (this.eat(0)) { + if (variance) { + this.unexpected(variance.loc.start); + } + nodeStart.internalSlots.push(this.flowParseObjectTypeInternalSlot(node, isStatic)); + } else { + nodeStart.indexers.push(this.flowParseObjectTypeIndexer(node, isStatic, variance)); + } + } else if (this.match(10) || this.match(47)) { + if (protoStartLoc != null) { + this.unexpected(protoStartLoc); + } + if (variance) { + this.unexpected(variance.loc.start); + } + nodeStart.callProperties.push(this.flowParseObjectTypeCallProperty(node, isStatic)); } else { - if (commentEnd === nodeStart) { - commentWS.trailingNode = node; + let kind = "init"; + if (this.isContextual(99) || this.isContextual(104)) { + const lookahead = this.lookahead(); + if (tokenIsLiteralPropertyName(lookahead.type)) { + kind = this.state.value; + this.next(); + } } - break; + const propOrInexact = this.flowParseObjectTypeProperty(node, isStatic, protoStartLoc, variance, kind, allowSpread, allowInexact != null ? allowInexact : !exact); + if (propOrInexact === null) { + inexact = true; + inexactStartLoc = this.state.lastTokStartLoc; + } else { + nodeStart.properties.push(propOrInexact); + } + } + this.flowObjectTypeSemicolon(); + if (inexactStartLoc && !this.match(8) && !this.match(9)) { + this.raise(FlowErrors.UnexpectedExplicitInexactInObject, inexactStartLoc); } } + this.expect(endDelim); + if (allowSpread) { + nodeStart.inexact = inexact; + } + const out = this.finishNode(nodeStart, "ObjectTypeAnnotation"); + this.state.inType = oldInType; + return out; } - finalizeComment(commentWS) { - var _node$options; - const { - comments - } = commentWS; - if (commentWS.leadingNode !== null || commentWS.trailingNode !== null) { - if (commentWS.leadingNode !== null) { - setTrailingComments(commentWS.leadingNode, comments); + flowParseObjectTypeProperty(node, isStatic, protoStartLoc, variance, kind, allowSpread, allowInexact) { + if (this.eat(21)) { + const isInexactToken = this.match(12) || this.match(13) || this.match(8) || this.match(9); + if (isInexactToken) { + if (!allowSpread) { + this.raise(FlowErrors.InexactInsideNonObject, this.state.lastTokStartLoc); + } else if (!allowInexact) { + this.raise(FlowErrors.InexactInsideExact, this.state.lastTokStartLoc); + } + if (variance) { + this.raise(FlowErrors.InexactVariance, variance); + } + return null; } - if (commentWS.trailingNode !== null) { - setLeadingComments(commentWS.trailingNode, comments); + if (!allowSpread) { + this.raise(FlowErrors.UnexpectedSpreadType, this.state.lastTokStartLoc); } + if (protoStartLoc != null) { + this.unexpected(protoStartLoc); + } + if (variance) { + this.raise(FlowErrors.SpreadVariance, variance); + } + node.argument = this.flowParseType(); + return this.finishNode(node, "ObjectTypeSpreadProperty"); } else { - const { - containingNode: node, - start: commentStart - } = commentWS; - if (this.input.charCodeAt(this.offsetToSourcePos(commentStart) - 1) === 44) { - switch (node.type) { - case "ObjectExpression": - case "ObjectPattern": - case "RecordExpression": - adjustInnerComments(node, node.properties, commentWS); - break; - case "CallExpression": - case "OptionalCallExpression": - adjustInnerComments(node, node.arguments, commentWS); - break; - case "ImportExpression": - adjustInnerComments(node, [node.source, (_node$options = node.options) != null ? _node$options : null], commentWS); - break; - case "FunctionDeclaration": - case "FunctionExpression": - case "ArrowFunctionExpression": - case "ObjectMethod": - case "ClassMethod": - case "ClassPrivateMethod": - adjustInnerComments(node, node.params, commentWS); - break; - case "ArrayExpression": - case "ArrayPattern": - case "TupleExpression": - adjustInnerComments(node, node.elements, commentWS); - break; - case "ExportNamedDeclaration": - case "ImportDeclaration": - adjustInnerComments(node, node.specifiers, commentWS); - break; - case "TSEnumDeclaration": - { - adjustInnerComments(node, node.members, commentWS); - } - break; - case "TSEnumBody": - adjustInnerComments(node, node.members, commentWS); - break; - default: - { - setInnerComments(node, comments); - } + node.key = this.flowParseObjectPropertyKey(); + node.static = isStatic; + node.proto = protoStartLoc != null; + node.kind = kind; + let optional = false; + if (this.match(47) || this.match(10)) { + node.method = true; + if (protoStartLoc != null) { + this.unexpected(protoStartLoc); + } + if (variance) { + this.unexpected(variance.loc.start); + } + node.value = this.flowParseObjectTypeMethodish(this.startNodeAt(node.loc.start)); + if (kind === "get" || kind === "set") { + this.flowCheckGetterSetterParams(node); + } + if (!allowSpread && node.key.name === "constructor" && node.value.this) { + this.raise(FlowErrors.ThisParamBannedInConstructor, node.value.this); } } else { - setInnerComments(node, comments); + if (kind !== "init") this.unexpected(); + node.method = false; + if (this.eat(17)) { + optional = true; + } + node.value = this.flowParseTypeInitialiser(); + node.variance = variance; } + node.optional = optional; + return this.finishNode(node, "ObjectTypeProperty"); } } - finalizeRemainingComments() { - const { - commentStack - } = this.state; - for (let i = commentStack.length - 1; i >= 0; i--) { - this.finalizeComment(commentStack[i]); + flowCheckGetterSetterParams(property) { + const paramCount = property.kind === "get" ? 0 : 1; + const length = property.value.params.length + (property.value.rest ? 1 : 0); + if (property.value.this) { + this.raise(property.kind === "get" ? FlowErrors.GetterMayNotHaveThisParam : FlowErrors.SetterMayNotHaveThisParam, property.value.this); + } + if (length !== paramCount) { + this.raise(property.kind === "get" ? Errors.BadGetterArity : Errors.BadSetterArity, property); + } + if (property.kind === "set" && property.value.rest) { + this.raise(Errors.BadSetterRestParameter, property); } - this.state.commentStack = []; } - resetPreviousNodeTrailingComments(node) { - const { - commentStack - } = this.state; - const { - length - } = commentStack; - if (length === 0) return; - const commentWS = commentStack[length - 1]; - if (commentWS.leadingNode === node) { - commentWS.leadingNode = null; + flowObjectTypeSemicolon() { + if (!this.eat(13) && !this.eat(12) && !this.match(8) && !this.match(9)) { + this.unexpected(); + } + } + flowParseQualifiedTypeIdentifier(startLoc, id) { + var _startLoc; + (_startLoc = startLoc) != null ? _startLoc : startLoc = this.state.startLoc; + let node = id || this.flowParseRestrictedIdentifier(true); + while (this.eat(16)) { + const node2 = this.startNodeAt(startLoc); + node2.qualification = node; + node2.id = this.flowParseRestrictedIdentifier(true); + node = this.finishNode(node2, "QualifiedTypeIdentifier"); + } + return node; + } + flowParseGenericType(startLoc, id) { + const node = this.startNodeAt(startLoc); + node.typeParameters = null; + node.id = this.flowParseQualifiedTypeIdentifier(startLoc, id); + if (this.match(47)) { + node.typeParameters = this.flowParseTypeParameterInstantiation(); + } + return this.finishNode(node, "GenericTypeAnnotation"); + } + flowParseTypeofType() { + const node = this.startNode(); + this.expect(87); + node.argument = this.flowParsePrimaryType(); + return this.finishNode(node, "TypeofTypeAnnotation"); + } + flowParseTupleType() { + const node = this.startNode(); + node.types = []; + this.expect(0); + while (this.state.pos < this.length && !this.match(3)) { + node.types.push(this.flowParseType()); + if (this.match(3)) break; + this.expect(12); + } + this.expect(3); + return this.finishNode(node, "TupleTypeAnnotation"); + } + flowParseFunctionTypeParam(first) { + let name = null; + let optional = false; + let typeAnnotation = null; + const node = this.startNode(); + const lh = this.lookahead(); + const isThis = this.state.type === 78; + if (lh.type === 14 || lh.type === 17) { + if (isThis && !first) { + this.raise(FlowErrors.ThisParamMustBeFirst, node); + } + name = this.parseIdentifier(isThis); + if (this.eat(17)) { + optional = true; + if (isThis) { + this.raise(FlowErrors.ThisParamMayNotBeOptional, node); + } + } + typeAnnotation = this.flowParseTypeInitialiser(); + } else { + typeAnnotation = this.flowParseType(); } + node.name = name; + node.optional = optional; + node.typeAnnotation = typeAnnotation; + return this.finishNode(node, "FunctionTypeParam"); } - takeSurroundingComments(node, start, end) { - const { - commentStack - } = this.state; - const commentStackLength = commentStack.length; - if (commentStackLength === 0) return; - let i = commentStackLength - 1; - for (; i >= 0; i--) { - const commentWS = commentStack[i]; - const commentEnd = commentWS.end; - const commentStart = commentWS.start; - if (commentStart === end) { - commentWS.leadingNode = node; - } else if (commentEnd === start) { - commentWS.trailingNode = node; - } else if (commentEnd < start) { - break; + reinterpretTypeAsFunctionTypeParam(type) { + const node = this.startNodeAt(type.loc.start); + node.name = null; + node.optional = false; + node.typeAnnotation = type; + return this.finishNode(node, "FunctionTypeParam"); + } + flowParseFunctionTypeParams(params = []) { + let rest = null; + let _this = null; + if (this.match(78)) { + _this = this.flowParseFunctionTypeParam(true); + _this.name = null; + if (!this.match(11)) { + this.expect(12); } } - } -} -class State { - constructor() { - this.flags = 1024; - this.startIndex = void 0; - this.curLine = void 0; - this.lineStart = void 0; - this.startLoc = void 0; - this.endLoc = void 0; - this.errors = []; - this.potentialArrowAt = -1; - this.noArrowAt = []; - this.noArrowParamsConversionAt = []; - this.topicContext = { - maxNumOfResolvableTopics: 0, - maxTopicIndex: null + while (!this.match(11) && !this.match(21)) { + params.push(this.flowParseFunctionTypeParam(false)); + if (!this.match(11)) { + this.expect(12); + } + } + if (this.eat(21)) { + rest = this.flowParseFunctionTypeParam(false); + } + return { + params, + rest, + _this }; - this.labels = []; - this.commentsLen = 0; - this.commentStack = []; - this.pos = 0; - this.type = 140; - this.value = null; - this.start = 0; - this.end = 0; - this.lastTokEndLoc = null; - this.lastTokStartLoc = null; - this.context = [types.brace]; - this.firstInvalidTemplateEscapePos = null; - this.strictErrors = new Map(); - this.tokensLength = 0; - } - get strict() { - return (this.flags & 1) > 0; - } - set strict(v) { - if (v) this.flags |= 1;else this.flags &= -2; - } - init({ - strictMode, - sourceType, - startIndex, - startLine, - startColumn - }) { - this.strict = strictMode === false ? false : strictMode === true ? true : sourceType === "module"; - this.startIndex = startIndex; - this.curLine = startLine; - this.lineStart = -startColumn; - this.startLoc = this.endLoc = new Position(startLine, startColumn, startIndex); - } - get maybeInArrowParameters() { - return (this.flags & 2) > 0; } - set maybeInArrowParameters(v) { - if (v) this.flags |= 2;else this.flags &= -3; + flowIdentToTypeAnnotation(startLoc, node, id) { + switch (id.name) { + case "any": + return this.finishNode(node, "AnyTypeAnnotation"); + case "bool": + case "boolean": + return this.finishNode(node, "BooleanTypeAnnotation"); + case "mixed": + return this.finishNode(node, "MixedTypeAnnotation"); + case "empty": + return this.finishNode(node, "EmptyTypeAnnotation"); + case "number": + return this.finishNode(node, "NumberTypeAnnotation"); + case "string": + return this.finishNode(node, "StringTypeAnnotation"); + case "symbol": + return this.finishNode(node, "SymbolTypeAnnotation"); + default: + this.checkNotUnderscore(id.name); + return this.flowParseGenericType(startLoc, id); + } } - get inType() { - return (this.flags & 4) > 0; + flowParsePrimaryType() { + const startLoc = this.state.startLoc; + const node = this.startNode(); + let tmp; + let type; + let isGroupedType = false; + const oldNoAnonFunctionType = this.state.noAnonFunctionType; + switch (this.state.type) { + case 5: + return this.flowParseObjectType({ + allowStatic: false, + allowExact: false, + allowSpread: true, + allowProto: false, + allowInexact: true + }); + case 6: + return this.flowParseObjectType({ + allowStatic: false, + allowExact: true, + allowSpread: true, + allowProto: false, + allowInexact: false + }); + case 0: + this.state.noAnonFunctionType = false; + type = this.flowParseTupleType(); + this.state.noAnonFunctionType = oldNoAnonFunctionType; + return type; + case 47: + { + const node = this.startNode(); + node.typeParameters = this.flowParseTypeParameterDeclaration(); + this.expect(10); + tmp = this.flowParseFunctionTypeParams(); + node.params = tmp.params; + node.rest = tmp.rest; + node.this = tmp._this; + this.expect(11); + this.expect(19); + node.returnType = this.flowParseType(); + return this.finishNode(node, "FunctionTypeAnnotation"); + } + case 10: + { + const node = this.startNode(); + this.next(); + if (!this.match(11) && !this.match(21)) { + if (tokenIsIdentifier(this.state.type) || this.match(78)) { + const token = this.lookahead().type; + isGroupedType = token !== 17 && token !== 14; + } else { + isGroupedType = true; + } + } + if (isGroupedType) { + this.state.noAnonFunctionType = false; + type = this.flowParseType(); + this.state.noAnonFunctionType = oldNoAnonFunctionType; + if (this.state.noAnonFunctionType || !(this.match(12) || this.match(11) && this.lookahead().type === 19)) { + this.expect(11); + return type; + } else { + this.eat(12); + } + } + if (type) { + tmp = this.flowParseFunctionTypeParams([this.reinterpretTypeAsFunctionTypeParam(type)]); + } else { + tmp = this.flowParseFunctionTypeParams(); + } + node.params = tmp.params; + node.rest = tmp.rest; + node.this = tmp._this; + this.expect(11); + this.expect(19); + node.returnType = this.flowParseType(); + node.typeParameters = null; + return this.finishNode(node, "FunctionTypeAnnotation"); + } + case 133: + return this.parseLiteral(this.state.value, "StringLiteralTypeAnnotation"); + case 85: + case 86: + node.value = this.match(85); + this.next(); + return this.finishNode(node, "BooleanLiteralTypeAnnotation"); + case 53: + if (this.state.value === "-") { + this.next(); + if (this.match(134)) { + return this.parseLiteralAtNode(-this.state.value, "NumberLiteralTypeAnnotation", node); + } + if (this.match(135)) { + return this.parseLiteralAtNode(-this.state.value, "BigIntLiteralTypeAnnotation", node); + } + throw this.raise(FlowErrors.UnexpectedSubtractionOperand, this.state.startLoc); + } + this.unexpected(); + return; + case 134: + return this.parseLiteral(this.state.value, "NumberLiteralTypeAnnotation"); + case 135: + return this.parseLiteral(this.state.value, "BigIntLiteralTypeAnnotation"); + case 88: + this.next(); + return this.finishNode(node, "VoidTypeAnnotation"); + case 84: + this.next(); + return this.finishNode(node, "NullLiteralTypeAnnotation"); + case 78: + this.next(); + return this.finishNode(node, "ThisTypeAnnotation"); + case 55: + this.next(); + return this.finishNode(node, "ExistsTypeAnnotation"); + case 87: + return this.flowParseTypeofType(); + default: + if (tokenIsKeyword(this.state.type)) { + const label = tokenLabelName(this.state.type); + this.next(); + return super.createIdentifier(node, label); + } else if (tokenIsIdentifier(this.state.type)) { + if (this.isContextual(129)) { + return this.flowParseInterfaceType(); + } + return this.flowIdentToTypeAnnotation(startLoc, node, this.parseIdentifier()); + } + } + this.unexpected(); } - set inType(v) { - if (v) this.flags |= 4;else this.flags &= -5; + flowParsePostfixType() { + const startLoc = this.state.startLoc; + let type = this.flowParsePrimaryType(); + let seenOptionalIndexedAccess = false; + while ((this.match(0) || this.match(18)) && !this.canInsertSemicolon()) { + const node = this.startNodeAt(startLoc); + const optional = this.eat(18); + seenOptionalIndexedAccess = seenOptionalIndexedAccess || optional; + this.expect(0); + if (!optional && this.match(3)) { + node.elementType = type; + this.next(); + type = this.finishNode(node, "ArrayTypeAnnotation"); + } else { + node.objectType = type; + node.indexType = this.flowParseType(); + this.expect(3); + if (seenOptionalIndexedAccess) { + node.optional = optional; + type = this.finishNode(node, "OptionalIndexedAccessType"); + } else { + type = this.finishNode(node, "IndexedAccessType"); + } + } + } + return type; } - get noAnonFunctionType() { - return (this.flags & 8) > 0; + flowParsePrefixType() { + const node = this.startNode(); + if (this.eat(17)) { + node.typeAnnotation = this.flowParsePrefixType(); + return this.finishNode(node, "NullableTypeAnnotation"); + } else { + return this.flowParsePostfixType(); + } } - set noAnonFunctionType(v) { - if (v) this.flags |= 8;else this.flags &= -9; + flowParseAnonFunctionWithoutParens() { + const param = this.flowParsePrefixType(); + if (!this.state.noAnonFunctionType && this.eat(19)) { + const node = this.startNodeAt(param.loc.start); + node.params = [this.reinterpretTypeAsFunctionTypeParam(param)]; + node.rest = null; + node.this = null; + node.returnType = this.flowParseType(); + node.typeParameters = null; + return this.finishNode(node, "FunctionTypeAnnotation"); + } + return param; } - get hasFlowComment() { - return (this.flags & 16) > 0; + flowParseIntersectionType() { + const node = this.startNode(); + this.eat(45); + const type = this.flowParseAnonFunctionWithoutParens(); + node.types = [type]; + while (this.eat(45)) { + node.types.push(this.flowParseAnonFunctionWithoutParens()); + } + return node.types.length === 1 ? type : this.finishNode(node, "IntersectionTypeAnnotation"); } - set hasFlowComment(v) { - if (v) this.flags |= 16;else this.flags &= -17; + flowParseUnionType() { + const node = this.startNode(); + this.eat(43); + const type = this.flowParseIntersectionType(); + node.types = [type]; + while (this.eat(43)) { + node.types.push(this.flowParseIntersectionType()); + } + return node.types.length === 1 ? type : this.finishNode(node, "UnionTypeAnnotation"); } - get isAmbientContext() { - return (this.flags & 32) > 0; + flowParseType() { + const oldInType = this.state.inType; + this.state.inType = true; + const type = this.flowParseUnionType(); + this.state.inType = oldInType; + return type; } - set isAmbientContext(v) { - if (v) this.flags |= 32;else this.flags &= -33; + flowParseTypeOrImplicitInstantiation() { + if (this.state.type === 132 && this.state.value === "_") { + const startLoc = this.state.startLoc; + const node = this.parseIdentifier(); + return this.flowParseGenericType(startLoc, node); + } else { + return this.flowParseType(); + } } - get inAbstractClass() { - return (this.flags & 64) > 0; + flowParseTypeAnnotation() { + const node = this.startNode(); + node.typeAnnotation = this.flowParseTypeInitialiser(); + return this.finishNode(node, "TypeAnnotation"); } - set inAbstractClass(v) { - if (v) this.flags |= 64;else this.flags &= -65; + flowParseTypeAnnotatableIdentifier(allowPrimitiveOverride) { + const ident = allowPrimitiveOverride ? this.parseIdentifier() : this.flowParseRestrictedIdentifier(); + if (this.match(14)) { + ident.typeAnnotation = this.flowParseTypeAnnotation(); + this.resetEndLocation(ident); + } + return ident; } - get inDisallowConditionalTypesContext() { - return (this.flags & 128) > 0; + typeCastToParameter(node) { + node.expression.typeAnnotation = node.typeAnnotation; + this.resetEndLocation(node.expression, node.typeAnnotation.loc.end); + return node.expression; } - set inDisallowConditionalTypesContext(v) { - if (v) this.flags |= 128;else this.flags &= -129; + flowParseVariance() { + let variance = null; + if (this.match(53)) { + variance = this.startNode(); + if (this.state.value === "+") { + variance.kind = "plus"; + } else { + variance.kind = "minus"; + } + this.next(); + return this.finishNode(variance, "Variance"); + } + return variance; } - get soloAwait() { - return (this.flags & 256) > 0; + parseFunctionBody(node, allowExpressionBody, isMethod = false) { + if (allowExpressionBody) { + this.forwardNoArrowParamsConversionAt(node, () => super.parseFunctionBody(node, true, isMethod)); + return; + } + super.parseFunctionBody(node, false, isMethod); } - set soloAwait(v) { - if (v) this.flags |= 256;else this.flags &= -257; + parseFunctionBodyAndFinish(node, type, isMethod = false) { + if (this.match(14)) { + const typeNode = this.startNode(); + [typeNode.typeAnnotation, node.predicate] = this.flowParseTypeAndPredicateInitialiser(); + node.returnType = typeNode.typeAnnotation ? this.finishNode(typeNode, "TypeAnnotation") : null; + } + return super.parseFunctionBodyAndFinish(node, type, isMethod); } - get inFSharpPipelineDirectBody() { - return (this.flags & 512) > 0; + parseStatementLike(flags) { + if (this.state.strict && this.isContextual(129)) { + const lookahead = this.lookahead(); + if (tokenIsKeywordOrIdentifier(lookahead.type)) { + const node = this.startNode(); + this.next(); + return this.flowParseInterface(node); + } + } else if (this.shouldParseEnums() && this.isContextual(126)) { + const node = this.startNode(); + this.next(); + return this.flowParseEnumDeclaration(node); + } + const stmt = super.parseStatementLike(flags); + if (this.flowPragma === undefined && !this.isValidDirective(stmt)) { + this.flowPragma = null; + } + return stmt; } - set inFSharpPipelineDirectBody(v) { - if (v) this.flags |= 512;else this.flags &= -513; + parseExpressionStatement(node, expr, decorators) { + if (expr.type === "Identifier") { + if (expr.name === "declare") { + if (this.match(80) || tokenIsIdentifier(this.state.type) || this.match(68) || this.match(74) || this.match(82)) { + return this.flowParseDeclare(node); + } + } else if (tokenIsIdentifier(this.state.type)) { + if (expr.name === "interface") { + return this.flowParseInterface(node); + } else if (expr.name === "type") { + return this.flowParseTypeAlias(node); + } else if (expr.name === "opaque") { + return this.flowParseOpaqueType(node, false); + } + } + } + return super.parseExpressionStatement(node, expr, decorators); } - get canStartJSXElement() { - return (this.flags & 1024) > 0; + shouldParseExportDeclaration() { + const { + type + } = this.state; + if (tokenIsFlowInterfaceOrTypeOrOpaque(type) || this.shouldParseEnums() && type === 126) { + return !this.state.containsEsc; + } + return super.shouldParseExportDeclaration(); } - set canStartJSXElement(v) { - if (v) this.flags |= 1024;else this.flags &= -1025; + isExportDefaultSpecifier() { + const { + type + } = this.state; + if (tokenIsFlowInterfaceOrTypeOrOpaque(type) || this.shouldParseEnums() && type === 126) { + return this.state.containsEsc; + } + return super.isExportDefaultSpecifier(); } - get containsEsc() { - return (this.flags & 2048) > 0; + parseExportDefaultExpression() { + if (this.shouldParseEnums() && this.isContextual(126)) { + const node = this.startNode(); + this.next(); + return this.flowParseEnumDeclaration(node); + } + return super.parseExportDefaultExpression(); } - set containsEsc(v) { - if (v) this.flags |= 2048;else this.flags &= -2049; + parseConditional(expr, startLoc, refExpressionErrors) { + if (!this.match(17)) return expr; + if (this.state.maybeInArrowParameters) { + const nextCh = this.lookaheadCharCode(); + if (nextCh === 44 || nextCh === 61 || nextCh === 58 || nextCh === 41) { + this.setOptionalParametersError(refExpressionErrors); + return expr; + } + } + this.expect(17); + const state = this.state.clone(); + const originalNoArrowAt = this.state.noArrowAt; + const node = this.startNodeAt(startLoc); + let { + consequent, + failed + } = this.tryParseConditionalConsequent(); + let [valid, invalid] = this.getArrowLikeExpressions(consequent); + if (failed || invalid.length > 0) { + const noArrowAt = [...originalNoArrowAt]; + if (invalid.length > 0) { + this.state = state; + this.state.noArrowAt = noArrowAt; + for (let i = 0; i < invalid.length; i++) { + noArrowAt.push(invalid[i].start); + } + ({ + consequent, + failed + } = this.tryParseConditionalConsequent()); + [valid, invalid] = this.getArrowLikeExpressions(consequent); + } + if (failed && valid.length > 1) { + this.raise(FlowErrors.AmbiguousConditionalArrow, state.startLoc); + } + if (failed && valid.length === 1) { + this.state = state; + noArrowAt.push(valid[0].start); + this.state.noArrowAt = noArrowAt; + ({ + consequent, + failed + } = this.tryParseConditionalConsequent()); + } + } + this.getArrowLikeExpressions(consequent, true); + this.state.noArrowAt = originalNoArrowAt; + this.expect(14); + node.test = expr; + node.consequent = consequent; + node.alternate = this.forwardNoArrowParamsConversionAt(node, () => this.parseMaybeAssign(undefined, undefined)); + return this.finishNode(node, "ConditionalExpression"); } - get hasTopLevelAwait() { - return (this.flags & 4096) > 0; + tryParseConditionalConsequent() { + this.state.noArrowParamsConversionAt.push(this.state.start); + const consequent = this.parseMaybeAssignAllowIn(); + const failed = !this.match(14); + this.state.noArrowParamsConversionAt.pop(); + return { + consequent, + failed + }; } - set hasTopLevelAwait(v) { - if (v) this.flags |= 4096;else this.flags &= -4097; + getArrowLikeExpressions(node, disallowInvalid) { + const stack = [node]; + const arrows = []; + while (stack.length !== 0) { + const node = stack.pop(); + if (node.type === "ArrowFunctionExpression" && node.body.type !== "BlockStatement") { + if (node.typeParameters || !node.returnType) { + this.finishArrowValidation(node); + } else { + arrows.push(node); + } + stack.push(node.body); + } else if (node.type === "ConditionalExpression") { + stack.push(node.consequent); + stack.push(node.alternate); + } + } + if (disallowInvalid) { + arrows.forEach(node => this.finishArrowValidation(node)); + return [arrows, []]; + } + return partition(arrows, node => node.params.every(param => this.isAssignable(param, true))); } - curPosition() { - return new Position(this.curLine, this.pos - this.lineStart, this.pos + this.startIndex); + finishArrowValidation(node) { + var _node$extra; + this.toAssignableList(node.params, (_node$extra = node.extra) == null ? void 0 : _node$extra.trailingCommaLoc, false); + this.scope.enter(2 | 4); + super.checkParams(node, false, true); + this.scope.exit(); } - clone() { - const state = new State(); - state.flags = this.flags; - state.startIndex = this.startIndex; - state.curLine = this.curLine; - state.lineStart = this.lineStart; - state.startLoc = this.startLoc; - state.endLoc = this.endLoc; - state.errors = this.errors.slice(); - state.potentialArrowAt = this.potentialArrowAt; - state.noArrowAt = this.noArrowAt.slice(); - state.noArrowParamsConversionAt = this.noArrowParamsConversionAt.slice(); - state.topicContext = this.topicContext; - state.labels = this.labels.slice(); - state.commentsLen = this.commentsLen; - state.commentStack = this.commentStack.slice(); - state.pos = this.pos; - state.type = this.type; - state.value = this.value; - state.start = this.start; - state.end = this.end; - state.lastTokEndLoc = this.lastTokEndLoc; - state.lastTokStartLoc = this.lastTokStartLoc; - state.context = this.context.slice(); - state.firstInvalidTemplateEscapePos = this.firstInvalidTemplateEscapePos; - state.strictErrors = this.strictErrors; - state.tokensLength = this.tokensLength; - return state; + forwardNoArrowParamsConversionAt(node, parse) { + let result; + if (this.state.noArrowParamsConversionAt.includes(node.start)) { + this.state.noArrowParamsConversionAt.push(this.state.start); + result = parse(); + this.state.noArrowParamsConversionAt.pop(); + } else { + result = parse(); + } + return result; } -} -var _isDigit = function isDigit(code) { - return code >= 48 && code <= 57; -}; -const forbiddenNumericSeparatorSiblings = { - decBinOct: new Set([46, 66, 69, 79, 95, 98, 101, 111]), - hex: new Set([46, 88, 95, 120]) -}; -const isAllowedNumericSeparatorSibling = { - bin: ch => ch === 48 || ch === 49, - oct: ch => ch >= 48 && ch <= 55, - dec: ch => ch >= 48 && ch <= 57, - hex: ch => ch >= 48 && ch <= 57 || ch >= 65 && ch <= 70 || ch >= 97 && ch <= 102 -}; -function readStringContents(type, input, pos, lineStart, curLine, errors) { - const initialPos = pos; - const initialLineStart = lineStart; - const initialCurLine = curLine; - let out = ""; - let firstInvalidLoc = null; - let chunkStart = pos; - const { - length - } = input; - for (;;) { - if (pos >= length) { - errors.unterminated(initialPos, initialLineStart, initialCurLine); - out += input.slice(chunkStart, pos); - break; + parseParenItem(node, startLoc) { + const newNode = super.parseParenItem(node, startLoc); + if (this.eat(17)) { + newNode.optional = true; + this.resetEndLocation(node); } - const ch = input.charCodeAt(pos); - if (isStringEnd(type, ch, input, pos)) { - out += input.slice(chunkStart, pos); - break; + if (this.match(14)) { + const typeCastNode = this.startNodeAt(startLoc); + typeCastNode.expression = newNode; + typeCastNode.typeAnnotation = this.flowParseTypeAnnotation(); + return this.finishNode(typeCastNode, "TypeCastExpression"); } - if (ch === 92) { - out += input.slice(chunkStart, pos); - const res = readEscapedChar(input, pos, lineStart, curLine, type === "template", errors); - if (res.ch === null && !firstInvalidLoc) { - firstInvalidLoc = { - pos, - lineStart, - curLine - }; - } else { - out += res.ch; - } - ({ - pos, - lineStart, - curLine - } = res); - chunkStart = pos; - } else if (ch === 8232 || ch === 8233) { - ++pos; - ++curLine; - lineStart = pos; - } else if (ch === 10 || ch === 13) { - if (type === "template") { - out += input.slice(chunkStart, pos) + "\n"; - ++pos; - if (ch === 13 && input.charCodeAt(pos) === 10) { - ++pos; - } - ++curLine; - chunkStart = lineStart = pos; + return newNode; + } + assertModuleNodeAllowed(node) { + if (node.type === "ImportDeclaration" && (node.importKind === "type" || node.importKind === "typeof") || node.type === "ExportNamedDeclaration" && node.exportKind === "type" || node.type === "ExportAllDeclaration" && node.exportKind === "type") { + return; + } + super.assertModuleNodeAllowed(node); + } + parseExportDeclaration(node) { + if (this.isContextual(130)) { + node.exportKind = "type"; + const declarationNode = this.startNode(); + this.next(); + if (this.match(5)) { + node.specifiers = this.parseExportSpecifiers(true); + super.parseExportFrom(node); + return null; } else { - errors.unterminated(initialPos, initialLineStart, initialCurLine); + return this.flowParseTypeAlias(declarationNode); } + } else if (this.isContextual(131)) { + node.exportKind = "type"; + const declarationNode = this.startNode(); + this.next(); + return this.flowParseOpaqueType(declarationNode, false); + } else if (this.isContextual(129)) { + node.exportKind = "type"; + const declarationNode = this.startNode(); + this.next(); + return this.flowParseInterface(declarationNode); + } else if (this.shouldParseEnums() && this.isContextual(126)) { + node.exportKind = "value"; + const declarationNode = this.startNode(); + this.next(); + return this.flowParseEnumDeclaration(declarationNode); } else { - ++pos; + return super.parseExportDeclaration(node); } } - return { - pos, - str: out, - firstInvalidLoc, - lineStart, - curLine, - containsInvalid: !!firstInvalidLoc - }; -} -function isStringEnd(type, ch, input, pos) { - if (type === "template") { - return ch === 96 || ch === 36 && input.charCodeAt(pos + 1) === 123; + eatExportStar(node) { + if (super.eatExportStar(node)) return true; + if (this.isContextual(130) && this.lookahead().type === 55) { + node.exportKind = "type"; + this.next(); + this.next(); + return true; + } + return false; } - return ch === (type === "double" ? 34 : 39); -} -function readEscapedChar(input, pos, lineStart, curLine, inTemplate, errors) { - const throwOnInvalid = !inTemplate; - pos++; - const res = ch => ({ - pos, - ch, - lineStart, - curLine - }); - const ch = input.charCodeAt(pos++); - switch (ch) { - case 110: - return res("\n"); - case 114: - return res("\r"); - case 120: - { - let code; - ({ - code, - pos - } = readHexChar(input, pos, lineStart, curLine, 2, false, throwOnInvalid, errors)); - return res(code === null ? null : String.fromCharCode(code)); - } - case 117: - { - let code; - ({ - code, - pos - } = readCodePoint(input, pos, lineStart, curLine, throwOnInvalid, errors)); - return res(code === null ? null : String.fromCodePoint(code)); + maybeParseExportNamespaceSpecifier(node) { + const { + startLoc + } = this.state; + const hasNamespace = super.maybeParseExportNamespaceSpecifier(node); + if (hasNamespace && node.exportKind === "type") { + this.unexpected(startLoc); + } + return hasNamespace; + } + parseClassId(node, isStatement, optionalId) { + super.parseClassId(node, isStatement, optionalId); + if (this.match(47)) { + node.typeParameters = this.flowParseTypeParameterDeclaration(); + } + } + parseClassMember(classBody, member, state) { + const { + startLoc + } = this.state; + if (this.isContextual(125)) { + if (super.parseClassMemberFromModifier(classBody, member)) { + return; } - case 116: - return res("\t"); - case 98: - return res("\b"); - case 118: - return res("\u000b"); - case 102: - return res("\f"); - case 13: - if (input.charCodeAt(pos) === 10) { - ++pos; + member.declare = true; + } + super.parseClassMember(classBody, member, state); + if (member.declare) { + if (member.type !== "ClassProperty" && member.type !== "ClassPrivateProperty" && member.type !== "PropertyDefinition") { + this.raise(FlowErrors.DeclareClassElement, startLoc); + } else if (member.value) { + this.raise(FlowErrors.DeclareClassFieldInitializer, member.value); } - case 10: - lineStart = pos; - ++curLine; - case 8232: - case 8233: - return res(""); - case 56: - case 57: - if (inTemplate) { - return res(null); + } + } + isIterator(word) { + return word === "iterator" || word === "asyncIterator"; + } + readIterator() { + const word = super.readWord1(); + const fullWord = "@@" + word; + if (!this.isIterator(word) || !this.state.inType) { + this.raise(Errors.InvalidIdentifier, this.state.curPosition(), { + identifierName: fullWord + }); + } + this.finishToken(132, fullWord); + } + getTokenFromCode(code) { + const next = this.input.charCodeAt(this.state.pos + 1); + if (code === 123 && next === 124) { + this.finishOp(6, 2); + } else if (this.state.inType && (code === 62 || code === 60)) { + this.finishOp(code === 62 ? 48 : 47, 1); + } else if (this.state.inType && code === 63) { + if (next === 46) { + this.finishOp(18, 2); } else { - errors.strictNumericEscape(pos - 1, lineStart, curLine); - } - default: - if (ch >= 48 && ch <= 55) { - const startPos = pos - 1; - const match = /^[0-7]+/.exec(input.slice(startPos, pos + 2)); - let octalStr = match[0]; - let octal = parseInt(octalStr, 8); - if (octal > 255) { - octalStr = octalStr.slice(0, -1); - octal = parseInt(octalStr, 8); - } - pos += octalStr.length - 1; - const next = input.charCodeAt(pos); - if (octalStr !== "0" || next === 56 || next === 57) { - if (inTemplate) { - return res(null); - } else { - errors.strictNumericEscape(startPos, lineStart, curLine); - } - } - return res(String.fromCharCode(octal)); + this.finishOp(17, 1); } - return res(String.fromCharCode(ch)); + } else if (isIteratorStart(code, next, this.input.charCodeAt(this.state.pos + 2))) { + this.state.pos += 2; + this.readIterator(); + } else { + super.getTokenFromCode(code); + } } -} -function readHexChar(input, pos, lineStart, curLine, len, forceLen, throwOnInvalid, errors) { - const initialPos = pos; - let n; - ({ - n, - pos - } = readInt(input, pos, lineStart, curLine, 16, len, forceLen, false, errors, !throwOnInvalid)); - if (n === null) { - if (throwOnInvalid) { - errors.invalidEscapeSequence(initialPos, lineStart, curLine); + isAssignable(node, isBinding) { + if (node.type === "TypeCastExpression") { + return this.isAssignable(node.expression, isBinding); } else { - pos = initialPos - 1; + return super.isAssignable(node, isBinding); } } - return { - code: n, - pos - }; -} -function readInt(input, pos, lineStart, curLine, radix, len, forceLen, allowNumSeparator, errors, bailOnError) { - const start = pos; - const forbiddenSiblings = radix === 16 ? forbiddenNumericSeparatorSiblings.hex : forbiddenNumericSeparatorSiblings.decBinOct; - const isAllowedSibling = radix === 16 ? isAllowedNumericSeparatorSibling.hex : radix === 10 ? isAllowedNumericSeparatorSibling.dec : radix === 8 ? isAllowedNumericSeparatorSibling.oct : isAllowedNumericSeparatorSibling.bin; - let invalid = false; - let total = 0; - for (let i = 0, e = len == null ? Infinity : len; i < e; ++i) { - const code = input.charCodeAt(pos); - let val; - if (code === 95 && allowNumSeparator !== "bail") { - const prev = input.charCodeAt(pos - 1); - const next = input.charCodeAt(pos + 1); - if (!allowNumSeparator) { - if (bailOnError) return { - n: null, - pos - }; - errors.numericSeparatorInEscapeSequence(pos, lineStart, curLine); - } else if (Number.isNaN(next) || !isAllowedSibling(next) || forbiddenSiblings.has(prev) || forbiddenSiblings.has(next)) { - if (bailOnError) return { - n: null, - pos - }; - errors.unexpectedNumericSeparator(pos, lineStart, curLine); - } - ++pos; - continue; + toAssignable(node, isLHS = false) { + if (!isLHS && node.type === "AssignmentExpression" && node.left.type === "TypeCastExpression") { + node.left = this.typeCastToParameter(node.left); } - if (code >= 97) { - val = code - 97 + 10; - } else if (code >= 65) { - val = code - 65 + 10; - } else if (_isDigit(code)) { - val = code - 48; - } else { - val = Infinity; + super.toAssignable(node, isLHS); + } + toAssignableList(exprList, trailingCommaLoc, isLHS) { + for (let i = 0; i < exprList.length; i++) { + const expr = exprList[i]; + if ((expr == null ? void 0 : expr.type) === "TypeCastExpression") { + exprList[i] = this.typeCastToParameter(expr); + } } - if (val >= radix) { - if (val <= 9 && bailOnError) { - return { - n: null, - pos - }; - } else if (val <= 9 && errors.invalidDigit(pos, lineStart, curLine, radix)) { - val = 0; - } else if (forceLen) { - val = 0; - invalid = true; - } else { - break; + super.toAssignableList(exprList, trailingCommaLoc, isLHS); + } + toReferencedList(exprList, isParenthesizedExpr) { + for (let i = 0; i < exprList.length; i++) { + var _expr$extra; + const expr = exprList[i]; + if (expr && expr.type === "TypeCastExpression" && !((_expr$extra = expr.extra) != null && _expr$extra.parenthesized) && (exprList.length > 1 || !isParenthesizedExpr)) { + this.raise(FlowErrors.TypeCastInPattern, expr.typeAnnotation); } } - ++pos; - total = total * radix + val; + return exprList; } - if (pos === start || len != null && pos - start !== len || invalid) { - return { - n: null, - pos - }; + parseArrayLike(close, canBePattern, isTuple, refExpressionErrors) { + const node = super.parseArrayLike(close, canBePattern, isTuple, refExpressionErrors); + if (canBePattern && !this.state.maybeInArrowParameters) { + this.toReferencedList(node.elements); + } + return node; } - return { - n: total, - pos - }; -} -function readCodePoint(input, pos, lineStart, curLine, throwOnInvalid, errors) { - const ch = input.charCodeAt(pos); - let code; - if (ch === 123) { - ++pos; - ({ - code, - pos - } = readHexChar(input, pos, lineStart, curLine, input.indexOf("}", pos) - pos, true, throwOnInvalid, errors)); - ++pos; - if (code !== null && code > 0x10ffff) { - if (throwOnInvalid) { - errors.invalidCodePoint(pos, lineStart, curLine); - } else { - return { - code: null, - pos - }; - } + isValidLVal(type, isParenthesized, binding) { + return type === "TypeCastExpression" || super.isValidLVal(type, isParenthesized, binding); + } + parseClassProperty(node) { + if (this.match(14)) { + node.typeAnnotation = this.flowParseTypeAnnotation(); } - } else { - ({ - code, - pos - } = readHexChar(input, pos, lineStart, curLine, 4, false, throwOnInvalid, errors)); + return super.parseClassProperty(node); } - return { - code, - pos - }; -} -function buildPosition(pos, lineStart, curLine) { - return new Position(curLine, pos - lineStart, pos); -} -const VALID_REGEX_FLAGS = new Set([103, 109, 115, 105, 121, 117, 100, 118]); -class Token { - constructor(state) { - const startIndex = state.startIndex || 0; - this.type = state.type; - this.value = state.value; - this.start = startIndex + state.start; - this.end = startIndex + state.end; - this.loc = new SourceLocation(state.startLoc, state.endLoc); + parseClassPrivateProperty(node) { + if (this.match(14)) { + node.typeAnnotation = this.flowParseTypeAnnotation(); + } + return super.parseClassPrivateProperty(node); + } + isClassMethod() { + return this.match(47) || super.isClassMethod(); + } + isClassProperty() { + return this.match(14) || super.isClassProperty(); } -} -class Tokenizer extends CommentsParser { - constructor(options, input) { - super(); - this.isLookahead = void 0; - this.tokens = []; - this.errorHandlers_readInt = { - invalidDigit: (pos, lineStart, curLine, radix) => { - if (!(this.optionFlags & 2048)) return false; - this.raise(Errors.InvalidDigit, buildPosition(pos, lineStart, curLine), { - radix - }); - return true; - }, - numericSeparatorInEscapeSequence: this.errorBuilder(Errors.NumericSeparatorInEscapeSequence), - unexpectedNumericSeparator: this.errorBuilder(Errors.UnexpectedNumericSeparator) - }; - this.errorHandlers_readCodePoint = Object.assign({}, this.errorHandlers_readInt, { - invalidEscapeSequence: this.errorBuilder(Errors.InvalidEscapeSequence), - invalidCodePoint: this.errorBuilder(Errors.InvalidCodePoint) - }); - this.errorHandlers_readStringContents_string = Object.assign({}, this.errorHandlers_readCodePoint, { - strictNumericEscape: (pos, lineStart, curLine) => { - this.recordStrictModeErrors(Errors.StrictNumericEscape, buildPosition(pos, lineStart, curLine)); - }, - unterminated: (pos, lineStart, curLine) => { - throw this.raise(Errors.UnterminatedString, buildPosition(pos - 1, lineStart, curLine)); + isNonstaticConstructor(method) { + return !this.match(14) && super.isNonstaticConstructor(method); + } + pushClassMethod(classBody, method, isGenerator, isAsync, isConstructor, allowsDirectSuper) { + if (method.variance) { + this.unexpected(method.variance.loc.start); + } + delete method.variance; + if (this.match(47)) { + method.typeParameters = this.flowParseTypeParameterDeclaration(); + } + super.pushClassMethod(classBody, method, isGenerator, isAsync, isConstructor, allowsDirectSuper); + if (method.params && isConstructor) { + const params = method.params; + if (params.length > 0 && this.isThisParam(params[0])) { + this.raise(FlowErrors.ThisParamBannedInConstructor, method); } - }); - this.errorHandlers_readStringContents_template = Object.assign({}, this.errorHandlers_readCodePoint, { - strictNumericEscape: this.errorBuilder(Errors.StrictNumericEscape), - unterminated: (pos, lineStart, curLine) => { - throw this.raise(Errors.UnterminatedTemplate, buildPosition(pos, lineStart, curLine)); + } else if (method.type === "MethodDefinition" && isConstructor && method.value.params) { + const params = method.value.params; + if (params.length > 0 && this.isThisParam(params[0])) { + this.raise(FlowErrors.ThisParamBannedInConstructor, method); } - }); - this.state = new State(); - this.state.init(options); - this.input = input; - this.length = input.length; - this.comments = []; - this.isLookahead = false; - } - pushToken(token) { - this.tokens.length = this.state.tokensLength; - this.tokens.push(token); - ++this.state.tokensLength; + } } - next() { - this.checkKeywordEscapes(); - if (this.optionFlags & 256) { - this.pushToken(new Token(this.state)); + pushClassPrivateMethod(classBody, method, isGenerator, isAsync) { + if (method.variance) { + this.unexpected(method.variance.loc.start); } - this.state.lastTokEndLoc = this.state.endLoc; - this.state.lastTokStartLoc = this.state.startLoc; - this.nextToken(); + delete method.variance; + if (this.match(47)) { + method.typeParameters = this.flowParseTypeParameterDeclaration(); + } + super.pushClassPrivateMethod(classBody, method, isGenerator, isAsync); } - eat(type) { - if (this.match(type)) { + parseClassSuper(node) { + super.parseClassSuper(node); + if (node.superClass && this.match(47)) { + node.superTypeParameters = this.flowParseTypeParameterInstantiation(); + } + if (this.isContextual(113)) { this.next(); - return true; - } else { - return false; + const implemented = node.implements = []; + do { + const node = this.startNode(); + node.id = this.flowParseRestrictedIdentifier(true); + if (this.match(47)) { + node.typeParameters = this.flowParseTypeParameterInstantiation(); + } else { + node.typeParameters = null; + } + implemented.push(this.finishNode(node, "ClassImplements")); + } while (this.eat(12)); } } - match(type) { - return this.state.type === type; - } - createLookaheadState(state) { - return { - pos: state.pos, - value: null, - type: state.type, - start: state.start, - end: state.end, - context: [this.curContext()], - inType: state.inType, - startLoc: state.startLoc, - lastTokEndLoc: state.lastTokEndLoc, - curLine: state.curLine, - lineStart: state.lineStart, - curPosition: state.curPosition - }; + checkGetterSetterParams(method) { + super.checkGetterSetterParams(method); + const params = this.getObjectOrClassMethodParams(method); + if (params.length > 0) { + const param = params[0]; + if (this.isThisParam(param) && method.kind === "get") { + this.raise(FlowErrors.GetterMayNotHaveThisParam, param); + } else if (this.isThisParam(param)) { + this.raise(FlowErrors.SetterMayNotHaveThisParam, param); + } + } } - lookahead() { - const old = this.state; - this.state = this.createLookaheadState(old); - this.isLookahead = true; - this.nextToken(); - this.isLookahead = false; - const curr = this.state; - this.state = old; - return curr; + parsePropertyNamePrefixOperator(node) { + node.variance = this.flowParseVariance(); } - nextTokenStart() { - return this.nextTokenStartSince(this.state.pos); + parseObjPropValue(prop, startLoc, isGenerator, isAsync, isPattern, isAccessor, refExpressionErrors) { + if (prop.variance) { + this.unexpected(prop.variance.loc.start); + } + delete prop.variance; + let typeParameters; + if (this.match(47) && !isAccessor) { + typeParameters = this.flowParseTypeParameterDeclaration(); + if (!this.match(10)) this.unexpected(); + } + const result = super.parseObjPropValue(prop, startLoc, isGenerator, isAsync, isPattern, isAccessor, refExpressionErrors); + if (typeParameters) { + (result.value || result).typeParameters = typeParameters; + } + return result; } - nextTokenStartSince(pos) { - skipWhiteSpace.lastIndex = pos; - return skipWhiteSpace.test(this.input) ? skipWhiteSpace.lastIndex : pos; + parseAssignableListItemTypes(param) { + if (this.eat(17)) { + if (param.type !== "Identifier") { + this.raise(FlowErrors.PatternIsOptional, param); + } + if (this.isThisParam(param)) { + this.raise(FlowErrors.ThisParamMayNotBeOptional, param); + } + param.optional = true; + } + if (this.match(14)) { + param.typeAnnotation = this.flowParseTypeAnnotation(); + } else if (this.isThisParam(param)) { + this.raise(FlowErrors.ThisParamAnnotationRequired, param); + } + if (this.match(29) && this.isThisParam(param)) { + this.raise(FlowErrors.ThisParamNoDefault, param); + } + this.resetEndLocation(param); + return param; } - lookaheadCharCode() { - return this.lookaheadCharCodeSince(this.state.pos); + parseMaybeDefault(startLoc, left) { + const node = super.parseMaybeDefault(startLoc, left); + if (node.type === "AssignmentPattern" && node.typeAnnotation && node.right.start < node.typeAnnotation.start) { + this.raise(FlowErrors.TypeBeforeInitializer, node.typeAnnotation); + } + return node; } - lookaheadCharCodeSince(pos) { - return this.input.charCodeAt(this.nextTokenStartSince(pos)); + checkImportReflection(node) { + super.checkImportReflection(node); + if (node.module && node.importKind !== "value") { + this.raise(FlowErrors.ImportReflectionHasImportType, node.specifiers[0].loc.start); + } } - nextTokenInLineStart() { - return this.nextTokenInLineStartSince(this.state.pos); + parseImportSpecifierLocal(node, specifier, type) { + specifier.local = hasTypeImportKind(node) ? this.flowParseRestrictedIdentifier(true, true) : this.parseIdentifier(); + node.specifiers.push(this.finishImportSpecifier(specifier, type)); } - nextTokenInLineStartSince(pos) { - skipWhiteSpaceInLine.lastIndex = pos; - return skipWhiteSpaceInLine.test(this.input) ? skipWhiteSpaceInLine.lastIndex : pos; + isPotentialImportPhase(isExport) { + if (super.isPotentialImportPhase(isExport)) return true; + if (this.isContextual(130)) { + if (!isExport) return true; + const ch = this.lookaheadCharCode(); + return ch === 123 || ch === 42; + } + return !isExport && this.isContextual(87); } - lookaheadInLineCharCode() { - return this.input.charCodeAt(this.nextTokenInLineStart()); + applyImportPhase(node, isExport, phase, loc) { + super.applyImportPhase(node, isExport, phase, loc); + if (isExport) { + if (!phase && this.match(65)) { + return; + } + node.exportKind = phase === "type" ? phase : "value"; + } else { + if (phase === "type" && this.match(55)) this.unexpected(); + node.importKind = phase === "type" || phase === "typeof" ? phase : "value"; + } } - codePointAtPos(pos) { - let cp = this.input.charCodeAt(pos); - if ((cp & 0xfc00) === 0xd800 && ++pos < this.input.length) { - const trail = this.input.charCodeAt(pos); - if ((trail & 0xfc00) === 0xdc00) { - cp = 0x10000 + ((cp & 0x3ff) << 10) + (trail & 0x3ff); + parseImportSpecifier(specifier, importedIsString, isInTypeOnlyImport, isMaybeTypeOnly, bindingType) { + const firstIdent = specifier.imported; + let specifierTypeKind = null; + if (firstIdent.type === "Identifier") { + if (firstIdent.name === "type") { + specifierTypeKind = "type"; + } else if (firstIdent.name === "typeof") { + specifierTypeKind = "typeof"; + } + } + let isBinding = false; + if (this.isContextual(93) && !this.isLookaheadContextual("as")) { + const as_ident = this.parseIdentifier(true); + if (specifierTypeKind !== null && !tokenIsKeywordOrIdentifier(this.state.type)) { + specifier.imported = as_ident; + specifier.importKind = specifierTypeKind; + specifier.local = cloneIdentifier(as_ident); + } else { + specifier.imported = firstIdent; + specifier.importKind = null; + specifier.local = this.parseIdentifier(); + } + } else { + if (specifierTypeKind !== null && tokenIsKeywordOrIdentifier(this.state.type)) { + specifier.imported = this.parseIdentifier(true); + specifier.importKind = specifierTypeKind; + } else { + if (importedIsString) { + throw this.raise(Errors.ImportBindingIsString, specifier, { + importName: firstIdent.value + }); + } + specifier.imported = firstIdent; + specifier.importKind = null; + } + if (this.eatContextual(93)) { + specifier.local = this.parseIdentifier(); + } else { + isBinding = true; + specifier.local = cloneIdentifier(specifier.imported); } } - return cp; - } - setStrict(strict) { - this.state.strict = strict; - if (strict) { - this.state.strictErrors.forEach(([toParseError, at]) => this.raise(toParseError, at)); - this.state.strictErrors.clear(); - } - } - curContext() { - return this.state.context[this.state.context.length - 1]; - } - nextToken() { - this.skipSpace(); - this.state.start = this.state.pos; - if (!this.isLookahead) this.state.startLoc = this.state.curPosition(); - if (this.state.pos >= this.length) { - this.finishToken(140); - return; + const specifierIsTypeImport = hasTypeImportKind(specifier); + if (isInTypeOnlyImport && specifierIsTypeImport) { + this.raise(FlowErrors.ImportTypeShorthandOnlyInPureImport, specifier); } - this.getTokenFromCode(this.codePointAtPos(this.state.pos)); - } - skipBlockComment(commentEnd) { - let startLoc; - if (!this.isLookahead) startLoc = this.state.curPosition(); - const start = this.state.pos; - const end = this.input.indexOf(commentEnd, start + 2); - if (end === -1) { - throw this.raise(Errors.UnterminatedComment, this.state.curPosition()); + if (isInTypeOnlyImport || specifierIsTypeImport) { + this.checkReservedType(specifier.local.name, specifier.local.loc.start, true); } - this.state.pos = end + commentEnd.length; - lineBreakG.lastIndex = start + 2; - while (lineBreakG.test(this.input) && lineBreakG.lastIndex <= end) { - ++this.state.curLine; - this.state.lineStart = lineBreakG.lastIndex; + if (isBinding && !isInTypeOnlyImport && !specifierIsTypeImport) { + this.checkReservedWord(specifier.local.name, specifier.loc.start, true, true); } - if (this.isLookahead) return; - const comment = { - type: "CommentBlock", - value: this.input.slice(start + 2, end), - start: this.sourceToOffsetPos(start), - end: this.sourceToOffsetPos(end + commentEnd.length), - loc: new SourceLocation(startLoc, this.state.curPosition()) - }; - if (this.optionFlags & 256) this.pushToken(comment); - return comment; + return this.finishImportSpecifier(specifier, "ImportSpecifier"); } - skipLineComment(startSkip) { - const start = this.state.pos; - let startLoc; - if (!this.isLookahead) startLoc = this.state.curPosition(); - let ch = this.input.charCodeAt(this.state.pos += startSkip); - if (this.state.pos < this.length) { - while (!isNewLine(ch) && ++this.state.pos < this.length) { - ch = this.input.charCodeAt(this.state.pos); - } + parseBindingAtom() { + switch (this.state.type) { + case 78: + return this.parseIdentifier(true); + default: + return super.parseBindingAtom(); } - if (this.isLookahead) return; - const end = this.state.pos; - const value = this.input.slice(start + startSkip, end); - const comment = { - type: "CommentLine", - value, - start: this.sourceToOffsetPos(start), - end: this.sourceToOffsetPos(end), - loc: new SourceLocation(startLoc, this.state.curPosition()) - }; - if (this.optionFlags & 256) this.pushToken(comment); - return comment; } - skipSpace() { - const spaceStart = this.state.pos; - const comments = this.optionFlags & 4096 ? [] : null; - loop: while (this.state.pos < this.length) { - const ch = this.input.charCodeAt(this.state.pos); - switch (ch) { - case 32: - case 160: - case 9: - ++this.state.pos; - break; - case 13: - if (this.input.charCodeAt(this.state.pos + 1) === 10) { - ++this.state.pos; - } - case 10: - case 8232: - case 8233: - ++this.state.pos; - ++this.state.curLine; - this.state.lineStart = this.state.pos; - break; - case 47: - switch (this.input.charCodeAt(this.state.pos + 1)) { - case 42: - { - const comment = this.skipBlockComment("*/"); - if (comment !== undefined) { - this.addComment(comment); - comments == null || comments.push(comment); - } - break; - } - case 47: - { - const comment = this.skipLineComment(2); - if (comment !== undefined) { - this.addComment(comment); - comments == null || comments.push(comment); - } - break; - } - default: - break loop; - } - break; - default: - if (isWhitespace(ch)) { - ++this.state.pos; - } else if (ch === 45 && !this.inModule && this.optionFlags & 8192) { - const pos = this.state.pos; - if (this.input.charCodeAt(pos + 1) === 45 && this.input.charCodeAt(pos + 2) === 62 && (spaceStart === 0 || this.state.lineStart > spaceStart)) { - const comment = this.skipLineComment(3); - if (comment !== undefined) { - this.addComment(comment); - comments == null || comments.push(comment); - } - } else { - break loop; - } - } else if (ch === 60 && !this.inModule && this.optionFlags & 8192) { - const pos = this.state.pos; - if (this.input.charCodeAt(pos + 1) === 33 && this.input.charCodeAt(pos + 2) === 45 && this.input.charCodeAt(pos + 3) === 45) { - const comment = this.skipLineComment(4); - if (comment !== undefined) { - this.addComment(comment); - comments == null || comments.push(comment); - } - } else { - break loop; - } - } else { - break loop; - } - } + parseFunctionParams(node, isConstructor) { + const kind = node.kind; + if (kind !== "get" && kind !== "set" && this.match(47)) { + node.typeParameters = this.flowParseTypeParameterDeclaration(); } - if ((comments == null ? void 0 : comments.length) > 0) { - const end = this.state.pos; - const commentWhitespace = { - start: this.sourceToOffsetPos(spaceStart), - end: this.sourceToOffsetPos(end), - comments, - leadingNode: null, - trailingNode: null, - containingNode: null - }; - this.state.commentStack.push(commentWhitespace); + super.parseFunctionParams(node, isConstructor); + } + parseVarId(decl, kind) { + super.parseVarId(decl, kind); + if (this.match(14)) { + decl.id.typeAnnotation = this.flowParseTypeAnnotation(); + this.resetEndLocation(decl.id); } } - finishToken(type, val) { - this.state.end = this.state.pos; - this.state.endLoc = this.state.curPosition(); - const prevType = this.state.type; - this.state.type = type; - this.state.value = val; - if (!this.isLookahead) { - this.updateContext(prevType); + parseAsyncArrowFromCallExpression(node, call) { + if (this.match(14)) { + const oldNoAnonFunctionType = this.state.noAnonFunctionType; + this.state.noAnonFunctionType = true; + node.returnType = this.flowParseTypeAnnotation(); + this.state.noAnonFunctionType = oldNoAnonFunctionType; } + return super.parseAsyncArrowFromCallExpression(node, call); } - replaceToken(type) { - this.state.type = type; - this.updateContext(); + shouldParseAsyncArrow() { + return this.match(14) || super.shouldParseAsyncArrow(); } - readToken_numberSign() { - if (this.state.pos === 0 && this.readToken_interpreter()) { - return; - } - const nextPos = this.state.pos + 1; - const next = this.codePointAtPos(nextPos); - if (next >= 48 && next <= 57) { - throw this.raise(Errors.UnexpectedDigitAfterHash, this.state.curPosition()); + parseMaybeAssign(refExpressionErrors, afterLeftParse) { + var _jsx; + let state = null; + let jsx; + if (this.hasPlugin("jsx") && (this.match(142) || this.match(47))) { + state = this.state.clone(); + jsx = this.tryParse(() => super.parseMaybeAssign(refExpressionErrors, afterLeftParse), state); + if (!jsx.error) return jsx.node; + const { + context + } = this.state; + const currentContext = context[context.length - 1]; + if (currentContext === types.j_oTag || currentContext === types.j_expr) { + context.pop(); + } } - if (next === 123 || next === 91 && this.hasPlugin("recordAndTuple")) { - this.expectPlugin("recordAndTuple"); - if (this.getPluginOption("recordAndTuple", "syntaxType") === "bar") { - throw this.raise(next === 123 ? Errors.RecordExpressionHashIncorrectStartSyntaxType : Errors.TupleExpressionHashIncorrectStartSyntaxType, this.state.curPosition()); + if ((_jsx = jsx) != null && _jsx.error || this.match(47)) { + var _jsx2, _jsx3; + state = state || this.state.clone(); + let typeParameters; + const arrow = this.tryParse(abort => { + var _arrowExpression$extr; + typeParameters = this.flowParseTypeParameterDeclaration(); + const arrowExpression = this.forwardNoArrowParamsConversionAt(typeParameters, () => { + const result = super.parseMaybeAssign(refExpressionErrors, afterLeftParse); + this.resetStartLocationFromNode(result, typeParameters); + return result; + }); + if ((_arrowExpression$extr = arrowExpression.extra) != null && _arrowExpression$extr.parenthesized) abort(); + const expr = this.maybeUnwrapTypeCastExpression(arrowExpression); + if (expr.type !== "ArrowFunctionExpression") abort(); + expr.typeParameters = typeParameters; + this.resetStartLocationFromNode(expr, typeParameters); + return arrowExpression; + }, state); + let arrowExpression = null; + if (arrow.node && this.maybeUnwrapTypeCastExpression(arrow.node).type === "ArrowFunctionExpression") { + if (!arrow.error && !arrow.aborted) { + if (arrow.node.async) { + this.raise(FlowErrors.UnexpectedTypeParameterBeforeAsyncArrowFunction, typeParameters); + } + return arrow.node; + } + arrowExpression = arrow.node; } - this.state.pos += 2; - if (next === 123) { - this.finishToken(7); - } else { - this.finishToken(1); + if ((_jsx2 = jsx) != null && _jsx2.node) { + this.state = jsx.failState; + return jsx.node; } - } else if (isIdentifierStart(next)) { - ++this.state.pos; - this.finishToken(139, this.readWord1(next)); - } else if (next === 92) { - ++this.state.pos; - this.finishToken(139, this.readWord1()); - } else { - this.finishOp(27, 1); + if (arrowExpression) { + this.state = arrow.failState; + return arrowExpression; + } + if ((_jsx3 = jsx) != null && _jsx3.thrown) throw jsx.error; + if (arrow.thrown) throw arrow.error; + throw this.raise(FlowErrors.UnexpectedTokenAfterTypeParameter, typeParameters); } + return super.parseMaybeAssign(refExpressionErrors, afterLeftParse); } - readToken_dot() { - const next = this.input.charCodeAt(this.state.pos + 1); - if (next >= 48 && next <= 57) { - this.readNumber(true); - return; - } - if (next === 46 && this.input.charCodeAt(this.state.pos + 2) === 46) { - this.state.pos += 3; - this.finishToken(21); - } else { - ++this.state.pos; - this.finishToken(16); + parseArrow(node) { + if (this.match(14)) { + const result = this.tryParse(() => { + const oldNoAnonFunctionType = this.state.noAnonFunctionType; + this.state.noAnonFunctionType = true; + const typeNode = this.startNode(); + [typeNode.typeAnnotation, node.predicate] = this.flowParseTypeAndPredicateInitialiser(); + this.state.noAnonFunctionType = oldNoAnonFunctionType; + if (this.canInsertSemicolon()) this.unexpected(); + if (!this.match(19)) this.unexpected(); + return typeNode; + }); + if (result.thrown) return null; + if (result.error) this.state = result.failState; + node.returnType = result.node.typeAnnotation ? this.finishNode(result.node, "TypeAnnotation") : null; } + return super.parseArrow(node); } - readToken_slash() { - const next = this.input.charCodeAt(this.state.pos + 1); - if (next === 61) { - this.finishOp(31, 2); - } else { - this.finishOp(56, 1); - } + shouldParseArrow(params) { + return this.match(14) || super.shouldParseArrow(params); } - readToken_interpreter() { - if (this.state.pos !== 0 || this.length < 2) return false; - let ch = this.input.charCodeAt(this.state.pos + 1); - if (ch !== 33) return false; - const start = this.state.pos; - this.state.pos += 1; - while (!isNewLine(ch) && ++this.state.pos < this.length) { - ch = this.input.charCodeAt(this.state.pos); + setArrowFunctionParameters(node, params) { + if (this.state.noArrowParamsConversionAt.includes(node.start)) { + node.params = params; + } else { + super.setArrowFunctionParameters(node, params); } - const value = this.input.slice(start + 2, this.state.pos); - this.finishToken(28, value); - return true; } - readToken_mult_modulo(code) { - let type = code === 42 ? 55 : 54; - let width = 1; - let next = this.input.charCodeAt(this.state.pos + 1); - if (code === 42 && next === 42) { - width++; - next = this.input.charCodeAt(this.state.pos + 2); - type = 57; + checkParams(node, allowDuplicates, isArrowFunction, strictModeChanged = true) { + if (isArrowFunction && this.state.noArrowParamsConversionAt.includes(node.start)) { + return; } - if (next === 61 && !this.state.inType) { - width++; - type = code === 37 ? 33 : 30; + for (let i = 0; i < node.params.length; i++) { + if (this.isThisParam(node.params[i]) && i > 0) { + this.raise(FlowErrors.ThisParamMustBeFirst, node.params[i]); + } } - this.finishOp(type, width); + super.checkParams(node, allowDuplicates, isArrowFunction, strictModeChanged); } - readToken_pipe_amp(code) { - const next = this.input.charCodeAt(this.state.pos + 1); - if (next === code) { - if (this.input.charCodeAt(this.state.pos + 2) === 61) { - this.finishOp(30, 3); - } else { - this.finishOp(code === 124 ? 41 : 42, 2); + parseParenAndDistinguishExpression(canBeArrow) { + return super.parseParenAndDistinguishExpression(canBeArrow && !this.state.noArrowAt.includes(this.state.start)); + } + parseSubscripts(base, startLoc, noCalls) { + if (base.type === "Identifier" && base.name === "async" && this.state.noArrowAt.includes(startLoc.index)) { + this.next(); + const node = this.startNodeAt(startLoc); + node.callee = base; + node.arguments = super.parseCallExpressionArguments(11, false); + base = this.finishNode(node, "CallExpression"); + } else if (base.type === "Identifier" && base.name === "async" && this.match(47)) { + const state = this.state.clone(); + const arrow = this.tryParse(abort => this.parseAsyncArrowWithTypeParameters(startLoc) || abort(), state); + if (!arrow.error && !arrow.aborted) return arrow.node; + const result = this.tryParse(() => super.parseSubscripts(base, startLoc, noCalls), state); + if (result.node && !result.error) return result.node; + if (arrow.node) { + this.state = arrow.failState; + return arrow.node; } - return; - } - if (code === 124) { - if (next === 62) { - this.finishOp(39, 2); - return; + if (result.node) { + this.state = result.failState; + return result.node; } - if (this.hasPlugin("recordAndTuple") && next === 125) { - if (this.getPluginOption("recordAndTuple", "syntaxType") !== "bar") { - throw this.raise(Errors.RecordExpressionBarIncorrectEndSyntaxType, this.state.curPosition()); - } - this.state.pos += 2; - this.finishToken(9); - return; + throw arrow.error || result.error; + } + return super.parseSubscripts(base, startLoc, noCalls); + } + parseSubscript(base, startLoc, noCalls, subscriptState) { + if (this.match(18) && this.isLookaheadToken_lt()) { + subscriptState.optionalChainMember = true; + if (noCalls) { + subscriptState.stop = true; + return base; } - if (this.hasPlugin("recordAndTuple") && next === 93) { - if (this.getPluginOption("recordAndTuple", "syntaxType") !== "bar") { - throw this.raise(Errors.TupleExpressionBarIncorrectEndSyntaxType, this.state.curPosition()); + this.next(); + const node = this.startNodeAt(startLoc); + node.callee = base; + node.typeArguments = this.flowParseTypeParameterInstantiation(); + this.expect(10); + node.arguments = this.parseCallExpressionArguments(11, false); + node.optional = true; + return this.finishCallExpression(node, true); + } else if (!noCalls && this.shouldParseTypes() && this.match(47)) { + const node = this.startNodeAt(startLoc); + node.callee = base; + const result = this.tryParse(() => { + node.typeArguments = this.flowParseTypeParameterInstantiationCallOrNew(); + this.expect(10); + node.arguments = super.parseCallExpressionArguments(11, false); + if (subscriptState.optionalChainMember) { + node.optional = false; } - this.state.pos += 2; - this.finishToken(4); - return; + return this.finishCallExpression(node, subscriptState.optionalChainMember); + }); + if (result.node) { + if (result.error) this.state = result.failState; + return result.node; } } - if (next === 61) { - this.finishOp(30, 2); - return; - } - this.finishOp(code === 124 ? 43 : 45, 1); + return super.parseSubscript(base, startLoc, noCalls, subscriptState); } - readToken_caret() { - const next = this.input.charCodeAt(this.state.pos + 1); - if (next === 61 && !this.state.inType) { - this.finishOp(32, 2); - } else if (next === 94 && this.hasPlugin(["pipelineOperator", { - proposal: "hack", - topicToken: "^^" - }])) { - this.finishOp(37, 2); - const lookaheadCh = this.input.codePointAt(this.state.pos); - if (lookaheadCh === 94) { - this.unexpected(); - } - } else { - this.finishOp(44, 1); + parseNewCallee(node) { + super.parseNewCallee(node); + let targs = null; + if (this.shouldParseTypes() && this.match(47)) { + targs = this.tryParse(() => this.flowParseTypeParameterInstantiationCallOrNew()).node; } + node.typeArguments = targs; } - readToken_atSign() { + parseAsyncArrowWithTypeParameters(startLoc) { + const node = this.startNodeAt(startLoc); + this.parseFunctionParams(node, false); + if (!this.parseArrow(node)) return; + return super.parseArrowExpression(node, undefined, true); + } + readToken_mult_modulo(code) { const next = this.input.charCodeAt(this.state.pos + 1); - if (next === 64 && this.hasPlugin(["pipelineOperator", { - proposal: "hack", - topicToken: "@@" - }])) { - this.finishOp(38, 2); - } else { - this.finishOp(26, 1); + if (code === 42 && next === 47 && this.state.hasFlowComment) { + this.state.hasFlowComment = false; + this.state.pos += 2; + this.nextToken(); + return; } + super.readToken_mult_modulo(code); } - readToken_plus_min(code) { + readToken_pipe_amp(code) { const next = this.input.charCodeAt(this.state.pos + 1); - if (next === code) { - this.finishOp(34, 2); + if (code === 124 && next === 125) { + this.finishOp(9, 2); return; } - if (next === 61) { - this.finishOp(30, 2); - } else { - this.finishOp(53, 1); + super.readToken_pipe_amp(code); + } + parseTopLevel(file, program) { + const fileNode = super.parseTopLevel(file, program); + if (this.state.hasFlowComment) { + this.raise(FlowErrors.UnterminatedFlowComment, this.state.curPosition()); } + return fileNode; } - readToken_lt() { - const { - pos - } = this.state; - const next = this.input.charCodeAt(pos + 1); - if (next === 60) { - if (this.input.charCodeAt(pos + 2) === 61) { - this.finishOp(30, 3); - return; + skipBlockComment() { + if (this.hasPlugin("flowComments") && this.skipFlowComment()) { + if (this.state.hasFlowComment) { + throw this.raise(FlowErrors.NestedFlowComment, this.state.startLoc); + } + this.hasFlowCommentCompletion(); + const commentSkip = this.skipFlowComment(); + if (commentSkip) { + this.state.pos += commentSkip; + this.state.hasFlowComment = true; } - this.finishOp(51, 2); - return; - } - if (next === 61) { - this.finishOp(49, 2); return; } - this.finishOp(47, 1); + return super.skipBlockComment(this.state.hasFlowComment ? "*-/" : "*/"); } - readToken_gt() { + skipFlowComment() { const { pos } = this.state; - const next = this.input.charCodeAt(pos + 1); - if (next === 62) { - const size = this.input.charCodeAt(pos + 2) === 62 ? 3 : 2; - if (this.input.charCodeAt(pos + size) === 61) { - this.finishOp(30, size + 1); - return; - } - this.finishOp(52, size); - return; + let shiftToFirstNonWhiteSpace = 2; + while ([32, 9].includes(this.input.charCodeAt(pos + shiftToFirstNonWhiteSpace))) { + shiftToFirstNonWhiteSpace++; } - if (next === 61) { - this.finishOp(49, 2); - return; + const ch2 = this.input.charCodeAt(shiftToFirstNonWhiteSpace + pos); + const ch3 = this.input.charCodeAt(shiftToFirstNonWhiteSpace + pos + 1); + if (ch2 === 58 && ch3 === 58) { + return shiftToFirstNonWhiteSpace + 2; } - this.finishOp(48, 1); - } - readToken_eq_excl(code) { - const next = this.input.charCodeAt(this.state.pos + 1); - if (next === 61) { - this.finishOp(46, this.input.charCodeAt(this.state.pos + 2) === 61 ? 3 : 2); - return; + if (this.input.slice(shiftToFirstNonWhiteSpace + pos, shiftToFirstNonWhiteSpace + pos + 12) === "flow-include") { + return shiftToFirstNonWhiteSpace + 12; } - if (code === 61 && next === 62) { - this.state.pos += 2; - this.finishToken(19); - return; + if (ch2 === 58 && ch3 !== 58) { + return shiftToFirstNonWhiteSpace; } - this.finishOp(code === 61 ? 29 : 35, 1); + return false; } - readToken_question() { - const next = this.input.charCodeAt(this.state.pos + 1); - const next2 = this.input.charCodeAt(this.state.pos + 2); - if (next === 63) { - if (next2 === 61) { - this.finishOp(30, 3); - } else { - this.finishOp(40, 2); - } - } else if (next === 46 && !(next2 >= 48 && next2 <= 57)) { - this.state.pos += 2; - this.finishToken(18); - } else { - ++this.state.pos; - this.finishToken(17); + hasFlowCommentCompletion() { + const end = this.input.indexOf("*/", this.state.pos); + if (end === -1) { + throw this.raise(Errors.UnterminatedComment, this.state.curPosition()); } } - getTokenFromCode(code) { - switch (code) { - case 46: - this.readToken_dot(); - return; - case 40: - ++this.state.pos; - this.finishToken(10); - return; - case 41: - ++this.state.pos; - this.finishToken(11); - return; - case 59: - ++this.state.pos; - this.finishToken(13); - return; - case 44: - ++this.state.pos; - this.finishToken(12); - return; - case 91: - if (this.hasPlugin("recordAndTuple") && this.input.charCodeAt(this.state.pos + 1) === 124) { - if (this.getPluginOption("recordAndTuple", "syntaxType") !== "bar") { - throw this.raise(Errors.TupleExpressionBarIncorrectStartSyntaxType, this.state.curPosition()); - } - this.state.pos += 2; - this.finishToken(2); - } else { - ++this.state.pos; - this.finishToken(0); - } - return; - case 93: - ++this.state.pos; - this.finishToken(3); - return; - case 123: - if (this.hasPlugin("recordAndTuple") && this.input.charCodeAt(this.state.pos + 1) === 124) { - if (this.getPluginOption("recordAndTuple", "syntaxType") !== "bar") { - throw this.raise(Errors.RecordExpressionBarIncorrectStartSyntaxType, this.state.curPosition()); - } - this.state.pos += 2; - this.finishToken(6); - } else { - ++this.state.pos; - this.finishToken(5); - } - return; - case 125: - ++this.state.pos; - this.finishToken(8); - return; - case 58: - if (this.hasPlugin("functionBind") && this.input.charCodeAt(this.state.pos + 1) === 58) { - this.finishOp(15, 2); - } else { - ++this.state.pos; - this.finishToken(14); - } - return; - case 63: - this.readToken_question(); - return; - case 96: - this.readTemplateToken(); - return; - case 48: - { - const next = this.input.charCodeAt(this.state.pos + 1); - if (next === 120 || next === 88) { - this.readRadixNumber(16); - return; - } - if (next === 111 || next === 79) { - this.readRadixNumber(8); - return; - } - if (next === 98 || next === 66) { - this.readRadixNumber(2); - return; - } - } - case 49: - case 50: - case 51: - case 52: - case 53: - case 54: - case 55: - case 56: - case 57: - this.readNumber(false); - return; - case 34: - case 39: - this.readString(code); - return; - case 47: - this.readToken_slash(); - return; - case 37: - case 42: - this.readToken_mult_modulo(code); - return; - case 124: - case 38: - this.readToken_pipe_amp(code); - return; - case 94: - this.readToken_caret(); - return; - case 43: - case 45: - this.readToken_plus_min(code); - return; - case 60: - this.readToken_lt(); - return; - case 62: - this.readToken_gt(); - return; - case 61: - case 33: - this.readToken_eq_excl(code); - return; - case 126: - this.finishOp(36, 1); - return; - case 64: - this.readToken_atSign(); - return; - case 35: - this.readToken_numberSign(); - return; - case 92: - this.readWord(); - return; - default: - if (isIdentifierStart(code)) { - this.readWord(code); - return; - } - } - throw this.raise(Errors.InvalidOrUnexpectedToken, this.state.curPosition(), { - unexpected: String.fromCodePoint(code) + flowEnumErrorBooleanMemberNotInitialized(loc, { + enumName, + memberName + }) { + this.raise(FlowErrors.EnumBooleanMemberNotInitialized, loc, { + memberName, + enumName }); } - finishOp(type, size) { - const str = this.input.slice(this.state.pos, this.state.pos + size); - this.state.pos += size; - this.finishToken(type, str); + flowEnumErrorInvalidMemberInitializer(loc, enumContext) { + return this.raise(!enumContext.explicitType ? FlowErrors.EnumInvalidMemberInitializerUnknownType : enumContext.explicitType === "symbol" ? FlowErrors.EnumInvalidMemberInitializerSymbolType : FlowErrors.EnumInvalidMemberInitializerPrimaryType, loc, enumContext); } - readRegexp() { + flowEnumErrorNumberMemberNotInitialized(loc, details) { + this.raise(FlowErrors.EnumNumberMemberNotInitialized, loc, details); + } + flowEnumErrorStringMemberInconsistentlyInitialized(node, details) { + this.raise(FlowErrors.EnumStringMemberInconsistentlyInitialized, node, details); + } + flowEnumMemberInit() { const startLoc = this.state.startLoc; - const start = this.state.start + 1; - let escaped, inClass; - let { - pos - } = this.state; - for (;; ++pos) { - if (pos >= this.length) { - throw this.raise(Errors.UnterminatedRegExp, createPositionWithColumnOffset(startLoc, 1)); - } - const ch = this.input.charCodeAt(pos); - if (isNewLine(ch)) { - throw this.raise(Errors.UnterminatedRegExp, createPositionWithColumnOffset(startLoc, 1)); - } - if (escaped) { - escaped = false; - } else { - if (ch === 91) { - inClass = true; - } else if (ch === 93 && inClass) { - inClass = false; - } else if (ch === 47 && !inClass) { - break; - } - escaped = ch === 92; - } - } - const content = this.input.slice(start, pos); - ++pos; - let mods = ""; - const nextPos = () => createPositionWithColumnOffset(startLoc, pos + 2 - start); - while (pos < this.length) { - const cp = this.codePointAtPos(pos); - const char = String.fromCharCode(cp); - if (VALID_REGEX_FLAGS.has(cp)) { - if (cp === 118) { - if (mods.includes("u")) { - this.raise(Errors.IncompatibleRegExpUVFlags, nextPos()); + const endOfInit = () => this.match(12) || this.match(8); + switch (this.state.type) { + case 134: + { + const literal = this.parseNumericLiteral(this.state.value); + if (endOfInit()) { + return { + type: "number", + loc: literal.loc.start, + value: literal + }; } - } else if (cp === 117) { - if (mods.includes("v")) { - this.raise(Errors.IncompatibleRegExpUVFlags, nextPos()); + return { + type: "invalid", + loc: startLoc + }; + } + case 133: + { + const literal = this.parseStringLiteral(this.state.value); + if (endOfInit()) { + return { + type: "string", + loc: literal.loc.start, + value: literal + }; } + return { + type: "invalid", + loc: startLoc + }; } - if (mods.includes(char)) { - this.raise(Errors.DuplicateRegExpFlags, nextPos()); + case 85: + case 86: + { + const literal = this.parseBooleanLiteral(this.match(85)); + if (endOfInit()) { + return { + type: "boolean", + loc: literal.loc.start, + value: literal + }; + } + return { + type: "invalid", + loc: startLoc + }; } - } else if (isIdentifierChar(cp) || cp === 92) { - this.raise(Errors.MalformedRegExpFlags, nextPos()); - } else { - break; - } - ++pos; - mods += char; + default: + return { + type: "invalid", + loc: startLoc + }; } - this.state.pos = pos; - this.finishToken(138, { - pattern: content, - flags: mods - }); } - readInt(radix, len, forceLen = false, allowNumSeparator = true) { - const { - n, - pos - } = readInt(this.input, this.state.pos, this.state.lineStart, this.state.curLine, radix, len, forceLen, allowNumSeparator, this.errorHandlers_readInt, false); - this.state.pos = pos; - return n; + flowEnumMemberRaw() { + const loc = this.state.startLoc; + const id = this.parseIdentifier(true); + const init = this.eat(29) ? this.flowEnumMemberInit() : { + type: "none", + loc + }; + return { + id, + init + }; } - readRadixNumber(radix) { - const start = this.state.pos; - const startLoc = this.state.curPosition(); - let isBigInt = false; - this.state.pos += 2; - const val = this.readInt(radix); - if (val == null) { - this.raise(Errors.InvalidDigit, createPositionWithColumnOffset(startLoc, 2), { - radix - }); - } - const next = this.input.charCodeAt(this.state.pos); - if (next === 110) { - ++this.state.pos; - isBigInt = true; - } else if (next === 109) { - throw this.raise(Errors.InvalidDecimal, startLoc); - } - if (isIdentifierStart(this.codePointAtPos(this.state.pos))) { - throw this.raise(Errors.NumberIdentifier, this.state.curPosition()); - } - if (isBigInt) { - const str = this.input.slice(start, this.state.pos).replace(/[_n]/g, ""); - this.finishToken(136, str); + flowEnumCheckExplicitTypeMismatch(loc, context, expectedType) { + const { + explicitType + } = context; + if (explicitType === null) { return; } - this.finishToken(135, val); - } - readNumber(startsWithDot) { - const start = this.state.pos; - const startLoc = this.state.curPosition(); - let isFloat = false; - let isBigInt = false; - let hasExponent = false; - let isOctal = false; - if (!startsWithDot && this.readInt(10) === null) { - this.raise(Errors.InvalidNumber, this.state.curPosition()); + if (explicitType !== expectedType) { + this.flowEnumErrorInvalidMemberInitializer(loc, context); } - const hasLeadingZero = this.state.pos - start >= 2 && this.input.charCodeAt(start) === 48; - if (hasLeadingZero) { - const integer = this.input.slice(start, this.state.pos); - this.recordStrictModeErrors(Errors.StrictOctalLiteral, startLoc); - if (!this.state.strict) { - const underscorePos = integer.indexOf("_"); - if (underscorePos > 0) { - this.raise(Errors.ZeroDigitNumericSeparator, createPositionWithColumnOffset(startLoc, underscorePos)); - } + } + flowEnumMembers({ + enumName, + explicitType + }) { + const seenNames = new Set(); + const members = { + booleanMembers: [], + numberMembers: [], + stringMembers: [], + defaultedMembers: [] + }; + let hasUnknownMembers = false; + while (!this.match(8)) { + if (this.eat(21)) { + hasUnknownMembers = true; + break; } - isOctal = hasLeadingZero && !/[89]/.test(integer); - } - let next = this.input.charCodeAt(this.state.pos); - if (next === 46 && !isOctal) { - ++this.state.pos; - this.readInt(10); - isFloat = true; - next = this.input.charCodeAt(this.state.pos); - } - if ((next === 69 || next === 101) && !isOctal) { - next = this.input.charCodeAt(++this.state.pos); - if (next === 43 || next === 45) { - ++this.state.pos; + const memberNode = this.startNode(); + const { + id, + init + } = this.flowEnumMemberRaw(); + const memberName = id.name; + if (memberName === "") { + continue; } - if (this.readInt(10) === null) { - this.raise(Errors.InvalidOrMissingExponent, startLoc); + if (/^[a-z]/.test(memberName)) { + this.raise(FlowErrors.EnumInvalidMemberName, id, { + memberName, + suggestion: memberName[0].toUpperCase() + memberName.slice(1), + enumName + }); } - isFloat = true; - hasExponent = true; - next = this.input.charCodeAt(this.state.pos); - } - if (next === 110) { - if (isFloat || hasLeadingZero) { - this.raise(Errors.InvalidBigIntLiteral, startLoc); + if (seenNames.has(memberName)) { + this.raise(FlowErrors.EnumDuplicateMemberName, id, { + memberName, + enumName + }); + } + seenNames.add(memberName); + const context = { + enumName, + explicitType, + memberName + }; + memberNode.id = id; + switch (init.type) { + case "boolean": + { + this.flowEnumCheckExplicitTypeMismatch(init.loc, context, "boolean"); + memberNode.init = init.value; + members.booleanMembers.push(this.finishNode(memberNode, "EnumBooleanMember")); + break; + } + case "number": + { + this.flowEnumCheckExplicitTypeMismatch(init.loc, context, "number"); + memberNode.init = init.value; + members.numberMembers.push(this.finishNode(memberNode, "EnumNumberMember")); + break; + } + case "string": + { + this.flowEnumCheckExplicitTypeMismatch(init.loc, context, "string"); + memberNode.init = init.value; + members.stringMembers.push(this.finishNode(memberNode, "EnumStringMember")); + break; + } + case "invalid": + { + throw this.flowEnumErrorInvalidMemberInitializer(init.loc, context); + } + case "none": + { + switch (explicitType) { + case "boolean": + this.flowEnumErrorBooleanMemberNotInitialized(init.loc, context); + break; + case "number": + this.flowEnumErrorNumberMemberNotInitialized(init.loc, context); + break; + default: + members.defaultedMembers.push(this.finishNode(memberNode, "EnumDefaultedMember")); + } + } + } + if (!this.match(8)) { + this.expect(12); } - ++this.state.pos; - isBigInt = true; } - if (next === 109) { - this.expectPlugin("decimal", this.state.curPosition()); - if (hasExponent || hasLeadingZero) { - this.raise(Errors.InvalidDecimal, startLoc); + return { + members, + hasUnknownMembers + }; + } + flowEnumStringMembers(initializedMembers, defaultedMembers, { + enumName + }) { + if (initializedMembers.length === 0) { + return defaultedMembers; + } else if (defaultedMembers.length === 0) { + return initializedMembers; + } else if (defaultedMembers.length > initializedMembers.length) { + for (const member of initializedMembers) { + this.flowEnumErrorStringMemberInconsistentlyInitialized(member, { + enumName + }); + } + return defaultedMembers; + } else { + for (const member of defaultedMembers) { + this.flowEnumErrorStringMemberInconsistentlyInitialized(member, { + enumName + }); } - ++this.state.pos; - var isDecimal = true; - } - if (isIdentifierStart(this.codePointAtPos(this.state.pos))) { - throw this.raise(Errors.NumberIdentifier, this.state.curPosition()); + return initializedMembers; } - const str = this.input.slice(start, this.state.pos).replace(/[_mn]/g, ""); - if (isBigInt) { - this.finishToken(136, str); - return; + } + flowEnumParseExplicitType({ + enumName + }) { + if (!this.eatContextual(102)) return null; + if (!tokenIsIdentifier(this.state.type)) { + throw this.raise(FlowErrors.EnumInvalidExplicitTypeUnknownSupplied, this.state.startLoc, { + enumName + }); } - if (isDecimal) { - this.finishToken(137, str); - return; + const { + value + } = this.state; + this.next(); + if (value !== "boolean" && value !== "number" && value !== "string" && value !== "symbol") { + this.raise(FlowErrors.EnumInvalidExplicitType, this.state.startLoc, { + enumName, + invalidEnumType: value + }); } - const val = isOctal ? parseInt(str, 8) : parseFloat(str); - this.finishToken(135, val); + return value; } - readCodePoint(throwOnInvalid) { + flowEnumBody(node, id) { + const enumName = id.name; + const nameLoc = id.loc.start; + const explicitType = this.flowEnumParseExplicitType({ + enumName + }); + this.expect(5); const { - code, - pos - } = readCodePoint(this.input, this.state.pos, this.state.lineStart, this.state.curLine, throwOnInvalid, this.errorHandlers_readCodePoint); - this.state.pos = pos; - return code; + members, + hasUnknownMembers + } = this.flowEnumMembers({ + enumName, + explicitType + }); + node.hasUnknownMembers = hasUnknownMembers; + switch (explicitType) { + case "boolean": + node.explicitType = true; + node.members = members.booleanMembers; + this.expect(8); + return this.finishNode(node, "EnumBooleanBody"); + case "number": + node.explicitType = true; + node.members = members.numberMembers; + this.expect(8); + return this.finishNode(node, "EnumNumberBody"); + case "string": + node.explicitType = true; + node.members = this.flowEnumStringMembers(members.stringMembers, members.defaultedMembers, { + enumName + }); + this.expect(8); + return this.finishNode(node, "EnumStringBody"); + case "symbol": + node.members = members.defaultedMembers; + this.expect(8); + return this.finishNode(node, "EnumSymbolBody"); + default: + { + const empty = () => { + node.members = []; + this.expect(8); + return this.finishNode(node, "EnumStringBody"); + }; + node.explicitType = false; + const boolsLen = members.booleanMembers.length; + const numsLen = members.numberMembers.length; + const strsLen = members.stringMembers.length; + const defaultedLen = members.defaultedMembers.length; + if (!boolsLen && !numsLen && !strsLen && !defaultedLen) { + return empty(); + } else if (!boolsLen && !numsLen) { + node.members = this.flowEnumStringMembers(members.stringMembers, members.defaultedMembers, { + enumName + }); + this.expect(8); + return this.finishNode(node, "EnumStringBody"); + } else if (!numsLen && !strsLen && boolsLen >= defaultedLen) { + for (const member of members.defaultedMembers) { + this.flowEnumErrorBooleanMemberNotInitialized(member.loc.start, { + enumName, + memberName: member.id.name + }); + } + node.members = members.booleanMembers; + this.expect(8); + return this.finishNode(node, "EnumBooleanBody"); + } else if (!boolsLen && !strsLen && numsLen >= defaultedLen) { + for (const member of members.defaultedMembers) { + this.flowEnumErrorNumberMemberNotInitialized(member.loc.start, { + enumName, + memberName: member.id.name + }); + } + node.members = members.numberMembers; + this.expect(8); + return this.finishNode(node, "EnumNumberBody"); + } else { + this.raise(FlowErrors.EnumInconsistentMemberValues, nameLoc, { + enumName + }); + return empty(); + } + } + } } - readString(quote) { - const { - str, - pos, - curLine, - lineStart - } = readStringContents(quote === 34 ? "double" : "single", this.input, this.state.pos + 1, this.state.lineStart, this.state.curLine, this.errorHandlers_readStringContents_string); - this.state.pos = pos + 1; - this.state.lineStart = lineStart; - this.state.curLine = curLine; - this.finishToken(134, str); + flowParseEnumDeclaration(node) { + const id = this.parseIdentifier(); + node.id = id; + node.body = this.flowEnumBody(this.startNode(), id); + return this.finishNode(node, "EnumDeclaration"); } - readTemplateContinuation() { - if (!this.match(8)) { - this.unexpected(null, 8); + isLookaheadToken_lt() { + const next = this.nextTokenStart(); + if (this.input.charCodeAt(next) === 60) { + const afterNext = this.input.charCodeAt(next + 1); + return afterNext !== 60 && afterNext !== 61; } - this.state.pos--; - this.readTemplateToken(); + return false; + } + maybeUnwrapTypeCastExpression(node) { + return node.type === "TypeCastExpression" ? node.expression : node; + } +}; +const entities = { + __proto__: null, + quot: "\u0022", + amp: "&", + apos: "\u0027", + lt: "<", + gt: ">", + nbsp: "\u00A0", + iexcl: "\u00A1", + cent: "\u00A2", + pound: "\u00A3", + curren: "\u00A4", + yen: "\u00A5", + brvbar: "\u00A6", + sect: "\u00A7", + uml: "\u00A8", + copy: "\u00A9", + ordf: "\u00AA", + laquo: "\u00AB", + not: "\u00AC", + shy: "\u00AD", + reg: "\u00AE", + macr: "\u00AF", + deg: "\u00B0", + plusmn: "\u00B1", + sup2: "\u00B2", + sup3: "\u00B3", + acute: "\u00B4", + micro: "\u00B5", + para: "\u00B6", + middot: "\u00B7", + cedil: "\u00B8", + sup1: "\u00B9", + ordm: "\u00BA", + raquo: "\u00BB", + frac14: "\u00BC", + frac12: "\u00BD", + frac34: "\u00BE", + iquest: "\u00BF", + Agrave: "\u00C0", + Aacute: "\u00C1", + Acirc: "\u00C2", + Atilde: "\u00C3", + Auml: "\u00C4", + Aring: "\u00C5", + AElig: "\u00C6", + Ccedil: "\u00C7", + Egrave: "\u00C8", + Eacute: "\u00C9", + Ecirc: "\u00CA", + Euml: "\u00CB", + Igrave: "\u00CC", + Iacute: "\u00CD", + Icirc: "\u00CE", + Iuml: "\u00CF", + ETH: "\u00D0", + Ntilde: "\u00D1", + Ograve: "\u00D2", + Oacute: "\u00D3", + Ocirc: "\u00D4", + Otilde: "\u00D5", + Ouml: "\u00D6", + times: "\u00D7", + Oslash: "\u00D8", + Ugrave: "\u00D9", + Uacute: "\u00DA", + Ucirc: "\u00DB", + Uuml: "\u00DC", + Yacute: "\u00DD", + THORN: "\u00DE", + szlig: "\u00DF", + agrave: "\u00E0", + aacute: "\u00E1", + acirc: "\u00E2", + atilde: "\u00E3", + auml: "\u00E4", + aring: "\u00E5", + aelig: "\u00E6", + ccedil: "\u00E7", + egrave: "\u00E8", + eacute: "\u00E9", + ecirc: "\u00EA", + euml: "\u00EB", + igrave: "\u00EC", + iacute: "\u00ED", + icirc: "\u00EE", + iuml: "\u00EF", + eth: "\u00F0", + ntilde: "\u00F1", + ograve: "\u00F2", + oacute: "\u00F3", + ocirc: "\u00F4", + otilde: "\u00F5", + ouml: "\u00F6", + divide: "\u00F7", + oslash: "\u00F8", + ugrave: "\u00F9", + uacute: "\u00FA", + ucirc: "\u00FB", + uuml: "\u00FC", + yacute: "\u00FD", + thorn: "\u00FE", + yuml: "\u00FF", + OElig: "\u0152", + oelig: "\u0153", + Scaron: "\u0160", + scaron: "\u0161", + Yuml: "\u0178", + fnof: "\u0192", + circ: "\u02C6", + tilde: "\u02DC", + Alpha: "\u0391", + Beta: "\u0392", + Gamma: "\u0393", + Delta: "\u0394", + Epsilon: "\u0395", + Zeta: "\u0396", + Eta: "\u0397", + Theta: "\u0398", + Iota: "\u0399", + Kappa: "\u039A", + Lambda: "\u039B", + Mu: "\u039C", + Nu: "\u039D", + Xi: "\u039E", + Omicron: "\u039F", + Pi: "\u03A0", + Rho: "\u03A1", + Sigma: "\u03A3", + Tau: "\u03A4", + Upsilon: "\u03A5", + Phi: "\u03A6", + Chi: "\u03A7", + Psi: "\u03A8", + Omega: "\u03A9", + alpha: "\u03B1", + beta: "\u03B2", + gamma: "\u03B3", + delta: "\u03B4", + epsilon: "\u03B5", + zeta: "\u03B6", + eta: "\u03B7", + theta: "\u03B8", + iota: "\u03B9", + kappa: "\u03BA", + lambda: "\u03BB", + mu: "\u03BC", + nu: "\u03BD", + xi: "\u03BE", + omicron: "\u03BF", + pi: "\u03C0", + rho: "\u03C1", + sigmaf: "\u03C2", + sigma: "\u03C3", + tau: "\u03C4", + upsilon: "\u03C5", + phi: "\u03C6", + chi: "\u03C7", + psi: "\u03C8", + omega: "\u03C9", + thetasym: "\u03D1", + upsih: "\u03D2", + piv: "\u03D6", + ensp: "\u2002", + emsp: "\u2003", + thinsp: "\u2009", + zwnj: "\u200C", + zwj: "\u200D", + lrm: "\u200E", + rlm: "\u200F", + ndash: "\u2013", + mdash: "\u2014", + lsquo: "\u2018", + rsquo: "\u2019", + sbquo: "\u201A", + ldquo: "\u201C", + rdquo: "\u201D", + bdquo: "\u201E", + dagger: "\u2020", + Dagger: "\u2021", + bull: "\u2022", + hellip: "\u2026", + permil: "\u2030", + prime: "\u2032", + Prime: "\u2033", + lsaquo: "\u2039", + rsaquo: "\u203A", + oline: "\u203E", + frasl: "\u2044", + euro: "\u20AC", + image: "\u2111", + weierp: "\u2118", + real: "\u211C", + trade: "\u2122", + alefsym: "\u2135", + larr: "\u2190", + uarr: "\u2191", + rarr: "\u2192", + darr: "\u2193", + harr: "\u2194", + crarr: "\u21B5", + lArr: "\u21D0", + uArr: "\u21D1", + rArr: "\u21D2", + dArr: "\u21D3", + hArr: "\u21D4", + forall: "\u2200", + part: "\u2202", + exist: "\u2203", + empty: "\u2205", + nabla: "\u2207", + isin: "\u2208", + notin: "\u2209", + ni: "\u220B", + prod: "\u220F", + sum: "\u2211", + minus: "\u2212", + lowast: "\u2217", + radic: "\u221A", + prop: "\u221D", + infin: "\u221E", + ang: "\u2220", + and: "\u2227", + or: "\u2228", + cap: "\u2229", + cup: "\u222A", + int: "\u222B", + there4: "\u2234", + sim: "\u223C", + cong: "\u2245", + asymp: "\u2248", + ne: "\u2260", + equiv: "\u2261", + le: "\u2264", + ge: "\u2265", + sub: "\u2282", + sup: "\u2283", + nsub: "\u2284", + sube: "\u2286", + supe: "\u2287", + oplus: "\u2295", + otimes: "\u2297", + perp: "\u22A5", + sdot: "\u22C5", + lceil: "\u2308", + rceil: "\u2309", + lfloor: "\u230A", + rfloor: "\u230B", + lang: "\u2329", + rang: "\u232A", + loz: "\u25CA", + spades: "\u2660", + clubs: "\u2663", + hearts: "\u2665", + diams: "\u2666" +}; +const JsxErrors = ParseErrorEnum`jsx`({ + AttributeIsEmpty: "JSX attributes must only be assigned a non-empty expression.", + MissingClosingTagElement: ({ + openingTagName + }) => `Expected corresponding JSX closing tag for <${openingTagName}>.`, + MissingClosingTagFragment: "Expected corresponding JSX closing tag for <>.", + UnexpectedSequenceExpression: "Sequence expressions cannot be directly nested inside JSX. Did you mean to wrap it in parentheses (...)?", + UnexpectedToken: ({ + unexpected, + HTMLEntity + }) => `Unexpected token \`${unexpected}\`. Did you mean \`${HTMLEntity}\` or \`{'${unexpected}'}\`?`, + UnsupportedJsxValue: "JSX value should be either an expression or a quoted JSX text.", + UnterminatedJsxContent: "Unterminated JSX contents.", + UnwrappedAdjacentJSXElements: "Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment <>...?" +}); +function isFragment(object) { + return object ? object.type === "JSXOpeningFragment" || object.type === "JSXClosingFragment" : false; +} +function getQualifiedJSXName(object) { + if (object.type === "JSXIdentifier") { + return object.name; } - readTemplateToken() { - const opening = this.input[this.state.pos]; - const { - str, - firstInvalidLoc, - pos, - curLine, - lineStart - } = readStringContents("template", this.input, this.state.pos + 1, this.state.lineStart, this.state.curLine, this.errorHandlers_readStringContents_template); - this.state.pos = pos + 1; - this.state.lineStart = lineStart; - this.state.curLine = curLine; - if (firstInvalidLoc) { - this.state.firstInvalidTemplateEscapePos = new Position(firstInvalidLoc.curLine, firstInvalidLoc.pos - firstInvalidLoc.lineStart, this.sourceToOffsetPos(firstInvalidLoc.pos)); - } - if (this.input.codePointAt(pos) === 96) { - this.finishToken(24, firstInvalidLoc ? null : opening + str + "`"); - } else { - this.state.pos++; - this.finishToken(25, firstInvalidLoc ? null : opening + str + "${"); - } + if (object.type === "JSXNamespacedName") { + return object.namespace.name + ":" + object.name.name; } - recordStrictModeErrors(toParseError, at) { - const index = at.index; - if (this.state.strict && !this.state.strictErrors.has(index)) { - this.raise(toParseError, at); - } else { - this.state.strictErrors.set(index, [toParseError, at]); - } + if (object.type === "JSXMemberExpression") { + return getQualifiedJSXName(object.object) + "." + getQualifiedJSXName(object.property); } - readWord1(firstCode) { - this.state.containsEsc = false; - let word = ""; - const start = this.state.pos; + throw new Error("Node had unexpected type: " + object.type); +} +var jsx = superClass => class JSXParserMixin extends superClass { + jsxReadToken() { + let out = ""; let chunkStart = this.state.pos; - if (firstCode !== undefined) { - this.state.pos += firstCode <= 0xffff ? 1 : 2; - } - while (this.state.pos < this.length) { - const ch = this.codePointAtPos(this.state.pos); - if (isIdentifierChar(ch)) { - this.state.pos += ch <= 0xffff ? 1 : 2; - } else if (ch === 92) { - this.state.containsEsc = true; - word += this.input.slice(chunkStart, this.state.pos); - const escStart = this.state.curPosition(); - const identifierCheck = this.state.pos === start ? isIdentifierStart : isIdentifierChar; - if (this.input.charCodeAt(++this.state.pos) !== 117) { - this.raise(Errors.MissingUnicodeEscape, this.state.curPosition()); - chunkStart = this.state.pos - 1; - continue; - } - ++this.state.pos; - const esc = this.readCodePoint(true); - if (esc !== null) { - if (!identifierCheck(esc)) { - this.raise(Errors.EscapedCharNotAnIdentifier, escStart); + for (;;) { + if (this.state.pos >= this.length) { + throw this.raise(JsxErrors.UnterminatedJsxContent, this.state.startLoc); + } + const ch = this.input.charCodeAt(this.state.pos); + switch (ch) { + case 60: + case 123: + if (this.state.pos === this.state.start) { + if (ch === 60 && this.state.canStartJSXElement) { + ++this.state.pos; + this.finishToken(142); + } else { + super.getTokenFromCode(ch); + } + return; + } + out += this.input.slice(chunkStart, this.state.pos); + this.finishToken(141, out); + return; + case 38: + out += this.input.slice(chunkStart, this.state.pos); + out += this.jsxReadEntity(); + chunkStart = this.state.pos; + break; + case 62: + case 125: + default: + if (isNewLine(ch)) { + out += this.input.slice(chunkStart, this.state.pos); + out += this.jsxReadNewLine(true); + chunkStart = this.state.pos; + } else { + ++this.state.pos; } - word += String.fromCodePoint(esc); - } - chunkStart = this.state.pos; - } else { - break; } } - return word + this.input.slice(chunkStart, this.state.pos); } - readWord(firstCode) { - const word = this.readWord1(firstCode); - const type = keywords$1.get(word); - if (type !== undefined) { - this.finishToken(type, tokenLabelName(type)); + jsxReadNewLine(normalizeCRLF) { + const ch = this.input.charCodeAt(this.state.pos); + let out; + ++this.state.pos; + if (ch === 13 && this.input.charCodeAt(this.state.pos) === 10) { + ++this.state.pos; + out = normalizeCRLF ? "\n" : "\r\n"; } else { - this.finishToken(132, word); - } - } - checkKeywordEscapes() { - const { - type - } = this.state; - if (tokenIsKeyword(type) && this.state.containsEsc) { - this.raise(Errors.InvalidEscapedReservedWord, this.state.startLoc, { - reservedWord: tokenLabelName(type) - }); + out = String.fromCharCode(ch); } + ++this.state.curLine; + this.state.lineStart = this.state.pos; + return out; } - raise(toParseError, at, details = {}) { - const loc = at instanceof Position ? at : at.loc.start; - const error = toParseError(loc, details); - if (!(this.optionFlags & 2048)) throw error; - if (!this.isLookahead) this.state.errors.push(error); - return error; - } - raiseOverwrite(toParseError, at, details = {}) { - const loc = at instanceof Position ? at : at.loc.start; - const pos = loc.index; - const errors = this.state.errors; - for (let i = errors.length - 1; i >= 0; i--) { - const error = errors[i]; - if (error.loc.index === pos) { - return errors[i] = toParseError(loc, details); + jsxReadString(quote) { + let out = ""; + let chunkStart = ++this.state.pos; + for (;;) { + if (this.state.pos >= this.length) { + throw this.raise(Errors.UnterminatedString, this.state.startLoc); } - if (error.loc.index < pos) break; - } - return this.raise(toParseError, at, details); - } - updateContext(prevType) {} - unexpected(loc, type) { - throw this.raise(Errors.UnexpectedToken, loc != null ? loc : this.state.startLoc, { - expected: type ? tokenLabelName(type) : null - }); - } - expectPlugin(pluginName, loc) { - if (this.hasPlugin(pluginName)) { - return true; - } - throw this.raise(Errors.MissingPlugin, loc != null ? loc : this.state.startLoc, { - missingPlugin: [pluginName] - }); - } - expectOnePlugin(pluginNames) { - if (!pluginNames.some(name => this.hasPlugin(name))) { - throw this.raise(Errors.MissingOneOfPlugins, this.state.startLoc, { - missingPlugin: pluginNames - }); - } - } - errorBuilder(error) { - return (pos, lineStart, curLine) => { - this.raise(error, buildPosition(pos, lineStart, curLine)); - }; - } -} -class ClassScope { - constructor() { - this.privateNames = new Set(); - this.loneAccessors = new Map(); - this.undefinedPrivateNames = new Map(); - } -} -class ClassScopeHandler { - constructor(parser) { - this.parser = void 0; - this.stack = []; - this.undefinedPrivateNames = new Map(); - this.parser = parser; - } - current() { - return this.stack[this.stack.length - 1]; - } - enter() { - this.stack.push(new ClassScope()); - } - exit() { - const oldClassScope = this.stack.pop(); - const current = this.current(); - for (const [name, loc] of Array.from(oldClassScope.undefinedPrivateNames)) { - if (current) { - if (!current.undefinedPrivateNames.has(name)) { - current.undefinedPrivateNames.set(name, loc); - } + const ch = this.input.charCodeAt(this.state.pos); + if (ch === quote) break; + if (ch === 38) { + out += this.input.slice(chunkStart, this.state.pos); + out += this.jsxReadEntity(); + chunkStart = this.state.pos; + } else if (isNewLine(ch)) { + out += this.input.slice(chunkStart, this.state.pos); + out += this.jsxReadNewLine(false); + chunkStart = this.state.pos; } else { - this.parser.raise(Errors.InvalidPrivateFieldResolution, loc, { - identifierName: name - }); + ++this.state.pos; } } + out += this.input.slice(chunkStart, this.state.pos++); + this.finishToken(133, out); } - declarePrivateName(name, elementType, loc) { - const { - privateNames, - loneAccessors, - undefinedPrivateNames - } = this.current(); - let redefined = privateNames.has(name); - if (elementType & 3) { - const accessor = redefined && loneAccessors.get(name); - if (accessor) { - const oldStatic = accessor & 4; - const newStatic = elementType & 4; - const oldKind = accessor & 3; - const newKind = elementType & 3; - redefined = oldKind === newKind || oldStatic !== newStatic; - if (!redefined) loneAccessors.delete(name); - } else if (!redefined) { - loneAccessors.set(name, elementType); + jsxReadEntity() { + const startPos = ++this.state.pos; + if (this.codePointAtPos(this.state.pos) === 35) { + ++this.state.pos; + let radix = 10; + if (this.codePointAtPos(this.state.pos) === 120) { + radix = 16; + ++this.state.pos; + } + const codePoint = this.readInt(radix, undefined, false, "bail"); + if (codePoint !== null && this.codePointAtPos(this.state.pos) === 59) { + ++this.state.pos; + return String.fromCodePoint(codePoint); } - } - if (redefined) { - this.parser.raise(Errors.PrivateNameRedeclaration, loc, { - identifierName: name - }); - } - privateNames.add(name); - undefinedPrivateNames.delete(name); - } - usePrivateName(name, loc) { - let classScope; - for (classScope of this.stack) { - if (classScope.privateNames.has(name)) return; - } - if (classScope) { - classScope.undefinedPrivateNames.set(name, loc); } else { - this.parser.raise(Errors.InvalidPrivateFieldResolution, loc, { - identifierName: name - }); + let count = 0; + let semi = false; + while (count++ < 10 && this.state.pos < this.length && !(semi = this.codePointAtPos(this.state.pos) === 59)) { + ++this.state.pos; + } + if (semi) { + const desc = this.input.slice(startPos, this.state.pos); + const entity = entities[desc]; + ++this.state.pos; + if (entity) { + return entity; + } + } } + this.state.pos = startPos; + return "&"; } -} -class ExpressionScope { - constructor(type = 0) { - this.type = type; - } - canBeArrowParameterDeclaration() { - return this.type === 2 || this.type === 1; - } - isCertainlyParameterDeclaration() { - return this.type === 3; - } -} -class ArrowHeadParsingScope extends ExpressionScope { - constructor(type) { - super(type); - this.declarationErrors = new Map(); - } - recordDeclarationError(ParsingErrorClass, at) { - const index = at.index; - this.declarationErrors.set(index, [ParsingErrorClass, at]); - } - clearDeclarationError(index) { - this.declarationErrors.delete(index); - } - iterateErrors(iterator) { - this.declarationErrors.forEach(iterator); - } -} -class ExpressionScopeHandler { - constructor(parser) { - this.parser = void 0; - this.stack = [new ExpressionScope()]; - this.parser = parser; + jsxReadWord() { + let ch; + const start = this.state.pos; + do { + ch = this.input.charCodeAt(++this.state.pos); + } while (isIdentifierChar(ch) || ch === 45); + this.finishToken(140, this.input.slice(start, this.state.pos)); } - enter(scope) { - this.stack.push(scope); + jsxParseIdentifier() { + const node = this.startNode(); + if (this.match(140)) { + node.name = this.state.value; + } else if (tokenIsKeyword(this.state.type)) { + node.name = tokenLabelName(this.state.type); + } else { + this.unexpected(); + } + this.next(); + return this.finishNode(node, "JSXIdentifier"); } - exit() { - this.stack.pop(); + jsxParseNamespacedName() { + const startLoc = this.state.startLoc; + const name = this.jsxParseIdentifier(); + if (!this.eat(14)) return name; + const node = this.startNodeAt(startLoc); + node.namespace = name; + node.name = this.jsxParseIdentifier(); + return this.finishNode(node, "JSXNamespacedName"); } - recordParameterInitializerError(toParseError, node) { - const origin = node.loc.start; - const { - stack - } = this; - let i = stack.length - 1; - let scope = stack[i]; - while (!scope.isCertainlyParameterDeclaration()) { - if (scope.canBeArrowParameterDeclaration()) { - scope.recordDeclarationError(toParseError, origin); - } else { - return; - } - scope = stack[--i]; + jsxParseElementName() { + const startLoc = this.state.startLoc; + let node = this.jsxParseNamespacedName(); + if (node.type === "JSXNamespacedName") { + return node; } - this.parser.raise(toParseError, origin); - } - recordArrowParameterBindingError(error, node) { - const { - stack - } = this; - const scope = stack[stack.length - 1]; - const origin = node.loc.start; - if (scope.isCertainlyParameterDeclaration()) { - this.parser.raise(error, origin); - } else if (scope.canBeArrowParameterDeclaration()) { - scope.recordDeclarationError(error, origin); - } else { - return; + while (this.eat(16)) { + const newNode = this.startNodeAt(startLoc); + newNode.object = node; + newNode.property = this.jsxParseIdentifier(); + node = this.finishNode(newNode, "JSXMemberExpression"); } + return node; } - recordAsyncArrowParametersError(at) { - const { - stack - } = this; - let i = stack.length - 1; - let scope = stack[i]; - while (scope.canBeArrowParameterDeclaration()) { - if (scope.type === 2) { - scope.recordDeclarationError(Errors.AwaitBindingIdentifier, at); - } - scope = stack[--i]; + jsxParseAttributeValue() { + let node; + switch (this.state.type) { + case 5: + node = this.startNode(); + this.setContext(types.brace); + this.next(); + node = this.jsxParseExpressionContainer(node, types.j_oTag); + if (node.expression.type === "JSXEmptyExpression") { + this.raise(JsxErrors.AttributeIsEmpty, node); + } + return node; + case 142: + case 133: + return this.parseExprAtom(); + default: + throw this.raise(JsxErrors.UnsupportedJsxValue, this.state.startLoc); } } - validateAsPattern() { - const { - stack - } = this; - const currentScope = stack[stack.length - 1]; - if (!currentScope.canBeArrowParameterDeclaration()) return; - currentScope.iterateErrors(([toParseError, loc]) => { - this.parser.raise(toParseError, loc); - let i = stack.length - 2; - let scope = stack[i]; - while (scope.canBeArrowParameterDeclaration()) { - scope.clearDeclarationError(loc.index); - scope = stack[--i]; - } - }); + jsxParseEmptyExpression() { + const node = this.startNodeAt(this.state.lastTokEndLoc); + return this.finishNodeAt(node, "JSXEmptyExpression", this.state.startLoc); } -} -function newParameterDeclarationScope() { - return new ExpressionScope(3); -} -function newArrowHeadScope() { - return new ArrowHeadParsingScope(1); -} -function newAsyncArrowScope() { - return new ArrowHeadParsingScope(2); -} -function newExpressionScope() { - return new ExpressionScope(); -} -class UtilParser extends Tokenizer { - addExtra(node, key, value, enumerable = true) { - if (!node) return; - let { - extra - } = node; - if (extra == null) { - extra = {}; - node.extra = extra; - } - if (enumerable) { - extra[key] = value; + jsxParseSpreadChild(node) { + this.next(); + node.expression = this.parseExpression(); + this.setContext(types.j_expr); + this.state.canStartJSXElement = true; + this.expect(8); + return this.finishNode(node, "JSXSpreadChild"); + } + jsxParseExpressionContainer(node, previousContext) { + if (this.match(8)) { + node.expression = this.jsxParseEmptyExpression(); } else { - Object.defineProperty(extra, key, { - enumerable, - value - }); + const expression = this.parseExpression(); + node.expression = expression; } + this.setContext(previousContext); + this.state.canStartJSXElement = true; + this.expect(8); + return this.finishNode(node, "JSXExpressionContainer"); } - isContextual(token) { - return this.state.type === token && !this.state.containsEsc; + jsxParseAttribute() { + const node = this.startNode(); + if (this.match(5)) { + this.setContext(types.brace); + this.next(); + this.expect(21); + node.argument = this.parseMaybeAssignAllowIn(); + this.setContext(types.j_oTag); + this.state.canStartJSXElement = true; + this.expect(8); + return this.finishNode(node, "JSXSpreadAttribute"); + } + node.name = this.jsxParseNamespacedName(); + node.value = this.eat(29) ? this.jsxParseAttributeValue() : null; + return this.finishNode(node, "JSXAttribute"); } - isUnparsedContextual(nameStart, name) { - if (this.input.startsWith(name, nameStart)) { - const nextCh = this.input.charCodeAt(nameStart + name.length); - return !(isIdentifierChar(nextCh) || (nextCh & 0xfc00) === 0xd800); + jsxParseOpeningElementAt(startLoc) { + const node = this.startNodeAt(startLoc); + if (this.eat(143)) { + return this.finishNode(node, "JSXOpeningFragment"); } - return false; + node.name = this.jsxParseElementName(); + return this.jsxParseOpeningElementAfterName(node); } - isLookaheadContextual(name) { - const next = this.nextTokenStart(); - return this.isUnparsedContextual(next, name); + jsxParseOpeningElementAfterName(node) { + const attributes = []; + while (!this.match(56) && !this.match(143)) { + attributes.push(this.jsxParseAttribute()); + } + node.attributes = attributes; + node.selfClosing = this.eat(56); + this.expect(143); + return this.finishNode(node, "JSXOpeningElement"); } - eatContextual(token) { - if (this.isContextual(token)) { - this.next(); - return true; + jsxParseClosingElementAt(startLoc) { + const node = this.startNodeAt(startLoc); + if (this.eat(143)) { + return this.finishNode(node, "JSXClosingFragment"); } - return false; + node.name = this.jsxParseElementName(); + this.expect(143); + return this.finishNode(node, "JSXClosingElement"); } - expectContextual(token, toParseError) { - if (!this.eatContextual(token)) { - if (toParseError != null) { - throw this.raise(toParseError, this.state.startLoc); + jsxParseElementAt(startLoc) { + const node = this.startNodeAt(startLoc); + const children = []; + const openingElement = this.jsxParseOpeningElementAt(startLoc); + let closingElement = null; + if (!openingElement.selfClosing) { + contents: for (;;) { + switch (this.state.type) { + case 142: + startLoc = this.state.startLoc; + this.next(); + if (this.eat(56)) { + closingElement = this.jsxParseClosingElementAt(startLoc); + break contents; + } + children.push(this.jsxParseElementAt(startLoc)); + break; + case 141: + children.push(this.parseLiteral(this.state.value, "JSXText")); + break; + case 5: + { + const node = this.startNode(); + this.setContext(types.brace); + this.next(); + if (this.match(21)) { + children.push(this.jsxParseSpreadChild(node)); + } else { + children.push(this.jsxParseExpressionContainer(node, types.j_expr)); + } + break; + } + default: + this.unexpected(); + } + } + if (isFragment(openingElement) && !isFragment(closingElement) && closingElement !== null) { + this.raise(JsxErrors.MissingClosingTagFragment, closingElement); + } else if (!isFragment(openingElement) && isFragment(closingElement)) { + this.raise(JsxErrors.MissingClosingTagElement, closingElement, { + openingTagName: getQualifiedJSXName(openingElement.name) + }); + } else if (!isFragment(openingElement) && !isFragment(closingElement)) { + if (getQualifiedJSXName(closingElement.name) !== getQualifiedJSXName(openingElement.name)) { + this.raise(JsxErrors.MissingClosingTagElement, closingElement, { + openingTagName: getQualifiedJSXName(openingElement.name) + }); + } } - this.unexpected(null, token); } + if (isFragment(openingElement)) { + node.openingFragment = openingElement; + node.closingFragment = closingElement; + } else { + node.openingElement = openingElement; + node.closingElement = closingElement; + } + node.children = children; + if (this.match(47)) { + throw this.raise(JsxErrors.UnwrappedAdjacentJSXElements, this.state.startLoc); + } + return isFragment(openingElement) ? this.finishNode(node, "JSXFragment") : this.finishNode(node, "JSXElement"); } - canInsertSemicolon() { - return this.match(140) || this.match(8) || this.hasPrecedingLineBreak(); - } - hasPrecedingLineBreak() { - return hasNewLine(this.input, this.offsetToSourcePos(this.state.lastTokEndLoc.index), this.state.start); - } - hasFollowingLineBreak() { - return hasNewLine(this.input, this.state.end, this.nextTokenStart()); - } - isLineTerminator() { - return this.eat(13) || this.canInsertSemicolon(); + jsxParseElement() { + const startLoc = this.state.startLoc; + this.next(); + return this.jsxParseElementAt(startLoc); } - semicolon(allowAsi = true) { - if (allowAsi ? this.isLineTerminator() : this.eat(13)) return; - this.raise(Errors.MissingSemicolon, this.state.lastTokEndLoc); + setContext(newContext) { + const { + context + } = this.state; + context[context.length - 1] = newContext; } - expect(type, loc) { - if (!this.eat(type)) { - this.unexpected(loc, type); + parseExprAtom(refExpressionErrors) { + if (this.match(142)) { + return this.jsxParseElement(); + } else if (this.match(47) && this.input.charCodeAt(this.state.pos) !== 33) { + this.replaceToken(142); + return this.jsxParseElement(); + } else { + return super.parseExprAtom(refExpressionErrors); } } - tryParse(fn, oldState = this.state.clone()) { - const abortSignal = { - node: null - }; - try { - const node = fn((node = null) => { - abortSignal.node = node; - throw abortSignal; - }); - if (this.state.errors.length > oldState.errors.length) { - const failState = this.state; - this.state = oldState; - this.state.tokensLength = failState.tokensLength; - return { - node, - error: failState.errors[oldState.errors.length], - thrown: false, - aborted: false, - failState - }; + skipSpace() { + const curContext = this.curContext(); + if (!curContext.preserveSpace) super.skipSpace(); + } + getTokenFromCode(code) { + const context = this.curContext(); + if (context === types.j_expr) { + this.jsxReadToken(); + return; + } + if (context === types.j_oTag || context === types.j_cTag) { + if (isIdentifierStart(code)) { + this.jsxReadWord(); + return; } - return { - node, - error: null, - thrown: false, - aborted: false, - failState: null - }; - } catch (error) { - const failState = this.state; - this.state = oldState; - if (error instanceof SyntaxError) { - return { - node: null, - error, - thrown: true, - aborted: false, - failState - }; + if (code === 62) { + ++this.state.pos; + this.finishToken(143); + return; } - if (error === abortSignal) { - return { - node: abortSignal.node, - error: null, - thrown: false, - aborted: true, - failState - }; + if ((code === 34 || code === 39) && context === types.j_oTag) { + this.jsxReadString(code); + return; } - throw error; } + if (code === 60 && this.state.canStartJSXElement && this.input.charCodeAt(this.state.pos + 1) !== 33) { + ++this.state.pos; + this.finishToken(142); + return; + } + super.getTokenFromCode(code); } - checkExpressionErrors(refExpressionErrors, andThrow) { - if (!refExpressionErrors) return false; + updateContext(prevType) { const { - shorthandAssignLoc, - doubleProtoLoc, - privateKeyLoc, - optionalParametersLoc, - voidPatternLoc - } = refExpressionErrors; - const hasErrors = !!shorthandAssignLoc || !!doubleProtoLoc || !!optionalParametersLoc || !!privateKeyLoc || !!voidPatternLoc; - if (!andThrow) { - return hasErrors; - } - if (shorthandAssignLoc != null) { - this.raise(Errors.InvalidCoverInitializedName, shorthandAssignLoc); - } - if (doubleProtoLoc != null) { - this.raise(Errors.DuplicateProto, doubleProtoLoc); - } - if (privateKeyLoc != null) { - this.raise(Errors.UnexpectedPrivateField, privateKeyLoc); - } - if (optionalParametersLoc != null) { - this.unexpected(optionalParametersLoc); - } - if (voidPatternLoc != null) { - this.raise(Errors.InvalidCoverDiscardElement, voidPatternLoc); + context, + type + } = this.state; + if (type === 56 && prevType === 142) { + context.splice(-2, 2, types.j_cTag); + this.state.canStartJSXElement = false; + } else if (type === 142) { + context.push(types.j_oTag); + } else if (type === 143) { + const out = context[context.length - 1]; + if (out === types.j_oTag && prevType === 56 || out === types.j_cTag) { + context.pop(); + this.state.canStartJSXElement = context[context.length - 1] === types.j_expr; + } else { + this.setContext(types.j_expr); + this.state.canStartJSXElement = true; + } + } else { + this.state.canStartJSXElement = tokenComesBeforeExpression(type); } } - isLiteralPropertyName() { - return tokenIsLiteralPropertyName(this.state.type); - } - isPrivateName(node) { - return node.type === "PrivateName"; - } - getPrivateNameSV(node) { - return node.id.name; - } - hasPropertyAsPrivateName(node) { - return (node.type === "MemberExpression" || node.type === "OptionalMemberExpression") && this.isPrivateName(node.property); - } - isObjectProperty(node) { - return node.type === "ObjectProperty"; +}; +class TypeScriptScope extends Scope { + constructor(...args) { + super(...args); + this.tsNames = new Map(); } - isObjectMethod(node) { - return node.type === "ObjectMethod"; +} +class TypeScriptScopeHandler extends ScopeHandler { + constructor(...args) { + super(...args); + this.importsStack = []; } - initializeScopes(inModule = this.options.sourceType === "module") { - const oldLabels = this.state.labels; - this.state.labels = []; - const oldExportedIdentifiers = this.exportedIdentifiers; - this.exportedIdentifiers = new Set(); - const oldInModule = this.inModule; - this.inModule = inModule; - const oldScope = this.scope; - const ScopeHandler = this.getScopeHandler(); - this.scope = new ScopeHandler(this, inModule); - const oldProdParam = this.prodParam; - this.prodParam = new ProductionParameterHandler(); - const oldClassScope = this.classScope; - this.classScope = new ClassScopeHandler(this); - const oldExpressionScope = this.expressionScope; - this.expressionScope = new ExpressionScopeHandler(this); - return () => { - this.state.labels = oldLabels; - this.exportedIdentifiers = oldExportedIdentifiers; - this.inModule = oldInModule; - this.scope = oldScope; - this.prodParam = oldProdParam; - this.classScope = oldClassScope; - this.expressionScope = oldExpressionScope; - }; + createScope(flags) { + this.importsStack.push(new Set()); + return new TypeScriptScope(flags); } - enterInitialScopes() { - let paramFlags = 0; - if (this.inModule || this.optionFlags & 1) { - paramFlags |= 2; - } - if (this.optionFlags & 32) { - paramFlags |= 1; - } - const isCommonJS = !this.inModule && this.options.sourceType === "commonjs"; - if (isCommonJS || this.optionFlags & 2) { - paramFlags |= 4; - } - this.prodParam.enter(paramFlags); - let scopeFlags = isCommonJS ? 514 : 1; - if (this.optionFlags & 4) { - scopeFlags |= 512; + enter(flags) { + if (flags === 256) { + this.importsStack.push(new Set()); } - this.scope.enter(scopeFlags); + super.enter(flags); } - checkDestructuringPrivate(refExpressionErrors) { - const { - privateKeyLoc - } = refExpressionErrors; - if (privateKeyLoc !== null) { - this.expectPlugin("destructuringPrivate", privateKeyLoc); + exit() { + const flags = super.exit(); + if (flags === 256) { + this.importsStack.pop(); } + return flags; } -} -class ExpressionErrors { - constructor() { - this.shorthandAssignLoc = null; - this.doubleProtoLoc = null; - this.privateKeyLoc = null; - this.optionalParametersLoc = null; - this.voidPatternLoc = null; - } -} -class Node { - constructor(parser, pos, loc) { - this.type = ""; - this.start = pos; - this.end = 0; - this.loc = new SourceLocation(loc); - if ((parser == null ? void 0 : parser.optionFlags) & 128) this.range = [pos, 0]; - if (parser != null && parser.filename) this.loc.filename = parser.filename; + hasImport(name, allowShadow) { + const len = this.importsStack.length; + if (this.importsStack[len - 1].has(name)) { + return true; + } + if (!allowShadow && len > 1) { + for (let i = 0; i < len - 1; i++) { + if (this.importsStack[i].has(name)) return true; + } + } + return false; } -} -const NodePrototype = Node.prototype; -{ - NodePrototype.__clone = function () { - const newNode = new Node(undefined, this.start, this.loc.start); - const keys = Object.keys(this); - for (let i = 0, length = keys.length; i < length; i++) { - const key = keys[i]; - if (key !== "leadingComments" && key !== "trailingComments" && key !== "innerComments") { - newNode[key] = this[key]; + declareName(name, bindingType, loc) { + if (bindingType & 4096) { + if (this.hasImport(name, true)) { + this.parser.raise(Errors.VarRedeclaration, loc, { + identifierName: name + }); + } + this.importsStack[this.importsStack.length - 1].add(name); + return; + } + const scope = this.currentScope(); + let type = scope.tsNames.get(name) || 0; + if (bindingType & 1024) { + this.maybeExportDefined(scope, name); + scope.tsNames.set(name, type | 16); + return; + } + super.declareName(name, bindingType, loc); + if (bindingType & 2) { + if (!(bindingType & 1)) { + this.checkRedeclarationInScope(scope, name, bindingType, loc); + this.maybeExportDefined(scope, name); } + type = type | 1; } - return newNode; - }; -} -class NodeUtils extends UtilParser { - startNode() { - const loc = this.state.startLoc; - return new Node(this, loc.index, loc); - } - startNodeAt(loc) { - return new Node(this, loc.index, loc); - } - startNodeAtNode(type) { - return this.startNodeAt(type.loc.start); - } - finishNode(node, type) { - return this.finishNodeAt(node, type, this.state.lastTokEndLoc); - } - finishNodeAt(node, type, endLoc) { - node.type = type; - node.end = endLoc.index; - node.loc.end = endLoc; - if (this.optionFlags & 128) node.range[1] = endLoc.index; - if (this.optionFlags & 4096) { - this.processComment(node); + if (bindingType & 256) { + type = type | 2; } - return node; - } - resetStartLocation(node, startLoc) { - node.start = startLoc.index; - node.loc.start = startLoc; - if (this.optionFlags & 128) node.range[0] = startLoc.index; - } - resetEndLocation(node, endLoc = this.state.lastTokEndLoc) { - node.end = endLoc.index; - node.loc.end = endLoc; - if (this.optionFlags & 128) node.range[1] = endLoc.index; - } - resetStartLocationFromNode(node, locationNode) { - this.resetStartLocation(node, locationNode.loc.start); + if (bindingType & 512) { + type = type | 4; + } + if (bindingType & 128) { + type = type | 8; + } + if (type) scope.tsNames.set(name, type); } - castNodeTo(node, type) { - node.type = type; - return node; + isRedeclaredInScope(scope, name, bindingType) { + const type = scope.tsNames.get(name); + if ((type & 2) > 0) { + if (bindingType & 256) { + const isConst = !!(bindingType & 512); + const wasConst = (type & 4) > 0; + return isConst !== wasConst; + } + return true; + } + if (bindingType & 128 && (type & 8) > 0) { + if (scope.names.get(name) & 2) { + return !!(bindingType & 1); + } else { + return false; + } + } + if (bindingType & 2 && (type & 1) > 0) { + return true; + } + return super.isRedeclaredInScope(scope, name, bindingType); } - cloneIdentifier(node) { + checkLocalExport(id) { const { - type, - start, - end, - loc, - range, name - } = node; - const cloned = Object.create(NodePrototype); - cloned.type = type; - cloned.start = start; - cloned.end = end; - cloned.loc = loc; - cloned.range = range; - cloned.name = name; - if (node.extra) cloned.extra = node.extra; - return cloned; - } - cloneStringLiteral(node) { - const { - type, - start, - end, - loc, - range, - extra - } = node; - const cloned = Object.create(NodePrototype); - cloned.type = type; - cloned.start = start; - cloned.end = end; - cloned.loc = loc; - cloned.range = range; - cloned.extra = extra; - cloned.value = node.value; - return cloned; + } = id; + if (this.hasImport(name)) return; + const len = this.scopeStack.length; + for (let i = len - 1; i >= 0; i--) { + const scope = this.scopeStack[i]; + const type = scope.tsNames.get(name); + if ((type & 1) > 0 || (type & 16) > 0) { + return; + } + } + super.checkLocalExport(id); } } const unwrapParenthesizedExpression = node => { @@ -7218,10 +7010,9 @@ class LValParser extends NodeUtils { case "ArrayPattern": case "AssignmentPattern": case "RestElement": - case "VoidPattern": break; case "ObjectExpression": - this.castNodeTo(node, "ObjectPattern"); + node.type = "ObjectPattern"; for (let i = 0, length = node.properties.length, last = length - 1; i < length; i++) { var _node$extra2; const prop = node.properties[i]; @@ -7249,18 +7040,15 @@ class LValParser extends NodeUtils { throw new Error("Internal @babel/parser error (this is a bug, please report it)." + " SpreadElement should be converted by .toAssignable's caller."); } case "ArrayExpression": - this.castNodeTo(node, "ArrayPattern"); + node.type = "ArrayPattern"; this.toAssignableList(node.elements, (_node$extra3 = node.extra) == null ? void 0 : _node$extra3.trailingCommaLoc, isLHS); break; case "AssignmentExpression": if (node.operator !== "=") { this.raise(Errors.MissingEqInAssignment, node.left.loc.end); } - this.castNodeTo(node, "AssignmentPattern"); + node.type = "AssignmentPattern"; delete node.operator; - if (node.left.type === "VoidPattern") { - this.raise(Errors.VoidPatternInitializer, node.left); - } this.toAssignable(node.left, isLHS); break; case "ParenthesizedExpression": @@ -7272,7 +7060,7 @@ class LValParser extends NodeUtils { if (prop.type === "ObjectMethod") { this.raise(prop.kind === "get" || prop.kind === "set" ? Errors.PatternHasAccessor : Errors.PatternHasMethod, prop.key); } else if (prop.type === "SpreadElement") { - this.castNodeTo(prop, "RestElement"); + prop.type = "RestElement"; const arg = prop.argument; this.checkToRestConversion(arg, false); this.toAssignable(arg, isLHS); @@ -7288,7 +7076,14 @@ class LValParser extends NodeUtils { for (let i = 0; i <= end; i++) { const elt = exprList[i]; if (!elt) continue; - this.toAssignableListItem(exprList, i, isLHS); + if (elt.type === "SpreadElement") { + elt.type = "RestElement"; + const arg = elt.argument; + this.checkToRestConversion(arg, true); + this.toAssignable(arg, isLHS); + } else { + this.toAssignable(elt, isLHS); + } if (elt.type === "RestElement") { if (i < end) { this.raise(Errors.RestTrailingComma, elt); @@ -7298,17 +7093,6 @@ class LValParser extends NodeUtils { } } } - toAssignableListItem(exprList, index, isLHS) { - const node = exprList[index]; - if (node.type === "SpreadElement") { - this.castNodeTo(node, "RestElement"); - const arg = node.argument; - this.checkToRestConversion(arg, true); - this.toAssignable(arg, isLHS); - } else { - this.toAssignable(node, isLHS); - } - } isAssignable(node, isBinding) { switch (node.type) { case "Identifier": @@ -7316,7 +7100,6 @@ class LValParser extends NodeUtils { case "ArrayPattern": case "AssignmentPattern": case "RestElement": - case "VoidPattern": return true; case "ObjectExpression": { @@ -7362,11 +7145,7 @@ class LValParser extends NodeUtils { parseRestBinding() { const node = this.startNode(); this.next(); - const argument = this.parseBindingAtom(); - if (argument.type === "VoidPattern") { - this.raise(Errors.UnexpectedVoidPattern, argument); - } - node.argument = argument; + node.argument = this.parseBindingAtom(); return this.finishNode(node, "RestElement"); } parseBindingAtom() { @@ -7380,8 +7159,6 @@ class LValParser extends NodeUtils { } case 5: return this.parseObjectLike(8, true); - case 88: - return this.parseVoidPattern(null); } return this.parseIdentifier(); } @@ -7400,38 +7177,27 @@ class LValParser extends NodeUtils { } else if (this.eat(close)) { break; } else if (this.match(21)) { - let rest = this.parseRestBinding(); - if (this.hasPlugin("flow") || flags & 2) { - rest = this.parseFunctionParamType(rest); - } - elts.push(rest); + elts.push(this.parseAssignableListItemTypes(this.parseRestBinding(), flags)); if (!this.checkCommaAfterRest(closeCharCode)) { this.expect(close); break; } } else { const decorators = []; - if (flags & 2) { - if (this.match(26) && this.hasPlugin("decorators")) { - this.raise(Errors.UnsupportedParameterDecorator, this.state.startLoc); - } - while (this.match(26)) { - decorators.push(this.parseDecorator()); - } + if (this.match(26) && this.hasPlugin("decorators")) { + this.raise(Errors.UnsupportedParameterDecorator, this.state.startLoc); + } + while (this.match(26)) { + decorators.push(this.parseDecorator()); } - elts.push(this.parseBindingElement(flags, decorators)); + elts.push(this.parseAssignableListItem(flags, decorators)); } } return elts; } parseBindingRestProperty(prop) { this.next(); - if (this.hasPlugin("discardBinding") && this.match(88)) { - prop.argument = this.parseVoidPattern(null); - this.raise(Errors.UnexpectedVoidPattern, prop.argument); - } else { - prop.argument = this.parseIdentifier(); - } + prop.argument = this.parseIdentifier(); this.checkCommaAfterRest(125); return this.finishNode(prop, "RestElement"); } @@ -7444,7 +7210,7 @@ class LValParser extends NodeUtils { return this.parseBindingRestProperty(this.startNode()); } const prop = this.startNode(); - if (type === 139) { + if (type === 138) { this.expectPlugin("destructuringPrivate", startLoc); this.classScope.usePrivateName(this.state.value, startLoc); prop.key = this.parsePrivateName(); @@ -7454,29 +7220,24 @@ class LValParser extends NodeUtils { prop.method = false; return this.parseObjPropValue(prop, startLoc, false, false, true, false); } - parseBindingElement(flags, decorators) { + parseAssignableListItem(flags, decorators) { const left = this.parseMaybeDefault(); - if (this.hasPlugin("flow") || flags & 2) { - this.parseFunctionParamType(left); - } + this.parseAssignableListItemTypes(left, flags); + const elt = this.parseMaybeDefault(left.loc.start, left); if (decorators.length) { left.decorators = decorators; - this.resetStartLocationFromNode(left, decorators[0]); } - const elt = this.parseMaybeDefault(left.loc.start, left); return elt; } - parseFunctionParamType(param) { + parseAssignableListItemTypes(param, flags) { return param; } parseMaybeDefault(startLoc, left) { - startLoc != null ? startLoc : startLoc = this.state.startLoc; - left = left != null ? left : this.parseBindingAtom(); + var _startLoc, _left; + (_startLoc = startLoc) != null ? _startLoc : startLoc = this.state.startLoc; + left = (_left = left) != null ? _left : this.parseBindingAtom(); if (!this.eat(29)) return left; const node = this.startNodeAt(startLoc); - if (left.type === "VoidPattern") { - this.raise(Errors.VoidPatternInitializer, left); - } node.left = left; node.right = this.parseMaybeAssignAllowIn(); return this.finishNode(node, "AssignmentPattern"); @@ -7495,8 +7256,6 @@ class LValParser extends NodeUtils { return "elements"; case "ObjectPattern": return "properties"; - case "VoidPattern": - return true; } return false; } @@ -7535,8 +7294,6 @@ class LValParser extends NodeUtils { } } return; - } else if (type === "VoidPattern" && ancestor.type === "CatchClause") { - this.raise(Errors.VoidPatternCatchClauseParam, expression); } const validity = this.isValidLVal(type, !(hasParenthesizedAncestor || (_expression$extra = expression.extra) != null && _expression$extra.parenthesized) && ancestor.type === "AssignmentExpression", binding); if (validity === true) return; @@ -7645,7 +7402,7 @@ const TSErrors = ParseErrorEnum`typescript`({ DeclareFunctionHasImplementation: "An implementation cannot be declared in ambient contexts.", DuplicateAccessibilityModifier: ({ modifier - }) => `Accessibility modifier already seen: '${modifier}'.`, + }) => `Accessibility modifier already seen.`, DuplicateModifier: ({ modifier }) => `Duplicate modifier: '${modifier}'.`, @@ -7668,10 +7425,6 @@ const TSErrors = ParseErrorEnum`typescript`({ IndexSignatureHasOverride: "'override' modifier cannot appear on an index signature.", IndexSignatureHasStatic: "Index signatures cannot have the 'static' modifier.", InitializerNotAllowedInAmbientContext: "Initializers are not allowed in ambient contexts.", - InvalidHeritageClauseType: ({ - token - }) => `'${token}' list can only include identifiers or qualified-names with optional type arguments.`, - InvalidModifierOnAwaitUsingDeclaration: modifier => `'${modifier}' modifier cannot appear on an await using declaration.`, InvalidModifierOnTypeMember: ({ modifier }) => `'${modifier}' modifier cannot appear on a type member.`, @@ -7681,7 +7434,6 @@ const TSErrors = ParseErrorEnum`typescript`({ InvalidModifierOnTypeParameterPositions: ({ modifier }) => `'${modifier}' modifier can only appear on a type parameter of a class, interface or type alias.`, - InvalidModifierOnUsingDeclaration: modifier => `'${modifier}' modifier cannot appear on a using declaration.`, InvalidModifiersOrder: ({ orderedModifiers }) => `'${orderedModifiers[0]}' modifier must precede '${orderedModifiers[1]}' modifier.`, @@ -7689,7 +7441,7 @@ const TSErrors = ParseErrorEnum`typescript`({ InvalidTupleMemberLabel: "Tuple members must be labeled with a simple identifier.", MissingInterfaceName: "'interface' declarations must be followed by an identifier.", NonAbstractClassHasAbstractMethod: "Abstract methods can only appear within an abstract class.", - NonClassMethodPropertyHasAbstractModifier: "'abstract' modifier can only appear on a class, method, or property declaration.", + NonClassMethodPropertyHasAbstractModifer: "'abstract' modifier can only appear on a class, method, or property declaration.", OptionalTypeBeforeRequired: "A required element cannot follow an optional element.", OverrideNotInSubClass: "This member cannot have an 'override' modifier because its containing class does not extend another class.", PatternIsOptional: "A binding pattern parameter cannot be optional in an implementation signature.", @@ -7720,8 +7472,7 @@ const TSErrors = ParseErrorEnum`typescript`({ UnsupportedParameterPropertyKind: "A parameter property may not be declared using a binding pattern.", UnsupportedSignatureParameterKind: ({ type - }) => `Name in a signature must be an Identifier, ObjectPattern or ArrayPattern, instead got ${type}.`, - UsingDeclarationInAmbientContext: kind => `'${kind}' declarations are not allowed in ambient contexts.` + }) => `Name in a signature must be an Identifier, ObjectPattern or ArrayPattern, instead got ${type}.` }); function keywordTypeFromName(value) { switch (value) { @@ -7781,7 +7532,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { return tokenIsIdentifier(this.state.type); } tsTokenCanFollowModifier() { - return this.match(0) || this.match(5) || this.match(55) || this.match(21) || this.match(139) || this.isLiteralPropertyName(); + return this.match(0) || this.match(5) || this.match(55) || this.match(21) || this.match(138) || this.isLiteralPropertyName(); } tsNextTokenOnSameLineAndCanFollowModifier() { this.next(); @@ -7797,15 +7548,12 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { } return this.tsNextTokenOnSameLineAndCanFollowModifier(); } - tsParseModifier(allowedModifiers, stopOnStartOfClassStaticBlock, hasSeenStaticModifier) { + tsParseModifier(allowedModifiers, stopOnStartOfClassStaticBlock) { if (!tokenIsIdentifier(this.state.type) && this.state.type !== 58 && this.state.type !== 75) { return undefined; } const modifier = this.state.value; if (allowedModifiers.includes(modifier)) { - if (hasSeenStaticModifier && this.match(106)) { - return undefined; - } if (stopOnStartOfClassStaticBlock && this.tsIsStartOfStaticBlocks()) { return undefined; } @@ -7839,7 +7587,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { const { startLoc } = this.state; - const modifier = this.tsParseModifier(allowedModifiers.concat(disallowedModifiers != null ? disallowedModifiers : []), stopOnStartOfClassStaticBlock, modified.static); + const modifier = this.tsParseModifier(allowedModifiers.concat(disallowedModifiers != null ? disallowedModifiers : []), stopOnStartOfClassStaticBlock); if (!modifier) break; if (tsIsAccessModifier(modifier)) { if (modified.accessibility) { @@ -7955,95 +7703,44 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { const node = this.startNode(); this.expect(83); this.expect(10); - if (!this.match(134)) { + if (!this.match(133)) { this.raise(TSErrors.UnsupportedImportTypeArgument, this.state.startLoc); - { - node.argument = super.parseExprAtom(); - } - } else { - { - node.argument = this.parseStringLiteral(this.state.value); - } } - if (this.eat(12)) { - node.options = this.tsParseImportTypeOptions(); - } else { + node.argument = super.parseExprAtom(); + if (this.hasPlugin("importAttributes") || this.hasPlugin("importAssertions")) { node.options = null; } + if (this.eat(12)) { + this.expectImportAttributesPlugin(); + if (!this.match(11)) { + node.options = super.parseMaybeAssignAllowIn(); + this.eat(12); + } + } this.expect(11); if (this.eat(16)) { - node.qualifier = this.tsParseEntityName(1 | 2); + node.qualifier = this.tsParseEntityName(); } if (this.match(47)) { - { - node.typeParameters = this.tsParseTypeArguments(); - } + node.typeParameters = this.tsParseTypeArguments(); } return this.finishNode(node, "TSImportType"); } - tsParseImportTypeOptions() { - const node = this.startNode(); - this.expect(5); - const withProperty = this.startNode(); - if (this.isContextual(76)) { - withProperty.method = false; - withProperty.key = this.parseIdentifier(true); - withProperty.computed = false; - withProperty.shorthand = false; - } else { - this.unexpected(null, 76); - } - this.expect(14); - withProperty.value = this.tsParseImportTypeWithPropertyValue(); - node.properties = [this.finishObjectProperty(withProperty)]; - this.expect(8); - return this.finishNode(node, "ObjectExpression"); - } - tsParseImportTypeWithPropertyValue() { - const node = this.startNode(); - const properties = []; - this.expect(5); - while (!this.match(8)) { - const type = this.state.type; - if (tokenIsIdentifier(type) || type === 134) { - properties.push(super.parsePropertyDefinition(null)); - } else { - this.unexpected(); - } - this.eat(12); - } - node.properties = properties; - this.next(); - return this.finishNode(node, "ObjectExpression"); - } - tsParseEntityName(flags) { - let entity; - if (flags & 1 && this.match(78)) { - if (flags & 2) { - entity = this.parseIdentifier(true); - } else { - const node = this.startNode(); - this.next(); - entity = this.finishNode(node, "ThisExpression"); - } - } else { - entity = this.parseIdentifier(!!(flags & 1)); - } + tsParseEntityName(allowReservedWords = true) { + let entity = this.parseIdentifier(allowReservedWords); while (this.eat(16)) { const node = this.startNodeAtNode(entity); node.left = entity; - node.right = this.parseIdentifier(!!(flags & 1)); + node.right = this.parseIdentifier(allowReservedWords); entity = this.finishNode(node, "TSQualifiedName"); } return entity; } tsParseTypeReference() { const node = this.startNode(); - node.typeName = this.tsParseEntityName(1); + node.typeName = this.tsParseEntityName(); if (!this.hasPrecedingLineBreak() && this.match(47)) { - { - node.typeParameters = this.tsParseTypeArguments(); - } + node.typeParameters = this.tsParseTypeArguments(); } return this.finishNode(node, "TSTypeReference"); } @@ -8066,14 +7763,10 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { if (this.match(83)) { node.exprName = this.tsParseImportType(); } else { - { - node.exprName = this.tsParseEntityName(1 | 2); - } + node.exprName = this.tsParseEntityName(); } if (!this.hasPrecedingLineBreak() && this.match(47)) { - { - node.typeParameters = this.tsParseTypeArguments(); - } + node.typeParameters = this.tsParseTypeArguments(); } return this.finishNode(node, "TSTypeQuery"); } @@ -8092,7 +7785,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { } tsParseTypeParameters(parseModifiers) { const node = this.startNode(); - if (this.match(47) || this.match(143)) { + if (this.match(47) || this.match(142)) { this.next(); } else { this.unexpected(); @@ -8171,11 +7864,12 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { } tsParsePropertyOrMethodSignature(node, readonly) { if (this.eat(17)) node.optional = true; + const nodeAny = node; if (this.match(10) || this.match(47)) { if (readonly) { this.raise(TSErrors.ReadonlyForMethodSignature, node); } - const method = node; + const method = nodeAny; if (method.kind && this.match(47)) { this.raise(TSErrors.AccessorCannotHaveTypeParameters, this.state.curPosition()); } @@ -8213,7 +7907,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { } return this.finishNode(method, "TSMethodSignature"); } else { - const property = node; + const property = nodeAny; if (readonly) property.readonly = true; const type = this.tsTryParseTypeAnnotation(); if (type) property.typeAnnotation = type; @@ -8248,9 +7942,6 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { if (!node.computed && node.key.type === "Identifier" && (node.key.name === "get" || node.key.name === "set") && this.tsTokenCanFollowModifier()) { node.kind = node.key.name; super.parsePropertyName(node); - if (!this.match(10) && !this.match(47)) { - this.unexpected(null, 10); - } } return this.tsParsePropertyOrMethodSignature(node, !!node.readonly); } @@ -8330,11 +8021,10 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { return this.finishNode(node, "TSTupleType"); } tsParseTupleElementType() { - const restStartLoc = this.state.startLoc; - const rest = this.eat(21); const { startLoc } = this.state; + const rest = this.eat(21); let labeled; let label; let optional; @@ -8349,6 +8039,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { type = this.tsParseType(); } else if (chAfterWord === 63) { optional = true; + const startLoc = this.state.startLoc; const wordName = this.state.value; const typeOrLabel = this.tsParseNonArrayType(); if (this.lookaheadCharCode() === 58) { @@ -8370,7 +8061,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { if (labeled) { let labeledNode; if (label) { - labeledNode = this.startNodeAt(startLoc); + labeledNode = this.startNodeAtNode(label); labeledNode.optional = optional; labeledNode.label = label; labeledNode.elementType = type; @@ -8379,7 +8070,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { this.raise(TSErrors.TupleOptionalAfterType, this.state.lastTokStartLoc); } } else { - labeledNode = this.startNodeAt(startLoc); + labeledNode = this.startNodeAtNode(type); labeledNode.optional = optional; this.raise(TSErrors.InvalidTupleMemberLabel, type); labeledNode.label = type; @@ -8387,12 +8078,12 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { } type = this.finishNode(labeledNode, "TSNamedTupleMember"); } else if (optional) { - const optionalTypeNode = this.startNodeAt(startLoc); + const optionalTypeNode = this.startNodeAtNode(type); optionalTypeNode.typeAnnotation = type; type = this.finishNode(optionalTypeNode, "TSOptionalType"); } if (rest) { - const restNode = this.startNodeAt(restStartLoc); + const restNode = this.startNodeAt(startLoc); restNode.typeAnnotation = type; type = this.finishNode(restNode, "TSRestType"); } @@ -8418,9 +8109,9 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { tsParseLiteralTypeNode() { const node = this.startNode(); switch (this.state.type) { - case 135: - case 136: case 134: + case 135: + case 133: case 85: case 86: node.literal = super.parseExprAtom(); @@ -8431,11 +8122,9 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { return this.finishNode(node, "TSLiteralType"); } tsParseTemplateLiteralType() { - { - const node = this.startNode(); - node.literal = super.parseTemplate(false); - return this.finishNode(node, "TSLiteralType"); - } + const node = this.startNode(); + node.literal = super.parseTemplate(false); + return this.finishNode(node, "TSLiteralType"); } parseTemplateSubstitution() { if (this.state.inType) return this.tsParseType(); @@ -8451,9 +8140,9 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { } tsParseNonArrayType() { switch (this.state.type) { + case 133: case 134: case 135: - case 136: case 85: case 86: return this.tsParseLiteralTypeNode(); @@ -8461,7 +8150,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { if (this.state.value === "-") { const node = this.startNode(); const nextToken = this.lookahead(); - if (nextToken.type !== 135 && nextToken.type !== 136) { + if (nextToken.type !== 134 && nextToken.type !== 135) { this.unexpected(); } node.literal = this.parseMaybeUnary(); @@ -8502,18 +8191,15 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { this.unexpected(); } tsParseArrayTypeOrHigher() { - const { - startLoc - } = this.state; let type = this.tsParseNonArrayType(); while (!this.hasPrecedingLineBreak() && this.eat(0)) { if (this.match(3)) { - const node = this.startNodeAt(startLoc); + const node = this.startNodeAtNode(type); node.elementType = type; this.expect(3); type = this.finishNode(node, "TSArrayType"); } else { - const node = this.startNodeAt(startLoc); + const node = this.startNodeAtNode(type); node.objectType = type; node.indexType = this.tsParseType(); this.expect(3); @@ -8736,7 +8422,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { return this.finishNode(node, "TSConditionalType"); } isAbstractConstructorSignature() { - return this.isContextual(124) && this.isLookaheadContextual("new"); + return this.isContextual(124) && this.lookahead().type === 77; } tsParseNonConditionalType() { if (this.tsIsStartOfFunctionType()) { @@ -8765,14 +8451,12 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { tsParseHeritageClause(token) { const originalStartLoc = this.state.startLoc; const delimitedList = this.tsParseDelimitedList("HeritageClauseElement", () => { - { - const node = this.startNode(); - node.expression = this.tsParseEntityName(1 | 2); - if (this.match(47)) { - node.typeParameters = this.tsParseTypeArguments(); - } - return this.finishNode(node, "TSExpressionWithTypeArguments"); + const node = this.startNode(); + node.expression = this.tsParseEntityName(); + if (this.match(47)) { + node.typeParameters = this.tsParseTypeArguments(); } + return this.finishNode(node, "TSExpressionWithTypeArguments"); }); if (!delimitedList.length) { this.raise(TSErrors.EmptyHeritageClauseType, originalStartLoc, { @@ -8807,7 +8491,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { node.typeAnnotation = this.tsInType(() => { node.typeParameters = this.tsTryParseTypeParameters(this.tsParseInOutModifiers); this.expect(29); - if (this.isContextual(114) && this.lookaheadCharCode() !== 46) { + if (this.isContextual(114) && this.lookahead().type !== 16) { const node = this.startNode(); this.next(); return this.finishNode(node, "TSIntrinsicKeyword"); @@ -8817,17 +8501,13 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { this.semicolon(); return this.finishNode(node, "TSTypeAliasDeclaration"); } - tsInTopLevelContext(cb) { - if (this.curContext() !== types.brace) { - const oldContext = this.state.context; - this.state.context = [oldContext[0]]; - try { - return cb(); - } finally { - this.state.context = oldContext; - } - } else { + tsInNoContext(cb) { + const oldContext = this.state.context; + this.state.context = [oldContext[0]]; + try { return cb(); + } finally { + this.state.context = oldContext; } } tsInType(cb) { @@ -8876,7 +8556,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { } tsParseEnumMember() { const node = this.startNode(); - node.id = this.match(134) ? super.parseStringLiteral(this.state.value) : this.parseIdentifier(true); + node.id = this.match(133) ? super.parseStringLiteral(this.state.value) : this.parseIdentifier(true); if (this.eat(29)) { node.initializer = super.parseMaybeAssignAllowIn(); } @@ -8888,19 +8568,10 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { this.expectContextual(126); node.id = this.parseIdentifier(); this.checkIdentifier(node.id, node.const ? 8971 : 8459); - { - this.expect(5); - node.members = this.tsParseDelimitedList("EnumMembers", this.tsParseEnumMember.bind(this)); - this.expect(8); - } - return this.finishNode(node, "TSEnumDeclaration"); - } - tsParseEnumBody() { - const node = this.startNode(); this.expect(5); node.members = this.tsParseDelimitedList("EnumMembers", this.tsParseEnumMember.bind(this)); this.expect(8); - return this.finishNode(node, "TSEnumBody"); + return this.finishNode(node, "TSEnumDeclaration"); } tsParseModuleBlock() { const node = this.startNode(); @@ -8920,7 +8591,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { this.tsParseModuleOrNamespaceDeclaration(inner, true); node.body = inner; } else { - this.scope.enter(1024); + this.scope.enter(256); this.prodParam.enter(0); node.body = this.tsParseModuleBlock(); this.prodParam.exit(); @@ -8930,19 +8601,15 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { } tsParseAmbientExternalModuleDeclaration(node) { if (this.isContextual(112)) { - node.kind = "global"; - { - node.global = true; - } + node.global = true; node.id = this.parseIdentifier(); - } else if (this.match(134)) { - node.kind = "module"; + } else if (this.match(133)) { node.id = super.parseStringLiteral(this.state.value); } else { this.unexpected(); } if (this.match(5)) { - this.scope.enter(1024); + this.scope.enter(256); this.prodParam.enter(0); node.body = this.tsParseModuleBlock(); this.prodParam.exit(); @@ -8953,9 +8620,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { return this.finishNode(node, "TSModuleDeclaration"); } tsParseImportEqualsDeclaration(node, maybeDefaultIdentifier, isExport) { - { - node.isExport = isExport || false; - } + node.isExport = isExport || false; node.id = maybeDefaultIdentifier || this.parseIdentifier(); this.checkIdentifier(node.id, 4096); this.expect(29); @@ -8971,13 +8636,13 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { return this.isContextual(119) && this.lookaheadCharCode() === 40; } tsParseModuleReference() { - return this.tsIsExternalModuleReference() ? this.tsParseExternalModuleReference() : this.tsParseEntityName(0); + return this.tsIsExternalModuleReference() ? this.tsParseExternalModuleReference() : this.tsParseEntityName(false); } tsParseExternalModuleReference() { const node = this.startNode(); this.expectContextual(119); this.expect(10); - if (!this.match(134)) { + if (!this.match(133)) { this.unexpected(); } node.expression = super.parseExprAtom(); @@ -9005,65 +8670,51 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { } this.state = state; } - tsTryParseDeclare(node) { + tsTryParseDeclare(nany) { if (this.isLineTerminator()) { return; } - const startType = this.state.type; + let startType = this.state.type; + let kind; + if (this.isContextual(100)) { + startType = 74; + kind = "let"; + } return this.tsInAmbientContext(() => { switch (startType) { case 68: - node.declare = true; - return super.parseFunctionStatement(node, false, false); + nany.declare = true; + return super.parseFunctionStatement(nany, false, false); case 80: - node.declare = true; - return this.parseClass(node, true, false); + nany.declare = true; + return this.parseClass(nany, true, false); case 126: - return this.tsParseEnumDeclaration(node, { + return this.tsParseEnumDeclaration(nany, { declare: true }); case 112: - return this.tsParseAmbientExternalModuleDeclaration(node); - case 100: - if (this.state.containsEsc) { - return; - } + return this.tsParseAmbientExternalModuleDeclaration(nany); case 75: case 74: if (!this.match(75) || !this.isLookaheadContextual("enum")) { - node.declare = true; - return this.parseVarStatement(node, this.state.value, true); + nany.declare = true; + return this.parseVarStatement(nany, kind || this.state.value, true); } this.expect(75); - return this.tsParseEnumDeclaration(node, { + return this.tsParseEnumDeclaration(nany, { const: true, declare: true }); - case 107: - if (this.isUsing()) { - this.raise(TSErrors.InvalidModifierOnUsingDeclaration, this.state.startLoc, "declare"); - node.declare = true; - return this.parseVarStatement(node, "using", true); - } - break; - case 96: - if (this.isAwaitUsing()) { - this.raise(TSErrors.InvalidModifierOnAwaitUsingDeclaration, this.state.startLoc, "declare"); - node.declare = true; - this.next(); - return this.parseVarStatement(node, "await using", true); - } - break; case 129: { - const result = this.tsParseInterfaceDeclaration(node, { + const result = this.tsParseInterfaceDeclaration(nany, { declare: true }); if (result) return result; } default: if (tokenIsIdentifier(startType)) { - return this.tsParseDeclaration(node, this.state.value, true, null); + return this.tsParseDeclaration(nany, this.state.value, true, null); } } }); @@ -9083,13 +8734,10 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { } case "global": if (this.match(5)) { - this.scope.enter(1024); + this.scope.enter(256); this.prodParam.enter(0); const mod = node; - mod.kind = "global"; - { - node.global = true; - } + mod.global = true; mod.id = expr; mod.body = this.tsParseModuleBlock(); this.scope.exit(); @@ -9110,17 +8758,15 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { break; case "module": if (this.tsCheckLineTerminator(next)) { - if (this.match(134)) { + if (this.match(133)) { return this.tsParseAmbientExternalModuleDeclaration(node); } else if (tokenIsIdentifier(this.state.type)) { - node.kind = "module"; return this.tsParseModuleOrNamespaceDeclaration(node); } } break; case "namespace": if (this.tsCheckLineTerminator(next) && tokenIsIdentifier(this.state.type)) { - node.kind = "namespace"; return this.tsParseModuleOrNamespaceDeclaration(node); } break; @@ -9161,7 +8807,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { } tsParseTypeArguments() { const node = this.startNode(); - node.params = this.tsInType(() => this.tsInTopLevelContext(() => { + node.params = this.tsInType(() => this.tsInNoContext(() => { this.expect(47); return this.tsParseDelimitedList("TypeParametersOrArguments", this.tsParseType.bind(this)); })); @@ -9180,8 +8826,8 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { if (this.tsIsDeclarationStart()) return false; return super.isExportDefaultSpecifier(); } - parseBindingElement(flags, decorators) { - const startLoc = decorators.length ? decorators[0].loc.start : this.state.startLoc; + parseAssignableListItem(flags, decorators) { + const startLoc = this.state.startLoc; const modified = {}; this.tsParseModifiers({ allowedModifiers: ["public", "private", "protected", "override", "readonly"] @@ -9193,9 +8839,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { this.raise(TSErrors.UnexpectedParameterModifier, startLoc); } const left = this.parseMaybeDefault(); - if (flags & 2) { - this.parseFunctionParamType(left); - } + this.parseAssignableListItemTypes(left, flags); const elt = this.parseMaybeDefault(left.loc.start, left); if (accessibility || readonly || override) { const pp = this.startNodeAt(startLoc); @@ -9306,19 +8950,15 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { } if (tokenIsTemplate(this.state.type)) { const result = super.parseTaggedTemplateExpression(base, startLoc, state); - { - result.typeParameters = typeArguments; - } + result.typeParameters = typeArguments; return result; } if (!noCalls && this.eat(10)) { const node = this.startNodeAt(startLoc); node.callee = base; - node.arguments = this.parseCallExpressionArguments(); + node.arguments = this.parseCallExpressionArguments(11, false); this.tsCheckForInvalidTypeCasts(node.arguments); - { - node.typeParameters = typeArguments; - } + node.typeParameters = typeArguments; if (state.optionalChainMember) { node.optional = isOptionalCall; } @@ -9330,22 +8970,15 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { } const node = this.startNodeAt(startLoc); node.expression = base; - { - node.typeParameters = typeArguments; - } + node.typeParameters = typeArguments; return this.finishNode(node, "TSInstantiationExpression"); }); if (missingParenErrorLoc) { this.unexpected(missingParenErrorLoc, 10); } if (result) { - if (result.type === "TSInstantiationExpression") { - if (this.match(16) || this.match(18) && this.lookaheadCharCode() !== 40) { - this.raise(TSErrors.InvalidPropertyAccessAfterInstantiationExpression, this.state.startLoc); - } - if (!this.match(16) && !this.match(18)) { - result.expression = super.stopParseSubscript(base, state); - } + if (result.type === "TSInstantiationExpression" && (this.match(16) || this.match(18) && this.lookaheadCharCode() !== 40)) { + this.raise(TSErrors.InvalidPropertyAccessAfterInstantiationExpression, this.state.startLoc); } return result; } @@ -9359,9 +8992,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { callee } = node; if (callee.type === "TSInstantiationExpression" && !((_callee$extra = callee.extra) != null && _callee$extra.parenthesized)) { - { - node.typeParameters = callee.typeParameters; - } + node.typeParameters = callee.typeParameters; node.callee = callee.expression; } } @@ -9417,7 +9048,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { } } parseImport(node) { - if (this.match(134)) { + if (this.match(133)) { node.importKind = "value"; return super.parseImport(node); } @@ -9442,18 +9073,15 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { } parseExport(node, decorators) { if (this.match(83)) { - const nodeImportEquals = node; this.next(); + const nodeImportEquals = node; let maybeDefaultIdentifier = null; if (this.isContextual(130) && this.isPotentialImportPhase(false)) { maybeDefaultIdentifier = this.parseMaybeImportPhase(nodeImportEquals, false); } else { nodeImportEquals.importKind = "value"; } - const declaration = this.tsParseImportEqualsDeclaration(nodeImportEquals, maybeDefaultIdentifier, true); - { - return declaration; - } + return this.tsParseImportEqualsDeclaration(nodeImportEquals, maybeDefaultIdentifier, true); } else if (this.eat(29)) { const assign = node; assign.expression = super.parseExpression(); @@ -9471,7 +9099,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { } } isAbstractClass() { - return this.isContextual(124) && this.isLookaheadContextual("class"); + return this.isContextual(124) && this.lookahead().type === 80; } parseExportDefaultExpression() { if (this.isAbstractClass()) { @@ -9492,16 +9120,12 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { } = this.state; const declaration = super.parseVarStatement(node, kind, allowMissingInitializer || isAmbientContext); if (!isAmbientContext) return declaration; - if (!node.declare && (kind === "using" || kind === "await using")) { - this.raiseOverwrite(TSErrors.UsingDeclarationInAmbientContext, node, kind); - return declaration; - } for (const { id, init } of declaration.declarations) { if (!init) continue; - if (kind === "var" || kind === "let" || !!id.typeAnnotation) { + if (kind !== "const" || !!id.typeAnnotation) { this.raise(TSErrors.InitializerNotAllowedInAmbientContext, init); } else if (!isValidAmbientConstInitializer(init, this.hasPlugin("estree"))) { this.raise(TSErrors.ConstInitializerMustBeStringOrNumericLiteralOrLiteralEnumReference, init); @@ -9611,19 +9235,22 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { return decl || super.parseExpressionStatement(node, expr, decorators); } shouldParseExportDeclaration() { - if (this.tsIsDeclarationStart()) return true; - return super.shouldParseExportDeclaration(); - } - parseConditional(expr, startLoc, refExpressionErrors) { - if (!this.match(17)) return expr; - if (this.state.maybeInArrowParameters) { - const nextCh = this.lookaheadCharCode(); - if (nextCh === 44 || nextCh === 61 || nextCh === 58 || nextCh === 41) { - this.setOptionalParametersError(refExpressionErrors); - return expr; + if (this.tsIsDeclarationStart()) return true; + return super.shouldParseExportDeclaration(); + } + parseConditional(expr, startLoc, refExpressionErrors) { + if (!this.state.maybeInArrowParameters || !this.match(17)) { + return super.parseConditional(expr, startLoc, refExpressionErrors); + } + const result = this.tryParse(() => super.parseConditional(expr, startLoc)); + if (!result.node) { + if (result.error) { + super.setOptionalParametersError(refExpressionErrors, result.error); } + return expr; } - return super.parseConditional(expr, startLoc, refExpressionErrors); + if (result.error) this.state = result.failState; + return result.node; } parseParenItem(node, startLoc) { const newNode = super.parseParenItem(node, startLoc); @@ -9654,7 +9281,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { if (declaration.type === "TSInterfaceDeclaration" || declaration.type === "TSTypeAliasDeclaration" || isDeclare) { node.exportKind = "type"; } - if (isDeclare && declaration.type !== "TSImportEqualsDeclaration") { + if (isDeclare) { this.resetStartLocation(declaration, startLoc); declaration.declare = true; } @@ -9689,7 +9316,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { key } = node; this.raise(TSErrors.AbstractPropertyHasInitializer, this.state.startLoc, { - propertyName: key.type === "Identifier" && !node.computed ? key.name : `[${this.input.slice(this.offsetToSourcePos(key.start), this.offsetToSourcePos(key.end))}]` + propertyName: key.type === "Identifier" && !node.computed ? key.name : `[${this.input.slice(key.start, key.end)}]` }); } return super.parseClassProperty(node); @@ -9737,7 +9364,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { } declareClassPrivateMethodInScope(node, kind) { if (node.type === "TSDeclareMethod") return; - if (node.type === "MethodDefinition" && node.value.body == null) { + if (node.type === "MethodDefinition" && !hasOwnProperty.call(node.value, "body")) { return; } super.declareClassPrivateMethodInScope(node, kind); @@ -9745,9 +9372,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { parseClassSuper(node) { super.parseClassSuper(node); if (node.superClass && (this.match(47) || this.match(51))) { - { - node.superTypeParameters = this.tsParseTypeArgumentsInExpression(); - } + node.superTypeParameters = this.tsParseTypeArgumentsInExpression(); } if (this.eatContextual(113)) { node.implements = this.tsParseHeritageClause("implements"); @@ -9785,7 +9410,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { let state; let jsx; let typeCast; - if (this.hasPlugin("jsx") && (this.match(143) || this.match(47))) { + if (this.hasPlugin("jsx") && (this.match(142) || this.match(47))) { state = this.state.clone(); jsx = this.tryParse(() => super.parseMaybeAssign(refExpressionErrors, afterLeftParse), state); if (!jsx.error) return jsx.node; @@ -9840,8 +9465,8 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { throw ((_jsx3 = jsx) == null ? void 0 : _jsx3.error) || arrow.error || ((_typeCast2 = typeCast) == null ? void 0 : _typeCast2.error); } reportReservedArrowTypeParam(node) { - var _node$extra2; - if (node.params.length === 1 && !node.params[0].constraint && !((_node$extra2 = node.extra) != null && _node$extra2.trailingComma) && this.getPluginOption("typescript", "disallowAmbiguousJSXLike")) { + var _node$extra; + if (node.params.length === 1 && !node.params[0].constraint && !((_node$extra = node.extra) != null && _node$extra.trailingComma) && this.getPluginOption("typescript", "disallowAmbiguousJSXLike")) { this.raise(TSErrors.ReservedArrowTypeParam, node); } } @@ -9866,7 +9491,8 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { } return super.parseArrow(node); } - parseFunctionParamType(param) { + parseAssignableListItemTypes(param, flags) { + if (!(flags & 2)) return param; if (this.eat(17)) { param.optional = true; } @@ -9941,6 +9567,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { case "TSParameterProperty": return "parameter"; case "TSNonNullExpression": + case "TSInstantiationExpression": return "expression"; case "TSAsExpression": case "TSSatisfiesExpression": @@ -9956,19 +9583,17 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { } return super.parseBindingAtom(); } - parseMaybeDecoratorArguments(expr, startLoc) { + parseMaybeDecoratorArguments(expr) { if (this.match(47) || this.match(51)) { const typeArguments = this.tsParseTypeArgumentsInExpression(); if (this.match(10)) { - const call = super.parseMaybeDecoratorArguments(expr, startLoc); - { - call.typeParameters = typeArguments; - } + const call = super.parseMaybeDecoratorArguments(expr); + call.typeParameters = typeArguments; return call; } this.unexpected(null, 10); } - return super.parseMaybeDecoratorArguments(expr, startLoc); + return super.parseMaybeDecoratorArguments(expr); } checkCommaAfterRest(close) { if (this.state.isAmbientContext && this.match(12) && this.lookaheadCharCode() === close) { @@ -10026,12 +9651,14 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { } return type; } - toAssignableListItem(exprList, index, isLHS) { - const node = exprList[index]; - if (node.type === "TSTypeCastExpression") { - exprList[index] = this.typeCastToParameter(node); + toAssignableList(exprList, trailingCommaLoc, isLHS) { + for (let i = 0; i < exprList.length; i++) { + const expr = exprList[i]; + if ((expr == null ? void 0 : expr.type) === "TSTypeCastExpression") { + exprList[i] = this.typeCastToParameter(expr); + } } - super.toAssignableListItem(exprList, index, isLHS); + super.toAssignableList(exprList, trailingCommaLoc, isLHS); } typeCastToParameter(node) { node.expression.typeAnnotation = node.typeAnnotation; @@ -10053,11 +9680,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { jsxParseOpeningElementAfterName(node) { if (this.match(47) || this.match(51)) { const typeArguments = this.tsTryParseAndCatch(() => this.tsParseTypeArgumentsInExpression()); - if (typeArguments) { - { - node.typeParameters = typeArguments; - } - } + if (typeArguments) node.typeParameters = typeArguments; } return super.jsxParseOpeningElementAfterName(node); } @@ -10107,7 +9730,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { } else if (this.isContextual(129)) { if (!this.hasFollowingLineBreak()) { node.abstract = true; - this.raise(TSErrors.NonClassMethodPropertyHasAbstractModifier, node); + this.raise(TSErrors.NonClassMethodPropertyHasAbstractModifer, node); return this.tsParseInterfaceDeclaration(node); } } else { @@ -10116,15 +9739,14 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { } parseMethod(node, isGenerator, isAsync, isConstructor, allowDirectSuper, type, inClassScope) { const method = super.parseMethod(node, isGenerator, isAsync, isConstructor, allowDirectSuper, type, inClassScope); - if (method.abstract || method.type === "TSAbstractMethodDefinition") { - const hasEstreePlugin = this.hasPlugin("estree"); - const methodFn = hasEstreePlugin ? method.value : method; - if (methodFn.body) { + if (method.abstract) { + const hasBody = this.hasPlugin("estree") ? !!method.value.body : !!method.body; + if (hasBody) { const { key } = method; this.raise(TSErrors.AbstractMethodHasImplementation, method, { - methodName: key.type === "Identifier" && !method.computed ? key.name : `[${this.input.slice(this.offsetToSourcePos(key.start), this.offsetToSourcePos(key.end))}]` + methodName: key.type === "Identifier" && !method.computed ? key.name : `[${this.input.slice(key.start, key.end)}]` }); } } @@ -10215,115 +9837,12 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass { node[rightOfAsKey] = isImport ? this.parseIdentifier() : this.parseModuleExportName(); } if (!node[rightOfAsKey]) { - node[rightOfAsKey] = this.cloneIdentifier(node[leftOfAsKey]); + node[rightOfAsKey] = cloneIdentifier(node[leftOfAsKey]); } if (isImport) { this.checkIdentifier(node[rightOfAsKey], hasTypeSpecifier ? 4098 : 4096); } } - fillOptionalPropertiesForTSESLint(node) { - var _node$directive, _node$decorators, _node$optional, _node$typeAnnotation, _node$accessibility, _node$decorators2, _node$override, _node$readonly, _node$static, _node$declare, _node$returnType, _node$typeParameters, _node$optional2, _node$optional3, _node$accessibility2, _node$readonly2, _node$static2, _node$declare2, _node$definite, _node$readonly3, _node$typeAnnotation2, _node$accessibility3, _node$decorators3, _node$override2, _node$optional4, _node$id, _node$abstract, _node$declare3, _node$decorators4, _node$implements, _node$superTypeArgume, _node$typeParameters2, _node$declare4, _node$definite2, _node$const, _node$declare5, _node$computed, _node$qualifier, _node$options, _node$declare6, _node$extends, _node$declare7, _node$global, _node$const2, _node$in, _node$out; - switch (node.type) { - case "ExpressionStatement": - (_node$directive = node.directive) != null ? _node$directive : node.directive = undefined; - return; - case "RestElement": - node.value = undefined; - case "Identifier": - case "ArrayPattern": - case "AssignmentPattern": - case "ObjectPattern": - (_node$decorators = node.decorators) != null ? _node$decorators : node.decorators = []; - (_node$optional = node.optional) != null ? _node$optional : node.optional = false; - (_node$typeAnnotation = node.typeAnnotation) != null ? _node$typeAnnotation : node.typeAnnotation = undefined; - return; - case "TSParameterProperty": - (_node$accessibility = node.accessibility) != null ? _node$accessibility : node.accessibility = undefined; - (_node$decorators2 = node.decorators) != null ? _node$decorators2 : node.decorators = []; - (_node$override = node.override) != null ? _node$override : node.override = false; - (_node$readonly = node.readonly) != null ? _node$readonly : node.readonly = false; - (_node$static = node.static) != null ? _node$static : node.static = false; - return; - case "TSEmptyBodyFunctionExpression": - node.body = null; - case "TSDeclareFunction": - case "FunctionDeclaration": - case "FunctionExpression": - case "ClassMethod": - case "ClassPrivateMethod": - (_node$declare = node.declare) != null ? _node$declare : node.declare = false; - (_node$returnType = node.returnType) != null ? _node$returnType : node.returnType = undefined; - (_node$typeParameters = node.typeParameters) != null ? _node$typeParameters : node.typeParameters = undefined; - return; - case "Property": - (_node$optional2 = node.optional) != null ? _node$optional2 : node.optional = false; - return; - case "TSMethodSignature": - case "TSPropertySignature": - (_node$optional3 = node.optional) != null ? _node$optional3 : node.optional = false; - case "TSIndexSignature": - (_node$accessibility2 = node.accessibility) != null ? _node$accessibility2 : node.accessibility = undefined; - (_node$readonly2 = node.readonly) != null ? _node$readonly2 : node.readonly = false; - (_node$static2 = node.static) != null ? _node$static2 : node.static = false; - return; - case "TSAbstractPropertyDefinition": - case "PropertyDefinition": - case "TSAbstractAccessorProperty": - case "AccessorProperty": - (_node$declare2 = node.declare) != null ? _node$declare2 : node.declare = false; - (_node$definite = node.definite) != null ? _node$definite : node.definite = false; - (_node$readonly3 = node.readonly) != null ? _node$readonly3 : node.readonly = false; - (_node$typeAnnotation2 = node.typeAnnotation) != null ? _node$typeAnnotation2 : node.typeAnnotation = undefined; - case "TSAbstractMethodDefinition": - case "MethodDefinition": - (_node$accessibility3 = node.accessibility) != null ? _node$accessibility3 : node.accessibility = undefined; - (_node$decorators3 = node.decorators) != null ? _node$decorators3 : node.decorators = []; - (_node$override2 = node.override) != null ? _node$override2 : node.override = false; - (_node$optional4 = node.optional) != null ? _node$optional4 : node.optional = false; - return; - case "ClassExpression": - (_node$id = node.id) != null ? _node$id : node.id = null; - case "ClassDeclaration": - (_node$abstract = node.abstract) != null ? _node$abstract : node.abstract = false; - (_node$declare3 = node.declare) != null ? _node$declare3 : node.declare = false; - (_node$decorators4 = node.decorators) != null ? _node$decorators4 : node.decorators = []; - (_node$implements = node.implements) != null ? _node$implements : node.implements = []; - (_node$superTypeArgume = node.superTypeArguments) != null ? _node$superTypeArgume : node.superTypeArguments = undefined; - (_node$typeParameters2 = node.typeParameters) != null ? _node$typeParameters2 : node.typeParameters = undefined; - return; - case "TSTypeAliasDeclaration": - case "VariableDeclaration": - (_node$declare4 = node.declare) != null ? _node$declare4 : node.declare = false; - return; - case "VariableDeclarator": - (_node$definite2 = node.definite) != null ? _node$definite2 : node.definite = false; - return; - case "TSEnumDeclaration": - (_node$const = node.const) != null ? _node$const : node.const = false; - (_node$declare5 = node.declare) != null ? _node$declare5 : node.declare = false; - return; - case "TSEnumMember": - (_node$computed = node.computed) != null ? _node$computed : node.computed = false; - return; - case "TSImportType": - (_node$qualifier = node.qualifier) != null ? _node$qualifier : node.qualifier = null; - (_node$options = node.options) != null ? _node$options : node.options = null; - return; - case "TSInterfaceDeclaration": - (_node$declare6 = node.declare) != null ? _node$declare6 : node.declare = false; - (_node$extends = node.extends) != null ? _node$extends : node.extends = []; - return; - case "TSModuleDeclaration": - (_node$declare7 = node.declare) != null ? _node$declare7 : node.declare = false; - (_node$global = node.global) != null ? _node$global : node.global = node.kind === "global"; - return; - case "TSTypeParameter": - (_node$const2 = node.const) != null ? _node$const2 : node.const = false; - (_node$in = node.in) != null ? _node$in : node.in = false; - (_node$out = node.out) != null ? _node$out : node.out = false; - return; - } - } }; function isPossiblyLiteralEnum(expression) { if (expression.type !== "MemberExpression") return false; @@ -10400,13 +9919,13 @@ const PlaceholderErrors = ParseErrorEnum`placeholders`({ }); var placeholders = superClass => class PlaceholdersParserMixin extends superClass { parsePlaceholder(expectedNode) { - if (this.match(133)) { + if (this.match(144)) { const node = this.startNode(); this.next(); this.assertNoSpace(); node.name = super.parseIdentifier(true); this.assertNoSpace(); - this.expect(133); + this.expect(144); return this.finishPlaceholder(node, expectedNode); } } @@ -10420,7 +9939,7 @@ var placeholders = superClass => class PlaceholdersParserMixin extends superClas } getTokenFromCode(code) { if (code === 37 && this.input.charCodeAt(this.state.pos + 1) === 37) { - this.finishOp(133, 2); + this.finishOp(144, 2); } else { super.getTokenFromCode(code); } @@ -10436,19 +9955,6 @@ var placeholders = superClass => class PlaceholdersParserMixin extends superClas super.checkReservedWord(word, startLoc, checkKeywords, isBinding); } } - cloneIdentifier(node) { - const cloned = super.cloneIdentifier(node); - if (cloned.type === "Placeholder") { - cloned.expectedNode = node.expectedNode; - } - return cloned; - } - cloneStringLiteral(node) { - if (node.type === "Placeholder") { - return this.cloneIdentifier(node); - } - return super.cloneStringLiteral(node); - } parseBindingAtom() { return this.parsePlaceholder("Pattern") || super.parseBindingAtom(); } @@ -10466,8 +9972,8 @@ var placeholders = superClass => class PlaceholdersParserMixin extends superClas if (super.chStartsBindingIdentifier(ch, pos)) { return true; } - const next = this.nextTokenStart(); - if (this.input.charCodeAt(next) === 37 && this.input.charCodeAt(next + 1) === 37) { + const nextToken = this.lookahead(); + if (nextToken.type === 144) { return true; } return false; @@ -10505,7 +10011,7 @@ var placeholders = superClass => class PlaceholdersParserMixin extends superClas const oldStrict = this.state.strict; const placeholder = this.parsePlaceholder("Identifier"); if (placeholder) { - if (this.match(81) || this.match(133) || this.match(5)) { + if (this.match(81) || this.match(144) || this.match(5)) { node.id = placeholder; } else if (optionalId || !isStatement) { node.id = null; @@ -10541,7 +10047,7 @@ var placeholders = superClass => class PlaceholdersParserMixin extends superClas if (this.match(65)) { const next = this.nextTokenStart(); if (this.isUnparsedContextual(next, "from")) { - if (this.input.startsWith(tokenLabelName(133), this.nextTokenStartSince(next + 4))) { + if (this.input.startsWith(tokenLabelName(144), this.nextTokenStartSince(next + 4))) { return true; } } @@ -10590,7 +10096,7 @@ var placeholders = superClass => class PlaceholdersParserMixin extends superClas return this.parsePlaceholder("StringLiteral") || super.parseImportSource(); } assertNoSpace() { - if (this.state.start > this.offsetToSourcePos(this.state.lastTokEndLoc.index)) { + if (this.state.start > this.state.lastTokEndLoc.index) { this.raise(PlaceholderErrors.UnexpectedSpace, this.state.lastTokEndLoc); } } @@ -10604,7 +10110,7 @@ var v8intrinsic = superClass => class V8IntrinsicMixin extends superClass { if (tokenIsIdentifier(this.state.type)) { const name = this.parseIdentifierName(); const identifier = this.createIdentifier(node, name); - this.castNodeTo(identifier, "V8IntrinsicIdentifier"); + identifier.type = "V8IntrinsicIdentifier"; if (this.match(10)) { return identifier; } @@ -10639,12 +10145,13 @@ function validatePlugins(pluginsMap) { throw new Error("Cannot combine placeholders and v8intrinsic plugins."); } if (pluginsMap.has("pipelineOperator")) { - var _pluginsMap$get2; + var _pluginsMap$get; const proposal = pluginsMap.get("pipelineOperator").proposal; if (!PIPELINE_PROPOSALS.includes(proposal)) { const proposalList = PIPELINE_PROPOSALS.map(p => `"${p}"`).join(", "); throw new Error(`"pipelineOperator" requires "proposal" option whose value must be one of: ${proposalList}.`); } + const tupleSyntaxIsHash = ((_pluginsMap$get = pluginsMap.get("recordAndTuple")) == null ? void 0 : _pluginsMap$get.syntaxType) === "hash"; if (proposal === "hack") { if (pluginsMap.has("placeholders")) { throw new Error("Cannot combine placeholders plugin and Hack-style pipes."); @@ -10657,20 +10164,17 @@ function validatePlugins(pluginsMap) { const tokenList = TOPIC_TOKENS.map(t => `"${t}"`).join(", "); throw new Error(`"pipelineOperator" in "proposal": "hack" mode also requires a "topicToken" option whose value must be one of: ${tokenList}.`); } - { - var _pluginsMap$get; - if (topicToken === "#" && ((_pluginsMap$get = pluginsMap.get("recordAndTuple")) == null ? void 0 : _pluginsMap$get.syntaxType) === "hash") { - throw new Error(`Plugin conflict between \`["pipelineOperator", { proposal: "hack", topicToken: "#" }]\` and \`${JSON.stringify(["recordAndTuple", pluginsMap.get("recordAndTuple")])}\`.`); - } + if (topicToken === "#" && tupleSyntaxIsHash) { + throw new Error(`Plugin conflict between \`["pipelineOperator", { proposal: "hack", topicToken: "#" }]\` and \`${JSON.stringify(["recordAndTuple", pluginsMap.get("recordAndTuple")])}\`.`); } - } else if (proposal === "smart" && ((_pluginsMap$get2 = pluginsMap.get("recordAndTuple")) == null ? void 0 : _pluginsMap$get2.syntaxType) === "hash") { + } else if (proposal === "smart" && tupleSyntaxIsHash) { throw new Error(`Plugin conflict between \`["pipelineOperator", { proposal: "smart" }]\` and \`${JSON.stringify(["recordAndTuple", pluginsMap.get("recordAndTuple")])}\`.`); } } if (pluginsMap.has("moduleAttributes")) { { - if (pluginsMap.has("deprecatedImportAssert") || pluginsMap.has("importAssertions")) { - throw new Error("Cannot combine importAssertions, deprecatedImportAssert and moduleAttributes plugins."); + if (pluginsMap.has("importAttributes") || pluginsMap.has("importAssertions")) { + throw new Error("Cannot combine importAssertions, importAttributes and moduleAttributes plugins."); } const moduleAttributesVersionPluginOption = pluginsMap.get("moduleAttributes").version; if (moduleAttributesVersionPluginOption !== "may-2020") { @@ -10678,20 +10182,13 @@ function validatePlugins(pluginsMap) { } } } - if (pluginsMap.has("importAssertions")) { - if (pluginsMap.has("deprecatedImportAssert")) { - throw new Error("Cannot combine importAssertions and deprecatedImportAssert plugins."); - } - } - if (!pluginsMap.has("deprecatedImportAssert") && pluginsMap.has("importAttributes") && pluginsMap.get("importAttributes").deprecatedAssertSyntax) { - { - pluginsMap.set("deprecatedImportAssert", {}); - } + if (pluginsMap.has("importAttributes") && pluginsMap.has("importAssertions")) { + throw new Error("Cannot combine importAssertions and importAttributes plugins."); } if (pluginsMap.has("recordAndTuple")) { - { - const syntaxType = pluginsMap.get("recordAndTuple").syntaxType; - if (syntaxType != null) { + const syntaxType = pluginsMap.get("recordAndTuple").syntaxType; + if (syntaxType != null) { + { const RECORD_AND_TUPLE_SYNTAX_TYPES = ["hash", "bar"]; if (!RECORD_AND_TUPLE_SYNTAX_TYPES.includes(syntaxType)) { throw new Error("The 'syntaxType' option of the 'recordAndTuple' plugin must be one of: " + RECORD_AND_TUPLE_SYNTAX_TYPES.map(p => `'${p}'`).join(", ")); @@ -10707,9 +10204,6 @@ function validatePlugins(pluginsMap) { if (pluginsMap.has("optionalChainingAssign") && pluginsMap.get("optionalChainingAssign").version !== "2023-07") { throw new Error("The 'optionalChainingAssign' plugin requires a 'version' option," + " representing the last proposal update. Currently, the" + " only supported value is '2023-07'."); } - if (pluginsMap.has("discardBinding") && pluginsMap.get("discardBinding").syntaxType !== "void") { - throw new Error("The 'discardBinding' plugin requires a 'syntaxType' option. Currently the only supported value is 'void'."); - } } const mixinPlugins = { estree, @@ -10720,19 +10214,54 @@ const mixinPlugins = { placeholders }; const mixinPluginNames = Object.keys(mixinPlugins); +const defaultOptions = { + sourceType: "script", + sourceFilename: undefined, + startColumn: 0, + startLine: 1, + allowAwaitOutsideFunction: false, + allowReturnOutsideFunction: false, + allowNewTargetOutsideFunction: false, + allowImportExportEverywhere: false, + allowSuperOutsideMethod: false, + allowUndeclaredExports: false, + plugins: [], + strictMode: null, + ranges: false, + tokens: false, + createImportExpressions: false, + createParenthesizedExpressions: false, + errorRecovery: false, + attachComment: true, + annexB: true +}; +function getOptions(opts) { + if (opts == null) { + return Object.assign({}, defaultOptions); + } + if (opts.annexB != null && opts.annexB !== false) { + throw new Error("The `annexB` option can only be set to `false`."); + } + const options = {}; + for (const key of Object.keys(defaultOptions)) { + var _opts$key; + options[key] = (_opts$key = opts[key]) != null ? _opts$key : defaultOptions[key]; + } + return options; +} class ExpressionParser extends LValParser { - checkProto(prop, isRecord, sawProto, refExpressionErrors) { + checkProto(prop, isRecord, protoRef, refExpressionErrors) { if (prop.type === "SpreadElement" || this.isObjectMethod(prop) || prop.computed || prop.shorthand) { - return sawProto; + return; } const key = prop.key; const name = key.type === "Identifier" ? key.name : key.value; if (name === "__proto__") { if (isRecord) { this.raise(Errors.RecordNoProto, key); - return true; + return; } - if (sawProto) { + if (protoRef.used) { if (refExpressionErrors) { if (refExpressionErrors.doubleProtoLoc === null) { refExpressionErrors.doubleProtoLoc = key.loc.start; @@ -10741,29 +10270,23 @@ class ExpressionParser extends LValParser { this.raise(Errors.DuplicateProto, key); } } - return true; + protoRef.used = true; } - return sawProto; } shouldExitDescending(expr, potentialArrowAt) { - return expr.type === "ArrowFunctionExpression" && this.offsetToSourcePos(expr.start) === potentialArrowAt; + return expr.type === "ArrowFunctionExpression" && expr.start === potentialArrowAt; } getExpression() { this.enterInitialScopes(); this.nextToken(); - if (this.match(140)) { - throw this.raise(Errors.ParseExpressionEmptyInput, this.state.startLoc); - } const expr = this.parseExpression(); - if (!this.match(140)) { - throw this.raise(Errors.ParseExpressionExpectsEOF, this.state.startLoc, { - unexpected: this.input.codePointAt(this.state.start) - }); + if (!this.match(139)) { + this.unexpected(); } this.finalizeRemainingComments(); expr.comments = this.comments; expr.errors = this.state.errors; - if (this.optionFlags & 256) { + if (this.options.tokens) { expr.tokens = this.tokens; } return expr; @@ -10794,16 +10317,15 @@ class ExpressionParser extends LValParser { parseMaybeAssignAllowIn(refExpressionErrors, afterLeftParse) { return this.allowInAnd(() => this.parseMaybeAssign(refExpressionErrors, afterLeftParse)); } - setOptionalParametersError(refExpressionErrors) { - refExpressionErrors.optionalParametersLoc = this.state.startLoc; + setOptionalParametersError(refExpressionErrors, resultError) { + var _resultError$loc; + refExpressionErrors.optionalParametersLoc = (_resultError$loc = resultError == null ? void 0 : resultError.loc) != null ? _resultError$loc : this.state.startLoc; } parseMaybeAssign(refExpressionErrors, afterLeftParse) { const startLoc = this.state.startLoc; - const isYield = this.isContextual(108); - if (isYield) { + if (this.isContextual(108)) { if (this.prodParam.hasYield) { - this.next(); - let left = this.parseYield(startLoc); + let left = this.parseYield(); if (afterLeftParse) { left = afterLeftParse.call(this, left, startLoc); } @@ -10845,9 +10367,6 @@ class ExpressionParser extends LValParser { this.checkDestructuringPrivate(refExpressionErrors); refExpressionErrors.privateKeyLoc = null; } - if (refExpressionErrors.voidPatternLoc != null && refExpressionErrors.voidPatternLoc.index >= startIndex) { - refExpressionErrors.voidPatternLoc = null; - } } else { node.left = left; } @@ -10858,16 +10377,6 @@ class ExpressionParser extends LValParser { } else if (ownExpressionErrors) { this.checkExpressionErrors(refExpressionErrors, true); } - if (isYield) { - const { - type - } = this.state; - const startsExpr = this.hasPlugin("v8intrinsic") ? tokenCanStartExpression(type) : tokenCanStartExpression(type) && !this.match(54); - if (startsExpr && !this.isAmbiguousPrefixOrIdentifier()) { - this.raiseOverwrite(Errors.YieldNotInGeneratorFunction, startLoc); - return this.parseYield(startLoc); - } - } return left; } parseMaybeConditional(refExpressionErrors) { @@ -10891,7 +10400,7 @@ class ExpressionParser extends LValParser { return expr; } parseMaybeUnaryOrPrivate(refExpressionErrors) { - return this.match(139) ? this.parsePrivateName() : this.parseMaybeUnary(refExpressionErrors); + return this.match(138) ? this.parsePrivateName() : this.parseMaybeUnary(refExpressionErrors); } parseExprOps(refExpressionErrors) { const startLoc = this.state.startLoc; @@ -10959,19 +10468,18 @@ class ExpressionParser extends LValParser { return this.withTopicBindingContext(() => { return this.parseHackPipeBody(); }); + case "smart": + return this.withTopicBindingContext(() => { + if (this.prodParam.hasYield && this.isContextual(108)) { + throw this.raise(Errors.PipeBodyIsTighter, this.state.startLoc); + } + return this.parseSmartPipelineBodyInStyle(this.parseExprOpBaseRightExpr(op, prec), startLoc); + }); case "fsharp": return this.withSoloAwaitPermittingContext(() => { return this.parseFSharpPipelineBody(prec); }); } - if (this.getPluginOption("pipelineOperator", "proposal") === "smart") { - return this.withTopicBindingContext(() => { - if (this.prodParam.hasYield && this.isContextual(108)) { - throw this.raise(Errors.PipeBodyIsTighter, this.state.startLoc); - } - return this.parseSmartPipelineBodyInStyle(this.parseExprOpBaseRightExpr(op, prec), startLoc); - }); - } default: return this.parseExprOpBaseRightExpr(op, prec); } @@ -11044,7 +10552,7 @@ class ExpressionParser extends LValParser { type } = this.state; const startsExpr = this.hasPlugin("v8intrinsic") ? tokenCanStartExpression(type) : tokenCanStartExpression(type) && !this.match(54); - if (startsExpr && !this.isAmbiguousPrefixOrIdentifier()) { + if (startsExpr && !this.isAmbiguousAwait()) { this.raiseOverwrite(Errors.AwaitNotInAsyncContext, startLoc); return this.parseAwait(startLoc); } @@ -11105,7 +10613,8 @@ class ExpressionParser extends LValParser { if (noCalls) { this.raise(Errors.OptionalChainingNoNew, this.state.startLoc); if (this.lookaheadCharCode() === 40) { - return this.stopParseSubscript(base, state); + state.stop = true; + return base; } } state.optionalChainMember = optional = true; @@ -11118,14 +10627,11 @@ class ExpressionParser extends LValParser { if (computed || optional || this.eat(16)) { return this.parseMember(base, startLoc, state, computed, optional); } else { - return this.stopParseSubscript(base, state); + state.stop = true; + return base; } } } - stopParseSubscript(base, state) { - state.stop = true; - return base; - } parseMember(base, startLoc, state, computed, optional) { const node = this.startNodeAt(startLoc); node.object = base; @@ -11133,7 +10639,7 @@ class ExpressionParser extends LValParser { if (computed) { node.property = this.parseExpression(); this.expect(3); - } else if (this.match(139)) { + } else if (this.match(138)) { if (base.type === "Super") { this.raise(Errors.SuperPrivateField, startLoc); } @@ -11176,9 +10682,9 @@ class ExpressionParser extends LValParser { node.optional = optional; } if (optional) { - node.arguments = this.parseCallExpressionArguments(); + node.arguments = this.parseCallExpressionArguments(11); } else { - node.arguments = this.parseCallExpressionArguments(base.type !== "Super", node, refExpressionErrors); + node.arguments = this.parseCallExpressionArguments(11, base.type === "Import", base.type !== "Super", node, refExpressionErrors); } let finishedNode = this.finishCallExpression(node, optionalChainMember); if (maybeAsyncArrow && this.shouldParseAsyncArrow() && !optional) { @@ -11210,12 +10716,26 @@ class ExpressionParser extends LValParser { return this.finishNode(node, "TaggedTemplateExpression"); } atPossibleAsyncArrow(base) { - return base.type === "Identifier" && base.name === "async" && this.state.lastTokEndLoc.index === base.end && !this.canInsertSemicolon() && base.end - base.start === 5 && this.offsetToSourcePos(base.start) === this.state.potentialArrowAt; + return base.type === "Identifier" && base.name === "async" && this.state.lastTokEndLoc.index === base.end && !this.canInsertSemicolon() && base.end - base.start === 5 && base.start === this.state.potentialArrowAt; + } + expectImportAttributesPlugin() { + if (!this.hasPlugin("importAssertions")) { + this.expectPlugin("importAttributes"); + } } finishCallExpression(node, optional) { if (node.callee.type === "Import") { + if (node.arguments.length === 2) { + { + if (!this.hasPlugin("moduleAttributes")) { + this.expectImportAttributesPlugin(); + } + } + } if (node.arguments.length === 0 || node.arguments.length > 2) { - this.raise(Errors.ImportCallArity, node); + this.raise(Errors.ImportCallArity, node, { + maxArgumentCount: this.hasPlugin("importAttributes") || this.hasPlugin("importAssertions") || this.hasPlugin("moduleAttributes") ? 2 : 1 + }); } else { for (const arg of node.arguments) { if (arg.type === "SpreadElement") { @@ -11226,17 +10746,20 @@ class ExpressionParser extends LValParser { } return this.finishNode(node, optional ? "OptionalCallExpression" : "CallExpression"); } - parseCallExpressionArguments(allowPlaceholder, nodeForExtra, refExpressionErrors) { + parseCallExpressionArguments(close, dynamicImport, allowPlaceholder, nodeForExtra, refExpressionErrors) { const elts = []; let first = true; const oldInFSharpPipelineDirectBody = this.state.inFSharpPipelineDirectBody; this.state.inFSharpPipelineDirectBody = false; - while (!this.eat(11)) { + while (!this.eat(close)) { if (first) { first = false; } else { this.expect(12); - if (this.match(11)) { + if (this.match(close)) { + if (dynamicImport && !this.hasPlugin("importAttributes") && !this.hasPlugin("importAssertions") && !this.hasPlugin("moduleAttributes")) { + this.raise(Errors.ImportCallArgumentTrailingComma, this.state.lastTokStartLoc); + } if (nodeForExtra) { this.addTrailingCommaExtraToNode(nodeForExtra); } @@ -11244,7 +10767,7 @@ class ExpressionParser extends LValParser { break; } } - elts.push(this.parseExprListItem(11, false, refExpressionErrors, allowPlaceholder)); + elts.push(this.parseExprListItem(false, refExpressionErrors, allowPlaceholder)); } this.state.inFSharpPipelineDirectBody = oldInFSharpPipelineDirectBody; return elts; @@ -11282,10 +10805,10 @@ class ExpressionParser extends LValParser { node = this.startNode(); this.next(); if (this.match(16)) { - return this.parseImportMetaPropertyOrPhaseCall(node); + return this.parseImportMetaProperty(node); } if (this.match(10)) { - if (this.optionFlags & 512) { + if (this.options.createImportExpressions) { return this.parseImportCall(node); } else { return this.finishNode(node, "Import"); @@ -11308,11 +10831,13 @@ class ExpressionParser extends LValParser { this.readRegexp(); return this.parseRegExpLiteral(this.state.value); } - case 135: + case 134: return this.parseNumericLiteral(this.state.value); - case 136: + case 135: return this.parseBigIntLiteral(this.state.value); - case 134: + case 136: + return this.parseDecimalLiteral(this.state.value); + case 133: return this.parseStringLiteral(this.state.value); case 84: return this.parseNullLiteral(); @@ -11325,10 +10850,20 @@ class ExpressionParser extends LValParser { const canBeArrow = this.state.potentialArrowAt === this.state.start; return this.parseParenAndDistinguishExpression(canBeArrow); } + case 2: + case 1: + { + return this.parseArrayLike(this.state.type === 2 ? 4 : 3, false, true); + } case 0: { return this.parseArrayLike(3, true, false, refExpressionErrors); } + case 6: + case 7: + { + return this.parseObjectLike(this.state.type === 6 ? 9 : 8, false, true); + } case 5: { return this.parseObjectLike(8, false, false, refExpressionErrors); @@ -11356,7 +10891,7 @@ class ExpressionParser extends LValParser { throw this.raise(Errors.UnsupportedBind, callee); } } - case 139: + case 138: { this.raise(Errors.PrivateInExpectedIn, this.state.startLoc, { identifierName: this.state.value @@ -11398,15 +10933,6 @@ class ExpressionParser extends LValParser { break; } default: - { - if (type === 137) { - return this.parseDecimalLiteral(this.state.value); - } else if (type === 2 || type === 1) { - return this.parseArrayLike(this.state.type === 2 ? 4 : 3, false, true); - } else if (type === 6 || type === 7) { - return this.parseObjectLike(this.state.type === 6 ? 9 : 8, false, true); - } - } if (tokenIsIdentifier(type)) { if (this.isContextual(127) && this.lookaheadInLineCharCode() === 123) { return this.parseModuleExpression(); @@ -11465,19 +10991,12 @@ class ExpressionParser extends LValParser { } finishTopicReference(node, startLoc, pipeProposal, tokenType) { if (this.testTopicReferenceConfiguration(pipeProposal, startLoc, tokenType)) { - if (pipeProposal === "hack") { - if (!this.topicReferenceIsAllowedInCurrentContext()) { - this.raise(Errors.PipeTopicUnbound, startLoc); - } - this.registerTopicReference(); - return this.finishNode(node, "TopicReference"); - } else { - if (!this.topicReferenceIsAllowedInCurrentContext()) { - this.raise(Errors.PrimaryTopicNotAllowed, startLoc); - } - this.registerTopicReference(); - return this.finishNode(node, "PipelinePrimaryTopicReference"); + const nodeType = pipeProposal === "smart" ? "PipelinePrimaryTopicReference" : "TopicReference"; + if (!this.topicReferenceIsAllowedInCurrentContext()) { + this.raise(pipeProposal === "smart" ? Errors.PrimaryTopicNotAllowed : Errors.PipeTopicUnbound, startLoc); } + this.registerTopicReference(); + return this.finishNode(node, nodeType); } else { throw this.raise(Errors.PipeTopicUnconfiguredToken, startLoc, { token: tokenLabelName(tokenType) @@ -11530,9 +11049,9 @@ class ExpressionParser extends LValParser { parseSuper() { const node = this.startNode(); this.next(); - if (this.match(10) && !this.scope.allowDirectSuper && !(this.optionFlags & 16)) { + if (this.match(10) && !this.scope.allowDirectSuper && !this.options.allowSuperOutsideMethod) { this.raise(Errors.SuperNotAllowed, node); - } else if (!this.scope.allowSuper && !(this.optionFlags & 16)) { + } else if (!this.scope.allowSuper && !this.options.allowSuperOutsideMethod) { this.raise(Errors.UnexpectedSuper, node); } if (!this.match(10) && !this.match(0) && !this.match(16)) { @@ -11575,28 +11094,32 @@ class ExpressionParser extends LValParser { } return this.finishNode(node, "MetaProperty"); } - parseImportMetaPropertyOrPhaseCall(node) { + parseImportMetaProperty(node) { + const id = this.createIdentifier(this.startNodeAtNode(node), "import"); this.next(); - if (this.isContextual(105) || this.isContextual(97)) { + if (this.isContextual(101)) { + if (!this.inModule) { + this.raise(Errors.ImportMetaOutsideModule, id); + } + this.sawUnambiguousESM = true; + } else if (this.isContextual(105) || this.isContextual(97)) { const isSource = this.isContextual(105); + if (!isSource) this.unexpected(); this.expectPlugin(isSource ? "sourcePhaseImports" : "deferredImportEvaluation"); + if (!this.options.createImportExpressions) { + throw this.raise(Errors.DynamicImportPhaseRequiresImportExpressions, this.state.startLoc, { + phase: this.state.value + }); + } this.next(); node.phase = isSource ? "source" : "defer"; return this.parseImportCall(node); - } else { - const id = this.createIdentifierAt(this.startNodeAtNode(node), "import", this.state.lastTokStartLoc); - if (this.isContextual(101)) { - if (!this.inModule) { - this.raise(Errors.ImportMetaOutsideModule, id); - } - this.sawUnambiguousESM = true; - } - return this.parseMetaProperty(node, id, "meta"); } + return this.parseMetaProperty(node, id, "meta"); } parseLiteralAtNode(value, type, node) { this.addExtra(node, "rawValue", value); - this.addExtra(node, "raw", this.input.slice(this.offsetToSourcePos(node.start), this.state.end)); + this.addExtra(node, "raw", this.input.slice(node.start, this.state.end)); node.value = value; this.next(); return this.finishNode(node, type); @@ -11612,16 +11135,14 @@ class ExpressionParser extends LValParser { return this.parseLiteral(value, "NumericLiteral"); } parseBigIntLiteral(value) { - { - return this.parseLiteral(value, "BigIntLiteral"); - } + return this.parseLiteral(value, "BigIntLiteral"); } parseDecimalLiteral(value) { return this.parseLiteral(value, "DecimalLiteral"); } parseRegExpLiteral(value) { const node = this.startNode(); - this.addExtra(node, "raw", this.input.slice(this.offsetToSourcePos(node.start), this.state.end)); + this.addExtra(node, "raw", this.input.slice(node.start, this.state.end)); node.pattern = value.pattern; node.flags = value.flags; this.next(); @@ -11671,7 +11192,7 @@ class ExpressionParser extends LValParser { break; } } else { - exprList.push(this.parseMaybeAssignAllowInOrVoidPattern(11, refExpressionErrors, this.parseParenItem)); + exprList.push(this.parseMaybeAssignAllowIn(refExpressionErrors, this.parseParenItem)); } } const innerEndLoc = this.state.lastTokEndLoc; @@ -11705,7 +11226,7 @@ class ExpressionParser extends LValParser { return this.wrapParenthesis(startLoc, val); } wrapParenthesis(startLoc, expression) { - if (!(this.optionFlags & 1024)) { + if (!this.options.createParenthesizedExpressions) { this.addExtra(expression, "parenthesized", true); this.addExtra(expression, "parenStart", startLoc.index); this.takeSurroundingComments(expression, startLoc.index, this.state.lastTokEndLoc.index); @@ -11733,7 +11254,7 @@ class ExpressionParser extends LValParser { const meta = this.createIdentifier(this.startNodeAtNode(node), "new"); this.next(); const metaProp = this.parseMetaProperty(node, meta, "target"); - if (!this.scope.allowNewTarget) { + if (!this.scope.inNonArrowFunction && !this.scope.inClass && !this.options.allowNewTargetOutsideFunction) { this.raise(Errors.UnexpectedNewTarget, metaProp); } return metaProp; @@ -11809,7 +11330,7 @@ class ExpressionParser extends LValParser { } const oldInFSharpPipelineDirectBody = this.state.inFSharpPipelineDirectBody; this.state.inFSharpPipelineDirectBody = false; - let sawProto = false; + const propHash = Object.create(null); let first = true; const node = this.startNode(); node.properties = []; @@ -11829,7 +11350,7 @@ class ExpressionParser extends LValParser { prop = this.parseBindingProperty(); } else { prop = this.parsePropertyDefinition(refExpressionErrors); - sawProto = this.checkProto(prop, isRecord, sawProto, refExpressionErrors); + this.checkProto(prop, isRecord, propHash, refExpressionErrors); } if (isRecord && !this.isObjectProperty(prop) && prop.type !== "SpreadElement") { this.raise(Errors.InvalidRecordProperty, prop); @@ -11948,13 +11469,13 @@ class ExpressionParser extends LValParser { parseObjectProperty(prop, startLoc, isPattern, refExpressionErrors) { prop.shorthand = false; if (this.eat(14)) { - prop.value = isPattern ? this.parseMaybeDefault(this.state.startLoc) : this.parseMaybeAssignAllowInOrVoidPattern(8, refExpressionErrors); - return this.finishObjectProperty(prop); + prop.value = isPattern ? this.parseMaybeDefault(this.state.startLoc) : this.parseMaybeAssignAllowIn(refExpressionErrors); + return this.finishNode(prop, "ObjectProperty"); } if (!prop.computed && prop.key.type === "Identifier") { this.checkReservedWord(prop.key.name, prop.key.loc.start, true, false); if (isPattern) { - prop.value = this.parseMaybeDefault(startLoc, this.cloneIdentifier(prop.key)); + prop.value = this.parseMaybeDefault(startLoc, cloneIdentifier(prop.key)); } else if (this.match(29)) { const shorthandAssignLoc = this.state.startLoc; if (refExpressionErrors != null) { @@ -11964,17 +11485,14 @@ class ExpressionParser extends LValParser { } else { this.raise(Errors.InvalidCoverInitializedName, shorthandAssignLoc); } - prop.value = this.parseMaybeDefault(startLoc, this.cloneIdentifier(prop.key)); + prop.value = this.parseMaybeDefault(startLoc, cloneIdentifier(prop.key)); } else { - prop.value = this.cloneIdentifier(prop.key); + prop.value = cloneIdentifier(prop.key); } prop.shorthand = true; - return this.finishObjectProperty(prop); + return this.finishNode(prop, "ObjectProperty"); } } - finishObjectProperty(node) { - return this.finishNode(node, "ObjectProperty"); - } parseObjPropValue(prop, startLoc, isGenerator, isAsync, isPattern, isAccessor, refExpressionErrors) { const node = this.parseObjectMethod(prop, isGenerator, isAsync, isPattern, isAccessor) || this.parseObjectProperty(prop, startLoc, isPattern, refExpressionErrors); if (!node) this.unexpected(); @@ -11995,16 +11513,19 @@ class ExpressionParser extends LValParser { key = this.parseIdentifier(true); } else { switch (type) { - case 135: + case 134: key = this.parseNumericLiteral(value); break; - case 134: + case 133: key = this.parseStringLiteral(value); break; - case 136: + case 135: key = this.parseBigIntLiteral(value); break; - case 139: + case 136: + key = this.parseDecimalLiteral(value); + break; + case 138: { const privateKeyLoc = this.state.startLoc; if (refExpressionErrors != null) { @@ -12018,15 +11539,11 @@ class ExpressionParser extends LValParser { break; } default: - if (type === 137) { - key = this.parseDecimalLiteral(value); - break; - } this.unexpected(); } } prop.key = key; - if (type !== 139) { + if (type !== 138) { prop.computed = false; } } @@ -12039,7 +11556,7 @@ class ExpressionParser extends LValParser { parseMethod(node, isGenerator, isAsync, isConstructor, allowDirectSuper, type, inClassScope = false) { this.initFunction(node, isAsync); node.generator = isGenerator; - this.scope.enter(514 | 16 | (inClassScope ? 576 : 0) | (allowDirectSuper ? 32 : 0)); + this.scope.enter(2 | 16 | (inClassScope ? 64 : 0) | (allowDirectSuper ? 32 : 0)); this.prodParam.enter(functionFlags(isAsync, node.generator)); this.parseFunctionParams(node, isConstructor); const finishedNode = this.parseFunctionBodyAndFinish(node, type, true); @@ -12060,7 +11577,7 @@ class ExpressionParser extends LValParser { return this.finishNode(node, isTuple ? "TupleExpression" : "ArrayExpression"); } parseArrowExpression(node, params, isAsync, trailingCommaLoc) { - this.scope.enter(514 | 4); + this.scope.enter(2 | 4); let flags = functionFlags(isAsync, false); if (!this.match(5) && this.prodParam.hasIn) { flags |= 8; @@ -12148,11 +11665,11 @@ class ExpressionParser extends LValParser { break; } } - elts.push(this.parseExprListItem(close, allowEmpty, refExpressionErrors)); + elts.push(this.parseExprListItem(allowEmpty, refExpressionErrors)); } return elts; } - parseExprListItem(close, allowEmpty, refExpressionErrors, allowPlaceholder) { + parseExprListItem(allowEmpty, refExpressionErrors, allowPlaceholder) { let elt; if (this.match(12)) { if (!allowEmpty) { @@ -12173,7 +11690,7 @@ class ExpressionParser extends LValParser { this.next(); elt = this.finishNode(node, "ArgumentPlaceholder"); } else { - elt = this.parseMaybeAssignAllowInOrVoidPattern(close, refExpressionErrors, this.parseParenItem); + elt = this.parseMaybeAssignAllowIn(refExpressionErrors, this.parseParenItem); } return elt; } @@ -12187,11 +11704,6 @@ class ExpressionParser extends LValParser { node.loc.identifierName = name; return this.finishNode(node, "Identifier"); } - createIdentifierAt(node, name, endLoc) { - node.name = name; - node.loc.identifierName = name; - return this.finishNodeAt(node, "Identifier", endLoc); - } parseIdentifierName(liberal) { let name; const { @@ -12256,7 +11768,7 @@ class ExpressionParser extends LValParser { } } recordAwaitIfAllowed() { - const isAwaitAllowed = this.prodParam.hasAwait; + const isAwaitAllowed = this.prodParam.hasAwait || this.options.allowAwaitOutsideFunction && !this.scope.inFunction; if (isAwaitAllowed && !this.scope.inFunction) { this.state.hasTopLevelAwait = true; } @@ -12268,8 +11780,8 @@ class ExpressionParser extends LValParser { if (this.eat(55)) { this.raise(Errors.ObsoleteAwaitStar, node); } - if (!this.scope.inFunction && !(this.optionFlags & 1)) { - if (this.isAmbiguousPrefixOrIdentifier()) { + if (!this.scope.inFunction && !this.options.allowAwaitOutsideFunction) { + if (this.isAmbiguousAwait()) { this.ambiguousScriptDifferentAst = true; } else { this.sawUnambiguousESM = true; @@ -12280,23 +11792,24 @@ class ExpressionParser extends LValParser { } return this.finishNode(node, "AwaitExpression"); } - isAmbiguousPrefixOrIdentifier() { + isAmbiguousAwait() { if (this.hasPrecedingLineBreak()) return true; const { type } = this.state; - return type === 53 || type === 10 || type === 0 || tokenIsTemplate(type) || type === 102 && !this.state.containsEsc || type === 138 || type === 56 || this.hasPlugin("v8intrinsic") && type === 54; + return type === 53 || type === 10 || type === 0 || tokenIsTemplate(type) || type === 102 && !this.state.containsEsc || type === 137 || type === 56 || this.hasPlugin("v8intrinsic") && type === 54; } - parseYield(startLoc) { - const node = this.startNodeAt(startLoc); + parseYield() { + const node = this.startNode(); this.expressionScope.recordParameterInitializerError(Errors.YieldInParameter, node); + this.next(); let delegating = false; let argument = null; if (!this.hasPrecedingLineBreak()) { delegating = this.eat(55); switch (this.state.type) { case 13: - case 140: + case 139: case 8: case 11: case 3: @@ -12315,21 +11828,14 @@ class ExpressionParser extends LValParser { parseImportCall(node) { this.next(); node.source = this.parseMaybeAssignAllowIn(); - node.options = null; + if (this.hasPlugin("importAttributes") || this.hasPlugin("importAssertions")) { + node.options = null; + } if (this.eat(12)) { + this.expectImportAttributesPlugin(); if (!this.match(11)) { node.options = this.parseMaybeAssignAllowIn(); - if (this.eat(12)) { - this.addTrailingCommaExtraToNode(node.options); - if (!this.match(11)) { - do { - this.parseMaybeAssignAllowIn(); - } while (this.eat(12) && !this.match(11)); - this.raise(Errors.ImportCallArity, node); - } - } - } else { - this.addTrailingCommaExtraToNode(node.source); + this.eat(12); } } this.expect(11); @@ -12475,24 +11981,6 @@ class ExpressionParser extends LValParser { } return this.finishNode(node, "ModuleExpression"); } - parseVoidPattern(refExpressionErrors) { - this.expectPlugin("discardBinding"); - const node = this.startNode(); - if (refExpressionErrors != null) { - refExpressionErrors.voidPatternLoc = this.state.startLoc; - } - this.next(); - return this.finishNode(node, "VoidPattern"); - } - parseMaybeAssignAllowInOrVoidPattern(close, refExpressionErrors, afterLeftParse) { - if (refExpressionErrors != null && this.match(88)) { - const nextCode = this.lookaheadCharCode(); - if (nextCode === 44 || nextCode === (close === 3 ? 93 : close === 8 ? 125 : 41) || nextCode === 61) { - return this.parseMaybeDefault(this.state.startLoc, this.parseVoidPattern(refExpressionErrors)); - } - } - return this.parseMaybeAssignAllowIn(refExpressionErrors, afterLeftParse); - } parsePropertyNamePrefixOperator(prop) {} } const loopLabel = { @@ -12503,7 +11991,7 @@ const loopLabel = { }; const loneSurrogate = /[\uD800-\uDFFF]/u; const keywordRelationalOperator = /in(?:stanceof)?/y; -function babel7CompatTokens(tokens, input, startIndex) { +function babel7CompatTokens(tokens, input) { for (let i = 0; i < tokens.length; i++) { const token = tokens[i]; const { @@ -12511,7 +11999,7 @@ function babel7CompatTokens(tokens, input, startIndex) { } = token; if (typeof type === "number") { { - if (type === 139) { + if (type === 138) { const { loc, start, @@ -12548,7 +12036,7 @@ function babel7CompatTokens(tokens, input, startIndex) { const backquoteEnd = start + 1; const backquoteEndLoc = createPositionWithColumnOffset(loc.start, 1); let startToken; - if (input.charCodeAt(start - startIndex) === 96) { + if (input.charCodeAt(start) === 96) { startToken = new Token({ type: getExportedToken(22), value: "`", @@ -12612,19 +12100,19 @@ function babel7CompatTokens(tokens, input, startIndex) { } class StatementParser extends ExpressionParser { parseTopLevel(file, program) { - file.program = this.parseProgram(program, 140, this.options.sourceType === "module" ? "module" : "script"); + file.program = this.parseProgram(program); file.comments = this.comments; - if (this.optionFlags & 256) { - file.tokens = babel7CompatTokens(this.tokens, this.input, this.startIndex); + if (this.options.tokens) { + file.tokens = babel7CompatTokens(this.tokens, this.input); } return this.finishNode(file, "File"); } - parseProgram(program, end, sourceType) { + parseProgram(program, end = 139, sourceType = this.options.sourceType) { program.sourceType = sourceType; program.interpreter = this.parseInterpreterDirective(); this.parseBlockBody(program, true, true, end); if (this.inModule) { - if (!(this.optionFlags & 64) && this.scope.undefinedExports.size > 0) { + if (!this.options.allowUndeclaredExports && this.scope.undefinedExports.size > 0) { for (const [localName, at] of Array.from(this.scope.undefinedExports)) { this.raise(Errors.ModuleExportUndefined, at, { localName @@ -12634,7 +12122,7 @@ class StatementParser extends ExpressionParser { this.addExtra(program, "topLevelAwait", this.state.hasTopLevelAwait); } let finishedProgram; - if (end === 140) { + if (end === 139) { finishedProgram = this.finishNode(program, "Program"); } else { finishedProgram = this.finishNodeAt(program, "Program", createPositionWithColumnOffset(this.state.startLoc, -1)); @@ -12642,16 +12130,18 @@ class StatementParser extends ExpressionParser { return finishedProgram; } stmtToDirective(stmt) { - const directive = this.castNodeTo(stmt, "Directive"); - const directiveLiteral = this.castNodeTo(stmt.expression, "DirectiveLiteral"); + const directive = stmt; + directive.type = "Directive"; + directive.value = directive.expression; + delete directive.expression; + const directiveLiteral = directive.value; const expressionValue = directiveLiteral.value; - const raw = this.input.slice(this.offsetToSourcePos(directiveLiteral.start), this.offsetToSourcePos(directiveLiteral.end)); + const raw = this.input.slice(directiveLiteral.start, directiveLiteral.end); const val = directiveLiteral.value = raw.slice(1, -1); this.addExtra(directiveLiteral, "raw", raw); this.addExtra(directiveLiteral, "rawValue", val); this.addExtra(directiveLiteral, "expressionValue", expressionValue); - directive.value = directiveLiteral; - delete stmt.expression; + directiveLiteral.type = "DirectiveLiteral"; return directive; } parseInterpreterDirective() { @@ -12669,45 +12159,6 @@ class StatementParser extends ExpressionParser { } return this.hasFollowingBindingAtom(); } - isUsing() { - if (!this.isContextual(107)) { - return false; - } - const next = this.nextTokenInLineStart(); - const nextCh = this.codePointAtPos(next); - return this.chStartsBindingIdentifier(nextCh, next); - } - isForUsing() { - if (!this.isContextual(107)) { - return false; - } - const next = this.nextTokenInLineStart(); - const nextCh = this.codePointAtPos(next); - if (this.isUnparsedContextual(next, "of")) { - const nextCharAfterOf = this.lookaheadCharCodeSince(next + 2); - if (nextCharAfterOf !== 61 && nextCharAfterOf !== 58 && nextCharAfterOf !== 59) { - return false; - } - } - if (this.chStartsBindingIdentifier(nextCh, next) || this.isUnparsedContextual(next, "void")) { - return true; - } - return false; - } - isAwaitUsing() { - if (!this.isContextual(96)) { - return false; - } - let next = this.nextTokenInLineStart(); - if (this.isUnparsedContextual(next, "using")) { - next = this.nextTokenInLineStartSince(next + 5); - const nextCh = this.codePointAtPos(next); - if (this.chStartsBindingIdentifier(nextCh, next)) { - return true; - } - } - return false; - } chStartsBindingIdentifier(ch, pos) { if (isIdentifierStart(ch)) { keywordRelationalOperator.lastIndex = pos; @@ -12737,8 +12188,29 @@ class StatementParser extends ExpressionParser { const nextCh = this.codePointAtPos(next); return nextCh === 123 || this.chStartsBindingIdentifier(nextCh, next); } - allowsUsing() { - return (this.scope.inModule || !this.scope.inTopLevel) && !this.scope.inBareCaseStatement; + startsUsingForOf() { + const { + type, + containsEsc + } = this.lookahead(); + if (type === 102 && !containsEsc) { + return false; + } else if (tokenIsIdentifier(type) && !this.hasFollowingLineBreak()) { + this.expectPlugin("explicitResourceManagement"); + return true; + } + } + startsAwaitUsing() { + let next = this.nextTokenInLineStart(); + if (this.isUnparsedContextual(next, "using")) { + next = this.nextTokenInLineStartSince(next + 5); + const nextCh = this.codePointAtPos(next); + if (this.chStartsBindingIdentifier(nextCh, next)) { + this.expectPlugin("explicitResourceManagement"); + return true; + } + } + return false; } parseModuleItem() { return this.parseStatementLike(1 | 2 | 4 | 8); @@ -12803,13 +12275,11 @@ class StatementParser extends ExpressionParser { case 73: return this.parseTryStatement(node); case 96: - if (this.isAwaitUsing()) { - if (!this.allowsUsing()) { - this.raise(Errors.UnexpectedUsingDeclaration, node); + if (!this.state.containsEsc && this.startsAwaitUsing()) { + if (!this.recordAwaitIfAllowed()) { + this.raise(Errors.AwaitUsingNotInAsyncContext, node); } else if (!allowDeclaration) { this.raise(Errors.UnexpectedLexicalDeclaration, node); - } else if (!this.recordAwaitIfAllowed()) { - this.raise(Errors.AwaitUsingNotInAsyncContext, node); } this.next(); return this.parseVarStatement(node, "await using"); @@ -12819,7 +12289,8 @@ class StatementParser extends ExpressionParser { if (this.state.containsEsc || !this.hasInLineFollowingBindingIdentifierOrBrace()) { break; } - if (!this.allowsUsing()) { + this.expectPlugin("explicitResourceManagement"); + if (!this.scope.inModule && this.scope.inTopLevel) { this.raise(Errors.UnexpectedUsingDeclaration, this.state.startLoc); } else if (!allowDeclaration) { this.raise(Errors.UnexpectedLexicalDeclaration, this.state.startLoc); @@ -12867,15 +12338,21 @@ class StatementParser extends ExpressionParser { } case 82: { - if (!(this.optionFlags & 8) && !topLevel) { + if (!this.options.allowImportExportEverywhere && !topLevel) { this.raise(Errors.UnexpectedImportExport, this.state.startLoc); } this.next(); let result; if (startType === 83) { result = this.parseImport(node); + if (result.type === "ImportDeclaration" && (!result.importKind || result.importKind === "value")) { + this.sawUnambiguousESM = true; + } } else { result = this.parseExport(node, decorators); + if (result.type === "ExportNamedDeclaration" && (!result.exportKind || result.exportKind === "value") || result.type === "ExportAllDeclaration" && (!result.exportKind || result.exportKind === "value") || result.type === "ExportDefaultDeclaration") { + this.sawUnambiguousESM = true; + } } this.assertModuleNodeAllowed(result); return result; @@ -12900,7 +12377,7 @@ class StatementParser extends ExpressionParser { } } assertModuleNodeAllowed(node) { - if (!(this.optionFlags & 8) && !this.inModule) { + if (!this.options.allowImportExportEverywhere && !this.inModule) { this.raise(Errors.ImportOutsideModule, node); } } @@ -12910,8 +12387,7 @@ class StatementParser extends ExpressionParser { } maybeTakeDecorators(maybeDecorators, classNode, exportNode) { if (maybeDecorators) { - var _classNode$decorators; - if ((_classNode$decorators = classNode.decorators) != null && _classNode$decorators.length) { + if (classNode.decorators && classNode.decorators.length > 0) { if (typeof this.getPluginOption("decorators", "decoratorsBeforeExport") !== "boolean") { this.raise(Errors.DecoratorsBeforeAfterExport, classNode.decorators[0]); } @@ -12958,7 +12434,7 @@ class StatementParser extends ExpressionParser { this.expect(11); expr = this.wrapParenthesis(startLoc, expr); const paramsStartLoc = this.state.startLoc; - node.expression = this.parseMaybeDecoratorArguments(expr, startLoc); + node.expression = this.parseMaybeDecoratorArguments(expr); if (this.getPluginOption("decorators", "allowCallParenthesized") === false && node.expression !== expr) { this.raise(Errors.DecoratorArgumentsOutsideParentheses, paramsStartLoc); } @@ -12967,7 +12443,7 @@ class StatementParser extends ExpressionParser { while (this.eat(16)) { const node = this.startNodeAt(startLoc); node.object = expr; - if (this.match(139)) { + if (this.match(138)) { this.classScope.usePrivateName(this.state.value, this.state.startLoc); node.property = this.parsePrivateName(); } else { @@ -12976,18 +12452,18 @@ class StatementParser extends ExpressionParser { node.computed = false; expr = this.finishNode(node, "MemberExpression"); } - node.expression = this.parseMaybeDecoratorArguments(expr, startLoc); + node.expression = this.parseMaybeDecoratorArguments(expr); } } else { node.expression = this.parseExprSubscripts(); } return this.finishNode(node, "Decorator"); } - parseMaybeDecoratorArguments(expr, startLoc) { + parseMaybeDecoratorArguments(expr) { if (this.eat(10)) { - const node = this.startNodeAt(startLoc); + const node = this.startNodeAtNode(expr); node.callee = expr; - node.arguments = this.parseCallExpressionArguments(); + node.arguments = this.parseCallExpressionArguments(11, false); this.toReferencedList(node.arguments); return this.finishNode(node, "CallExpression"); } @@ -13061,8 +12537,8 @@ class StatementParser extends ExpressionParser { } const startsWithLet = this.isContextual(100); { - const startsWithAwaitUsing = this.isAwaitUsing(); - const starsWithUsingDeclaration = startsWithAwaitUsing || this.isForUsing(); + const startsWithAwaitUsing = this.isContextual(96) && this.startsAwaitUsing(); + const starsWithUsingDeclaration = startsWithAwaitUsing || this.isContextual(107) && this.startsUsingForOf(); const isLetOrUsing = startsWithLet && this.hasFollowingBindingAtom() || starsWithUsingDeclaration; if (this.match(74) || this.match(75) || isLetOrUsing) { const initNode = this.startNode(); @@ -13132,7 +12608,7 @@ class StatementParser extends ExpressionParser { return this.finishNode(node, "IfStatement"); } parseReturnStatement(node) { - if (!this.prodParam.hasReturn) { + if (!this.prodParam.hasReturn && !this.options.allowReturnOutsideFunction) { this.raise(Errors.IllegalReturn, this.state.startLoc); } this.next(); @@ -13150,7 +12626,7 @@ class StatementParser extends ExpressionParser { const cases = node.cases = []; this.expect(5); this.state.labels.push(switchLabel); - this.scope.enter(256); + this.scope.enter(0); let cur; for (let sawDefault; !this.match(8);) { if (this.match(61) || this.match(65)) { @@ -13264,7 +12740,7 @@ class StatementParser extends ExpressionParser { for (let i = this.state.labels.length - 1; i >= 0; i--) { const label = this.state.labels[i]; if (label.statementStart === node.start) { - label.statementStart = this.sourceToOffsetPos(this.state.start); + label.statementStart = this.state.start; label.kind = kind; } else { break; @@ -13273,7 +12749,7 @@ class StatementParser extends ExpressionParser { this.state.labels.push({ name: maybeName, kind: kind, - statementStart: this.sourceToOffsetPos(this.state.start) + statementStart: this.state.start }); node.body = flags & 8 ? this.parseStatementOrSloppyAnnexBFunctionDeclaration(true) : this.parseStatement(); this.state.labels.pop(); @@ -13404,10 +12880,6 @@ class StatementParser extends ExpressionParser { if (id.type === "ArrayPattern" || id.type === "ObjectPattern") { this.raise(Errors.UsingDeclarationHasBindingPattern, id.loc.start); } - } else { - if (id.type === "VoidPattern") { - this.raise(Errors.UnexpectedVoidPattern, id.loc.start); - } } this.checkLVal(id, { type: "VariableDeclarator" @@ -13435,7 +12907,7 @@ class StatementParser extends ExpressionParser { } const oldMaybeInArrowParameters = this.state.maybeInArrowParameters; this.state.maybeInArrowParameters = false; - this.scope.enter(514); + this.scope.enter(2); this.prodParam.enter(functionFlags(isAsync, node.generator)); if (!isDeclaration) { node.id = this.parseFunctionId(); @@ -13574,9 +13046,8 @@ class StatementParser extends ExpressionParser { this.parsePropertyNamePrefixOperator(member); if (this.eat(55)) { method.kind = "method"; - const isPrivateName = this.match(139); + const isPrivateName = this.match(138); this.parseClassElementName(method); - this.parsePostMemberNameModifiers(method); if (isPrivateName) { this.pushClassPrivateMethod(classBody, privateMethod, true, false); return; @@ -13626,7 +13097,7 @@ class StatementParser extends ExpressionParser { this.unexpected(maybeQuestionTokenStartLoc); } method.kind = "method"; - const isPrivate = this.match(139); + const isPrivate = this.match(138); this.parseClassElementName(method); this.parsePostMemberNameModifiers(publicMember); if (isPrivate) { @@ -13640,7 +13111,7 @@ class StatementParser extends ExpressionParser { } else if ((maybeContextualKw === "get" || maybeContextualKw === "set") && !(this.match(55) && this.isLineTerminator())) { this.resetPreviousNodeTrailingComments(key); method.kind = maybeContextualKw; - const isPrivate = this.match(139); + const isPrivate = this.match(138); this.parseClassElementName(publicMethod); if (isPrivate) { this.pushClassPrivateMethod(classBody, privateMethod, false, false); @@ -13654,7 +13125,7 @@ class StatementParser extends ExpressionParser { } else if (maybeContextualKw === "accessor" && !this.isLineTerminator()) { this.expectPlugin("decoratorAutoAccessors"); this.resetPreviousNodeTrailingComments(key); - const isPrivate = this.match(139); + const isPrivate = this.match(138); this.parseClassElementName(publicProp); this.pushClassAccessorProperty(classBody, accessorProp, isPrivate); } else if (this.isLineTerminator()) { @@ -13672,10 +13143,10 @@ class StatementParser extends ExpressionParser { type, value } = this.state; - if ((type === 132 || type === 134) && member.static && value === "prototype") { + if ((type === 132 || type === 133) && member.static && value === "prototype") { this.raise(Errors.StaticPrototype, this.state.startLoc); } - if (type === 139) { + if (type === 138) { if (value === "constructor") { this.raise(Errors.ConstructorClassPrivateField, this.state.startLoc); } @@ -13688,7 +13159,7 @@ class StatementParser extends ExpressionParser { } parseClassStaticBlock(classBody, member) { var _member$decorators; - this.scope.enter(576 | 128 | 16); + this.scope.enter(64 | 128 | 16); const oldLabels = this.state.labels; this.state.labels = []; this.prodParam.enter(0); @@ -13752,7 +13223,7 @@ class StatementParser extends ExpressionParser { return this.finishNode(node, "ClassAccessorProperty"); } parseInitializer(node) { - this.scope.enter(576 | 16); + this.scope.enter(64 | 16); this.expressionScope.enter(newExpressionScope()); this.prodParam.enter(0); node.value = this.eat(29) ? this.parseMaybeAssignAllowIn() : null; @@ -13791,7 +13262,6 @@ class StatementParser extends ExpressionParser { throw this.raise(Errors.UnsupportedDecoratorExport, node); } this.parseExportFrom(node, true); - this.sawUnambiguousESM = true; return this.finishNode(node, "ExportAllDeclaration"); } const hasSpecifiers = this.maybeParseExportNamedSpecifiers(node); @@ -13820,7 +13290,6 @@ class StatementParser extends ExpressionParser { } else if (decorators) { throw this.raise(Errors.UnsupportedDecoratorExport, node); } - this.sawUnambiguousESM = true; return this.finishNode(node2, "ExportNamedDeclaration"); } if (this.eat(65)) { @@ -13833,7 +13302,6 @@ class StatementParser extends ExpressionParser { throw this.raise(Errors.UnsupportedDecoratorExport, node); } this.checkExport(node2, true, true); - this.sawUnambiguousESM = true; return this.finishNode(node2, "ExportDefaultDeclaration"); } this.unexpected(null, 5); @@ -13871,12 +13339,10 @@ class StatementParser extends ExpressionParser { const isTypeExport = node2.exportKind === "type"; node2.specifiers.push(...this.parseExportSpecifiers(isTypeExport)); node2.source = null; + node2.declaration = null; if (this.hasPlugin("importAssertions")) { node2.assertions = []; - } else { - node2.attributes = []; } - node2.declaration = null; return true; } return false; @@ -13887,8 +13353,6 @@ class StatementParser extends ExpressionParser { node.source = null; if (this.hasPlugin("importAssertions")) { node.assertions = []; - } else { - node.attributes = []; } node.declaration = this.parseExportDeclaration(node); return true; @@ -13919,7 +13383,7 @@ class StatementParser extends ExpressionParser { } return this.parseClass(this.maybeTakeDecorators(this.parseDecorators(false), this.startNode()), true, true); } - if (this.match(75) || this.match(74) || this.isLet() || this.isUsing() || this.isAwaitUsing()) { + if (this.match(75) || this.match(74) || this.isLet()) { throw this.raise(Errors.UnsupportedDefaultExport, this.state.startLoc); } const res = this.parseMaybeAssignAllowIn(); @@ -13942,9 +13406,10 @@ class StatementParser extends ExpressionParser { return false; } if ((type === 130 || type === 129) && !this.state.containsEsc) { - const next = this.nextTokenStart(); - const nextChar = this.input.charCodeAt(next); - if (nextChar === 123 || this.chStartsBindingIdentifier(nextChar, next) && !this.input.startsWith("from", next)) { + const { + type: nextType + } = this.lookahead(); + if (tokenIsIdentifier(nextType) && nextType !== 98 || nextType === 5) { this.expectOnePlugin(["flow", "typescript"]); return false; } @@ -13987,11 +13452,11 @@ class StatementParser extends ExpressionParser { return true; } } - if (this.isUsing()) { + if (this.isContextual(107)) { this.raise(Errors.UsingDeclarationExport, this.state.startLoc); return true; } - if (this.isAwaitUsing()) { + if (this.isContextual(96) && this.startsAwaitUsing()) { this.raise(Errors.UsingDeclarationExport, this.state.startLoc); return true; } @@ -14092,7 +13557,7 @@ class StatementParser extends ExpressionParser { if (this.eat(8)) break; } const isMaybeTypeOnly = this.isContextual(130); - const isString = this.match(134); + const isString = this.match(133); const node = this.startNode(); node.local = this.parseModuleExportName(); nodes.push(this.parseExportSpecifier(node, isString, isInTypeExport, isMaybeTypeOnly)); @@ -14103,14 +13568,14 @@ class StatementParser extends ExpressionParser { if (this.eatContextual(93)) { node.exported = this.parseModuleExportName(); } else if (isString) { - node.exported = this.cloneStringLiteral(node.local); + node.exported = cloneStringLiteral(node.local); } else if (!node.exported) { - node.exported = this.cloneIdentifier(node.local); + node.exported = cloneIdentifier(node.local); } return this.finishNode(node, "ExportSpecifier"); } parseModuleExportName() { - if (this.match(134)) { + if (this.match(133)) { const result = this.parseStringLiteral(this.state.value); const surrogate = loneSurrogate.exec(result.value); if (surrogate) { @@ -14208,18 +13673,18 @@ class StatementParser extends ExpressionParser { this.applyImportPhase(node, isExport, null); return null; } - const phaseIdentifier = this.startNode(); - const phaseIdentifierName = this.parseIdentifierName(true); + const phaseIdentifier = this.parseIdentifier(true); const { type } = this.state; const isImportPhase = tokenIsKeywordOrIdentifier(type) ? type !== 98 || this.lookaheadCharCode() === 102 : type !== 12; if (isImportPhase) { - this.applyImportPhase(node, isExport, phaseIdentifierName, phaseIdentifier.loc.start); + this.resetPreviousIdentifierLeadingComments(phaseIdentifier); + this.applyImportPhase(node, isExport, phaseIdentifier.name, phaseIdentifier.loc.start); return null; } else { this.applyImportPhase(node, isExport, null); - return this.createIdentifier(phaseIdentifier, phaseIdentifierName); + return phaseIdentifier; } } isPrecedingIdImportPhase(phase) { @@ -14229,7 +13694,7 @@ class StatementParser extends ExpressionParser { return tokenIsIdentifier(type) ? type !== 98 || this.lookaheadCharCode() === 102 : type !== 12; } parseImport(node) { - if (this.match(134)) { + if (this.match(133)) { return this.parseImportSourceAndAttributes(node); } return this.parseImportSpecifiersAndAfter(node, this.parseMaybeImportPhase(node, false)); @@ -14251,11 +13716,10 @@ class StatementParser extends ExpressionParser { this.checkImportReflection(node); this.checkJSONModuleImport(node); this.semicolon(); - this.sawUnambiguousESM = true; return this.finishNode(node, "ImportDeclaration"); } parseImportSource() { - if (!this.match(134)) this.unexpected(); + if (!this.match(133)) this.unexpected(); return this.parseExprAtom(); } parseImportSpecifierLocal(node, specifier, type) { @@ -14284,13 +13748,13 @@ class StatementParser extends ExpressionParser { }); } attrNames.add(keyName); - if (this.match(134)) { + if (this.match(133)) { node.key = this.parseStringLiteral(keyName); } else { node.key = this.parseIdentifier(true); } this.expect(14); - if (!this.match(134)) { + if (!this.match(133)) { throw this.raise(Errors.ModuleAttributeInvalidValue, this.state.startLoc); } node.value = this.parseStringLiteral(this.state.value); @@ -14315,7 +13779,7 @@ class StatementParser extends ExpressionParser { } attributes.add(node.key.name); this.expect(14); - if (!this.match(134)) { + if (!this.match(133)) { throw this.raise(Errors.ModuleAttributeInvalidValue, this.state.startLoc); } node.value = this.parseStringLiteral(this.state.value); @@ -14325,34 +13789,38 @@ class StatementParser extends ExpressionParser { } maybeParseImportAttributes(node) { let attributes; - { - var useWith = false; - } + let useWith = false; if (this.match(76)) { if (this.hasPrecedingLineBreak() && this.lookaheadCharCode() === 40) { return; } this.next(); - if (this.hasPlugin("moduleAttributes")) { - attributes = this.parseModuleAttributes(); - this.addExtra(node, "deprecatedWithLegacySyntax", true); - } else { - attributes = this.parseImportAttributes(); - } { - useWith = true; + if (this.hasPlugin("moduleAttributes")) { + attributes = this.parseModuleAttributes(); + } else { + this.expectImportAttributesPlugin(); + attributes = this.parseImportAttributes(); + } } + useWith = true; } else if (this.isContextual(94) && !this.hasPrecedingLineBreak()) { - if (!this.hasPlugin("deprecatedImportAssert") && !this.hasPlugin("importAssertions")) { - this.raise(Errors.ImportAttributesUseAssert, this.state.startLoc); - } - if (!this.hasPlugin("importAssertions")) { + if (this.hasPlugin("importAttributes")) { + if (this.getPluginOption("importAttributes", "deprecatedAssertSyntax") !== true) { + this.raise(Errors.ImportAttributesUseAssert, this.state.startLoc); + } this.addExtra(node, "deprecatedAssertSyntax", true); + } else { + this.expectOnePlugin(["importAttributes", "importAssertions"]); } this.next(); attributes = this.parseImportAttributes(); - } else { + } else if (this.hasPlugin("importAttributes") || this.hasPlugin("importAssertions")) { attributes = []; + } else { + if (this.hasPlugin("moduleAttributes")) { + attributes = []; + } else return; } if (!useWith && this.hasPlugin("importAssertions")) { node.assertions = attributes; @@ -14396,7 +13864,7 @@ class StatementParser extends ExpressionParser { if (this.eat(8)) break; } const specifier = this.startNode(); - const importedIsString = this.match(134); + const importedIsString = this.match(133); const isMaybeTypeOnly = this.isContextual(130); specifier.imported = this.parseModuleExportName(); const importSpecifier = this.parseImportSpecifier(specifier, importedIsString, node.importKind === "type" || node.importKind === "typeof", isMaybeTypeOnly, undefined); @@ -14417,7 +13885,7 @@ class StatementParser extends ExpressionParser { } this.checkReservedWord(imported.name, specifier.loc.start, true, true); if (!specifier.local) { - specifier.local = this.cloneIdentifier(imported); + specifier.local = cloneIdentifier(imported); } } return this.finishImportSpecifier(specifier, "ImportSpecifier", bindingType); @@ -14434,51 +13902,6 @@ class Parser extends StatementParser { this.initializeScopes(); this.plugins = pluginsMap; this.filename = options.sourceFilename; - this.startIndex = options.startIndex; - let optionFlags = 0; - if (options.allowAwaitOutsideFunction) { - optionFlags |= 1; - } - if (options.allowReturnOutsideFunction) { - optionFlags |= 2; - } - if (options.allowImportExportEverywhere) { - optionFlags |= 8; - } - if (options.allowSuperOutsideMethod) { - optionFlags |= 16; - } - if (options.allowUndeclaredExports) { - optionFlags |= 64; - } - if (options.allowNewTargetOutsideFunction) { - optionFlags |= 4; - } - if (options.allowYieldOutsideFunction) { - optionFlags |= 32; - } - if (options.ranges) { - optionFlags |= 128; - } - if (options.tokens) { - optionFlags |= 256; - } - if (options.createImportExpressions) { - optionFlags |= 512; - } - if (options.createParenthesizedExpressions) { - optionFlags |= 1024; - } - if (options.errorRecovery) { - optionFlags |= 2048; - } - if (options.attachComment) { - optionFlags |= 4096; - } - if (options.annexB) { - optionFlags |= 8192; - } - this.optionFlags = optionFlags; } getScopeHandler() { return ScopeHandler; diff --git a/node_modules/@babel/parser/lib/index.js.map b/node_modules/@babel/parser/lib/index.js.map index dd2f4b37..3cdfa3df 100644 --- a/node_modules/@babel/parser/lib/index.js.map +++ b/node_modules/@babel/parser/lib/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sources":["../src/util/location.ts","../src/parse-error/module-errors.ts","../src/parse-error/to-node-description.ts","../src/parse-error/standard-errors.ts","../src/parse-error/strict-mode-errors.ts","../src/parse-error/parse-expression-errors.ts","../src/parse-error/pipeline-operator-errors.ts","../src/parse-error.ts","../src/options.ts","../src/plugins/estree.ts","../src/tokenizer/context.ts","../src/tokenizer/types.ts","../../babel-helper-validator-identifier/src/identifier.ts","../../babel-helper-validator-identifier/src/keyword.ts","../src/util/identifier.ts","../src/util/scope.ts","../src/plugins/flow/scope.ts","../src/plugins/flow/index.ts","../src/plugins/jsx/xhtml.ts","../src/util/whitespace.ts","../src/plugins/jsx/index.ts","../src/plugins/typescript/scope.ts","../src/util/production-parameter.ts","../src/parser/base.ts","../src/parser/comments.ts","../src/tokenizer/state.ts","../../babel-helper-string-parser/src/index.ts","../src/tokenizer/index.ts","../src/util/class-scope.ts","../src/util/expression-scope.ts","../src/parser/util.ts","../src/parser/node.ts","../src/parser/lval.ts","../src/plugins/typescript/index.ts","../src/plugins/placeholders.ts","../src/plugins/v8intrinsic.ts","../src/plugin-utils.ts","../src/parser/expression.ts","../src/parser/statement.ts","../src/parser/index.ts","../src/index.ts"],"sourcesContent":["export type Pos = {\n start: number;\n};\n\n// These are used when `options.locations` is on, for the\n// `startLoc` and `endLoc` properties.\n\nexport class Position {\n line: number;\n column: number;\n index: number;\n\n constructor(line: number, col: number, index: number) {\n this.line = line;\n this.column = col;\n this.index = index;\n }\n}\n\nexport class SourceLocation {\n start: Position;\n end: Position;\n filename: string;\n identifierName: string | undefined | null;\n\n constructor(start: Position, end?: Position) {\n this.start = start;\n // (may start as null, but initialized later)\n this.end = end;\n }\n}\n\n/**\n * creates a new position with a non-zero column offset from the given position.\n * This function should be only be used when we create AST node out of the token\n * boundaries, such as TemplateElement ends before tt.templateNonTail. This\n * function does not skip whitespaces.\n */\nexport function createPositionWithColumnOffset(\n position: Position,\n columnOffset: number,\n) {\n const { line, column, index } = position;\n return new Position(line, column + columnOffset, index + columnOffset);\n}\n","import type { ParseErrorTemplates } from \"../parse-error.ts\";\n\nconst code = \"BABEL_PARSER_SOURCETYPE_MODULE_REQUIRED\";\n\nexport default {\n ImportMetaOutsideModule: {\n message: `import.meta may appear only with 'sourceType: \"module\"'`,\n code,\n },\n ImportOutsideModule: {\n message: `'import' and 'export' may appear only with 'sourceType: \"module\"'`,\n code,\n },\n} satisfies ParseErrorTemplates;\n","const NodeDescriptions = {\n ArrayPattern: \"array destructuring pattern\",\n AssignmentExpression: \"assignment expression\",\n AssignmentPattern: \"assignment expression\",\n ArrowFunctionExpression: \"arrow function expression\",\n ConditionalExpression: \"conditional expression\",\n CatchClause: \"catch clause\",\n ForOfStatement: \"for-of statement\",\n ForInStatement: \"for-in statement\",\n ForStatement: \"for-loop\",\n FormalParameters: \"function parameter list\",\n Identifier: \"identifier\",\n ImportSpecifier: \"import specifier\",\n ImportDefaultSpecifier: \"import default specifier\",\n ImportNamespaceSpecifier: \"import namespace specifier\",\n ObjectPattern: \"object destructuring pattern\",\n ParenthesizedExpression: \"parenthesized expression\",\n RestElement: \"rest element\",\n UpdateExpression: {\n true: \"prefix operation\",\n false: \"postfix operation\",\n },\n VariableDeclarator: \"variable declaration\",\n YieldExpression: \"yield expression\",\n};\n\ntype NodeTypesWithDescriptions = keyof Omit<\n typeof NodeDescriptions,\n \"UpdateExpression\"\n>;\n\ntype NodeWithDescription =\n | {\n type: \"UpdateExpression\";\n prefix: boolean;\n }\n | {\n type: NodeTypesWithDescriptions;\n };\n\nconst toNodeDescription = (node: NodeWithDescription) =>\n node.type === \"UpdateExpression\"\n ? NodeDescriptions.UpdateExpression[`${node.prefix}`]\n : NodeDescriptions[node.type];\n\nexport default toNodeDescription;\n","import type { ParseErrorTemplates } from \"../parse-error.ts\";\nimport toNodeDescription from \"./to-node-description.ts\";\n\nexport type LValAncestor =\n | { type: \"UpdateExpression\"; prefix: boolean }\n | {\n type:\n | \"ArrayPattern\"\n | \"AssignmentExpression\"\n | \"CatchClause\"\n | \"ForOfStatement\"\n | \"FormalParameters\"\n | \"ForInStatement\"\n | \"ForStatement\"\n | \"ImportSpecifier\"\n | \"ImportNamespaceSpecifier\"\n | \"ImportDefaultSpecifier\"\n | \"ParenthesizedExpression\"\n | \"ObjectPattern\"\n | \"RestElement\"\n | \"VariableDeclarator\";\n };\n\nexport default {\n AccessorIsGenerator: ({ kind }: { kind: \"get\" | \"set\" }) =>\n `A ${kind}ter cannot be a generator.`,\n ArgumentsInClass:\n \"'arguments' is only allowed in functions and class methods.\",\n AsyncFunctionInSingleStatementContext:\n \"Async functions can only be declared at the top level or inside a block.\",\n AwaitBindingIdentifier:\n \"Can not use 'await' as identifier inside an async function.\",\n AwaitBindingIdentifierInStaticBlock:\n \"Can not use 'await' as identifier inside a static block.\",\n AwaitExpressionFormalParameter:\n \"'await' is not allowed in async function parameters.\",\n AwaitUsingNotInAsyncContext:\n \"'await using' is only allowed within async functions and at the top levels of modules.\",\n AwaitNotInAsyncContext:\n \"'await' is only allowed within async functions and at the top levels of modules.\",\n BadGetterArity: \"A 'get' accessor must not have any formal parameters.\",\n BadSetterArity: \"A 'set' accessor must have exactly one formal parameter.\",\n BadSetterRestParameter:\n \"A 'set' accessor function argument must not be a rest parameter.\",\n ConstructorClassField: \"Classes may not have a field named 'constructor'.\",\n ConstructorClassPrivateField:\n \"Classes may not have a private field named '#constructor'.\",\n ConstructorIsAccessor: \"Class constructor may not be an accessor.\",\n ConstructorIsAsync: \"Constructor can't be an async function.\",\n ConstructorIsGenerator: \"Constructor can't be a generator.\",\n DeclarationMissingInitializer: ({\n kind,\n }: {\n kind: \"await using\" | \"const\" | \"destructuring\" | \"using\";\n }) => `Missing initializer in ${kind} declaration.`,\n DecoratorArgumentsOutsideParentheses:\n \"Decorator arguments must be moved inside parentheses: use '@(decorator(args))' instead of '@(decorator)(args)'.\",\n DecoratorBeforeExport:\n \"Decorators must be placed *before* the 'export' keyword. Remove the 'decoratorsBeforeExport: true' option to use the 'export @decorator class {}' syntax.\",\n DecoratorsBeforeAfterExport:\n \"Decorators can be placed *either* before or after the 'export' keyword, but not in both locations at the same time.\",\n DecoratorConstructor:\n \"Decorators can't be used with a constructor. Did you mean '@dec class { ... }'?\",\n DecoratorExportClass:\n \"Decorators must be placed *after* the 'export' keyword. Remove the 'decoratorsBeforeExport: false' option to use the '@decorator export class {}' syntax.\",\n DecoratorSemicolon: \"Decorators must not be followed by a semicolon.\",\n DecoratorStaticBlock: \"Decorators can't be used with a static block.\",\n DeferImportRequiresNamespace:\n 'Only `import defer * as x from \"./module\"` is valid.',\n DeletePrivateField: \"Deleting a private field is not allowed.\",\n DestructureNamedImport:\n \"ES2015 named imports do not destructure. Use another statement for destructuring after the import.\",\n DuplicateConstructor: \"Duplicate constructor in the same class.\",\n DuplicateDefaultExport: \"Only one default export allowed per module.\",\n DuplicateExport: ({ exportName }: { exportName: string }) =>\n `\\`${exportName}\\` has already been exported. Exported identifiers must be unique.`,\n DuplicateProto: \"Redefinition of __proto__ property.\",\n DuplicateRegExpFlags: \"Duplicate regular expression flag.\",\n ElementAfterRest: \"Rest element must be last element.\",\n EscapedCharNotAnIdentifier: \"Invalid Unicode escape.\",\n ExportBindingIsString: ({\n localName,\n exportName,\n }: {\n localName: string;\n exportName: string;\n }) =>\n `A string literal cannot be used as an exported binding without \\`from\\`.\\n- Did you mean \\`export { '${localName}' as '${exportName}' } from 'some-module'\\`?`,\n ExportDefaultFromAsIdentifier:\n \"'from' is not allowed as an identifier after 'export default'.\",\n\n ForInOfLoopInitializer: ({\n type,\n }: {\n type: \"ForInStatement\" | \"ForOfStatement\";\n }) =>\n `'${\n type === \"ForInStatement\" ? \"for-in\" : \"for-of\"\n }' loop variable declaration may not have an initializer.`,\n ForInUsing: \"For-in loop may not start with 'using' declaration.\",\n\n ForOfAsync: \"The left-hand side of a for-of loop may not be 'async'.\",\n ForOfLet: \"The left-hand side of a for-of loop may not start with 'let'.\",\n GeneratorInSingleStatementContext:\n \"Generators can only be declared at the top level or inside a block.\",\n\n IllegalBreakContinue: ({\n type,\n }: {\n type: \"BreakStatement\" | \"ContinueStatement\";\n }) => `Unsyntactic ${type === \"BreakStatement\" ? \"break\" : \"continue\"}.`,\n\n IllegalLanguageModeDirective:\n \"Illegal 'use strict' directive in function with non-simple parameter list.\",\n IllegalReturn: \"'return' outside of function.\",\n ImportAttributesUseAssert:\n \"The `assert` keyword in import attributes is deprecated and it has been replaced by the `with` keyword. You can enable the `deprecatedImportAssert` parser plugin to suppress this error.\",\n ImportBindingIsString: ({ importName }: { importName: string }) =>\n `A string literal cannot be used as an imported binding.\\n- Did you mean \\`import { \"${importName}\" as foo }\\`?`,\n ImportCallArity: `\\`import()\\` requires exactly one or two arguments.`,\n ImportCallNotNewExpression: \"Cannot use new with import(...).\",\n ImportCallSpreadArgument: \"`...` is not allowed in `import()`.\",\n ImportJSONBindingNotDefault:\n \"A JSON module can only be imported with `default`.\",\n ImportReflectionHasAssertion: \"`import module x` cannot have assertions.\",\n ImportReflectionNotBinding:\n 'Only `import module x from \"./module\"` is valid.',\n IncompatibleRegExpUVFlags:\n \"The 'u' and 'v' regular expression flags cannot be enabled at the same time.\",\n InvalidBigIntLiteral: \"Invalid BigIntLiteral.\",\n InvalidCodePoint: \"Code point out of bounds.\",\n InvalidCoverDiscardElement:\n \"'void' must be followed by an expression when not used in a binding position.\",\n InvalidCoverInitializedName: \"Invalid shorthand property initializer.\",\n InvalidDecimal: \"Invalid decimal.\",\n InvalidDigit: ({ radix }: { radix: number }) =>\n `Expected number in radix ${radix}.`,\n InvalidEscapeSequence: \"Bad character escape sequence.\",\n InvalidEscapeSequenceTemplate: \"Invalid escape sequence in template.\",\n InvalidEscapedReservedWord: ({ reservedWord }: { reservedWord: string }) =>\n `Escape sequence in keyword ${reservedWord}.`,\n InvalidIdentifier: ({ identifierName }: { identifierName: string }) =>\n `Invalid identifier ${identifierName}.`,\n InvalidLhs: ({ ancestor }: { ancestor: LValAncestor }) =>\n `Invalid left-hand side in ${toNodeDescription(ancestor)}.`,\n InvalidLhsBinding: ({ ancestor }: { ancestor: LValAncestor }) =>\n `Binding invalid left-hand side in ${toNodeDescription(ancestor)}.`,\n InvalidLhsOptionalChaining: ({ ancestor }: { ancestor: LValAncestor }) =>\n `Invalid optional chaining in the left-hand side of ${toNodeDescription(\n ancestor,\n )}.`,\n InvalidNumber: \"Invalid number.\",\n InvalidOrMissingExponent:\n \"Floating-point numbers require a valid exponent after the 'e'.\",\n InvalidOrUnexpectedToken: ({ unexpected }: { unexpected: string }) =>\n `Unexpected character '${unexpected}'.`,\n InvalidParenthesizedAssignment: \"Invalid parenthesized assignment pattern.\",\n InvalidPrivateFieldResolution: ({\n identifierName,\n }: {\n identifierName: string;\n }) => `Private name #${identifierName} is not defined.`,\n InvalidPropertyBindingPattern: \"Binding member expression.\",\n InvalidRecordProperty:\n \"Only properties and spread elements are allowed in record definitions.\",\n InvalidRestAssignmentPattern: \"Invalid rest operator's argument.\",\n LabelRedeclaration: ({ labelName }: { labelName: string }) =>\n `Label '${labelName}' is already declared.`,\n LetInLexicalBinding: \"'let' is disallowed as a lexically bound name.\",\n LineTerminatorBeforeArrow: \"No line break is allowed before '=>'.\",\n MalformedRegExpFlags: \"Invalid regular expression flag.\",\n MissingClassName: \"A class name is required.\",\n MissingEqInAssignment:\n \"Only '=' operator can be used for specifying default value.\",\n MissingSemicolon: \"Missing semicolon.\",\n MissingPlugin: ({ missingPlugin }: { missingPlugin: [string] }) =>\n `This experimental syntax requires enabling the parser plugin: ${missingPlugin\n .map(name => JSON.stringify(name))\n .join(\", \")}.`,\n // FIXME: Would be nice to make this \"missingPlugins\" instead.\n // Also, seems like we can drop the \"(s)\" from the message and just make it \"s\".\n MissingOneOfPlugins: ({ missingPlugin }: { missingPlugin: string[] }) =>\n `This experimental syntax requires enabling one of the following parser plugin(s): ${missingPlugin\n .map(name => JSON.stringify(name))\n .join(\", \")}.`,\n MissingUnicodeEscape: \"Expecting Unicode escape sequence \\\\uXXXX.\",\n MixingCoalesceWithLogical:\n \"Nullish coalescing operator(??) requires parens when mixing with logical operators.\",\n ModuleAttributeDifferentFromType:\n \"The only accepted module attribute is `type`.\",\n ModuleAttributeInvalidValue:\n \"Only string literals are allowed as module attribute values.\",\n ModuleAttributesWithDuplicateKeys: ({ key }: { key: string }) =>\n `Duplicate key \"${key}\" is not allowed in module attributes.`,\n ModuleExportNameHasLoneSurrogate: ({\n surrogateCharCode,\n }: {\n surrogateCharCode: number;\n }) =>\n `An export name cannot include a lone surrogate, found '\\\\u${surrogateCharCode.toString(\n 16,\n )}'.`,\n ModuleExportUndefined: ({ localName }: { localName: string }) =>\n `Export '${localName}' is not defined.`,\n MultipleDefaultsInSwitch: \"Multiple default clauses.\",\n NewlineAfterThrow: \"Illegal newline after throw.\",\n NoCatchOrFinally: \"Missing catch or finally clause.\",\n NumberIdentifier: \"Identifier directly after number.\",\n NumericSeparatorInEscapeSequence:\n \"Numeric separators are not allowed inside unicode escape sequences or hex escape sequences.\",\n ObsoleteAwaitStar:\n \"'await*' has been removed from the async functions proposal. Use Promise.all() instead.\",\n OptionalChainingNoNew:\n \"Constructors in/after an Optional Chain are not allowed.\",\n OptionalChainingNoTemplate:\n \"Tagged Template Literals are not allowed in optionalChain.\",\n OverrideOnConstructor:\n \"'override' modifier cannot appear on a constructor declaration.\",\n ParamDupe: \"Argument name clash.\",\n PatternHasAccessor: \"Object pattern can't contain getter or setter.\",\n PatternHasMethod: \"Object pattern can't contain methods.\",\n PrivateInExpectedIn: ({ identifierName }: { identifierName: string }) =>\n `Private names are only allowed in property accesses (\\`obj.#${identifierName}\\`) or in \\`in\\` expressions (\\`#${identifierName} in obj\\`).`,\n PrivateNameRedeclaration: ({ identifierName }: { identifierName: string }) =>\n `Duplicate private name #${identifierName}.`,\n RecordExpressionBarIncorrectEndSyntaxType:\n \"Record expressions ending with '|}' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'bar'.\",\n RecordExpressionBarIncorrectStartSyntaxType:\n \"Record expressions starting with '{|' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'bar'.\",\n RecordExpressionHashIncorrectStartSyntaxType:\n \"Record expressions starting with '#{' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'hash'.\",\n RecordNoProto: \"'__proto__' is not allowed in Record expressions.\",\n RestTrailingComma: \"Unexpected trailing comma after rest element.\",\n SloppyFunction:\n \"In non-strict mode code, functions can only be declared at top level or inside a block.\",\n SloppyFunctionAnnexB:\n \"In non-strict mode code, functions can only be declared at top level, inside a block, or as the body of an if statement.\",\n SourcePhaseImportRequiresDefault:\n 'Only `import source x from \"./module\"` is valid.',\n StaticPrototype: \"Classes may not have static property named prototype.\",\n SuperNotAllowed:\n \"`super()` is only valid inside a class constructor of a subclass. Maybe a typo in the method name ('constructor') or not extending another class?\",\n SuperPrivateField: \"Private fields can't be accessed on super.\",\n TrailingDecorator: \"Decorators must be attached to a class element.\",\n TupleExpressionBarIncorrectEndSyntaxType:\n \"Tuple expressions ending with '|]' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'bar'.\",\n TupleExpressionBarIncorrectStartSyntaxType:\n \"Tuple expressions starting with '[|' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'bar'.\",\n TupleExpressionHashIncorrectStartSyntaxType:\n \"Tuple expressions starting with '#[' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'hash'.\",\n UnexpectedArgumentPlaceholder: \"Unexpected argument placeholder.\",\n UnexpectedAwaitAfterPipelineBody:\n 'Unexpected \"await\" after pipeline body; await must have parentheses in minimal proposal.',\n UnexpectedDigitAfterHash: \"Unexpected digit after hash token.\",\n UnexpectedImportExport:\n \"'import' and 'export' may only appear at the top level.\",\n UnexpectedKeyword: ({ keyword }: { keyword: string }) =>\n `Unexpected keyword '${keyword}'.`,\n UnexpectedLeadingDecorator:\n \"Leading decorators must be attached to a class declaration.\",\n UnexpectedLexicalDeclaration:\n \"Lexical declaration cannot appear in a single-statement context.\",\n UnexpectedNewTarget:\n \"`new.target` can only be used in functions or class properties.\",\n UnexpectedNumericSeparator:\n \"A numeric separator is only allowed between two digits.\",\n UnexpectedPrivateField: \"Unexpected private name.\",\n UnexpectedReservedWord: ({ reservedWord }: { reservedWord: string }) =>\n `Unexpected reserved word '${reservedWord}'.`,\n UnexpectedSuper: \"'super' is only allowed in object methods and classes.\",\n UnexpectedToken: ({\n expected,\n unexpected,\n }: {\n expected?: string | null;\n unexpected?: string | null;\n }) =>\n `Unexpected token${unexpected ? ` '${unexpected}'.` : \"\"}${\n expected ? `, expected \"${expected}\"` : \"\"\n }`,\n UnexpectedTokenUnaryExponentiation:\n \"Illegal expression. Wrap left hand side or entire exponentiation in parentheses.\",\n UnexpectedUsingDeclaration:\n \"Using declaration cannot appear in the top level when source type is `script` or in the bare case statement.\",\n UnexpectedVoidPattern: \"Unexpected void binding.\",\n UnsupportedBind: \"Binding should be performed on object property.\",\n UnsupportedDecoratorExport:\n \"A decorated export must export a class declaration.\",\n UnsupportedDefaultExport:\n \"Only expressions, functions or classes are allowed as the `default` export.\",\n UnsupportedImport:\n \"`import` can only be used in `import()` or `import.meta`.\",\n UnsupportedMetaProperty: ({\n target,\n onlyValidPropertyName,\n }: {\n target: string;\n onlyValidPropertyName: string;\n }) =>\n `The only valid meta property for ${target} is ${target}.${onlyValidPropertyName}.`,\n UnsupportedParameterDecorator:\n \"Decorators cannot be used to decorate parameters.\",\n UnsupportedPropertyDecorator:\n \"Decorators cannot be used to decorate object literal properties.\",\n UnsupportedSuper:\n \"'super' can only be used with function calls (i.e. super()) or in property accesses (i.e. super.prop or super[prop]).\",\n UnterminatedComment: \"Unterminated comment.\",\n UnterminatedRegExp: \"Unterminated regular expression.\",\n UnterminatedString: \"Unterminated string constant.\",\n UnterminatedTemplate: \"Unterminated template.\",\n UsingDeclarationExport: \"Using declaration cannot be exported.\",\n UsingDeclarationHasBindingPattern:\n \"Using declaration cannot have destructuring patterns.\",\n VarRedeclaration: ({ identifierName }: { identifierName: string }) =>\n `Identifier '${identifierName}' has already been declared.`,\n VoidPatternCatchClauseParam:\n \"A void binding can not be the catch clause parameter. Use `try { ... } catch { ... }` if you want to discard the caught error.\",\n VoidPatternInitializer: \"A void binding may not have an initializer.\",\n YieldBindingIdentifier:\n \"Can not use 'yield' as identifier inside a generator.\",\n YieldInParameter: \"Yield expression is not allowed in formal parameters.\",\n YieldNotInGeneratorFunction:\n \"'yield' is only allowed within generator functions.\",\n ZeroDigitNumericSeparator:\n \"Numeric separator can not be used after leading 0.\",\n} satisfies ParseErrorTemplates;\n","import type { ParseErrorTemplates } from \"../parse-error\";\n\nexport default {\n StrictDelete: \"Deleting local variable in strict mode.\",\n\n // `referenceName` is the StringValue[1] of an IdentifierReference[2], which\n // is represented as just an `Identifier`[3] in the Babel AST.\n // 1. https://tc39.es/ecma262/#sec-static-semantics-stringvalue\n // 2. https://tc39.es/ecma262/#prod-IdentifierReference\n // 3. https://github.com/babel/babel/blob/main/packages/babel-parser/ast/spec.md#identifier\n StrictEvalArguments: ({ referenceName }: { referenceName: string }) =>\n `Assigning to '${referenceName}' in strict mode.`,\n\n // `bindingName` is the StringValue[1] of a BindingIdentifier[2], which is\n // represented as just an `Identifier`[3] in the Babel AST.\n // 1. https://tc39.es/ecma262/#sec-static-semantics-stringvalue\n // 2. https://tc39.es/ecma262/#prod-BindingIdentifier\n // 3. https://github.com/babel/babel/blob/main/packages/babel-parser/ast/spec.md#identifier\n StrictEvalArgumentsBinding: ({ bindingName }: { bindingName: string }) =>\n `Binding '${bindingName}' in strict mode.`,\n\n StrictFunction:\n \"In strict mode code, functions can only be declared at top level or inside a block.\",\n\n StrictNumericEscape: \"The only valid numeric escape in strict mode is '\\\\0'.\",\n\n StrictOctalLiteral: \"Legacy octal literals are not allowed in strict mode.\",\n\n StrictWith: \"'with' in strict mode.\",\n} satisfies ParseErrorTemplates;\n","import type { ParseErrorTemplates } from \"../parse-error.ts\";\n\nexport default {\n ParseExpressionEmptyInput:\n \"Unexpected parseExpression() input: The input is empty or contains only comments.\",\n ParseExpressionExpectsEOF: ({ unexpected }: { unexpected: number }) =>\n `Unexpected parseExpression() input: The input should contain exactly one expression, but the first expression is followed by the unexpected character \\`${String.fromCodePoint(unexpected)}\\`.`,\n} satisfies ParseErrorTemplates;\n","import type { ParseErrorTemplates } from \"../parse-error.ts\";\nimport toNodeDescription from \"./to-node-description.ts\";\n\nexport const UnparenthesizedPipeBodyDescriptions = new Set([\n \"ArrowFunctionExpression\",\n \"AssignmentExpression\",\n \"ConditionalExpression\",\n \"YieldExpression\",\n] as const);\n\ntype GetSetMemberType> =\n T extends Set ? M : unknown;\n\nexport type UnparenthesizedPipeBodyTypes = GetSetMemberType<\n typeof UnparenthesizedPipeBodyDescriptions\n>;\n\nexport default {\n // This error is only used by the smart-mix proposal\n PipeBodyIsTighter:\n \"Unexpected yield after pipeline body; any yield expression acting as Hack-style pipe body must be parenthesized due to its loose operator precedence.\",\n PipeTopicRequiresHackPipes: process.env.BABEL_8_BREAKING\n ? 'Topic references are only supported when using the `\"proposal\": \"hack\"` version of the pipeline proposal.'\n : 'Topic reference is used, but the pipelineOperator plugin was not passed a \"proposal\": \"hack\" or \"smart\" option.',\n PipeTopicUnbound:\n \"Topic reference is unbound; it must be inside a pipe body.\",\n PipeTopicUnconfiguredToken: ({ token }: { token: string }) =>\n `Invalid topic token ${token}. In order to use ${token} as a topic reference, the pipelineOperator plugin must be configured with { \"proposal\": \"hack\", \"topicToken\": \"${token}\" }.`,\n PipeTopicUnused:\n \"Hack-style pipe body does not contain a topic reference; Hack-style pipes must use topic at least once.\",\n PipeUnparenthesizedBody: ({ type }: { type: UnparenthesizedPipeBodyTypes }) =>\n `Hack-style pipe body cannot be an unparenthesized ${toNodeDescription({\n type,\n })}; please wrap it in parentheses.`,\n\n ...(process.env.BABEL_8_BREAKING\n ? {}\n : {\n // Messages whose codes start with “Pipeline” or “PrimaryTopic”\n // are retained for backwards compatibility\n // with the deprecated smart-mix pipe operator proposal plugin.\n // They are subject to removal in a future major version.\n PipelineBodyNoArrow:\n 'Unexpected arrow \"=>\" after pipeline body; arrow function in pipeline body must be parenthesized.',\n PipelineBodySequenceExpression:\n \"Pipeline body may not be a comma-separated sequence expression.\",\n PipelineHeadSequenceExpression:\n \"Pipeline head should not be a comma-separated sequence expression.\",\n PipelineTopicUnused:\n \"Pipeline is in topic style but does not use topic reference.\",\n PrimaryTopicNotAllowed:\n \"Topic reference was used in a lexical context without topic binding.\",\n PrimaryTopicRequiresSmartPipeline:\n 'Topic reference is used, but the pipelineOperator plugin was not passed a \"proposal\": \"hack\" or \"smart\" option.',\n }),\n} satisfies ParseErrorTemplates;\n","import { Position } from \"./util/location.ts\";\n\ntype SyntaxPlugin =\n | \"flow\"\n | \"typescript\"\n | \"jsx\"\n | \"pipelineOperator\"\n | \"placeholders\";\n\ntype ParseErrorCode =\n | \"BABEL_PARSER_SYNTAX_ERROR\"\n | \"BABEL_PARSER_SOURCETYPE_MODULE_REQUIRED\";\n\n// Babel uses \"normal\" SyntaxErrors for it's errors, but adds some extra\n// functionality. This functionality is defined in the\n// `ParseErrorSpecification` interface below. We may choose to change to someday\n// give our errors their own full-blown class, but until then this allow us to\n// keep all the desirable properties of SyntaxErrors (like their name in stack\n// traces, etc.), and also allows us to punt on any publicly facing\n// class-hierarchy decisions until Babel 8.\ninterface ParseErrorSpecification {\n // Look, these *could* be readonly, but then Flow complains when we initially\n // set them. We could do a whole dance and make a special interface that's not\n // readonly for when we create the error, then cast it to the readonly\n // interface for public use, but the previous implementation didn't have them\n // as readonly, so let's just not worry about it for now.\n code: ParseErrorCode;\n reasonCode: string;\n syntaxPlugin?: SyntaxPlugin;\n missingPlugin?: string | string[];\n loc: Position;\n details: ErrorDetails;\n\n // We should consider removing this as it now just contains the same\n // information as `loc.index`.\n pos: number;\n}\n\nexport type ParseError = SyntaxError &\n ParseErrorSpecification;\n\n// By `ParseErrorConstructor`, we mean something like the new-less style\n// `ErrorConstructor`[1], since `ParseError`'s are not themselves actually\n// separate classes from `SyntaxError`'s.\n//\n// 1. https://github.com/microsoft/TypeScript/blob/v4.5.5/lib/lib.es5.d.ts#L1027\nexport type ParseErrorConstructor = (\n loc: Position,\n details: ErrorDetails,\n) => ParseError;\n\ntype ToMessage = (self: ErrorDetails) => string;\n\ntype ParseErrorCredentials = {\n code: string;\n reasonCode: string;\n syntaxPlugin?: SyntaxPlugin;\n toMessage: ToMessage;\n};\n\nfunction defineHidden(obj: object, key: string, value: unknown) {\n Object.defineProperty(obj, key, {\n enumerable: false,\n configurable: true,\n value,\n });\n}\n\nfunction toParseErrorConstructor({\n toMessage,\n code,\n reasonCode,\n syntaxPlugin,\n}: ParseErrorCredentials): ParseErrorConstructor {\n const hasMissingPlugin =\n reasonCode === \"MissingPlugin\" || reasonCode === \"MissingOneOfPlugins\";\n\n if (!process.env.BABEL_8_BREAKING) {\n const oldReasonCodes: Record = {\n AccessorCannotDeclareThisParameter: \"AccesorCannotDeclareThisParameter\",\n AccessorCannotHaveTypeParameters: \"AccesorCannotHaveTypeParameters\",\n ConstInitializerMustBeStringOrNumericLiteralOrLiteralEnumReference:\n \"ConstInitiailizerMustBeStringOrNumericLiteralOrLiteralEnumReference\",\n SetAccessorCannotHaveOptionalParameter:\n \"SetAccesorCannotHaveOptionalParameter\",\n SetAccessorCannotHaveRestParameter: \"SetAccesorCannotHaveRestParameter\",\n SetAccessorCannotHaveReturnType: \"SetAccesorCannotHaveReturnType\",\n };\n if (oldReasonCodes[reasonCode]) {\n reasonCode = oldReasonCodes[reasonCode];\n }\n }\n\n return function constructor(loc: Position, details: ErrorDetails) {\n const error: ParseError = new SyntaxError() as any;\n\n error.code = code as ParseErrorCode;\n error.reasonCode = reasonCode;\n error.loc = loc;\n error.pos = loc.index;\n\n error.syntaxPlugin = syntaxPlugin;\n if (hasMissingPlugin) {\n error.missingPlugin = (details as any).missingPlugin;\n }\n\n type Overrides = {\n loc?: Position;\n details?: ErrorDetails;\n };\n defineHidden(error, \"clone\", function clone(overrides: Overrides = {}) {\n const { line, column, index } = overrides.loc ?? loc;\n return constructor(new Position(line, column, index), {\n ...details,\n ...overrides.details,\n });\n });\n\n defineHidden(error, \"details\", details);\n\n Object.defineProperty(error, \"message\", {\n configurable: true,\n get(this: ParseError): string {\n const message = `${toMessage(details)} (${loc.line}:${loc.column})`;\n this.message = message;\n return message;\n },\n set(value: string) {\n Object.defineProperty(this, \"message\", { value, writable: true });\n },\n });\n\n return error;\n };\n}\n\ntype ParseErrorTemplate =\n | string\n | ToMessage\n | { message: string | ToMessage; code?: ParseErrorCode };\n\nexport type ParseErrorTemplates = { [reasonCode: string]: ParseErrorTemplate };\n\n// This is the templated form of `ParseErrorEnum`.\n//\n// Note: We could factor out the return type calculation into something like\n// `ParseErrorConstructor`, and then we could\n// reuse it in the non-templated form of `ParseErrorEnum`, but TypeScript\n// doesn't seem to drill down that far when showing you the computed type of\n// an object in an editor, so we'll leave it inlined for now.\nexport function ParseErrorEnum(a: TemplateStringsArray): <\n T extends ParseErrorTemplates,\n>(\n parseErrorTemplates: T,\n) => {\n [K in keyof T]: ParseErrorConstructor<\n T[K] extends { message: string | ToMessage }\n ? T[K][\"message\"] extends ToMessage\n ? Parameters[0]\n : object\n : T[K] extends ToMessage\n ? Parameters[0]\n : object\n >;\n};\n\nexport function ParseErrorEnum(\n parseErrorTemplates: T,\n syntaxPlugin?: SyntaxPlugin,\n): {\n [K in keyof T]: ParseErrorConstructor<\n T[K] extends { message: string | ToMessage }\n ? T[K][\"message\"] extends ToMessage\n ? Parameters[0]\n : object\n : T[K] extends ToMessage\n ? Parameters[0]\n : object\n >;\n};\n\n// You call `ParseErrorEnum` with a mapping from `ReasonCode`'s to either:\n//\n// 1. a static error message,\n// 2. `toMessage` functions that define additional necessary `details` needed by\n// the `ParseError`, or\n// 3. Objects that contain a `message` of one of the above and overridden `code`\n// and/or `reasonCode`:\n//\n// ParseErrorEnum `optionalSyntaxPlugin` ({\n// ErrorWithStaticMessage: \"message\",\n// ErrorWithDynamicMessage: ({ type } : { type: string }) => `${type}`),\n// ErrorWithOverriddenCodeAndOrReasonCode: {\n// message: ({ type }: { type: string }) => `${type}`),\n// code: \"AN_ERROR_CODE\",\n// ...(BABEL_8_BREAKING ? { } : { reasonCode: \"CustomErrorReasonCode\" })\n// }\n// });\n//\nexport function ParseErrorEnum(\n argument: TemplateStringsArray | ParseErrorTemplates,\n syntaxPlugin?: SyntaxPlugin,\n) {\n // If the first parameter is an array, that means we were called with a tagged\n // template literal. Extract the syntaxPlugin from this, and call again in\n // the \"normalized\" form.\n if (Array.isArray(argument)) {\n return (parseErrorTemplates: ParseErrorTemplates) =>\n ParseErrorEnum(parseErrorTemplates, argument[0]);\n }\n\n const ParseErrorConstructors = {} as Record<\n string,\n ParseErrorConstructor\n >;\n\n for (const reasonCode of Object.keys(argument)) {\n const template = (argument as ParseErrorTemplates)[reasonCode];\n const { message, ...rest } =\n typeof template === \"string\"\n ? { message: () => template }\n : typeof template === \"function\"\n ? { message: template }\n : template;\n const toMessage = typeof message === \"string\" ? () => message : message;\n\n ParseErrorConstructors[reasonCode] = toParseErrorConstructor({\n code: \"BABEL_PARSER_SYNTAX_ERROR\",\n reasonCode,\n toMessage,\n ...(syntaxPlugin ? { syntaxPlugin } : {}),\n ...rest,\n });\n }\n\n return ParseErrorConstructors;\n}\n\nimport ModuleErrors from \"./parse-error/module-errors.ts\";\nimport StandardErrors from \"./parse-error/standard-errors.ts\";\nimport StrictModeErrors from \"./parse-error/strict-mode-errors.ts\";\nimport ParseExpressionErrors from \"./parse-error/parse-expression-errors.ts\";\nimport PipelineOperatorErrors from \"./parse-error/pipeline-operator-errors.ts\";\n\nexport const Errors = {\n ...ParseErrorEnum(ModuleErrors),\n ...ParseErrorEnum(StandardErrors),\n ...ParseErrorEnum(StrictModeErrors),\n ...ParseErrorEnum(ParseExpressionErrors),\n ...ParseErrorEnum`pipelineOperator`(PipelineOperatorErrors),\n};\n\nexport type { LValAncestor } from \"./parse-error/standard-errors.ts\";\n","import type { Plugin } from \"./plugin-utils.ts\";\n\n// A second optional argument can be given to further configure\n// the parser process. These options are recognized:\n\nexport type SourceType = \"script\" | \"commonjs\" | \"module\" | \"unambiguous\";\n\nexport interface Options {\n /**\n * By default, import and export declarations can only appear at a program's top level.\n * Setting this option to true allows them anywhere where a statement is allowed.\n */\n allowImportExportEverywhere?: boolean;\n\n /**\n * By default, await use is not allowed outside of an async function.\n * Set this to true to accept such code.\n */\n allowAwaitOutsideFunction?: boolean;\n\n /**\n * By default, a return statement at the top level raises an error.\n * Set this to true to accept such code.\n */\n allowReturnOutsideFunction?: boolean;\n\n /**\n * By default, new.target use is not allowed outside of a function or class.\n * Set this to true to accept such code.\n */\n allowNewTargetOutsideFunction?: boolean;\n\n allowSuperOutsideMethod?: boolean;\n\n /**\n * By default, exported identifiers must refer to a declared variable.\n * Set this to true to allow export statements to reference undeclared variables.\n */\n allowUndeclaredExports?: boolean;\n\n /**\n * By default, yield use is not allowed outside of a generator function.\n * Set this to true to accept such code.\n */\n\n allowYieldOutsideFunction?: boolean;\n\n /**\n * By default, Babel parser JavaScript code according to Annex B syntax.\n * Set this to `false` to disable such behavior.\n */\n annexB?: boolean;\n\n /**\n * By default, Babel attaches comments to adjacent AST nodes.\n * When this option is set to false, comments are not attached.\n * It can provide up to 30% performance improvement when the input code has many comments.\n * @babel/eslint-parser will set it for you.\n * It is not recommended to use attachComment: false with Babel transform,\n * as doing so removes all the comments in output code, and renders annotations such as\n * /* istanbul ignore next *\\/ nonfunctional.\n */\n attachComment?: boolean;\n\n /**\n * By default, Babel always throws an error when it finds some invalid code.\n * When this option is set to true, it will store the parsing error and\n * try to continue parsing the invalid input file.\n */\n errorRecovery?: boolean;\n\n /**\n * Indicate the mode the code should be parsed in.\n * Can be one of \"script\", \"commonjs\", \"module\", or \"unambiguous\". Defaults to \"script\".\n * \"unambiguous\" will make @babel/parser attempt to guess, based on the presence\n * of ES6 import or export statements.\n * Files with ES6 imports and exports are considered \"module\" and are otherwise \"script\".\n *\n * Use \"commonjs\" to parse code that is intended to be run in a CommonJS environment such as Node.js.\n */\n sourceType?: SourceType;\n\n /**\n * Correlate output AST nodes with their source filename.\n * Useful when generating code and source maps from the ASTs of multiple input files.\n */\n sourceFilename?: string;\n\n /**\n * By default, all source indexes start from 0.\n * You can provide a start index to alternatively start with.\n * Useful for integration with other source tools.\n */\n startIndex?: number;\n\n /**\n * By default, the first line of code parsed is treated as line 1.\n * You can provide a line number to alternatively start with.\n * Useful for integration with other source tools.\n */\n startLine?: number;\n\n /**\n * By default, the parsed code is treated as if it starts from line 1, column 0.\n * You can provide a column number to alternatively start with.\n * Useful for integration with other source tools.\n */\n startColumn?: number;\n\n /**\n * Array containing the plugins that you want to enable.\n */\n plugins?: Plugin[];\n\n /**\n * Should the parser work in strict mode.\n * Defaults to true if sourceType === 'module'. Otherwise, false.\n */\n strictMode?: boolean;\n\n /**\n * Adds a ranges property to each node: [node.start, node.end]\n */\n ranges?: boolean;\n\n /**\n * Adds all parsed tokens to a tokens property on the File node.\n */\n tokens?: boolean;\n\n /**\n * By default, the parser adds information about parentheses by setting\n * `extra.parenthesized` to `true` as needed.\n * When this option is `true` the parser creates `ParenthesizedExpression`\n * AST nodes instead of using the `extra` property.\n */\n createParenthesizedExpressions?: boolean;\n\n /**\n * The default is false in Babel 7 and true in Babel 8\n * Set this to true to parse it as an `ImportExpression` node.\n * Otherwise `import(foo)` is parsed as `CallExpression(Import, [Identifier(foo)])`.\n */\n createImportExpressions?: boolean;\n}\n\nexport const enum OptionFlags {\n AllowAwaitOutsideFunction = 1 << 0,\n AllowReturnOutsideFunction = 1 << 1,\n AllowNewTargetOutsideFunction = 1 << 2,\n AllowImportExportEverywhere = 1 << 3,\n AllowSuperOutsideMethod = 1 << 4,\n AllowYieldOutsideFunction = 1 << 5,\n AllowUndeclaredExports = 1 << 6,\n Ranges = 1 << 7,\n Tokens = 1 << 8,\n CreateImportExpressions = 1 << 9,\n CreateParenthesizedExpressions = 1 << 10,\n ErrorRecovery = 1 << 11,\n AttachComment = 1 << 12,\n AnnexB = 1 << 13,\n}\n\ntype OptionsWithDefaults = Required;\n\nfunction createDefaultOptions(): OptionsWithDefaults {\n return {\n // Source type (\"script\" or \"module\") for different semantics\n sourceType: \"script\",\n // Source filename.\n sourceFilename: undefined,\n // Index (0-based) from which to start counting source. Useful for\n // integration with other tools.\n startIndex: 0,\n // Column (0-based) from which to start counting source. Useful for\n // integration with other tools.\n startColumn: 0,\n // Line (1-based) from which to start counting source. Useful for\n // integration with other tools.\n startLine: 1,\n // When enabled, await at the top level is not considered an\n // error.\n allowAwaitOutsideFunction: false,\n // When enabled, a return at the top level is not considered an\n // error.\n allowReturnOutsideFunction: false,\n // When enabled, new.target outside a function or class is not\n // considered an error.\n allowNewTargetOutsideFunction: false,\n // When enabled, import/export statements are not constrained to\n // appearing at the top of the program.\n allowImportExportEverywhere: false,\n // TODO\n allowSuperOutsideMethod: false,\n // When enabled, export statements can reference undeclared variables.\n allowUndeclaredExports: false,\n allowYieldOutsideFunction: false,\n // An array of plugins to enable\n plugins: [],\n // TODO\n strictMode: null,\n // Nodes have their start and end characters offsets recorded in\n // `start` and `end` properties (directly on the node, rather than\n // the `loc` object, which holds line/column data. To also add a\n // [semi-standardized][range] `range` property holding a `[start,\n // end]` array with the same numbers, set the `ranges` option to\n // `true`.\n //\n // [range]: https://bugzilla.mozilla.org/show_bug.cgi?id=745678\n ranges: false,\n // Adds all parsed tokens to a `tokens` property on the `File` node\n tokens: false,\n // Whether to create ImportExpression AST nodes (if false\n // `import(foo)` will be parsed as CallExpression(Import, [Identifier(foo)])\n createImportExpressions: process.env.BABEL_8_BREAKING ? true : false,\n // Whether to create ParenthesizedExpression AST nodes (if false\n // the parser sets extra.parenthesized on the expression nodes instead).\n createParenthesizedExpressions: false,\n // When enabled, errors are attached to the AST instead of being directly thrown.\n // Some errors will still throw, because @babel/parser can't always recover.\n errorRecovery: false,\n // When enabled, comments will be attached to adjacent AST nodes as one of\n // `leadingComments`, `trailingComments` and `innerComments`. The comment attachment\n // is vital to preserve comments after transform. If you don't print AST back,\n // consider set this option to `false` for performance\n attachComment: true,\n // When enabled, the parser will support Annex B syntax.\n // https://tc39.es/ecma262/#sec-additional-ecmascript-features-for-web-browsers\n annexB: true,\n };\n}\n\n// Interpret and default an options object\n\nexport function getOptions(opts?: Options | null): OptionsWithDefaults {\n // https://github.com/babel/babel/pull/16918\n // `options` is accessed frequently, please make sure it is a fast object.\n // `%ToFastProperties` can make it a fast object, but the performance is the same as the slow object.\n const options: any = createDefaultOptions();\n\n if (opts == null) {\n return options;\n }\n if (opts.annexB != null && opts.annexB !== false) {\n throw new Error(\"The `annexB` option can only be set to `false`.\");\n }\n\n for (const key of Object.keys(options) as (keyof Options)[]) {\n if (opts[key] != null) options[key] = opts[key];\n }\n\n if (options.startLine === 1) {\n if (opts.startIndex == null && options.startColumn > 0) {\n options.startIndex = options.startColumn;\n } else if (opts.startColumn == null && options.startIndex > 0) {\n options.startColumn = options.startIndex;\n }\n } else if (opts.startColumn == null || opts.startIndex == null) {\n if (opts.startIndex != null || process.env.BABEL_8_BREAKING) {\n throw new Error(\n \"With a `startLine > 1` you must also specify `startIndex` and `startColumn`.\",\n );\n }\n }\n\n if (options.sourceType === \"commonjs\") {\n if (opts.allowAwaitOutsideFunction != null) {\n throw new Error(\n \"The `allowAwaitOutsideFunction` option cannot be used with `sourceType: 'commonjs'`.\",\n );\n }\n if (opts.allowReturnOutsideFunction != null) {\n throw new Error(\n \"`sourceType: 'commonjs'` implies `allowReturnOutsideFunction: true`, please remove the `allowReturnOutsideFunction` option or use `sourceType: 'script'`.\",\n );\n }\n if (opts.allowNewTargetOutsideFunction != null) {\n throw new Error(\n \"`sourceType: 'commonjs'` implies `allowNewTargetOutsideFunction: true`, please remove the `allowNewTargetOutsideFunction` option or use `sourceType: 'script'`.\",\n );\n }\n }\n\n return options;\n}\n","import type { TokenType } from \"../tokenizer/types.ts\";\nimport type Parser from \"../parser/index.ts\";\nimport type * as N from \"../types.ts\";\nimport type { Node as NodeType, NodeBase, File } from \"../types.ts\";\nimport type { Position } from \"../util/location.ts\";\nimport { Errors } from \"../parse-error.ts\";\nimport type { Undone } from \"../parser/node.ts\";\nimport type { BindingFlag } from \"../util/scopeflags.ts\";\nimport { OptionFlags } from \"../options.ts\";\nimport type { ExpressionErrors } from \"../parser/util.ts\";\n\nconst { defineProperty } = Object;\nconst toUnenumerable = (object: any, key: string) => {\n if (object) {\n defineProperty(object, key, { enumerable: false, value: object[key] });\n }\n};\n\nfunction toESTreeLocation(node: any) {\n toUnenumerable(node.loc.start, \"index\");\n toUnenumerable(node.loc.end, \"index\");\n\n return node;\n}\n\nexport default (superClass: typeof Parser) =>\n class ESTreeParserMixin extends superClass implements Parser {\n parse(): File {\n const file = toESTreeLocation(super.parse());\n\n if (this.optionFlags & OptionFlags.Tokens) {\n file.tokens = file.tokens.map(toESTreeLocation);\n }\n\n return file;\n }\n\n // @ts-expect-error ESTree plugin changes node types\n parseRegExpLiteral({ pattern, flags }): N.EstreeRegExpLiteral {\n let regex: RegExp | null = null;\n try {\n regex = new RegExp(pattern, flags);\n } catch (_) {\n // In environments that don't support these flags value will\n // be null as the regex can't be represented natively.\n }\n const node = this.estreeParseLiteral(regex);\n node.regex = { pattern, flags };\n\n return node;\n }\n\n // @ts-expect-error ESTree plugin changes node types\n parseBigIntLiteral(value: any): N.Node {\n // https://github.com/estree/estree/blob/master/es2020.md#bigintliteral\n let bigInt: bigint | null;\n try {\n bigInt = BigInt(value);\n } catch {\n bigInt = null;\n }\n const node = this.estreeParseLiteral(bigInt);\n node.bigint = String(node.value || value);\n\n return node;\n }\n\n // @ts-expect-error ESTree plugin changes node types\n parseDecimalLiteral(value: any): N.Node {\n // https://github.com/estree/estree/blob/master/experimental/decimal.md\n // todo: use BigDecimal when node supports it.\n const decimal: null = null;\n const node = this.estreeParseLiteral(decimal);\n node.decimal = String(node.value || value);\n\n return node;\n }\n\n estreeParseLiteral(value: any) {\n // @ts-expect-error ESTree plugin changes node types\n return this.parseLiteral(value, \"Literal\");\n }\n\n // @ts-expect-error ESTree plugin changes node types\n parseStringLiteral(value: any): N.Node {\n return this.estreeParseLiteral(value);\n }\n\n parseNumericLiteral(value: any): any {\n return this.estreeParseLiteral(value);\n }\n\n // @ts-expect-error ESTree plugin changes node types\n parseNullLiteral(): N.Node {\n return this.estreeParseLiteral(null);\n }\n\n parseBooleanLiteral(value: boolean): N.BooleanLiteral {\n // @ts-expect-error ESTree plugin changes node types\n return this.estreeParseLiteral(value);\n }\n\n // https://github.com/estree/estree/blob/master/es2020.md#chainexpression\n estreeParseChainExpression(\n node: N.Expression,\n endLoc: Position,\n ): N.EstreeChainExpression {\n const chain = this.startNodeAtNode(node);\n chain.expression = node;\n return this.finishNodeAt(chain, \"ChainExpression\", endLoc);\n }\n\n // Cast a Directive to an ExpressionStatement. Mutates the input Directive.\n directiveToStmt(directive: N.Directive): N.ExpressionStatement {\n const expression = directive.value as any as N.EstreeLiteral;\n delete directive.value;\n\n this.castNodeTo(expression, \"Literal\");\n expression.raw = expression.extra.raw;\n expression.value = expression.extra.expressionValue;\n\n const stmt = this.castNodeTo(directive, \"ExpressionStatement\");\n stmt.expression = expression;\n stmt.directive = expression.extra.rawValue;\n\n delete expression.extra;\n\n return stmt;\n }\n\n /**\n * The TS-ESLint always define optional AST properties, here we provide the\n * default value for such properties immediately after `finishNode` was invoked.\n * This hook will be implemented by the typescript plugin.\n *\n * Note: This hook should be manually invoked when we change the `type` of a given AST\n * node, to ensure that the optional properties are correctly filled.\n * @param node The AST node finished by finishNode\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n fillOptionalPropertiesForTSESLint(node: NodeType) {}\n\n cloneEstreeStringLiteral(node: N.EstreeLiteral): N.EstreeLiteral {\n const { start, end, loc, range, raw, value } = node;\n const cloned = Object.create(node.constructor.prototype);\n cloned.type = \"Literal\";\n cloned.start = start;\n cloned.end = end;\n cloned.loc = loc;\n cloned.range = range;\n cloned.raw = raw;\n cloned.value = value;\n return cloned;\n }\n\n // ==================================\n // Overrides\n // ==================================\n\n initFunction(node: N.BodilessFunctionOrMethodBase, isAsync: boolean): void {\n super.initFunction(node, isAsync);\n node.expression = false;\n }\n\n checkDeclaration(node: N.Pattern | N.ObjectProperty): void {\n if (node != null && this.isObjectProperty(node)) {\n // @ts-expect-error plugin typings\n this.checkDeclaration((node as unknown as N.EstreeProperty).value);\n } else {\n super.checkDeclaration(node);\n }\n }\n\n getObjectOrClassMethodParams(method: N.ObjectMethod | N.ClassMethod) {\n return (method as unknown as N.EstreeMethodDefinition).value.params;\n }\n\n isValidDirective(stmt: N.Statement): stmt is N.ExpressionStatement {\n return (\n stmt.type === \"ExpressionStatement\" &&\n stmt.expression.type === \"Literal\" &&\n typeof stmt.expression.value === \"string\" &&\n !stmt.expression.extra?.parenthesized\n );\n }\n\n parseBlockBody(\n node: N.BlockStatementLike,\n allowDirectives: boolean | undefined | null,\n topLevel: boolean,\n end: TokenType,\n afterBlockParse?: (hasStrictModeDirective: boolean) => void,\n ): void {\n super.parseBlockBody(\n node,\n allowDirectives,\n topLevel,\n end,\n afterBlockParse,\n );\n\n const directiveStatements = node.directives.map(d =>\n this.directiveToStmt(d),\n );\n // @ts-expect-error estree plugin typings\n node.body = directiveStatements.concat(node.body);\n delete node.directives;\n }\n\n parsePrivateName(): any {\n const node = super.parsePrivateName();\n if (!process.env.BABEL_8_BREAKING) {\n if (!this.getPluginOption(\"estree\", \"classFeatures\")) {\n return node;\n }\n }\n return this.convertPrivateNameToPrivateIdentifier(node);\n }\n\n convertPrivateNameToPrivateIdentifier(\n node: N.PrivateName,\n ): N.EstreePrivateIdentifier {\n const name = super.getPrivateNameSV(node);\n node = node as any;\n delete node.id;\n // @ts-expect-error mutate AST types\n node.name = name;\n return this.castNodeTo(node, \"PrivateIdentifier\");\n }\n\n // @ts-expect-error ESTree plugin changes node types\n isPrivateName(node: N.Node): node is N.EstreePrivateIdentifier {\n if (!process.env.BABEL_8_BREAKING) {\n if (!this.getPluginOption(\"estree\", \"classFeatures\")) {\n return super.isPrivateName(node);\n }\n }\n return node.type === \"PrivateIdentifier\";\n }\n\n // @ts-expect-error ESTree plugin changes node types\n getPrivateNameSV(node: N.EstreePrivateIdentifier): string {\n if (!process.env.BABEL_8_BREAKING) {\n if (!this.getPluginOption(\"estree\", \"classFeatures\")) {\n return super.getPrivateNameSV(node as unknown as N.PrivateName);\n }\n }\n return node.name;\n }\n\n // @ts-expect-error plugin may override interfaces\n parseLiteral(value: any, type: T[\"type\"]): T {\n const node = super.parseLiteral(value, type);\n // @ts-expect-error mutating AST types\n node.raw = node.extra.raw;\n delete node.extra;\n\n return node;\n }\n\n parseFunctionBody(\n node: N.Function,\n allowExpression?: boolean | null,\n isMethod: boolean = false,\n ): void {\n super.parseFunctionBody(node, allowExpression, isMethod);\n node.expression = node.body.type !== \"BlockStatement\";\n }\n\n // @ts-expect-error plugin may override interfaces\n parseMethod<\n T extends N.ClassPrivateMethod | N.ObjectMethod | N.ClassMethod,\n >(\n node: Undone,\n isGenerator: boolean,\n isAsync: boolean,\n isConstructor: boolean,\n allowDirectSuper: boolean,\n type: T[\"type\"],\n inClassScope: boolean = false,\n ):\n | N.EstreeProperty\n | N.EstreeMethodDefinition\n | N.EstreeTSAbstractMethodDefinition {\n let funcNode = this.startNode();\n funcNode.kind = node.kind; // provide kind, so super method correctly sets state\n funcNode = super.parseMethod(\n funcNode,\n isGenerator,\n isAsync,\n isConstructor,\n allowDirectSuper,\n type,\n inClassScope,\n );\n delete funcNode.kind;\n const { typeParameters } = node;\n if (typeParameters) {\n delete node.typeParameters;\n funcNode.typeParameters = typeParameters;\n this.resetStartLocationFromNode(funcNode, typeParameters);\n }\n const valueNode = this.castNodeTo(\n funcNode as N.MethodLike,\n process.env.BABEL_8_BREAKING &&\n this.hasPlugin(\"typescript\") &&\n !funcNode.body\n ? \"TSEmptyBodyFunctionExpression\"\n : \"FunctionExpression\",\n );\n (\n node as unknown as Undone<\n | N.EstreeProperty\n | N.EstreeMethodDefinition\n | N.EstreeTSAbstractMethodDefinition\n >\n ).value = valueNode;\n if (type === \"ClassPrivateMethod\") {\n node.computed = false;\n }\n if (process.env.BABEL_8_BREAKING && this.hasPlugin(\"typescript\")) {\n // @ts-expect-error todo(flow->ts) property not defined for all types in union\n if (node.abstract) {\n // @ts-expect-error remove abstract from TSAbstractMethodDefinition\n delete node.abstract;\n return this.finishNode(\n // @ts-expect-error cast methods to estree types\n node as Undone,\n \"TSAbstractMethodDefinition\",\n );\n }\n }\n if (type === \"ObjectMethod\") {\n if ((node as any as N.ObjectMethod).kind === \"method\") {\n (node as any as N.EstreeProperty).kind = \"init\";\n }\n (node as any as N.EstreeProperty).shorthand = false;\n return this.finishNode(\n // @ts-expect-error cast methods to estree types\n node as Undone,\n \"Property\",\n );\n } else {\n return this.finishNode(\n // @ts-expect-error cast methods to estree types\n node as Undone,\n \"MethodDefinition\",\n );\n }\n }\n\n nameIsConstructor(key: N.Expression | N.PrivateName): boolean {\n if (key.type === \"Literal\") return key.value === \"constructor\";\n return super.nameIsConstructor(key);\n }\n\n parseClassProperty(...args: [N.ClassProperty]): any {\n const propertyNode = super.parseClassProperty(...args);\n if (!process.env.BABEL_8_BREAKING) {\n if (!this.getPluginOption(\"estree\", \"classFeatures\")) {\n return propertyNode as unknown as N.EstreePropertyDefinition;\n }\n }\n if (\n process.env.BABEL_8_BREAKING &&\n propertyNode.abstract &&\n this.hasPlugin(\"typescript\")\n ) {\n delete propertyNode.abstract;\n this.castNodeTo(propertyNode, \"TSAbstractPropertyDefinition\");\n } else {\n this.castNodeTo(propertyNode, \"PropertyDefinition\");\n }\n return propertyNode;\n }\n\n parseClassPrivateProperty(...args: [N.ClassPrivateProperty]): any {\n const propertyNode = super.parseClassPrivateProperty(...args);\n if (!process.env.BABEL_8_BREAKING) {\n if (!this.getPluginOption(\"estree\", \"classFeatures\")) {\n return propertyNode as unknown as N.EstreePropertyDefinition;\n }\n }\n if (\n process.env.BABEL_8_BREAKING &&\n propertyNode.abstract &&\n this.hasPlugin(\"typescript\")\n ) {\n this.castNodeTo(propertyNode, \"TSAbstractPropertyDefinition\");\n } else {\n this.castNodeTo(propertyNode, \"PropertyDefinition\");\n }\n propertyNode.computed = false;\n return propertyNode;\n }\n\n parseClassAccessorProperty(\n this: Parser,\n node: N.ClassAccessorProperty,\n ): any {\n const accessorPropertyNode = super.parseClassAccessorProperty(node);\n if (!process.env.BABEL_8_BREAKING) {\n if (!this.getPluginOption(\"estree\", \"classFeatures\")) {\n return accessorPropertyNode;\n }\n }\n if (accessorPropertyNode.abstract && this.hasPlugin(\"typescript\")) {\n delete accessorPropertyNode.abstract;\n this.castNodeTo(accessorPropertyNode, \"TSAbstractAccessorProperty\");\n } else {\n this.castNodeTo(accessorPropertyNode, \"AccessorProperty\");\n }\n return accessorPropertyNode;\n }\n\n parseObjectProperty(\n prop: N.ObjectProperty,\n startLoc: Position | undefined | null,\n isPattern: boolean,\n refExpressionErrors?: ExpressionErrors | null,\n ): N.ObjectProperty | undefined | null {\n const node: N.EstreeProperty = super.parseObjectProperty(\n prop,\n startLoc,\n isPattern,\n refExpressionErrors,\n ) as any;\n\n if (node) {\n node.kind = \"init\";\n this.castNodeTo(node, \"Property\");\n }\n\n return node as any;\n }\n\n finishObjectProperty(node: Undone): N.ObjectProperty {\n (node as unknown as Undone).kind = \"init\";\n return this.finishNode(\n node as unknown as Undone,\n \"Property\",\n ) as any;\n }\n\n isValidLVal(\n type: string,\n isUnparenthesizedInAssign: boolean,\n binding: BindingFlag,\n ) {\n return type === \"Property\"\n ? \"value\"\n : super.isValidLVal(type, isUnparenthesizedInAssign, binding);\n }\n\n isAssignable(node: N.Node, isBinding?: boolean): boolean {\n if (node != null && this.isObjectProperty(node)) {\n return this.isAssignable(node.value, isBinding);\n }\n return super.isAssignable(node, isBinding);\n }\n\n toAssignable(node: N.Node, isLHS: boolean = false): void {\n if (node != null && this.isObjectProperty(node)) {\n const { key, value } = node;\n if (this.isPrivateName(key)) {\n this.classScope.usePrivateName(\n this.getPrivateNameSV(key),\n key.loc.start,\n );\n }\n this.toAssignable(value, isLHS);\n } else {\n super.toAssignable(node, isLHS);\n }\n }\n\n toAssignableObjectExpressionProp(\n prop: N.Node,\n isLast: boolean,\n isLHS: boolean,\n ) {\n if (\n prop.type === \"Property\" &&\n (prop.kind === \"get\" || prop.kind === \"set\")\n ) {\n this.raise(Errors.PatternHasAccessor, prop.key);\n } else if (prop.type === \"Property\" && prop.method) {\n this.raise(Errors.PatternHasMethod, prop.key);\n } else {\n super.toAssignableObjectExpressionProp(prop, isLast, isLHS);\n }\n }\n\n finishCallExpression(\n unfinished: Undone,\n optional: boolean,\n ): T {\n const node = super.finishCallExpression(unfinished, optional);\n\n if (node.callee.type === \"Import\") {\n this.castNodeTo(node, \"ImportExpression\");\n (node as N.Node as N.EstreeImportExpression).source = node\n .arguments[0] as N.Expression;\n (node as N.Node as N.EstreeImportExpression).options =\n (node.arguments[1] as N.Expression) ?? null;\n // compatibility with previous ESTree AST\n // TODO(Babel 8): Remove this\n (node as N.Node as N.EstreeImportExpression).attributes =\n (node.arguments[1] as N.Expression) ?? null;\n // arguments isn't optional in the type definition\n delete node.arguments;\n // callee isn't optional in the type definition\n delete node.callee;\n } else if (node.type === \"OptionalCallExpression\") {\n this.castNodeTo(node, \"CallExpression\");\n } else {\n node.optional = false;\n }\n\n return node;\n }\n\n toReferencedArguments(\n node:\n | N.CallExpression\n | N.OptionalCallExpression\n | N.EstreeImportExpression,\n /* isParenthesizedExpr?: boolean, */\n ) {\n // ImportExpressions do not have an arguments array.\n if (node.type === \"ImportExpression\") {\n return;\n }\n\n super.toReferencedArguments(node);\n }\n\n parseExport(\n unfinished: Undone,\n decorators: N.Decorator[] | null,\n ) {\n const exportStartLoc = this.state.lastTokStartLoc;\n const node = super.parseExport(unfinished, decorators);\n\n switch (node.type) {\n case \"ExportAllDeclaration\":\n // @ts-expect-error mutating AST types\n node.exported = null;\n break;\n\n case \"ExportNamedDeclaration\":\n if (\n node.specifiers.length === 1 &&\n node.specifiers[0].type === \"ExportNamespaceSpecifier\"\n ) {\n this.castNodeTo(node, \"ExportAllDeclaration\");\n // @ts-expect-error mutating AST types\n node.exported = node.specifiers[0].exported;\n delete node.specifiers;\n }\n\n // fallthrough\n case \"ExportDefaultDeclaration\":\n {\n const { declaration } = node;\n if (\n declaration?.type === \"ClassDeclaration\" &&\n declaration.decorators?.length > 0 &&\n // decorator comes before export\n declaration.start === node.start\n ) {\n this.resetStartLocation(\n node,\n // For compatibility with ESLint's keyword-spacing rule, which assumes that an\n // export declaration must start with export.\n // https://github.com/babel/babel/issues/15085\n // Here we reset export declaration's start to be the start of the export token\n exportStartLoc,\n );\n }\n }\n\n break;\n }\n\n return node;\n }\n\n stopParseSubscript(base: N.Expression, state: N.ParseSubscriptState) {\n const node = super.stopParseSubscript(base, state);\n if (state.optionalChainMember) {\n return this.estreeParseChainExpression(node, base.loc.end);\n }\n return node;\n }\n\n parseMember(\n base: N.Expression,\n startLoc: Position,\n state: N.ParseSubscriptState,\n computed: boolean,\n optional: boolean,\n ) {\n const node = super.parseMember(base, startLoc, state, computed, optional);\n if (node.type === \"OptionalMemberExpression\") {\n this.castNodeTo(node, \"MemberExpression\");\n } else {\n node.optional = false;\n }\n return node;\n }\n\n isOptionalMemberExpression(node: N.Node) {\n if (node.type === \"ChainExpression\") {\n return node.expression.type === \"MemberExpression\";\n }\n return super.isOptionalMemberExpression(node);\n }\n\n hasPropertyAsPrivateName(node: N.Node): boolean {\n if (node.type === \"ChainExpression\") {\n node = node.expression;\n }\n return super.hasPropertyAsPrivateName(node);\n }\n\n // @ts-expect-error ESTree plugin changes node types\n isObjectProperty(node: N.Node): node is N.EstreeProperty {\n return node.type === \"Property\" && node.kind === \"init\" && !node.method;\n }\n\n // @ts-expect-error ESTree plugin changes node types\n isObjectMethod(node: N.Node): node is N.EstreeProperty {\n return (\n node.type === \"Property\" &&\n (node.method || node.kind === \"get\" || node.kind === \"set\")\n );\n }\n\n /* ============================================================ *\n * parser/node.ts *\n * ============================================================ */\n\n castNodeTo(\n node: N.Node,\n type: T,\n ): Extract {\n const result = super.castNodeTo(node, type);\n this.fillOptionalPropertiesForTSESLint(result);\n return result;\n }\n\n cloneIdentifier(node: T): T {\n const cloned = super.cloneIdentifier(node);\n this.fillOptionalPropertiesForTSESLint(cloned);\n return cloned;\n }\n\n cloneStringLiteral<\n T extends N.EstreeLiteral | N.StringLiteral | N.Placeholder,\n >(node: T): T {\n if (node.type === \"Literal\") {\n return this.cloneEstreeStringLiteral(node) as T;\n }\n return super.cloneStringLiteral(node);\n }\n\n finishNodeAt(\n node: Undone,\n type: T[\"type\"],\n endLoc: Position,\n ): T {\n return toESTreeLocation(super.finishNodeAt(node, type, endLoc));\n }\n\n // Override for TS-ESLint that does not allow optional AST properties\n finishNode(node: Undone, type: T[\"type\"]): T {\n const result = super.finishNode(node, type);\n this.fillOptionalPropertiesForTSESLint(result);\n return result;\n }\n\n resetStartLocation(node: N.Node, startLoc: Position) {\n super.resetStartLocation(node, startLoc);\n toESTreeLocation(node);\n }\n\n resetEndLocation(\n node: NodeBase,\n endLoc: Position = this.state.lastTokEndLoc,\n ): void {\n super.resetEndLocation(node, endLoc);\n toESTreeLocation(node);\n }\n };\n","// The token context is used in JSX plugin to track\n// jsx tag / jsx text / normal JavaScript expression\n\nexport class TokContext {\n constructor(token: string, preserveSpace?: boolean) {\n this.token = token;\n this.preserveSpace = !!preserveSpace;\n }\n\n token: string;\n preserveSpace: boolean;\n}\n\nconst types: {\n [key: string]: TokContext;\n} = {\n brace: new TokContext(\"{\"), // normal JavaScript expression\n j_oTag: new TokContext(\"...\", true), // JSX expressions\n};\n\nif (!process.env.BABEL_8_BREAKING) {\n types.template = new TokContext(\"`\", true);\n}\n\nexport { types };\n","import { types as tc, type TokContext } from \"./context.ts\";\n// ## Token types\n\n// The assignment of fine-grained, information-carrying type objects\n// allows the tokenizer to store the information it has about a\n// token in a way that is very cheap for the parser to look up.\n\n// All token type variables start with an underscore, to make them\n// easy to recognize.\n\n// The `beforeExpr` property is used to disambiguate between 1) binary\n// expression (<) and JSX Tag start (); 2) object literal and JSX\n// texts. It is set on the `updateContext` function in the JSX plugin.\n\n// The `startsExpr` property is used to determine whether an expression\n// may be the “argument” subexpression of a `yield` expression or\n// `yield` statement. It is set on all token types that may be at the\n// start of a subexpression.\n\n// `isLoop` marks a keyword as starting a loop, which is important\n// to know when parsing a label, in order to allow or disallow\n// continue jumps to that label.\n\nconst beforeExpr = true;\nconst startsExpr = true;\nconst isLoop = true;\nconst isAssign = true;\nconst prefix = true;\nconst postfix = true;\n\ntype TokenOptions = {\n keyword?: string;\n beforeExpr?: boolean;\n startsExpr?: boolean;\n rightAssociative?: boolean;\n isLoop?: boolean;\n isAssign?: boolean;\n prefix?: boolean;\n postfix?: boolean;\n binop?: number | null;\n};\n\n// Internally the tokenizer stores token as a number\nexport type TokenType = number;\n\n// The `ExportedTokenType` is exported via `tokTypes` and accessible\n// when `tokens: true` is enabled. Unlike internal token type, it provides\n// metadata of the tokens.\nexport class ExportedTokenType {\n label: string;\n keyword: string | undefined | null;\n beforeExpr: boolean;\n startsExpr: boolean;\n rightAssociative: boolean;\n isLoop: boolean;\n isAssign: boolean;\n prefix: boolean;\n postfix: boolean;\n binop: number | undefined | null;\n // todo(Babel 8): remove updateContext from exposed token layout\n declare updateContext:\n | ((context: Array) => void)\n | undefined\n | null;\n\n constructor(label: string, conf: TokenOptions = {}) {\n this.label = label;\n this.keyword = conf.keyword;\n this.beforeExpr = !!conf.beforeExpr;\n this.startsExpr = !!conf.startsExpr;\n this.rightAssociative = !!conf.rightAssociative;\n this.isLoop = !!conf.isLoop;\n this.isAssign = !!conf.isAssign;\n this.prefix = !!conf.prefix;\n this.postfix = !!conf.postfix;\n this.binop = conf.binop != null ? conf.binop : null;\n if (!process.env.BABEL_8_BREAKING) {\n this.updateContext = null;\n }\n }\n}\n\n// A map from keyword/keyword-like string value to the token type\nexport const keywords = new Map();\n\nfunction createKeyword(name: string, options: TokenOptions = {}): TokenType {\n options.keyword = name;\n const token = createToken(name, options);\n keywords.set(name, token);\n return token;\n}\n\nfunction createBinop(name: string, binop: number) {\n return createToken(name, { beforeExpr, binop });\n}\n\nlet tokenTypeCounter = -1;\nexport const tokenTypes: ExportedTokenType[] = [];\nconst tokenLabels: string[] = [];\nconst tokenBinops: number[] = [];\nconst tokenBeforeExprs: boolean[] = [];\nconst tokenStartsExprs: boolean[] = [];\nconst tokenPrefixes: boolean[] = [];\n\nfunction createToken(name: string, options: TokenOptions = {}): TokenType {\n ++tokenTypeCounter;\n tokenLabels.push(name);\n tokenBinops.push(options.binop ?? -1);\n tokenBeforeExprs.push(options.beforeExpr ?? false);\n tokenStartsExprs.push(options.startsExpr ?? false);\n tokenPrefixes.push(options.prefix ?? false);\n tokenTypes.push(new ExportedTokenType(name, options));\n\n return tokenTypeCounter;\n}\n\nfunction createKeywordLike(\n name: string,\n options: TokenOptions = {},\n): TokenType {\n ++tokenTypeCounter;\n keywords.set(name, tokenTypeCounter);\n tokenLabels.push(name);\n tokenBinops.push(options.binop ?? -1);\n tokenBeforeExprs.push(options.beforeExpr ?? false);\n tokenStartsExprs.push(options.startsExpr ?? false);\n tokenPrefixes.push(options.prefix ?? false);\n // In the exported token type, we set the label as \"name\" for backward compatibility with Babel 7\n tokenTypes.push(new ExportedTokenType(\"name\", options));\n\n return tokenTypeCounter;\n}\n\n// For performance the token type helpers depend on the following declarations order.\n// When adding new token types, please also check if the token helpers need update.\n\nexport type InternalTokenTypes = typeof tt;\n\nexport const tt = {\n // Punctuation token types.\n bracketL: createToken(\"[\", { beforeExpr, startsExpr }),\n // TODO: Remove this in Babel 8\n bracketHashL: createToken(\"#[\", { beforeExpr, startsExpr }),\n // TODO: Remove this in Babel 8\n bracketBarL: createToken(\"[|\", { beforeExpr, startsExpr }),\n bracketR: createToken(\"]\"),\n // TODO: Remove this in Babel 8\n bracketBarR: createToken(\"|]\"),\n braceL: createToken(\"{\", { beforeExpr, startsExpr }),\n // TODO: Remove this in Babel 8\n braceBarL: createToken(\"{|\", { beforeExpr, startsExpr }),\n // TODO: Remove this in Babel 8\n braceHashL: createToken(\"#{\", { beforeExpr, startsExpr }),\n braceR: createToken(\"}\"),\n braceBarR: createToken(\"|}\"),\n parenL: createToken(\"(\", { beforeExpr, startsExpr }),\n parenR: createToken(\")\"),\n comma: createToken(\",\", { beforeExpr }),\n semi: createToken(\";\", { beforeExpr }),\n colon: createToken(\":\", { beforeExpr }),\n doubleColon: createToken(\"::\", { beforeExpr }),\n dot: createToken(\".\"),\n question: createToken(\"?\", { beforeExpr }),\n questionDot: createToken(\"?.\"),\n arrow: createToken(\"=>\", { beforeExpr }),\n template: createToken(\"template\"),\n ellipsis: createToken(\"...\", { beforeExpr }),\n backQuote: createToken(\"`\", { startsExpr }),\n dollarBraceL: createToken(\"${\", { beforeExpr, startsExpr }),\n // start: isTemplate\n templateTail: createToken(\"...`\", { startsExpr }),\n templateNonTail: createToken(\"...${\", { beforeExpr, startsExpr }),\n // end: isTemplate\n at: createToken(\"@\"),\n hash: createToken(\"#\", { startsExpr }),\n\n // Special hashbang token.\n interpreterDirective: createToken(\"#!...\"),\n\n // Operators. These carry several kinds of properties to help the\n // parser use them properly (the presence of these properties is\n // what categorizes them as operators).\n //\n // `binop`, when present, specifies that this operator is a binary\n // operator, and will refer to its precedence.\n //\n // `prefix` and `postfix` mark the operator as a prefix or postfix\n // unary operator.\n //\n // `isAssign` marks all of `=`, `+=`, `-=` etcetera, which act as\n // binary operators with a very low precedence, that should result\n // in AssignmentExpression nodes.\n\n // start: isAssign\n eq: createToken(\"=\", { beforeExpr, isAssign }),\n assign: createToken(\"_=\", { beforeExpr, isAssign }),\n slashAssign: createToken(\"_=\", { beforeExpr, isAssign }),\n // These are only needed to support % and ^ as a Hack-pipe topic token.\n // When the proposal settles on a token, the others can be merged with\n // tt.assign.\n xorAssign: createToken(\"_=\", { beforeExpr, isAssign }),\n moduloAssign: createToken(\"_=\", { beforeExpr, isAssign }),\n // end: isAssign\n\n incDec: createToken(\"++/--\", { prefix, postfix, startsExpr }),\n bang: createToken(\"!\", { beforeExpr, prefix, startsExpr }),\n tilde: createToken(\"~\", { beforeExpr, prefix, startsExpr }),\n\n // More possible topic tokens.\n // When the proposal settles on a token, at least one of these may be removed.\n doubleCaret: createToken(\"^^\", { startsExpr }),\n doubleAt: createToken(\"@@\", { startsExpr }),\n\n // start: isBinop\n pipeline: createBinop(\"|>\", 0),\n nullishCoalescing: createBinop(\"??\", 1),\n logicalOR: createBinop(\"||\", 1),\n logicalAND: createBinop(\"&&\", 2),\n bitwiseOR: createBinop(\"|\", 3),\n bitwiseXOR: createBinop(\"^\", 4),\n bitwiseAND: createBinop(\"&\", 5),\n equality: createBinop(\"==/!=/===/!==\", 6),\n lt: createBinop(\"/<=/>=\", 7),\n gt: createBinop(\"/<=/>=\", 7),\n relational: createBinop(\"/<=/>=\", 7),\n bitShift: createBinop(\"<>/>>>\", 8),\n bitShiftL: createBinop(\"<>/>>>\", 8),\n bitShiftR: createBinop(\"<>/>>>\", 8),\n plusMin: createToken(\"+/-\", { beforeExpr, binop: 9, prefix, startsExpr }),\n // startsExpr: required by v8intrinsic plugin\n modulo: createToken(\"%\", { binop: 10, startsExpr }),\n // unset `beforeExpr` as it can be `function *`\n star: createToken(\"*\", { binop: 10 }),\n slash: createBinop(\"/\", 10),\n exponent: createToken(\"**\", {\n beforeExpr,\n binop: 11,\n rightAssociative: true,\n }),\n\n // Keywords\n // Don't forget to update packages/babel-helper-validator-identifier/src/keyword.js\n // when new keywords are added\n // start: isLiteralPropertyName\n // start: isKeyword\n _in: createKeyword(\"in\", { beforeExpr, binop: 7 }),\n _instanceof: createKeyword(\"instanceof\", { beforeExpr, binop: 7 }),\n // end: isBinop\n _break: createKeyword(\"break\"),\n _case: createKeyword(\"case\", { beforeExpr }),\n _catch: createKeyword(\"catch\"),\n _continue: createKeyword(\"continue\"),\n _debugger: createKeyword(\"debugger\"),\n _default: createKeyword(\"default\", { beforeExpr }),\n _else: createKeyword(\"else\", { beforeExpr }),\n _finally: createKeyword(\"finally\"),\n _function: createKeyword(\"function\", { startsExpr }),\n _if: createKeyword(\"if\"),\n _return: createKeyword(\"return\", { beforeExpr }),\n _switch: createKeyword(\"switch\"),\n _throw: createKeyword(\"throw\", { beforeExpr, prefix, startsExpr }),\n _try: createKeyword(\"try\"),\n _var: createKeyword(\"var\"),\n _const: createKeyword(\"const\"),\n _with: createKeyword(\"with\"),\n _new: createKeyword(\"new\", { beforeExpr, startsExpr }),\n _this: createKeyword(\"this\", { startsExpr }),\n _super: createKeyword(\"super\", { startsExpr }),\n _class: createKeyword(\"class\", { startsExpr }),\n _extends: createKeyword(\"extends\", { beforeExpr }),\n _export: createKeyword(\"export\"),\n _import: createKeyword(\"import\", { startsExpr }),\n _null: createKeyword(\"null\", { startsExpr }),\n _true: createKeyword(\"true\", { startsExpr }),\n _false: createKeyword(\"false\", { startsExpr }),\n _typeof: createKeyword(\"typeof\", { beforeExpr, prefix, startsExpr }),\n _void: createKeyword(\"void\", { beforeExpr, prefix, startsExpr }),\n _delete: createKeyword(\"delete\", { beforeExpr, prefix, startsExpr }),\n // start: isLoop\n _do: createKeyword(\"do\", { isLoop, beforeExpr }),\n _for: createKeyword(\"for\", { isLoop }),\n _while: createKeyword(\"while\", { isLoop }),\n // end: isLoop\n // end: isKeyword\n\n // Primary literals\n // start: isIdentifier\n _as: createKeywordLike(\"as\", { startsExpr }),\n _assert: createKeywordLike(\"assert\", { startsExpr }),\n _async: createKeywordLike(\"async\", { startsExpr }),\n _await: createKeywordLike(\"await\", { startsExpr }),\n _defer: createKeywordLike(\"defer\", { startsExpr }),\n _from: createKeywordLike(\"from\", { startsExpr }),\n _get: createKeywordLike(\"get\", { startsExpr }),\n _let: createKeywordLike(\"let\", { startsExpr }),\n _meta: createKeywordLike(\"meta\", { startsExpr }),\n _of: createKeywordLike(\"of\", { startsExpr }),\n _sent: createKeywordLike(\"sent\", { startsExpr }),\n _set: createKeywordLike(\"set\", { startsExpr }),\n _source: createKeywordLike(\"source\", { startsExpr }),\n _static: createKeywordLike(\"static\", { startsExpr }),\n _using: createKeywordLike(\"using\", { startsExpr }),\n _yield: createKeywordLike(\"yield\", { startsExpr }),\n\n // Flow and TypeScript Keywordlike\n _asserts: createKeywordLike(\"asserts\", { startsExpr }),\n _checks: createKeywordLike(\"checks\", { startsExpr }),\n _exports: createKeywordLike(\"exports\", { startsExpr }),\n _global: createKeywordLike(\"global\", { startsExpr }),\n _implements: createKeywordLike(\"implements\", { startsExpr }),\n _intrinsic: createKeywordLike(\"intrinsic\", { startsExpr }),\n _infer: createKeywordLike(\"infer\", { startsExpr }),\n _is: createKeywordLike(\"is\", { startsExpr }),\n _mixins: createKeywordLike(\"mixins\", { startsExpr }),\n _proto: createKeywordLike(\"proto\", { startsExpr }),\n _require: createKeywordLike(\"require\", { startsExpr }),\n _satisfies: createKeywordLike(\"satisfies\", { startsExpr }),\n // start: isTSTypeOperator\n _keyof: createKeywordLike(\"keyof\", { startsExpr }),\n _readonly: createKeywordLike(\"readonly\", { startsExpr }),\n _unique: createKeywordLike(\"unique\", { startsExpr }),\n // end: isTSTypeOperator\n // start: isTSDeclarationStart\n _abstract: createKeywordLike(\"abstract\", { startsExpr }),\n _declare: createKeywordLike(\"declare\", { startsExpr }),\n _enum: createKeywordLike(\"enum\", { startsExpr }),\n _module: createKeywordLike(\"module\", { startsExpr }),\n _namespace: createKeywordLike(\"namespace\", { startsExpr }),\n // start: isFlowInterfaceOrTypeOrOpaque\n _interface: createKeywordLike(\"interface\", { startsExpr }),\n _type: createKeywordLike(\"type\", { startsExpr }),\n // end: isTSDeclarationStart\n _opaque: createKeywordLike(\"opaque\", { startsExpr }),\n // end: isFlowInterfaceOrTypeOrOpaque\n name: createToken(\"name\", { startsExpr }),\n\n // placeholder plugin\n placeholder: createToken(\"%%\", { startsExpr }),\n // end: isIdentifier\n\n string: createToken(\"string\", { startsExpr }),\n num: createToken(\"num\", { startsExpr }),\n bigint: createToken(\"bigint\", { startsExpr }),\n // TODO: Remove this in Babel 8\n decimal: createToken(\"decimal\", { startsExpr }),\n // end: isLiteralPropertyName\n regexp: createToken(\"regexp\", { startsExpr }),\n privateName: createToken(\"#name\", { startsExpr }),\n eof: createToken(\"eof\"),\n\n // jsx plugin\n jsxName: createToken(\"jsxName\"),\n jsxText: createToken(\"jsxText\", { beforeExpr }),\n jsxTagStart: createToken(\"jsxTagStart\", { startsExpr }),\n jsxTagEnd: createToken(\"jsxTagEnd\"),\n} as const;\n\nexport function tokenIsIdentifier(token: TokenType): boolean {\n return token >= tt._as && token <= tt.placeholder;\n}\n\nexport function tokenKeywordOrIdentifierIsKeyword(token: TokenType): boolean {\n // we can remove the token >= tt._in check when we\n // know a token is either keyword or identifier\n return token <= tt._while;\n}\n\nexport function tokenIsKeywordOrIdentifier(token: TokenType): boolean {\n return token >= tt._in && token <= tt.placeholder;\n}\n\nexport function tokenIsLiteralPropertyName(token: TokenType): boolean {\n return token >= tt._in && token <= tt.decimal;\n}\n\nexport function tokenComesBeforeExpression(token: TokenType): boolean {\n return tokenBeforeExprs[token];\n}\n\nexport function tokenCanStartExpression(token: TokenType): boolean {\n return tokenStartsExprs[token];\n}\n\nexport function tokenIsAssignment(token: TokenType): boolean {\n return token >= tt.eq && token <= tt.moduloAssign;\n}\n\nexport function tokenIsFlowInterfaceOrTypeOrOpaque(token: TokenType): boolean {\n return token >= tt._interface && token <= tt._opaque;\n}\n\nexport function tokenIsLoop(token: TokenType): boolean {\n return token >= tt._do && token <= tt._while;\n}\n\nexport function tokenIsKeyword(token: TokenType): boolean {\n return token >= tt._in && token <= tt._while;\n}\n\nexport function tokenIsOperator(token: TokenType): boolean {\n return token >= tt.pipeline && token <= tt._instanceof;\n}\n\nexport function tokenIsPostfix(token: TokenType): boolean {\n return token === tt.incDec;\n}\n\nexport function tokenIsPrefix(token: TokenType): boolean {\n return tokenPrefixes[token];\n}\n\nexport function tokenIsTSTypeOperator(token: TokenType): boolean {\n return token >= tt._keyof && token <= tt._unique;\n}\n\nexport function tokenIsTSDeclarationStart(token: TokenType): boolean {\n return token >= tt._abstract && token <= tt._type;\n}\n\nexport function tokenLabelName(token: TokenType): string {\n return tokenLabels[token];\n}\n\nexport function tokenOperatorPrecedence(token: TokenType): number {\n return tokenBinops[token];\n}\n\nexport function tokenIsBinaryOperator(token: TokenType): boolean {\n return tokenBinops[token] !== -1;\n}\n\nexport function tokenIsRightAssociative(token: TokenType): boolean {\n return token === tt.exponent;\n}\n\nexport function tokenIsTemplate(token: TokenType): boolean {\n return token >= tt.templateTail && token <= tt.templateNonTail;\n}\n\nexport function getExportedToken(token: TokenType): ExportedTokenType {\n return tokenTypes[token];\n}\n\nexport function isTokenType(obj: any): boolean {\n return typeof obj === \"number\";\n}\n\nif (!process.env.BABEL_8_BREAKING) {\n tokenTypes[tt.braceR].updateContext = context => {\n context.pop();\n };\n\n tokenTypes[tt.braceL].updateContext =\n tokenTypes[tt.braceHashL].updateContext =\n tokenTypes[tt.dollarBraceL].updateContext =\n context => {\n context.push(tc.brace);\n };\n\n tokenTypes[tt.backQuote].updateContext = context => {\n if (context[context.length - 1] === tc.template) {\n context.pop();\n } else {\n context.push(tc.template);\n }\n };\n\n tokenTypes[tt.jsxTagStart].updateContext = context => {\n context.push(tc.j_expr, tc.j_oTag);\n };\n}\n","// We inline this package\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport * as charCodes from \"charcodes\";\n\n// ## Character categories\n\n// Big ugly regular expressions that match characters in the\n// whitespace, identifier, and identifier-start categories. These\n// are only applied when a character is found to actually have a\n// code point between 0x80 and 0xffff.\n// Generated by `scripts/generate-identifier-regex.cjs`.\n\n/* prettier-ignore */\nlet nonASCIIidentifierStartChars = \"\\xaa\\xb5\\xba\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\u02c1\\u02c6-\\u02d1\\u02e0-\\u02e4\\u02ec\\u02ee\\u0370-\\u0374\\u0376\\u0377\\u037a-\\u037d\\u037f\\u0386\\u0388-\\u038a\\u038c\\u038e-\\u03a1\\u03a3-\\u03f5\\u03f7-\\u0481\\u048a-\\u052f\\u0531-\\u0556\\u0559\\u0560-\\u0588\\u05d0-\\u05ea\\u05ef-\\u05f2\\u0620-\\u064a\\u066e\\u066f\\u0671-\\u06d3\\u06d5\\u06e5\\u06e6\\u06ee\\u06ef\\u06fa-\\u06fc\\u06ff\\u0710\\u0712-\\u072f\\u074d-\\u07a5\\u07b1\\u07ca-\\u07ea\\u07f4\\u07f5\\u07fa\\u0800-\\u0815\\u081a\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086a\\u0870-\\u0887\\u0889-\\u088e\\u08a0-\\u08c9\\u0904-\\u0939\\u093d\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098c\\u098f\\u0990\\u0993-\\u09a8\\u09aa-\\u09b0\\u09b2\\u09b6-\\u09b9\\u09bd\\u09ce\\u09dc\\u09dd\\u09df-\\u09e1\\u09f0\\u09f1\\u09fc\\u0a05-\\u0a0a\\u0a0f\\u0a10\\u0a13-\\u0a28\\u0a2a-\\u0a30\\u0a32\\u0a33\\u0a35\\u0a36\\u0a38\\u0a39\\u0a59-\\u0a5c\\u0a5e\\u0a72-\\u0a74\\u0a85-\\u0a8d\\u0a8f-\\u0a91\\u0a93-\\u0aa8\\u0aaa-\\u0ab0\\u0ab2\\u0ab3\\u0ab5-\\u0ab9\\u0abd\\u0ad0\\u0ae0\\u0ae1\\u0af9\\u0b05-\\u0b0c\\u0b0f\\u0b10\\u0b13-\\u0b28\\u0b2a-\\u0b30\\u0b32\\u0b33\\u0b35-\\u0b39\\u0b3d\\u0b5c\\u0b5d\\u0b5f-\\u0b61\\u0b71\\u0b83\\u0b85-\\u0b8a\\u0b8e-\\u0b90\\u0b92-\\u0b95\\u0b99\\u0b9a\\u0b9c\\u0b9e\\u0b9f\\u0ba3\\u0ba4\\u0ba8-\\u0baa\\u0bae-\\u0bb9\\u0bd0\\u0c05-\\u0c0c\\u0c0e-\\u0c10\\u0c12-\\u0c28\\u0c2a-\\u0c39\\u0c3d\\u0c58-\\u0c5a\\u0c5d\\u0c60\\u0c61\\u0c80\\u0c85-\\u0c8c\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cbd\\u0cdd\\u0cde\\u0ce0\\u0ce1\\u0cf1\\u0cf2\\u0d04-\\u0d0c\\u0d0e-\\u0d10\\u0d12-\\u0d3a\\u0d3d\\u0d4e\\u0d54-\\u0d56\\u0d5f-\\u0d61\\u0d7a-\\u0d7f\\u0d85-\\u0d96\\u0d9a-\\u0db1\\u0db3-\\u0dbb\\u0dbd\\u0dc0-\\u0dc6\\u0e01-\\u0e30\\u0e32\\u0e33\\u0e40-\\u0e46\\u0e81\\u0e82\\u0e84\\u0e86-\\u0e8a\\u0e8c-\\u0ea3\\u0ea5\\u0ea7-\\u0eb0\\u0eb2\\u0eb3\\u0ebd\\u0ec0-\\u0ec4\\u0ec6\\u0edc-\\u0edf\\u0f00\\u0f40-\\u0f47\\u0f49-\\u0f6c\\u0f88-\\u0f8c\\u1000-\\u102a\\u103f\\u1050-\\u1055\\u105a-\\u105d\\u1061\\u1065\\u1066\\u106e-\\u1070\\u1075-\\u1081\\u108e\\u10a0-\\u10c5\\u10c7\\u10cd\\u10d0-\\u10fa\\u10fc-\\u1248\\u124a-\\u124d\\u1250-\\u1256\\u1258\\u125a-\\u125d\\u1260-\\u1288\\u128a-\\u128d\\u1290-\\u12b0\\u12b2-\\u12b5\\u12b8-\\u12be\\u12c0\\u12c2-\\u12c5\\u12c8-\\u12d6\\u12d8-\\u1310\\u1312-\\u1315\\u1318-\\u135a\\u1380-\\u138f\\u13a0-\\u13f5\\u13f8-\\u13fd\\u1401-\\u166c\\u166f-\\u167f\\u1681-\\u169a\\u16a0-\\u16ea\\u16ee-\\u16f8\\u1700-\\u1711\\u171f-\\u1731\\u1740-\\u1751\\u1760-\\u176c\\u176e-\\u1770\\u1780-\\u17b3\\u17d7\\u17dc\\u1820-\\u1878\\u1880-\\u18a8\\u18aa\\u18b0-\\u18f5\\u1900-\\u191e\\u1950-\\u196d\\u1970-\\u1974\\u1980-\\u19ab\\u19b0-\\u19c9\\u1a00-\\u1a16\\u1a20-\\u1a54\\u1aa7\\u1b05-\\u1b33\\u1b45-\\u1b4c\\u1b83-\\u1ba0\\u1bae\\u1baf\\u1bba-\\u1be5\\u1c00-\\u1c23\\u1c4d-\\u1c4f\\u1c5a-\\u1c7d\\u1c80-\\u1c8a\\u1c90-\\u1cba\\u1cbd-\\u1cbf\\u1ce9-\\u1cec\\u1cee-\\u1cf3\\u1cf5\\u1cf6\\u1cfa\\u1d00-\\u1dbf\\u1e00-\\u1f15\\u1f18-\\u1f1d\\u1f20-\\u1f45\\u1f48-\\u1f4d\\u1f50-\\u1f57\\u1f59\\u1f5b\\u1f5d\\u1f5f-\\u1f7d\\u1f80-\\u1fb4\\u1fb6-\\u1fbc\\u1fbe\\u1fc2-\\u1fc4\\u1fc6-\\u1fcc\\u1fd0-\\u1fd3\\u1fd6-\\u1fdb\\u1fe0-\\u1fec\\u1ff2-\\u1ff4\\u1ff6-\\u1ffc\\u2071\\u207f\\u2090-\\u209c\\u2102\\u2107\\u210a-\\u2113\\u2115\\u2118-\\u211d\\u2124\\u2126\\u2128\\u212a-\\u2139\\u213c-\\u213f\\u2145-\\u2149\\u214e\\u2160-\\u2188\\u2c00-\\u2ce4\\u2ceb-\\u2cee\\u2cf2\\u2cf3\\u2d00-\\u2d25\\u2d27\\u2d2d\\u2d30-\\u2d67\\u2d6f\\u2d80-\\u2d96\\u2da0-\\u2da6\\u2da8-\\u2dae\\u2db0-\\u2db6\\u2db8-\\u2dbe\\u2dc0-\\u2dc6\\u2dc8-\\u2dce\\u2dd0-\\u2dd6\\u2dd8-\\u2dde\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303c\\u3041-\\u3096\\u309b-\\u309f\\u30a1-\\u30fa\\u30fc-\\u30ff\\u3105-\\u312f\\u3131-\\u318e\\u31a0-\\u31bf\\u31f0-\\u31ff\\u3400-\\u4dbf\\u4e00-\\ua48c\\ua4d0-\\ua4fd\\ua500-\\ua60c\\ua610-\\ua61f\\ua62a\\ua62b\\ua640-\\ua66e\\ua67f-\\ua69d\\ua6a0-\\ua6ef\\ua717-\\ua71f\\ua722-\\ua788\\ua78b-\\ua7cd\\ua7d0\\ua7d1\\ua7d3\\ua7d5-\\ua7dc\\ua7f2-\\ua801\\ua803-\\ua805\\ua807-\\ua80a\\ua80c-\\ua822\\ua840-\\ua873\\ua882-\\ua8b3\\ua8f2-\\ua8f7\\ua8fb\\ua8fd\\ua8fe\\ua90a-\\ua925\\ua930-\\ua946\\ua960-\\ua97c\\ua984-\\ua9b2\\ua9cf\\ua9e0-\\ua9e4\\ua9e6-\\ua9ef\\ua9fa-\\ua9fe\\uaa00-\\uaa28\\uaa40-\\uaa42\\uaa44-\\uaa4b\\uaa60-\\uaa76\\uaa7a\\uaa7e-\\uaaaf\\uaab1\\uaab5\\uaab6\\uaab9-\\uaabd\\uaac0\\uaac2\\uaadb-\\uaadd\\uaae0-\\uaaea\\uaaf2-\\uaaf4\\uab01-\\uab06\\uab09-\\uab0e\\uab11-\\uab16\\uab20-\\uab26\\uab28-\\uab2e\\uab30-\\uab5a\\uab5c-\\uab69\\uab70-\\uabe2\\uac00-\\ud7a3\\ud7b0-\\ud7c6\\ud7cb-\\ud7fb\\uf900-\\ufa6d\\ufa70-\\ufad9\\ufb00-\\ufb06\\ufb13-\\ufb17\\ufb1d\\ufb1f-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40\\ufb41\\ufb43\\ufb44\\ufb46-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\\uffda-\\uffdc\";\n/* prettier-ignore */\nlet nonASCIIidentifierChars = \"\\xb7\\u0300-\\u036f\\u0387\\u0483-\\u0487\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u0669\\u0670\\u06d6-\\u06dc\\u06df-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u06f0-\\u06f9\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07c0-\\u07c9\\u07eb-\\u07f3\\u07fd\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0859-\\u085b\\u0897-\\u089f\\u08ca-\\u08e1\\u08e3-\\u0903\\u093a-\\u093c\\u093e-\\u094f\\u0951-\\u0957\\u0962\\u0963\\u0966-\\u096f\\u0981-\\u0983\\u09bc\\u09be-\\u09c4\\u09c7\\u09c8\\u09cb-\\u09cd\\u09d7\\u09e2\\u09e3\\u09e6-\\u09ef\\u09fe\\u0a01-\\u0a03\\u0a3c\\u0a3e-\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a66-\\u0a71\\u0a75\\u0a81-\\u0a83\\u0abc\\u0abe-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\\u0ae2\\u0ae3\\u0ae6-\\u0aef\\u0afa-\\u0aff\\u0b01-\\u0b03\\u0b3c\\u0b3e-\\u0b44\\u0b47\\u0b48\\u0b4b-\\u0b4d\\u0b55-\\u0b57\\u0b62\\u0b63\\u0b66-\\u0b6f\\u0b82\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd7\\u0be6-\\u0bef\\u0c00-\\u0c04\\u0c3c\\u0c3e-\\u0c44\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0c66-\\u0c6f\\u0c81-\\u0c83\\u0cbc\\u0cbe-\\u0cc4\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0ce6-\\u0cef\\u0cf3\\u0d00-\\u0d03\\u0d3b\\u0d3c\\u0d3e-\\u0d44\\u0d46-\\u0d48\\u0d4a-\\u0d4d\\u0d57\\u0d62\\u0d63\\u0d66-\\u0d6f\\u0d81-\\u0d83\\u0dca\\u0dcf-\\u0dd4\\u0dd6\\u0dd8-\\u0ddf\\u0de6-\\u0def\\u0df2\\u0df3\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0e50-\\u0e59\\u0eb1\\u0eb4-\\u0ebc\\u0ec8-\\u0ece\\u0ed0-\\u0ed9\\u0f18\\u0f19\\u0f20-\\u0f29\\u0f35\\u0f37\\u0f39\\u0f3e\\u0f3f\\u0f71-\\u0f84\\u0f86\\u0f87\\u0f8d-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102b-\\u103e\\u1040-\\u1049\\u1056-\\u1059\\u105e-\\u1060\\u1062-\\u1064\\u1067-\\u106d\\u1071-\\u1074\\u1082-\\u108d\\u108f-\\u109d\\u135d-\\u135f\\u1369-\\u1371\\u1712-\\u1715\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b4-\\u17d3\\u17dd\\u17e0-\\u17e9\\u180b-\\u180d\\u180f-\\u1819\\u18a9\\u1920-\\u192b\\u1930-\\u193b\\u1946-\\u194f\\u19d0-\\u19da\\u1a17-\\u1a1b\\u1a55-\\u1a5e\\u1a60-\\u1a7c\\u1a7f-\\u1a89\\u1a90-\\u1a99\\u1ab0-\\u1abd\\u1abf-\\u1ace\\u1b00-\\u1b04\\u1b34-\\u1b44\\u1b50-\\u1b59\\u1b6b-\\u1b73\\u1b80-\\u1b82\\u1ba1-\\u1bad\\u1bb0-\\u1bb9\\u1be6-\\u1bf3\\u1c24-\\u1c37\\u1c40-\\u1c49\\u1c50-\\u1c59\\u1cd0-\\u1cd2\\u1cd4-\\u1ce8\\u1ced\\u1cf4\\u1cf7-\\u1cf9\\u1dc0-\\u1dff\\u200c\\u200d\\u203f\\u2040\\u2054\\u20d0-\\u20dc\\u20e1\\u20e5-\\u20f0\\u2cef-\\u2cf1\\u2d7f\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\u30fb\\ua620-\\ua629\\ua66f\\ua674-\\ua67d\\ua69e\\ua69f\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua823-\\ua827\\ua82c\\ua880\\ua881\\ua8b4-\\ua8c5\\ua8d0-\\ua8d9\\ua8e0-\\ua8f1\\ua8ff-\\ua909\\ua926-\\ua92d\\ua947-\\ua953\\ua980-\\ua983\\ua9b3-\\ua9c0\\ua9d0-\\ua9d9\\ua9e5\\ua9f0-\\ua9f9\\uaa29-\\uaa36\\uaa43\\uaa4c\\uaa4d\\uaa50-\\uaa59\\uaa7b-\\uaa7d\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uaaeb-\\uaaef\\uaaf5\\uaaf6\\uabe3-\\uabea\\uabec\\uabed\\uabf0-\\uabf9\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe2f\\ufe33\\ufe34\\ufe4d-\\ufe4f\\uff10-\\uff19\\uff3f\\uff65\";\n\nconst nonASCIIidentifierStart = new RegExp(\n \"[\" + nonASCIIidentifierStartChars + \"]\",\n);\nconst nonASCIIidentifier = new RegExp(\n \"[\" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + \"]\",\n);\n\nnonASCIIidentifierStartChars = nonASCIIidentifierChars = null;\n\n// These are a run-length and offset-encoded representation of the\n// >0xffff code points that are a valid part of identifiers. The\n// offset starts at 0x10000, and each pair of numbers represents an\n// offset to the next range, and then a size of the range. They were\n// generated by `scripts/generate-identifier-regex.cjs`.\n/* prettier-ignore */\nconst astralIdentifierStartCodes = [0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,14,29,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,13,10,2,14,2,6,2,1,2,10,2,14,2,6,2,1,4,51,13,310,10,21,11,7,25,5,2,41,2,8,70,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,71,55,7,1,65,0,16,3,2,2,2,28,43,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,14,35,39,27,10,22,251,41,7,1,17,2,60,28,11,0,9,21,43,17,47,20,28,22,13,52,58,1,3,0,14,44,33,24,27,35,30,0,3,0,9,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,20,1,64,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,31,9,2,0,3,0,2,37,2,0,26,0,2,0,45,52,19,3,21,2,31,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,14,0,72,26,38,6,186,43,117,63,32,7,3,0,3,7,2,1,2,23,16,0,2,0,95,7,3,38,17,0,2,0,29,0,11,39,8,0,22,0,12,45,20,0,19,72,200,32,32,8,2,36,18,0,50,29,113,6,2,1,2,37,22,0,26,5,2,1,2,31,15,0,328,18,16,0,2,12,2,33,125,0,80,921,103,110,18,195,2637,96,16,1071,18,5,26,3994,6,582,6842,29,1763,568,8,30,18,78,18,29,19,47,17,3,32,20,6,18,433,44,212,63,129,74,6,0,67,12,65,1,2,0,29,6135,9,1237,42,9,8936,3,2,6,2,1,2,290,16,0,30,2,3,0,15,3,9,395,2309,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,1845,30,7,5,262,61,147,44,11,6,17,0,322,29,19,43,485,27,229,29,3,0,496,6,2,3,2,1,2,14,2,196,60,67,8,0,1205,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42719,33,4153,7,221,3,5761,15,7472,16,621,2467,541,1507,4938,6,4191];\n/* prettier-ignore */\nconst astralIdentifierCodes = [509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,574,3,9,9,7,9,32,4,318,1,80,3,71,10,50,3,123,2,54,14,32,10,3,1,11,3,46,10,8,0,46,9,7,2,37,13,2,9,6,1,45,0,13,2,49,13,9,3,2,11,83,11,7,0,3,0,158,11,6,9,7,3,56,1,2,6,3,1,3,2,10,0,11,1,3,6,4,4,68,8,2,0,3,0,2,3,2,4,2,0,15,1,83,17,10,9,5,0,82,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,7,19,58,14,5,9,243,14,166,9,71,5,2,1,3,3,2,0,2,1,13,9,120,6,3,6,4,0,29,9,41,6,2,3,9,0,10,10,47,15,343,9,54,7,2,7,17,9,57,21,2,13,123,5,4,0,2,1,2,6,2,0,9,9,49,4,2,1,2,4,9,9,330,3,10,1,2,0,49,6,4,4,14,10,5350,0,7,14,11465,27,2343,9,87,9,39,4,60,6,26,9,535,9,470,0,2,54,8,3,82,0,12,1,19628,1,4178,9,519,45,3,22,543,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,101,0,161,6,10,9,357,0,62,13,499,13,245,1,2,9,726,6,110,6,6,9,4759,9,787719,239];\n\n// This has a complexity linear to the value of the code. The\n// assumption is that looking up astral identifier characters is\n// rare.\nfunction isInAstralSet(code: number, set: readonly number[]): boolean {\n let pos = 0x10000;\n for (let i = 0, length = set.length; i < length; i += 2) {\n pos += set[i];\n if (pos > code) return false;\n\n pos += set[i + 1];\n if (pos >= code) return true;\n }\n return false;\n}\n\n// Test whether a given character code starts an identifier.\n\nexport function isIdentifierStart(code: number): boolean {\n if (code < charCodes.uppercaseA) return code === charCodes.dollarSign;\n if (code <= charCodes.uppercaseZ) return true;\n if (code < charCodes.lowercaseA) return code === charCodes.underscore;\n if (code <= charCodes.lowercaseZ) return true;\n if (code <= 0xffff) {\n return (\n code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code))\n );\n }\n return isInAstralSet(code, astralIdentifierStartCodes);\n}\n\n// Test whether a given character is part of an identifier.\n\nexport function isIdentifierChar(code: number): boolean {\n if (code < charCodes.digit0) return code === charCodes.dollarSign;\n if (code < charCodes.colon) return true;\n if (code < charCodes.uppercaseA) return false;\n if (code <= charCodes.uppercaseZ) return true;\n if (code < charCodes.lowercaseA) return code === charCodes.underscore;\n if (code <= charCodes.lowercaseZ) return true;\n if (code <= 0xffff) {\n return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code));\n }\n return (\n isInAstralSet(code, astralIdentifierStartCodes) ||\n isInAstralSet(code, astralIdentifierCodes)\n );\n}\n\n// Test whether a given string is a valid identifier name\n\nexport function isIdentifierName(name: string): boolean {\n let isFirst = true;\n for (let i = 0; i < name.length; i++) {\n // The implementation is based on\n // https://source.chromium.org/chromium/chromium/src/+/master:v8/src/builtins/builtins-string-gen.cc;l=1455;drc=221e331b49dfefadbc6fa40b0c68e6f97606d0b3;bpv=0;bpt=1\n // We reimplement `codePointAt` because `codePointAt` is a V8 builtin which is not inlined by TurboFan (as of M91)\n // since `name` is mostly ASCII, an inlined `charCodeAt` wins here\n let cp = name.charCodeAt(i);\n if ((cp & 0xfc00) === 0xd800 && i + 1 < name.length) {\n const trail = name.charCodeAt(++i);\n if ((trail & 0xfc00) === 0xdc00) {\n cp = 0x10000 + ((cp & 0x3ff) << 10) + (trail & 0x3ff);\n }\n }\n if (isFirst) {\n isFirst = false;\n if (!isIdentifierStart(cp)) {\n return false;\n }\n } else if (!isIdentifierChar(cp)) {\n return false;\n }\n }\n return !isFirst;\n}\n","const reservedWords = {\n keyword: [\n \"break\",\n \"case\",\n \"catch\",\n \"continue\",\n \"debugger\",\n \"default\",\n \"do\",\n \"else\",\n \"finally\",\n \"for\",\n \"function\",\n \"if\",\n \"return\",\n \"switch\",\n \"throw\",\n \"try\",\n \"var\",\n \"const\",\n \"while\",\n \"with\",\n \"new\",\n \"this\",\n \"super\",\n \"class\",\n \"extends\",\n \"export\",\n \"import\",\n \"null\",\n \"true\",\n \"false\",\n \"in\",\n \"instanceof\",\n \"typeof\",\n \"void\",\n \"delete\",\n ],\n strict: [\n \"implements\",\n \"interface\",\n \"let\",\n \"package\",\n \"private\",\n \"protected\",\n \"public\",\n \"static\",\n \"yield\",\n ],\n strictBind: [\"eval\", \"arguments\"],\n};\nconst keywords = new Set(reservedWords.keyword);\nconst reservedWordsStrictSet = new Set(reservedWords.strict);\nconst reservedWordsStrictBindSet = new Set(reservedWords.strictBind);\n\n/**\n * Checks if word is a reserved word in non-strict mode\n */\nexport function isReservedWord(word: string, inModule: boolean): boolean {\n return (inModule && word === \"await\") || word === \"enum\";\n}\n\n/**\n * Checks if word is a reserved word in non-binding strict mode\n *\n * Includes non-strict reserved words\n */\nexport function isStrictReservedWord(word: string, inModule: boolean): boolean {\n return isReservedWord(word, inModule) || reservedWordsStrictSet.has(word);\n}\n\n/**\n * Checks if word is a reserved word in binding strict mode, but it is allowed as\n * a normal identifier.\n */\nexport function isStrictBindOnlyReservedWord(word: string): boolean {\n return reservedWordsStrictBindSet.has(word);\n}\n\n/**\n * Checks if word is a reserved word in binding strict mode\n *\n * Includes non-strict reserved words and non-binding strict reserved words\n */\nexport function isStrictBindReservedWord(\n word: string,\n inModule: boolean,\n): boolean {\n return (\n isStrictReservedWord(word, inModule) || isStrictBindOnlyReservedWord(word)\n );\n}\n\nexport function isKeyword(word: string): boolean {\n return keywords.has(word);\n}\n","import * as charCodes from \"charcodes\";\nimport { isIdentifierStart } from \"@babel/helper-validator-identifier\";\n\nexport {\n isIdentifierStart,\n isIdentifierChar,\n isReservedWord,\n isStrictBindOnlyReservedWord,\n isStrictBindReservedWord,\n isStrictReservedWord,\n isKeyword,\n} from \"@babel/helper-validator-identifier\";\n\nexport const keywordRelationalOperator = /^in(stanceof)?$/;\n\n// Test whether a current state character code and next character code is @\n\nexport function isIteratorStart(\n current: number,\n next: number,\n next2: number,\n): boolean {\n return (\n current === charCodes.atSign &&\n next === charCodes.atSign &&\n isIdentifierStart(next2)\n );\n}\n\n// This is the comprehensive set of JavaScript reserved words\n// If a word is in this set, it could be a reserved word,\n// depending on sourceType/strictMode/binding info. In other words\n// if a word is not in this set, it is not a reserved word under\n// any circumstance.\nconst reservedWordLikeSet = new Set([\n \"break\",\n \"case\",\n \"catch\",\n \"continue\",\n \"debugger\",\n \"default\",\n \"do\",\n \"else\",\n \"finally\",\n \"for\",\n \"function\",\n \"if\",\n \"return\",\n \"switch\",\n \"throw\",\n \"try\",\n \"var\",\n \"const\",\n \"while\",\n \"with\",\n \"new\",\n \"this\",\n \"super\",\n \"class\",\n \"extends\",\n \"export\",\n \"import\",\n \"null\",\n \"true\",\n \"false\",\n \"in\",\n \"instanceof\",\n \"typeof\",\n \"void\",\n \"delete\",\n // strict\n \"implements\",\n \"interface\",\n \"let\",\n \"package\",\n \"private\",\n \"protected\",\n \"public\",\n \"static\",\n \"yield\",\n // strictBind\n \"eval\",\n \"arguments\",\n // reservedWorkLike\n \"enum\",\n \"await\",\n]);\n\nexport function canBeReservedWord(word: string): boolean {\n return reservedWordLikeSet.has(word);\n}\n","import { ScopeFlag, BindingFlag } from \"./scopeflags.ts\";\nimport type { Position } from \"./location.ts\";\nimport type * as N from \"../types.ts\";\nimport { Errors } from \"../parse-error.ts\";\nimport type Tokenizer from \"../tokenizer/index.ts\";\n\nexport const enum NameType {\n // var-declared names in the current lexical scope\n Var = 1 << 0,\n // lexically-declared names in the current lexical scope\n Lexical = 1 << 1,\n // lexically-declared FunctionDeclaration names in the current lexical scope\n Function = 1 << 2,\n}\n\n// Start an AST node, attaching a start offset.\nexport class Scope {\n flags: ScopeFlag = 0;\n names: Map = new Map();\n firstLexicalName = \"\";\n\n constructor(flags: ScopeFlag) {\n this.flags = flags;\n }\n}\n\n// The functions in this module keep track of declared variables in the\n// current scope in order to detect duplicate variable names.\nexport default class ScopeHandler {\n parser: Tokenizer;\n scopeStack: Array = [];\n inModule: boolean;\n undefinedExports: Map = new Map();\n\n constructor(parser: Tokenizer, inModule: boolean) {\n this.parser = parser;\n this.inModule = inModule;\n }\n\n get inTopLevel() {\n return (this.currentScope().flags & ScopeFlag.PROGRAM) > 0;\n }\n get inFunction() {\n return (this.currentVarScopeFlags() & ScopeFlag.FUNCTION_BASE) > 0;\n }\n get allowSuper() {\n return (this.currentThisScopeFlags() & ScopeFlag.SUPER) > 0;\n }\n get allowDirectSuper() {\n return (this.currentThisScopeFlags() & ScopeFlag.DIRECT_SUPER) > 0;\n }\n get allowNewTarget() {\n return (this.currentThisScopeFlags() & ScopeFlag.NEW_TARGET) > 0;\n }\n get inClass() {\n return (this.currentThisScopeFlags() & ScopeFlag.CLASS_BASE) > 0;\n }\n get inClassAndNotInNonArrowFunction() {\n const flags = this.currentThisScopeFlags();\n return (\n (flags & ScopeFlag.CLASS_BASE) > 0 &&\n (flags & ScopeFlag.FUNCTION_BASE) === 0\n );\n }\n get inStaticBlock() {\n for (let i = this.scopeStack.length - 1; ; i--) {\n const { flags } = this.scopeStack[i];\n if (flags & ScopeFlag.STATIC_BLOCK) {\n return true;\n }\n if (flags & (ScopeFlag.VAR | ScopeFlag.CLASS_BASE)) {\n // function body, module body, class property initializers\n return false;\n }\n }\n }\n get inNonArrowFunction() {\n return (this.currentThisScopeFlags() & ScopeFlag.FUNCTION_BASE) > 0;\n }\n get inBareCaseStatement() {\n return (this.currentScope().flags & ScopeFlag.SWITCH) > 0;\n }\n get treatFunctionsAsVar() {\n return this.treatFunctionsAsVarInScope(this.currentScope());\n }\n\n createScope(flags: ScopeFlag): Scope {\n return new Scope(flags);\n }\n\n enter(flags: ScopeFlag) {\n /*:: +createScope: (flags:ScopeFlag) => IScope; */\n // @ts-expect-error This method will be overwritten by subclasses\n this.scopeStack.push(this.createScope(flags));\n }\n\n exit(): ScopeFlag {\n const scope = this.scopeStack.pop();\n return scope.flags;\n }\n\n // The spec says:\n // > At the top level of a function, or script, function declarations are\n // > treated like var declarations rather than like lexical declarations.\n treatFunctionsAsVarInScope(scope: IScope): boolean {\n return !!(\n scope.flags & (ScopeFlag.FUNCTION_BASE | ScopeFlag.STATIC_BLOCK) ||\n (!this.parser.inModule && scope.flags & ScopeFlag.PROGRAM)\n );\n }\n\n declareName(name: string, bindingType: BindingFlag, loc: Position) {\n let scope = this.currentScope();\n if (\n bindingType & BindingFlag.SCOPE_LEXICAL ||\n bindingType & BindingFlag.SCOPE_FUNCTION\n ) {\n this.checkRedeclarationInScope(scope, name, bindingType, loc);\n\n let type = scope.names.get(name) || 0;\n\n if (bindingType & BindingFlag.SCOPE_FUNCTION) {\n type = type | NameType.Function;\n } else {\n if (!scope.firstLexicalName) {\n scope.firstLexicalName = name;\n }\n type = type | NameType.Lexical;\n }\n\n scope.names.set(name, type);\n\n if (bindingType & BindingFlag.SCOPE_LEXICAL) {\n this.maybeExportDefined(scope, name);\n }\n } else if (bindingType & BindingFlag.SCOPE_VAR) {\n for (let i = this.scopeStack.length - 1; i >= 0; --i) {\n scope = this.scopeStack[i];\n this.checkRedeclarationInScope(scope, name, bindingType, loc);\n scope.names.set(name, (scope.names.get(name) || 0) | NameType.Var);\n this.maybeExportDefined(scope, name);\n\n if (scope.flags & ScopeFlag.VAR) break;\n }\n }\n if (this.parser.inModule && scope.flags & ScopeFlag.PROGRAM) {\n this.undefinedExports.delete(name);\n }\n }\n\n maybeExportDefined(scope: IScope, name: string) {\n if (this.parser.inModule && scope.flags & ScopeFlag.PROGRAM) {\n this.undefinedExports.delete(name);\n }\n }\n\n checkRedeclarationInScope(\n scope: IScope,\n name: string,\n bindingType: BindingFlag,\n loc: Position,\n ) {\n if (this.isRedeclaredInScope(scope, name, bindingType)) {\n this.parser.raise(Errors.VarRedeclaration, loc, {\n identifierName: name,\n });\n }\n }\n\n isRedeclaredInScope(\n scope: IScope,\n name: string,\n bindingType: BindingFlag,\n ): boolean {\n if (!(bindingType & BindingFlag.KIND_VALUE)) return false;\n\n if (bindingType & BindingFlag.SCOPE_LEXICAL) {\n return scope.names.has(name);\n }\n\n const type = scope.names.get(name);\n\n if (bindingType & BindingFlag.SCOPE_FUNCTION) {\n return (\n (type & NameType.Lexical) > 0 ||\n (!this.treatFunctionsAsVarInScope(scope) && (type & NameType.Var) > 0)\n );\n }\n\n return (\n ((type & NameType.Lexical) > 0 &&\n // Annex B.3.4\n // https://tc39.es/ecma262/#sec-variablestatements-in-catch-blocks\n !(\n scope.flags & ScopeFlag.SIMPLE_CATCH &&\n scope.firstLexicalName === name\n )) ||\n (!this.treatFunctionsAsVarInScope(scope) &&\n (type & NameType.Function) > 0)\n );\n }\n\n checkLocalExport(id: N.Identifier) {\n const { name } = id;\n const topLevelScope = this.scopeStack[0];\n if (!topLevelScope.names.has(name)) {\n this.undefinedExports.set(name, id.loc.start);\n }\n }\n\n currentScope(): IScope {\n return this.scopeStack[this.scopeStack.length - 1];\n }\n\n currentVarScopeFlags(): ScopeFlag {\n for (let i = this.scopeStack.length - 1; ; i--) {\n const { flags } = this.scopeStack[i];\n if (flags & ScopeFlag.VAR) {\n return flags;\n }\n }\n }\n\n // Could be useful for `arguments`, `this`, `new.target`, `super()`, `super.property`, and `super[property]`.\n currentThisScopeFlags(): ScopeFlag {\n for (let i = this.scopeStack.length - 1; ; i--) {\n const { flags } = this.scopeStack[i];\n if (\n flags & (ScopeFlag.VAR | ScopeFlag.CLASS_BASE) &&\n !(flags & ScopeFlag.ARROW)\n ) {\n return flags;\n }\n }\n }\n}\n","import type { Position } from \"../../util/location.ts\";\nimport ScopeHandler, { NameType, Scope } from \"../../util/scope.ts\";\nimport { BindingFlag, type ScopeFlag } from \"../../util/scopeflags.ts\";\nimport type * as N from \"../../types.ts\";\n\n// Reference implementation: https://github.com/facebook/flow/blob/23aeb2a2ef6eb4241ce178fde5d8f17c5f747fb5/src/typing/env.ml#L536-L584\nclass FlowScope extends Scope {\n // declare function foo(): type;\n declareFunctions: Set = new Set();\n}\n\nexport default class FlowScopeHandler extends ScopeHandler {\n createScope(flags: ScopeFlag): FlowScope {\n return new FlowScope(flags);\n }\n\n declareName(name: string, bindingType: BindingFlag, loc: Position) {\n const scope = this.currentScope();\n if (bindingType & BindingFlag.FLAG_FLOW_DECLARE_FN) {\n this.checkRedeclarationInScope(scope, name, bindingType, loc);\n this.maybeExportDefined(scope, name);\n scope.declareFunctions.add(name);\n return;\n }\n\n super.declareName(name, bindingType, loc);\n }\n\n isRedeclaredInScope(\n scope: FlowScope,\n name: string,\n bindingType: BindingFlag,\n ): boolean {\n if (super.isRedeclaredInScope(scope, name, bindingType)) return true;\n\n if (\n bindingType & BindingFlag.FLAG_FLOW_DECLARE_FN &&\n !scope.declareFunctions.has(name)\n ) {\n const type = scope.names.get(name);\n return (type & NameType.Function) > 0 || (type & NameType.Lexical) > 0;\n }\n\n return false;\n }\n\n checkLocalExport(id: N.Identifier) {\n if (!this.scopeStack[0].declareFunctions.has(id.name)) {\n super.checkLocalExport(id);\n }\n }\n}\n","/*:: declare var invariant; */\n\nimport type Parser from \"../../parser/index.ts\";\nimport {\n tokenIsIdentifier,\n tokenIsKeyword,\n tokenIsKeywordOrIdentifier,\n tokenIsLiteralPropertyName,\n tokenLabelName,\n tt,\n type TokenType,\n tokenIsFlowInterfaceOrTypeOrOpaque,\n} from \"../../tokenizer/types.ts\";\nimport type * as N from \"../../types.ts\";\nimport type { Position } from \"../../util/location.ts\";\nimport { types as tc } from \"../../tokenizer/context.ts\";\nimport * as charCodes from \"charcodes\";\nimport { isIteratorStart } from \"../../util/identifier.ts\";\nimport FlowScopeHandler from \"./scope.ts\";\nimport { BindingFlag, ScopeFlag } from \"../../util/scopeflags.ts\";\nimport type { ExpressionErrors } from \"../../parser/util.ts\";\nimport type { ParseStatementFlag } from \"../../parser/statement.ts\";\nimport { Errors, ParseErrorEnum } from \"../../parse-error.ts\";\nimport type { Undone } from \"../../parser/node.ts\";\nimport type { ClassWithMixin, IJSXParserMixin } from \"../jsx/index.ts\";\n\nconst reservedTypes = new Set([\n \"_\",\n \"any\",\n \"bool\",\n \"boolean\",\n \"empty\",\n \"extends\",\n \"false\",\n \"interface\",\n \"mixed\",\n \"null\",\n \"number\",\n \"static\",\n \"string\",\n \"true\",\n \"typeof\",\n \"void\",\n]);\n\n/* eslint sort-keys: \"error\" */\n// The Errors key follows https://github.com/facebook/flow/blob/master/src/parser/parse_error.ml unless it does not exist\nconst FlowErrors = ParseErrorEnum`flow`({\n AmbiguousConditionalArrow:\n \"Ambiguous expression: wrap the arrow functions in parentheses to disambiguate.\",\n AmbiguousDeclareModuleKind:\n \"Found both `declare module.exports` and `declare export` in the same module. Modules can only have 1 since they are either an ES module or they are a CommonJS module.\",\n // TODO: When we get proper string enums in typescript make this ReservedType.\n // Not really worth it to do the whole $Values dance with reservedTypes set.\n AssignReservedType: ({ reservedType }: { reservedType: string }) =>\n `Cannot overwrite reserved type ${reservedType}.`,\n DeclareClassElement:\n \"The `declare` modifier can only appear on class fields.\",\n DeclareClassFieldInitializer:\n \"Initializers are not allowed in fields with the `declare` modifier.\",\n DuplicateDeclareModuleExports:\n \"Duplicate `declare module.exports` statement.\",\n EnumBooleanMemberNotInitialized: ({\n memberName,\n enumName,\n }: {\n memberName: string;\n enumName: string;\n }) =>\n `Boolean enum members need to be initialized. Use either \\`${memberName} = true,\\` or \\`${memberName} = false,\\` in enum \\`${enumName}\\`.`,\n EnumDuplicateMemberName: ({\n memberName,\n enumName,\n }: {\n memberName: string;\n enumName: string;\n }) =>\n `Enum member names need to be unique, but the name \\`${memberName}\\` has already been used before in enum \\`${enumName}\\`.`,\n EnumInconsistentMemberValues: ({ enumName }: { enumName: string }) =>\n `Enum \\`${enumName}\\` has inconsistent member initializers. Either use no initializers, or consistently use literals (either booleans, numbers, or strings) for all member initializers.`,\n EnumInvalidExplicitType: ({\n invalidEnumType,\n enumName,\n }: {\n invalidEnumType: string;\n enumName: string;\n }) =>\n `Enum type \\`${invalidEnumType}\\` is not valid. Use one of \\`boolean\\`, \\`number\\`, \\`string\\`, or \\`symbol\\` in enum \\`${enumName}\\`.`,\n EnumInvalidExplicitTypeUnknownSupplied: ({\n enumName,\n }: {\n enumName: string;\n }) =>\n `Supplied enum type is not valid. Use one of \\`boolean\\`, \\`number\\`, \\`string\\`, or \\`symbol\\` in enum \\`${enumName}\\`.`,\n\n // TODO: When moving to typescript, we should either have each of the\n // following errors only accept the specific strings they want:\n //\n // ...PrimaryType: explicitType: \"string\" | \"number\" | \"boolean\"\n // ...SymbolType: explicitType: \"symbol\"\n // ...UnknownType: explicitType: null\n //\n // Or, alternatively, merge these three errors together into one\n // `EnumInvalidMemberInitializer` error that can accept `EnumExplicitType`\n // without alteration, and then just have its message change based on the\n // explicitType.\n EnumInvalidMemberInitializerPrimaryType: ({\n enumName,\n memberName,\n explicitType,\n }: {\n enumName: string;\n memberName: string;\n explicitType: EnumExplicitType;\n }) =>\n `Enum \\`${enumName}\\` has type \\`${explicitType}\\`, so the initializer of \\`${memberName}\\` needs to be a ${explicitType} literal.`,\n EnumInvalidMemberInitializerSymbolType: ({\n enumName,\n memberName,\n }: {\n enumName: string;\n memberName: string;\n explicitType: EnumExplicitType;\n }) =>\n `Symbol enum members cannot be initialized. Use \\`${memberName},\\` in enum \\`${enumName}\\`.`,\n EnumInvalidMemberInitializerUnknownType: ({\n enumName,\n memberName,\n }: {\n enumName: string;\n memberName: string;\n explicitType: EnumExplicitType;\n }) =>\n `The enum member initializer for \\`${memberName}\\` needs to be a literal (either a boolean, number, or string) in enum \\`${enumName}\\`.`,\n EnumInvalidMemberName: ({\n enumName,\n memberName,\n suggestion,\n }: {\n enumName: string;\n memberName: string;\n suggestion: string;\n }) =>\n `Enum member names cannot start with lowercase 'a' through 'z'. Instead of using \\`${memberName}\\`, consider using \\`${suggestion}\\`, in enum \\`${enumName}\\`.`,\n EnumNumberMemberNotInitialized: ({\n enumName,\n memberName,\n }: {\n enumName: string;\n memberName: string;\n }) =>\n `Number enum members need to be initialized, e.g. \\`${memberName} = 1\\` in enum \\`${enumName}\\`.`,\n EnumStringMemberInconsistentlyInitialized: ({\n enumName,\n }: {\n enumName: string;\n }) =>\n `String enum members need to consistently either all use initializers, or use no initializers, in enum \\`${enumName}\\`.`,\n GetterMayNotHaveThisParam: \"A getter cannot have a `this` parameter.\",\n ImportReflectionHasImportType:\n \"An `import module` declaration can not use `type` or `typeof` keyword.\",\n ImportTypeShorthandOnlyInPureImport:\n \"The `type` and `typeof` keywords on named imports can only be used on regular `import` statements. It cannot be used with `import type` or `import typeof` statements.\",\n InexactInsideExact:\n \"Explicit inexact syntax cannot appear inside an explicit exact object type.\",\n InexactInsideNonObject:\n \"Explicit inexact syntax cannot appear in class or interface definitions.\",\n InexactVariance: \"Explicit inexact syntax cannot have variance.\",\n InvalidNonTypeImportInDeclareModule:\n \"Imports within a `declare module` body must always be `import type` or `import typeof`.\",\n MissingTypeParamDefault:\n \"Type parameter declaration needs a default, since a preceding type parameter declaration has a default.\",\n NestedDeclareModule:\n \"`declare module` cannot be used inside another `declare module`.\",\n NestedFlowComment: \"Cannot have a flow comment inside another flow comment.\",\n PatternIsOptional: {\n message:\n \"A binding pattern parameter cannot be optional in an implementation signature.\",\n // For consistency in TypeScript and Flow error codes\n ...(!process.env.BABEL_8_BREAKING\n ? { reasonCode: \"OptionalBindingPattern\" }\n : {}),\n },\n SetterMayNotHaveThisParam: \"A setter cannot have a `this` parameter.\",\n SpreadVariance: \"Spread properties cannot have variance.\",\n ThisParamAnnotationRequired:\n \"A type annotation is required for the `this` parameter.\",\n ThisParamBannedInConstructor:\n \"Constructors cannot have a `this` parameter; constructors don't bind `this` like other functions.\",\n ThisParamMayNotBeOptional: \"The `this` parameter cannot be optional.\",\n ThisParamMustBeFirst:\n \"The `this` parameter must be the first function parameter.\",\n ThisParamNoDefault: \"The `this` parameter may not have a default value.\",\n TypeBeforeInitializer:\n \"Type annotations must come before default assignments, e.g. instead of `age = 25: number` use `age: number = 25`.\",\n TypeCastInPattern:\n \"The type cast expression is expected to be wrapped with parenthesis.\",\n UnexpectedExplicitInexactInObject:\n \"Explicit inexact syntax must appear at the end of an inexact object.\",\n UnexpectedReservedType: ({ reservedType }: { reservedType: string }) =>\n `Unexpected reserved type ${reservedType}.`,\n UnexpectedReservedUnderscore:\n \"`_` is only allowed as a type argument to call or new.\",\n UnexpectedSpaceBetweenModuloChecks:\n \"Spaces between `%` and `checks` are not allowed here.\",\n UnexpectedSpreadType:\n \"Spread operator cannot appear in class or interface definitions.\",\n UnexpectedSubtractionOperand:\n 'Unexpected token, expected \"number\" or \"bigint\".',\n UnexpectedTokenAfterTypeParameter:\n \"Expected an arrow function after this type parameter declaration.\",\n UnexpectedTypeParameterBeforeAsyncArrowFunction:\n \"Type parameters must come after the async keyword, e.g. instead of ` async () => {}`, use `async () => {}`.\",\n UnsupportedDeclareExportKind: ({\n unsupportedExportKind,\n suggestion,\n }: {\n unsupportedExportKind: string;\n suggestion: string;\n }) =>\n `\\`declare export ${unsupportedExportKind}\\` is not supported. Use \\`${suggestion}\\` instead.`,\n UnsupportedStatementInDeclareModule:\n \"Only declares and type imports are allowed inside declare module.\",\n UnterminatedFlowComment: \"Unterminated flow-comment.\",\n});\n/* eslint-disable sort-keys */\n\nfunction isEsModuleType(bodyElement: N.Node): boolean {\n return (\n bodyElement.type === \"DeclareExportAllDeclaration\" ||\n (bodyElement.type === \"DeclareExportDeclaration\" &&\n (!bodyElement.declaration ||\n (bodyElement.declaration.type !== \"TypeAlias\" &&\n bodyElement.declaration.type !== \"InterfaceDeclaration\")))\n );\n}\n\nfunction hasTypeImportKind(\n node: Undone,\n): boolean {\n return node.importKind === \"type\" || node.importKind === \"typeof\";\n}\n\nconst exportSuggestions = {\n const: \"declare export var\",\n let: \"declare export var\",\n type: \"export type\",\n interface: \"export interface\",\n};\n\n// Like Array#filter, but returns a tuple [ acceptedElements, discardedElements ]\nfunction partition(\n list: T[],\n test: (c: T, b: number, a: T[]) => boolean | undefined | null,\n): [T[], T[]] {\n const list1: T[] = [];\n const list2: T[] = [];\n for (let i = 0; i < list.length; i++) {\n (test(list[i], i, list) ? list1 : list2).push(list[i]);\n }\n return [list1, list2];\n}\n\nconst FLOW_PRAGMA_REGEX = /\\*?\\s*@((?:no)?flow)\\b/;\n\n// Flow enums types\ntype EnumExplicitType = null | \"boolean\" | \"number\" | \"string\" | \"symbol\";\n\ntype EnumContext = {\n enumName: string;\n explicitType: EnumExplicitType;\n memberName: string;\n};\n\ntype EnumMemberInit =\n | {\n type: \"number\";\n loc: Position;\n value: N.Node;\n }\n | {\n type: \"string\";\n loc: Position;\n value: N.Node;\n }\n | {\n type: \"boolean\";\n loc: Position;\n value: N.Node;\n }\n | {\n type: \"invalid\";\n loc: Position;\n }\n | {\n type: \"none\";\n loc: Position;\n };\n\nexport default (superClass: ClassWithMixin) =>\n class FlowParserMixin extends superClass implements Parser {\n // The value of the @flow/@noflow pragma. Initially undefined, transitions\n // to \"@flow\" or \"@noflow\" if we see a pragma. Transitions to null if we are\n // past the initial comment.\n flowPragma: void | null | \"flow\" | \"noflow\" = undefined;\n\n getScopeHandler(): new (...args: any) => FlowScopeHandler {\n return FlowScopeHandler;\n }\n\n shouldParseTypes(): boolean {\n return this.getPluginOption(\"flow\", \"all\") || this.flowPragma === \"flow\";\n }\n\n finishToken(type: TokenType, val: any): void {\n if (\n type !== tt.string &&\n type !== tt.semi &&\n type !== tt.interpreterDirective\n ) {\n if (this.flowPragma === undefined) {\n this.flowPragma = null;\n }\n }\n super.finishToken(type, val);\n }\n\n addComment(comment: N.Comment): void {\n if (this.flowPragma === undefined) {\n // Try to parse a flow pragma.\n const matches = FLOW_PRAGMA_REGEX.exec(comment.value);\n if (!matches) {\n // do nothing\n } else if (matches[1] === \"flow\") {\n this.flowPragma = \"flow\";\n } else if (matches[1] === \"noflow\") {\n this.flowPragma = \"noflow\";\n } else {\n throw new Error(\"Unexpected flow pragma\");\n }\n }\n super.addComment(comment);\n }\n\n flowParseTypeInitialiser(tok?: TokenType): N.FlowType {\n const oldInType = this.state.inType;\n this.state.inType = true;\n this.expect(tok || tt.colon);\n\n const type = this.flowParseType();\n this.state.inType = oldInType;\n return type;\n }\n\n flowParsePredicate(): N.FlowPredicate {\n const node = this.startNode();\n const moduloLoc = this.state.startLoc;\n this.next(); // eat `%`\n this.expectContextual(tt._checks);\n // Force '%' and 'checks' to be adjacent\n if (this.state.lastTokStartLoc.index > moduloLoc.index + 1) {\n this.raise(FlowErrors.UnexpectedSpaceBetweenModuloChecks, moduloLoc);\n }\n if (this.eat(tt.parenL)) {\n node.value = super.parseExpression();\n this.expect(tt.parenR);\n return this.finishNode(node, \"DeclaredPredicate\");\n } else {\n return this.finishNode(node, \"InferredPredicate\");\n }\n }\n\n flowParseTypeAndPredicateInitialiser(): [\n N.FlowType | undefined | null,\n N.FlowPredicate | undefined | null,\n ] {\n const oldInType = this.state.inType;\n this.state.inType = true;\n this.expect(tt.colon);\n let type = null;\n let predicate = null;\n if (this.match(tt.modulo)) {\n this.state.inType = oldInType;\n predicate = this.flowParsePredicate();\n } else {\n type = this.flowParseType();\n this.state.inType = oldInType;\n if (this.match(tt.modulo)) {\n predicate = this.flowParsePredicate();\n }\n }\n return [type, predicate];\n }\n\n flowParseDeclareClass(\n node: Undone,\n ): N.FlowDeclareClass {\n this.next();\n this.flowParseInterfaceish(node, /*isClass*/ true);\n return this.finishNode(node, \"DeclareClass\");\n }\n\n flowParseDeclareFunction(\n node: Undone,\n ): N.FlowDeclareFunction {\n this.next();\n\n const id = (node.id = this.parseIdentifier());\n\n const typeNode = this.startNode();\n const typeContainer = this.startNode();\n\n if (this.match(tt.lt)) {\n typeNode.typeParameters = this.flowParseTypeParameterDeclaration();\n } else {\n typeNode.typeParameters = null;\n }\n\n this.expect(tt.parenL);\n const tmp = this.flowParseFunctionTypeParams();\n typeNode.params = tmp.params;\n typeNode.rest = tmp.rest;\n typeNode.this = tmp._this;\n this.expect(tt.parenR);\n\n [typeNode.returnType, node.predicate] =\n this.flowParseTypeAndPredicateInitialiser();\n\n typeContainer.typeAnnotation = this.finishNode(\n typeNode,\n \"FunctionTypeAnnotation\",\n );\n\n id.typeAnnotation = this.finishNode(typeContainer, \"TypeAnnotation\");\n\n this.resetEndLocation(id);\n this.semicolon();\n\n this.scope.declareName(\n node.id.name,\n BindingFlag.TYPE_FLOW_DECLARE_FN,\n node.id.loc.start,\n );\n\n return this.finishNode(node, \"DeclareFunction\");\n }\n\n flowParseDeclare(\n node: Undone,\n insideModule?: boolean,\n ): N.FlowDeclare {\n if (this.match(tt._class)) {\n return this.flowParseDeclareClass(node);\n } else if (this.match(tt._function)) {\n return this.flowParseDeclareFunction(node);\n } else if (this.match(tt._var)) {\n return this.flowParseDeclareVariable(node);\n } else if (this.eatContextual(tt._module)) {\n if (this.match(tt.dot)) {\n return this.flowParseDeclareModuleExports(node);\n } else {\n if (insideModule) {\n this.raise(\n FlowErrors.NestedDeclareModule,\n this.state.lastTokStartLoc,\n );\n }\n return this.flowParseDeclareModule(node);\n }\n } else if (this.isContextual(tt._type)) {\n return this.flowParseDeclareTypeAlias(node);\n } else if (this.isContextual(tt._opaque)) {\n return this.flowParseDeclareOpaqueType(node);\n } else if (this.isContextual(tt._interface)) {\n return this.flowParseDeclareInterface(node);\n } else if (this.match(tt._export)) {\n return this.flowParseDeclareExportDeclaration(node, insideModule);\n } else {\n this.unexpected();\n }\n }\n\n flowParseDeclareVariable(\n node: Undone,\n ): N.FlowDeclareVariable {\n this.next();\n node.id = this.flowParseTypeAnnotatableIdentifier(\n /*allowPrimitiveOverride*/ true,\n );\n this.scope.declareName(\n node.id.name,\n BindingFlag.TYPE_VAR,\n node.id.loc.start,\n );\n this.semicolon();\n return this.finishNode(node, \"DeclareVariable\");\n }\n\n flowParseDeclareModule(\n node: Undone,\n ): N.FlowDeclareModule {\n this.scope.enter(ScopeFlag.OTHER);\n\n if (this.match(tt.string)) {\n node.id = super.parseExprAtom();\n } else {\n node.id = this.parseIdentifier();\n }\n\n const bodyNode = (node.body = this.startNode());\n // @ts-expect-error refine typings\n const body = (bodyNode.body = []);\n this.expect(tt.braceL);\n while (!this.match(tt.braceR)) {\n let bodyNode = this.startNode();\n\n if (this.match(tt._import)) {\n this.next();\n if (!this.isContextual(tt._type) && !this.match(tt._typeof)) {\n this.raise(\n FlowErrors.InvalidNonTypeImportInDeclareModule,\n this.state.lastTokStartLoc,\n );\n }\n super.parseImport(bodyNode);\n } else {\n this.expectContextual(\n tt._declare,\n FlowErrors.UnsupportedStatementInDeclareModule,\n );\n // @ts-expect-error refine typings\n bodyNode = this.flowParseDeclare(bodyNode, true);\n }\n\n body.push(bodyNode);\n }\n\n this.scope.exit();\n\n this.expect(tt.braceR);\n\n this.finishNode(bodyNode, \"BlockStatement\");\n\n let kind: \"CommonJS\" | \"ES\" | null = null;\n let hasModuleExport = false;\n body.forEach(bodyElement => {\n if (isEsModuleType(bodyElement)) {\n if (kind === \"CommonJS\") {\n this.raise(FlowErrors.AmbiguousDeclareModuleKind, bodyElement);\n }\n kind = \"ES\";\n } else if (bodyElement.type === \"DeclareModuleExports\") {\n if (hasModuleExport) {\n this.raise(FlowErrors.DuplicateDeclareModuleExports, bodyElement);\n }\n if (kind === \"ES\") {\n this.raise(FlowErrors.AmbiguousDeclareModuleKind, bodyElement);\n }\n kind = \"CommonJS\";\n hasModuleExport = true;\n }\n });\n\n node.kind = kind || \"CommonJS\";\n return this.finishNode(node, \"DeclareModule\");\n }\n\n flowParseDeclareExportDeclaration(\n node: Undone,\n insideModule?: boolean | null,\n ): N.FlowDeclareExportDeclaration {\n this.expect(tt._export);\n\n if (this.eat(tt._default)) {\n if (this.match(tt._function) || this.match(tt._class)) {\n // declare export default class ...\n // declare export default function ...\n node.declaration = this.flowParseDeclare(this.startNode());\n } else {\n // declare export default [type];\n node.declaration = this.flowParseType();\n this.semicolon();\n }\n node.default = true;\n\n return this.finishNode(node, \"DeclareExportDeclaration\");\n } else {\n if (\n this.match(tt._const) ||\n this.isLet() ||\n ((this.isContextual(tt._type) || this.isContextual(tt._interface)) &&\n !insideModule)\n ) {\n const label = this.state.value as\n | \"const\"\n | \"let\"\n | \"type\"\n | \"interface\";\n throw this.raise(\n FlowErrors.UnsupportedDeclareExportKind,\n this.state.startLoc,\n {\n unsupportedExportKind: label,\n suggestion: exportSuggestions[label],\n },\n );\n }\n\n if (\n this.match(tt._var) || // declare export var ...\n this.match(tt._function) || // declare export function ...\n this.match(tt._class) || // declare export class ...\n this.isContextual(tt._opaque) // declare export opaque ..\n ) {\n node.declaration = this.flowParseDeclare(this.startNode());\n node.default = false;\n\n return this.finishNode(node, \"DeclareExportDeclaration\");\n } else if (\n this.match(tt.star) || // declare export * from ''\n this.match(tt.braceL) || // declare export {} ...\n this.isContextual(tt._interface) || // declare export interface ...\n this.isContextual(tt._type) || // declare export type ...\n this.isContextual(tt._opaque) // declare export opaque type ...\n ) {\n node = this.parseExport(\n node as Undone,\n /* decorators */ null,\n );\n if (node.type === \"ExportNamedDeclaration\") {\n node.default = false;\n delete node.exportKind;\n return this.castNodeTo(\n node as N.ExportNamedDeclaration,\n \"DeclareExportDeclaration\",\n );\n } else {\n return this.castNodeTo(\n node as N.ExportAllDeclaration,\n \"DeclareExportAllDeclaration\",\n );\n }\n }\n }\n\n this.unexpected();\n }\n\n flowParseDeclareModuleExports(\n node: Undone,\n ): N.FlowDeclareModuleExports {\n this.next();\n this.expectContextual(tt._exports);\n node.typeAnnotation = this.flowParseTypeAnnotation();\n this.semicolon();\n\n return this.finishNode(node, \"DeclareModuleExports\");\n }\n\n flowParseDeclareTypeAlias(\n node: Undone,\n ): N.FlowDeclareTypeAlias {\n this.next();\n const finished = this.flowParseTypeAlias(\n node,\n ) as unknown as N.FlowDeclareTypeAlias;\n // Don't do finishNode as we don't want to process comments twice\n this.castNodeTo(finished, \"DeclareTypeAlias\");\n return finished;\n }\n\n flowParseDeclareOpaqueType(\n node: Undone,\n ): N.FlowDeclareOpaqueType {\n this.next();\n const finished = this.flowParseOpaqueType(\n node,\n true,\n ) as unknown as N.FlowDeclareOpaqueType;\n // Don't do finishNode as we don't want to process comments twice\n this.castNodeTo(finished, \"DeclareOpaqueType\");\n return finished;\n }\n\n flowParseDeclareInterface(\n node: Undone,\n ): N.FlowDeclareInterface {\n this.next();\n this.flowParseInterfaceish(node, /* isClass */ false);\n return this.finishNode(node, \"DeclareInterface\");\n }\n\n // Interfaces\n\n flowParseInterfaceish(node: Undone, isClass: boolean): void {\n node.id = this.flowParseRestrictedIdentifier(\n /* liberal */ !isClass,\n /* declaration */ true,\n );\n\n this.scope.declareName(\n node.id.name,\n isClass ? BindingFlag.TYPE_FUNCTION : BindingFlag.TYPE_LEXICAL,\n node.id.loc.start,\n );\n\n if (this.match(tt.lt)) {\n node.typeParameters = this.flowParseTypeParameterDeclaration();\n } else {\n node.typeParameters = null;\n }\n\n node.extends = [];\n\n if (this.eat(tt._extends)) {\n do {\n node.extends.push(this.flowParseInterfaceExtends());\n } while (!isClass && this.eat(tt.comma));\n }\n\n if (isClass) {\n node.implements = [];\n node.mixins = [];\n\n if (this.eatContextual(tt._mixins)) {\n do {\n node.mixins.push(this.flowParseInterfaceExtends());\n } while (this.eat(tt.comma));\n }\n\n if (this.eatContextual(tt._implements)) {\n do {\n node.implements.push(this.flowParseInterfaceExtends());\n } while (this.eat(tt.comma));\n }\n }\n\n node.body = this.flowParseObjectType({\n allowStatic: isClass,\n allowExact: false,\n allowSpread: false,\n allowProto: isClass,\n allowInexact: false,\n });\n }\n\n flowParseInterfaceExtends(): N.FlowInterfaceExtends {\n const node = this.startNode();\n\n node.id = this.flowParseQualifiedTypeIdentifier();\n if (this.match(tt.lt)) {\n node.typeParameters = this.flowParseTypeParameterInstantiation();\n } else {\n node.typeParameters = null;\n }\n\n return this.finishNode(node, \"InterfaceExtends\");\n }\n\n flowParseInterface(node: Undone): N.FlowInterface {\n this.flowParseInterfaceish(node, /* isClass */ false);\n return this.finishNode(node, \"InterfaceDeclaration\");\n }\n\n checkNotUnderscore(word: string) {\n if (word === \"_\") {\n this.raise(\n FlowErrors.UnexpectedReservedUnderscore,\n this.state.startLoc,\n );\n }\n }\n\n checkReservedType(word: string, startLoc: Position, declaration?: boolean) {\n if (!reservedTypes.has(word)) return;\n\n this.raise(\n declaration\n ? FlowErrors.AssignReservedType\n : FlowErrors.UnexpectedReservedType,\n startLoc,\n {\n reservedType: word,\n },\n );\n }\n\n flowParseRestrictedIdentifier(\n liberal?: boolean,\n declaration?: boolean,\n ): N.Identifier {\n this.checkReservedType(\n this.state.value,\n this.state.startLoc,\n declaration,\n );\n return this.parseIdentifier(liberal);\n }\n\n // Type aliases\n\n flowParseTypeAlias(node: Undone): N.FlowTypeAlias {\n node.id = this.flowParseRestrictedIdentifier(\n /* liberal */ false,\n /* declaration */ true,\n );\n this.scope.declareName(\n node.id.name,\n BindingFlag.TYPE_LEXICAL,\n node.id.loc.start,\n );\n\n if (this.match(tt.lt)) {\n node.typeParameters = this.flowParseTypeParameterDeclaration();\n } else {\n node.typeParameters = null;\n }\n\n node.right = this.flowParseTypeInitialiser(tt.eq);\n this.semicolon();\n\n return this.finishNode(node, \"TypeAlias\");\n }\n\n flowParseOpaqueType(\n node: Undone,\n declare: boolean,\n ): N.FlowOpaqueType {\n this.expectContextual(tt._type);\n node.id = this.flowParseRestrictedIdentifier(\n /* liberal */ true,\n /* declaration */ true,\n );\n this.scope.declareName(\n node.id.name,\n BindingFlag.TYPE_LEXICAL,\n node.id.loc.start,\n );\n\n if (this.match(tt.lt)) {\n node.typeParameters = this.flowParseTypeParameterDeclaration();\n } else {\n node.typeParameters = null;\n }\n\n // Parse the supertype\n node.supertype = null;\n if (this.match(tt.colon)) {\n node.supertype = this.flowParseTypeInitialiser(tt.colon);\n }\n\n node.impltype = null;\n if (!declare) {\n node.impltype = this.flowParseTypeInitialiser(tt.eq);\n }\n this.semicolon();\n\n return this.finishNode(node, \"OpaqueType\");\n }\n\n // Type annotations\n\n flowParseTypeParameter(requireDefault: boolean = false): N.TypeParameter {\n const nodeStartLoc = this.state.startLoc;\n\n const node = this.startNode();\n\n const variance = this.flowParseVariance();\n\n const ident = this.flowParseTypeAnnotatableIdentifier();\n node.name = ident.name;\n // @ts-expect-error migrate to Babel types\n node.variance = variance;\n // @ts-expect-error migrate to Babel types\n node.bound = ident.typeAnnotation;\n\n if (this.match(tt.eq)) {\n this.eat(tt.eq);\n // @ts-expect-error migrate to Babel types\n node.default = this.flowParseType();\n } else {\n if (requireDefault) {\n this.raise(FlowErrors.MissingTypeParamDefault, nodeStartLoc);\n }\n }\n\n return this.finishNode(node, \"TypeParameter\");\n }\n\n flowParseTypeParameterDeclaration(): N.TypeParameterDeclaration {\n const oldInType = this.state.inType;\n const node = this.startNode();\n node.params = [];\n\n this.state.inType = true;\n\n // istanbul ignore else: this condition is already checked at all call sites\n if (this.match(tt.lt) || this.match(tt.jsxTagStart)) {\n this.next();\n } else {\n this.unexpected();\n }\n\n let defaultRequired = false;\n\n do {\n const typeParameter = this.flowParseTypeParameter(defaultRequired);\n\n node.params.push(typeParameter);\n\n if (typeParameter.default) {\n defaultRequired = true;\n }\n\n if (!this.match(tt.gt)) {\n this.expect(tt.comma);\n }\n } while (!this.match(tt.gt));\n this.expect(tt.gt);\n\n this.state.inType = oldInType;\n\n return this.finishNode(node, \"TypeParameterDeclaration\");\n }\n\n // Parse in top level normal context if we are in a JSX context\n flowInTopLevelContext(cb: () => T): T {\n if (this.curContext() !== tc.brace) {\n const oldContext = this.state.context;\n this.state.context = [oldContext[0]];\n try {\n return cb();\n } finally {\n this.state.context = oldContext;\n }\n } else {\n return cb();\n }\n }\n\n // Used when parsing type arguments from ES or JSX productions, where the first token\n // has been created without state.inType. Thus we need to re-scan the lt token.\n flowParseTypeParameterInstantiationInExpression():\n | N.TypeParameterInstantiation\n | undefined {\n if (this.reScan_lt() !== tt.lt) return;\n return this.flowParseTypeParameterInstantiation();\n }\n\n flowParseTypeParameterInstantiation(): N.TypeParameterInstantiation {\n const node = this.startNode();\n const oldInType = this.state.inType;\n\n this.state.inType = true;\n node.params = [];\n this.flowInTopLevelContext(() => {\n this.expect(tt.lt);\n const oldNoAnonFunctionType = this.state.noAnonFunctionType;\n this.state.noAnonFunctionType = false;\n while (!this.match(tt.gt)) {\n node.params.push(this.flowParseType());\n if (!this.match(tt.gt)) {\n this.expect(tt.comma);\n }\n }\n this.state.noAnonFunctionType = oldNoAnonFunctionType;\n });\n\n this.state.inType = oldInType;\n if (!this.state.inType && this.curContext() === tc.brace) {\n // rescan `>` when we are no longer in type context and JSX parsing context\n // since it was tokenized when `inType` is `true`.\n this.reScan_lt_gt();\n }\n this.expect(tt.gt);\n\n return this.finishNode(node, \"TypeParameterInstantiation\");\n }\n\n flowParseTypeParameterInstantiationCallOrNew(): N.TypeParameterInstantiation {\n if (this.reScan_lt() !== tt.lt) return;\n const node = this.startNode();\n const oldInType = this.state.inType;\n node.params = [];\n\n this.state.inType = true;\n\n this.expect(tt.lt);\n while (!this.match(tt.gt)) {\n node.params.push(this.flowParseTypeOrImplicitInstantiation());\n if (!this.match(tt.gt)) {\n this.expect(tt.comma);\n }\n }\n this.expect(tt.gt);\n\n this.state.inType = oldInType;\n\n return this.finishNode(node, \"TypeParameterInstantiation\");\n }\n\n flowParseInterfaceType(): N.FlowInterfaceType {\n const node = this.startNode();\n this.expectContextual(tt._interface);\n\n node.extends = [];\n if (this.eat(tt._extends)) {\n do {\n node.extends.push(this.flowParseInterfaceExtends());\n } while (this.eat(tt.comma));\n }\n\n node.body = this.flowParseObjectType({\n allowStatic: false,\n allowExact: false,\n allowSpread: false,\n allowProto: false,\n allowInexact: false,\n });\n\n return this.finishNode(node, \"InterfaceTypeAnnotation\");\n }\n\n flowParseObjectPropertyKey(): N.Expression {\n return this.match(tt.num) || this.match(tt.string)\n ? super.parseExprAtom()\n : this.parseIdentifier(true);\n }\n\n flowParseObjectTypeIndexer(\n node: Undone,\n isStatic: boolean,\n variance?: N.FlowVariance | null,\n ): N.FlowObjectTypeIndexer {\n node.static = isStatic;\n\n // Note: bracketL has already been consumed\n if (this.lookahead().type === tt.colon) {\n node.id = this.flowParseObjectPropertyKey();\n node.key = this.flowParseTypeInitialiser();\n } else {\n node.id = null;\n node.key = this.flowParseType();\n }\n this.expect(tt.bracketR);\n node.value = this.flowParseTypeInitialiser();\n node.variance = variance;\n\n return this.finishNode(node, \"ObjectTypeIndexer\");\n }\n\n flowParseObjectTypeInternalSlot(\n node: Undone,\n isStatic: boolean,\n ): N.FlowObjectTypeInternalSlot {\n node.static = isStatic;\n // Note: both bracketL have already been consumed\n node.id = this.flowParseObjectPropertyKey();\n this.expect(tt.bracketR);\n this.expect(tt.bracketR);\n if (this.match(tt.lt) || this.match(tt.parenL)) {\n node.method = true;\n node.optional = false;\n node.value = this.flowParseObjectTypeMethodish(\n this.startNodeAt(node.loc.start),\n );\n } else {\n node.method = false;\n if (this.eat(tt.question)) {\n node.optional = true;\n }\n node.value = this.flowParseTypeInitialiser();\n }\n return this.finishNode(node, \"ObjectTypeInternalSlot\");\n }\n\n flowParseObjectTypeMethodish(\n node: Undone,\n ): N.FlowFunctionTypeAnnotation {\n node.params = [];\n node.rest = null;\n node.typeParameters = null;\n node.this = null;\n\n if (this.match(tt.lt)) {\n node.typeParameters = this.flowParseTypeParameterDeclaration();\n }\n\n this.expect(tt.parenL);\n if (this.match(tt._this)) {\n node.this = this.flowParseFunctionTypeParam(/* first */ true);\n // match Flow parser behavior\n node.this.name = null;\n if (!this.match(tt.parenR)) {\n this.expect(tt.comma);\n }\n }\n while (!this.match(tt.parenR) && !this.match(tt.ellipsis)) {\n node.params.push(this.flowParseFunctionTypeParam(false));\n if (!this.match(tt.parenR)) {\n this.expect(tt.comma);\n }\n }\n\n if (this.eat(tt.ellipsis)) {\n node.rest = this.flowParseFunctionTypeParam(false);\n }\n this.expect(tt.parenR);\n node.returnType = this.flowParseTypeInitialiser();\n\n return this.finishNode(node, \"FunctionTypeAnnotation\");\n }\n\n flowParseObjectTypeCallProperty(\n node: Undone,\n isStatic: boolean,\n ): N.FlowObjectTypeCallProperty {\n const valueNode = this.startNode();\n node.static = isStatic;\n node.value = this.flowParseObjectTypeMethodish(valueNode);\n return this.finishNode(node, \"ObjectTypeCallProperty\");\n }\n\n flowParseObjectType({\n allowStatic,\n allowExact,\n allowSpread,\n allowProto,\n allowInexact,\n }: {\n allowStatic: boolean;\n allowExact: boolean;\n allowSpread: boolean;\n allowProto: boolean;\n allowInexact: boolean;\n }): N.FlowObjectTypeAnnotation {\n const oldInType = this.state.inType;\n this.state.inType = true;\n\n const nodeStart = this.startNode();\n\n nodeStart.callProperties = [];\n nodeStart.properties = [];\n nodeStart.indexers = [];\n nodeStart.internalSlots = [];\n\n let endDelim;\n let exact;\n let inexact = false;\n if (allowExact && this.match(tt.braceBarL)) {\n this.expect(tt.braceBarL);\n endDelim = tt.braceBarR;\n exact = true;\n } else {\n this.expect(tt.braceL);\n endDelim = tt.braceR;\n exact = false;\n }\n\n nodeStart.exact = exact;\n\n while (!this.match(endDelim)) {\n let isStatic = false;\n let protoStartLoc: Position | undefined | null = null;\n let inexactStartLoc: Position | undefined | null = null;\n const node = this.startNode();\n\n if (allowProto && this.isContextual(tt._proto)) {\n const lookahead = this.lookahead();\n\n if (lookahead.type !== tt.colon && lookahead.type !== tt.question) {\n this.next();\n protoStartLoc = this.state.startLoc;\n allowStatic = false;\n }\n }\n\n if (allowStatic && this.isContextual(tt._static)) {\n const lookahead = this.lookahead();\n\n // static is a valid identifier name\n if (lookahead.type !== tt.colon && lookahead.type !== tt.question) {\n this.next();\n isStatic = true;\n }\n }\n\n const variance = this.flowParseVariance();\n\n if (this.eat(tt.bracketL)) {\n if (protoStartLoc != null) {\n this.unexpected(protoStartLoc);\n }\n if (this.eat(tt.bracketL)) {\n if (variance) {\n this.unexpected(variance.loc.start);\n }\n nodeStart.internalSlots.push(\n this.flowParseObjectTypeInternalSlot(node, isStatic),\n );\n } else {\n nodeStart.indexers.push(\n this.flowParseObjectTypeIndexer(node, isStatic, variance),\n );\n }\n } else if (this.match(tt.parenL) || this.match(tt.lt)) {\n if (protoStartLoc != null) {\n this.unexpected(protoStartLoc);\n }\n if (variance) {\n this.unexpected(variance.loc.start);\n }\n nodeStart.callProperties.push(\n this.flowParseObjectTypeCallProperty(node, isStatic),\n );\n } else {\n let kind = \"init\";\n\n if (this.isContextual(tt._get) || this.isContextual(tt._set)) {\n const lookahead = this.lookahead();\n if (tokenIsLiteralPropertyName(lookahead.type)) {\n kind = this.state.value;\n this.next();\n }\n }\n\n const propOrInexact = this.flowParseObjectTypeProperty(\n node,\n isStatic,\n protoStartLoc,\n variance,\n kind,\n allowSpread,\n allowInexact ?? !exact,\n );\n\n if (propOrInexact === null) {\n inexact = true;\n inexactStartLoc = this.state.lastTokStartLoc;\n } else {\n nodeStart.properties.push(propOrInexact);\n }\n }\n\n this.flowObjectTypeSemicolon();\n\n if (\n inexactStartLoc &&\n !this.match(tt.braceR) &&\n !this.match(tt.braceBarR)\n ) {\n this.raise(\n FlowErrors.UnexpectedExplicitInexactInObject,\n inexactStartLoc,\n );\n }\n }\n\n this.expect(endDelim);\n\n /* The inexact flag should only be added on ObjectTypeAnnotations that\n * are not the body of an interface, declare interface, or declare class.\n * Since spreads are only allowed in object types, checking that is\n * sufficient here.\n */\n if (allowSpread) {\n nodeStart.inexact = inexact;\n }\n\n const out = this.finishNode(nodeStart, \"ObjectTypeAnnotation\");\n\n this.state.inType = oldInType;\n\n return out;\n }\n\n flowParseObjectTypeProperty(\n node: Undone,\n isStatic: boolean,\n protoStartLoc: Position | undefined | null,\n variance: N.FlowVariance | undefined | null,\n kind: string,\n allowSpread: boolean,\n allowInexact: boolean,\n ): N.FlowObjectTypeProperty | N.FlowObjectTypeSpreadProperty | null {\n if (this.eat(tt.ellipsis)) {\n const isInexactToken =\n this.match(tt.comma) ||\n this.match(tt.semi) ||\n this.match(tt.braceR) ||\n this.match(tt.braceBarR);\n\n if (isInexactToken) {\n if (!allowSpread) {\n this.raise(\n FlowErrors.InexactInsideNonObject,\n this.state.lastTokStartLoc,\n );\n } else if (!allowInexact) {\n this.raise(\n FlowErrors.InexactInsideExact,\n this.state.lastTokStartLoc,\n );\n }\n if (variance) {\n this.raise(FlowErrors.InexactVariance, variance);\n }\n\n return null;\n }\n\n if (!allowSpread) {\n this.raise(\n FlowErrors.UnexpectedSpreadType,\n this.state.lastTokStartLoc,\n );\n }\n if (protoStartLoc != null) {\n this.unexpected(protoStartLoc);\n }\n if (variance) {\n this.raise(FlowErrors.SpreadVariance, variance);\n }\n\n node.argument = this.flowParseType();\n return this.finishNode(node, \"ObjectTypeSpreadProperty\");\n } else {\n node.key = this.flowParseObjectPropertyKey();\n node.static = isStatic;\n node.proto = protoStartLoc != null;\n node.kind = kind;\n\n let optional = false;\n if (this.match(tt.lt) || this.match(tt.parenL)) {\n // This is a method property\n node.method = true;\n\n if (protoStartLoc != null) {\n this.unexpected(protoStartLoc);\n }\n if (variance) {\n this.unexpected(variance.loc.start);\n }\n\n node.value = this.flowParseObjectTypeMethodish(\n this.startNodeAt(node.loc.start),\n );\n if (kind === \"get\" || kind === \"set\") {\n this.flowCheckGetterSetterParams(node);\n }\n /** Declared classes/interfaces do not allow spread */\n if (\n !allowSpread &&\n node.key.name === \"constructor\" &&\n node.value.this\n ) {\n this.raise(\n FlowErrors.ThisParamBannedInConstructor,\n node.value.this,\n );\n }\n } else {\n if (kind !== \"init\") this.unexpected();\n\n node.method = false;\n\n if (this.eat(tt.question)) {\n optional = true;\n }\n node.value = this.flowParseTypeInitialiser();\n node.variance = variance;\n }\n\n node.optional = optional;\n\n return this.finishNode(node, \"ObjectTypeProperty\");\n }\n }\n\n // This is similar to checkGetterSetterParams, but as\n // @babel/parser uses non estree properties we cannot reuse it here\n flowCheckGetterSetterParams(\n property: Undone<\n N.FlowObjectTypeProperty | N.FlowObjectTypeSpreadProperty\n >,\n ): void {\n const paramCount = property.kind === \"get\" ? 0 : 1;\n const length =\n property.value.params.length + (property.value.rest ? 1 : 0);\n\n if (property.value.this) {\n this.raise(\n property.kind === \"get\"\n ? FlowErrors.GetterMayNotHaveThisParam\n : FlowErrors.SetterMayNotHaveThisParam,\n property.value.this,\n );\n }\n\n if (length !== paramCount) {\n this.raise(\n property.kind === \"get\"\n ? Errors.BadGetterArity\n : Errors.BadSetterArity,\n property,\n );\n }\n\n if (property.kind === \"set\" && property.value.rest) {\n this.raise(Errors.BadSetterRestParameter, property);\n }\n }\n\n flowObjectTypeSemicolon(): void {\n if (\n !this.eat(tt.semi) &&\n !this.eat(tt.comma) &&\n !this.match(tt.braceR) &&\n !this.match(tt.braceBarR)\n ) {\n this.unexpected();\n }\n }\n\n flowParseQualifiedTypeIdentifier(\n startLoc?: Position,\n id?: N.Identifier,\n ): N.FlowQualifiedTypeIdentifier | N.Identifier {\n startLoc ??= this.state.startLoc;\n let node: N.Identifier | N.FlowQualifiedTypeIdentifier =\n id || this.flowParseRestrictedIdentifier(true);\n\n while (this.eat(tt.dot)) {\n const node2 = this.startNodeAt(startLoc);\n node2.qualification = node;\n node2.id = this.flowParseRestrictedIdentifier(true);\n node = this.finishNode(node2, \"QualifiedTypeIdentifier\");\n }\n\n return node;\n }\n\n flowParseGenericType(\n startLoc: Position,\n id: N.Identifier,\n ): N.FlowGenericTypeAnnotation {\n const node = this.startNodeAt(startLoc);\n\n node.typeParameters = null;\n node.id = this.flowParseQualifiedTypeIdentifier(startLoc, id);\n\n if (this.match(tt.lt)) {\n node.typeParameters = this.flowParseTypeParameterInstantiation();\n }\n\n return this.finishNode(node, \"GenericTypeAnnotation\");\n }\n\n flowParseTypeofType(): N.FlowTypeofTypeAnnotation {\n const node = this.startNode();\n this.expect(tt._typeof);\n node.argument = this.flowParsePrimaryType();\n return this.finishNode(node, \"TypeofTypeAnnotation\");\n }\n\n flowParseTupleType(): N.FlowTupleTypeAnnotation {\n const node = this.startNode();\n node.types = [];\n this.expect(tt.bracketL);\n // We allow trailing commas\n while (this.state.pos < this.length && !this.match(tt.bracketR)) {\n node.types.push(this.flowParseType());\n if (this.match(tt.bracketR)) break;\n this.expect(tt.comma);\n }\n this.expect(tt.bracketR);\n return this.finishNode(node, \"TupleTypeAnnotation\");\n }\n\n flowParseFunctionTypeParam(first: boolean): N.FlowFunctionTypeParam {\n let name = null;\n let optional = false;\n let typeAnnotation = null;\n const node = this.startNode();\n const lh = this.lookahead();\n const isThis = this.state.type === tt._this;\n\n if (lh.type === tt.colon || lh.type === tt.question) {\n if (isThis && !first) {\n this.raise(FlowErrors.ThisParamMustBeFirst, node);\n }\n name = this.parseIdentifier(isThis);\n if (this.eat(tt.question)) {\n optional = true;\n if (isThis) {\n this.raise(FlowErrors.ThisParamMayNotBeOptional, node);\n }\n }\n typeAnnotation = this.flowParseTypeInitialiser();\n } else {\n typeAnnotation = this.flowParseType();\n }\n node.name = name;\n node.optional = optional;\n node.typeAnnotation = typeAnnotation;\n return this.finishNode(node, \"FunctionTypeParam\");\n }\n\n reinterpretTypeAsFunctionTypeParam(\n type: N.FlowType,\n ): N.FlowFunctionTypeParam {\n const node = this.startNodeAt(type.loc.start);\n node.name = null;\n node.optional = false;\n node.typeAnnotation = type;\n return this.finishNode(node, \"FunctionTypeParam\");\n }\n\n flowParseFunctionTypeParams(params: N.FlowFunctionTypeParam[] = []): {\n params: N.FlowFunctionTypeParam[];\n rest: N.FlowFunctionTypeParam | undefined | null;\n _this: N.FlowFunctionTypeParam | undefined | null;\n } {\n let rest: N.FlowFunctionTypeParam | undefined | null = null;\n let _this: N.FlowFunctionTypeParam | undefined | null = null;\n if (this.match(tt._this)) {\n _this = this.flowParseFunctionTypeParam(/* first */ true);\n // match Flow parser behavior\n _this.name = null;\n if (!this.match(tt.parenR)) {\n this.expect(tt.comma);\n }\n }\n while (!this.match(tt.parenR) && !this.match(tt.ellipsis)) {\n params.push(this.flowParseFunctionTypeParam(false));\n if (!this.match(tt.parenR)) {\n this.expect(tt.comma);\n }\n }\n if (this.eat(tt.ellipsis)) {\n rest = this.flowParseFunctionTypeParam(false);\n }\n return { params, rest, _this };\n }\n\n flowIdentToTypeAnnotation(\n startLoc: Position,\n node: Undone,\n id: N.Identifier,\n ): N.FlowType {\n switch (id.name) {\n case \"any\":\n return this.finishNode(node, \"AnyTypeAnnotation\");\n\n case \"bool\":\n case \"boolean\":\n return this.finishNode(node, \"BooleanTypeAnnotation\");\n\n case \"mixed\":\n return this.finishNode(node, \"MixedTypeAnnotation\");\n\n case \"empty\":\n return this.finishNode(node, \"EmptyTypeAnnotation\");\n\n case \"number\":\n return this.finishNode(node, \"NumberTypeAnnotation\");\n\n case \"string\":\n return this.finishNode(node, \"StringTypeAnnotation\");\n\n case \"symbol\":\n return this.finishNode(node, \"SymbolTypeAnnotation\");\n\n default:\n this.checkNotUnderscore(id.name);\n return this.flowParseGenericType(startLoc, id);\n }\n }\n\n // The parsing of types roughly parallels the parsing of expressions, and\n // primary types are kind of like primary expressions...they're the\n // primitives with which other types are constructed.\n flowParsePrimaryType(): N.FlowType {\n const startLoc = this.state.startLoc;\n const node = this.startNode();\n let tmp;\n let type;\n let isGroupedType = false;\n const oldNoAnonFunctionType = this.state.noAnonFunctionType;\n\n switch (this.state.type) {\n case tt.braceL:\n return this.flowParseObjectType({\n allowStatic: false,\n allowExact: false,\n allowSpread: true,\n allowProto: false,\n allowInexact: true,\n });\n\n case tt.braceBarL:\n return this.flowParseObjectType({\n allowStatic: false,\n allowExact: true,\n allowSpread: true,\n allowProto: false,\n allowInexact: false,\n });\n\n case tt.bracketL:\n this.state.noAnonFunctionType = false;\n type = this.flowParseTupleType();\n this.state.noAnonFunctionType = oldNoAnonFunctionType;\n return type;\n\n case tt.lt: {\n const node = this.startNode();\n node.typeParameters = this.flowParseTypeParameterDeclaration();\n this.expect(tt.parenL);\n tmp = this.flowParseFunctionTypeParams();\n node.params = tmp.params;\n node.rest = tmp.rest;\n node.this = tmp._this;\n this.expect(tt.parenR);\n\n this.expect(tt.arrow);\n\n node.returnType = this.flowParseType();\n\n return this.finishNode(node, \"FunctionTypeAnnotation\");\n }\n\n case tt.parenL: {\n const node = this.startNode();\n this.next();\n\n // Check to see if this is actually a grouped type\n if (!this.match(tt.parenR) && !this.match(tt.ellipsis)) {\n if (tokenIsIdentifier(this.state.type) || this.match(tt._this)) {\n const token = this.lookahead().type;\n isGroupedType = token !== tt.question && token !== tt.colon;\n } else {\n isGroupedType = true;\n }\n }\n\n if (isGroupedType) {\n this.state.noAnonFunctionType = false;\n type = this.flowParseType();\n this.state.noAnonFunctionType = oldNoAnonFunctionType;\n\n // A `,` or a `) =>` means this is an anonymous function type\n if (\n this.state.noAnonFunctionType ||\n !(\n this.match(tt.comma) ||\n (this.match(tt.parenR) && this.lookahead().type === tt.arrow)\n )\n ) {\n this.expect(tt.parenR);\n return type;\n } else {\n // Eat a comma if there is one\n this.eat(tt.comma);\n }\n }\n\n if (type) {\n tmp = this.flowParseFunctionTypeParams([\n this.reinterpretTypeAsFunctionTypeParam(type),\n ]);\n } else {\n tmp = this.flowParseFunctionTypeParams();\n }\n\n node.params = tmp.params;\n node.rest = tmp.rest;\n node.this = tmp._this;\n\n this.expect(tt.parenR);\n\n this.expect(tt.arrow);\n\n node.returnType = this.flowParseType();\n\n node.typeParameters = null;\n\n return this.finishNode(node, \"FunctionTypeAnnotation\");\n }\n\n case tt.string:\n return this.parseLiteral(\n this.state.value,\n \"StringLiteralTypeAnnotation\",\n );\n\n case tt._true:\n case tt._false:\n node.value = this.match(tt._true);\n this.next();\n return this.finishNode(\n node as Undone,\n \"BooleanLiteralTypeAnnotation\",\n );\n\n case tt.plusMin:\n if (this.state.value === \"-\") {\n this.next();\n if (this.match(tt.num)) {\n return this.parseLiteralAtNode(\n -this.state.value,\n \"NumberLiteralTypeAnnotation\",\n node,\n );\n }\n\n if (this.match(tt.bigint)) {\n return this.parseLiteralAtNode(\n -this.state.value,\n \"BigIntLiteralTypeAnnotation\",\n node,\n );\n }\n\n throw this.raise(\n FlowErrors.UnexpectedSubtractionOperand,\n this.state.startLoc,\n );\n }\n this.unexpected();\n return;\n case tt.num:\n return this.parseLiteral(\n this.state.value,\n \"NumberLiteralTypeAnnotation\",\n );\n\n case tt.bigint:\n return this.parseLiteral(\n this.state.value,\n \"BigIntLiteralTypeAnnotation\",\n );\n\n case tt._void:\n this.next();\n return this.finishNode(node, \"VoidTypeAnnotation\");\n\n case tt._null:\n this.next();\n return this.finishNode(node, \"NullLiteralTypeAnnotation\");\n\n case tt._this:\n this.next();\n return this.finishNode(node, \"ThisTypeAnnotation\");\n\n case tt.star:\n this.next();\n return this.finishNode(node, \"ExistsTypeAnnotation\");\n\n case tt._typeof:\n return this.flowParseTypeofType();\n\n default:\n if (tokenIsKeyword(this.state.type)) {\n const label = tokenLabelName(this.state.type);\n this.next();\n return super.createIdentifier(node as Undone, label);\n } else if (tokenIsIdentifier(this.state.type)) {\n if (this.isContextual(tt._interface)) {\n return this.flowParseInterfaceType();\n }\n\n return this.flowIdentToTypeAnnotation(\n startLoc,\n node,\n this.parseIdentifier(),\n );\n }\n }\n\n this.unexpected();\n }\n\n flowParsePostfixType(): N.FlowType {\n const startLoc = this.state.startLoc;\n let type = this.flowParsePrimaryType();\n let seenOptionalIndexedAccess = false;\n while (\n (this.match(tt.bracketL) || this.match(tt.questionDot)) &&\n !this.canInsertSemicolon()\n ) {\n const node = this.startNodeAt(startLoc);\n const optional = this.eat(tt.questionDot);\n seenOptionalIndexedAccess = seenOptionalIndexedAccess || optional;\n this.expect(tt.bracketL);\n if (!optional && this.match(tt.bracketR)) {\n node.elementType = type;\n this.next(); // eat `]`\n type = this.finishNode(node, \"ArrayTypeAnnotation\");\n } else {\n node.objectType = type;\n node.indexType = this.flowParseType();\n this.expect(tt.bracketR);\n if (seenOptionalIndexedAccess) {\n node.optional = optional;\n type = this.finishNode(\n // @ts-expect-error todo(flow->ts)\n node,\n \"OptionalIndexedAccessType\",\n );\n } else {\n type = this.finishNode(\n // @ts-expect-error todo(flow->ts)\n node,\n \"IndexedAccessType\",\n );\n }\n }\n }\n return type;\n }\n\n flowParsePrefixType(): N.FlowType {\n const node = this.startNode();\n if (this.eat(tt.question)) {\n node.typeAnnotation = this.flowParsePrefixType();\n return this.finishNode(node, \"NullableTypeAnnotation\");\n } else {\n return this.flowParsePostfixType();\n }\n }\n\n flowParseAnonFunctionWithoutParens(): N.FlowType {\n const param = this.flowParsePrefixType();\n if (!this.state.noAnonFunctionType && this.eat(tt.arrow)) {\n // TODO: This should be a type error. Passing in a SourceLocation, and it expects a Position.\n const node = this.startNodeAt(\n param.loc.start,\n );\n node.params = [this.reinterpretTypeAsFunctionTypeParam(param)];\n node.rest = null;\n node.this = null;\n node.returnType = this.flowParseType();\n node.typeParameters = null;\n return this.finishNode(node, \"FunctionTypeAnnotation\");\n }\n return param;\n }\n\n flowParseIntersectionType(): N.FlowType {\n const node = this.startNode();\n this.eat(tt.bitwiseAND);\n const type = this.flowParseAnonFunctionWithoutParens();\n node.types = [type];\n while (this.eat(tt.bitwiseAND)) {\n node.types.push(this.flowParseAnonFunctionWithoutParens());\n }\n return node.types.length === 1\n ? type\n : this.finishNode(node, \"IntersectionTypeAnnotation\");\n }\n\n flowParseUnionType(): N.FlowType {\n const node = this.startNode();\n this.eat(tt.bitwiseOR);\n const type = this.flowParseIntersectionType();\n node.types = [type];\n while (this.eat(tt.bitwiseOR)) {\n node.types.push(this.flowParseIntersectionType());\n }\n return node.types.length === 1\n ? type\n : this.finishNode(node, \"UnionTypeAnnotation\");\n }\n\n flowParseType(): N.FlowType {\n const oldInType = this.state.inType;\n this.state.inType = true;\n const type = this.flowParseUnionType();\n this.state.inType = oldInType;\n return type;\n }\n\n flowParseTypeOrImplicitInstantiation(): N.FlowType {\n if (this.state.type === tt.name && this.state.value === \"_\") {\n const startLoc = this.state.startLoc;\n const node = this.parseIdentifier();\n return this.flowParseGenericType(startLoc, node);\n } else {\n return this.flowParseType();\n }\n }\n\n flowParseTypeAnnotation(): N.TypeAnnotation {\n const node = this.startNode();\n node.typeAnnotation = this.flowParseTypeInitialiser();\n return this.finishNode(node, \"TypeAnnotation\");\n }\n\n flowParseTypeAnnotatableIdentifier(\n allowPrimitiveOverride?: boolean,\n ): N.Identifier {\n const ident = allowPrimitiveOverride\n ? this.parseIdentifier()\n : this.flowParseRestrictedIdentifier();\n if (this.match(tt.colon)) {\n ident.typeAnnotation = this.flowParseTypeAnnotation();\n this.resetEndLocation(ident);\n }\n return ident;\n }\n\n typeCastToParameter(node: N.TypeCastExpression): N.Expression {\n (node.expression as N.Identifier).typeAnnotation = node.typeAnnotation;\n\n this.resetEndLocation(node.expression, node.typeAnnotation.loc.end);\n\n return node.expression;\n }\n\n flowParseVariance(): N.FlowVariance | undefined | null {\n let variance = null;\n if (this.match(tt.plusMin)) {\n variance = this.startNode();\n if (this.state.value === \"+\") {\n variance.kind = \"plus\";\n } else {\n variance.kind = \"minus\";\n }\n this.next();\n return this.finishNode(variance, \"Variance\");\n }\n return variance;\n }\n\n // ==================================\n // Overrides\n // ==================================\n\n parseFunctionBody(\n node: N.Function,\n allowExpressionBody?: boolean | null,\n isMethod: boolean = false,\n ): void {\n if (allowExpressionBody) {\n this.forwardNoArrowParamsConversionAt(node, () =>\n super.parseFunctionBody(node, true, isMethod),\n );\n return;\n }\n\n super.parseFunctionBody(node, false, isMethod);\n }\n\n parseFunctionBodyAndFinish<\n T extends\n | N.Function\n | N.TSDeclareMethod\n | N.TSDeclareFunction\n | N.ClassPrivateMethod,\n >(node: Undone, type: T[\"type\"], isMethod: boolean = false): T {\n if (this.match(tt.colon)) {\n const typeNode = this.startNode();\n\n [\n typeNode.typeAnnotation,\n // @ts-expect-error predicate may not exist\n node.predicate,\n ] = this.flowParseTypeAndPredicateInitialiser();\n\n node.returnType = typeNode.typeAnnotation\n ? this.finishNode(typeNode, \"TypeAnnotation\")\n : null;\n }\n\n return super.parseFunctionBodyAndFinish(node, type, isMethod);\n }\n\n // interfaces and enums\n parseStatementLike(flags: ParseStatementFlag): N.Statement {\n // strict mode handling of `interface` since it's a reserved word\n if (this.state.strict && this.isContextual(tt._interface)) {\n const lookahead = this.lookahead();\n if (tokenIsKeywordOrIdentifier(lookahead.type)) {\n const node = this.startNode();\n this.next();\n return this.flowParseInterface(node);\n }\n } else if (this.isContextual(tt._enum)) {\n const node = this.startNode();\n this.next();\n return this.flowParseEnumDeclaration(node);\n }\n const stmt = super.parseStatementLike(flags);\n // We will parse a flow pragma in any comment before the first statement.\n if (this.flowPragma === undefined && !this.isValidDirective(stmt)) {\n this.flowPragma = null;\n }\n return stmt;\n }\n\n // declares, interfaces and type aliases\n parseExpressionStatement(\n node: N.ExpressionStatement,\n expr: N.Expression,\n decorators: N.Decorator[] | null,\n ): N.ExpressionStatement {\n if (expr.type === \"Identifier\") {\n if (expr.name === \"declare\") {\n if (\n this.match(tt._class) ||\n tokenIsIdentifier(this.state.type) ||\n this.match(tt._function) ||\n this.match(tt._var) ||\n this.match(tt._export)\n ) {\n // @ts-expect-error: refine typings\n return this.flowParseDeclare(node);\n }\n } else if (tokenIsIdentifier(this.state.type)) {\n if (expr.name === \"interface\") {\n // @ts-expect-error: refine typings\n return this.flowParseInterface(node);\n } else if (expr.name === \"type\") {\n // @ts-expect-error: refine typings\n return this.flowParseTypeAlias(node);\n } else if (expr.name === \"opaque\") {\n // @ts-expect-error: refine typings\n return this.flowParseOpaqueType(node, false);\n }\n }\n }\n\n return super.parseExpressionStatement(node, expr, decorators);\n }\n\n // export type\n shouldParseExportDeclaration(): boolean {\n const { type } = this.state;\n if (type === tt._enum || tokenIsFlowInterfaceOrTypeOrOpaque(type)) {\n return !this.state.containsEsc;\n }\n return super.shouldParseExportDeclaration();\n }\n\n isExportDefaultSpecifier(): boolean {\n const { type } = this.state;\n if (type === tt._enum || tokenIsFlowInterfaceOrTypeOrOpaque(type)) {\n return this.state.containsEsc;\n }\n\n return super.isExportDefaultSpecifier();\n }\n\n parseExportDefaultExpression() {\n if (this.isContextual(tt._enum)) {\n const node = this.startNode();\n this.next();\n return this.flowParseEnumDeclaration(node);\n }\n return super.parseExportDefaultExpression();\n }\n\n parseConditional(\n expr: N.Expression,\n\n startLoc: Position,\n refExpressionErrors?: ExpressionErrors | null,\n ): N.Expression {\n if (!this.match(tt.question)) return expr;\n\n if (this.state.maybeInArrowParameters) {\n const nextCh = this.lookaheadCharCode();\n // These tokens cannot start an expression, so if one of them follows\n // ? then we are probably in an arrow function parameters list and we\n // don't parse the conditional expression.\n if (\n nextCh === charCodes.comma || // (a?, b) => c\n nextCh === charCodes.equalsTo || // (a? = b) => c\n nextCh === charCodes.colon || // (a?: b) => c\n nextCh === charCodes.rightParenthesis // (a?) => c\n ) {\n /*:: invariant(refExpressionErrors != null) */\n this.setOptionalParametersError(refExpressionErrors);\n return expr;\n }\n }\n\n this.expect(tt.question);\n const state = this.state.clone();\n const originalNoArrowAt = this.state.noArrowAt;\n const node = this.startNodeAt(startLoc);\n let { consequent, failed } = this.tryParseConditionalConsequent();\n let [valid, invalid] = this.getArrowLikeExpressions(consequent);\n\n if (failed || invalid.length > 0) {\n const noArrowAt = [...originalNoArrowAt];\n\n if (invalid.length > 0) {\n this.state = state;\n this.state.noArrowAt = noArrowAt;\n\n for (let i = 0; i < invalid.length; i++) {\n noArrowAt.push(invalid[i].start);\n }\n\n ({ consequent, failed } = this.tryParseConditionalConsequent());\n [valid, invalid] = this.getArrowLikeExpressions(consequent);\n }\n\n if (failed && valid.length > 1) {\n // if there are two or more possible correct ways of parsing, throw an\n // error.\n // e.g. Source: a ? (b): c => (d): e => f\n // Result 1: a ? b : (c => ((d): e => f))\n // Result 2: a ? ((b): c => d) : (e => f)\n this.raise(FlowErrors.AmbiguousConditionalArrow, state.startLoc);\n }\n\n if (failed && valid.length === 1) {\n this.state = state;\n noArrowAt.push(valid[0].start);\n this.state.noArrowAt = noArrowAt;\n ({ consequent, failed } = this.tryParseConditionalConsequent());\n }\n }\n\n this.getArrowLikeExpressions(consequent, true);\n\n this.state.noArrowAt = originalNoArrowAt;\n this.expect(tt.colon);\n\n node.test = expr;\n node.consequent = consequent;\n node.alternate = this.forwardNoArrowParamsConversionAt(node, () =>\n this.parseMaybeAssign(undefined, undefined),\n );\n\n return this.finishNode(node, \"ConditionalExpression\");\n }\n\n tryParseConditionalConsequent(): {\n consequent: N.Expression;\n failed: boolean;\n } {\n this.state.noArrowParamsConversionAt.push(this.state.start);\n\n const consequent = this.parseMaybeAssignAllowIn();\n const failed = !this.match(tt.colon);\n\n this.state.noArrowParamsConversionAt.pop();\n\n return { consequent, failed };\n }\n\n // Given an expression, walks through out its arrow functions whose body is\n // an expression and through out conditional expressions. It returns every\n // function which has been parsed with a return type but could have been\n // parenthesized expressions.\n // These functions are separated into two arrays: one containing the ones\n // whose parameters can be converted to assignable lists, one containing the\n // others.\n getArrowLikeExpressions(\n node: N.Expression,\n disallowInvalid?: boolean,\n ): [N.ArrowFunctionExpression[], N.ArrowFunctionExpression[]] {\n const stack = [node];\n const arrows: N.ArrowFunctionExpression[] = [];\n\n while (stack.length !== 0) {\n const node = stack.pop();\n if (\n node.type === \"ArrowFunctionExpression\" &&\n node.body.type !== \"BlockStatement\"\n ) {\n if (node.typeParameters || !node.returnType) {\n // This is an arrow expression without ambiguity, so check its parameters\n this.finishArrowValidation(node);\n } else {\n arrows.push(node);\n }\n stack.push(node.body);\n } else if (node.type === \"ConditionalExpression\") {\n stack.push(node.consequent);\n stack.push(node.alternate);\n }\n }\n\n if (disallowInvalid) {\n arrows.forEach(node => this.finishArrowValidation(node));\n return [arrows, []];\n }\n\n return partition(arrows, node =>\n node.params.every(param => this.isAssignable(param, true)),\n );\n }\n\n finishArrowValidation(node: N.ArrowFunctionExpression) {\n this.toAssignableList(\n // node.params is Expression[] instead of $ReadOnlyArray because it\n // has not been converted yet.\n node.params as any as N.Expression[],\n node.extra?.trailingCommaLoc,\n /* isLHS */ false,\n );\n // Enter scope, as checkParams defines bindings\n this.scope.enter(ScopeFlag.FUNCTION | ScopeFlag.ARROW);\n // Use super's method to force the parameters to be checked\n super.checkParams(node, false, true);\n this.scope.exit();\n }\n\n forwardNoArrowParamsConversionAt(\n node: Undone,\n parse: () => T,\n ): T {\n let result: T;\n if (\n this.state.noArrowParamsConversionAt.includes(\n this.offsetToSourcePos(node.start),\n )\n ) {\n this.state.noArrowParamsConversionAt.push(this.state.start);\n result = parse();\n this.state.noArrowParamsConversionAt.pop();\n } else {\n result = parse();\n }\n\n return result;\n }\n\n parseParenItem(\n node: T,\n startLoc: Position,\n ): T | N.TypeCastExpression | N.TsTypeCastExpression {\n const newNode = super.parseParenItem(node, startLoc);\n if (this.eat(tt.question)) {\n (newNode as N.Identifier).optional = true;\n // Include questionmark in location of node\n // Don't use this.finishNode() as otherwise we might process comments twice and\n // include already consumed parens\n this.resetEndLocation(node);\n }\n\n if (this.match(tt.colon)) {\n const typeCastNode = this.startNodeAt(startLoc);\n typeCastNode.expression = newNode as N.Expression;\n typeCastNode.typeAnnotation = this.flowParseTypeAnnotation();\n\n return this.finishNode(typeCastNode, \"TypeCastExpression\");\n }\n\n return newNode;\n }\n\n assertModuleNodeAllowed(node: N.Node) {\n if (\n (node.type === \"ImportDeclaration\" &&\n (node.importKind === \"type\" || node.importKind === \"typeof\")) ||\n (node.type === \"ExportNamedDeclaration\" &&\n node.exportKind === \"type\") ||\n (node.type === \"ExportAllDeclaration\" && node.exportKind === \"type\")\n ) {\n // Allow Flowtype imports and exports in all conditions because\n // Flow itself does not care about 'sourceType'.\n return;\n }\n\n super.assertModuleNodeAllowed(node);\n }\n\n parseExportDeclaration(\n node: N.ExportNamedDeclaration,\n ): N.Declaration | undefined | null {\n if (this.isContextual(tt._type)) {\n node.exportKind = \"type\";\n\n const declarationNode = this.startNode();\n this.next();\n\n if (this.match(tt.braceL)) {\n // export type { foo, bar };\n node.specifiers = this.parseExportSpecifiers(\n /* isInTypeExport */ true,\n );\n super.parseExportFrom(node);\n return null;\n } else {\n // export type Foo = Bar;\n // @ts-expect-error: refine typings\n return this.flowParseTypeAlias(declarationNode);\n }\n } else if (this.isContextual(tt._opaque)) {\n node.exportKind = \"type\";\n\n const declarationNode = this.startNode();\n this.next();\n // export opaque type Foo = Bar;\n // @ts-expect-error: refine typings\n return this.flowParseOpaqueType(declarationNode, false);\n } else if (this.isContextual(tt._interface)) {\n node.exportKind = \"type\";\n const declarationNode = this.startNode();\n this.next();\n // @ts-expect-error: refine typings\n return this.flowParseInterface(declarationNode);\n } else if (this.isContextual(tt._enum)) {\n node.exportKind = \"value\";\n const declarationNode = this.startNode();\n this.next();\n // @ts-expect-error: refine typings\n return this.flowParseEnumDeclaration(declarationNode);\n } else {\n return super.parseExportDeclaration(node);\n }\n }\n\n eatExportStar(\n node: Undone,\n ): node is Undone {\n if (super.eatExportStar(node)) return true;\n\n if (this.isContextual(tt._type) && this.lookahead().type === tt.star) {\n (\n node as Undone\n ).exportKind = \"type\";\n this.next();\n this.next();\n return true;\n }\n\n return false;\n }\n\n maybeParseExportNamespaceSpecifier(\n node: Undone,\n ): node is Undone {\n const { startLoc } = this.state;\n const hasNamespace = super.maybeParseExportNamespaceSpecifier(node);\n if (hasNamespace && node.exportKind === \"type\") {\n this.unexpected(startLoc);\n }\n return hasNamespace;\n }\n\n parseClassId(\n node: N.Class,\n isStatement: boolean,\n optionalId?: boolean | null,\n ) {\n super.parseClassId(node, isStatement, optionalId);\n if (this.match(tt.lt)) {\n node.typeParameters = this.flowParseTypeParameterDeclaration();\n }\n }\n\n parseClassMember(\n classBody: N.ClassBody,\n member: any,\n state: N.ParseClassMemberState,\n ): void {\n const { startLoc } = this.state;\n if (this.isContextual(tt._declare)) {\n if (super.parseClassMemberFromModifier(classBody, member)) {\n // 'declare' is a class element name\n return;\n }\n\n member.declare = true;\n }\n\n super.parseClassMember(classBody, member, state);\n\n if (member.declare) {\n if (\n member.type !== \"ClassProperty\" &&\n member.type !== \"ClassPrivateProperty\" &&\n member.type !== \"PropertyDefinition\" // Used by estree plugin\n ) {\n this.raise(FlowErrors.DeclareClassElement, startLoc);\n } else if (member.value) {\n this.raise(FlowErrors.DeclareClassFieldInitializer, member.value);\n }\n }\n }\n\n isIterator(word: string): boolean {\n return word === \"iterator\" || word === \"asyncIterator\";\n }\n\n readIterator(): void {\n const word = super.readWord1();\n const fullWord = \"@@\" + word;\n\n // Allow @@iterator and @@asyncIterator as a identifier only inside type\n if (!this.isIterator(word) || !this.state.inType) {\n this.raise(Errors.InvalidIdentifier, this.state.curPosition(), {\n identifierName: fullWord,\n });\n }\n\n this.finishToken(tt.name, fullWord);\n }\n\n // ensure that inside flow types, we bypass the jsx parser plugin\n getTokenFromCode(code: number): void {\n const next = this.input.charCodeAt(this.state.pos + 1);\n if (code === charCodes.leftCurlyBrace && next === charCodes.verticalBar) {\n this.finishOp(tt.braceBarL, 2);\n } else if (\n this.state.inType &&\n (code === charCodes.greaterThan || code === charCodes.lessThan)\n ) {\n this.finishOp(code === charCodes.greaterThan ? tt.gt : tt.lt, 1);\n } else if (this.state.inType && code === charCodes.questionMark) {\n if (next === charCodes.dot) {\n this.finishOp(tt.questionDot, 2);\n } else {\n // allow double nullable types in Flow: ??string\n this.finishOp(tt.question, 1);\n }\n } else if (\n isIteratorStart(code, next, this.input.charCodeAt(this.state.pos + 2))\n ) {\n this.state.pos += 2; // eat \"@@\"\n this.readIterator();\n } else {\n super.getTokenFromCode(code);\n }\n }\n\n isAssignable(node: N.Node, isBinding?: boolean): boolean {\n if (node.type === \"TypeCastExpression\") {\n return this.isAssignable(node.expression, isBinding);\n } else {\n return super.isAssignable(node, isBinding);\n }\n }\n\n toAssignable(node: N.Node, isLHS: boolean = false): void {\n if (\n !isLHS &&\n node.type === \"AssignmentExpression\" &&\n node.left.type === \"TypeCastExpression\"\n ) {\n node.left = this.typeCastToParameter(node.left) as N.Assignable;\n }\n super.toAssignable(node, isLHS);\n }\n\n // turn type casts that we found in function parameter head into type annotated params\n toAssignableList(\n exprList: N.Expression[],\n trailingCommaLoc: Position | undefined | null,\n isLHS: boolean,\n ): void {\n for (let i = 0; i < exprList.length; i++) {\n const expr = exprList[i];\n if (expr?.type === \"TypeCastExpression\") {\n exprList[i] = this.typeCastToParameter(expr);\n }\n }\n super.toAssignableList(exprList, trailingCommaLoc, isLHS);\n }\n\n // this is a list of nodes, from something like a call expression, we need to filter the\n // type casts that we've found that are illegal in this context\n toReferencedList(\n exprList:\n | ReadonlyArray\n | ReadonlyArray,\n isParenthesizedExpr?: boolean,\n ):\n | ReadonlyArray\n | ReadonlyArray {\n for (let i = 0; i < exprList.length; i++) {\n const expr = exprList[i];\n if (\n expr &&\n expr.type === \"TypeCastExpression\" &&\n !expr.extra?.parenthesized &&\n (exprList.length > 1 || !isParenthesizedExpr)\n ) {\n this.raise(FlowErrors.TypeCastInPattern, expr.typeAnnotation);\n }\n }\n\n return exprList;\n }\n\n parseArrayLike(\n close: TokenType,\n canBePattern: boolean,\n isTuple: boolean,\n refExpressionErrors?: ExpressionErrors | null,\n ): N.ArrayExpression | N.TupleExpression {\n const node = super.parseArrayLike(\n close,\n canBePattern,\n isTuple,\n refExpressionErrors,\n );\n\n // This could be an array pattern:\n // ([a: string, b: string]) => {}\n // In this case, we don't have to call toReferencedList. We will\n // call it, if needed, when we are sure that it is a parenthesized\n // expression by calling toReferencedListDeep.\n if (canBePattern && !this.state.maybeInArrowParameters) {\n this.toReferencedList(node.elements);\n }\n\n return node;\n }\n\n isValidLVal(type: string, isParenthesized: boolean, binding: BindingFlag) {\n return (\n type === \"TypeCastExpression\" ||\n super.isValidLVal(type, isParenthesized, binding)\n );\n }\n\n // parse class property type annotations\n parseClassProperty(node: N.ClassProperty): N.ClassProperty {\n if (this.match(tt.colon)) {\n node.typeAnnotation = this.flowParseTypeAnnotation();\n }\n return super.parseClassProperty(node);\n }\n\n parseClassPrivateProperty(\n node: N.ClassPrivateProperty,\n ): N.ClassPrivateProperty {\n if (this.match(tt.colon)) {\n node.typeAnnotation = this.flowParseTypeAnnotation();\n }\n return super.parseClassPrivateProperty(node);\n }\n\n // determine whether or not we're currently in the position where a class method would appear\n isClassMethod(): boolean {\n return this.match(tt.lt) || super.isClassMethod();\n }\n\n // determine whether or not we're currently in the position where a class property would appear\n isClassProperty(): boolean {\n return this.match(tt.colon) || super.isClassProperty();\n }\n\n isNonstaticConstructor(method: N.ClassMethod | N.ClassProperty): boolean {\n return !this.match(tt.colon) && super.isNonstaticConstructor(method);\n }\n\n // parse type parameters for class methods\n pushClassMethod(\n classBody: N.ClassBody,\n method: N.ClassMethod,\n isGenerator: boolean,\n isAsync: boolean,\n isConstructor: boolean,\n allowsDirectSuper: boolean,\n ): void {\n if ((method as any).variance) {\n this.unexpected((method as any).variance.loc.start);\n }\n delete (method as any).variance;\n if (this.match(tt.lt)) {\n method.typeParameters = this.flowParseTypeParameterDeclaration();\n }\n\n super.pushClassMethod(\n classBody,\n method,\n isGenerator,\n isAsync,\n isConstructor,\n allowsDirectSuper,\n );\n\n if (method.params && isConstructor) {\n const params = method.params;\n if (params.length > 0 && this.isThisParam(params[0])) {\n this.raise(FlowErrors.ThisParamBannedInConstructor, method);\n }\n // estree support\n } else if (\n // @ts-expect-error TS does not know about the fact that estree can replace ClassMethod with MethodDefinition\n method.type === \"MethodDefinition\" &&\n isConstructor &&\n // @ts-expect-error estree\n method.value.params\n ) {\n // @ts-expect-error estree\n const params = method.value.params;\n if (params.length > 0 && this.isThisParam(params[0])) {\n this.raise(FlowErrors.ThisParamBannedInConstructor, method);\n }\n }\n }\n\n pushClassPrivateMethod(\n classBody: N.ClassBody,\n method: N.ClassPrivateMethod,\n isGenerator: boolean,\n isAsync: boolean,\n ): void {\n if ((method as any).variance) {\n this.unexpected((method as any).variance.loc.start);\n }\n delete (method as any).variance;\n if (this.match(tt.lt)) {\n method.typeParameters = this.flowParseTypeParameterDeclaration();\n }\n\n super.pushClassPrivateMethod(classBody, method, isGenerator, isAsync);\n }\n\n // parse a the super class type parameters and implements\n parseClassSuper(node: N.Class): void {\n super.parseClassSuper(node);\n if (\n node.superClass &&\n (this.match(tt.lt) ||\n // handles `class extends C<`\n this.match(tt.bitShiftL))\n ) {\n if (process.env.BABEL_8_BREAKING) {\n node.superTypeArguments =\n this.flowParseTypeParameterInstantiationInExpression();\n } else {\n node.superTypeParameters =\n this.flowParseTypeParameterInstantiationInExpression();\n }\n }\n if (this.isContextual(tt._implements)) {\n this.next();\n const implemented: N.FlowClassImplements[] = (node.implements = []);\n do {\n const node = this.startNode();\n node.id = this.flowParseRestrictedIdentifier(/*liberal*/ true);\n if (this.match(tt.lt)) {\n node.typeParameters = this.flowParseTypeParameterInstantiation();\n } else {\n node.typeParameters = null;\n }\n implemented.push(this.finishNode(node, \"ClassImplements\"));\n } while (this.eat(tt.comma));\n }\n }\n\n checkGetterSetterParams(method: N.ObjectMethod | N.ClassMethod): void {\n super.checkGetterSetterParams(method);\n const params = this.getObjectOrClassMethodParams(method);\n if (params.length > 0) {\n const param = params[0];\n if (this.isThisParam(param) && method.kind === \"get\") {\n this.raise(FlowErrors.GetterMayNotHaveThisParam, param);\n } else if (this.isThisParam(param)) {\n this.raise(FlowErrors.SetterMayNotHaveThisParam, param);\n }\n }\n }\n\n parsePropertyNamePrefixOperator(\n node: N.ObjectOrClassMember | N.ClassMember,\n ): void {\n node.variance = this.flowParseVariance();\n }\n\n // parse type parameters for object method shorthand\n parseObjPropValue(\n prop: Undone,\n startLoc: Position | undefined | null,\n isGenerator: boolean,\n isAsync: boolean,\n isPattern: boolean,\n isAccessor: boolean,\n refExpressionErrors?: ExpressionErrors | null,\n ): T {\n if ((prop as any).variance) {\n this.unexpected((prop as any).variance.loc.start);\n }\n delete (prop as any).variance;\n\n let typeParameters;\n\n // method shorthand\n if (this.match(tt.lt) && !isAccessor) {\n typeParameters = this.flowParseTypeParameterDeclaration();\n if (!this.match(tt.parenL)) this.unexpected();\n }\n\n const result = super.parseObjPropValue(\n prop,\n startLoc,\n isGenerator,\n isAsync,\n isPattern,\n isAccessor,\n refExpressionErrors,\n );\n\n // add typeParameters if we found them\n if (typeParameters) {\n // @ts-expect-error: refine typings\n (result.value || result).typeParameters = typeParameters;\n }\n return result;\n }\n\n parseFunctionParamType(param: N.Pattern): N.Pattern {\n if (this.eat(tt.question)) {\n if (param.type !== \"Identifier\") {\n this.raise(FlowErrors.PatternIsOptional, param);\n }\n if (this.isThisParam(param)) {\n this.raise(FlowErrors.ThisParamMayNotBeOptional, param);\n }\n\n (param as any as N.Identifier).optional = true;\n }\n if (this.match(tt.colon)) {\n param.typeAnnotation = this.flowParseTypeAnnotation();\n } else if (this.isThisParam(param)) {\n this.raise(FlowErrors.ThisParamAnnotationRequired, param);\n }\n\n if (this.match(tt.eq) && this.isThisParam(param)) {\n this.raise(FlowErrors.ThisParamNoDefault, param);\n }\n\n this.resetEndLocation(param);\n return param;\n }\n\n parseMaybeDefault

(\n startLoc?: Position | null,\n left?: P | null,\n ): P | N.AssignmentPattern {\n const node = super.parseMaybeDefault(startLoc, left);\n\n if (\n node.type === \"AssignmentPattern\" &&\n node.typeAnnotation &&\n node.right.start < node.typeAnnotation.start\n ) {\n this.raise(FlowErrors.TypeBeforeInitializer, node.typeAnnotation);\n }\n\n return node;\n }\n\n checkImportReflection(node: Undone) {\n super.checkImportReflection(node);\n if (node.module && node.importKind !== \"value\") {\n this.raise(\n FlowErrors.ImportReflectionHasImportType,\n node.specifiers[0].loc.start,\n );\n }\n }\n\n parseImportSpecifierLocal<\n T extends\n | N.ImportSpecifier\n | N.ImportDefaultSpecifier\n | N.ImportNamespaceSpecifier,\n >(node: N.ImportDeclaration, specifier: Undone, type: T[\"type\"]): void {\n specifier.local = hasTypeImportKind(node)\n ? this.flowParseRestrictedIdentifier(\n /* liberal */ true,\n /* declaration */ true,\n )\n : this.parseIdentifier();\n\n node.specifiers.push(this.finishImportSpecifier(specifier, type));\n }\n\n isPotentialImportPhase(isExport: boolean): boolean {\n if (super.isPotentialImportPhase(isExport)) return true;\n if (this.isContextual(tt._type)) {\n if (!isExport) return true;\n const ch = this.lookaheadCharCode();\n return ch === charCodes.leftCurlyBrace || ch === charCodes.asterisk;\n }\n return !isExport && this.isContextual(tt._typeof);\n }\n\n applyImportPhase(\n node: Undone,\n isExport: boolean,\n phase: string | null,\n loc?: Position,\n ): void {\n super.applyImportPhase(node, isExport, phase, loc);\n if (isExport) {\n if (!phase && this.match(tt._default)) {\n // TODO: Align with our TS AST and always add .exportKind\n return;\n }\n (node as N.ExportNamedDeclaration).exportKind =\n phase === \"type\" ? phase : \"value\";\n } else {\n if (phase === \"type\" && this.match(tt.star)) this.unexpected();\n (node as N.ImportDeclaration).importKind =\n phase === \"type\" || phase === \"typeof\" ? phase : \"value\";\n }\n }\n\n // parse import-type/typeof shorthand\n parseImportSpecifier(\n specifier: any,\n importedIsString: boolean,\n isInTypeOnlyImport: boolean,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isMaybeTypeOnly: boolean,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n bindingType: BindingFlag | undefined,\n ): N.ImportSpecifier {\n const firstIdent = specifier.imported;\n\n let specifierTypeKind = null;\n if (firstIdent.type === \"Identifier\") {\n if (firstIdent.name === \"type\") {\n specifierTypeKind = \"type\";\n } else if (firstIdent.name === \"typeof\") {\n specifierTypeKind = \"typeof\";\n }\n }\n\n let isBinding = false;\n if (this.isContextual(tt._as) && !this.isLookaheadContextual(\"as\")) {\n const as_ident = this.parseIdentifier(true);\n if (\n specifierTypeKind !== null &&\n !tokenIsKeywordOrIdentifier(this.state.type)\n ) {\n // `import {type as ,` or `import {type as }`\n specifier.imported = as_ident;\n specifier.importKind = specifierTypeKind;\n specifier.local = this.cloneIdentifier(as_ident);\n } else {\n // `import {type as foo`\n specifier.imported = firstIdent;\n specifier.importKind = null;\n specifier.local = this.parseIdentifier();\n }\n } else {\n if (\n specifierTypeKind !== null &&\n tokenIsKeywordOrIdentifier(this.state.type)\n ) {\n // `import {type foo`\n specifier.imported = this.parseIdentifier(true);\n specifier.importKind = specifierTypeKind;\n } else {\n if (importedIsString) {\n /*:: invariant(firstIdent instanceof N.StringLiteral) */\n throw this.raise(Errors.ImportBindingIsString, specifier, {\n importName: firstIdent.value,\n });\n }\n /*:: invariant(firstIdent instanceof N.Node) */\n specifier.imported = firstIdent;\n specifier.importKind = null;\n }\n\n if (this.eatContextual(tt._as)) {\n specifier.local = this.parseIdentifier();\n } else {\n isBinding = true;\n specifier.local = this.cloneIdentifier(specifier.imported);\n }\n }\n\n const specifierIsTypeImport = hasTypeImportKind(specifier);\n\n if (isInTypeOnlyImport && specifierIsTypeImport) {\n this.raise(FlowErrors.ImportTypeShorthandOnlyInPureImport, specifier);\n }\n\n if (isInTypeOnlyImport || specifierIsTypeImport) {\n this.checkReservedType(\n specifier.local.name,\n specifier.local.loc.start,\n /* declaration */ true,\n );\n }\n\n if (isBinding && !isInTypeOnlyImport && !specifierIsTypeImport) {\n this.checkReservedWord(\n specifier.local.name,\n specifier.loc.start,\n true,\n true,\n );\n }\n\n return this.finishImportSpecifier(specifier, \"ImportSpecifier\");\n }\n\n parseBindingAtom(): N.Pattern {\n switch (this.state.type) {\n case tt._this:\n // \"this\" may be the name of a parameter, so allow it.\n return this.parseIdentifier(/* liberal */ true);\n default:\n return super.parseBindingAtom();\n }\n }\n\n // parse function type parameters - function foo() {}\n parseFunctionParams(\n node: Undone,\n isConstructor: boolean,\n ): void {\n // @ts-expect-error kind may not index node\n const kind = node.kind;\n if (kind !== \"get\" && kind !== \"set\" && this.match(tt.lt)) {\n node.typeParameters = this.flowParseTypeParameterDeclaration();\n }\n super.parseFunctionParams(node, isConstructor);\n }\n\n // parse flow type annotations on variable declarator heads - let foo: string = bar\n parseVarId(\n decl: N.VariableDeclarator,\n kind: \"var\" | \"let\" | \"const\" | \"using\" | \"await using\",\n ): void {\n super.parseVarId(decl, kind);\n if (this.match(tt.colon)) {\n decl.id.typeAnnotation = this.flowParseTypeAnnotation();\n this.resetEndLocation(decl.id); // set end position to end of type\n }\n }\n\n // parse the return type of an async arrow function - let foo = (async (): number => {});\n parseAsyncArrowFromCallExpression(\n node: N.ArrowFunctionExpression,\n call: N.CallExpression,\n ): N.ArrowFunctionExpression {\n if (this.match(tt.colon)) {\n const oldNoAnonFunctionType = this.state.noAnonFunctionType;\n this.state.noAnonFunctionType = true;\n node.returnType = this.flowParseTypeAnnotation();\n this.state.noAnonFunctionType = oldNoAnonFunctionType;\n }\n\n return super.parseAsyncArrowFromCallExpression(node, call);\n }\n\n // todo description\n shouldParseAsyncArrow(): boolean {\n return this.match(tt.colon) || super.shouldParseAsyncArrow();\n }\n\n // We need to support type parameter declarations for arrow functions. This\n // is tricky. There are three situations we need to handle\n //\n // 1. This is either JSX or an arrow function. We'll try JSX first. If that\n // fails, we'll try an arrow function. If that fails, we'll throw the JSX\n // error.\n // 2. This is an arrow function. We'll parse the type parameter declaration,\n // parse the rest, make sure the rest is an arrow function, and go from\n // there\n // 3. This is neither. Just call the super method\n parseMaybeAssign(\n refExpressionErrors?: ExpressionErrors | null,\n afterLeftParse?: Function,\n ): N.Expression {\n let state = null;\n\n let jsx;\n\n if (\n this.hasPlugin(\"jsx\") &&\n (this.match(tt.jsxTagStart) || this.match(tt.lt))\n ) {\n state = this.state.clone();\n\n jsx = this.tryParse(\n () => super.parseMaybeAssign(refExpressionErrors, afterLeftParse),\n state,\n );\n\n /*:: invariant(!jsx.aborted) */\n /*:: invariant(jsx.node != null) */\n if (!jsx.error) return jsx.node;\n\n // Remove `tc.j_expr` and `tc.j_oTag` from context added\n // by parsing `jsxTagStart` to stop the JSX plugin from\n // messing with the tokens\n const { context } = this.state;\n const currentContext = context[context.length - 1];\n if (currentContext === tc.j_oTag || currentContext === tc.j_expr) {\n context.pop();\n }\n }\n\n if (jsx?.error || this.match(tt.lt)) {\n state = state || this.state.clone();\n\n let typeParameters: N.TypeParameterDeclaration;\n\n const arrow = this.tryParse((abort: () => never) => {\n typeParameters = this.flowParseTypeParameterDeclaration();\n\n const arrowExpression = this.forwardNoArrowParamsConversionAt(\n typeParameters,\n () => {\n const result = super.parseMaybeAssign(\n refExpressionErrors,\n afterLeftParse,\n );\n\n this.resetStartLocationFromNode(result, typeParameters);\n\n return result;\n },\n );\n\n // (() => {});\n // (() => {}: any);\n if (arrowExpression.extra?.parenthesized) abort();\n\n // The above can return a TypeCastExpression when the arrow\n // expression is not wrapped in parens. See also `this.parseParenItem`.\n // (() => {}: any);\n const expr = this.maybeUnwrapTypeCastExpression(arrowExpression);\n\n if (expr.type !== \"ArrowFunctionExpression\") abort();\n\n expr.typeParameters = typeParameters;\n this.resetStartLocationFromNode(expr, typeParameters);\n\n return arrowExpression;\n }, state);\n\n let arrowExpression:\n | N.ArrowFunctionExpression\n | N.TypeCastExpression\n | undefined\n | null = null;\n\n if (\n arrow.node &&\n this.maybeUnwrapTypeCastExpression(arrow.node).type ===\n \"ArrowFunctionExpression\"\n ) {\n if (!arrow.error && !arrow.aborted) {\n // async () => {}\n // @ts-expect-error: refine tryParse typings\n if (arrow.node.async) {\n /*:: invariant(typeParameters) */\n this.raise(\n FlowErrors.UnexpectedTypeParameterBeforeAsyncArrowFunction,\n typeParameters,\n );\n }\n return arrow.node;\n }\n\n // @ts-expect-error: refine typings\n arrowExpression = arrow.node;\n }\n\n // If we are here, both JSX and Flow parsing attempts failed.\n // Give the precedence to the JSX error, except if JSX had an\n // unrecoverable error while Flow didn't.\n // If the error is recoverable, we can only re-report it if there is\n // a node we can return.\n\n if (jsx?.node) {\n /*:: invariant(jsx.failState) */\n this.state = jsx.failState;\n return jsx.node;\n }\n\n if (arrowExpression) {\n /*:: invariant(arrow.failState) */\n this.state = arrow.failState;\n return arrowExpression;\n }\n\n if (jsx?.thrown) throw jsx.error;\n if (arrow.thrown) throw arrow.error;\n\n /*:: invariant(typeParameters) */\n throw this.raise(\n FlowErrors.UnexpectedTokenAfterTypeParameter,\n typeParameters,\n );\n }\n\n return super.parseMaybeAssign(refExpressionErrors, afterLeftParse);\n }\n\n // handle return types for arrow functions\n parseArrow(\n node: Undone,\n ): Undone | undefined | null {\n if (this.match(tt.colon)) {\n // @ts-expect-error todo(flow->ts)\n const result = this.tryParse(() => {\n const oldNoAnonFunctionType = this.state.noAnonFunctionType;\n this.state.noAnonFunctionType = true;\n\n const typeNode = this.startNode();\n\n [\n typeNode.typeAnnotation,\n // @ts-expect-error (destructuring not supported yet)\n node.predicate,\n ] = this.flowParseTypeAndPredicateInitialiser();\n\n this.state.noAnonFunctionType = oldNoAnonFunctionType;\n\n if (this.canInsertSemicolon()) this.unexpected();\n if (!this.match(tt.arrow)) this.unexpected();\n\n return typeNode;\n });\n\n if (result.thrown) return null;\n /*:: invariant(result.node) */\n\n if (result.error) this.state = result.failState;\n\n // assign after it is clear it is an arrow\n // @ts-expect-error todo(flow->ts)\n node.returnType = result.node.typeAnnotation\n ? this.finishNode(result.node, \"TypeAnnotation\")\n : null;\n }\n\n return super.parseArrow(node);\n }\n\n shouldParseArrow(params: Array): boolean {\n return this.match(tt.colon) || super.shouldParseArrow(params);\n }\n\n setArrowFunctionParameters(\n node: Undone,\n params:\n | Array\n | Array,\n ): void {\n if (\n this.state.noArrowParamsConversionAt.includes(\n this.offsetToSourcePos(node.start),\n )\n ) {\n node.params = params as N.ArrowFunctionExpression[\"params\"];\n } else {\n super.setArrowFunctionParameters(node, params);\n }\n }\n\n checkParams(\n node: N.Function,\n allowDuplicates: boolean,\n isArrowFunction?: boolean | null,\n strictModeChanged: boolean = true,\n ): void {\n if (\n isArrowFunction &&\n this.state.noArrowParamsConversionAt.includes(\n this.offsetToSourcePos(node.start),\n )\n ) {\n return;\n }\n\n // ensure the `this` param is first, if it exists\n for (let i = 0; i < node.params.length; i++) {\n if (this.isThisParam(node.params[i]) && i > 0) {\n this.raise(FlowErrors.ThisParamMustBeFirst, node.params[i]);\n }\n }\n\n super.checkParams(\n node,\n allowDuplicates,\n isArrowFunction,\n strictModeChanged,\n );\n }\n\n parseParenAndDistinguishExpression(canBeArrow: boolean): N.Expression {\n return super.parseParenAndDistinguishExpression(\n canBeArrow &&\n !this.state.noArrowAt.includes(\n this.sourceToOffsetPos(this.state.start),\n ),\n );\n }\n\n parseSubscripts(\n base: N.Expression,\n startLoc: Position,\n noCalls?: boolean | null,\n ): N.Expression {\n if (\n base.type === \"Identifier\" &&\n base.name === \"async\" &&\n this.state.noArrowAt.includes(startLoc.index)\n ) {\n this.next();\n\n const node = this.startNodeAt(startLoc);\n node.callee = base;\n node.arguments = super.parseCallExpressionArguments();\n base = this.finishNode(node, \"CallExpression\");\n } else if (\n base.type === \"Identifier\" &&\n base.name === \"async\" &&\n this.match(tt.lt)\n ) {\n const state = this.state.clone();\n const arrow = this.tryParse(\n abort => this.parseAsyncArrowWithTypeParameters(startLoc) || abort(),\n state,\n );\n\n /*:: invariant(arrow.node != null) */\n // @ts-expect-error: refine tryParse typings\n if (!arrow.error && !arrow.aborted) return arrow.node;\n\n const result = this.tryParse(\n () => super.parseSubscripts(base, startLoc, noCalls),\n state,\n );\n\n if (result.node && !result.error) return result.node;\n\n if (arrow.node) {\n this.state = arrow.failState;\n // @ts-expect-error: refine tryParse typings\n return arrow.node;\n }\n\n if (result.node) {\n this.state = result.failState;\n return result.node;\n }\n\n throw arrow.error || result.error;\n }\n\n return super.parseSubscripts(base, startLoc, noCalls);\n }\n\n parseSubscript(\n base: N.Expression,\n\n startLoc: Position,\n noCalls: boolean | undefined | null,\n subscriptState: N.ParseSubscriptState,\n ): N.Expression {\n if (this.match(tt.questionDot) && this.isLookaheadToken_lt()) {\n subscriptState.optionalChainMember = true;\n if (noCalls) {\n subscriptState.stop = true;\n return base;\n }\n this.next();\n const node = this.startNodeAt(startLoc);\n node.callee = base;\n node.typeArguments =\n this.flowParseTypeParameterInstantiationInExpression();\n this.expect(tt.parenL);\n node.arguments = this.parseCallExpressionArguments();\n node.optional = true;\n return this.finishCallExpression(node, /* optional */ true);\n } else if (\n !noCalls &&\n this.shouldParseTypes() &&\n (this.match(tt.lt) ||\n // also handles `new C<`\n this.match(tt.bitShiftL))\n ) {\n const node = this.startNodeAt<\n N.OptionalCallExpression | N.CallExpression\n >(startLoc);\n node.callee = base;\n\n const result = this.tryParse(() => {\n node.typeArguments =\n this.flowParseTypeParameterInstantiationCallOrNew();\n this.expect(tt.parenL);\n node.arguments = super.parseCallExpressionArguments();\n if (subscriptState.optionalChainMember) {\n (node as Undone).optional = false;\n }\n return this.finishCallExpression(\n node,\n subscriptState.optionalChainMember,\n );\n });\n\n if (result.node) {\n if (result.error) this.state = result.failState;\n return result.node;\n }\n }\n\n return super.parseSubscript(\n base,\n\n startLoc,\n noCalls,\n subscriptState,\n );\n }\n\n parseNewCallee(node: N.NewExpression): void {\n super.parseNewCallee(node);\n\n let targs = null;\n if (this.shouldParseTypes() && this.match(tt.lt)) {\n targs = this.tryParse(() =>\n this.flowParseTypeParameterInstantiationCallOrNew(),\n ).node;\n }\n node.typeArguments = targs;\n }\n\n parseAsyncArrowWithTypeParameters(\n startLoc: Position,\n ): N.ArrowFunctionExpression | undefined | null {\n const node = this.startNodeAt(startLoc);\n this.parseFunctionParams(node, false);\n if (!this.parseArrow(node)) return;\n return super.parseArrowExpression(\n node,\n /* params */ undefined,\n /* isAsync */ true,\n );\n }\n\n readToken_mult_modulo(code: number): void {\n const next = this.input.charCodeAt(this.state.pos + 1);\n if (\n code === charCodes.asterisk &&\n next === charCodes.slash &&\n this.state.hasFlowComment\n ) {\n this.state.hasFlowComment = false;\n this.state.pos += 2;\n this.nextToken();\n return;\n }\n\n super.readToken_mult_modulo(code);\n }\n\n readToken_pipe_amp(code: number): void {\n const next = this.input.charCodeAt(this.state.pos + 1);\n if (\n code === charCodes.verticalBar &&\n next === charCodes.rightCurlyBrace\n ) {\n // '|}'\n this.finishOp(tt.braceBarR, 2);\n return;\n }\n\n super.readToken_pipe_amp(code);\n }\n\n parseTopLevel(file: N.File, program: N.Program): N.File {\n const fileNode = super.parseTopLevel(file, program);\n if (this.state.hasFlowComment) {\n this.raise(\n FlowErrors.UnterminatedFlowComment,\n this.state.curPosition(),\n );\n }\n return fileNode;\n }\n\n skipBlockComment(): N.CommentBlock | undefined {\n if (this.hasPlugin(\"flowComments\") && this.skipFlowComment()) {\n if (this.state.hasFlowComment) {\n throw this.raise(FlowErrors.NestedFlowComment, this.state.startLoc);\n }\n this.hasFlowCommentCompletion();\n const commentSkip = this.skipFlowComment();\n if (commentSkip) {\n this.state.pos += commentSkip;\n this.state.hasFlowComment = true;\n }\n return;\n }\n\n return super.skipBlockComment(this.state.hasFlowComment ? \"*-/\" : \"*/\");\n }\n\n skipFlowComment(): number | false {\n const { pos } = this.state;\n let shiftToFirstNonWhiteSpace = 2;\n while (\n [charCodes.space, charCodes.tab].includes(\n // @ts-expect-error testing whether a number is included\n this.input.charCodeAt(pos + shiftToFirstNonWhiteSpace),\n )\n ) {\n shiftToFirstNonWhiteSpace++;\n }\n\n const ch2 = this.input.charCodeAt(shiftToFirstNonWhiteSpace + pos);\n const ch3 = this.input.charCodeAt(shiftToFirstNonWhiteSpace + pos + 1);\n\n if (ch2 === charCodes.colon && ch3 === charCodes.colon) {\n return shiftToFirstNonWhiteSpace + 2; // check for /*::\n }\n if (\n this.input.slice(\n shiftToFirstNonWhiteSpace + pos,\n shiftToFirstNonWhiteSpace + pos + 12,\n ) === \"flow-include\"\n ) {\n return shiftToFirstNonWhiteSpace + 12; // check for /*flow-include\n }\n if (ch2 === charCodes.colon && ch3 !== charCodes.colon) {\n return shiftToFirstNonWhiteSpace; // check for /*:, advance up to :\n }\n return false;\n }\n\n hasFlowCommentCompletion(): void {\n const end = this.input.indexOf(\"*/\", this.state.pos);\n if (end === -1) {\n throw this.raise(Errors.UnterminatedComment, this.state.curPosition());\n }\n }\n\n // Flow enum parsing\n\n flowEnumErrorBooleanMemberNotInitialized(\n loc: Position,\n {\n enumName,\n memberName,\n }: {\n enumName: string;\n memberName: string;\n },\n ): void {\n this.raise(FlowErrors.EnumBooleanMemberNotInitialized, loc, {\n memberName,\n enumName,\n });\n }\n\n flowEnumErrorInvalidMemberInitializer(\n loc: Position,\n enumContext: EnumContext,\n ) {\n return this.raise(\n !enumContext.explicitType\n ? FlowErrors.EnumInvalidMemberInitializerUnknownType\n : enumContext.explicitType === \"symbol\"\n ? FlowErrors.EnumInvalidMemberInitializerSymbolType\n : FlowErrors.EnumInvalidMemberInitializerPrimaryType,\n loc,\n enumContext,\n );\n }\n\n flowEnumErrorNumberMemberNotInitialized(\n loc: Position,\n details: {\n enumName: string;\n memberName: string;\n },\n ): void {\n this.raise(FlowErrors.EnumNumberMemberNotInitialized, loc, details);\n }\n\n flowEnumErrorStringMemberInconsistentlyInitialized(\n node: N.Node,\n details: {\n enumName: string;\n },\n ): void {\n this.raise(\n FlowErrors.EnumStringMemberInconsistentlyInitialized,\n node,\n details,\n );\n }\n\n flowEnumMemberInit(): EnumMemberInit {\n const startLoc = this.state.startLoc;\n const endOfInit = () => this.match(tt.comma) || this.match(tt.braceR);\n switch (this.state.type) {\n case tt.num: {\n const literal = this.parseNumericLiteral(this.state.value);\n if (endOfInit()) {\n return { type: \"number\", loc: literal.loc.start, value: literal };\n }\n return { type: \"invalid\", loc: startLoc };\n }\n case tt.string: {\n const literal = this.parseStringLiteral(this.state.value);\n if (endOfInit()) {\n return { type: \"string\", loc: literal.loc.start, value: literal };\n }\n return { type: \"invalid\", loc: startLoc };\n }\n case tt._true:\n case tt._false: {\n const literal = this.parseBooleanLiteral(this.match(tt._true));\n if (endOfInit()) {\n return {\n type: \"boolean\",\n loc: literal.loc.start,\n value: literal,\n };\n }\n return { type: \"invalid\", loc: startLoc };\n }\n default:\n return { type: \"invalid\", loc: startLoc };\n }\n }\n\n flowEnumMemberRaw(): {\n id: N.Identifier;\n init: EnumMemberInit;\n } {\n const loc = this.state.startLoc;\n const id = this.parseIdentifier(true);\n const init = this.eat(tt.eq)\n ? this.flowEnumMemberInit()\n : { type: \"none\" as const, loc };\n return { id, init };\n }\n\n flowEnumCheckExplicitTypeMismatch(\n loc: Position,\n context: EnumContext,\n expectedType: EnumExplicitType,\n ): void {\n const { explicitType } = context;\n if (explicitType === null) {\n return;\n }\n if (explicitType !== expectedType) {\n this.flowEnumErrorInvalidMemberInitializer(loc, context);\n }\n }\n\n flowEnumMembers({\n enumName,\n explicitType,\n }: {\n enumName: string;\n explicitType: EnumExplicitType;\n }): {\n members: {\n booleanMembers: Extract<\n N.FlowEnumMember,\n { type: \"EnumBooleanMember\" }\n >[];\n numberMembers: Extract<\n N.FlowEnumMember,\n { type: \"EnumNumberMember\" }\n >[];\n stringMembers: Extract<\n N.FlowEnumMember,\n { type: \"EnumStringMember\" }\n >[];\n defaultedMembers: Extract<\n N.FlowEnumMember,\n { type: \"EnumDefaultedMember\" }\n >[];\n };\n hasUnknownMembers: boolean;\n } {\n const seenNames = new Set();\n const members = {\n // @ts-expect-error: migrate to Babel types\n booleanMembers: [],\n // @ts-expect-error: migrate to Babel types\n numberMembers: [],\n // @ts-expect-error: migrate to Babel types\n stringMembers: [],\n // @ts-expect-error: migrate to Babel types\n defaultedMembers: [],\n };\n let hasUnknownMembers = false;\n while (!this.match(tt.braceR)) {\n if (this.eat(tt.ellipsis)) {\n hasUnknownMembers = true;\n break;\n }\n const memberNode = this.startNode();\n const { id, init } = this.flowEnumMemberRaw();\n const memberName = id.name;\n if (memberName === \"\") {\n continue;\n }\n if (/^[a-z]/.test(memberName)) {\n this.raise(FlowErrors.EnumInvalidMemberName, id, {\n memberName,\n suggestion: memberName[0].toUpperCase() + memberName.slice(1),\n enumName,\n });\n }\n if (seenNames.has(memberName)) {\n this.raise(FlowErrors.EnumDuplicateMemberName, id, {\n memberName,\n enumName,\n });\n }\n seenNames.add(memberName);\n const context = { enumName, explicitType, memberName };\n memberNode.id = id;\n switch (init.type) {\n case \"boolean\": {\n this.flowEnumCheckExplicitTypeMismatch(\n init.loc,\n context,\n \"boolean\",\n );\n memberNode.init = init.value;\n members.booleanMembers.push(\n this.finishNode(memberNode, \"EnumBooleanMember\"),\n );\n break;\n }\n case \"number\": {\n this.flowEnumCheckExplicitTypeMismatch(init.loc, context, \"number\");\n memberNode.init = init.value;\n members.numberMembers.push(\n this.finishNode(memberNode, \"EnumNumberMember\"),\n );\n break;\n }\n case \"string\": {\n this.flowEnumCheckExplicitTypeMismatch(init.loc, context, \"string\");\n memberNode.init = init.value;\n members.stringMembers.push(\n this.finishNode(memberNode, \"EnumStringMember\"),\n );\n break;\n }\n case \"invalid\": {\n throw this.flowEnumErrorInvalidMemberInitializer(init.loc, context);\n }\n case \"none\": {\n switch (explicitType) {\n case \"boolean\":\n this.flowEnumErrorBooleanMemberNotInitialized(\n init.loc,\n context,\n );\n break;\n case \"number\":\n this.flowEnumErrorNumberMemberNotInitialized(init.loc, context);\n break;\n default:\n members.defaultedMembers.push(\n this.finishNode(memberNode, \"EnumDefaultedMember\"),\n );\n }\n }\n }\n\n if (!this.match(tt.braceR)) {\n this.expect(tt.comma);\n }\n }\n return { members, hasUnknownMembers };\n }\n\n flowEnumStringMembers(\n initializedMembers: Array,\n defaultedMembers: Array,\n {\n enumName,\n }: {\n enumName: string;\n },\n ): Array {\n if (initializedMembers.length === 0) {\n return defaultedMembers;\n } else if (defaultedMembers.length === 0) {\n return initializedMembers;\n } else if (defaultedMembers.length > initializedMembers.length) {\n for (const member of initializedMembers) {\n this.flowEnumErrorStringMemberInconsistentlyInitialized(member, {\n enumName,\n });\n }\n return defaultedMembers;\n } else {\n for (const member of defaultedMembers) {\n this.flowEnumErrorStringMemberInconsistentlyInitialized(member, {\n enumName,\n });\n }\n return initializedMembers;\n }\n }\n\n flowEnumParseExplicitType({\n enumName,\n }: {\n enumName: string;\n }): EnumExplicitType {\n if (!this.eatContextual(tt._of)) return null;\n\n if (!tokenIsIdentifier(this.state.type)) {\n throw this.raise(\n FlowErrors.EnumInvalidExplicitTypeUnknownSupplied,\n this.state.startLoc,\n {\n enumName,\n },\n );\n }\n\n const { value } = this.state;\n this.next();\n\n if (\n value !== \"boolean\" &&\n value !== \"number\" &&\n value !== \"string\" &&\n value !== \"symbol\"\n ) {\n this.raise(FlowErrors.EnumInvalidExplicitType, this.state.startLoc, {\n enumName,\n invalidEnumType: value,\n });\n }\n\n return value;\n }\n\n flowEnumBody(node: Undone, id: N.Identifier): N.Node {\n const enumName = id.name;\n const nameLoc = id.loc.start;\n const explicitType = this.flowEnumParseExplicitType({ enumName });\n this.expect(tt.braceL);\n const { members, hasUnknownMembers } = this.flowEnumMembers({\n enumName,\n explicitType,\n });\n node.hasUnknownMembers = hasUnknownMembers;\n\n switch (explicitType) {\n case \"boolean\":\n node.explicitType = true;\n node.members = members.booleanMembers;\n this.expect(tt.braceR);\n return this.finishNode(node, \"EnumBooleanBody\");\n case \"number\":\n node.explicitType = true;\n node.members = members.numberMembers;\n this.expect(tt.braceR);\n return this.finishNode(node, \"EnumNumberBody\");\n case \"string\":\n node.explicitType = true;\n node.members = this.flowEnumStringMembers(\n members.stringMembers,\n members.defaultedMembers,\n { enumName },\n );\n this.expect(tt.braceR);\n return this.finishNode(node, \"EnumStringBody\");\n case \"symbol\":\n node.members = members.defaultedMembers;\n this.expect(tt.braceR);\n return this.finishNode(node, \"EnumSymbolBody\");\n default: {\n // `explicitType` is `null`\n const empty = () => {\n node.members = [];\n this.expect(tt.braceR);\n return this.finishNode(node, \"EnumStringBody\");\n };\n node.explicitType = false;\n\n const boolsLen = members.booleanMembers.length;\n const numsLen = members.numberMembers.length;\n const strsLen = members.stringMembers.length;\n const defaultedLen = members.defaultedMembers.length;\n\n if (!boolsLen && !numsLen && !strsLen && !defaultedLen) {\n return empty();\n } else if (!boolsLen && !numsLen) {\n node.members = this.flowEnumStringMembers(\n members.stringMembers,\n members.defaultedMembers,\n { enumName },\n );\n this.expect(tt.braceR);\n return this.finishNode(node, \"EnumStringBody\");\n } else if (!numsLen && !strsLen && boolsLen >= defaultedLen) {\n for (const member of members.defaultedMembers) {\n this.flowEnumErrorBooleanMemberNotInitialized(member.loc.start, {\n enumName,\n memberName: member.id.name,\n });\n }\n node.members = members.booleanMembers;\n this.expect(tt.braceR);\n return this.finishNode(node, \"EnumBooleanBody\");\n } else if (!boolsLen && !strsLen && numsLen >= defaultedLen) {\n for (const member of members.defaultedMembers) {\n this.flowEnumErrorNumberMemberNotInitialized(member.loc.start, {\n enumName,\n memberName: member.id.name,\n });\n }\n node.members = members.numberMembers;\n this.expect(tt.braceR);\n return this.finishNode(node, \"EnumNumberBody\");\n } else {\n this.raise(FlowErrors.EnumInconsistentMemberValues, nameLoc, {\n enumName,\n });\n return empty();\n }\n }\n }\n }\n\n flowParseEnumDeclaration(\n node: Undone,\n ): N.FlowEnumDeclaration {\n const id = this.parseIdentifier();\n node.id = id;\n node.body = this.flowEnumBody(this.startNode(), id);\n return this.finishNode(node, \"EnumDeclaration\");\n }\n\n jsxParseOpeningElementAfterName(\n node: N.JSXOpeningElement,\n ): N.JSXOpeningElement {\n if (this.shouldParseTypes()) {\n if (this.match(tt.lt) || this.match(tt.bitShiftL)) {\n node.typeArguments =\n this.flowParseTypeParameterInstantiationInExpression();\n }\n }\n\n return super.jsxParseOpeningElementAfterName(node);\n }\n\n // check if the next token is a tt.lt\n isLookaheadToken_lt(): boolean {\n const next = this.nextTokenStart();\n if (this.input.charCodeAt(next) === charCodes.lessThan) {\n const afterNext = this.input.charCodeAt(next + 1);\n return (\n afterNext !== charCodes.lessThan && afterNext !== charCodes.equalsTo\n );\n }\n return false;\n }\n\n // used after we have finished parsing types\n reScan_lt_gt() {\n const { type } = this.state;\n if (type === tt.lt) {\n this.state.pos -= 1;\n this.readToken_lt();\n } else if (type === tt.gt) {\n this.state.pos -= 1;\n this.readToken_gt();\n }\n }\n\n reScan_lt() {\n const { type } = this.state;\n if (type === tt.bitShiftL) {\n this.state.pos -= 2;\n this.finishOp(tt.lt, 1);\n return tt.lt;\n }\n return type;\n }\n\n maybeUnwrapTypeCastExpression(node: N.Node) {\n return node.type === \"TypeCastExpression\" ? node.expression : node;\n }\n };\n","const entities: {\n __proto__: null;\n [name: string]: string;\n} = {\n __proto__: null,\n quot: \"\\u0022\",\n amp: \"&\",\n apos: \"\\u0027\",\n lt: \"<\",\n gt: \">\",\n nbsp: \"\\u00A0\",\n iexcl: \"\\u00A1\",\n cent: \"\\u00A2\",\n pound: \"\\u00A3\",\n curren: \"\\u00A4\",\n yen: \"\\u00A5\",\n brvbar: \"\\u00A6\",\n sect: \"\\u00A7\",\n uml: \"\\u00A8\",\n copy: \"\\u00A9\",\n ordf: \"\\u00AA\",\n laquo: \"\\u00AB\",\n not: \"\\u00AC\",\n shy: \"\\u00AD\",\n reg: \"\\u00AE\",\n macr: \"\\u00AF\",\n deg: \"\\u00B0\",\n plusmn: \"\\u00B1\",\n sup2: \"\\u00B2\",\n sup3: \"\\u00B3\",\n acute: \"\\u00B4\",\n micro: \"\\u00B5\",\n para: \"\\u00B6\",\n middot: \"\\u00B7\",\n cedil: \"\\u00B8\",\n sup1: \"\\u00B9\",\n ordm: \"\\u00BA\",\n raquo: \"\\u00BB\",\n frac14: \"\\u00BC\",\n frac12: \"\\u00BD\",\n frac34: \"\\u00BE\",\n iquest: \"\\u00BF\",\n Agrave: \"\\u00C0\",\n Aacute: \"\\u00C1\",\n Acirc: \"\\u00C2\",\n Atilde: \"\\u00C3\",\n Auml: \"\\u00C4\",\n Aring: \"\\u00C5\",\n AElig: \"\\u00C6\",\n Ccedil: \"\\u00C7\",\n Egrave: \"\\u00C8\",\n Eacute: \"\\u00C9\",\n Ecirc: \"\\u00CA\",\n Euml: \"\\u00CB\",\n Igrave: \"\\u00CC\",\n Iacute: \"\\u00CD\",\n Icirc: \"\\u00CE\",\n Iuml: \"\\u00CF\",\n ETH: \"\\u00D0\",\n Ntilde: \"\\u00D1\",\n Ograve: \"\\u00D2\",\n Oacute: \"\\u00D3\",\n Ocirc: \"\\u00D4\",\n Otilde: \"\\u00D5\",\n Ouml: \"\\u00D6\",\n times: \"\\u00D7\",\n Oslash: \"\\u00D8\",\n Ugrave: \"\\u00D9\",\n Uacute: \"\\u00DA\",\n Ucirc: \"\\u00DB\",\n Uuml: \"\\u00DC\",\n Yacute: \"\\u00DD\",\n THORN: \"\\u00DE\",\n szlig: \"\\u00DF\",\n agrave: \"\\u00E0\",\n aacute: \"\\u00E1\",\n acirc: \"\\u00E2\",\n atilde: \"\\u00E3\",\n auml: \"\\u00E4\",\n aring: \"\\u00E5\",\n aelig: \"\\u00E6\",\n ccedil: \"\\u00E7\",\n egrave: \"\\u00E8\",\n eacute: \"\\u00E9\",\n ecirc: \"\\u00EA\",\n euml: \"\\u00EB\",\n igrave: \"\\u00EC\",\n iacute: \"\\u00ED\",\n icirc: \"\\u00EE\",\n iuml: \"\\u00EF\",\n eth: \"\\u00F0\",\n ntilde: \"\\u00F1\",\n ograve: \"\\u00F2\",\n oacute: \"\\u00F3\",\n ocirc: \"\\u00F4\",\n otilde: \"\\u00F5\",\n ouml: \"\\u00F6\",\n divide: \"\\u00F7\",\n oslash: \"\\u00F8\",\n ugrave: \"\\u00F9\",\n uacute: \"\\u00FA\",\n ucirc: \"\\u00FB\",\n uuml: \"\\u00FC\",\n yacute: \"\\u00FD\",\n thorn: \"\\u00FE\",\n yuml: \"\\u00FF\",\n OElig: \"\\u0152\",\n oelig: \"\\u0153\",\n Scaron: \"\\u0160\",\n scaron: \"\\u0161\",\n Yuml: \"\\u0178\",\n fnof: \"\\u0192\",\n circ: \"\\u02C6\",\n tilde: \"\\u02DC\",\n Alpha: \"\\u0391\",\n Beta: \"\\u0392\",\n Gamma: \"\\u0393\",\n Delta: \"\\u0394\",\n Epsilon: \"\\u0395\",\n Zeta: \"\\u0396\",\n Eta: \"\\u0397\",\n Theta: \"\\u0398\",\n Iota: \"\\u0399\",\n Kappa: \"\\u039A\",\n Lambda: \"\\u039B\",\n Mu: \"\\u039C\",\n Nu: \"\\u039D\",\n Xi: \"\\u039E\",\n Omicron: \"\\u039F\",\n Pi: \"\\u03A0\",\n Rho: \"\\u03A1\",\n Sigma: \"\\u03A3\",\n Tau: \"\\u03A4\",\n Upsilon: \"\\u03A5\",\n Phi: \"\\u03A6\",\n Chi: \"\\u03A7\",\n Psi: \"\\u03A8\",\n Omega: \"\\u03A9\",\n alpha: \"\\u03B1\",\n beta: \"\\u03B2\",\n gamma: \"\\u03B3\",\n delta: \"\\u03B4\",\n epsilon: \"\\u03B5\",\n zeta: \"\\u03B6\",\n eta: \"\\u03B7\",\n theta: \"\\u03B8\",\n iota: \"\\u03B9\",\n kappa: \"\\u03BA\",\n lambda: \"\\u03BB\",\n mu: \"\\u03BC\",\n nu: \"\\u03BD\",\n xi: \"\\u03BE\",\n omicron: \"\\u03BF\",\n pi: \"\\u03C0\",\n rho: \"\\u03C1\",\n sigmaf: \"\\u03C2\",\n sigma: \"\\u03C3\",\n tau: \"\\u03C4\",\n upsilon: \"\\u03C5\",\n phi: \"\\u03C6\",\n chi: \"\\u03C7\",\n psi: \"\\u03C8\",\n omega: \"\\u03C9\",\n thetasym: \"\\u03D1\",\n upsih: \"\\u03D2\",\n piv: \"\\u03D6\",\n ensp: \"\\u2002\",\n emsp: \"\\u2003\",\n thinsp: \"\\u2009\",\n zwnj: \"\\u200C\",\n zwj: \"\\u200D\",\n lrm: \"\\u200E\",\n rlm: \"\\u200F\",\n ndash: \"\\u2013\",\n mdash: \"\\u2014\",\n lsquo: \"\\u2018\",\n rsquo: \"\\u2019\",\n sbquo: \"\\u201A\",\n ldquo: \"\\u201C\",\n rdquo: \"\\u201D\",\n bdquo: \"\\u201E\",\n dagger: \"\\u2020\",\n Dagger: \"\\u2021\",\n bull: \"\\u2022\",\n hellip: \"\\u2026\",\n permil: \"\\u2030\",\n prime: \"\\u2032\",\n Prime: \"\\u2033\",\n lsaquo: \"\\u2039\",\n rsaquo: \"\\u203A\",\n oline: \"\\u203E\",\n frasl: \"\\u2044\",\n euro: \"\\u20AC\",\n image: \"\\u2111\",\n weierp: \"\\u2118\",\n real: \"\\u211C\",\n trade: \"\\u2122\",\n alefsym: \"\\u2135\",\n larr: \"\\u2190\",\n uarr: \"\\u2191\",\n rarr: \"\\u2192\",\n darr: \"\\u2193\",\n harr: \"\\u2194\",\n crarr: \"\\u21B5\",\n lArr: \"\\u21D0\",\n uArr: \"\\u21D1\",\n rArr: \"\\u21D2\",\n dArr: \"\\u21D3\",\n hArr: \"\\u21D4\",\n forall: \"\\u2200\",\n part: \"\\u2202\",\n exist: \"\\u2203\",\n empty: \"\\u2205\",\n nabla: \"\\u2207\",\n isin: \"\\u2208\",\n notin: \"\\u2209\",\n ni: \"\\u220B\",\n prod: \"\\u220F\",\n sum: \"\\u2211\",\n minus: \"\\u2212\",\n lowast: \"\\u2217\",\n radic: \"\\u221A\",\n prop: \"\\u221D\",\n infin: \"\\u221E\",\n ang: \"\\u2220\",\n and: \"\\u2227\",\n or: \"\\u2228\",\n cap: \"\\u2229\",\n cup: \"\\u222A\",\n int: \"\\u222B\",\n there4: \"\\u2234\",\n sim: \"\\u223C\",\n cong: \"\\u2245\",\n asymp: \"\\u2248\",\n ne: \"\\u2260\",\n equiv: \"\\u2261\",\n le: \"\\u2264\",\n ge: \"\\u2265\",\n sub: \"\\u2282\",\n sup: \"\\u2283\",\n nsub: \"\\u2284\",\n sube: \"\\u2286\",\n supe: \"\\u2287\",\n oplus: \"\\u2295\",\n otimes: \"\\u2297\",\n perp: \"\\u22A5\",\n sdot: \"\\u22C5\",\n lceil: \"\\u2308\",\n rceil: \"\\u2309\",\n lfloor: \"\\u230A\",\n rfloor: \"\\u230B\",\n lang: \"\\u2329\",\n rang: \"\\u232A\",\n loz: \"\\u25CA\",\n spades: \"\\u2660\",\n clubs: \"\\u2663\",\n hearts: \"\\u2665\",\n diams: \"\\u2666\",\n} as const;\nexport default entities;\n","import * as charCodes from \"charcodes\";\n\n// Matches a whole line break (where CRLF is considered a single\n// line break). Used to count lines.\nexport const lineBreak = /\\r\\n|[\\r\\n\\u2028\\u2029]/;\nexport const lineBreakG = new RegExp(lineBreak.source, \"g\");\n\n// https://tc39.github.io/ecma262/#sec-line-terminators\nexport function isNewLine(code: number): boolean {\n switch (code) {\n case charCodes.lineFeed:\n case charCodes.carriageReturn:\n case charCodes.lineSeparator:\n case charCodes.paragraphSeparator:\n return true;\n\n default:\n return false;\n }\n}\n\nexport function hasNewLine(input: string, start: number, end: number): boolean {\n for (let i = start; i < end; i++) {\n if (isNewLine(input.charCodeAt(i))) {\n return true;\n }\n }\n return false;\n}\n\nexport const skipWhiteSpace = /(?:\\s|\\/\\/.*|\\/\\*[^]*?\\*\\/)*/g;\n\nexport const skipWhiteSpaceInLine =\n /(?:[^\\S\\n\\r\\u2028\\u2029]|\\/\\/.*|\\/\\*.*?\\*\\/)*/g;\n\n// https://tc39.github.io/ecma262/#sec-white-space\nexport function isWhitespace(code: number): boolean {\n switch (code) {\n case 0x0009: // CHARACTER TABULATION\n case 0x000b: // LINE TABULATION\n case 0x000c: // FORM FEED\n case charCodes.space:\n case charCodes.nonBreakingSpace:\n case charCodes.oghamSpaceMark:\n case 0x2000: // EN QUAD\n case 0x2001: // EM QUAD\n case 0x2002: // EN SPACE\n case 0x2003: // EM SPACE\n case 0x2004: // THREE-PER-EM SPACE\n case 0x2005: // FOUR-PER-EM SPACE\n case 0x2006: // SIX-PER-EM SPACE\n case 0x2007: // FIGURE SPACE\n case 0x2008: // PUNCTUATION SPACE\n case 0x2009: // THIN SPACE\n case 0x200a: // HAIR SPACE\n case 0x202f: // NARROW NO-BREAK SPACE\n case 0x205f: // MEDIUM MATHEMATICAL SPACE\n case 0x3000: // IDEOGRAPHIC SPACE\n case 0xfeff: // ZERO WIDTH NO-BREAK SPACE\n return true;\n\n default:\n return false;\n }\n}\n","import * as charCodes from \"charcodes\";\n\nimport XHTMLEntities from \"./xhtml.ts\";\nimport type Parser from \"../../parser/index.ts\";\nimport type { ExpressionErrors } from \"../../parser/util.ts\";\nimport {\n tokenComesBeforeExpression,\n tokenIsKeyword,\n tokenLabelName,\n type TokenType,\n tt,\n} from \"../../tokenizer/types.ts\";\nimport type { TokContext } from \"../../tokenizer/context.ts\";\nimport { types as tc } from \"../../tokenizer/context.ts\";\nimport type * as N from \"../../types.ts\";\nimport { isIdentifierChar, isIdentifierStart } from \"../../util/identifier.ts\";\nimport type { Position } from \"../../util/location.ts\";\nimport { isNewLine } from \"../../util/whitespace.ts\";\nimport { Errors, ParseErrorEnum } from \"../../parse-error.ts\";\nimport type { Undone } from \"../../parser/node.ts\";\n\n/* eslint sort-keys: \"error\" */\nconst JsxErrors = ParseErrorEnum`jsx`({\n AttributeIsEmpty:\n \"JSX attributes must only be assigned a non-empty expression.\",\n MissingClosingTagElement: ({ openingTagName }: { openingTagName: string }) =>\n `Expected corresponding JSX closing tag for <${openingTagName}>.`,\n MissingClosingTagFragment: \"Expected corresponding JSX closing tag for <>.\",\n UnexpectedSequenceExpression:\n \"Sequence expressions cannot be directly nested inside JSX. Did you mean to wrap it in parentheses (...)?\",\n // FIXME: Unify with Errors.UnexpectedToken\n UnexpectedToken: ({\n unexpected,\n HTMLEntity,\n }: {\n unexpected: string;\n HTMLEntity: string;\n }) =>\n `Unexpected token \\`${unexpected}\\`. Did you mean \\`${HTMLEntity}\\` or \\`{'${unexpected}'}\\`?`,\n UnsupportedJsxValue:\n \"JSX value should be either an expression or a quoted JSX text.\",\n UnterminatedJsxContent: \"Unterminated JSX contents.\",\n UnwrappedAdjacentJSXElements:\n \"Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment <>...?\",\n});\n\n/* eslint-disable sort-keys */\n\nfunction isFragment(object?: N.JSXTag | null): object is N.JSXFragmentTag {\n return object\n ? object.type === \"JSXOpeningFragment\" ||\n object.type === \"JSXClosingFragment\"\n : false;\n}\n\n// Transforms JSX element name to string.\n\nfunction getQualifiedJSXName(\n object: N.JSXIdentifier | N.JSXNamespacedName | N.JSXMemberExpression,\n): string {\n if (object.type === \"JSXIdentifier\") {\n return object.name;\n }\n\n if (object.type === \"JSXNamespacedName\") {\n return object.namespace.name + \":\" + object.name.name;\n }\n\n if (object.type === \"JSXMemberExpression\") {\n return (\n getQualifiedJSXName(object.object) +\n \".\" +\n getQualifiedJSXName(object.property)\n );\n }\n\n // istanbul ignore next\n // @ts-expect-error - object is 'never'\n throw new Error(\"Node had unexpected type: \" + object.type);\n}\n\nexport interface IJSXParserMixin {\n jsxParseOpeningElementAfterName(\n node: N.JSXOpeningElement,\n ): N.JSXOpeningElement;\n}\n\nexport type ClassWithMixin<\n T extends new (...args: any) => any,\n M extends object,\n> = T extends new (...args: infer P) => infer I\n ? new (...args: P) => I & M\n : never;\n\nexport default (superClass: typeof Parser) =>\n class JSXParserMixin extends superClass implements Parser, IJSXParserMixin {\n // Reads inline JSX contents token.\n\n jsxReadToken(): void {\n let out = \"\";\n let chunkStart = this.state.pos;\n for (;;) {\n if (this.state.pos >= this.length) {\n throw this.raise(\n JsxErrors.UnterminatedJsxContent,\n this.state.startLoc,\n );\n }\n\n const ch = this.input.charCodeAt(this.state.pos);\n\n switch (ch) {\n case charCodes.lessThan:\n case charCodes.leftCurlyBrace:\n if (this.state.pos === this.state.start) {\n if (ch === charCodes.lessThan && this.state.canStartJSXElement) {\n ++this.state.pos;\n this.finishToken(tt.jsxTagStart);\n } else {\n super.getTokenFromCode(ch);\n }\n return;\n }\n out += this.input.slice(chunkStart, this.state.pos);\n this.finishToken(tt.jsxText, out);\n return;\n\n case charCodes.ampersand:\n out += this.input.slice(chunkStart, this.state.pos);\n out += this.jsxReadEntity();\n chunkStart = this.state.pos;\n break;\n\n case charCodes.greaterThan:\n case charCodes.rightCurlyBrace:\n if (process.env.BABEL_8_BREAKING) {\n this.raise(JsxErrors.UnexpectedToken, this.state.curPosition(), {\n unexpected: this.input[this.state.pos],\n HTMLEntity:\n ch === charCodes.rightCurlyBrace ? \"}\" : \">\",\n });\n }\n /* falls through */\n\n default:\n if (isNewLine(ch)) {\n out += this.input.slice(chunkStart, this.state.pos);\n out += this.jsxReadNewLine(true);\n chunkStart = this.state.pos;\n } else {\n ++this.state.pos;\n }\n }\n }\n }\n\n jsxReadNewLine(normalizeCRLF: boolean): string {\n const ch = this.input.charCodeAt(this.state.pos);\n let out;\n ++this.state.pos;\n if (\n ch === charCodes.carriageReturn &&\n this.input.charCodeAt(this.state.pos) === charCodes.lineFeed\n ) {\n ++this.state.pos;\n out = normalizeCRLF ? \"\\n\" : \"\\r\\n\";\n } else {\n out = String.fromCharCode(ch);\n }\n ++this.state.curLine;\n this.state.lineStart = this.state.pos;\n\n return out;\n }\n\n jsxReadString(quote: number): void {\n let out = \"\";\n let chunkStart = ++this.state.pos;\n for (;;) {\n if (this.state.pos >= this.length) {\n throw this.raise(Errors.UnterminatedString, this.state.startLoc);\n }\n\n const ch = this.input.charCodeAt(this.state.pos);\n if (ch === quote) break;\n if (ch === charCodes.ampersand) {\n out += this.input.slice(chunkStart, this.state.pos);\n out += this.jsxReadEntity();\n chunkStart = this.state.pos;\n } else if (isNewLine(ch)) {\n out += this.input.slice(chunkStart, this.state.pos);\n out += this.jsxReadNewLine(false);\n chunkStart = this.state.pos;\n } else {\n ++this.state.pos;\n }\n }\n out += this.input.slice(chunkStart, this.state.pos++);\n this.finishToken(tt.string, out);\n }\n\n jsxReadEntity(): string {\n const startPos = ++this.state.pos;\n if (this.codePointAtPos(this.state.pos) === charCodes.numberSign) {\n ++this.state.pos;\n\n let radix = 10;\n if (this.codePointAtPos(this.state.pos) === charCodes.lowercaseX) {\n radix = 16;\n ++this.state.pos;\n }\n\n const codePoint = this.readInt(\n radix,\n /* len */ undefined,\n /* forceLen */ false,\n /* allowNumSeparator */ \"bail\",\n );\n if (\n codePoint !== null &&\n this.codePointAtPos(this.state.pos) === charCodes.semicolon\n ) {\n ++this.state.pos;\n return String.fromCodePoint(codePoint);\n }\n } else {\n let count = 0;\n let semi = false;\n while (\n count++ < 10 &&\n this.state.pos < this.length &&\n !(semi = this.codePointAtPos(this.state.pos) === charCodes.semicolon)\n ) {\n ++this.state.pos;\n }\n\n if (semi) {\n const desc = this.input.slice(startPos, this.state.pos);\n const entity = XHTMLEntities[desc];\n ++this.state.pos;\n\n if (entity) {\n return entity;\n }\n }\n }\n\n // Not a valid entity\n this.state.pos = startPos;\n return \"&\";\n }\n\n // Read a JSX identifier (valid tag or attribute name).\n //\n // Optimized version since JSX identifiers can\"t contain\n // escape characters and so can be read as single slice.\n // Also assumes that first character was already checked\n // by isIdentifierStart in readToken.\n\n jsxReadWord(): void {\n let ch;\n const start = this.state.pos;\n do {\n ch = this.input.charCodeAt(++this.state.pos);\n } while (isIdentifierChar(ch) || ch === charCodes.dash);\n this.finishToken(tt.jsxName, this.input.slice(start, this.state.pos));\n }\n\n // Parse next token as JSX identifier\n\n jsxParseIdentifier(): N.JSXIdentifier {\n const node = this.startNode();\n if (this.match(tt.jsxName)) {\n node.name = this.state.value;\n } else if (tokenIsKeyword(this.state.type)) {\n node.name = tokenLabelName(this.state.type);\n } else {\n this.unexpected();\n }\n this.next();\n return this.finishNode(node, \"JSXIdentifier\");\n }\n\n // Parse namespaced identifier.\n\n jsxParseNamespacedName(): N.JSXNamespacedName | N.JSXIdentifier {\n const startLoc = this.state.startLoc;\n const name = this.jsxParseIdentifier();\n if (!this.eat(tt.colon)) return name;\n\n const node = this.startNodeAt(startLoc);\n node.namespace = name;\n node.name = this.jsxParseIdentifier();\n return this.finishNode(node, \"JSXNamespacedName\");\n }\n\n // Parses element name in any form - namespaced, member\n // or single identifier.\n\n jsxParseElementName():\n | N.JSXIdentifier\n | N.JSXNamespacedName\n | N.JSXMemberExpression {\n const startLoc = this.state.startLoc;\n let node: N.JSXIdentifier | N.JSXNamespacedName | N.JSXMemberExpression =\n this.jsxParseNamespacedName();\n if (node.type === \"JSXNamespacedName\") {\n return node;\n }\n while (this.eat(tt.dot)) {\n const newNode = this.startNodeAt(startLoc);\n newNode.object = node;\n newNode.property = this.jsxParseIdentifier();\n node = this.finishNode(newNode, \"JSXMemberExpression\");\n }\n return node;\n }\n\n // Parses any type of JSX attribute value.\n\n jsxParseAttributeValue():\n | N.JSXExpressionContainer\n | N.JSXElement\n | N.StringLiteral {\n let node;\n switch (this.state.type) {\n case tt.braceL:\n node = this.startNode();\n this.setContext(tc.brace);\n this.next();\n node = this.jsxParseExpressionContainer(node, tc.j_oTag);\n if (node.expression.type === \"JSXEmptyExpression\") {\n this.raise(JsxErrors.AttributeIsEmpty, node);\n }\n return node;\n\n case tt.jsxTagStart:\n case tt.string:\n return this.parseExprAtom() as N.JSXElement | N.StringLiteral;\n\n default:\n throw this.raise(JsxErrors.UnsupportedJsxValue, this.state.startLoc);\n }\n }\n\n // JSXEmptyExpression is unique type since it doesn't actually parse anything,\n // and so it should start at the end of last read token (left brace) and finish\n // at the beginning of the next one (right brace).\n\n jsxParseEmptyExpression(): N.JSXEmptyExpression {\n const node = this.startNodeAt(this.state.lastTokEndLoc);\n return this.finishNodeAt(node, \"JSXEmptyExpression\", this.state.startLoc);\n }\n\n // Parse JSX spread child\n\n jsxParseSpreadChild(node: Undone): N.JSXSpreadChild {\n this.next(); // ellipsis\n node.expression = this.parseExpression();\n this.setContext(tc.j_expr);\n this.state.canStartJSXElement = true;\n this.expect(tt.braceR);\n\n return this.finishNode(node, \"JSXSpreadChild\");\n }\n\n // Parses JSX expression enclosed into curly brackets.\n\n jsxParseExpressionContainer(\n node: Undone,\n previousContext: TokContext,\n ): N.JSXExpressionContainer {\n if (this.match(tt.braceR)) {\n node.expression = this.jsxParseEmptyExpression();\n } else {\n const expression = this.parseExpression();\n\n if (process.env.BABEL_8_BREAKING) {\n if (\n expression.type === \"SequenceExpression\" &&\n !expression.extra?.parenthesized\n ) {\n this.raise(\n JsxErrors.UnexpectedSequenceExpression,\n expression.expressions[1],\n );\n }\n }\n\n node.expression = expression;\n }\n this.setContext(previousContext);\n this.state.canStartJSXElement = true;\n this.expect(tt.braceR);\n\n return this.finishNode(node, \"JSXExpressionContainer\");\n }\n\n // Parses following JSX attribute name-value pair.\n\n jsxParseAttribute(): N.JSXAttribute | N.JSXSpreadAttribute {\n const node = this.startNode();\n if (this.match(tt.braceL)) {\n this.setContext(tc.brace);\n this.next();\n this.expect(tt.ellipsis);\n node.argument = this.parseMaybeAssignAllowIn();\n this.setContext(tc.j_oTag);\n this.state.canStartJSXElement = true;\n this.expect(tt.braceR);\n return this.finishNode(node, \"JSXSpreadAttribute\");\n }\n node.name = this.jsxParseNamespacedName();\n node.value = this.eat(tt.eq) ? this.jsxParseAttributeValue() : null;\n return this.finishNode(node, \"JSXAttribute\");\n }\n\n // Parses JSX opening tag starting after \"<\".\n\n jsxParseOpeningElementAt(\n startLoc: Position,\n ): N.JSXOpeningElement | N.JSXOpeningFragment {\n const node = this.startNodeAt(\n startLoc,\n );\n if (this.eat(tt.jsxTagEnd)) {\n return this.finishNode(node, \"JSXOpeningFragment\");\n }\n node.name = this.jsxParseElementName();\n return this.jsxParseOpeningElementAfterName(\n node as Undone,\n );\n }\n\n jsxParseOpeningElementAfterName(\n node: Undone,\n ): N.JSXOpeningElement {\n const attributes: (N.JSXAttribute | N.JSXSpreadAttribute)[] = [];\n while (!this.match(tt.slash) && !this.match(tt.jsxTagEnd)) {\n attributes.push(this.jsxParseAttribute());\n }\n node.attributes = attributes;\n node.selfClosing = this.eat(tt.slash);\n this.expect(tt.jsxTagEnd);\n return this.finishNode(node, \"JSXOpeningElement\");\n }\n\n // Parses JSX closing tag starting after \"(\n startLoc,\n );\n if (this.eat(tt.jsxTagEnd)) {\n return this.finishNode(node, \"JSXClosingFragment\");\n }\n node.name = this.jsxParseElementName();\n this.expect(tt.jsxTagEnd);\n return this.finishNode(node, \"JSXClosingElement\");\n }\n\n // Parses entire JSX element, including it\"s opening tag\n // (starting after \"<\"), attributes, contents and closing tag.\n\n jsxParseElementAt(startLoc: Position): N.JSXElement | N.JSXFragment {\n const node = this.startNodeAt(startLoc);\n const children = [];\n const openingElement = this.jsxParseOpeningElementAt(startLoc);\n let closingElement = null;\n\n if (!openingElement.selfClosing) {\n contents: for (;;) {\n switch (this.state.type) {\n case tt.jsxTagStart:\n startLoc = this.state.startLoc;\n this.next();\n if (this.eat(tt.slash)) {\n closingElement = this.jsxParseClosingElementAt(startLoc);\n break contents;\n }\n children.push(this.jsxParseElementAt(startLoc));\n break;\n\n case tt.jsxText:\n children.push(this.parseLiteral(this.state.value, \"JSXText\"));\n break;\n\n case tt.braceL: {\n const node = this.startNode<\n N.JSXSpreadChild | N.JSXExpressionContainer\n >();\n this.setContext(tc.brace);\n this.next();\n if (this.match(tt.ellipsis)) {\n children.push(this.jsxParseSpreadChild(node));\n } else {\n children.push(\n this.jsxParseExpressionContainer(node, tc.j_expr),\n );\n }\n\n break;\n }\n // istanbul ignore next - should never happen\n default:\n this.unexpected();\n }\n }\n\n if (\n isFragment(openingElement) &&\n !isFragment(closingElement) &&\n closingElement !== null\n ) {\n this.raise(JsxErrors.MissingClosingTagFragment, closingElement);\n } else if (!isFragment(openingElement) && isFragment(closingElement)) {\n this.raise(JsxErrors.MissingClosingTagElement, closingElement, {\n openingTagName: getQualifiedJSXName(openingElement.name),\n });\n } else if (!isFragment(openingElement) && !isFragment(closingElement)) {\n if (\n getQualifiedJSXName(closingElement.name) !==\n getQualifiedJSXName(openingElement.name)\n ) {\n this.raise(JsxErrors.MissingClosingTagElement, closingElement, {\n openingTagName: getQualifiedJSXName(openingElement.name),\n });\n }\n }\n }\n\n if (isFragment(openingElement)) {\n node.openingFragment = openingElement;\n node.closingFragment = closingElement;\n } else {\n node.openingElement = openingElement;\n node.closingElement = closingElement;\n }\n node.children = children;\n if (this.match(tt.lt)) {\n throw this.raise(\n JsxErrors.UnwrappedAdjacentJSXElements,\n this.state.startLoc,\n );\n }\n\n return isFragment(openingElement)\n ? this.finishNode(node, \"JSXFragment\")\n : this.finishNode(node, \"JSXElement\");\n }\n\n // Parses entire JSX element from current position.\n\n jsxParseElement(): N.JSXElement | N.JSXFragment {\n const startLoc = this.state.startLoc;\n this.next();\n return this.jsxParseElementAt(startLoc);\n }\n\n setContext(newContext: TokContext) {\n const { context } = this.state;\n context[context.length - 1] = newContext;\n }\n\n // ==================================\n // Overrides\n // ==================================\n\n parseExprAtom(refExpressionErrors?: ExpressionErrors | null): N.Expression {\n if (this.match(tt.jsxTagStart)) {\n return this.jsxParseElement();\n } else if (\n this.match(tt.lt) &&\n this.input.charCodeAt(this.state.pos) !== charCodes.exclamationMark\n ) {\n // In case we encounter an lt token here it will always be the start of\n // jsx as the lt sign is not allowed in places that expect an expression\n this.replaceToken(tt.jsxTagStart);\n return this.jsxParseElement();\n } else {\n return super.parseExprAtom(refExpressionErrors);\n }\n }\n\n skipSpace() {\n const curContext = this.curContext();\n if (!curContext.preserveSpace) super.skipSpace();\n }\n\n getTokenFromCode(code: number): void {\n const context = this.curContext();\n\n if (context === tc.j_expr) {\n this.jsxReadToken();\n return;\n }\n\n if (context === tc.j_oTag || context === tc.j_cTag) {\n if (isIdentifierStart(code)) {\n this.jsxReadWord();\n return;\n }\n\n if (code === charCodes.greaterThan) {\n ++this.state.pos;\n this.finishToken(tt.jsxTagEnd);\n return;\n }\n\n if (\n (code === charCodes.quotationMark || code === charCodes.apostrophe) &&\n context === tc.j_oTag\n ) {\n this.jsxReadString(code);\n return;\n }\n }\n\n if (\n code === charCodes.lessThan &&\n this.state.canStartJSXElement &&\n this.input.charCodeAt(this.state.pos + 1) !== charCodes.exclamationMark\n ) {\n ++this.state.pos;\n this.finishToken(tt.jsxTagStart);\n return;\n }\n\n super.getTokenFromCode(code);\n }\n\n updateContext(prevType: TokenType): void {\n const { context, type } = this.state;\n if (type === tt.slash && prevType === tt.jsxTagStart) {\n // do not consider JSX expr -> JSX open tag -> ... anymore\n // reconsider as closing tag context\n context.splice(-2, 2, tc.j_cTag);\n this.state.canStartJSXElement = false;\n } else if (type === tt.jsxTagStart) {\n // start opening tag context\n context.push(tc.j_oTag);\n } else if (type === tt.jsxTagEnd) {\n const out = context[context.length - 1];\n if ((out === tc.j_oTag && prevType === tt.slash) || out === tc.j_cTag) {\n context.pop();\n this.state.canStartJSXElement =\n context[context.length - 1] === tc.j_expr;\n } else {\n this.setContext(tc.j_expr);\n this.state.canStartJSXElement = true;\n }\n } else {\n this.state.canStartJSXElement = tokenComesBeforeExpression(type);\n }\n }\n };\n","import type { Position } from \"../../util/location.ts\";\nimport ScopeHandler, { NameType, Scope } from \"../../util/scope.ts\";\nimport { BindingFlag, ScopeFlag } from \"../../util/scopeflags.ts\";\nimport type * as N from \"../../types.ts\";\nimport { Errors } from \"../../parse-error.ts\";\n\nconst enum TsNameType {\n Types = 1 << 0,\n // enums (which are also in .types)\n Enums = 1 << 1,\n // const enums (which are also in .enums and .types)\n ConstEnums = 1 << 2,\n // classes (which are also in .lexical) and interface (which are also in .types)\n Classes = 1 << 3,\n // namespaces and ambient functions (or classes) are too difficult to track,\n // especially without type analysis.\n // We need to track them anyway, to avoid \"X is not defined\" errors\n // when exporting them.\n ExportOnlyBindings = 1 << 4,\n}\n\nclass TypeScriptScope extends Scope {\n tsNames: Map = new Map();\n}\n\n// See https://github.com/babel/babel/pull/9766#discussion_r268920730 for an\n// explanation of how typescript handles scope.\n\nexport default class TypeScriptScopeHandler extends ScopeHandler {\n importsStack: Set[] = [];\n\n createScope(flags: ScopeFlag): TypeScriptScope {\n this.importsStack.push(new Set()); // Always keep the top-level scope for export checks.\n\n return new TypeScriptScope(flags);\n }\n\n enter(flags: ScopeFlag): void {\n if (flags === ScopeFlag.TS_MODULE) {\n this.importsStack.push(new Set());\n }\n\n super.enter(flags);\n }\n\n exit() {\n const flags = super.exit();\n\n if (flags === ScopeFlag.TS_MODULE) {\n this.importsStack.pop();\n }\n\n return flags;\n }\n\n hasImport(name: string, allowShadow?: boolean) {\n const len = this.importsStack.length;\n if (this.importsStack[len - 1].has(name)) {\n return true;\n }\n if (!allowShadow && len > 1) {\n for (let i = 0; i < len - 1; i++) {\n if (this.importsStack[i].has(name)) return true;\n }\n }\n return false;\n }\n\n declareName(name: string, bindingType: BindingFlag, loc: Position) {\n if (bindingType & BindingFlag.FLAG_TS_IMPORT) {\n if (this.hasImport(name, true)) {\n this.parser.raise(Errors.VarRedeclaration, loc, {\n identifierName: name,\n });\n }\n this.importsStack[this.importsStack.length - 1].add(name);\n return;\n }\n\n const scope = this.currentScope();\n let type = scope.tsNames.get(name) || 0;\n\n if (bindingType & BindingFlag.FLAG_TS_EXPORT_ONLY) {\n this.maybeExportDefined(scope, name);\n scope.tsNames.set(name, type | TsNameType.ExportOnlyBindings);\n return;\n }\n\n super.declareName(name, bindingType, loc);\n\n if (bindingType & BindingFlag.KIND_TYPE) {\n if (!(bindingType & BindingFlag.KIND_VALUE)) {\n // \"Value\" bindings have already been registered by the superclass.\n this.checkRedeclarationInScope(scope, name, bindingType, loc);\n this.maybeExportDefined(scope, name);\n }\n type = type | TsNameType.Types;\n }\n if (bindingType & BindingFlag.FLAG_TS_ENUM) {\n type = type | TsNameType.Enums;\n }\n if (bindingType & BindingFlag.FLAG_TS_CONST_ENUM) {\n type = type | TsNameType.ConstEnums;\n }\n if (bindingType & BindingFlag.FLAG_CLASS) {\n type = type | TsNameType.Classes;\n }\n if (type) scope.tsNames.set(name, type);\n }\n\n isRedeclaredInScope(\n scope: TypeScriptScope,\n name: string,\n bindingType: BindingFlag,\n ): boolean {\n const type = scope.tsNames.get(name);\n if ((type & TsNameType.Enums) > 0) {\n if (bindingType & BindingFlag.FLAG_TS_ENUM) {\n // Enums can be merged with other enums if they are both\n // const or both non-const.\n const isConst = !!(bindingType & BindingFlag.FLAG_TS_CONST_ENUM);\n const wasConst = (type & TsNameType.ConstEnums) > 0;\n return isConst !== wasConst;\n }\n return true;\n }\n if (\n bindingType & BindingFlag.FLAG_CLASS &&\n (type & TsNameType.Classes) > 0\n ) {\n if (scope.names.get(name) & NameType.Lexical) {\n // Classes can be merged with interfaces\n return !!(bindingType & BindingFlag.KIND_VALUE);\n } else {\n // Interface can be merged with other classes or interfaces\n return false;\n }\n }\n if (bindingType & BindingFlag.KIND_TYPE && (type & TsNameType.Types) > 0) {\n return true;\n }\n\n return super.isRedeclaredInScope(scope, name, bindingType);\n }\n\n checkLocalExport(id: N.Identifier) {\n const { name } = id;\n\n if (this.hasImport(name)) return;\n\n const len = this.scopeStack.length;\n for (let i = len - 1; i >= 0; i--) {\n const scope = this.scopeStack[i];\n const type = scope.tsNames.get(name);\n if (\n (type & TsNameType.Types) > 0 ||\n (type & TsNameType.ExportOnlyBindings) > 0\n ) {\n return;\n }\n }\n\n super.checkLocalExport(id);\n }\n}\n","// ProductionParameterHandler is a stack fashioned production parameter tracker\n// https://tc39.es/ecma262/#sec-grammar-notation\n// The tracked parameters are defined above.\n//\n// Whenever [+Await]/[+Yield] appears in the right-hand sides of a production,\n// we must enter a new tracking stack. For example when parsing\n//\n// AsyncFunctionDeclaration [Yield, Await]:\n// async [no LineTerminator here] function BindingIdentifier[?Yield, ?Await]\n// ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody }\n//\n// we must follow such process:\n//\n// 1. parse async keyword\n// 2. parse function keyword\n// 3. parse bindingIdentifier <= inherit current parameters: [?Await]\n// 4. enter new stack with (PARAM_AWAIT)\n// 5. parse formal parameters <= must have [Await] parameter [+Await]\n// 6. parse function body\n// 7. exit current stack\n\nexport const enum ParamKind {\n // Initial Parameter flags\n PARAM = 0b0000,\n // track [Yield] production parameter\n PARAM_YIELD = 0b0001,\n // track [Await] production parameter\n PARAM_AWAIT = 0b0010,\n // track [Return] production parameter\n PARAM_RETURN = 0b0100,\n // track [In] production parameter\n PARAM_IN = 0b1000,\n}\n\n// todo(flow->ts) - check if more granular type can be used,\n// type below is not good because things like PARAM_AWAIT|PARAM_YIELD are not included\n// export type ParamKind =\n// | typeof PARAM\n// | typeof PARAM_AWAIT\n// | typeof PARAM_IN\n// | typeof PARAM_RETURN\n// | typeof PARAM_YIELD;\n\nexport default class ProductionParameterHandler {\n stacks: Array = [];\n enter(flags: ParamKind) {\n this.stacks.push(flags);\n }\n\n exit() {\n this.stacks.pop();\n }\n\n currentFlags(): ParamKind {\n return this.stacks[this.stacks.length - 1];\n }\n\n get hasAwait(): boolean {\n return (this.currentFlags() & ParamKind.PARAM_AWAIT) > 0;\n }\n\n get hasYield(): boolean {\n return (this.currentFlags() & ParamKind.PARAM_YIELD) > 0;\n }\n\n get hasReturn(): boolean {\n return (this.currentFlags() & ParamKind.PARAM_RETURN) > 0;\n }\n\n get hasIn(): boolean {\n return (this.currentFlags() & ParamKind.PARAM_IN) > 0;\n }\n}\n\nexport function functionFlags(\n isAsync: boolean,\n isGenerator: boolean,\n): ParamKind {\n return (\n (isAsync ? ParamKind.PARAM_AWAIT : 0) |\n (isGenerator ? ParamKind.PARAM_YIELD : 0)\n );\n}\n","import type { OptionFlags, Options } from \"../options.ts\";\nimport type State from \"../tokenizer/state.ts\";\nimport type { PluginsMap } from \"./index.ts\";\nimport type ScopeHandler from \"../util/scope.ts\";\nimport type ExpressionScopeHandler from \"../util/expression-scope.ts\";\nimport type ClassScopeHandler from \"../util/class-scope.ts\";\nimport type ProductionParameterHandler from \"../util/production-parameter.ts\";\nimport type {\n ParserPluginWithOptions,\n PluginConfig,\n PluginOptions,\n} from \"../typings.ts\";\nimport type * as N from \"../types.ts\";\n\nexport default class BaseParser {\n // Properties set by constructor in index.js\n declare options: Options;\n declare optionFlags: OptionFlags;\n declare inModule: boolean;\n declare scope: ScopeHandler;\n declare classScope: ClassScopeHandler;\n declare prodParam: ProductionParameterHandler;\n declare expressionScope: ExpressionScopeHandler;\n declare plugins: PluginsMap;\n declare filename: string | undefined | null;\n declare startIndex: number;\n // Names of exports store. `default` is stored as a name for both\n // `export default foo;` and `export { foo as default };`.\n declare exportedIdentifiers: Set;\n sawUnambiguousESM: boolean = false;\n ambiguousScriptDifferentAst: boolean = false;\n\n // Initialized by Tokenizer\n declare state: State;\n // input and length are not in state as they are constant and we do\n // not want to ever copy them, which happens if state gets cloned\n declare input: string;\n declare length: number;\n // Comment store for Program.comments\n declare comments: Array;\n\n sourceToOffsetPos(sourcePos: number) {\n return sourcePos + this.startIndex;\n }\n\n offsetToSourcePos(offsetPos: number) {\n return offsetPos - this.startIndex;\n }\n\n // This method accepts either a string (plugin name) or an array pair\n // (plugin name and options object). If an options object is given,\n // then each value is non-recursively checked for identity with that\n // plugin’s actual option value.\n hasPlugin(pluginConfig: PluginConfig): boolean {\n if (typeof pluginConfig === \"string\") {\n return this.plugins.has(pluginConfig);\n } else {\n const [pluginName, pluginOptions] = pluginConfig;\n if (!this.hasPlugin(pluginName)) {\n return false;\n }\n const actualOptions = this.plugins.get(pluginName);\n for (const key of Object.keys(\n pluginOptions,\n ) as (keyof typeof pluginOptions)[]) {\n if (actualOptions?.[key] !== pluginOptions[key]) {\n return false;\n }\n }\n return true;\n }\n }\n\n getPluginOption<\n PluginName extends ParserPluginWithOptions[0],\n OptionName extends keyof PluginOptions,\n >(plugin: PluginName, name: OptionName) {\n return (this.plugins.get(plugin) as null | PluginOptions)?.[\n name\n ];\n }\n}\n","/*:: declare var invariant; */\n\nimport BaseParser from \"./base.ts\";\nimport type { Comment, Node } from \"../types.ts\";\nimport * as charCodes from \"charcodes\";\nimport type { Undone } from \"./node.ts\";\n\n/**\n * A whitespace token containing comments\n */\nexport type CommentWhitespace = {\n /**\n * the start of the whitespace token.\n */\n start: number;\n /**\n * the end of the whitespace token.\n */\n end: number;\n /**\n * the containing comments\n */\n comments: Array;\n /**\n * the immediately preceding AST node of the whitespace token\n */\n leadingNode: Node | null;\n /**\n * the immediately following AST node of the whitespace token\n */\n trailingNode: Node | null;\n /**\n * the innermost AST node containing the whitespace with minimal size (|end - start|)\n */\n containingNode: Node | null;\n};\n\n/**\n * Merge comments with node's trailingComments or assign comments to be\n * trailingComments. New comments will be placed before old comments\n * because the commentStack is enumerated reversely.\n */\nfunction setTrailingComments(node: Undone, comments: Array) {\n if (node.trailingComments === undefined) {\n node.trailingComments = comments;\n } else {\n node.trailingComments.unshift(...comments);\n }\n}\n\n/**\n * Merge comments with node's leadingComments or assign comments to be\n * leadingComments. New comments will be placed before old comments\n * because the commentStack is enumerated reversely.\n */\nfunction setLeadingComments(node: Undone, comments: Array) {\n if (node.leadingComments === undefined) {\n node.leadingComments = comments;\n } else {\n node.leadingComments.unshift(...comments);\n }\n}\n\n/**\n * Merge comments with node's innerComments or assign comments to be\n * innerComments. New comments will be placed before old comments\n * because the commentStack is enumerated reversely.\n */\nexport function setInnerComments(\n node: Undone,\n comments?: Array,\n) {\n if (node.innerComments === undefined) {\n node.innerComments = comments;\n } else {\n node.innerComments.unshift(...comments);\n }\n}\n\n/**\n * Given node and elements array, if elements has non-null element,\n * merge comments to its trailingComments, otherwise merge comments\n * to node's innerComments\n */\nfunction adjustInnerComments(\n node: Undone,\n elements: Array,\n commentWS: CommentWhitespace,\n) {\n let lastElement = null;\n let i = elements.length;\n while (lastElement === null && i > 0) {\n lastElement = elements[--i];\n }\n if (lastElement === null || lastElement.start > commentWS.start) {\n setInnerComments(node, commentWS.comments);\n } else {\n setTrailingComments(lastElement, commentWS.comments);\n }\n}\n\nexport default class CommentsParser extends BaseParser {\n addComment(comment: Comment): void {\n if (this.filename) comment.loc.filename = this.filename;\n const { commentsLen } = this.state;\n if (this.comments.length !== commentsLen) {\n this.comments.length = commentsLen;\n }\n this.comments.push(comment);\n this.state.commentsLen++;\n }\n\n /**\n * Given a newly created AST node _n_, attach _n_ to a comment whitespace _w_ if applicable\n * {@see {@link CommentWhitespace}}\n */\n processComment(node: Node): void {\n const { commentStack } = this.state;\n const commentStackLength = commentStack.length;\n if (commentStackLength === 0) return;\n let i = commentStackLength - 1;\n const lastCommentWS = commentStack[i];\n\n if (lastCommentWS.start === node.end) {\n lastCommentWS.leadingNode = node;\n i--;\n }\n\n const { start: nodeStart } = node;\n // invariant: for all 0 <= j <= i, let c = commentStack[j], c must satisfy c.end < node.end\n for (; i >= 0; i--) {\n const commentWS = commentStack[i];\n const commentEnd = commentWS.end;\n if (commentEnd > nodeStart) {\n // by definition of commentWhiteSpace, this implies commentWS.start > nodeStart\n // so node can be a containingNode candidate. At this time we can finalize the comment\n // whitespace, because\n // 1) its leadingNode or trailingNode, if exists, will not change\n // 2) its containingNode have been assigned and will not change because it is the\n // innermost minimal-sized AST node\n commentWS.containingNode = node;\n this.finalizeComment(commentWS);\n commentStack.splice(i, 1);\n } else {\n if (commentEnd === nodeStart) {\n commentWS.trailingNode = node;\n }\n // stop the loop when commentEnd <= nodeStart\n break;\n }\n }\n }\n\n /**\n * Assign the comments of comment whitespaces to related AST nodes.\n * Also adjust innerComments following trailing comma.\n */\n finalizeComment(commentWS: CommentWhitespace) {\n const { comments } = commentWS;\n if (commentWS.leadingNode !== null || commentWS.trailingNode !== null) {\n if (commentWS.leadingNode !== null) {\n setTrailingComments(commentWS.leadingNode, comments);\n }\n if (commentWS.trailingNode !== null) {\n setLeadingComments(commentWS.trailingNode, comments);\n }\n } else {\n /*:: invariant(commentWS.containingNode !== null) */\n const { containingNode: node, start: commentStart } = commentWS;\n if (\n this.input.charCodeAt(this.offsetToSourcePos(commentStart) - 1) ===\n charCodes.comma\n ) {\n // If a commentWhitespace follows a comma and the containingNode allows\n // list structures with trailing comma, merge it to the trailingComment\n // of the last non-null list element\n switch (node.type) {\n case \"ObjectExpression\":\n case \"ObjectPattern\":\n case \"RecordExpression\":\n adjustInnerComments(node, node.properties, commentWS);\n break;\n case \"CallExpression\":\n case \"OptionalCallExpression\":\n adjustInnerComments(node, node.arguments, commentWS);\n break;\n case \"ImportExpression\":\n adjustInnerComments(\n node,\n [node.source, node.options ?? null],\n commentWS,\n );\n break;\n case \"FunctionDeclaration\":\n case \"FunctionExpression\":\n case \"ArrowFunctionExpression\":\n case \"ObjectMethod\":\n case \"ClassMethod\":\n case \"ClassPrivateMethod\":\n adjustInnerComments(node, node.params, commentWS);\n break;\n case \"ArrayExpression\":\n case \"ArrayPattern\":\n case \"TupleExpression\":\n adjustInnerComments(node, node.elements, commentWS);\n break;\n case \"ExportNamedDeclaration\":\n case \"ImportDeclaration\":\n adjustInnerComments(node, node.specifiers, commentWS);\n break;\n case \"TSEnumDeclaration\":\n if (!process.env.BABEL_8_BREAKING) {\n adjustInnerComments(node, node.members, commentWS);\n } else {\n setInnerComments(node, comments);\n }\n break;\n case \"TSEnumBody\":\n adjustInnerComments(node, node.members, commentWS);\n break;\n default: {\n setInnerComments(node, comments);\n }\n }\n } else {\n setInnerComments(node, comments);\n }\n }\n }\n\n /**\n * Drains remaining commentStack and applies finalizeComment\n * to each comment whitespace. Used only in parseExpression\n * where the top level AST node is _not_ Program\n * {@see {@link CommentsParser#finalizeComment}}\n */\n finalizeRemainingComments() {\n const { commentStack } = this.state;\n for (let i = commentStack.length - 1; i >= 0; i--) {\n this.finalizeComment(commentStack[i]);\n }\n this.state.commentStack = [];\n }\n\n /* eslint-disable no-irregular-whitespace */\n /**\n * Reset previous node trailing comments. Used in object / class\n * property parsing. We parse `async`, `static`, `set` and `get`\n * as an identifier but may reinterpret it into an async/static/accessor\n * method later. In this case the identifier is not part of the AST and we\n * should sync the knowledge to commentStacks\n *\n * For example, when parsing\n * ```\n * async /* 1 *​/ function f() {}\n * ```\n * the comment whitespace `/* 1 *​/` has leading node Identifier(async). When\n * we see the function token, we create a Function node and mark `/* 1 *​/` as\n * inner comments. So `/* 1 *​/` should be detached from the Identifier node.\n *\n * @param node the last finished AST node _before_ current token\n */\n /* eslint-enable no-irregular-whitespace */\n resetPreviousNodeTrailingComments(node: Node) {\n const { commentStack } = this.state;\n const { length } = commentStack;\n if (length === 0) return;\n const commentWS = commentStack[length - 1];\n if (commentWS.leadingNode === node) {\n commentWS.leadingNode = null;\n }\n }\n\n /**\n * Attach a node to the comment whitespaces right before/after\n * the given range.\n *\n * This is used to properly attach comments around parenthesized\n * expressions as leading/trailing comments of the inner expression.\n */\n takeSurroundingComments(node: Node, start: number, end: number) {\n const { commentStack } = this.state;\n const commentStackLength = commentStack.length;\n if (commentStackLength === 0) return;\n let i = commentStackLength - 1;\n\n for (; i >= 0; i--) {\n const commentWS = commentStack[i];\n const commentEnd = commentWS.end;\n const commentStart = commentWS.start;\n\n if (commentStart === end) {\n commentWS.leadingNode = node;\n } else if (commentEnd === start) {\n commentWS.trailingNode = node;\n } else if (commentEnd < start) {\n break;\n }\n }\n }\n}\n","import type { Options } from \"../options.ts\";\nimport type { CommentWhitespace } from \"../parser/comments\";\nimport { Position } from \"../util/location.ts\";\n\nimport { types as ct, type TokContext } from \"./context.ts\";\nimport { tt, type TokenType } from \"./types.ts\";\nimport type { Errors } from \"../parse-error.ts\";\nimport type { ParseError } from \"../parse-error.ts\";\n\nexport type DeferredStrictError =\n | typeof Errors.StrictNumericEscape\n | typeof Errors.StrictOctalLiteral;\n\ntype TopicContextState = {\n // When a topic binding has been currently established,\n // then this is 1. Otherwise, it is 0. This is forwards compatible\n // with a future plugin for multiple lexical topics.\n maxNumOfResolvableTopics: number;\n // When a topic binding has been currently established, and if that binding\n // has been used as a topic reference `#`, then this is 0. Otherwise, it is\n // `null`. This is forwards compatible with a future plugin for multiple\n // lexical topics.\n maxTopicIndex: null | 0;\n};\n\nexport const enum LoopLabelKind {\n Loop = 1,\n Switch = 2,\n}\n\ndeclare const bit: import(\"../../../../scripts/babel-plugin-bit-decorator/types.d.ts\").BitDecorator;\n\nexport default class State {\n @bit.storage flags: number;\n\n @bit accessor strict = false;\n\n startIndex: number;\n curLine: number;\n lineStart: number;\n\n // And, if locations are used, the {line, column} object\n // corresponding to those offsets\n startLoc: Position;\n endLoc: Position;\n\n init({\n strictMode,\n sourceType,\n startIndex,\n startLine,\n startColumn,\n }: Options): void {\n this.strict =\n strictMode === false\n ? false\n : strictMode === true\n ? true\n : sourceType === \"module\";\n\n this.startIndex = startIndex;\n this.curLine = startLine;\n this.lineStart = -startColumn;\n this.startLoc = this.endLoc = new Position(\n startLine,\n startColumn,\n startIndex,\n );\n }\n\n errors: ParseError[] = [];\n\n // Used to signify the start of a potential arrow function\n potentialArrowAt: number = -1;\n\n // Used to signify the start of an expression which looks like a\n // typed arrow function, but it isn't\n // e.g. a ? (b) : c => d\n // ^\n noArrowAt: number[] = [];\n\n // Used to signify the start of an expression whose params, if it looks like\n // an arrow function, shouldn't be converted to assignable nodes.\n // This is used to defer the validation of typed arrow functions inside\n // conditional expressions.\n // e.g. a ? (b) : c => d\n // ^\n noArrowParamsConversionAt: number[] = [];\n\n // Flags to track\n @bit accessor maybeInArrowParameters = false;\n @bit accessor inType = false;\n @bit accessor noAnonFunctionType = false;\n @bit accessor hasFlowComment = false;\n @bit accessor isAmbientContext = false;\n @bit accessor inAbstractClass = false;\n @bit accessor inDisallowConditionalTypesContext = false;\n\n // For the Hack-style pipelines plugin\n topicContext: TopicContextState = {\n maxNumOfResolvableTopics: 0,\n maxTopicIndex: null,\n };\n\n // For the F#-style pipelines plugin\n @bit accessor soloAwait = false;\n @bit accessor inFSharpPipelineDirectBody = false;\n\n // Labels in scope.\n labels: Array<{\n kind: LoopLabelKind;\n name?: string | null;\n statementStart?: number;\n }> = [];\n\n commentsLen = 0;\n // Comment attachment store\n commentStack: Array = [];\n\n // The current position of the tokenizer in the input.\n pos: number = 0;\n\n // Properties of the current token:\n // Its type\n type: TokenType = tt.eof;\n\n // For tokens that include more information than their type, the value\n value: any = null;\n\n // Its start and end offset\n start: number = 0;\n end: number = 0;\n\n // Position information for the previous token\n // this is initialized when generating the second token.\n lastTokEndLoc: Position = null;\n // this is initialized when generating the second token.\n lastTokStartLoc: Position = null;\n\n // The context stack is used to track whether the apostrophe \"`\" starts\n // or ends a string template\n context: Array = [ct.brace];\n\n // Used to track whether a JSX element is allowed to form\n @bit accessor canStartJSXElement = true;\n\n // Used to signal to callers of `readWord1` whether the word\n // contained any escape sequences. This is needed because words with\n // escape sequences must not be interpreted as keywords.\n @bit accessor containsEsc = false;\n\n // Used to track invalid escape sequences in template literals,\n // that must be reported if the template is not tagged.\n firstInvalidTemplateEscapePos: null | Position = null;\n\n @bit accessor hasTopLevelAwait = false;\n\n // This property is used to track the following errors\n // - StrictNumericEscape\n // - StrictOctalLiteral\n //\n // in a literal that occurs prior to/immediately after a \"use strict\" directive.\n\n // todo(JLHwung): set strictErrors to null and avoid recording string errors\n // after a non-directive is parsed\n strictErrors: Map = new Map();\n\n // Tokens length in token store\n tokensLength: number = 0;\n\n /**\n * When we add a new property, we must manually update the `clone` method\n * @see State#clone\n */\n\n curPosition(): Position {\n return new Position(\n this.curLine,\n this.pos - this.lineStart,\n this.pos + this.startIndex,\n );\n }\n\n clone(): State {\n const state = new State();\n state.flags = this.flags;\n state.startIndex = this.startIndex;\n state.curLine = this.curLine;\n state.lineStart = this.lineStart;\n state.startLoc = this.startLoc;\n state.endLoc = this.endLoc;\n state.errors = this.errors.slice();\n state.potentialArrowAt = this.potentialArrowAt;\n state.noArrowAt = this.noArrowAt.slice();\n state.noArrowParamsConversionAt = this.noArrowParamsConversionAt.slice();\n state.topicContext = this.topicContext;\n state.labels = this.labels.slice();\n state.commentsLen = this.commentsLen;\n state.commentStack = this.commentStack.slice();\n state.pos = this.pos;\n state.type = this.type;\n state.value = this.value;\n state.start = this.start;\n state.end = this.end;\n state.lastTokEndLoc = this.lastTokEndLoc;\n state.lastTokStartLoc = this.lastTokStartLoc;\n state.context = this.context.slice();\n state.firstInvalidTemplateEscapePos = this.firstInvalidTemplateEscapePos;\n state.strictErrors = this.strictErrors;\n state.tokensLength = this.tokensLength;\n\n return state;\n }\n}\n\nexport type LookaheadState = {\n pos: number;\n value: any;\n type: TokenType;\n start: number;\n end: number;\n context: TokContext[];\n startLoc: Position;\n lastTokEndLoc: Position;\n curLine: number;\n lineStart: number;\n curPosition: State[\"curPosition\"];\n /* Used only in readToken_mult_modulo */\n inType: boolean;\n // These boolean properties are not initialized in createLookaheadState()\n // instead they will only be set by the tokenizer\n containsEsc?: boolean;\n};\n","// We inline this package\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport * as charCodes from \"charcodes\";\n\n// The following character codes are forbidden from being\n// an immediate sibling of NumericLiteralSeparator _\nconst forbiddenNumericSeparatorSiblings = {\n decBinOct: new Set([\n charCodes.dot,\n charCodes.uppercaseB,\n charCodes.uppercaseE,\n charCodes.uppercaseO,\n charCodes.underscore, // multiple separators are not allowed\n charCodes.lowercaseB,\n charCodes.lowercaseE,\n charCodes.lowercaseO,\n ]),\n hex: new Set([\n charCodes.dot,\n charCodes.uppercaseX,\n charCodes.underscore, // multiple separators are not allowed\n charCodes.lowercaseX,\n ]),\n};\n\nconst isAllowedNumericSeparatorSibling = {\n // 0 - 1\n bin: (ch: number) => ch === charCodes.digit0 || ch === charCodes.digit1,\n\n // 0 - 7\n oct: (ch: number) => ch >= charCodes.digit0 && ch <= charCodes.digit7,\n\n // 0 - 9\n dec: (ch: number) => ch >= charCodes.digit0 && ch <= charCodes.digit9,\n\n // 0 - 9, A - F, a - f,\n hex: (ch: number) =>\n (ch >= charCodes.digit0 && ch <= charCodes.digit9) ||\n (ch >= charCodes.uppercaseA && ch <= charCodes.uppercaseF) ||\n (ch >= charCodes.lowercaseA && ch <= charCodes.lowercaseF),\n};\n\nexport type StringContentsErrorHandlers = EscapedCharErrorHandlers & {\n unterminated(\n initialPos: number,\n initialLineStart: number,\n initialCurLine: number,\n ): void;\n};\n\nexport function readStringContents(\n type: \"single\" | \"double\" | \"template\",\n input: string,\n pos: number,\n lineStart: number,\n curLine: number,\n errors: StringContentsErrorHandlers,\n) {\n const initialPos = pos;\n const initialLineStart = lineStart;\n const initialCurLine = curLine;\n\n let out = \"\";\n let firstInvalidLoc = null;\n let chunkStart = pos;\n const { length } = input;\n for (;;) {\n if (pos >= length) {\n errors.unterminated(initialPos, initialLineStart, initialCurLine);\n out += input.slice(chunkStart, pos);\n break;\n }\n const ch = input.charCodeAt(pos);\n if (isStringEnd(type, ch, input, pos)) {\n out += input.slice(chunkStart, pos);\n break;\n }\n if (ch === charCodes.backslash) {\n out += input.slice(chunkStart, pos);\n const res = readEscapedChar(\n input,\n pos,\n lineStart,\n curLine,\n type === \"template\",\n errors,\n );\n if (res.ch === null && !firstInvalidLoc) {\n firstInvalidLoc = { pos, lineStart, curLine };\n } else {\n out += res.ch;\n }\n ({ pos, lineStart, curLine } = res);\n chunkStart = pos;\n } else if (\n ch === charCodes.lineSeparator ||\n ch === charCodes.paragraphSeparator\n ) {\n ++pos;\n ++curLine;\n lineStart = pos;\n } else if (ch === charCodes.lineFeed || ch === charCodes.carriageReturn) {\n if (type === \"template\") {\n out += input.slice(chunkStart, pos) + \"\\n\";\n ++pos;\n if (\n ch === charCodes.carriageReturn &&\n input.charCodeAt(pos) === charCodes.lineFeed\n ) {\n ++pos;\n }\n ++curLine;\n chunkStart = lineStart = pos;\n } else {\n errors.unterminated(initialPos, initialLineStart, initialCurLine);\n }\n } else {\n ++pos;\n }\n }\n return process.env.BABEL_8_BREAKING\n ? { pos, str: out, firstInvalidLoc, lineStart, curLine }\n : {\n pos,\n str: out,\n firstInvalidLoc,\n lineStart,\n curLine,\n containsInvalid: !!firstInvalidLoc,\n };\n}\n\nfunction isStringEnd(\n type: \"single\" | \"double\" | \"template\",\n ch: number,\n input: string,\n pos: number,\n) {\n if (type === \"template\") {\n return (\n ch === charCodes.graveAccent ||\n (ch === charCodes.dollarSign &&\n input.charCodeAt(pos + 1) === charCodes.leftCurlyBrace)\n );\n }\n return (\n ch === (type === \"double\" ? charCodes.quotationMark : charCodes.apostrophe)\n );\n}\n\ntype EscapedCharErrorHandlers = HexCharErrorHandlers &\n CodePointErrorHandlers & {\n strictNumericEscape(pos: number, lineStart: number, curLine: number): void;\n };\n\nfunction readEscapedChar(\n input: string,\n pos: number,\n lineStart: number,\n curLine: number,\n inTemplate: boolean,\n errors: EscapedCharErrorHandlers,\n) {\n const throwOnInvalid = !inTemplate;\n pos++; // skip '\\'\n\n const res = (ch: string | null) => ({ pos, ch, lineStart, curLine });\n\n const ch = input.charCodeAt(pos++);\n switch (ch) {\n case charCodes.lowercaseN:\n return res(\"\\n\");\n case charCodes.lowercaseR:\n return res(\"\\r\");\n case charCodes.lowercaseX: {\n let code;\n ({ code, pos } = readHexChar(\n input,\n pos,\n lineStart,\n curLine,\n 2,\n false,\n throwOnInvalid,\n errors,\n ));\n return res(code === null ? null : String.fromCharCode(code));\n }\n case charCodes.lowercaseU: {\n let code;\n ({ code, pos } = readCodePoint(\n input,\n pos,\n lineStart,\n curLine,\n throwOnInvalid,\n errors,\n ));\n return res(code === null ? null : String.fromCodePoint(code));\n }\n case charCodes.lowercaseT:\n return res(\"\\t\");\n case charCodes.lowercaseB:\n return res(\"\\b\");\n case charCodes.lowercaseV:\n return res(\"\\u000b\");\n case charCodes.lowercaseF:\n return res(\"\\f\");\n case charCodes.carriageReturn:\n if (input.charCodeAt(pos) === charCodes.lineFeed) {\n ++pos;\n }\n // fall through\n case charCodes.lineFeed:\n lineStart = pos;\n ++curLine;\n // fall through\n case charCodes.lineSeparator:\n case charCodes.paragraphSeparator:\n return res(\"\");\n case charCodes.digit8:\n case charCodes.digit9:\n if (inTemplate) {\n return res(null);\n } else {\n errors.strictNumericEscape(pos - 1, lineStart, curLine);\n }\n // fall through\n default:\n if (ch >= charCodes.digit0 && ch <= charCodes.digit7) {\n const startPos = pos - 1;\n const match = /^[0-7]+/.exec(input.slice(startPos, pos + 2));\n\n let octalStr = match[0];\n\n let octal = parseInt(octalStr, 8);\n if (octal > 255) {\n octalStr = octalStr.slice(0, -1);\n octal = parseInt(octalStr, 8);\n }\n pos += octalStr.length - 1;\n const next = input.charCodeAt(pos);\n if (\n octalStr !== \"0\" ||\n next === charCodes.digit8 ||\n next === charCodes.digit9\n ) {\n if (inTemplate) {\n return res(null);\n } else {\n errors.strictNumericEscape(startPos, lineStart, curLine);\n }\n }\n\n return res(String.fromCharCode(octal));\n }\n\n return res(String.fromCharCode(ch));\n }\n}\n\ntype HexCharErrorHandlers = IntErrorHandlers & {\n invalidEscapeSequence(pos: number, lineStart: number, curLine: number): void;\n};\n\n// Used to read character escape sequences ('\\x', '\\u').\nfunction readHexChar(\n input: string,\n pos: number,\n lineStart: number,\n curLine: number,\n len: number,\n forceLen: boolean,\n throwOnInvalid: boolean,\n errors: HexCharErrorHandlers,\n) {\n const initialPos = pos;\n let n;\n ({ n, pos } = readInt(\n input,\n pos,\n lineStart,\n curLine,\n 16,\n len,\n forceLen,\n false,\n errors,\n /* bailOnError */ !throwOnInvalid,\n ));\n if (n === null) {\n if (throwOnInvalid) {\n errors.invalidEscapeSequence(initialPos, lineStart, curLine);\n } else {\n pos = initialPos - 1;\n }\n }\n return { code: n, pos };\n}\n\nexport type IntErrorHandlers = {\n numericSeparatorInEscapeSequence(\n pos: number,\n lineStart: number,\n curLine: number,\n ): void;\n unexpectedNumericSeparator(\n pos: number,\n lineStart: number,\n curLine: number,\n ): void;\n // It can return \"true\" to indicate that the error was handled\n // and the int parsing should continue.\n invalidDigit(\n pos: number,\n lineStart: number,\n curLine: number,\n radix: number,\n ): boolean;\n};\n\nexport function readInt(\n input: string,\n pos: number,\n lineStart: number,\n curLine: number,\n radix: number,\n len: number | undefined,\n forceLen: boolean,\n allowNumSeparator: boolean | \"bail\",\n errors: IntErrorHandlers,\n bailOnError: boolean,\n) {\n const start = pos;\n const forbiddenSiblings =\n radix === 16\n ? forbiddenNumericSeparatorSiblings.hex\n : forbiddenNumericSeparatorSiblings.decBinOct;\n const isAllowedSibling =\n radix === 16\n ? isAllowedNumericSeparatorSibling.hex\n : radix === 10\n ? isAllowedNumericSeparatorSibling.dec\n : radix === 8\n ? isAllowedNumericSeparatorSibling.oct\n : isAllowedNumericSeparatorSibling.bin;\n\n let invalid = false;\n let total = 0;\n\n for (let i = 0, e = len == null ? Infinity : len; i < e; ++i) {\n const code = input.charCodeAt(pos);\n let val;\n\n if (code === charCodes.underscore && allowNumSeparator !== \"bail\") {\n const prev = input.charCodeAt(pos - 1);\n const next = input.charCodeAt(pos + 1);\n\n if (!allowNumSeparator) {\n if (bailOnError) return { n: null, pos };\n errors.numericSeparatorInEscapeSequence(pos, lineStart, curLine);\n } else if (\n Number.isNaN(next) ||\n !isAllowedSibling(next) ||\n forbiddenSiblings.has(prev) ||\n forbiddenSiblings.has(next)\n ) {\n if (bailOnError) return { n: null, pos };\n errors.unexpectedNumericSeparator(pos, lineStart, curLine);\n }\n\n // Ignore this _ character\n ++pos;\n continue;\n }\n\n if (code >= charCodes.lowercaseA) {\n val = code - charCodes.lowercaseA + charCodes.lineFeed;\n } else if (code >= charCodes.uppercaseA) {\n val = code - charCodes.uppercaseA + charCodes.lineFeed;\n } else if (charCodes.isDigit(code)) {\n val = code - charCodes.digit0; // 0-9\n } else {\n val = Infinity;\n }\n if (val >= radix) {\n // If we found a digit which is too big, errors.invalidDigit can return true to avoid\n // breaking the loop (this is used for error recovery).\n if (val <= 9 && bailOnError) {\n return { n: null, pos };\n } else if (\n val <= 9 &&\n errors.invalidDigit(pos, lineStart, curLine, radix)\n ) {\n val = 0;\n } else if (forceLen) {\n val = 0;\n invalid = true;\n } else {\n break;\n }\n }\n ++pos;\n total = total * radix + val;\n }\n if (pos === start || (len != null && pos - start !== len) || invalid) {\n return { n: null, pos };\n }\n\n return { n: total, pos };\n}\n\nexport type CodePointErrorHandlers = HexCharErrorHandlers & {\n invalidCodePoint(pos: number, lineStart: number, curLine: number): void;\n};\n\nexport function readCodePoint(\n input: string,\n pos: number,\n lineStart: number,\n curLine: number,\n throwOnInvalid: boolean,\n errors: CodePointErrorHandlers,\n) {\n const ch = input.charCodeAt(pos);\n let code;\n\n if (ch === charCodes.leftCurlyBrace) {\n ++pos;\n ({ code, pos } = readHexChar(\n input,\n pos,\n lineStart,\n curLine,\n input.indexOf(\"}\", pos) - pos,\n true,\n throwOnInvalid,\n errors,\n ));\n ++pos;\n if (code !== null && code > 0x10ffff) {\n if (throwOnInvalid) {\n errors.invalidCodePoint(pos, lineStart, curLine);\n } else {\n return { code: null, pos };\n }\n }\n } else {\n ({ code, pos } = readHexChar(\n input,\n pos,\n lineStart,\n curLine,\n 4,\n false,\n throwOnInvalid,\n errors,\n ));\n }\n return { code, pos };\n}\n","/*:: declare var invariant; */\n\nimport { OptionFlags, type Options } from \"../options.ts\";\nimport {\n Position,\n SourceLocation,\n createPositionWithColumnOffset,\n} from \"../util/location.ts\";\nimport CommentsParser, { type CommentWhitespace } from \"../parser/comments.ts\";\nimport type * as N from \"../types.ts\";\nimport * as charCodes from \"charcodes\";\nimport { isIdentifierStart, isIdentifierChar } from \"../util/identifier.ts\";\nimport {\n tokenIsKeyword,\n tokenLabelName,\n tt,\n keywords as keywordTypes,\n type TokenType,\n} from \"./types.ts\";\nimport type { TokContext } from \"./context.ts\";\nimport {\n Errors,\n type ParseError,\n type ParseErrorConstructor,\n} from \"../parse-error.ts\";\nimport {\n lineBreakG,\n isNewLine,\n isWhitespace,\n skipWhiteSpace,\n skipWhiteSpaceInLine,\n} from \"../util/whitespace.ts\";\nimport State from \"./state.ts\";\nimport type { LookaheadState, DeferredStrictError } from \"./state.ts\";\nimport type { Undone } from \"../parser/node.ts\";\nimport type { Node } from \"../types.ts\";\n\nimport {\n readInt,\n readCodePoint,\n readStringContents,\n type IntErrorHandlers,\n type CodePointErrorHandlers,\n type StringContentsErrorHandlers,\n} from \"@babel/helper-string-parser\";\n\nimport type { Plugin } from \"../typings.ts\";\n\nfunction buildPosition(pos: number, lineStart: number, curLine: number) {\n return new Position(curLine, pos - lineStart, pos);\n}\n\nconst VALID_REGEX_FLAGS = new Set([\n charCodes.lowercaseG,\n charCodes.lowercaseM,\n charCodes.lowercaseS,\n charCodes.lowercaseI,\n charCodes.lowercaseY,\n charCodes.lowercaseU,\n charCodes.lowercaseD,\n charCodes.lowercaseV,\n]);\n\n// Object type used to represent tokens. Note that normally, tokens\n// simply exist as properties on the parser object. This is only\n// used for the onToken callback and the external tokenizer.\n\nexport class Token {\n constructor(state: State) {\n const startIndex = state.startIndex || 0;\n this.type = state.type;\n this.value = state.value;\n this.start = startIndex + state.start;\n this.end = startIndex + state.end;\n this.loc = new SourceLocation(state.startLoc, state.endLoc);\n }\n\n declare type: TokenType;\n declare value: any;\n declare start: number;\n declare end: number;\n declare loc: SourceLocation;\n}\n\n// ## Tokenizer\n\nexport default abstract class Tokenizer extends CommentsParser {\n isLookahead: boolean;\n\n // Token store.\n tokens: Array = [];\n\n constructor(options: Options, input: string) {\n super();\n this.state = new State();\n this.state.init(options);\n this.input = input;\n this.length = input.length;\n this.comments = [];\n this.isLookahead = false;\n }\n\n pushToken(token: Token | N.Comment) {\n // Pop out invalid tokens trapped by try-catch parsing.\n // Those parsing branches are mainly created by typescript and flow plugins.\n this.tokens.length = this.state.tokensLength;\n this.tokens.push(token);\n ++this.state.tokensLength;\n }\n\n // Move to the next token\n\n next(): void {\n this.checkKeywordEscapes();\n if (this.optionFlags & OptionFlags.Tokens) {\n this.pushToken(new Token(this.state));\n }\n\n this.state.lastTokEndLoc = this.state.endLoc;\n this.state.lastTokStartLoc = this.state.startLoc;\n this.nextToken();\n }\n\n eat(type: TokenType): boolean {\n if (this.match(type)) {\n this.next();\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * Whether current token matches given type\n */\n match(type: TokenType): boolean {\n return this.state.type === type;\n }\n\n /**\n * Create a LookaheadState from current parser state\n */\n createLookaheadState(state: State): LookaheadState {\n return {\n pos: state.pos,\n value: null,\n type: state.type,\n start: state.start,\n end: state.end,\n context: [this.curContext()],\n inType: state.inType,\n startLoc: state.startLoc,\n lastTokEndLoc: state.lastTokEndLoc,\n curLine: state.curLine,\n lineStart: state.lineStart,\n curPosition: state.curPosition,\n };\n }\n\n /**\n * lookahead peeks the next token, skipping changes to token context and\n * comment stack. For performance it returns a limited LookaheadState\n * instead of full parser state.\n *\n * The { column, line } Loc info is not included in lookahead since such usage\n * is rare. Although it may return other location properties e.g. `curLine` and\n * `lineStart`, these properties are not listed in the LookaheadState interface\n * and thus the returned value is _NOT_ reliable.\n *\n * The tokenizer should make best efforts to avoid using any parser state\n * other than those defined in LookaheadState\n */\n lookahead(): LookaheadState {\n const old = this.state;\n // @ts-expect-error For performance we use a simplified tokenizer state structure\n this.state = this.createLookaheadState(old);\n\n this.isLookahead = true;\n this.nextToken();\n this.isLookahead = false;\n\n const curr = this.state;\n this.state = old;\n return curr;\n }\n\n nextTokenStart(): number {\n return this.nextTokenStartSince(this.state.pos);\n }\n\n nextTokenStartSince(pos: number): number {\n skipWhiteSpace.lastIndex = pos;\n return skipWhiteSpace.test(this.input) ? skipWhiteSpace.lastIndex : pos;\n }\n\n lookaheadCharCode(): number {\n return this.lookaheadCharCodeSince(this.state.pos);\n }\n\n lookaheadCharCodeSince(pos: number): number {\n return this.input.charCodeAt(this.nextTokenStartSince(pos));\n }\n\n /**\n * Similar to nextToken, but it will stop at line break when it is seen before the next token\n *\n * @returns {number} position of the next token start or line break, whichever is seen first.\n * @memberof Tokenizer\n */\n nextTokenInLineStart(): number {\n return this.nextTokenInLineStartSince(this.state.pos);\n }\n\n nextTokenInLineStartSince(pos: number): number {\n skipWhiteSpaceInLine.lastIndex = pos;\n return skipWhiteSpaceInLine.test(this.input)\n ? skipWhiteSpaceInLine.lastIndex\n : pos;\n }\n\n /**\n * Similar to lookaheadCharCode, but it will return the char code of line break if it is\n * seen before the next token\n *\n * @returns {number} char code of the next token start or line break, whichever is seen first.\n * @memberof Tokenizer\n */\n lookaheadInLineCharCode(): number {\n return this.input.charCodeAt(this.nextTokenInLineStart());\n }\n\n codePointAtPos(pos: number): number {\n // The implementation is based on\n // https://source.chromium.org/chromium/chromium/src/+/master:v8/src/builtins/builtins-string-gen.cc;l=1455;drc=221e331b49dfefadbc6fa40b0c68e6f97606d0b3;bpv=0;bpt=1\n // We reimplement `codePointAt` because `codePointAt` is a V8 builtin which is not inlined by TurboFan (as of M91)\n // since `input` is mostly ASCII, an inlined `charCodeAt` wins here\n let cp = this.input.charCodeAt(pos);\n if ((cp & 0xfc00) === 0xd800 && ++pos < this.input.length) {\n const trail = this.input.charCodeAt(pos);\n if ((trail & 0xfc00) === 0xdc00) {\n cp = 0x10000 + ((cp & 0x3ff) << 10) + (trail & 0x3ff);\n }\n }\n return cp;\n }\n\n // Toggle strict mode. Re-reads the next number or string to please\n // pedantic tests (`\"use strict\"; 010;` should fail).\n\n setStrict(strict: boolean): void {\n this.state.strict = strict;\n if (strict) {\n // Throw an error for any string decimal escape found before/immediately\n // after a \"use strict\" directive. Strict mode will be set at parse\n // time for any literals that occur after the next node of the strict\n // directive.\n this.state.strictErrors.forEach(([toParseError, at]) =>\n this.raise(toParseError, at),\n );\n this.state.strictErrors.clear();\n }\n }\n\n curContext(): TokContext {\n return this.state.context[this.state.context.length - 1];\n }\n\n // Read a single token, updating the parser object's token-related properties.\n nextToken(): void {\n this.skipSpace();\n this.state.start = this.state.pos;\n if (!this.isLookahead) this.state.startLoc = this.state.curPosition();\n if (this.state.pos >= this.length) {\n this.finishToken(tt.eof);\n return;\n }\n\n this.getTokenFromCode(this.codePointAtPos(this.state.pos));\n }\n\n // Skips a block comment, whose end is marked by commentEnd.\n // *-/ is used by the Flow plugin, when parsing block comments nested\n // inside Flow comments.\n skipBlockComment(commentEnd: \"*/\" | \"*-/\"): N.CommentBlock | undefined {\n let startLoc;\n if (!this.isLookahead) startLoc = this.state.curPosition();\n const start = this.state.pos;\n const end = this.input.indexOf(commentEnd, start + 2);\n if (end === -1) {\n // We have to call this again here because startLoc may not be set...\n // This seems to be for performance reasons:\n // https://github.com/babel/babel/commit/acf2a10899f696a8aaf34df78bf9725b5ea7f2da\n throw this.raise(Errors.UnterminatedComment, this.state.curPosition());\n }\n\n this.state.pos = end + commentEnd.length;\n lineBreakG.lastIndex = start + 2;\n while (lineBreakG.test(this.input) && lineBreakG.lastIndex <= end) {\n ++this.state.curLine;\n this.state.lineStart = lineBreakG.lastIndex;\n }\n\n // If we are doing a lookahead right now we need to advance the position (above code)\n // but we do not want to push the comment to the state.\n if (this.isLookahead) return;\n /*:: invariant(startLoc) */\n\n const comment: N.CommentBlock = {\n type: \"CommentBlock\",\n value: this.input.slice(start + 2, end),\n start: this.sourceToOffsetPos(start),\n end: this.sourceToOffsetPos(end + commentEnd.length),\n loc: new SourceLocation(startLoc, this.state.curPosition()),\n };\n if (this.optionFlags & OptionFlags.Tokens) this.pushToken(comment);\n return comment;\n }\n\n skipLineComment(startSkip: number): N.CommentLine | undefined {\n const start = this.state.pos;\n let startLoc;\n if (!this.isLookahead) startLoc = this.state.curPosition();\n let ch = this.input.charCodeAt((this.state.pos += startSkip));\n if (this.state.pos < this.length) {\n while (!isNewLine(ch) && ++this.state.pos < this.length) {\n ch = this.input.charCodeAt(this.state.pos);\n }\n }\n\n // If we are doing a lookahead right now we need to advance the position (above code)\n // but we do not want to push the comment to the state.\n if (this.isLookahead) return;\n\n const end = this.state.pos;\n const value = this.input.slice(start + startSkip, end);\n\n const comment: N.CommentLine = {\n type: \"CommentLine\",\n value,\n start: this.sourceToOffsetPos(start),\n end: this.sourceToOffsetPos(end),\n loc: new SourceLocation(startLoc, this.state.curPosition()),\n };\n if (this.optionFlags & OptionFlags.Tokens) this.pushToken(comment);\n return comment;\n }\n\n // Called at the start of the parse and after every token. Skips\n // whitespace and comments, and.\n\n skipSpace(): void {\n const spaceStart = this.state.pos;\n const comments: N.Comment[] =\n this.optionFlags & OptionFlags.AttachComment ? [] : null;\n loop: while (this.state.pos < this.length) {\n const ch = this.input.charCodeAt(this.state.pos);\n switch (ch) {\n case charCodes.space:\n case charCodes.nonBreakingSpace:\n case charCodes.tab:\n ++this.state.pos;\n break;\n case charCodes.carriageReturn:\n if (\n this.input.charCodeAt(this.state.pos + 1) === charCodes.lineFeed\n ) {\n ++this.state.pos;\n }\n // fall through\n case charCodes.lineFeed:\n case charCodes.lineSeparator:\n case charCodes.paragraphSeparator:\n ++this.state.pos;\n ++this.state.curLine;\n this.state.lineStart = this.state.pos;\n break;\n\n case charCodes.slash:\n switch (this.input.charCodeAt(this.state.pos + 1)) {\n case charCodes.asterisk: {\n const comment = this.skipBlockComment(\"*/\");\n if (comment !== undefined) {\n this.addComment(comment);\n comments?.push(comment);\n }\n break;\n }\n\n case charCodes.slash: {\n const comment = this.skipLineComment(2);\n if (comment !== undefined) {\n this.addComment(comment);\n comments?.push(comment);\n }\n break;\n }\n\n default:\n break loop;\n }\n break;\n\n default:\n if (isWhitespace(ch)) {\n ++this.state.pos;\n } else if (\n ch === charCodes.dash &&\n !this.inModule &&\n this.optionFlags & OptionFlags.AnnexB\n ) {\n const pos = this.state.pos;\n if (\n this.input.charCodeAt(pos + 1) === charCodes.dash &&\n this.input.charCodeAt(pos + 2) === charCodes.greaterThan &&\n (spaceStart === 0 || this.state.lineStart > spaceStart)\n ) {\n // A `-->` line comment\n const comment = this.skipLineComment(3);\n if (comment !== undefined) {\n this.addComment(comment);\n comments?.push(comment);\n }\n } else {\n break loop;\n }\n } else if (\n ch === charCodes.lessThan &&\n !this.inModule &&\n this.optionFlags & OptionFlags.AnnexB\n ) {\n const pos = this.state.pos;\n if (\n this.input.charCodeAt(pos + 1) === charCodes.exclamationMark &&\n this.input.charCodeAt(pos + 2) === charCodes.dash &&\n this.input.charCodeAt(pos + 3) === charCodes.dash\n ) {\n // `` line comment\n const comment = this.skipLineComment(3);\n if (comment !== undefined) {\n this.addComment(comment);\n if (this.options.attachComment) comments.push(comment);\n }\n } else {\n break loop;\n }\n } else if (\n ch === charCodes.lessThan &&\n !this.inModule &&\n this.options.annexB\n ) {\n const pos = this.state.pos;\n if (\n this.input.charCodeAt(pos + 1) === charCodes.exclamationMark &&\n this.input.charCodeAt(pos + 2) === charCodes.dash &&\n this.input.charCodeAt(pos + 3) === charCodes.dash\n ) {\n // ``"]) ]); @@ -99,7 +93,10 @@ function processIfBranch(branch, context, disableNestedFragments = false) { return processChildrenAsStatement(branch, context, needFragmentWrapper); } -const ssrTransformFor = compilerDom.createStructuralDirectiveTransform("for", compilerDom.processFor); +const ssrTransformFor = compilerDom.createStructuralDirectiveTransform( + "for", + compilerDom.processFor +); function ssrProcessFor(node, context, disableNestedFragments = false) { const needFragmentWrapper = !disableNestedFragments && (node.children.length !== 1 || node.children[0].type !== 1); const renderLoop = compilerDom.createFunctionExpression( @@ -140,20 +137,14 @@ const ssrTransformSlotOutlet = (node, context) => { args.push(`"${context.scopeId}-s"`); } let method = SSR_RENDER_SLOT; - let parent = context.parent; - if (parent) { - const children = parent.children; - if (parent.type === 10) { - parent = context.grandParent; - } - let componentType; - if (parent.type === 1 && parent.tagType === 1 && ((componentType = compilerDom.resolveComponentType(parent, context, true)) === compilerDom.TRANSITION || componentType === compilerDom.TRANSITION_GROUP) && children.filter((c) => c.type === 1).length === 1) { - method = SSR_RENDER_SLOT_INNER; - if (!(context.scopeId && context.slotted !== false)) { - args.push("null"); - } - args.push("true"); + const parent = context.parent; + let componentType; + if (parent && parent.type === 1 && parent.tagType === 1 && ((componentType = compilerDom.resolveComponentType(parent, context, true)) === compilerDom.TRANSITION || componentType === compilerDom.TRANSITION_GROUP) && parent.children.filter((c) => c.type === 1).length === 1) { + method = SSR_RENDER_SLOT_INNER; + if (!(context.scopeId && context.slotted !== false)) { + args.push("null"); } + args.push("true"); } node.ssrCodegenNode = compilerDom.createCallExpression(context.helper(method), args); } @@ -362,28 +353,6 @@ const ssrTransformElement = (node, context) => { ]) ]; } - } else if (directives.length && !node.children.length) { - const vText = compilerDom.findDir(node, "text"); - if (!vText) { - const tempId = `_temp${context.temps++}`; - propsExp.arguments = [ - compilerDom.createAssignmentExpression( - compilerDom.createSimpleExpression(tempId, false), - mergedProps - ) - ]; - rawChildrenMap.set( - node, - compilerDom.createConditionalExpression( - compilerDom.createSimpleExpression(`"textContent" in ${tempId}`, false), - compilerDom.createCallExpression(context.helper(SSR_INTERPOLATE), [ - compilerDom.createSimpleExpression(`${tempId}.textContent`, false) - ]), - compilerDom.createSimpleExpression(`${tempId}.innerHTML ?? ''`, false), - false - ) - ); - } } if (needTagForRuntime) { propsExp.arguments.push(`"${node.tag}"`); @@ -401,10 +370,7 @@ const ssrTransformElement = (node, context) => { } if (prop.type === 7) { if (prop.name === "html" && prop.exp) { - rawChildrenMap.set( - node, - compilerDom.createCompoundExpression([`(`, prop.exp, `) ?? ''`]) - ); + rawChildrenMap.set(node, prop.exp); } else if (prop.name === "text" && prop.exp) { node.children = [compilerDom.createInterpolation(prop.exp, prop.loc)]; } else if (prop.name === "slot") { @@ -651,13 +617,6 @@ function ssrProcessTransitionGroup(node, context) { * be patched using the same key map) so we need to account for that here * by disabling nested fragment wrappers from being generated. */ - true, - /** - * TransitionGroup filters out comment children at runtime and thus - * doesn't expect comments to be present during hydration. We need to - * account for that by disabling the empty comment that is otherwise - * rendered for a falsy v-if that has no v-else specified. (#6715) - */ true ); context.pushStringPart(``); - processChildren(node, context, false, true, true); + processChildren(node, context, false, true); context.pushStringPart(``); } } else { - processChildren(node, context, true, true, true); + processChildren(node, context, true, true); } } @@ -994,7 +953,7 @@ function createChildContext(parent, withSlotScopeId = parent.withSlotScopeId) { withSlotScopeId ); } -function processChildren(parent, context, asFragment = false, disableNestedFragments = false, disableComment = false) { +function processChildren(parent, context, asFragment = false, disableNestedFragments = false) { if (asFragment) { context.pushStringPart(``); } @@ -1030,9 +989,7 @@ function processChildren(parent, context, asFragment = false, disableNestedFragm context.pushStringPart(shared.escapeHtml(child.content)); break; case 3: - if (!disableComment) { - context.pushStringPart(``); - } + context.pushStringPart(``); break; case 5: context.pushStringPart( @@ -1042,7 +999,7 @@ function processChildren(parent, context, asFragment = false, disableNestedFragm ); break; case 9: - ssrProcessIf(child, context, disableNestedFragments, disableComment); + ssrProcessIf(child, context, disableNestedFragments); break; case 11: ssrProcessFor(child, context, disableNestedFragments); @@ -1086,17 +1043,6 @@ const ssrTransformModel = (dir, node, context) => { ); } } - const processSelectChildren = (children) => { - children.forEach((child) => { - if (child.type === 1) { - processOption(child); - } else if (child.type === 11) { - processSelectChildren(child.children); - } else if (child.type === 9) { - child.branches.forEach((b) => processSelectChildren(b.children)); - } - }); - }; function processOption(plainNode) { if (plainNode.tag === "option") { if (plainNode.props.findIndex((p) => p.name === "selected") === -1) { @@ -1123,7 +1069,9 @@ const ssrTransformModel = (dir, node, context) => { ); } } else if (plainNode.tag === "optgroup") { - processSelectChildren(plainNode.children); + plainNode.children.forEach( + (option) => processOption(option) + ); } } if (node.tagType === 0) { @@ -1208,7 +1156,11 @@ const ssrTransformModel = (dir, node, context) => { checkDuplicatedValue(); node.children = [compilerDom.createInterpolation(model, model.loc)]; } else if (node.tag === "select") { - processSelectChildren(node.children); + node.children.forEach((child) => { + if (child.type === 1) { + processOption(child); + } + }); } else { context.onError( compilerDom.createDOMCompilerError( @@ -1276,7 +1228,8 @@ const ssrInjectFallthroughAttrs = (node, context) => { let hasEncounteredIf = false; for (const c of filterChild(parent)) { if (c.type === 9 || c.type === 1 && compilerDom.findDir(c, "if")) { - if (hasEncounteredIf) return; + if (hasEncounteredIf) + return; hasEncounteredIf = true; } else if ( // node before v-if diff --git a/node_modules/@vue/compiler-ssr/package.json b/node_modules/@vue/compiler-ssr/package.json index 9dd16f76..b0beb63b 100644 --- a/node_modules/@vue/compiler-ssr/package.json +++ b/node_modules/@vue/compiler-ssr/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-ssr", - "version": "3.5.18", + "version": "3.4.21", "description": "@vue/compiler-ssr", "main": "dist/compiler-ssr.cjs.js", "types": "dist/compiler-ssr.d.ts", @@ -28,7 +28,7 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/compiler-ssr#readme", "dependencies": { - "@vue/compiler-dom": "3.5.18", - "@vue/shared": "3.5.18" + "@vue/shared": "3.4.21", + "@vue/compiler-dom": "3.4.21" } } \ No newline at end of file diff --git a/node_modules/@vue/server-renderer/dist/server-renderer.cjs.js b/node_modules/@vue/server-renderer/dist/server-renderer.cjs.js index 275ad57b..a1799813 100644 --- a/node_modules/@vue/server-renderer/dist/server-renderer.cjs.js +++ b/node_modules/@vue/server-renderer/dist/server-renderer.cjs.js @@ -1,5 +1,5 @@ /** -* @vue/server-renderer v3.5.18 +* @vue/server-renderer v3.5.22 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/ @@ -443,7 +443,7 @@ function logError(err, type, contextVNode, throwInDev = true, throwInProd = fals (v) => v ); } -const classifyRE = /(?:^|[-_])(\w)/g; +const classifyRE = /(?:^|[-_])\w/g; const classify = (str) => str.replace(classifyRE, (c) => c.toUpperCase()).replace(/[-_]/g, ""); function getComponentName(Component, includeInferred = true) { return shared.isFunction(Component) ? Component.displayName || Component.name : Component.name || includeInferred && Component.__name; diff --git a/node_modules/@vue/server-renderer/dist/server-renderer.cjs.prod.js b/node_modules/@vue/server-renderer/dist/server-renderer.cjs.prod.js index 0f880b40..1b6cde29 100644 --- a/node_modules/@vue/server-renderer/dist/server-renderer.cjs.prod.js +++ b/node_modules/@vue/server-renderer/dist/server-renderer.cjs.prod.js @@ -1,5 +1,5 @@ /** -* @vue/server-renderer v3.5.18 +* @vue/server-renderer v3.5.22 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/ diff --git a/node_modules/@vue/server-renderer/dist/server-renderer.esm-browser.js b/node_modules/@vue/server-renderer/dist/server-renderer.esm-browser.js index f6e9881d..e10ab080 100644 --- a/node_modules/@vue/server-renderer/dist/server-renderer.esm-browser.js +++ b/node_modules/@vue/server-renderer/dist/server-renderer.esm-browser.js @@ -1,9 +1,8 @@ /** -* @vue/server-renderer v3.5.18 +* @vue/server-renderer v3.5.22 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/ -/*! #__NO_SIDE_EFFECTS__ */ // @__NO_SIDE_EFFECTS__ function makeMap(str) { const map = /* @__PURE__ */ Object.create(null); @@ -55,15 +54,15 @@ const isBuiltInDirective = /* @__PURE__ */ makeMap( ); const cacheStringFunction = (fn) => { const cache = /* @__PURE__ */ Object.create(null); - return (str) => { + return ((str) => { const hit = cache[str]; return hit || (cache[str] = fn(str)); - }; + }); }; -const camelizeRE = /-(\w)/g; +const camelizeRE = /-\w/g; const camelize = cacheStringFunction( (str) => { - return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : ""); + return str.replace(camelizeRE, (c) => c.slice(1).toUpperCase()); } ); const hyphenateRE = /\B([A-Z])/g; @@ -1085,7 +1084,7 @@ const arrayInstrumentations = { join(separator) { return reactiveReadArray(this).join(separator); }, - // keys() iterator only reads `length`, no optimisation required + // keys() iterator only reads `length`, no optimization required lastIndexOf(...args) { return searchProxy(this, "lastIndexOf", args); }, @@ -1137,7 +1136,7 @@ function iterator(self, method, wrapValue) { iter._next = iter.next; iter.next = () => { const result = iter._next(); - if (result.value) { + if (!result.done) { result.value = wrapValue(result.value); } return result; @@ -1264,7 +1263,8 @@ class BaseReactiveHandler { return res; } if (isRef(res)) { - return targetIsArray && isIntegerKey(key) ? res : res.value; + const value = targetIsArray && isIntegerKey(key) ? res : res.value; + return isReadonly2 && isObject(value) ? readonly(value) : value; } if (isObject(res)) { return isReadonly2 ? readonly(res) : reactive(res); @@ -1286,7 +1286,13 @@ class MutableReactiveHandler extends BaseReactiveHandler { } if (!isArray(target) && isRef(oldValue) && !isRef(value)) { if (isOldValueReadonly) { - return false; + { + warn$2( + `Set operation on key "${String(key)}" failed: target is readonly.`, + target[key] + ); + } + return true; } else { oldValue.value = value; return true; @@ -1431,7 +1437,7 @@ function createInstrumentations(readonly, shallow) { get size() { const target = this["__v_raw"]; !readonly && track(toRaw(target), "iterate", ITERATE_KEY); - return Reflect.get(target, "size", target); + return target.size; }, has(key) { const target = this["__v_raw"]; @@ -1984,11 +1990,11 @@ function traverse(value, depth = Infinity, seen) { if (depth <= 0 || !isObject(value) || value["__v_skip"]) { return value; } - seen = seen || /* @__PURE__ */ new Set(); - if (seen.has(value)) { + seen = seen || /* @__PURE__ */ new Map(); + if ((seen.get(value) || 0) >= depth) { return value; } - seen.add(value); + seen.set(value, depth); depth--; if (isRef(value)) { traverse(value.value, depth, seen); @@ -2456,7 +2462,9 @@ function rerender(id, newRender) { } instance.renderCache = []; isHmrUpdating = true; - instance.update(); + if (!(instance.job.flags & 8)) { + instance.update(); + } isHmrUpdating = false; }); } @@ -2486,10 +2494,12 @@ function reload(id, newComp) { dirtyInstances.delete(instance); } else if (instance.parent) { queueJob(() => { - isHmrUpdating = true; - instance.parent.update(); - isHmrUpdating = false; - dirtyInstances.delete(instance); + if (!(instance.job.flags & 8)) { + isHmrUpdating = true; + instance.parent.update(); + isHmrUpdating = false; + dirtyInstances.delete(instance); + } }); } else if (instance.appContext.reload) { instance.appContext.reload(); @@ -2593,7 +2603,6 @@ const devtoolsComponentRemoved = (component) => { _devtoolsComponentRemoved(component); } }; -/*! #__NO_SIDE_EFFECTS__ */ // @__NO_SIDE_EFFECTS__ function createDevtoolsComponentHook(hook) { return (component) => { @@ -2691,6 +2700,7 @@ function invokeDirectiveHook(vnode, prevVNode, instance, name) { const TeleportEndKey = Symbol("_vte"); const isTeleport = (type) => type.__isTeleport; +const leaveCbKey = Symbol("_leaveCb"); function setTransitionHooks(vnode, hooks) { if (vnode.shapeFlag & 6 && vnode.component) { vnode.transition = hooks; @@ -2709,6 +2719,7 @@ function markAsyncBoundary(instance) { const knownTemplateRefs = /* @__PURE__ */ new WeakSet(); +const pendingSetRefMap = /* @__PURE__ */ new WeakMap(); function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) { if (isArray(rawRef)) { rawRef.forEach( @@ -2741,7 +2752,7 @@ function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) { const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs; const setupState = owner.setupState; const rawSetupState = toRaw(setupState); - const canSetSetupRef = setupState === EMPTY_OBJ ? () => false : (key) => { + const canSetSetupRef = setupState === EMPTY_OBJ ? NO : (key) => { { if (hasOwn(rawSetupState, key) && !isRef(rawSetupState[key])) { warn$1( @@ -2754,14 +2765,22 @@ function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) { } return hasOwn(rawSetupState, key); }; + const canSetRef = (ref2) => { + return !knownTemplateRefs.has(ref2); + }; if (oldRef != null && oldRef !== ref) { + invalidatePendingSetRef(oldRawRef); if (isString(oldRef)) { refs[oldRef] = null; if (canSetSetupRef(oldRef)) { setupState[oldRef] = null; } } else if (isRef(oldRef)) { - oldRef.value = null; + if (canSetRef(oldRef)) { + oldRef.value = null; + } + const oldRawRefAtom = oldRawRef; + if (oldRawRefAtom.k) refs[oldRawRefAtom.k] = null; } } if (isFunction(ref)) { @@ -2772,7 +2791,7 @@ function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) { if (_isString || _isRef) { const doSet = () => { if (rawRef.f) { - const existing = _isString ? canSetSetupRef(ref) ? setupState[ref] : refs[ref] : ref.value; + const existing = _isString ? canSetSetupRef(ref) ? setupState[ref] : refs[ref] : canSetRef(ref) || !rawRef.k ? ref.value : refs[rawRef.k]; if (isUnmount) { isArray(existing) && remove(existing, refValue); } else { @@ -2783,8 +2802,11 @@ function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) { setupState[ref] = refs[ref]; } } else { - ref.value = [refValue]; - if (rawRef.k) refs[rawRef.k] = ref.value; + const newVal = [refValue]; + if (canSetRef(ref)) { + ref.value = newVal; + } + if (rawRef.k) refs[rawRef.k] = newVal; } } else if (!existing.includes(refValue)) { existing.push(refValue); @@ -2796,16 +2818,24 @@ function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) { setupState[ref] = value; } } else if (_isRef) { - ref.value = value; + if (canSetRef(ref)) { + ref.value = value; + } if (rawRef.k) refs[rawRef.k] = value; } else { warn$1("Invalid template ref type:", ref, `(${typeof ref})`); } }; if (value) { - doSet.id = -1; - queuePostRenderEffect(doSet, parentSuspense); + const job = () => { + doSet(); + pendingSetRefMap.delete(rawRef); + }; + job.id = -1; + pendingSetRefMap.set(rawRef, job); + queuePostRenderEffect(job, parentSuspense); } else { + invalidatePendingSetRef(rawRef); doSet(); } } else { @@ -2813,6 +2843,13 @@ function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) { } } } +function invalidatePendingSetRef(rawRef) { + const pendingSetRef = pendingSetRefMap.get(rawRef); + if (pendingSetRef) { + pendingSetRef.flags |= 8; + pendingSetRefMap.delete(rawRef); + } +} const isAsyncWrapper = (i) => !!i.type.__asyncLoader; @@ -3066,10 +3103,10 @@ const PublicInstanceProxyHandlers = { return true; }, has({ - _: { data, setupState, accessCache, ctx, appContext, propsOptions } + _: { data, setupState, accessCache, ctx, appContext, propsOptions, type } }, key) { - let normalizedProps; - return !!accessCache[key] || data !== EMPTY_OBJ && hasOwn(data, key) || hasSetupBinding(setupState, key) || (normalizedProps = propsOptions[0]) && hasOwn(normalizedProps, key) || hasOwn(ctx, key) || hasOwn(publicPropertiesMap, key) || hasOwn(appContext.config.globalProperties, key); + let normalizedProps, cssModules; + return !!(accessCache[key] || data !== EMPTY_OBJ && key[0] !== "$" && hasOwn(data, key) || hasSetupBinding(setupState, key) || (normalizedProps = propsOptions[0]) && hasOwn(normalizedProps, key) || hasOwn(ctx, key) || hasOwn(publicPropertiesMap, key) || hasOwn(appContext.config.globalProperties, key) || (cssModules = type.__cssModules) && cssModules[key]); }, defineProperty(target, key, descriptor) { if (descriptor.get != null) { @@ -4211,7 +4248,7 @@ function isBoolean(...args) { return args.some((elem) => elem.toLowerCase() === "boolean"); } -const isInternalKey = (key) => key === "_" || key === "__" || key === "_ctx" || key === "$stable"; +const isInternalKey = (key) => key === "_" || key === "_ctx" || key === "$stable"; const normalizeSlotValue = (value) => isArray(value) ? value.map(normalizeVNode$1) : [normalizeVNode$1(value)]; const normalizeSlot = (key, rawSlot, ctx) => { if (rawSlot._n) { @@ -4265,8 +4302,6 @@ const assignSlots = (slots, children, optimized) => { const initSlots = (instance, children, optimized) => { const slots = instance.slots = createInternalObject(); if (instance.vnode.shapeFlag & 32) { - const cacheIndexes = children.__; - if (cacheIndexes) def(slots, "__", cacheIndexes, true); const type = children._; if (type) { assignSlots(slots, children, optimized); @@ -4327,12 +4362,10 @@ function endMeasure(instance, type) { if (instance.appContext.config.performance && isSupported()) { const startTag = `vue-${type}-${instance.uid}`; const endTag = startTag + `:end`; + const measureName = `<${formatComponentName(instance, instance.type)}> ${type}`; perf.mark(endTag); - perf.measure( - `<${formatComponentName(instance, instance.type)}> ${type}`, - startTag, - endTag - ); + perf.measure(measureName, startTag, endTag); + perf.clearMeasures(measureName); perf.clearMarks(startTag); perf.clearMarks(endTag); } @@ -5489,6 +5522,12 @@ function baseCreateRenderer(options, createHydrationFns) { } }; const performLeave = () => { + if (el._isLeaving) { + el[leaveCbKey]( + true + /* cancelled */ + ); + } leave(el, () => { remove2(); afterLeave && afterLeave(); @@ -5634,27 +5673,12 @@ function baseCreateRenderer(options, createHydrationFns) { if (instance.type.__hmrId) { unregisterHMR(instance); } - const { - bum, - scope, - job, - subTree, - um, - m, - a, - parent, - slots: { __: slotCacheKeys } - } = instance; + const { bum, scope, job, subTree, um, m, a } = instance; invalidateMount(m); invalidateMount(a); if (bum) { invokeArrayFns(bum); } - if (parent && isArray(slotCacheKeys)) { - slotCacheKeys.forEach((v) => { - parent.renderCache[v] = void 0; - }); - } scope.stop(); if (job) { job.flags |= 8; @@ -5666,12 +5690,6 @@ function baseCreateRenderer(options, createHydrationFns) { queuePostRenderEffect(() => { instance.isUnmounted = true; }, parentSuspense); - if (parentSuspense && parentSuspense.pendingBranch && !parentSuspense.isUnmounted && instance.asyncDep && !instance.asyncResolved && instance.suspenseId === parentSuspense.pendingId) { - parentSuspense.deps--; - if (parentSuspense.deps === 0) { - parentSuspense.resolve(); - } - } { devtoolsComponentRemoved(instance); } @@ -5766,7 +5784,8 @@ function traverseStaticChildren(n1, n2, shallow = false) { if (!shallow && c2.patchFlag !== -2) traverseStaticChildren(c1, c2); } - if (c2.type === Text) { + if (c2.type === Text && // avoid cached text nodes retaining detached dom nodes + c2.patchFlag !== -1) { c2.el = c1.el; } if (c2.type === Comment && !c2.el) { @@ -6046,8 +6065,9 @@ function emit(instance, event, ...rawArgs) { ); } } +const mixinEmitsCache = /* @__PURE__ */ new WeakMap(); function normalizeEmitsOptions(comp, appContext, asMixin = false) { - const cache = appContext.emitsCache; + const cache = asMixin ? mixinEmitsCache : appContext.emitsCache; const cached = cache.get(comp); if (cached !== void 0) { return cached; @@ -7083,7 +7103,7 @@ function getComponentPublicInstance(instance) { return instance.proxy; } } -const classifyRE = /(?:^|[-_])(\w)/g; +const classifyRE = /(?:^|[-_])\w/g; const classify = (str) => str.replace(classifyRE, (c) => c.toUpperCase()).replace(/[-_]/g, ""); function getComponentName(Component, includeInferred = true) { return isFunction(Component) ? Component.displayName || Component.name : Component.name || includeInferred && Component.__name; @@ -7125,7 +7145,7 @@ const computed = (getterOrOptions, debugOptions) => { return c; }; -const version = "3.5.18"; +const version = "3.5.22"; const warn = warn$1 ; const _ssrUtils = { createComponentInstance: createComponentInstance$1, @@ -7243,7 +7263,7 @@ const vShowHidden = Symbol("_vsh"); const CSS_VAR_TEXT = Symbol("CSS_VAR_TEXT" ); -const displayRE = /(^|;)\s*display\s*:/; +const displayRE = /(?:^|;)\s*display\s*:/; function patchStyle(el, prev, next) { const style = el.style; const isCssString = isString(next); @@ -7598,7 +7618,7 @@ let renderer; function ensureRenderer() { return renderer || (renderer = createRenderer(rendererOptions)); } -const createApp = (...args) => { +const createApp = ((...args) => { const app = ensureRenderer().createApp(...args); { injectNativeTagCheck(app); @@ -7623,7 +7643,7 @@ const createApp = (...args) => { return proxy; }; return app; -}; +}); function resolveRootNamespace(container) { if (container instanceof SVGElement) { return "svg"; diff --git a/node_modules/@vue/server-renderer/dist/server-renderer.esm-browser.prod.js b/node_modules/@vue/server-renderer/dist/server-renderer.esm-browser.prod.js index 31b0b181..a9b86e92 100644 --- a/node_modules/@vue/server-renderer/dist/server-renderer.esm-browser.prod.js +++ b/node_modules/@vue/server-renderer/dist/server-renderer.esm-browser.prod.js @@ -1,5 +1,5 @@ /** -* @vue/server-renderer v3.5.18 +* @vue/server-renderer v3.5.22 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/let e,t,n,l,r,i,s,o,a,u;function c(e){let t=Object.create(null);for(let n of e.split(","))t[n]=1;return e=>e in t}let f={},p=[],d=()=>{},h=()=>!1,g=e=>111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&(e.charCodeAt(2)>122||97>e.charCodeAt(2)),m=e=>e.startsWith("onUpdate:"),_=Object.assign,y=(e,t)=>{let n=e.indexOf(t);n>-1&&e.splice(n,1)},b=Object.prototype.hasOwnProperty,x=(e,t)=>b.call(e,t),S=Array.isArray,w=e=>"[object Map]"===A(e),k=e=>"[object Set]"===A(e),C=e=>"[object Date]"===A(e),T=e=>"function"==typeof e,O=e=>"string"==typeof e,R=e=>"symbol"==typeof e,P=e=>null!==e&&"object"==typeof e,E=e=>(P(e)||T(e))&&T(e.then)&&T(e.catch),M=Object.prototype.toString,A=e=>M.call(e),$=e=>"[object Object]"===A(e),j=e=>O(e)&&"NaN"!==e&&"-"!==e[0]&&""+parseInt(e,10)===e,D=c(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),I=e=>{let t=Object.create(null);return n=>t[n]||(t[n]=e(n))},N=/-(\w)/g,F=I(e=>e.replace(N,(e,t)=>t?t.toUpperCase():"")),L=/\B([A-Z])/g,V=I(e=>e.replace(L,"-$1").toLowerCase()),W=I(e=>e.charAt(0).toUpperCase()+e.slice(1)),U=I(e=>e?`on${W(e)}`:""),B=(e,t)=>!Object.is(e,t),H=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:l,value:n})},G=e=>{let t=parseFloat(e);return isNaN(t)?e:t},z=()=>e||(e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{});function K(e){if(S(e)){let t={};for(let n=0;n{if(e){let n=e.split(Z);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}(l):K(l);if(r)for(let e in r)t[e]=r[e]}return t}if(O(e)||P(e))return e}let J=/;(?![^(]*\))/g,Z=/:([^]+)/,X=/\/\*[^]*?\*\//g;function Q(e){let t="";if(O(e))t=e;else if(S(e))for(let n=0;n/="'\u0009\u000a\u000c\u0020]/,es={},eo={acceptCharset:"accept-charset",className:"class",htmlFor:"for",httpEquiv:"http-equiv"};function ea(e){if(null==e)return!1;let t=typeof e;return"string"===t||"number"===t||"boolean"===t}let eu=/["'&<>]/;function ec(e){let t,n,l=""+e,r=eu.exec(l);if(!r)return l;let i="",s=0;for(n=r.index;n||--!>|ep(e,t))}let eh=e=>!!(e&&!0===e.__v_isRef),ev=e=>O(e)?e:null==e?"":S(e)||P(e)&&(e.toString===M||!T(e.toString))?eh(e)?ev(e.value):JSON.stringify(e,eg,2):String(e),eg=(e,t)=>{if(eh(t))return eg(e,t.value);if(w(t))return{[`Map(${t.size})`]:[...t.entries()].reduce((e,[t,n],l)=>(e[em(t,l)+" =>"]=n,e),{})};if(k(t))return{[`Set(${t.size})`]:[...t.values()].map(e=>em(e))};if(R(t))return em(t);if(P(t)&&!S(t)&&!$(t))return String(t);return t},em=(e,t="")=>{var n;return R(e)?`Symbol(${null!=(n=e.description)?n:t})`:e};class e_{constructor(e=!1){this.detached=e,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=t,!e&&t&&(this.index=(t.scopes||(t.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){let e,t;if(this._isPaused=!0,this.scopes)for(e=0,t=this.scopes.length;e0&&0==--this._on&&(t=this.prevScope,this.prevScope=void 0)}stop(e){if(this._active){let t,n;for(t=0,this._active=!1,n=this.effects.length;t0)){if(r){let e=r;for(r=void 0;e;){let t=e.next;e.next=void 0,e.flags&=-9,e=t}}for(;l;){let t=l;for(l=void 0;t;){let n=t.next;if(t.next=void 0,t.flags&=-9,1&t.flags)try{t.trigger()}catch(t){e||(e=t)}t=n}}if(e)throw e}}function ek(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function eC(e){let t,n=e.depsTail,l=n;for(;l;){let e=l.prevDep;-1===l.version?(l===n&&(n=e),eR(l),function(e){let{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}(l)):t=l,l.dep.activeLink=l.prevActiveLink,l.prevActiveLink=void 0,l=e}e.deps=t,e.depsTail=n}function eT(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(eO(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function eO(e){if(4&e.flags&&!(16&e.flags)||(e.flags&=-17,e.globalVersion===ej)||(e.globalVersion=ej,!e.isSSR&&128&e.flags&&(!e.deps&&!e._dirty||!eT(e))))return;e.flags|=2;let t=e.dep,l=n,r=eP;n=e,eP=!0;try{ek(e);let n=e.fn(e._value);(0===t.version||B(n,e._value))&&(e.flags|=128,e._value=n,t.version++)}catch(e){throw t.version++,e}finally{n=l,eP=r,eC(e),e.flags&=-3}}function eR(e,t=!1){let{dep:n,prevSub:l,nextSub:r}=e;if(l&&(l.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=l,e.nextSub=void 0),n.subs===e&&(n.subs=l,!l&&n.computed)){n.computed.flags&=-5;for(let e=n.computed.deps;e;e=e.nextDep)eR(e,!0)}t||--n.sc||!n.map||n.map.delete(n.key)}let eP=!0,eE=[];function eM(){eE.push(eP),eP=!1}function eA(){let e=eE.pop();eP=void 0===e||e}function e$(e){let{cleanup:t}=e;if(e.cleanup=void 0,t){let e=n;n=void 0;try{t()}finally{n=e}}}let ej=0;class eD{constructor(e,t){this.sub=e,this.dep=t,this.version=t.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class eI{constructor(e){this.computed=e,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(e){if(!n||!eP||n===this.computed)return;let t=this.activeLink;if(void 0===t||t.sub!==n)t=this.activeLink=new eD(n,this),n.deps?(t.prevDep=n.depsTail,n.depsTail.nextDep=t,n.depsTail=t):n.deps=n.depsTail=t,function e(t){if(t.dep.sc++,4&t.sub.flags){let n=t.dep.computed;if(n&&!t.dep.subs){n.flags|=20;for(let t=n.deps;t;t=t.nextDep)e(t)}let l=t.dep.subs;l!==t&&(t.prevSub=l,l&&(l.nextSub=t)),t.dep.subs=t}}(t);else if(-1===t.version&&(t.version=this.version,t.nextDep)){let e=t.nextDep;e.prevDep=t.prevDep,t.prevDep&&(t.prevDep.nextDep=e),t.prevDep=n.depsTail,t.nextDep=void 0,n.depsTail.nextDep=t,n.depsTail=t,n.deps===t&&(n.deps=e)}return t}trigger(e){this.version++,ej++,this.notify(e)}notify(e){ex++;try{for(let e=this.subs;e;e=e.prevSub)e.sub.notify()&&e.sub.dep.notify()}finally{ew()}}}let eN=new WeakMap,eF=Symbol(""),eL=Symbol(""),eV=Symbol("");function eW(e,t,l){if(eP&&n){let t=eN.get(e);t||eN.set(e,t=new Map);let n=t.get(l);n||(t.set(l,n=new eI),n.map=t,n.key=l),n.track()}}function eU(e,t,n,l,r,i){let s=eN.get(e);if(!s)return void ej++;let o=e=>{e&&e.trigger()};if(ex++,"clear"===t)s.forEach(o);else{let r=S(e),i=r&&j(n);if(r&&"length"===n){let e=Number(l);s.forEach((t,n)=>{("length"===n||n===eV||!R(n)&&n>=e)&&o(t)})}else switch((void 0!==n||s.has(void 0))&&o(s.get(n)),i&&o(s.get(eV)),t){case"add":r?i&&o(s.get("length")):(o(s.get(eF)),w(e)&&o(s.get(eL)));break;case"delete":!r&&(o(s.get(eF)),w(e)&&o(s.get(eL)));break;case"set":w(e)&&o(s.get(eF))}}ew()}function eB(e){let t=th(e);return t===e?t:(eW(t,"iterate",eV),tp(e)?t:t.map(tv))}function eH(e){return eW(e=th(e),"iterate",eV),e}let eq={__proto__:null,[Symbol.iterator](){return eG(this,Symbol.iterator,tv)},concat(...e){return eB(this).concat(...e.map(e=>S(e)?eB(e):e))},entries(){return eG(this,"entries",e=>(e[1]=tv(e[1]),e))},every(e,t){return eK(this,"every",e,t,void 0,arguments)},filter(e,t){return eK(this,"filter",e,t,e=>e.map(tv),arguments)},find(e,t){return eK(this,"find",e,t,tv,arguments)},findIndex(e,t){return eK(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return eK(this,"findLast",e,t,tv,arguments)},findLastIndex(e,t){return eK(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return eK(this,"forEach",e,t,void 0,arguments)},includes(...e){return eZ(this,"includes",e)},indexOf(...e){return eZ(this,"indexOf",e)},join(e){return eB(this).join(e)},lastIndexOf(...e){return eZ(this,"lastIndexOf",e)},map(e,t){return eK(this,"map",e,t,void 0,arguments)},pop(){return eX(this,"pop")},push(...e){return eX(this,"push",e)},reduce(e,...t){return eJ(this,"reduce",e,t)},reduceRight(e,...t){return eJ(this,"reduceRight",e,t)},shift(){return eX(this,"shift")},some(e,t){return eK(this,"some",e,t,void 0,arguments)},splice(...e){return eX(this,"splice",e)},toReversed(){return eB(this).toReversed()},toSorted(e){return eB(this).toSorted(e)},toSpliced(...e){return eB(this).toSpliced(...e)},unshift(...e){return eX(this,"unshift",e)},values(){return eG(this,"values",tv)}};function eG(e,t,n){let l=eH(e),r=l[t]();return l===e||tp(e)||(r._next=r.next,r.next=()=>{let e=r._next();return e.value&&(e.value=n(e.value)),e}),r}let ez=Array.prototype;function eK(e,t,n,l,r,i){let s=eH(e),o=s!==e&&!tp(e),a=s[t];if(a!==ez[t]){let t=a.apply(e,i);return o?tv(t):t}let u=n;s!==e&&(o?u=function(t,l){return n.call(this,tv(t),l,e)}:n.length>2&&(u=function(t,l){return n.call(this,t,l,e)}));let c=a.call(s,u,l);return o&&r?r(c):c}function eJ(e,t,n,l){let r=eH(e),i=n;return r!==e&&(tp(e)?n.length>3&&(i=function(t,l,r){return n.call(this,t,l,r,e)}):i=function(t,l,r){return n.call(this,t,tv(l),r,e)}),r[t](i,...l)}function eZ(e,t,n){let l=th(e);eW(l,"iterate",eV);let r=l[t](...n);return(-1===r||!1===r)&&td(n[0])?(n[0]=th(n[0]),l[t](...n)):r}function eX(e,t,n=[]){eM(),ex++;let l=th(e)[t].apply(e,n);return ew(),eA(),l}let eQ=c("__proto__,__v_isRef,__isVue"),eY=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>"arguments"!==e&&"caller"!==e).map(e=>Symbol[e]).filter(R));function e0(e){R(e)||(e=String(e));let t=th(this);return eW(t,"has",e),t.hasOwnProperty(e)}class e1{constructor(e=!1,t=!1){this._isReadonly=e,this._isShallow=t}get(e,t,n){if("__v_skip"===t)return e.__v_skip;let l=this._isReadonly,r=this._isShallow;if("__v_isReactive"===t)return!l;if("__v_isReadonly"===t)return l;if("__v_isShallow"===t)return r;if("__v_raw"===t)return n===(l?r?ts:ti:r?tr:tl).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;let i=S(e);if(!l){let e;if(i&&(e=eq[t]))return e;if("hasOwnProperty"===t)return e0}let s=Reflect.get(e,t,tm(e)?e:n);return(R(t)?eY.has(t):eQ(t))||(l||eW(e,"get",t),r)?s:tm(s)?i&&j(t)?s:s.value:P(s)?l?ta(s):to(s):s}}class e2 extends e1{constructor(e=!1){super(!1,e)}set(e,t,n,l){let r=e[t];if(!this._isShallow){let t=tf(r);if(tp(n)||tf(n)||(r=th(r),n=th(n)),!S(e)&&tm(r)&&!tm(n))if(t)return!1;else return r.value=n,!0}let i=S(e)&&j(t)?Number(t)e,e5=e=>Reflect.getPrototypeOf(e);function e9(e){return function(){return"delete"!==e&&("clear"===e?void 0:this)}}function e7(e,t){let n=function(e,t){let n={get(n){let l=this.__v_raw,r=th(l),i=th(n);e||(B(n,i)&&eW(r,"get",n),eW(r,"get",i));let{has:s}=e5(r),o=t?e3:e?tg:tv;return s.call(r,n)?o(l.get(n)):s.call(r,i)?o(l.get(i)):void(l!==r&&l.get(n))},get size(){let t=this.__v_raw;return e||eW(th(t),"iterate",eF),Reflect.get(t,"size",t)},has(t){let n=this.__v_raw,l=th(n),r=th(t);return e||(B(t,r)&&eW(l,"has",t),eW(l,"has",r)),t===r?n.has(t):n.has(t)||n.has(r)},forEach(n,l){let r=this,i=r.__v_raw,s=th(i),o=t?e3:e?tg:tv;return e||eW(s,"iterate",eF),i.forEach((e,t)=>n.call(l,o(e),o(t),r))}};return _(n,e?{add:e9("add"),set:e9("set"),delete:e9("delete"),clear:e9("clear")}:{add(e){t||tp(e)||tf(e)||(e=th(e));let n=th(this);return e5(n).has.call(n,e)||(n.add(e),eU(n,"add",e,e)),this},set(e,n){t||tp(n)||tf(n)||(n=th(n));let l=th(this),{has:r,get:i}=e5(l),s=r.call(l,e);s||(e=th(e),s=r.call(l,e));let o=i.call(l,e);return l.set(e,n),s?B(n,o)&&eU(l,"set",e,n):eU(l,"add",e,n),this},delete(e){let t=th(this),{has:n,get:l}=e5(t),r=n.call(t,e);r||(e=th(e),r=n.call(t,e)),l&&l.call(t,e);let i=t.delete(e);return r&&eU(t,"delete",e,void 0),i},clear(){let e=th(this),t=0!==e.size,n=e.clear();return t&&eU(e,"clear",void 0,void 0),n}}),["keys","values","entries",Symbol.iterator].forEach(l=>{n[l]=function(...n){let r=this.__v_raw,i=th(r),s=w(i),o="entries"===l||l===Symbol.iterator&&s,a=r[l](...n),u=t?e3:e?tg:tv;return e||eW(i,"iterate","keys"===l&&s?eL:eF),{next(){let{value:e,done:t}=a.next();return t?{value:e,done:t}:{value:o?[u(e[0]),u(e[1])]:u(e),done:t}},[Symbol.iterator](){return this}}}}),n}(e,t);return(t,l,r)=>"__v_isReactive"===l?!e:"__v_isReadonly"===l?e:"__v_raw"===l?t:Reflect.get(x(n,l)&&l in t?n:t,l,r)}let te={get:e7(!1,!1)},tt={get:e7(!1,!0)},tn={get:e7(!0,!1)},tl=new WeakMap,tr=new WeakMap,ti=new WeakMap,ts=new WeakMap;function to(e){return tf(e)?e:tu(e,!1,e6,te,tl)}function ta(e){return tu(e,!0,e8,tn,ti)}function tu(e,t,n,l,r){var i;if(!P(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;let s=(i=e).__v_skip||!Object.isExtensible(i)?0:function(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}(A(i).slice(8,-1));if(0===s)return e;let o=r.get(e);if(o)return o;let a=new Proxy(e,2===s?l:n);return r.set(e,a),a}function tc(e){return tf(e)?tc(e.__v_raw):!!(e&&e.__v_isReactive)}function tf(e){return!!(e&&e.__v_isReadonly)}function tp(e){return!!(e&&e.__v_isShallow)}function td(e){return!!e&&!!e.__v_raw}function th(e){let t=e&&e.__v_raw;return t?th(t):e}let tv=e=>P(e)?to(e):e,tg=e=>P(e)?ta(e):e;function tm(e){return!!e&&!0===e.__v_isRef}let t_={get:(e,t,n)=>{var l;return"__v_raw"===t?e:tm(l=Reflect.get(e,t,n))?l.value:l},set:(e,t,n,l)=>{let r=e[t];return tm(r)&&!tm(n)?(r.value=n,!0):Reflect.set(e,t,n,l)}};function ty(e){return tc(e)?e:new Proxy(e,t_)}class tb{constructor(e,t,n){this.fn=e,this.setter=t,this._value=void 0,this.dep=new eI(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=ej-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!t,this.isSSR=n}notify(){if(this.flags|=16,!(8&this.flags)&&n!==this)return eS(this,!0),!0}get value(){let e=this.dep.track();return eO(this),e&&(e.version=this.dep.version),this._value}set value(e){this.setter&&this.setter(e)}}let tx={},tS=new WeakMap;function tw(e,t=1/0,n){if(t<=0||!P(e)||e.__v_skip||(n=n||new Set).has(e))return e;if(n.add(e),t--,tm(e))tw(e.value,t,n);else if(S(e))for(let l=0;l{tw(e,t,n)});else if($(e)){for(let l in e)tw(e[l],t,n);for(let l of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,l)&&tw(e[l],t,n)}return e}function tk(e,t,n,l){try{return l?e(...l):e()}catch(e){tT(e,t,n)}}function tC(e,t,n,l){if(T(e)){let r=tk(e,t,n,l);return r&&E(r)&&r.catch(e=>{tT(e,t,n)}),r}if(S(e)){let r=[];for(let i=0;i=tL(n)?tO.push(e):tO.splice(function(e){let t=tR+1,n=tO.length;for(;t>>1,r=tO[l],i=tL(r);itL(e)-tL(t));if(tP.length=0,tE)return void tE.push(...e);for(tM=0,tE=e;tMnull==e.id?2&e.flags?-1:1/0:e.id,tV=null,tW=null;function tU(e){let t=tV;return tV=e,tW=e&&e.type.__scopeId||null,t}function tB(e,t,n,l){let r=e.dirs,i=t&&t.dirs;for(let s=0;stz(e,t&&(S(t)?t[i]:t),n,l,r));if(tK(l)&&!r){512&l.shapeFlag&&l.type.__asyncResolved&&l.component.subTree.component&&tz(e,t,n,l.component.subTree);return}let i=4&l.shapeFlag?lh(l.component):l.el,s=r?null:i,{i:o,r:a}=e,u=t&&t.r,c=o.refs===f?o.refs={}:o.refs,p=o.setupState,d=th(p),h=p===f?()=>!1:e=>x(d,e);if(null!=u&&u!==a&&(O(u)?(c[u]=null,h(u)&&(p[u]=null)):tm(u)&&(u.value=null)),T(a))tk(a,o,12,[s,c]);else{let t=O(a),l=tm(a);if(t||l){let o=()=>{if(e.f){let n=t?h(a)?p[a]:c[a]:a.value;r?S(n)&&y(n,i):S(n)?n.includes(i)||n.push(i):t?(c[a]=[i],h(a)&&(p[a]=c[a])):(a.value=[i],e.k&&(c[e.k]=a.value))}else t?(c[a]=s,h(a)&&(p[a]=s)):l&&(a.value=s,e.k&&(c[e.k]=s))};s?(o.id=-1,nj(o,n)):o()}}}let tK=e=>!!e.type.__asyncLoader,tJ=e=>e.type.__isKeepAlive;function tZ(e,t){tQ(e,"a",t)}function tX(e,t){tQ(e,"da",t)}function tQ(e,t,n=lr){let l=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()});if(tY(t,l,n),n){let e=n.parent;for(;e&&e.parent;)tJ(e.parent.vnode)&&function(e,t,n,l){let r=tY(t,e,l,!0);t3(()=>{y(l[t],r)},n)}(l,t,n,e),e=e.parent}}function tY(e,t,n=lr,l=!1){if(n){let r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...l)=>{eM();let r=ls(n),i=tC(t,n,e,l);return r(),eA(),i});return l?r.unshift(i):r.push(i),i}}let t0=e=>(t,n=lr)=>{lu&&"sp"!==e||tY(e,(...e)=>t(...e),n)},t1=t0("bm"),t2=t0("m"),t6=t0("bu"),t8=t0("u"),t4=t0("bum"),t3=t0("um"),t5=t0("sp"),t9=t0("rtg"),t7=t0("rtc");function ne(e,t=lr){tY("ec",e,t)}let nt=Symbol.for("v-ndc"),nn=e=>e?la(e)?lh(e):nn(e.parent):null,nl=_(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>nn(e.parent),$root:e=>nn(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>nu(e),$forceUpdate:e=>e.f||(e.f=()=>{tD(e.update)}),$nextTick:e=>e.n||(e.n=tj.bind(e.proxy)),$watch:e=>nV.bind(e)}),nr=(e,t)=>e!==f&&!e.__isScriptSetup&&x(e,t),ni={get({_:e},t){let n,l,r;if("__v_skip"===t)return!0;let{ctx:i,setupState:s,data:o,props:a,accessCache:u,type:c,appContext:p}=e;if("$"!==t[0]){let l=u[t];if(void 0!==l)switch(l){case 1:return s[t];case 2:return o[t];case 4:return i[t];case 3:return a[t]}else{if(nr(s,t))return u[t]=1,s[t];if(o!==f&&x(o,t))return u[t]=2,o[t];if((n=e.propsOptions[0])&&x(n,t))return u[t]=3,a[t];if(i!==f&&x(i,t))return u[t]=4,i[t];no&&(u[t]=0)}}let d=nl[t];return d?("$attrs"===t&&eW(e.attrs,"get",""),d(e)):(l=c.__cssModules)&&(l=l[t])?l:i!==f&&x(i,t)?(u[t]=4,i[t]):x(r=p.config.globalProperties,t)?r[t]:void 0},set({_:e},t,n){let{data:l,setupState:r,ctx:i}=e;return nr(r,t)?(r[t]=n,!0):l!==f&&x(l,t)?(l[t]=n,!0):!x(e.props,t)&&!("$"===t[0]&&t.slice(1)in e)&&(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:l,appContext:r,propsOptions:i}},s){let o;return!!n[s]||e!==f&&x(e,s)||nr(t,s)||(o=i[0])&&x(o,s)||x(l,s)||x(nl,s)||x(r.config.globalProperties,s)},defineProperty(e,t,n){return null!=n.get?e._.accessCache[t]=0:x(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function ns(e){return S(e)?e.reduce((e,t)=>(e[t]=null,e),{}):e}let no=!0;function na(e,t,n){tC(S(e)?e.map(e=>e.bind(t.proxy)):e.bind(t.proxy),t,n)}function nu(e){let t,n=e.type,{mixins:l,extends:r}=n,{mixins:i,optionsCache:s,config:{optionMergeStrategies:o}}=e.appContext,a=s.get(n);return a?t=a:i.length||l||r?(t={},i.length&&i.forEach(e=>nc(t,e,o,!0)),nc(t,n,o)):t=n,P(n)&&s.set(n,t),t}function nc(e,t,n,l=!1){let{mixins:r,extends:i}=t;for(let s in i&&nc(e,i,n,!0),r&&r.forEach(t=>nc(e,t,n,!0)),t)if(l&&"expose"===s);else{let l=nf[s]||n&&n[s];e[s]=l?l(e[s],t[s]):t[s]}return e}let nf={data:np,props:ng,emits:ng,methods:nv,computed:nv,beforeCreate:nh,created:nh,beforeMount:nh,mounted:nh,beforeUpdate:nh,updated:nh,beforeDestroy:nh,beforeUnmount:nh,destroyed:nh,unmounted:nh,activated:nh,deactivated:nh,errorCaptured:nh,serverPrefetch:nh,components:nv,directives:nv,watch:function(e,t){if(!e)return t;if(!t)return e;let n=_(Object.create(null),e);for(let l in t)n[l]=nh(e[l],t[l]);return n},provide:np,inject:function(e,t){return nv(nd(e),nd(t))}};function np(e,t){return t?e?function(){return _(T(e)?e.call(this,this):e,T(t)?t.call(this,this):t)}:t:e}function nd(e){if(S(e)){let t={};for(let n=0;n1)return n&&T(t)?t.call(l&&l.proxy):t}}let nx={},nS=()=>Object.create(nx),nw=e=>Object.getPrototypeOf(e)===nx;function nk(e,t,n,l){let r,[i,s]=e.propsOptions,o=!1;if(t)for(let a in t){let u;if(D(a))continue;let c=t[a];i&&x(i,u=F(a))?s&&s.includes(u)?(r||(r={}))[u]=c:n[u]=c:nB(e.emitsOptions,a)||a in l&&c===l[a]||(l[a]=c,o=!0)}if(s){let t=th(n),l=r||f;for(let r=0;r"_"===e||"__"===e||"_ctx"===e||"$stable"===e,nP=e=>S(e)?e.map(n3):[n3(e)],nE=(e,t,n)=>{if(t._n)return t;let l=function(e,t=tV,n){if(!t||e._n)return e;let l=(...n)=>{let r;l._d&&nY(-1);let i=tU(t);try{r=e(...n)}finally{tU(i),l._d&&nY(1)}return r};return l._n=!0,l._c=!0,l._d=!0,l}((...e)=>nP(t(...e)),n);return l._c=!1,l},nM=(e,t,n)=>{let l=e._ctx;for(let n in e){if(nR(n))continue;let r=e[n];if(T(r))t[n]=nE(n,r,l);else if(null!=r){let e=nP(r);t[n]=()=>e}}},nA=(e,t)=>{let n=nP(t);e.slots.default=()=>n},n$=(e,t,n)=>{for(let l in t)(n||!nR(l))&&(e[l]=t[l])},nj=function(e,t){if(t&&t.pendingBranch)S(e)?t.effects.push(...e):t.effects.push(e);else S(e)?tP.push(...e):tE&&-1===e.id?tE.splice(tM+1,0,e):1&e.flags||(tP.push(e),e.flags|=1),tI()};function nD({type:e,props:t},n){return"svg"===n&&"foreignObject"===e||"mathml"===n&&"annotation-xml"===e&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function nI({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function nN(e){if(e)for(let t=0;t{};return e.stop=d,e.resume=d,e.pause=d,e}}let h=lr;c.call=(e,t,n)=>tC(e,h,t,n);let g=!1;"post"===o?c.scheduler=e=>{nj(e,h&&h.suspense)}:"sync"!==o&&(g=!0,c.scheduler=(e,t)=>{t?e():tD(e)}),c.augmentJob=e=>{n&&(e.flags|=4),g&&(e.flags|=2,h&&(e.id=h.uid,e.i=h))};let m=function(e,n,l=f){let r,i,s,o,{immediate:u,deep:c,once:p,scheduler:h,augmentJob:g,call:m}=l,_=e=>c?e:tp(e)||!1===c||0===c?tw(e,1):tw(e),b=!1,x=!1;if(tm(e)?(i=()=>e.value,b=tp(e)):tc(e)?(i=()=>_(e),b=!0):S(e)?(x=!0,b=e.some(e=>tc(e)||tp(e)),i=()=>e.map(e=>tm(e)?e.value:tc(e)?_(e):T(e)?m?m(e,2):e():void 0)):i=T(e)?n?m?()=>m(e,2):e:()=>{if(s){eM();try{s()}finally{eA()}}let t=a;a=r;try{return m?m(e,3,[o]):e(o)}finally{a=t}}:d,n&&c){let e=i,t=!0===c?1/0:c;i=()=>tw(e(),t)}let w=t,k=()=>{r.stop(),w&&w.active&&y(w.effects,r)};if(p&&n){let e=n;n=(...t)=>{e(...t),k()}}let C=x?Array(e.length).fill(tx):tx,O=e=>{if(1&r.flags&&(r.dirty||e))if(n){let e=r.run();if(c||b||(x?e.some((e,t)=>B(e,C[t])):B(e,C))){s&&s();let t=a;a=r;try{let t=[e,C===tx?void 0:x&&C[0]===tx?[]:C,o];C=e,m?m(n,3,t):n(...t)}finally{a=t}}}else r.run()};return g&&g(O),(r=new eb(i)).scheduler=h?()=>h(O,!1):O,o=e=>(function(e,t=!1,n=a){if(n){let t=tS.get(n);t||tS.set(n,t=[]),t.push(e)}})(e,!1,r),s=r.onStop=()=>{let e=tS.get(r);if(e){if(m)m(e,4);else for(let t of e)t();tS.delete(r)}},n?u?O(!0):C=r.run():h?h(O.bind(null,!0),!0):r.run(),k.pause=r.pause.bind(r),k.resume=r.resume.bind(r),k.stop=k,k}(e,n,c);return lu&&(r?r.push(m):p&&m()),m}function nV(e,t,n){let l,r=this.proxy,i=O(e)?e.includes(".")?nW(r,e):()=>r[e]:e.bind(r,r);T(t)?l=t:(l=t.handler,n=t);let s=ls(this),o=nL(i,l.bind(r),n);return s(),o}function nW(e,t){let n=t.split(".");return()=>{let t=e;for(let e=0;eO(e)?e.trim():e)),a.number&&(s=n.map(G)));let u=i[l=U(t)]||i[l=U(F(t))];!u&&o&&(u=i[l=U(V(t))]),u&&tC(u,e,6,s);let c=i[l+"Once"];if(c){if(e.emitted){if(e.emitted[l])return}else e.emitted={};e.emitted[l]=!0,tC(c,e,6,s)}}function nB(e,t){return!!e&&!!g(t)&&(x(e,(t=t.slice(2).replace(/Once$/,""))[0].toLowerCase()+t.slice(1))||x(e,V(t))||x(e,t))}function nH(e){let t,n,{type:l,vnode:r,proxy:i,withProxy:s,propsOptions:[o],slots:a,attrs:u,emit:c,render:f,renderCache:p,props:d,data:h,setupState:g,ctx:_,inheritAttrs:y}=e,b=tU(e);try{if(4&r.shapeFlag){let e=s||i;t=n3(f.call(e,e,p,d,g,h,_)),n=u}else t=n3(l.length>1?l(d,{attrs:u,slots:a,emit:c}):l(d,null)),n=l.props?u:nq(u)}catch(n){tT(n,e,1),t=n8(nZ)}let x=t;if(n&&!1!==y){let e=Object.keys(n),{shapeFlag:t}=x;e.length&&7&t&&(o&&e.some(m)&&(n=nG(n,o)),x=n4(x,n,!1,!0))}return r.dirs&&((x=n4(x,null,!1,!0)).dirs=x.dirs?x.dirs.concat(r.dirs):r.dirs),r.transition&&tq(x,r.transition),t=x,tU(b),t}let nq=e=>{let t;for(let n in e)("class"===n||"style"===n||g(n))&&((t||(t={}))[n]=e[n]);return t},nG=(e,t)=>{let n={};for(let l in e)m(l)&&l.slice(9)in t||(n[l]=e[l]);return n};function nz(e,t,n){let l=Object.keys(t);if(l.length!==Object.keys(e).length)return!0;for(let r=0;rnull!=e?e:null,n6=({ref:e,ref_key:t,ref_for:n})=>("number"==typeof e&&(e=""+e),null!=e?O(e)||tm(e)||T(e)?{i:tV,r:e,k:t,f:!!n}:e:null),n8=function(e,t=null,n=null,l=0,r=null,i=!1){var s,o;if(e&&e!==nt||(e=nZ),n0(e)){let l=n4(e,t,!0);return n&&n9(l,n),nQ>0,l.patchFlag=-2,l}if(T(s=e)&&"__vccOpts"in s&&(e=e.__vccOpts),t){let{class:e,style:n}=t=(o=t)?td(o)||nw(o)?_({},o):o:null;e&&!O(e)&&(t.class=Q(e)),P(n)&&(td(n)&&!S(n)&&(n=_({},n)),t.style=K(n))}let a=O(e)?1:e.__isSuspense?128:e.__isTeleport?64:P(e)?4:2*!!T(e);return function(e,t=null,n=null,l=0,r=null,i=+(e!==nK),s=!1,o=!1){let a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&n2(t),ref:t&&n6(t),scopeId:tW,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:l,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:tV};return o?(n9(a,n),128&i&&e.normalize(a)):n&&(a.shapeFlag|=O(n)?8:16),nQ>0,a}(e,t,n,l,r,a,i,!0)};function n4(e,t,n=!1,l=!1){let{props:r,ref:i,patchFlag:s,children:o,transition:a}=e,u=t?n7(r||{},t):r,c={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&n2(u),ref:t&&t.ref?n&&i?S(i)?i.concat(n6(t)):[i,n6(t)]:n6(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==nK?-1===s?16:16|s:s,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:a,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&n4(e.ssContent),ssFallback:e.ssFallback&&n4(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return a&&l&&tq(c,a.clone(c)),c}function n3(e){return null==e||"boolean"==typeof e?n8(nZ):S(e)?n8(nK,null,e.slice()):n0(e)?n5(e):n8(nJ,null,String(e))}function n5(e){return null===e.el&&-1!==e.patchFlag||e.memo?e:n4(e)}function n9(e,t){let n=0,{shapeFlag:l}=e;if(null==t)t=null;else if(S(t))n=16;else if("object"==typeof t)if(65&l){let n=t.default;n&&(n._c&&(n._d=!1),n9(e,n()),n._c&&(n._d=!0));return}else{n=32;let l=t._;l||nw(t)?3===l&&tV&&(1===tV.slots._?t._=1:(t._=2,e.patchFlag|=1024)):t._ctx=tV}else T(t)?(t={default:t,_ctx:tV},n=32):(t=String(t),64&l?(n=16,t=[function(e=" ",t=0){return n8(nJ,null,e,t)}(t)]):n=8);e.children=t,e.shapeFlag|=n}function n7(...e){let t={};for(let n=0;n{u=!0;let[l,r]=e(t,n,!0);_(o,l),r&&a.push(...r)};!l&&n.mixins.length&&n.mixins.forEach(r),t.extends&&r(t.extends),t.mixins&&t.mixins.forEach(r)}if(!s&&!u)return P(t)&&r.set(t,p),p;if(S(s))for(let e=0;e{let l=e(t,n,!0);l&&(a=!0,_(o,l))};!l&&n.mixins.length&&n.mixins.forEach(r),t.extends&&r(t.extends),t.mixins&&t.mixins.forEach(r)}return s||a?(S(s)?s.forEach(e=>o[e]=null):_(o,s),P(t)&&r.set(t,o),o):(P(t)&&r.set(t,null),null)}(l,r),emit:null,emitted:null,propsDefaults:f,inheritAttrs:l.inheritAttrs,ctx:f,data:f,props:f,attrs:f,slots:f,refs:f,setupState:f,setupContext:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return i.ctx={_:i},i.root=t?t.root:i,i.emit=nU.bind(null,i),e.ce&&e.ce(i),i}let lr=null,li=()=>lr||tV;{let e=z(),t=(t,n)=>{let l;return(l=e[t])||(l=e[t]=[]),l.push(n),e=>{l.length>1?l.forEach(t=>t(e)):l[0](e)}};i=t("__VUE_INSTANCE_SETTERS__",e=>lr=e),s=t("__VUE_SSR_SETTERS__",e=>lu=e)}let ls=e=>{let t=lr;return i(e),e.scope.on(),()=>{e.scope.off(),i(t)}},lo=()=>{lr&&lr.scope.off(),i(null)};function la(e){return 4&e.vnode.shapeFlag}let lu=!1;function lc(e,t=!1,n=!1){t&&s(t);let{props:l,children:r}=e.vnode,i=la(e);!function(e,t,n,l=!1){let r={},i=nS();for(let n in e.propsDefaults=Object.create(null),nk(e,t,r,i),e.propsOptions[0])n in r||(r[n]=void 0);n?e.props=l?r:tu(r,!1,e4,tt,tr):e.type.props?e.props=r:e.props=i,e.attrs=i}(e,l,i,t),((e,t,n)=>{let l=e.slots=nS();if(32&e.vnode.shapeFlag){let e=t.__;e&&q(l,"__",e,!0);let r=t._;r?(n$(l,t,n),n&&q(l,"_",r,!0)):nM(t,l)}else t&&nA(e,t)})(e,r,n||t);let o=i?function(e,t){let n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,ni);let{setup:l}=n;if(l){var r;eM();let n=e.setupContext=l.length>1?{attrs:new Proxy((r=e).attrs,ld),slots:r.slots,emit:r.emit,expose:e=>{r.exposed=e||{}}}:null,i=ls(e),s=tk(l,e,0,[e.props,n]),o=E(s);if(eA(),i(),(o||e.sp)&&!tK(e)&&tG(e),o){if(s.then(lo,lo),t)return s.then(t=>{lf(e,t)}).catch(t=>{tT(t,e,0)});e.asyncDep=s}else lf(e,s)}else lp(e)}(e,t):void 0;return t&&s(!1),o}function lf(e,t,n){T(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:P(t)&&(e.setupState=ty(t)),lp(e)}function lp(e,t,n){let l=e.type;e.render||(e.render=l.render||d);{let t=ls(e);eM();try{!function(e){let t=nu(e),n=e.proxy,l=e.ctx;no=!1,t.beforeCreate&&na(t.beforeCreate,e,"bc");let{data:r,computed:i,methods:s,watch:o,provide:a,inject:u,created:c,beforeMount:f,mounted:p,beforeUpdate:h,updated:g,activated:m,deactivated:_,beforeDestroy:y,beforeUnmount:b,destroyed:x,unmounted:w,render:k,renderTracked:C,renderTriggered:R,errorCaptured:E,serverPrefetch:M,expose:A,inheritAttrs:$,components:j,directives:D,filters:I}=t;if(u&&function(e,t,n=d){for(let n in S(e)&&(e=nd(e)),e){let l,r=e[n];tm(l=P(r)?"default"in r?nb(r.from||n,r.default,!0):nb(r.from||n):nb(r))?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>l.value,set:e=>l.value=e}):t[n]=l}}(u,l,null),s)for(let e in s){let t=s[e];T(t)&&(l[e]=t.bind(n))}if(r){let t=r.call(n,n);P(t)&&(e.data=to(t))}if(no=!0,i)for(let e in i){let t=i[e],r=T(t)?t.bind(n,n):T(t.get)?t.get.bind(n,n):d,s=lv({get:r,set:!T(t)&&T(t.set)?t.set.bind(n):d});Object.defineProperty(l,e,{enumerable:!0,configurable:!0,get:()=>s.value,set:e=>s.value=e})}if(o)for(let e in o)!function e(t,n,l,r){var i,s,o,a,u,c,f;let p=r.includes(".")?nW(l,r):()=>l[r];if(O(t)){let e=n[t];T(e)&&(i=p,s=e,nL(i,s,void 0))}else if(T(t)){o=p,a=t.bind(l),nL(o,a,void 0)}else if(P(t))if(S(t))t.forEach(t=>e(t,n,l,r));else{let e=T(t.handler)?t.handler.bind(l):n[t.handler];T(e)&&(u=p,c=e,f=t,nL(u,c,f))}}(o[e],l,n,e);if(a){let e=T(a)?a.call(n):a;Reflect.ownKeys(e).forEach(t=>{var n=t,l=e[t];if(lr){let e=lr.provides,t=lr.parent&&lr.parent.provides;t===e&&(e=lr.provides=Object.create(t)),e[n]=l}})}function N(e,t){S(t)?t.forEach(t=>e(t.bind(n))):t&&e(t.bind(n))}if(c&&na(c,e,"c"),N(t1,f),N(t2,p),N(t6,h),N(t8,g),N(tZ,m),N(tX,_),N(ne,E),N(t7,C),N(t9,R),N(t4,b),N(t3,w),N(t5,M),S(A))if(A.length){let t=e.exposed||(e.exposed={});A.forEach(e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t,enumerable:!0})})}else e.exposed||(e.exposed={});k&&e.render===d&&(e.render=k),null!=$&&(e.inheritAttrs=$),j&&(e.components=j),D&&(e.directives=D),M&&tG(e)}(e)}finally{eA(),t()}}}let ld={get:(e,t)=>(eW(e,"get",""),e[t])};function lh(e){var t;return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(ty((!x(t=e.exposed,"__v_skip")&&Object.isExtensible(t)&&q(t,"__v_skip",!0),t)),{get:(t,n)=>n in t?t[n]:n in nl?nl[n](e):void 0,has:(e,t)=>t in e||t in nl})):e.proxy}let lv=(e,t)=>(function(e,t,n=!1){let l,r;return T(e)?l=e:(l=e.get,r=e.set),new tb(l,r,n)})(e,0,lu),lg={createComponentInstance:ll,setupComponent:lc,renderComponentRoot:nH,setCurrentRenderingInstance:tU,isVNode:n0,normalizeVNode:n3,getComponentPublicInstance:lh,ensureValidVNode:function e(t){return t.some(t=>!n0(t)||t.type!==nZ&&(t.type!==nK||!!e(t.children)))?t:null},pushWarningContext:function(e){},popWarningContext:function(){}},lm="undefined"!=typeof window&&window.trustedTypes;if(lm)try{u=lm.createPolicy("vue",{createHTML:e=>e})}catch(e){}let l_=u?e=>u.createHTML(e):e=>e,ly="undefined"!=typeof document?document:null,lb=ly&&ly.createElement("template"),lx=Symbol("_vtc"),lS=Symbol("_vod"),lw=Symbol("_vsh"),lk=Symbol(""),lC=/(^|;)\s*display\s*:/,lT=/\s*!important$/;function lO(e,t,n){if(S(n))n.forEach(n=>lO(e,t,n));else if(null==n&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{let l=function(e,t){let n=lP[t];if(n)return n;let l=F(t);if("filter"!==l&&l in e)return lP[t]=l;l=W(l);for(let n=0;n111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&e.charCodeAt(2)>96&&123>e.charCodeAt(2),lF=_({patchProp:(e,t,n,l,r,i)=>{let s="svg"===r;if("class"===t){var o=l;let t=e[lx];t&&(o=(o?[o,...t]:[...t]).join(" ")),null==o?e.removeAttribute("class"):s?e.setAttribute("class",o):e.className=o}else"style"===t?function(e,t,n){let l=e.style,r=O(n),i=!1;if(n&&!r){if(t)if(O(t))for(let e of t.split(";")){let t=e.slice(0,e.indexOf(":")).trim();null==n[t]&&lO(l,t,"")}else for(let e in t)null==n[e]&&lO(l,e,"");for(let e in n)"display"===e&&(i=!0),lO(l,e,n[e])}else if(r){if(t!==n){let e=l[lk];e&&(n+=";"+e),l.cssText=n,i=lC.test(n)}}else t&&e.removeAttribute("style");lS in e&&(e[lS]=i?l.display:"",e[lw]&&(l.display="none"))}(e,n,l):g(t)?m(t)||function(e,t,n,l,r=null){let i=e[l$]||(e[l$]={}),s=i[t];if(l&&s)s.value=l;else{let[n,o]=function(e){let t;if(lj.test(e)){let n;for(t={};n=e.match(lj);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[":"===e[2]?e.slice(3):V(e.slice(2)),t]}(t);if(l){let s=i[t]=function(e,t){let n=e=>{if(e._vts){if(e._vts<=n.attached)return}else e._vts=Date.now();tC(function(e,t){if(!S(t))return t;{let n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(e=>t=>!t._stopped&&e&&e(t))}}(e,n.value),t,5,[e])};return n.value=e,n.attached=lD||(lI.then(()=>lD=0),lD=Date.now()),n}(l,r);e.addEventListener(n,s,o)}else s&&(e.removeEventListener(n,s,o),i[t]=void 0)}}(e,t,0,l,i):("."===t[0]?(t=t.slice(1),0):"^"===t[0]?(t=t.slice(1),1):!function(e,t,n,l){if(l)return!!("innerHTML"===t||"textContent"===t||t in e&&lN(t)&&T(n));if("spellcheck"===t||"draggable"===t||"translate"===t||"autocorrect"===t||"form"===t||"list"===t&&"INPUT"===e.tagName||"type"===t&&"TEXTAREA"===e.tagName)return!1;if("width"===t||"height"===t){let t=e.tagName;if("IMG"===t||"VIDEO"===t||"CANVAS"===t||"SOURCE"===t)return!1}return!(lN(t)&&O(n))&&t in e}(e,t,l,s))?e._isVueCE&&(/[A-Z]/.test(t)||!O(l))?lA(e,F(t),l,i,t):("true-value"===t?e._trueValue=l:"false-value"===t&&(e._falseValue=l),lM(e,t,l,s)):(lA(e,t,l),e.tagName.includes("-")||"value"!==t&&"checked"!==t&&"selected"!==t||lM(e,t,l,s,i,"value"!==t))}},{insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{let t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,l)=>{let r="svg"===t?ly.createElementNS("http://www.w3.org/2000/svg",e):"mathml"===t?ly.createElementNS("http://www.w3.org/1998/Math/MathML",e):n?ly.createElement(e,{is:n}):ly.createElement(e);return"select"===e&&l&&null!=l.multiple&&r.setAttribute("multiple",l.multiple),r},createText:e=>ly.createTextNode(e),createComment:e=>ly.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>ly.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,l,r,i){let s=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),r!==i&&(r=r.nextSibling););else{lb.innerHTML=l_("svg"===l?`${e}`:"mathml"===l?`${e}`:e);let r=lb.content;if("svg"===l||"mathml"===l){let e=r.firstChild;for(;e.firstChild;)r.appendChild(e.firstChild);r.removeChild(e)}t.insertBefore(r,n)}return[s?s.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}}),lL=(...e)=>{let t=(o||(o=function(e,t){let n;z().__VUE__=!0;let{insert:l,remove:r,patchProp:i,createElement:s,createText:o,createComment:a,setText:u,setElementText:c,parentNode:h,nextSibling:g,setScopeId:m=d,insertStaticContent:y}=e,b=(e,t,n,l=null,r=null,i=null,s,o=null,a=!!t.dynamicChildren)=>{if(e===t)return;e&&!n1(e,t)&&(l=et(e),Z(e,r,i,!0),e=null),-2===t.patchFlag&&(a=!1,t.dynamicChildren=null);let{type:u,ref:c,shapeFlag:f}=t;switch(u){case nJ:w(e,t,n,l);break;case nZ:k(e,t,n,l);break;case nX:null==e&&C(t,n,l,s);break;case nK:I(e,t,n,l,r,i,s,o,a);break;default:1&f?O(e,t,n,l,r,i,s,o,a):6&f?N(e,t,n,l,r,i,s,o,a):64&f?u.process(e,t,n,l,r,i,s,o,a,er):128&f&&u.process(e,t,n,l,r,i,s,o,a,er)}null!=c&&r?tz(c,e&&e.ref,i,t||e,!t):null==c&&e&&null!=e.ref&&tz(e.ref,null,i,e,!0)},w=(e,t,n,r)=>{if(null==e)l(t.el=o(t.children),n,r);else{let n=t.el=e.el;t.children!==e.children&&u(n,t.children)}},k=(e,t,n,r)=>{null==e?l(t.el=a(t.children||""),n,r):t.el=e.el},C=(e,t,n,l)=>{[e.el,e.anchor]=y(e.children,t,n,l,e.el,e.anchor)},O=(e,t,n,l,r,i,s,o,a)=>{"svg"===t.type?s="svg":"math"===t.type&&(s="mathml"),null==e?R(t,n,l,r,i,s,o,a):A(e,t,r,i,s,o,a)},R=(e,t,n,r,o,a,u,f)=>{var p,d;let h,g,{props:m,shapeFlag:_,transition:y,dirs:b}=e;if(h=e.el=s(e.type,a,m&&m.is,m),8&_?c(h,e.children):16&_&&M(e.children,h,null,r,o,nD(e,a),u,f),b&&tB(e,null,r,"created"),E(h,e,e.scopeId,u,r),m){for(let e in m)"value"===e||D(e)||i(h,e,null,m[e],a,r);"value"in m&&i(h,"value",null,m.value,a),(g=m.onVnodeBeforeMount)&&le(g,r,e)}b&&tB(e,null,r,"beforeMount");let x=(p=o,d=y,(!p||p&&!p.pendingBranch)&&d&&!d.persisted);x&&y.beforeEnter(h),l(h,t,n),((g=m&&m.onVnodeMounted)||x||b)&&nj(()=>{g&&le(g,r,e),x&&y.enter(h),b&&tB(e,null,r,"mounted")},o)},E=(e,t,n,l,r)=>{if(n&&m(e,n),l)for(let t=0;t{for(let u=a;u{let a,u=t.el=e.el,{patchFlag:p,dynamicChildren:d,dirs:h}=t;p|=16&e.patchFlag;let g=e.props||f,m=t.props||f;if(n&&nI(n,!1),(a=m.onVnodeBeforeUpdate)&&le(a,n,t,e),h&&tB(t,e,n,"beforeUpdate"),n&&nI(n,!0),(g.innerHTML&&null==m.innerHTML||g.textContent&&null==m.textContent)&&c(u,""),d?$(e.dynamicChildren,d,u,n,l,nD(t,r),s):o||q(e,t,u,null,n,l,nD(t,r),s,!1),p>0){if(16&p)j(u,g,m,n,r);else if(2&p&&g.class!==m.class&&i(u,"class",null,m.class,r),4&p&&i(u,"style",g.style,m.style,r),8&p){let e=t.dynamicProps;for(let t=0;t{a&&le(a,n,t,e),h&&tB(t,e,n,"updated")},l)},$=(e,t,n,l,r,i,s)=>{for(let o=0;o{if(t!==n){if(t!==f)for(let s in t)D(s)||s in n||i(e,s,t[s],null,r,l);for(let s in n){if(D(s))continue;let o=n[s],a=t[s];o!==a&&"value"!==s&&i(e,s,a,o,r,l)}"value"in n&&i(e,"value",t.value,n.value,r)}},I=(e,t,n,r,i,s,a,u,c)=>{let f=t.el=e?e.el:o(""),p=t.anchor=e?e.anchor:o(""),{patchFlag:d,dynamicChildren:h,slotScopeIds:g}=t;g&&(u=u?u.concat(g):g),null==e?(l(f,n,r),l(p,n,r),M(t.children||[],n,p,i,s,a,u,c)):d>0&&64&d&&h&&e.dynamicChildren?($(e.dynamicChildren,h,n,i,s,a,u),(null!=t.key||i&&t===i.subTree)&&function e(t,n,l=!1){let r=t.children,i=n.children;if(S(r)&&S(i))for(let t=0;t{t.slotScopeIds=o,null==e?512&t.shapeFlag?r.ctx.activate(t,n,l,s,a):L(t,n,l,r,i,s,a):W(e,t,a)},L=(e,t,n,l,r,i,s)=>{let o=e.component=ll(e,l,r);if(tJ(e)&&(o.ctx.renderer=er),lc(o,!1,s),o.asyncDep){if(r&&r.registerDep(o,U,s),!e.el){let l=o.subTree=n8(nZ);k(null,l,t,n),e.placeholder=l.el}}else U(o,e,t,n,r,i,s)},W=(e,t,n)=>{let l=t.component=e.component;if(function(e,t,n){let{props:l,children:r,component:i}=e,{props:s,children:o,patchFlag:a}=t,u=i.emitsOptions;if(t.dirs||t.transition)return!0;if(!n||!(a>=0))return(!!r||!!o)&&(!o||!o.$stable)||l!==s&&(l?!s||nz(l,s,u):!!s);if(1024&a)return!0;if(16&a)return l?nz(l,s,u):!!s;if(8&a){let e=t.dynamicProps;for(let t=0;t{let o=()=>{if(e.isMounted){let t,{next:n,bu:l,u:a,parent:u,vnode:c}=e;{let t=function e(t){let n=t.subTree.component;if(n)if(n.asyncDep&&!n.asyncResolved)return n;else return e(n)}(e);if(t){n&&(n.el=c.el,B(e,n,s)),t.asyncDep.then(()=>{e.isUnmounted||o()});return}}let f=n;nI(e,!1),n?(n.el=c.el,B(e,n,s)):n=c,l&&H(l),(t=n.props&&n.props.onVnodeBeforeUpdate)&&le(t,u,n,c),nI(e,!0);let p=nH(e),d=e.subTree;e.subTree=p,b(d,p,h(d.el),et(d),e,r,i),n.el=p.el,null===f&&function({vnode:e,parent:t},n){for(;t;){let l=t.subTree;if(l.suspense&&l.suspense.activeBranch===e&&(l.el=e.el),l===e)(e=t.vnode).el=n,t=t.parent;else break}}(e,p.el),a&&nj(a,r),(t=n.props&&n.props.onVnodeUpdated)&&nj(()=>le(t,u,n,c),r)}else{let s,{el:o,props:a}=t,{bm:u,m:c,parent:f,root:p,type:d}=e,h=tK(t);nI(e,!1),u&&H(u),!h&&(s=a&&a.onVnodeBeforeMount)&&le(s,f,t),nI(e,!0);{p.ce&&!1!==p.ce._def.shadowRoot&&p.ce._injectChildStyle(d);let s=e.subTree=nH(e);b(null,s,n,l,e,r,i),t.el=s.el}if(c&&nj(c,r),!h&&(s=a&&a.onVnodeMounted)){let e=t;nj(()=>le(s,f,e),r)}(256&t.shapeFlag||f&&tK(f.vnode)&&256&f.vnode.shapeFlag)&&e.a&&nj(e.a,r),e.isMounted=!0,t=n=l=null}};e.scope.on();let a=e.effect=new eb(o);e.scope.off();let u=e.update=a.run.bind(a),c=e.job=a.runIfDirty.bind(a);c.i=e,c.id=e.uid,a.scheduler=()=>tD(c),nI(e,!0),u()},B=(e,t,n)=>{t.component=e;let l=e.vnode.props;e.vnode=t,e.next=null,function(e,t,n,l){let{props:r,attrs:i,vnode:{patchFlag:s}}=e,o=th(r),[a]=e.propsOptions,u=!1;if((l||s>0)&&!(16&s)){if(8&s){let n=e.vnode.dynamicProps;for(let l=0;l{let{vnode:l,slots:r}=e,i=!0,s=f;if(32&l.shapeFlag){let e=t._;e?n&&1===e?i=!1:n$(r,t,n):(i=!t.$stable,nM(t,r)),s=t}else t&&(nA(e,t),s={default:1});if(i)for(let e in r)nR(e)||null!=s[e]||delete r[e]})(e,t.children,n),eM(),tN(e),eA()},q=(e,t,n,l,r,i,s,o,a=!1)=>{let u=e&&e.children,f=e?e.shapeFlag:0,p=t.children,{patchFlag:d,shapeFlag:h}=t;if(d>0){if(128&d)return void K(u,p,n,l,r,i,s,o,a);else if(256&d)return void G(u,p,n,l,r,i,s,o,a)}8&h?(16&f&&ee(u,r,i),p!==u&&c(n,p)):16&f?16&h?K(u,p,n,l,r,i,s,o,a):ee(u,r,i,!0):(8&f&&c(n,""),16&h&&M(p,n,l,r,i,s,o,a))},G=(e,t,n,l,r,i,s,o,a)=>{let u;e=e||p,t=t||p;let c=e.length,f=t.length,d=Math.min(c,f);for(u=0;uf?ee(e,r,i,!0,!1,d):M(t,n,l,r,i,s,o,a,d)},K=(e,t,n,l,r,i,s,o,a)=>{let u=0,c=t.length,f=e.length-1,d=c-1;for(;u<=f&&u<=d;){let l=e[u],c=t[u]=a?n5(t[u]):n3(t[u]);if(n1(l,c))b(l,c,n,null,r,i,s,o,a);else break;u++}for(;u<=f&&u<=d;){let l=e[f],u=t[d]=a?n5(t[d]):n3(t[d]);if(n1(l,u))b(l,u,n,null,r,i,s,o,a);else break;f--,d--}if(u>f){if(u<=d){let e=d+1,f=ed)for(;u<=f;)Z(e[u],r,i,!0),u++;else{let h,g=u,m=u,_=new Map;for(u=m;u<=d;u++){let e=t[u]=a?n5(t[u]):n3(t[u]);null!=e.key&&_.set(e.key,u)}let y=0,x=d-m+1,S=!1,w=0,k=Array(x);for(u=0;u=x){Z(c,r,i,!0);continue}if(null!=c.key)l=_.get(c.key);else for(h=m;h<=d;h++)if(0===k[h-m]&&n1(c,t[h])){l=h;break}void 0===l?Z(c,r,i,!0):(k[l-m]=u+1,l>=w?w=l:S=!0,b(c,t[l],n,null,r,i,s,o,a),y++)}let C=S?function(e){let t,n,l,r,i,s=e.slice(),o=[0],a=e.length;for(t=0;t>1]]0&&(s[t]=o[l-1]),o[l]=t)}}for(l=o.length,r=o[l-1];l-- >0;)o[l]=r,r=s[r];return o}(k):p;for(h=C.length-1,u=x-1;u>=0;u--){let e=m+u,f=t[e],p=t[e+1],d=e+1{let{el:o,type:a,transition:u,children:c,shapeFlag:f}=e;if(6&f)return void J(e.component.subTree,t,n,i);if(128&f)return void e.suspense.move(t,n,i);if(64&f)return void a.move(e,t,n,er);if(a===nK){l(o,t,n);for(let e=0;e{let i;for(;e&&e!==t;)i=g(e),l(e,n,r),e=i;l(t,n,r)})(e,t,n);if(2!==i&&1&f&&u)if(0===i)u.beforeEnter(o),l(o,t,n),nj(()=>u.enter(o),s);else{let{leave:i,delayLeave:s,afterLeave:a}=u,c=()=>{e.ctx.isUnmounted?r(o):l(o,t,n)},f=()=>{i(o,()=>{c(),a&&a()})};s?s(o,c,f):f()}else l(o,t,n)},Z=(e,t,n,l=!1,r=!1)=>{let i,{type:s,props:o,ref:a,children:u,dynamicChildren:c,shapeFlag:f,patchFlag:p,dirs:d,cacheIndex:h}=e;if(-2===p&&(r=!1),null!=a&&(eM(),tz(a,null,n,e,!0),eA()),null!=h&&(t.renderCache[h]=void 0),256&f)return void t.ctx.deactivate(e);let g=1&f&&d,m=!tK(e);if(m&&(i=o&&o.onVnodeBeforeUnmount)&&le(i,t,e),6&f)Y(e.component,n,l);else{if(128&f)return void e.suspense.unmount(n,l);g&&tB(e,null,t,"beforeUnmount"),64&f?e.type.remove(e,t,n,er,l):c&&!c.hasOnce&&(s!==nK||p>0&&64&p)?ee(c,t,n,!1,!0):(s===nK&&384&p||!r&&16&f)&&ee(u,t,n),l&&X(e)}(m&&(i=o&&o.onVnodeUnmounted)||g)&&nj(()=>{i&&le(i,t,e),g&&tB(e,null,t,"unmounted")},n)},X=e=>{let{type:t,el:n,anchor:l,transition:i}=e;if(t===nK)return void Q(n,l);if(t===nX)return void(({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=g(e),r(e),e=n;r(t)})(e);let s=()=>{r(n),i&&!i.persisted&&i.afterLeave&&i.afterLeave()};if(1&e.shapeFlag&&i&&!i.persisted){let{leave:t,delayLeave:l}=i,r=()=>t(n,s);l?l(e.el,s,r):r()}else s()},Q=(e,t)=>{let n;for(;e!==t;)n=g(e),r(e),e=n;r(t)},Y=(e,t,n)=>{let{bum:l,scope:r,job:i,subTree:s,um:o,m:a,a:u,parent:c,slots:{__:f}}=e;nN(a),nN(u),l&&H(l),c&&S(f)&&f.forEach(e=>{c.renderCache[e]=void 0}),r.stop(),i&&(i.flags|=8,Z(s,e,t,n)),o&&nj(o,t),nj(()=>{e.isUnmounted=!0},t),t&&t.pendingBranch&&!t.isUnmounted&&e.asyncDep&&!e.asyncResolved&&e.suspenseId===t.pendingId&&(t.deps--,0===t.deps&&t.resolve())},ee=(e,t,n,l=!1,r=!1,i=0)=>{for(let s=i;s{if(6&e.shapeFlag)return et(e.component.subTree);if(128&e.shapeFlag)return e.suspense.next();let t=g(e.anchor||e.el),n=t&&t[tH];return n?g(n):t},en=!1,el=(e,t,n)=>{null==e?t._vnode&&Z(t._vnode,null,null,!0):b(t._vnode||null,e,t,null,null,null,n),t._vnode=e,en||(en=!0,tN(),tF(),en=!1)},er={p:b,um:Z,m:J,r:X,mt:L,mc:M,pc:q,pbc:$,n:et,o:e};return{render:el,hydrate:n,createApp:function(e,t=null){T(e)||(e=_({},e)),null==t||P(t)||(t=null);let n=nm(),l=new WeakSet,r=[],i=!1,s=n.app={_uid:n_++,_component:e,_props:t,_container:null,_context:n,_instance:null,version:"3.5.18",get config(){return n.config},set config(v){},use:(e,...t)=>(l.has(e)||(e&&T(e.install)?(l.add(e),e.install(s,...t)):T(e)&&(l.add(e),e(s,...t))),s),mixin:e=>(n.mixins.includes(e)||n.mixins.push(e),s),component:(e,t)=>t?(n.components[e]=t,s):n.components[e],directive:(e,t)=>t?(n.directives[e]=t,s):n.directives[e],mount(l,r,o){if(!i){let r=s._ceVNode||n8(e,t);return r.appContext=n,!0===o?o="svg":!1===o&&(o=void 0),el(r,l,o),i=!0,s._container=l,l.__vue_app__=s,lh(r.component)}},onUnmount(e){r.push(e)},unmount(){i&&(tC(r,s._instance,16),el(null,s._container),delete s._container.__vue_app__)},provide:(e,t)=>(n.provides[e]=t,s),runWithContext(e){let t=ny;ny=s;try{return e()}finally{ny=t}}};return s}}}(lF))).createApp(...e),{mount:n}=t;return t.mount=e=>{var l,r;let i=O(l=e)?document.querySelector(l):l;if(!i)return;let s=t._component;T(s)||s.render||s.template||(s.template=i.innerHTML),1===i.nodeType&&(i.textContent="");let o=n(i,!1,(r=i)instanceof SVGElement?"svg":"function"==typeof MathMLElement&&r instanceof MathMLElement?"mathml":void 0);return i instanceof Element&&(i.removeAttribute("v-cloak"),i.setAttribute("data-v-app","")),o},t},lV=!1,lW=c(",key,ref,innerHTML,textContent,ref_key,ref_for");function lU(e,t){let n="";for(let l in e){if(lW(l)||g(l)||"textarea"===t&&"value"===l)continue;let r=e[l];"class"===l?n+=` class="${lq(r)}"`:"style"===l?n+=` style="${lG(r)}"`:"className"===l?n+=` class="${String(r)}"`:n+=lB(l,r,t)}return n}function lB(e,t,n){if(!ea(t))return"";let l=n&&(n.indexOf("-")>0||Y(n))?e:eo[e]||e.toLowerCase();return el(l)?er(t)?` ${l}`:"":!function(e){if(es.hasOwnProperty(e))return es[e];let t=ei.test(e);return t&&console.error(`unsafe attribute name: ${e}`),es[e]=!t}(l)?(console.warn(`[@vue/server-renderer] Skipped rendering unsafe attribute name: ${l}`),""):""===t?` ${l}`:` ${l}="${ec(t)}"`}function lH(e,t){return ea(t)?` ${e}="${ec(t)}"`:""}function lq(e){return ec(Q(e))}function lG(e){return e?O(e)?ec(e):ec(function(e){if(!e)return"";if(O(e))return e;let t="";for(let n in e){let l=e[n];if(O(l)||"number"==typeof l){let e=n.startsWith("--")?n:V(n);t+=`${e}:${l};`}}return t}(K(function(e){if(!S(e)&&P(e)){let n={};for(let l in e)if(l.startsWith(":--")){var t;n[l.slice(1)]=null==(t=e[l])?"initial":"string"==typeof t?""===t?" ":t:String(t)}else n[l]=e[l];return n}return e}(e)))):""}function lz(e,t=null,n=null,l=null,r){return rr(n8(e,t,n),l,r)}let{ensureValidVNode:lK}=lg;function lJ(e,t,n,l,r,i,s){r("\x3c!--[--\x3e"),lZ(e,t,n,l,r,i,s),r("\x3c!--]--\x3e")}function lZ(e,t,n,l,r,i,s,o){let a=e[t];if(a){let e=[],t=a(n,t=>{e.push(t)},i,s?" "+s:"");if(S(t)){let e=lK(t);e?ro(r,e,i,s):l?l():o&&r("\x3c!----\x3e")}else{let t=!0;if(o)t=!1;else for(let n=0;n$/,lQ=//gm;function lY(e,t,n,l,r){let i;e("\x3c!--teleport start--\x3e");let s=r.appContext.provides[nF],o=s.__teleportBuffers||(s.__teleportBuffers={}),a=o[n]||(o[n]=[]),u=a.length;if(l)t(e),i="\x3c!--teleport start anchor--\x3e\x3c!--teleport anchor--\x3e";else{let{getBuffer:e,push:n}=rl();n("\x3c!--teleport start anchor--\x3e"),t(n),n("\x3c!--teleport anchor--\x3e"),i=e()}a.splice(u,0,i),e("\x3c!--teleport end--\x3e")}function l0(e){return ec(ev(e))}function l1(e,t){if(S(e)||O(e))for(let n=0,l=e.length;n-1}function l3(e,t,n){switch(e){case"radio":return ep(t,n)?" checked":"";case"checkbox":return(S(t)?l4(t,n):t)?" checked":"";default:return lH("value",t)}}function l5(e={},t){let{type:n,value:l}=e;switch(n){case"radio":return ep(t,l)?{checked:!0}:null;case"checkbox":return(S(t)?l4(t,l):t)?{checked:!0}:null;default:return{value:t}}}let{createComponentInstance:l9,setCurrentRenderingInstance:l7,setupComponent:re,renderComponentRoot:rt,normalizeVNode:rn}=lg;function rl(){let e=!1,t=[];return{getBuffer:()=>t,push(n){let l=O(n);if(e&&l){t[t.length-1]+=n;return}t.push(n),e=l,(E(n)||S(n)&&n.hasAsync)&&(t.hasAsync=!0)}}}function rr(e,t=null,n){let l=e.component=l9(e,t,null),r=re(l,!0),i=E(r),s=l.sp;return i||s?Promise.resolve(r).then(()=>{if(i&&(s=l.sp),s)return Promise.all(s.map(e=>e.call(l.proxy)))}).catch(d).then(()=>ri(l,n)):ri(l,n)}function ri(e,t){let n=e.type,{getBuffer:l,push:r}=rl();if(T(n)){let l=rt(e);if(!n.props)for(let t in e.attrs)t.startsWith("data-v-")&&((l.props||(l.props={}))[t]="");rs(r,e.subTree=l,e,t)}else{(!e.render||e.render===d)&&!e.ssrRender&&!n.ssrRender&&O(n.template)&&(n.ssrRender=function(e,t){throw Error("On-the-fly template compilation is not supported in the ESM build of @vue/server-renderer. All templates must be pre-compiled into render functions.")}(n.template));let l=e.ssrRender||n.ssrRender;if(l){let n=!1!==e.inheritAttrs?e.attrs:void 0,i=!1,s=e;for(;;){let e=s.vnode.scopeId;e&&(i||(n={...n},i=!0),n[e]="");let t=s.parent;if(t&&t.subTree&&t.subTree===s.vnode)s=t;else break}if(t){i||(n={...n});let e=t.trim().split(" ");for(let t=0;t`:"\x3c!----\x3e");break;case nX:e(s);break;case nK:t.slotScopeIds&&(l=(l?l+" ":"")+t.slotScopeIds.join(" ")),e("\x3c!--[--\x3e"),ro(e,s,n,l),e("\x3c!--]--\x3e");break;default:1&i?function(e,t,n,l){let r=t.type,{props:i,children:s,shapeFlag:o,scopeId:a}=t,u=`<${r}`;i&&(u+=lU(i,r)),a&&(u+=` ${a}`);let c=n,f=t;for(;c&&f===c.subTree;)(f=c.vnode).scopeId&&(u+=` ${f.scopeId}`),c=c.parent;if(l&&(u+=` ${l}`),e(u+">"),!ee(r)){let t=!1;i&&(i.innerHTML?(t=!0,e(i.innerHTML)):i.textContent?(t=!0,e(ec(i.textContent))):"textarea"===r&&i.value&&(t=!0,e(ec(i.value)))),!t&&(8&o?e(ec(s)):16&o&&ro(e,s,n,l)),e(``)}}(e,t,n,l):6&i?e(rr(t,n,l)):64&i?function(e,t,n,l){let r=t.props&&t.props.to,i=t.props&&t.props.disabled;if(r&&O(r))lY(e,e=>{ro(e,t.children,n,l)},r,i||""===i,n)}(e,t,n,l):128&i&&rs(e,t.ssContent,n,l)}}function ro(e,t,n,l){for(let r=0;r(t[n]=l,e(t,r,n)));let i=e(l,r,0);if(E(i))return i.then(l=>(t[n]=l,e(t,"",n)));r=i}return r}(e,"",0)}async function rc(e,t={}){if(ra(e))return rc(lL({render:()=>e}),t);let n=n8(e._component,e._props);n.appContext=e._context,e.provide(nF,t);let l=await rr(n),r=await ru(l);if(await rf(t),t.__watcherHandles)for(let e of t.__watcherHandles)e();return r}async function rf(e){if(e.__teleportBuffers)for(let t in e.teleports=e.teleports||{},e.__teleportBuffers)e.teleports[t]=await ru(await Promise.all([e.__teleportBuffers[t]]))}let{isVNode:rp}=lg;async function rd(e,t){if(e.hasAsync)for(let n=0;ne}),t,n);let l=n8(e._component,e._props);return l.appContext=e._context,e.provide(nF,t),Promise.resolve(rr(l)).then(e=>rd(e,n)).then(()=>rf(t)).then(()=>{if(t.__watcherHandles)for(let e of t.__watcherHandles)e()}).then(()=>n.push(null)).catch(e=>{n.destroy(e)}),n}function rv(e,t={}){return console.warn("[@vue/server-renderer] renderToStream is deprecated - use renderToNodeStream instead."),rg(e,t)}function rg(e,t={}){throw Error("ESM build of renderToStream() does not support renderToNodeStream(). Use pipeToNodeWritable() with an existing Node.js Writable stream instance instead.")}function rm(e,t={},n){rh(e,t,{push(e){null!=e?n.write(e):n.end()},destroy(e){n.destroy(e)}})}function r_(e,t={}){if("function"!=typeof ReadableStream)throw Error("ReadableStream constructor is not available in the global scope. If the target environment does support web streams, consider using pipeToWebWritable() with an existing WritableStream instance instead.");let n=new TextEncoder,l=!1;return new ReadableStream({start(r){rh(e,t,{push(e){l||(null!=e?r.enqueue(n.encode(e)):r.close())},destroy(e){r.error(e)}})},cancel(){l=!0}})}function ry(e,t={},n){let l=n.getWriter(),r=new TextEncoder,i=!1;try{i=E(l.ready)}catch(e){}rh(e,t,{push:async e=>(i&&await l.ready,null!=e)?l.write(r.encode(e)):l.close(),destroy(e){console.log(e),l.close()}})}lV||(lV=!0,({value:e},t)=>{if(S(e)){if(t.props&&ed(e,t.props.value)>-1)return{checked:!0}}else if(k(e)){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}});export{rm as pipeToNodeWritable,ry as pipeToWebWritable,rg as renderToNodeStream,rh as renderToSimpleStream,rv as renderToStream,rc as renderToString,r_ as renderToWebStream,l6 as ssrGetDirectiveProps,l5 as ssrGetDynamicModelProps,er as ssrIncludeBooleanAttr,l0 as ssrInterpolate,l4 as ssrLooseContain,l8 as ssrLooseEqual,lH as ssrRenderAttr,lU as ssrRenderAttrs,lq as ssrRenderClass,lz as ssrRenderComponent,lB as ssrRenderDynamicAttr,l3 as ssrRenderDynamicModel,l1 as ssrRenderList,lJ as ssrRenderSlot,lZ as ssrRenderSlotInner,lG as ssrRenderStyle,l2 as ssrRenderSuspense,lY as ssrRenderTeleport,rs as ssrRenderVNode}; +**/let e,t,n,l,r,i,s,o,a,u;function c(e){let t=Object.create(null);for(let n of e.split(","))t[n]=1;return e=>e in t}let f={},p=[],d=()=>{},h=()=>!1,g=e=>111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&(e.charCodeAt(2)>122||97>e.charCodeAt(2)),m=e=>e.startsWith("onUpdate:"),_=Object.assign,y=(e,t)=>{let n=e.indexOf(t);n>-1&&e.splice(n,1)},b=Object.prototype.hasOwnProperty,x=(e,t)=>b.call(e,t),S=Array.isArray,w=e=>"[object Map]"===A(e),k=e=>"[object Set]"===A(e),C=e=>"[object Date]"===A(e),T=e=>"function"==typeof e,O=e=>"string"==typeof e,R=e=>"symbol"==typeof e,M=e=>null!==e&&"object"==typeof e,P=e=>(M(e)||T(e))&&T(e.then)&&T(e.catch),E=Object.prototype.toString,A=e=>E.call(e),$=e=>"[object Object]"===A(e),j=e=>O(e)&&"NaN"!==e&&"-"!==e[0]&&""+parseInt(e,10)===e,D=c(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),I=e=>{let t=Object.create(null);return n=>t[n]||(t[n]=e(n))},N=/-\w/g,F=I(e=>e.replace(N,e=>e.slice(1).toUpperCase())),L=/\B([A-Z])/g,V=I(e=>e.replace(L,"-$1").toLowerCase()),W=I(e=>e.charAt(0).toUpperCase()+e.slice(1)),U=I(e=>e?`on${W(e)}`:""),B=(e,t)=>!Object.is(e,t),H=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:l,value:n})},G=e=>{let t=parseFloat(e);return isNaN(t)?e:t},z=()=>e||(e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{});function K(e){if(S(e)){let t={};for(let n=0;n{if(e){let n=e.split(Z);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}(l):K(l);if(r)for(let e in r)t[e]=r[e]}return t}if(O(e)||M(e))return e}let J=/;(?![^(]*\))/g,Z=/:([^]+)/,X=/\/\*[^]*?\*\//g;function Q(e){let t="";if(O(e))t=e;else if(S(e))for(let n=0;n/="'\u0009\u000a\u000c\u0020]/,es={},eo={acceptCharset:"accept-charset",className:"class",htmlFor:"for",httpEquiv:"http-equiv"};function ea(e){if(null==e)return!1;let t=typeof e;return"string"===t||"number"===t||"boolean"===t}let eu=/["'&<>]/;function ec(e){let t,n,l=""+e,r=eu.exec(l);if(!r)return l;let i="",s=0;for(n=r.index;n||--!>|ep(e,t))}let eh=e=>!!(e&&!0===e.__v_isRef),ev=e=>O(e)?e:null==e?"":S(e)||M(e)&&(e.toString===E||!T(e.toString))?eh(e)?ev(e.value):JSON.stringify(e,eg,2):String(e),eg=(e,t)=>{if(eh(t))return eg(e,t.value);if(w(t))return{[`Map(${t.size})`]:[...t.entries()].reduce((e,[t,n],l)=>(e[em(t,l)+" =>"]=n,e),{})};if(k(t))return{[`Set(${t.size})`]:[...t.values()].map(e=>em(e))};if(R(t))return em(t);if(M(t)&&!S(t)&&!$(t))return String(t);return t},em=(e,t="")=>{var n;return R(e)?`Symbol(${null!=(n=e.description)?n:t})`:e};class e_{constructor(e=!1){this.detached=e,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=t,!e&&t&&(this.index=(t.scopes||(t.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){let e,t;if(this._isPaused=!0,this.scopes)for(e=0,t=this.scopes.length;e0&&0==--this._on&&(t=this.prevScope,this.prevScope=void 0)}stop(e){if(this._active){let t,n;for(t=0,this._active=!1,n=this.effects.length;t0)){if(r){let e=r;for(r=void 0;e;){let t=e.next;e.next=void 0,e.flags&=-9,e=t}}for(;l;){let t=l;for(l=void 0;t;){let n=t.next;if(t.next=void 0,t.flags&=-9,1&t.flags)try{t.trigger()}catch(t){e||(e=t)}t=n}}if(e)throw e}}function ek(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function eC(e){let t,n=e.depsTail,l=n;for(;l;){let e=l.prevDep;-1===l.version?(l===n&&(n=e),eR(l),function(e){let{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}(l)):t=l,l.dep.activeLink=l.prevActiveLink,l.prevActiveLink=void 0,l=e}e.deps=t,e.depsTail=n}function eT(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(eO(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function eO(e){if(4&e.flags&&!(16&e.flags)||(e.flags&=-17,e.globalVersion===ej)||(e.globalVersion=ej,!e.isSSR&&128&e.flags&&(!e.deps&&!e._dirty||!eT(e))))return;e.flags|=2;let t=e.dep,l=n,r=eM;n=e,eM=!0;try{ek(e);let n=e.fn(e._value);(0===t.version||B(n,e._value))&&(e.flags|=128,e._value=n,t.version++)}catch(e){throw t.version++,e}finally{n=l,eM=r,eC(e),e.flags&=-3}}function eR(e,t=!1){let{dep:n,prevSub:l,nextSub:r}=e;if(l&&(l.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=l,e.nextSub=void 0),n.subs===e&&(n.subs=l,!l&&n.computed)){n.computed.flags&=-5;for(let e=n.computed.deps;e;e=e.nextDep)eR(e,!0)}t||--n.sc||!n.map||n.map.delete(n.key)}let eM=!0,eP=[];function eE(){eP.push(eM),eM=!1}function eA(){let e=eP.pop();eM=void 0===e||e}function e$(e){let{cleanup:t}=e;if(e.cleanup=void 0,t){let e=n;n=void 0;try{t()}finally{n=e}}}let ej=0;class eD{constructor(e,t){this.sub=e,this.dep=t,this.version=t.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class eI{constructor(e){this.computed=e,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(e){if(!n||!eM||n===this.computed)return;let t=this.activeLink;if(void 0===t||t.sub!==n)t=this.activeLink=new eD(n,this),n.deps?(t.prevDep=n.depsTail,n.depsTail.nextDep=t,n.depsTail=t):n.deps=n.depsTail=t,function e(t){if(t.dep.sc++,4&t.sub.flags){let n=t.dep.computed;if(n&&!t.dep.subs){n.flags|=20;for(let t=n.deps;t;t=t.nextDep)e(t)}let l=t.dep.subs;l!==t&&(t.prevSub=l,l&&(l.nextSub=t)),t.dep.subs=t}}(t);else if(-1===t.version&&(t.version=this.version,t.nextDep)){let e=t.nextDep;e.prevDep=t.prevDep,t.prevDep&&(t.prevDep.nextDep=e),t.prevDep=n.depsTail,t.nextDep=void 0,n.depsTail.nextDep=t,n.depsTail=t,n.deps===t&&(n.deps=e)}return t}trigger(e){this.version++,ej++,this.notify(e)}notify(e){ex++;try{for(let e=this.subs;e;e=e.prevSub)e.sub.notify()&&e.sub.dep.notify()}finally{ew()}}}let eN=new WeakMap,eF=Symbol(""),eL=Symbol(""),eV=Symbol("");function eW(e,t,l){if(eM&&n){let t=eN.get(e);t||eN.set(e,t=new Map);let n=t.get(l);n||(t.set(l,n=new eI),n.map=t,n.key=l),n.track()}}function eU(e,t,n,l,r,i){let s=eN.get(e);if(!s)return void ej++;let o=e=>{e&&e.trigger()};if(ex++,"clear"===t)s.forEach(o);else{let r=S(e),i=r&&j(n);if(r&&"length"===n){let e=Number(l);s.forEach((t,n)=>{("length"===n||n===eV||!R(n)&&n>=e)&&o(t)})}else switch((void 0!==n||s.has(void 0))&&o(s.get(n)),i&&o(s.get(eV)),t){case"add":r?i&&o(s.get("length")):(o(s.get(eF)),w(e)&&o(s.get(eL)));break;case"delete":!r&&(o(s.get(eF)),w(e)&&o(s.get(eL)));break;case"set":w(e)&&o(s.get(eF))}}ew()}function eB(e){let t=th(e);return t===e?t:(eW(t,"iterate",eV),tp(e)?t:t.map(tv))}function eH(e){return eW(e=th(e),"iterate",eV),e}let eq={__proto__:null,[Symbol.iterator](){return eG(this,Symbol.iterator,tv)},concat(...e){return eB(this).concat(...e.map(e=>S(e)?eB(e):e))},entries(){return eG(this,"entries",e=>(e[1]=tv(e[1]),e))},every(e,t){return eK(this,"every",e,t,void 0,arguments)},filter(e,t){return eK(this,"filter",e,t,e=>e.map(tv),arguments)},find(e,t){return eK(this,"find",e,t,tv,arguments)},findIndex(e,t){return eK(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return eK(this,"findLast",e,t,tv,arguments)},findLastIndex(e,t){return eK(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return eK(this,"forEach",e,t,void 0,arguments)},includes(...e){return eZ(this,"includes",e)},indexOf(...e){return eZ(this,"indexOf",e)},join(e){return eB(this).join(e)},lastIndexOf(...e){return eZ(this,"lastIndexOf",e)},map(e,t){return eK(this,"map",e,t,void 0,arguments)},pop(){return eX(this,"pop")},push(...e){return eX(this,"push",e)},reduce(e,...t){return eJ(this,"reduce",e,t)},reduceRight(e,...t){return eJ(this,"reduceRight",e,t)},shift(){return eX(this,"shift")},some(e,t){return eK(this,"some",e,t,void 0,arguments)},splice(...e){return eX(this,"splice",e)},toReversed(){return eB(this).toReversed()},toSorted(e){return eB(this).toSorted(e)},toSpliced(...e){return eB(this).toSpliced(...e)},unshift(...e){return eX(this,"unshift",e)},values(){return eG(this,"values",tv)}};function eG(e,t,n){let l=eH(e),r=l[t]();return l===e||tp(e)||(r._next=r.next,r.next=()=>{let e=r._next();return e.done||(e.value=n(e.value)),e}),r}let ez=Array.prototype;function eK(e,t,n,l,r,i){let s=eH(e),o=s!==e&&!tp(e),a=s[t];if(a!==ez[t]){let t=a.apply(e,i);return o?tv(t):t}let u=n;s!==e&&(o?u=function(t,l){return n.call(this,tv(t),l,e)}:n.length>2&&(u=function(t,l){return n.call(this,t,l,e)}));let c=a.call(s,u,l);return o&&r?r(c):c}function eJ(e,t,n,l){let r=eH(e),i=n;return r!==e&&(tp(e)?n.length>3&&(i=function(t,l,r){return n.call(this,t,l,r,e)}):i=function(t,l,r){return n.call(this,t,tv(l),r,e)}),r[t](i,...l)}function eZ(e,t,n){let l=th(e);eW(l,"iterate",eV);let r=l[t](...n);return(-1===r||!1===r)&&td(n[0])?(n[0]=th(n[0]),l[t](...n)):r}function eX(e,t,n=[]){eE(),ex++;let l=th(e)[t].apply(e,n);return ew(),eA(),l}let eQ=c("__proto__,__v_isRef,__isVue"),eY=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>"arguments"!==e&&"caller"!==e).map(e=>Symbol[e]).filter(R));function e0(e){R(e)||(e=String(e));let t=th(this);return eW(t,"has",e),t.hasOwnProperty(e)}class e1{constructor(e=!1,t=!1){this._isReadonly=e,this._isShallow=t}get(e,t,n){if("__v_skip"===t)return e.__v_skip;let l=this._isReadonly,r=this._isShallow;if("__v_isReactive"===t)return!l;if("__v_isReadonly"===t)return l;if("__v_isShallow"===t)return r;if("__v_raw"===t)return n===(l?r?ts:ti:r?tr:tl).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;let i=S(e);if(!l){let e;if(i&&(e=eq[t]))return e;if("hasOwnProperty"===t)return e0}let s=Reflect.get(e,t,tm(e)?e:n);if((R(t)?eY.has(t):eQ(t))||(l||eW(e,"get",t),r))return s;if(tm(s)){let e=i&&j(t)?s:s.value;return l&&M(e)?ta(e):e}return M(s)?l?ta(s):to(s):s}}class e2 extends e1{constructor(e=!1){super(!1,e)}set(e,t,n,l){let r=e[t];if(!this._isShallow){let t=tf(r);if(tp(n)||tf(n)||(r=th(r),n=th(n)),!S(e)&&tm(r)&&!tm(n))if(t)return!0;else return r.value=n,!0}let i=S(e)&&j(t)?Number(t)e,e5=e=>Reflect.getPrototypeOf(e);function e9(e){return function(){return"delete"!==e&&("clear"===e?void 0:this)}}function e7(e,t){let n=function(e,t){let n={get(n){let l=this.__v_raw,r=th(l),i=th(n);e||(B(n,i)&&eW(r,"get",n),eW(r,"get",i));let{has:s}=e5(r),o=t?e3:e?tg:tv;return s.call(r,n)?o(l.get(n)):s.call(r,i)?o(l.get(i)):void(l!==r&&l.get(n))},get size(){let t=this.__v_raw;return e||eW(th(t),"iterate",eF),t.size},has(t){let n=this.__v_raw,l=th(n),r=th(t);return e||(B(t,r)&&eW(l,"has",t),eW(l,"has",r)),t===r?n.has(t):n.has(t)||n.has(r)},forEach(n,l){let r=this,i=r.__v_raw,s=th(i),o=t?e3:e?tg:tv;return e||eW(s,"iterate",eF),i.forEach((e,t)=>n.call(l,o(e),o(t),r))}};return _(n,e?{add:e9("add"),set:e9("set"),delete:e9("delete"),clear:e9("clear")}:{add(e){t||tp(e)||tf(e)||(e=th(e));let n=th(this);return e5(n).has.call(n,e)||(n.add(e),eU(n,"add",e,e)),this},set(e,n){t||tp(n)||tf(n)||(n=th(n));let l=th(this),{has:r,get:i}=e5(l),s=r.call(l,e);s||(e=th(e),s=r.call(l,e));let o=i.call(l,e);return l.set(e,n),s?B(n,o)&&eU(l,"set",e,n):eU(l,"add",e,n),this},delete(e){let t=th(this),{has:n,get:l}=e5(t),r=n.call(t,e);r||(e=th(e),r=n.call(t,e)),l&&l.call(t,e);let i=t.delete(e);return r&&eU(t,"delete",e,void 0),i},clear(){let e=th(this),t=0!==e.size,n=e.clear();return t&&eU(e,"clear",void 0,void 0),n}}),["keys","values","entries",Symbol.iterator].forEach(l=>{n[l]=function(...n){let r=this.__v_raw,i=th(r),s=w(i),o="entries"===l||l===Symbol.iterator&&s,a=r[l](...n),u=t?e3:e?tg:tv;return e||eW(i,"iterate","keys"===l&&s?eL:eF),{next(){let{value:e,done:t}=a.next();return t?{value:e,done:t}:{value:o?[u(e[0]),u(e[1])]:u(e),done:t}},[Symbol.iterator](){return this}}}}),n}(e,t);return(t,l,r)=>"__v_isReactive"===l?!e:"__v_isReadonly"===l?e:"__v_raw"===l?t:Reflect.get(x(n,l)&&l in t?n:t,l,r)}let te={get:e7(!1,!1)},tt={get:e7(!1,!0)},tn={get:e7(!0,!1)},tl=new WeakMap,tr=new WeakMap,ti=new WeakMap,ts=new WeakMap;function to(e){return tf(e)?e:tu(e,!1,e6,te,tl)}function ta(e){return tu(e,!0,e8,tn,ti)}function tu(e,t,n,l,r){var i;if(!M(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;let s=(i=e).__v_skip||!Object.isExtensible(i)?0:function(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}(A(i).slice(8,-1));if(0===s)return e;let o=r.get(e);if(o)return o;let a=new Proxy(e,2===s?l:n);return r.set(e,a),a}function tc(e){return tf(e)?tc(e.__v_raw):!!(e&&e.__v_isReactive)}function tf(e){return!!(e&&e.__v_isReadonly)}function tp(e){return!!(e&&e.__v_isShallow)}function td(e){return!!e&&!!e.__v_raw}function th(e){let t=e&&e.__v_raw;return t?th(t):e}let tv=e=>M(e)?to(e):e,tg=e=>M(e)?ta(e):e;function tm(e){return!!e&&!0===e.__v_isRef}let t_={get:(e,t,n)=>{var l;return"__v_raw"===t?e:tm(l=Reflect.get(e,t,n))?l.value:l},set:(e,t,n,l)=>{let r=e[t];return tm(r)&&!tm(n)?(r.value=n,!0):Reflect.set(e,t,n,l)}};function ty(e){return tc(e)?e:new Proxy(e,t_)}class tb{constructor(e,t,n){this.fn=e,this.setter=t,this._value=void 0,this.dep=new eI(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=ej-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!t,this.isSSR=n}notify(){if(this.flags|=16,!(8&this.flags)&&n!==this)return eS(this,!0),!0}get value(){let e=this.dep.track();return eO(this),e&&(e.version=this.dep.version),this._value}set value(e){this.setter&&this.setter(e)}}let tx={},tS=new WeakMap;function tw(e,t=1/0,n){if(t<=0||!M(e)||e.__v_skip||((n=n||new Map).get(e)||0)>=t)return e;if(n.set(e,t),t--,tm(e))tw(e.value,t,n);else if(S(e))for(let l=0;l{tw(e,t,n)});else if($(e)){for(let l in e)tw(e[l],t,n);for(let l of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,l)&&tw(e[l],t,n)}return e}function tk(e,t,n,l){try{return l?e(...l):e()}catch(e){tT(e,t,n)}}function tC(e,t,n,l){if(T(e)){let r=tk(e,t,n,l);return r&&P(r)&&r.catch(e=>{tT(e,t,n)}),r}if(S(e)){let r=[];for(let i=0;i=tL(n)?tO.push(e):tO.splice(function(e){let t=tR+1,n=tO.length;for(;t>>1,r=tO[l],i=tL(r);itL(e)-tL(t));if(tM.length=0,tP)return void tP.push(...e);for(tE=0,tP=e;tEnull==e.id?2&e.flags?-1:1/0:e.id,tV=null,tW=null;function tU(e){let t=tV;return tV=e,tW=e&&e.type.__scopeId||null,t}function tB(e,t,n,l){let r=e.dirs,i=t&&t.dirs;for(let s=0;stJ(e,t&&(S(t)?t[i]:t),n,l,r));if(tX(l)&&!r){512&l.shapeFlag&&l.type.__asyncResolved&&l.component.subTree.component&&tJ(e,t,n,l.component.subTree);return}let i=4&l.shapeFlag?l_(l.component):l.el,s=r?null:i,{i:o,r:a}=e,u=t&&t.r,c=o.refs===f?o.refs={}:o.refs,p=o.setupState,d=th(p),g=p===f?h:e=>x(d,e);if(null!=u&&u!==a&&((tZ(t),O(u))?(c[u]=null,g(u)&&(p[u]=null)):tm(u)&&(u.value=null,t.k&&(c[t.k]=null))),T(a))tk(a,o,12,[s,c]);else{let t=O(a),l=tm(a);if(t||l){let o=()=>{if(e.f){let n=t?g(a)?p[a]:c[a]:a.value;if(r)S(n)&&y(n,i);else if(S(n))n.includes(i)||n.push(i);else if(t)c[a]=[i],g(a)&&(p[a]=c[a]);else{let t=[i];a.value=t,e.k&&(c[e.k]=t)}}else t?(c[a]=s,g(a)&&(p[a]=s)):l&&(a.value=s,e.k&&(c[e.k]=s))};if(s){let t=()=>{o(),tK.delete(e)};t.id=-1,tK.set(e,t),nN(t,n)}else tZ(e),o()}}}function tZ(e){let t=tK.get(e);t&&(t.flags|=8,tK.delete(e))}let tX=e=>!!e.type.__asyncLoader,tQ=e=>e.type.__isKeepAlive;function tY(e,t){t1(e,"a",t)}function t0(e,t){t1(e,"da",t)}function t1(e,t,n=la){let l=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()});if(t2(t,l,n),n){let e=n.parent;for(;e&&e.parent;)tQ(e.parent.vnode)&&function(e,t,n,l){let r=t2(t,e,l,!0);t7(()=>{y(l[t],r)},n)}(l,t,n,e),e=e.parent}}function t2(e,t,n=la,l=!1){if(n){let r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...l)=>{eE();let r=lc(n),i=tC(t,n,e,l);return r(),eA(),i});return l?r.unshift(i):r.push(i),i}}let t6=e=>(t,n=la)=>{ld&&"sp"!==e||t2(e,(...e)=>t(...e),n)},t8=t6("bm"),t4=t6("m"),t3=t6("bu"),t5=t6("u"),t9=t6("bum"),t7=t6("um"),ne=t6("sp"),nt=t6("rtg"),nn=t6("rtc");function nl(e,t=la){t2("ec",e,t)}let nr=Symbol.for("v-ndc"),ni=e=>e?lp(e)?l_(e):ni(e.parent):null,ns=_(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>ni(e.parent),$root:e=>ni(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>np(e),$forceUpdate:e=>e.f||(e.f=()=>{tD(e.update)}),$nextTick:e=>e.n||(e.n=tj.bind(e.proxy)),$watch:e=>nB.bind(e)}),no=(e,t)=>e!==f&&!e.__isScriptSetup&&x(e,t),na={get({_:e},t){let n,l,r;if("__v_skip"===t)return!0;let{ctx:i,setupState:s,data:o,props:a,accessCache:u,type:c,appContext:p}=e;if("$"!==t[0]){let l=u[t];if(void 0!==l)switch(l){case 1:return s[t];case 2:return o[t];case 4:return i[t];case 3:return a[t]}else{if(no(s,t))return u[t]=1,s[t];if(o!==f&&x(o,t))return u[t]=2,o[t];if((n=e.propsOptions[0])&&x(n,t))return u[t]=3,a[t];if(i!==f&&x(i,t))return u[t]=4,i[t];nc&&(u[t]=0)}}let d=ns[t];return d?("$attrs"===t&&eW(e.attrs,"get",""),d(e)):(l=c.__cssModules)&&(l=l[t])?l:i!==f&&x(i,t)?(u[t]=4,i[t]):x(r=p.config.globalProperties,t)?r[t]:void 0},set({_:e},t,n){let{data:l,setupState:r,ctx:i}=e;return no(r,t)?(r[t]=n,!0):l!==f&&x(l,t)?(l[t]=n,!0):!x(e.props,t)&&!("$"===t[0]&&t.slice(1)in e)&&(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:l,appContext:r,propsOptions:i,type:s}},o){let a,u;return!!(n[o]||e!==f&&"$"!==o[0]&&x(e,o)||no(t,o)||(a=i[0])&&x(a,o)||x(l,o)||x(ns,o)||x(r.config.globalProperties,o)||(u=s.__cssModules)&&u[o])},defineProperty(e,t,n){return null!=n.get?e._.accessCache[t]=0:x(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function nu(e){return S(e)?e.reduce((e,t)=>(e[t]=null,e),{}):e}let nc=!0;function nf(e,t,n){tC(S(e)?e.map(e=>e.bind(t.proxy)):e.bind(t.proxy),t,n)}function np(e){let t,n=e.type,{mixins:l,extends:r}=n,{mixins:i,optionsCache:s,config:{optionMergeStrategies:o}}=e.appContext,a=s.get(n);return a?t=a:i.length||l||r?(t={},i.length&&i.forEach(e=>nd(t,e,o,!0)),nd(t,n,o)):t=n,M(n)&&s.set(n,t),t}function nd(e,t,n,l=!1){let{mixins:r,extends:i}=t;for(let s in i&&nd(e,i,n,!0),r&&r.forEach(t=>nd(e,t,n,!0)),t)if(l&&"expose"===s);else{let l=nh[s]||n&&n[s];e[s]=l?l(e[s],t[s]):t[s]}return e}let nh={data:nv,props:ny,emits:ny,methods:n_,computed:n_,beforeCreate:nm,created:nm,beforeMount:nm,mounted:nm,beforeUpdate:nm,updated:nm,beforeDestroy:nm,beforeUnmount:nm,destroyed:nm,unmounted:nm,activated:nm,deactivated:nm,errorCaptured:nm,serverPrefetch:nm,components:n_,directives:n_,watch:function(e,t){if(!e)return t;if(!t)return e;let n=_(Object.create(null),e);for(let l in t)n[l]=nm(e[l],t[l]);return n},provide:nv,inject:function(e,t){return n_(ng(e),ng(t))}};function nv(e,t){return t?e?function(){return _(T(e)?e.call(this,this):e,T(t)?t.call(this,this):t)}:t:e}function ng(e){if(S(e)){let t={};for(let n=0;n1)return n&&T(t)?t.call(l&&l.proxy):t}}let nk={},nC=()=>Object.create(nk),nT=e=>Object.getPrototypeOf(e)===nk;function nO(e,t,n,l){let r,[i,s]=e.propsOptions,o=!1;if(t)for(let a in t){let u;if(D(a))continue;let c=t[a];i&&x(i,u=F(a))?s&&s.includes(u)?(r||(r={}))[u]=c:n[u]=c:nz(e.emitsOptions,a)||a in l&&c===l[a]||(l[a]=c,o=!0)}if(s){let t=th(n),l=r||f;for(let r=0;r"_"===e||"_ctx"===e||"$stable"===e,nA=e=>S(e)?e.map(le):[le(e)],n$=(e,t,n)=>{if(t._n)return t;let l=function(e,t=tV,n){if(!t||e._n)return e;let l=(...n)=>{let r;l._d&&n6(-1);let i=tU(t);try{r=e(...n)}finally{tU(i),l._d&&n6(1)}return r};return l._n=!0,l._c=!0,l._d=!0,l}((...e)=>nA(t(...e)),n);return l._c=!1,l},nj=(e,t,n)=>{let l=e._ctx;for(let n in e){if(nE(n))continue;let r=e[n];if(T(r))t[n]=n$(n,r,l);else if(null!=r){let e=nA(r);t[n]=()=>e}}},nD=(e,t)=>{let n=nA(t);e.slots.default=()=>n},nI=(e,t,n)=>{for(let l in t)(n||!nE(l))&&(e[l]=t[l])},nN=function(e,t){if(t&&t.pendingBranch)S(e)?t.effects.push(...e):t.effects.push(e);else S(e)?tM.push(...e):tP&&-1===e.id?tP.splice(tE+1,0,e):1&e.flags||(tM.push(e),e.flags|=1),tI()};function nF({type:e,props:t},n){return"svg"===n&&"foreignObject"===e||"mathml"===n&&"annotation-xml"===e&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function nL({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function nV(e){if(e)for(let t=0;t{};return e.stop=d,e.resume=d,e.pause=d,e}}let c=la;o.call=(e,t,n)=>tC(e,c,t,n);let p=!1;"post"===s?o.scheduler=e=>{nN(e,c&&c.suspense)}:"sync"!==s&&(p=!0,o.scheduler=(e,t)=>{t?e():tD(e)}),o.augmentJob=e=>{n&&(e.flags|=4),p&&(e.flags|=2,c&&(e.id=c.uid,e.i=c))};let h=function(e,n,l=f){let r,i,s,o,{immediate:u,deep:c,once:p,scheduler:h,augmentJob:g,call:m}=l,_=e=>c?e:tp(e)||!1===c||0===c?tw(e,1):tw(e),b=!1,x=!1;if(tm(e)?(i=()=>e.value,b=tp(e)):tc(e)?(i=()=>_(e),b=!0):S(e)?(x=!0,b=e.some(e=>tc(e)||tp(e)),i=()=>e.map(e=>tm(e)?e.value:tc(e)?_(e):T(e)?m?m(e,2):e():void 0)):i=T(e)?n?m?()=>m(e,2):e:()=>{if(s){eE();try{s()}finally{eA()}}let t=a;a=r;try{return m?m(e,3,[o]):e(o)}finally{a=t}}:d,n&&c){let e=i,t=!0===c?1/0:c;i=()=>tw(e(),t)}let w=t,k=()=>{r.stop(),w&&w.active&&y(w.effects,r)};if(p&&n){let e=n;n=(...t)=>{e(...t),k()}}let C=x?Array(e.length).fill(tx):tx,O=e=>{if(1&r.flags&&(r.dirty||e))if(n){let e=r.run();if(c||b||(x?e.some((e,t)=>B(e,C[t])):B(e,C))){s&&s();let t=a;a=r;try{let t=[e,C===tx?void 0:x&&C[0]===tx?[]:C,o];C=e,m?m(n,3,t):n(...t)}finally{a=t}}}else r.run()};return g&&g(O),(r=new eb(i)).scheduler=h?()=>h(O,!1):O,o=e=>(function(e,t=!1,n=a){if(n){let t=tS.get(n);t||tS.set(n,t=[]),t.push(e)}})(e,!1,r),s=r.onStop=()=>{let e=tS.get(r);if(e){if(m)m(e,4);else for(let t of e)t();tS.delete(r)}},n?u?O(!0):C=r.run():h?h(O.bind(null,!0),!0):r.run(),k.pause=r.pause.bind(r),k.resume=r.resume.bind(r),k.stop=k,k}(e,n,o);return ld&&(r?r.push(h):u&&h()),h}function nB(e,t,n){let l,r=this.proxy,i=O(e)?e.includes(".")?nH(r,e):()=>r[e]:e.bind(r,r);T(t)?l=t:(l=t.handler,n=t);let s=lc(this),o=nU(i,l.bind(r),n);return s(),o}function nH(e,t){let n=t.split(".");return()=>{let t=e;for(let e=0;eO(e)?e.trim():e)),a.number&&(s=n.map(G)));let u=i[l=U(t)]||i[l=U(F(t))];!u&&o&&(u=i[l=U(V(t))]),u&&tC(u,e,6,s);let c=i[l+"Once"];if(c){if(e.emitted){if(e.emitted[l])return}else e.emitted={};e.emitted[l]=!0,tC(c,e,6,s)}}let nG=new WeakMap;function nz(e,t){return!!e&&!!g(t)&&(x(e,(t=t.slice(2).replace(/Once$/,""))[0].toLowerCase()+t.slice(1))||x(e,V(t))||x(e,t))}function nK(e){let t,n,{type:l,vnode:r,proxy:i,withProxy:s,propsOptions:[o],slots:a,attrs:u,emit:c,render:f,renderCache:p,props:d,data:h,setupState:g,ctx:_,inheritAttrs:y}=e,b=tU(e);try{if(4&r.shapeFlag){let e=s||i;t=le(f.call(e,e,p,d,g,h,_)),n=u}else t=le(l.length>1?l(d,{attrs:u,slots:a,emit:c}):l(d,null)),n=l.props?u:nJ(u)}catch(n){tT(n,e,1),t=n9(n0)}let x=t;if(n&&!1!==y){let e=Object.keys(n),{shapeFlag:t}=x;e.length&&7&t&&(o&&e.some(m)&&(n=nZ(n,o)),x=n7(x,n,!1,!0))}return r.dirs&&((x=n7(x,null,!1,!0)).dirs=x.dirs?x.dirs.concat(r.dirs):r.dirs),r.transition&&tG(x,r.transition),t=x,tU(b),t}let nJ=e=>{let t;for(let n in e)("class"===n||"style"===n||g(n))&&((t||(t={}))[n]=e[n]);return t},nZ=(e,t)=>{let n={};for(let l in e)m(l)&&l.slice(9)in t||(n[l]=e[l]);return n};function nX(e,t,n){let l=Object.keys(t);if(l.length!==Object.keys(e).length)return!0;for(let r=0;rnull!=e?e:null,n5=({ref:e,ref_key:t,ref_for:n})=>("number"==typeof e&&(e=""+e),null!=e?O(e)||tm(e)||T(e)?{i:tV,r:e,k:t,f:!!n}:e:null),n9=function(e,t=null,n=null,l=0,r=null,i=!1){var s,o;if(e&&e!==nr||(e=n0),n8(e)){let l=n7(e,t,!0);return n&&ln(l,n),n2>0,l.patchFlag=-2,l}if(T(s=e)&&"__vccOpts"in s&&(e=e.__vccOpts),t){let{class:e,style:n}=t=(o=t)?td(o)||nT(o)?_({},o):o:null;e&&!O(e)&&(t.class=Q(e)),M(n)&&(td(n)&&!S(n)&&(n=_({},n)),t.style=K(n))}let a=O(e)?1:e.__isSuspense?128:e.__isTeleport?64:M(e)?4:2*!!T(e);return function(e,t=null,n=null,l=0,r=null,i=+(e!==nQ),s=!1,o=!1){let a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&n3(t),ref:t&&n5(t),scopeId:tW,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:l,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:tV};return o?(ln(a,n),128&i&&e.normalize(a)):n&&(a.shapeFlag|=O(n)?8:16),n2>0,a}(e,t,n,l,r,a,i,!0)};function n7(e,t,n=!1,l=!1){let{props:r,ref:i,patchFlag:s,children:o,transition:a}=e,u=t?ll(r||{},t):r,c={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&n3(u),ref:t&&t.ref?n&&i?S(i)?i.concat(n5(t)):[i,n5(t)]:n5(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==nQ?-1===s?16:16|s:s,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:a,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&n7(e.ssContent),ssFallback:e.ssFallback&&n7(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return a&&l&&tG(c,a.clone(c)),c}function le(e){return null==e||"boolean"==typeof e?n9(n0):S(e)?n9(nQ,null,e.slice()):n8(e)?lt(e):n9(nY,null,String(e))}function lt(e){return null===e.el&&-1!==e.patchFlag||e.memo?e:n7(e)}function ln(e,t){let n=0,{shapeFlag:l}=e;if(null==t)t=null;else if(S(t))n=16;else if("object"==typeof t)if(65&l){let n=t.default;n&&(n._c&&(n._d=!1),ln(e,n()),n._c&&(n._d=!0));return}else{n=32;let l=t._;l||nT(t)?3===l&&tV&&(1===tV.slots._?t._=1:(t._=2,e.patchFlag|=1024)):t._ctx=tV}else T(t)?(t={default:t,_ctx:tV},n=32):(t=String(t),64&l?(n=16,t=[function(e=" ",t=0){return n9(nY,null,e,t)}(t)]):n=8);e.children=t,e.shapeFlag|=n}function ll(...e){let t={};for(let n=0;n{u=!0;let[l,r]=e(t,n,!0);_(o,l),r&&a.push(...r)};!l&&n.mixins.length&&n.mixins.forEach(r),t.extends&&r(t.extends),t.mixins&&t.mixins.forEach(r)}if(!s&&!u)return M(t)&&r.set(t,p),p;if(S(s))for(let e=0;e{let l=e(t,n,!0);l&&(a=!0,_(o,l))};!l&&n.mixins.length&&n.mixins.forEach(r),t.extends&&r(t.extends),t.mixins&&t.mixins.forEach(r)}return s||a?(S(s)?s.forEach(e=>o[e]=null):_(o,s),M(t)&&r.set(t,o),o):(M(t)&&r.set(t,null),null)}(l,r),emit:null,emitted:null,propsDefaults:f,inheritAttrs:l.inheritAttrs,ctx:f,data:f,props:f,attrs:f,slots:f,refs:f,setupState:f,setupContext:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return i.ctx={_:i},i.root=t?t.root:i,i.emit=nq.bind(null,i),e.ce&&e.ce(i),i}let la=null,lu=()=>la||tV;{let e=z(),t=(t,n)=>{let l;return(l=e[t])||(l=e[t]=[]),l.push(n),e=>{l.length>1?l.forEach(t=>t(e)):l[0](e)}};i=t("__VUE_INSTANCE_SETTERS__",e=>la=e),s=t("__VUE_SSR_SETTERS__",e=>ld=e)}let lc=e=>{let t=la;return i(e),e.scope.on(),()=>{e.scope.off(),i(t)}},lf=()=>{la&&la.scope.off(),i(null)};function lp(e){return 4&e.vnode.shapeFlag}let ld=!1;function lh(e,t=!1,n=!1){t&&s(t);let{props:l,children:r}=e.vnode,i=lp(e);!function(e,t,n,l=!1){let r={},i=nC();for(let n in e.propsDefaults=Object.create(null),nO(e,t,r,i),e.propsOptions[0])n in r||(r[n]=void 0);n?e.props=l?r:tu(r,!1,e4,tt,tr):e.type.props?e.props=r:e.props=i,e.attrs=i}(e,l,i,t);var o=n||t;let a=e.slots=nC();if(32&e.vnode.shapeFlag){let e=r._;e?(nI(a,r,o),o&&q(a,"_",e,!0)):nj(r,a)}else r&&nD(e,r);let u=i?function(e,t){let n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,na);let{setup:l}=n;if(l){var r;eE();let n=e.setupContext=l.length>1?{attrs:new Proxy((r=e).attrs,lm),slots:r.slots,emit:r.emit,expose:e=>{r.exposed=e||{}}}:null,i=lc(e),s=tk(l,e,0,[e.props,n]),o=P(s);if(eA(),i(),(o||e.sp)&&!tX(e)&&tz(e),o){if(s.then(lf,lf),t)return s.then(t=>{lv(e,t)}).catch(t=>{tT(t,e,0)});e.asyncDep=s}else lv(e,s)}else lg(e)}(e,t):void 0;return t&&s(!1),u}function lv(e,t,n){T(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:M(t)&&(e.setupState=ty(t)),lg(e)}function lg(e,t,n){let l=e.type;e.render||(e.render=l.render||d);{let t=lc(e);eE();try{!function(e){let t=np(e),n=e.proxy,l=e.ctx;nc=!1,t.beforeCreate&&nf(t.beforeCreate,e,"bc");let{data:r,computed:i,methods:s,watch:o,provide:a,inject:u,created:c,beforeMount:f,mounted:p,beforeUpdate:h,updated:g,activated:m,deactivated:_,beforeUnmount:y,unmounted:b,render:x,renderTracked:w,renderTriggered:k,errorCaptured:C,serverPrefetch:R,expose:P,inheritAttrs:E,components:A,directives:$}=t;if(u&&function(e,t,n=d){for(let n in S(e)&&(e=ng(e)),e){let l,r=e[n];tm(l=M(r)?"default"in r?nw(r.from||n,r.default,!0):nw(r.from||n):nw(r))?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>l.value,set:e=>l.value=e}):t[n]=l}}(u,l,null),s)for(let e in s){let t=s[e];T(t)&&(l[e]=t.bind(n))}if(r){let t=r.call(n,n);M(t)&&(e.data=to(t))}if(nc=!0,i)for(let e in i){let t=i[e],r=T(t)?t.bind(n,n):T(t.get)?t.get.bind(n,n):d,s=ly({get:r,set:!T(t)&&T(t.set)?t.set.bind(n):d});Object.defineProperty(l,e,{enumerable:!0,configurable:!0,get:()=>s.value,set:e=>s.value=e})}if(o)for(let e in o)!function e(t,n,l,r){var i,s,o,a,u,c,f;let p=r.includes(".")?nH(l,r):()=>l[r];if(O(t)){let e=n[t];T(e)&&(i=p,s=e,nU(i,s,void 0))}else if(T(t)){o=p,a=t.bind(l),nU(o,a,void 0)}else if(M(t))if(S(t))t.forEach(t=>e(t,n,l,r));else{let e=T(t.handler)?t.handler.bind(l):n[t.handler];T(e)&&(u=p,c=e,f=t,nU(u,c,f))}}(o[e],l,n,e);if(a){let e=T(a)?a.call(n):a;Reflect.ownKeys(e).forEach(t=>{var n=t,l=e[t];if(la){let e=la.provides,t=la.parent&&la.parent.provides;t===e&&(e=la.provides=Object.create(t)),e[n]=l}})}function j(e,t){S(t)?t.forEach(t=>e(t.bind(n))):t&&e(t.bind(n))}if(c&&nf(c,e,"c"),j(t8,f),j(t4,p),j(t3,h),j(t5,g),j(tY,m),j(t0,_),j(nl,C),j(nn,w),j(nt,k),j(t9,y),j(t7,b),j(ne,R),S(P))if(P.length){let t=e.exposed||(e.exposed={});P.forEach(e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t,enumerable:!0})})}else e.exposed||(e.exposed={});x&&e.render===d&&(e.render=x),null!=E&&(e.inheritAttrs=E),A&&(e.components=A),$&&(e.directives=$),R&&tz(e)}(e)}finally{eA(),t()}}}let lm={get:(e,t)=>(eW(e,"get",""),e[t])};function l_(e){var t;return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(ty((!x(t=e.exposed,"__v_skip")&&Object.isExtensible(t)&&q(t,"__v_skip",!0),t)),{get:(t,n)=>n in t?t[n]:n in ns?ns[n](e):void 0,has:(e,t)=>t in e||t in ns})):e.proxy}let ly=(e,t)=>(function(e,t,n=!1){let l,r;return T(e)?l=e:(l=e.get,r=e.set),new tb(l,r,n)})(e,0,ld),lb={createComponentInstance:lo,setupComponent:lh,renderComponentRoot:nK,setCurrentRenderingInstance:tU,isVNode:n8,normalizeVNode:le,getComponentPublicInstance:l_,ensureValidVNode:function e(t){return t.some(t=>!n8(t)||t.type!==n0&&(t.type!==nQ||!!e(t.children)))?t:null},pushWarningContext:function(e){},popWarningContext:function(){}},lx="undefined"!=typeof window&&window.trustedTypes;if(lx)try{u=lx.createPolicy("vue",{createHTML:e=>e})}catch(e){}let lS=u?e=>u.createHTML(e):e=>e,lw="undefined"!=typeof document?document:null,lk=lw&&lw.createElement("template"),lC=Symbol("_vtc"),lT=Symbol("_vod"),lO=Symbol("_vsh"),lR=Symbol(""),lM=/(?:^|;)\s*display\s*:/,lP=/\s*!important$/;function lE(e,t,n){if(S(n))n.forEach(n=>lE(e,t,n));else if(null==n&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{let l=function(e,t){let n=l$[t];if(n)return n;let l=F(t);if("filter"!==l&&l in e)return l$[t]=l;l=W(l);for(let n=0;n111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&e.charCodeAt(2)>96&&123>e.charCodeAt(2),lU=_({patchProp:(e,t,n,l,r,i)=>{let s="svg"===r;if("class"===t){var o=l;let t=e[lC];t&&(o=(o?[o,...t]:[...t]).join(" ")),null==o?e.removeAttribute("class"):s?e.setAttribute("class",o):e.className=o}else"style"===t?function(e,t,n){let l=e.style,r=O(n),i=!1;if(n&&!r){if(t)if(O(t))for(let e of t.split(";")){let t=e.slice(0,e.indexOf(":")).trim();null==n[t]&&lE(l,t,"")}else for(let e in t)null==n[e]&&lE(l,e,"");for(let e in n)"display"===e&&(i=!0),lE(l,e,n[e])}else if(r){if(t!==n){let e=l[lR];e&&(n+=";"+e),l.cssText=n,i=lM.test(n)}}else t&&e.removeAttribute("style");lT in e&&(e[lT]=i?l.display:"",e[lO]&&(l.display="none"))}(e,n,l):g(t)?m(t)||function(e,t,n,l,r=null){let i=e[lN]||(e[lN]={}),s=i[t];if(l&&s)s.value=l;else{let[n,o]=function(e){let t;if(lF.test(e)){let n;for(t={};n=e.match(lF);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[":"===e[2]?e.slice(3):V(e.slice(2)),t]}(t);if(l){let s=i[t]=function(e,t){let n=e=>{if(e._vts){if(e._vts<=n.attached)return}else e._vts=Date.now();tC(function(e,t){if(!S(t))return t;{let n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(e=>t=>!t._stopped&&e&&e(t))}}(e,n.value),t,5,[e])};return n.value=e,n.attached=lL||(lV.then(()=>lL=0),lL=Date.now()),n}(l,r);e.addEventListener(n,s,o)}else s&&(e.removeEventListener(n,s,o),i[t]=void 0)}}(e,t,0,l,i):("."===t[0]?(t=t.slice(1),0):"^"===t[0]?(t=t.slice(1),1):!function(e,t,n,l){if(l)return!!("innerHTML"===t||"textContent"===t||t in e&&lW(t)&&T(n));if("spellcheck"===t||"draggable"===t||"translate"===t||"autocorrect"===t||"form"===t||"list"===t&&"INPUT"===e.tagName||"type"===t&&"TEXTAREA"===e.tagName)return!1;if("width"===t||"height"===t){let t=e.tagName;if("IMG"===t||"VIDEO"===t||"CANVAS"===t||"SOURCE"===t)return!1}return!(lW(t)&&O(n))&&t in e}(e,t,l,s))?e._isVueCE&&(/[A-Z]/.test(t)||!O(l))?lI(e,F(t),l,i,t):("true-value"===t?e._trueValue=l:"false-value"===t&&(e._falseValue=l),lD(e,t,l,s)):(lI(e,t,l),e.tagName.includes("-")||"value"!==t&&"checked"!==t&&"selected"!==t||lD(e,t,l,s,i,"value"!==t))}},{insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{let t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,l)=>{let r="svg"===t?lw.createElementNS("http://www.w3.org/2000/svg",e):"mathml"===t?lw.createElementNS("http://www.w3.org/1998/Math/MathML",e):n?lw.createElement(e,{is:n}):lw.createElement(e);return"select"===e&&l&&null!=l.multiple&&r.setAttribute("multiple",l.multiple),r},createText:e=>lw.createTextNode(e),createComment:e=>lw.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>lw.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,l,r,i){let s=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),r!==i&&(r=r.nextSibling););else{lk.innerHTML=lS("svg"===l?`${e}`:"mathml"===l?`${e}`:e);let r=lk.content;if("svg"===l||"mathml"===l){let e=r.firstChild;for(;e.firstChild;)r.appendChild(e.firstChild);r.removeChild(e)}t.insertBefore(r,n)}return[s?s.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}}),lB=(...e)=>{let t=(o||(o=function(e,t){let n;z().__VUE__=!0;let{insert:l,remove:r,patchProp:i,createElement:s,createText:o,createComment:a,setText:u,setElementText:c,parentNode:h,nextSibling:g,setScopeId:m=d,insertStaticContent:y}=e,b=(e,t,n,l=null,r=null,i=null,s,o=null,a=!!t.dynamicChildren)=>{if(e===t)return;e&&!n4(e,t)&&(l=et(e),Z(e,r,i,!0),e=null),-2===t.patchFlag&&(a=!1,t.dynamicChildren=null);let{type:u,ref:c,shapeFlag:f}=t;switch(u){case nY:w(e,t,n,l);break;case n0:k(e,t,n,l);break;case n1:null==e&&C(t,n,l,s);break;case nQ:I(e,t,n,l,r,i,s,o,a);break;default:1&f?O(e,t,n,l,r,i,s,o,a):6&f?N(e,t,n,l,r,i,s,o,a):64&f?u.process(e,t,n,l,r,i,s,o,a,er):128&f&&u.process(e,t,n,l,r,i,s,o,a,er)}null!=c&&r?tJ(c,e&&e.ref,i,t||e,!t):null==c&&e&&null!=e.ref&&tJ(e.ref,null,i,e,!0)},w=(e,t,n,r)=>{if(null==e)l(t.el=o(t.children),n,r);else{let n=t.el=e.el;t.children!==e.children&&u(n,t.children)}},k=(e,t,n,r)=>{null==e?l(t.el=a(t.children||""),n,r):t.el=e.el},C=(e,t,n,l)=>{[e.el,e.anchor]=y(e.children,t,n,l,e.el,e.anchor)},O=(e,t,n,l,r,i,s,o,a)=>{"svg"===t.type?s="svg":"math"===t.type&&(s="mathml"),null==e?R(t,n,l,r,i,s,o,a):A(e,t,r,i,s,o,a)},R=(e,t,n,r,o,a,u,f)=>{var p,d;let h,g,{props:m,shapeFlag:_,transition:y,dirs:b}=e;if(h=e.el=s(e.type,a,m&&m.is,m),8&_?c(h,e.children):16&_&&E(e.children,h,null,r,o,nF(e,a),u,f),b&&tB(e,null,r,"created"),P(h,e,e.scopeId,u,r),m){for(let e in m)"value"===e||D(e)||i(h,e,null,m[e],a,r);"value"in m&&i(h,"value",null,m.value,a),(g=m.onVnodeBeforeMount)&&lr(g,r,e)}b&&tB(e,null,r,"beforeMount");let x=(p=o,d=y,(!p||p&&!p.pendingBranch)&&d&&!d.persisted);x&&y.beforeEnter(h),l(h,t,n),((g=m&&m.onVnodeMounted)||x||b)&&nN(()=>{g&&lr(g,r,e),x&&y.enter(h),b&&tB(e,null,r,"mounted")},o)},P=(e,t,n,l,r)=>{if(n&&m(e,n),l)for(let t=0;t{for(let u=a;u{let a,u=t.el=e.el,{patchFlag:p,dynamicChildren:d,dirs:h}=t;p|=16&e.patchFlag;let g=e.props||f,m=t.props||f;if(n&&nL(n,!1),(a=m.onVnodeBeforeUpdate)&&lr(a,n,t,e),h&&tB(t,e,n,"beforeUpdate"),n&&nL(n,!0),(g.innerHTML&&null==m.innerHTML||g.textContent&&null==m.textContent)&&c(u,""),d?$(e.dynamicChildren,d,u,n,l,nF(t,r),s):o||q(e,t,u,null,n,l,nF(t,r),s,!1),p>0){if(16&p)j(u,g,m,n,r);else if(2&p&&g.class!==m.class&&i(u,"class",null,m.class,r),4&p&&i(u,"style",g.style,m.style,r),8&p){let e=t.dynamicProps;for(let t=0;t{a&&lr(a,n,t,e),h&&tB(t,e,n,"updated")},l)},$=(e,t,n,l,r,i,s)=>{for(let o=0;o{if(t!==n){if(t!==f)for(let s in t)D(s)||s in n||i(e,s,t[s],null,r,l);for(let s in n){if(D(s))continue;let o=n[s],a=t[s];o!==a&&"value"!==s&&i(e,s,a,o,r,l)}"value"in n&&i(e,"value",t.value,n.value,r)}},I=(e,t,n,r,i,s,a,u,c)=>{let f=t.el=e?e.el:o(""),p=t.anchor=e?e.anchor:o(""),{patchFlag:d,dynamicChildren:h,slotScopeIds:g}=t;g&&(u=u?u.concat(g):g),null==e?(l(f,n,r),l(p,n,r),E(t.children||[],n,p,i,s,a,u,c)):d>0&&64&d&&h&&e.dynamicChildren?($(e.dynamicChildren,h,n,i,s,a,u),(null!=t.key||i&&t===i.subTree)&&function e(t,n,l=!1){let r=t.children,i=n.children;if(S(r)&&S(i))for(let t=0;t{t.slotScopeIds=o,null==e?512&t.shapeFlag?r.ctx.activate(t,n,l,s,a):L(t,n,l,r,i,s,a):W(e,t,a)},L=(e,t,n,l,r,i,s)=>{let o=e.component=lo(e,l,r);if(tQ(e)&&(o.ctx.renderer=er),lh(o,!1,s),o.asyncDep){if(r&&r.registerDep(o,U,s),!e.el){let l=o.subTree=n9(n0);k(null,l,t,n),e.placeholder=l.el}}else U(o,e,t,n,r,i,s)},W=(e,t,n)=>{let l=t.component=e.component;if(function(e,t,n){let{props:l,children:r,component:i}=e,{props:s,children:o,patchFlag:a}=t,u=i.emitsOptions;if(t.dirs||t.transition)return!0;if(!n||!(a>=0))return(!!r||!!o)&&(!o||!o.$stable)||l!==s&&(l?!s||nX(l,s,u):!!s);if(1024&a)return!0;if(16&a)return l?nX(l,s,u):!!s;if(8&a){let e=t.dynamicProps;for(let t=0;t{let o=()=>{if(e.isMounted){let t,{next:n,bu:l,u:a,parent:u,vnode:c}=e;{let t=function e(t){let n=t.subTree.component;if(n)if(n.asyncDep&&!n.asyncResolved)return n;else return e(n)}(e);if(t){n&&(n.el=c.el,B(e,n,s)),t.asyncDep.then(()=>{e.isUnmounted||o()});return}}let f=n;nL(e,!1),n?(n.el=c.el,B(e,n,s)):n=c,l&&H(l),(t=n.props&&n.props.onVnodeBeforeUpdate)&&lr(t,u,n,c),nL(e,!0);let p=nK(e),d=e.subTree;e.subTree=p,b(d,p,h(d.el),et(d),e,r,i),n.el=p.el,null===f&&function({vnode:e,parent:t},n){for(;t;){let l=t.subTree;if(l.suspense&&l.suspense.activeBranch===e&&(l.el=e.el),l===e)(e=t.vnode).el=n,t=t.parent;else break}}(e,p.el),a&&nN(a,r),(t=n.props&&n.props.onVnodeUpdated)&&nN(()=>lr(t,u,n,c),r)}else{let s,{props:o}=t,{bm:a,m:u,parent:c,root:f,type:p}=e,d=tX(t);nL(e,!1),a&&H(a),!d&&(s=o&&o.onVnodeBeforeMount)&&lr(s,c,t),nL(e,!0);{f.ce&&!1!==f.ce._def.shadowRoot&&f.ce._injectChildStyle(p);let s=e.subTree=nK(e);b(null,s,n,l,e,r,i),t.el=s.el}if(u&&nN(u,r),!d&&(s=o&&o.onVnodeMounted)){let e=t;nN(()=>lr(s,c,e),r)}(256&t.shapeFlag||c&&tX(c.vnode)&&256&c.vnode.shapeFlag)&&e.a&&nN(e.a,r),e.isMounted=!0,t=n=l=null}};e.scope.on();let a=e.effect=new eb(o);e.scope.off();let u=e.update=a.run.bind(a),c=e.job=a.runIfDirty.bind(a);c.i=e,c.id=e.uid,a.scheduler=()=>tD(c),nL(e,!0),u()},B=(e,t,n)=>{t.component=e;let l=e.vnode.props;e.vnode=t,e.next=null,function(e,t,n,l){let{props:r,attrs:i,vnode:{patchFlag:s}}=e,o=th(r),[a]=e.propsOptions,u=!1;if((l||s>0)&&!(16&s)){if(8&s){let n=e.vnode.dynamicProps;for(let l=0;l{let{vnode:l,slots:r}=e,i=!0,s=f;if(32&l.shapeFlag){let e=t._;e?n&&1===e?i=!1:nI(r,t,n):(i=!t.$stable,nj(t,r)),s=t}else t&&(nD(e,t),s={default:1});if(i)for(let e in r)nE(e)||null!=s[e]||delete r[e]})(e,t.children,n),eE(),tN(e),eA()},q=(e,t,n,l,r,i,s,o,a=!1)=>{let u=e&&e.children,f=e?e.shapeFlag:0,p=t.children,{patchFlag:d,shapeFlag:h}=t;if(d>0){if(128&d)return void K(u,p,n,l,r,i,s,o,a);else if(256&d)return void G(u,p,n,l,r,i,s,o,a)}8&h?(16&f&&ee(u,r,i),p!==u&&c(n,p)):16&f?16&h?K(u,p,n,l,r,i,s,o,a):ee(u,r,i,!0):(8&f&&c(n,""),16&h&&E(p,n,l,r,i,s,o,a))},G=(e,t,n,l,r,i,s,o,a)=>{let u;e=e||p,t=t||p;let c=e.length,f=t.length,d=Math.min(c,f);for(u=0;uf?ee(e,r,i,!0,!1,d):E(t,n,l,r,i,s,o,a,d)},K=(e,t,n,l,r,i,s,o,a)=>{let u=0,c=t.length,f=e.length-1,d=c-1;for(;u<=f&&u<=d;){let l=e[u],c=t[u]=a?lt(t[u]):le(t[u]);if(n4(l,c))b(l,c,n,null,r,i,s,o,a);else break;u++}for(;u<=f&&u<=d;){let l=e[f],u=t[d]=a?lt(t[d]):le(t[d]);if(n4(l,u))b(l,u,n,null,r,i,s,o,a);else break;f--,d--}if(u>f){if(u<=d){let e=d+1,f=ed)for(;u<=f;)Z(e[u],r,i,!0),u++;else{let h,g=u,m=u,_=new Map;for(u=m;u<=d;u++){let e=t[u]=a?lt(t[u]):le(t[u]);null!=e.key&&_.set(e.key,u)}let y=0,x=d-m+1,S=!1,w=0,k=Array(x);for(u=0;u=x){Z(c,r,i,!0);continue}if(null!=c.key)l=_.get(c.key);else for(h=m;h<=d;h++)if(0===k[h-m]&&n4(c,t[h])){l=h;break}void 0===l?Z(c,r,i,!0):(k[l-m]=u+1,l>=w?w=l:S=!0,b(c,t[l],n,null,r,i,s,o,a),y++)}let C=S?function(e){let t,n,l,r,i,s=e.slice(),o=[0],a=e.length;for(t=0;t>1]]0&&(s[t]=o[l-1]),o[l]=t)}}for(l=o.length,r=o[l-1];l-- >0;)o[l]=r,r=s[r];return o}(k):p;for(h=C.length-1,u=x-1;u>=0;u--){let e=m+u,f=t[e],p=t[e+1],d=e+1{let{el:o,type:a,transition:u,children:c,shapeFlag:f}=e;if(6&f)return void J(e.component.subTree,t,n,i);if(128&f)return void e.suspense.move(t,n,i);if(64&f)return void a.move(e,t,n,er);if(a===nQ){l(o,t,n);for(let e=0;e{let i;for(;e&&e!==t;)i=g(e),l(e,n,r),e=i;l(t,n,r)})(e,t,n);if(2!==i&&1&f&&u)if(0===i)u.beforeEnter(o),l(o,t,n),nN(()=>u.enter(o),s);else{let{leave:i,delayLeave:s,afterLeave:a}=u,c=()=>{e.ctx.isUnmounted?r(o):l(o,t,n)},f=()=>{o._isLeaving&&o[tq](!0),i(o,()=>{c(),a&&a()})};s?s(o,c,f):f()}else l(o,t,n)},Z=(e,t,n,l=!1,r=!1)=>{let i,{type:s,props:o,ref:a,children:u,dynamicChildren:c,shapeFlag:f,patchFlag:p,dirs:d,cacheIndex:h}=e;if(-2===p&&(r=!1),null!=a&&(eE(),tJ(a,null,n,e,!0),eA()),null!=h&&(t.renderCache[h]=void 0),256&f)return void t.ctx.deactivate(e);let g=1&f&&d,m=!tX(e);if(m&&(i=o&&o.onVnodeBeforeUnmount)&&lr(i,t,e),6&f)Y(e.component,n,l);else{if(128&f)return void e.suspense.unmount(n,l);g&&tB(e,null,t,"beforeUnmount"),64&f?e.type.remove(e,t,n,er,l):c&&!c.hasOnce&&(s!==nQ||p>0&&64&p)?ee(c,t,n,!1,!0):(s===nQ&&384&p||!r&&16&f)&&ee(u,t,n),l&&X(e)}(m&&(i=o&&o.onVnodeUnmounted)||g)&&nN(()=>{i&&lr(i,t,e),g&&tB(e,null,t,"unmounted")},n)},X=e=>{let{type:t,el:n,anchor:l,transition:i}=e;if(t===nQ)return void Q(n,l);if(t===n1)return void(({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=g(e),r(e),e=n;r(t)})(e);let s=()=>{r(n),i&&!i.persisted&&i.afterLeave&&i.afterLeave()};if(1&e.shapeFlag&&i&&!i.persisted){let{leave:t,delayLeave:l}=i,r=()=>t(n,s);l?l(e.el,s,r):r()}else s()},Q=(e,t)=>{let n;for(;e!==t;)n=g(e),r(e),e=n;r(t)},Y=(e,t,n)=>{let{bum:l,scope:r,job:i,subTree:s,um:o,m:a,a:u}=e;nV(a),nV(u),l&&H(l),r.stop(),i&&(i.flags|=8,Z(s,e,t,n)),o&&nN(o,t),nN(()=>{e.isUnmounted=!0},t)},ee=(e,t,n,l=!1,r=!1,i=0)=>{for(let s=i;s{if(6&e.shapeFlag)return et(e.component.subTree);if(128&e.shapeFlag)return e.suspense.next();let t=g(e.anchor||e.el),n=t&&t[tH];return n?g(n):t},en=!1,el=(e,t,n)=>{null==e?t._vnode&&Z(t._vnode,null,null,!0):b(t._vnode||null,e,t,null,null,null,n),t._vnode=e,en||(en=!0,tN(),tF(),en=!1)},er={p:b,um:Z,m:J,r:X,mt:L,mc:E,pc:q,pbc:$,n:et,o:e};return{render:el,hydrate:n,createApp:function(e,t=null){T(e)||(e=_({},e)),null==t||M(t)||(t=null);let n=nb(),l=new WeakSet,r=[],i=!1,s=n.app={_uid:nx++,_component:e,_props:t,_container:null,_context:n,_instance:null,version:"3.5.22",get config(){return n.config},set config(v){},use:(e,...t)=>(l.has(e)||(e&&T(e.install)?(l.add(e),e.install(s,...t)):T(e)&&(l.add(e),e(s,...t))),s),mixin:e=>(n.mixins.includes(e)||n.mixins.push(e),s),component:(e,t)=>t?(n.components[e]=t,s):n.components[e],directive:(e,t)=>t?(n.directives[e]=t,s):n.directives[e],mount(l,r,o){if(!i){let r=s._ceVNode||n9(e,t);return r.appContext=n,!0===o?o="svg":!1===o&&(o=void 0),el(r,l,o),i=!0,s._container=l,l.__vue_app__=s,l_(r.component)}},onUnmount(e){r.push(e)},unmount(){i&&(tC(r,s._instance,16),el(null,s._container),delete s._container.__vue_app__)},provide:(e,t)=>(n.provides[e]=t,s),runWithContext(e){let t=nS;nS=s;try{return e()}finally{nS=t}}};return s}}}(lU))).createApp(...e),{mount:n}=t;return t.mount=e=>{var l,r;let i=O(l=e)?document.querySelector(l):l;if(!i)return;let s=t._component;T(s)||s.render||s.template||(s.template=i.innerHTML),1===i.nodeType&&(i.textContent="");let o=n(i,!1,(r=i)instanceof SVGElement?"svg":"function"==typeof MathMLElement&&r instanceof MathMLElement?"mathml":void 0);return i instanceof Element&&(i.removeAttribute("v-cloak"),i.setAttribute("data-v-app","")),o},t},lH=!1,lq=c(",key,ref,innerHTML,textContent,ref_key,ref_for");function lG(e,t){let n="";for(let l in e){if(lq(l)||g(l)||"textarea"===t&&"value"===l)continue;let r=e[l];"class"===l?n+=` class="${lJ(r)}"`:"style"===l?n+=` style="${lZ(r)}"`:"className"===l?n+=` class="${String(r)}"`:n+=lz(l,r,t)}return n}function lz(e,t,n){if(!ea(t))return"";let l=n&&(n.indexOf("-")>0||Y(n))?e:eo[e]||e.toLowerCase();return el(l)?er(t)?` ${l}`:"":!function(e){if(es.hasOwnProperty(e))return es[e];let t=ei.test(e);return t&&console.error(`unsafe attribute name: ${e}`),es[e]=!t}(l)?(console.warn(`[@vue/server-renderer] Skipped rendering unsafe attribute name: ${l}`),""):""===t?` ${l}`:` ${l}="${ec(t)}"`}function lK(e,t){return ea(t)?` ${e}="${ec(t)}"`:""}function lJ(e){return ec(Q(e))}function lZ(e){return e?O(e)?ec(e):ec(function(e){if(!e)return"";if(O(e))return e;let t="";for(let n in e){let l=e[n];if(O(l)||"number"==typeof l){let e=n.startsWith("--")?n:V(n);t+=`${e}:${l};`}}return t}(K(function(e){if(!S(e)&&M(e)){let n={};for(let l in e)if(l.startsWith(":--")){var t;n[l.slice(1)]=null==(t=e[l])?"initial":"string"==typeof t?""===t?" ":t:String(t)}else n[l]=e[l];return n}return e}(e)))):""}function lX(e,t=null,n=null,l=null,r){return ra(n9(e,t,n),l,r)}let{ensureValidVNode:lQ}=lb;function lY(e,t,n,l,r,i,s){r("\x3c!--[--\x3e"),l0(e,t,n,l,r,i,s),r("\x3c!--]--\x3e")}function l0(e,t,n,l,r,i,s,o){let a=e[t];if(a){let e=[],t=a(n,t=>{e.push(t)},i,s?" "+s:"");if(S(t)){let e=lQ(t);e?rf(r,e,i,s):l?l():o&&r("\x3c!----\x3e")}else{let t=!0;if(o)t=!1;else for(let n=0;n$/,l2=//gm;function l6(e,t,n,l,r){let i;e("\x3c!--teleport start--\x3e");let s=r.appContext.provides[nW],o=s.__teleportBuffers||(s.__teleportBuffers={}),a=o[n]||(o[n]=[]),u=a.length;if(l)t(e),i="\x3c!--teleport start anchor--\x3e\x3c!--teleport anchor--\x3e";else{let{getBuffer:e,push:n}=ro();n("\x3c!--teleport start anchor--\x3e"),t(n),n("\x3c!--teleport anchor--\x3e"),i=e()}a.splice(u,0,i),e("\x3c!--teleport end--\x3e")}function l8(e){return ec(ev(e))}function l4(e,t){if(S(e)||O(e))for(let n=0,l=e.length;n-1}function re(e,t,n){switch(e){case"radio":return ep(t,n)?" checked":"";case"checkbox":return(S(t)?l7(t,n):t)?" checked":"";default:return lK("value",t)}}function rt(e={},t){let{type:n,value:l}=e;switch(n){case"radio":return ep(t,l)?{checked:!0}:null;case"checkbox":return(S(t)?l7(t,l):t)?{checked:!0}:null;default:return{value:t}}}let{createComponentInstance:rn,setCurrentRenderingInstance:rl,setupComponent:rr,renderComponentRoot:ri,normalizeVNode:rs}=lb;function ro(){let e=!1,t=[];return{getBuffer:()=>t,push(n){let l=O(n);if(e&&l){t[t.length-1]+=n;return}t.push(n),e=l,(P(n)||S(n)&&n.hasAsync)&&(t.hasAsync=!0)}}}function ra(e,t=null,n){let l=e.component=rn(e,t,null),r=rr(l,!0),i=P(r),s=l.sp;return i||s?Promise.resolve(r).then(()=>{if(i&&(s=l.sp),s)return Promise.all(s.map(e=>e.call(l.proxy)))}).catch(d).then(()=>ru(l,n)):ru(l,n)}function ru(e,t){let n=e.type,{getBuffer:l,push:r}=ro();if(T(n)){let l=ri(e);if(!n.props)for(let t in e.attrs)t.startsWith("data-v-")&&((l.props||(l.props={}))[t]="");rc(r,e.subTree=l,e,t)}else{(!e.render||e.render===d)&&!e.ssrRender&&!n.ssrRender&&O(n.template)&&(n.ssrRender=function(e,t){throw Error("On-the-fly template compilation is not supported in the ESM build of @vue/server-renderer. All templates must be pre-compiled into render functions.")}(n.template));let l=e.ssrRender||n.ssrRender;if(l){let n=!1!==e.inheritAttrs?e.attrs:void 0,i=!1,s=e;for(;;){let e=s.vnode.scopeId;e&&(i||(n={...n},i=!0),n[e]="");let t=s.parent;if(t&&t.subTree&&t.subTree===s.vnode)s=t;else break}if(t){i||(n={...n});let e=t.trim().split(" ");for(let t=0;t`:"\x3c!----\x3e");break;case n1:e(s);break;case nQ:t.slotScopeIds&&(l=(l?l+" ":"")+t.slotScopeIds.join(" ")),e("\x3c!--[--\x3e"),rf(e,s,n,l),e("\x3c!--]--\x3e");break;default:1&i?function(e,t,n,l){let r=t.type,{props:i,children:s,shapeFlag:o,scopeId:a}=t,u=`<${r}`;i&&(u+=lG(i,r)),a&&(u+=` ${a}`);let c=n,f=t;for(;c&&f===c.subTree;)(f=c.vnode).scopeId&&(u+=` ${f.scopeId}`),c=c.parent;if(l&&(u+=` ${l}`),e(u+">"),!ee(r)){let t=!1;i&&(i.innerHTML?(t=!0,e(i.innerHTML)):i.textContent?(t=!0,e(ec(i.textContent))):"textarea"===r&&i.value&&(t=!0,e(ec(i.value)))),!t&&(8&o?e(ec(s)):16&o&&rf(e,s,n,l)),e(``)}}(e,t,n,l):6&i?e(ra(t,n,l)):64&i?function(e,t,n,l){let r=t.props&&t.props.to,i=t.props&&t.props.disabled;if(r&&O(r))l6(e,e=>{rf(e,t.children,n,l)},r,i||""===i,n)}(e,t,n,l):128&i&&rc(e,t.ssContent,n,l)}}function rf(e,t,n,l){for(let r=0;r(t[n]=l,e(t,r,n)));let i=e(l,r,0);if(P(i))return i.then(l=>(t[n]=l,e(t,"",n)));r=i}return r}(e,"",0)}async function rh(e,t={}){if(rp(e))return rh(lB({render:()=>e}),t);let n=n9(e._component,e._props);n.appContext=e._context,e.provide(nW,t);let l=await ra(n),r=await rd(l);if(await rv(t),t.__watcherHandles)for(let e of t.__watcherHandles)e();return r}async function rv(e){if(e.__teleportBuffers)for(let t in e.teleports=e.teleports||{},e.__teleportBuffers)e.teleports[t]=await rd(await Promise.all([e.__teleportBuffers[t]]))}let{isVNode:rg}=lb;async function rm(e,t){if(e.hasAsync)for(let n=0;ne}),t,n);let l=n9(e._component,e._props);return l.appContext=e._context,e.provide(nW,t),Promise.resolve(ra(l)).then(e=>rm(e,n)).then(()=>rv(t)).then(()=>{if(t.__watcherHandles)for(let e of t.__watcherHandles)e()}).then(()=>n.push(null)).catch(e=>{n.destroy(e)}),n}function ry(e,t={}){return console.warn("[@vue/server-renderer] renderToStream is deprecated - use renderToNodeStream instead."),rb(e,t)}function rb(e,t={}){throw Error("ESM build of renderToStream() does not support renderToNodeStream(). Use pipeToNodeWritable() with an existing Node.js Writable stream instance instead.")}function rx(e,t={},n){r_(e,t,{push(e){null!=e?n.write(e):n.end()},destroy(e){n.destroy(e)}})}function rS(e,t={}){if("function"!=typeof ReadableStream)throw Error("ReadableStream constructor is not available in the global scope. If the target environment does support web streams, consider using pipeToWebWritable() with an existing WritableStream instance instead.");let n=new TextEncoder,l=!1;return new ReadableStream({start(r){r_(e,t,{push(e){l||(null!=e?r.enqueue(n.encode(e)):r.close())},destroy(e){r.error(e)}})},cancel(){l=!0}})}function rw(e,t={},n){let l=n.getWriter(),r=new TextEncoder,i=!1;try{i=P(l.ready)}catch(e){}r_(e,t,{push:async e=>(i&&await l.ready,null!=e)?l.write(r.encode(e)):l.close(),destroy(e){console.log(e),l.close()}})}lH||(lH=!0,({value:e},t)=>{if(S(e)){if(t.props&&ed(e,t.props.value)>-1)return{checked:!0}}else if(k(e)){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}});export{rx as pipeToNodeWritable,rw as pipeToWebWritable,rb as renderToNodeStream,r_ as renderToSimpleStream,ry as renderToStream,rh as renderToString,rS as renderToWebStream,l5 as ssrGetDirectiveProps,rt as ssrGetDynamicModelProps,er as ssrIncludeBooleanAttr,l8 as ssrInterpolate,l7 as ssrLooseContain,l9 as ssrLooseEqual,lK as ssrRenderAttr,lG as ssrRenderAttrs,lJ as ssrRenderClass,lX as ssrRenderComponent,lz as ssrRenderDynamicAttr,re as ssrRenderDynamicModel,l4 as ssrRenderList,lY as ssrRenderSlot,l0 as ssrRenderSlotInner,lZ as ssrRenderStyle,l3 as ssrRenderSuspense,l6 as ssrRenderTeleport,rc as ssrRenderVNode}; diff --git a/node_modules/@vue/server-renderer/dist/server-renderer.esm-bundler.js b/node_modules/@vue/server-renderer/dist/server-renderer.esm-bundler.js index 2f557833..874f2fea 100644 --- a/node_modules/@vue/server-renderer/dist/server-renderer.esm-bundler.js +++ b/node_modules/@vue/server-renderer/dist/server-renderer.esm-bundler.js @@ -1,5 +1,5 @@ /** -* @vue/server-renderer v3.5.18 +* @vue/server-renderer v3.5.22 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/ @@ -469,7 +469,7 @@ function setDevtoolsHook(hook, target) { !!(process.env.NODE_ENV !== "production") ? { } : { }; -const classifyRE = /(?:^|[-_])(\w)/g; +const classifyRE = /(?:^|[-_])\w/g; const classify = (str) => str.replace(classifyRE, (c) => c.toUpperCase()).replace(/[-_]/g, ""); function getComponentName(Component, includeInferred = true) { return isFunction(Component) ? Component.displayName || Component.name : Component.name || includeInferred && Component.__name; diff --git a/node_modules/@vue/server-renderer/package.json b/node_modules/@vue/server-renderer/package.json index 8af30d2b..faaf3a08 100644 --- a/node_modules/@vue/server-renderer/package.json +++ b/node_modules/@vue/server-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@vue/server-renderer", - "version": "3.5.18", + "version": "3.5.22", "description": "@vue/server-renderer", "main": "index.js", "module": "dist/server-renderer.esm-bundler.js", @@ -46,10 +46,10 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/server-renderer#readme", "peerDependencies": { - "vue": "3.5.18" + "vue": "3.5.22" }, "dependencies": { - "@vue/shared": "3.5.18", - "@vue/compiler-ssr": "3.5.18" + "@vue/shared": "3.5.22", + "@vue/compiler-ssr": "3.5.22" } } \ No newline at end of file diff --git a/node_modules/@vue/shared/dist/shared.cjs.js b/node_modules/@vue/shared/dist/shared.cjs.js index e9cef511..7e6c0694 100644 --- a/node_modules/@vue/shared/dist/shared.cjs.js +++ b/node_modules/@vue/shared/dist/shared.cjs.js @@ -1,5 +1,5 @@ /** -* @vue/shared v3.5.18 +* @vue/shared v3.5.22 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/ @@ -7,7 +7,6 @@ Object.defineProperty(exports, '__esModule', { value: true }); -/*! #__NO_SIDE_EFFECTS__ */ // @__NO_SIDE_EFFECTS__ function makeMap(str) { const map = /* @__PURE__ */ Object.create(null); @@ -60,15 +59,15 @@ const isBuiltInDirective = /* @__PURE__ */ makeMap( ); const cacheStringFunction = (fn) => { const cache = /* @__PURE__ */ Object.create(null); - return (str) => { + return ((str) => { const hit = cache[str]; return hit || (cache[str] = fn(str)); - }; + }); }; -const camelizeRE = /-(\w)/g; +const camelizeRE = /-\w/g; const camelize = cacheStringFunction( (str) => { - return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : ""); + return str.replace(camelizeRE, (c) => c.slice(1).toUpperCase()); } ); const hyphenateRE = /\B([A-Z])/g; diff --git a/node_modules/@vue/shared/dist/shared.cjs.prod.js b/node_modules/@vue/shared/dist/shared.cjs.prod.js index 2db5858b..89dc5438 100644 --- a/node_modules/@vue/shared/dist/shared.cjs.prod.js +++ b/node_modules/@vue/shared/dist/shared.cjs.prod.js @@ -1,5 +1,5 @@ /** -* @vue/shared v3.5.18 +* @vue/shared v3.5.22 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/ @@ -7,7 +7,6 @@ Object.defineProperty(exports, '__esModule', { value: true }); -/*! #__NO_SIDE_EFFECTS__ */ // @__NO_SIDE_EFFECTS__ function makeMap(str) { const map = /* @__PURE__ */ Object.create(null); @@ -60,15 +59,15 @@ const isBuiltInDirective = /* @__PURE__ */ makeMap( ); const cacheStringFunction = (fn) => { const cache = /* @__PURE__ */ Object.create(null); - return (str) => { + return ((str) => { const hit = cache[str]; return hit || (cache[str] = fn(str)); - }; + }); }; -const camelizeRE = /-(\w)/g; +const camelizeRE = /-\w/g; const camelize = cacheStringFunction( (str) => { - return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : ""); + return str.replace(camelizeRE, (c) => c.slice(1).toUpperCase()); } ); const hyphenateRE = /\B([A-Z])/g; diff --git a/node_modules/@vue/shared/dist/shared.d.ts b/node_modules/@vue/shared/dist/shared.d.ts index e1cc6ec6..9b1ec018 100644 --- a/node_modules/@vue/shared/dist/shared.d.ts +++ b/node_modules/@vue/shared/dist/shared.d.ts @@ -5,7 +5,6 @@ * \/\*#\_\_PURE\_\_\*\/ * So that rollup can tree-shake them if necessary. */ -/*! #__NO_SIDE_EFFECTS__ */ export declare function makeMap(str: string): (key: string) => boolean; export declare const EMPTY_OBJ: { diff --git a/node_modules/@vue/shared/dist/shared.esm-bundler.js b/node_modules/@vue/shared/dist/shared.esm-bundler.js index ae4886db..e01903de 100644 --- a/node_modules/@vue/shared/dist/shared.esm-bundler.js +++ b/node_modules/@vue/shared/dist/shared.esm-bundler.js @@ -1,9 +1,8 @@ /** -* @vue/shared v3.5.18 +* @vue/shared v3.5.22 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/ -/*! #__NO_SIDE_EFFECTS__ */ // @__NO_SIDE_EFFECTS__ function makeMap(str) { const map = /* @__PURE__ */ Object.create(null); @@ -56,15 +55,15 @@ const isBuiltInDirective = /* @__PURE__ */ makeMap( ); const cacheStringFunction = (fn) => { const cache = /* @__PURE__ */ Object.create(null); - return (str) => { + return ((str) => { const hit = cache[str]; return hit || (cache[str] = fn(str)); - }; + }); }; -const camelizeRE = /-(\w)/g; +const camelizeRE = /-\w/g; const camelize = cacheStringFunction( (str) => { - return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : ""); + return str.replace(camelizeRE, (c) => c.slice(1).toUpperCase()); } ); const hyphenateRE = /\B([A-Z])/g; diff --git a/node_modules/@vue/shared/package.json b/node_modules/@vue/shared/package.json index 3196e715..57bf26d6 100644 --- a/node_modules/@vue/shared/package.json +++ b/node_modules/@vue/shared/package.json @@ -1,6 +1,6 @@ { "name": "@vue/shared", - "version": "3.5.18", + "version": "3.5.22", "description": "internal utils shared across @vue packages", "main": "index.js", "module": "dist/shared.esm-bundler.js", diff --git a/node_modules/magic-string/README.md b/node_modules/magic-string/README.md index b2e9f9a1..f849ba61 100644 --- a/node_modules/magic-string/README.md +++ b/node_modules/magic-string/README.md @@ -28,7 +28,7 @@ npm i magic-string To use in browser, grab the [magic-string.umd.js](https://unpkg.com/magic-string/dist/magic-string.umd.js) file and add it to your page: ```html - + ``` (It also works with various module systems, if you prefer that sort of thing - it has a dependency on [vlq](https://github.com/Rich-Harris/vlq).) @@ -39,7 +39,7 @@ These examples assume you're in node.js, or something similar: ```js import MagicString from 'magic-string'; -import fs from 'fs'; +import fs from 'fs' const s = new MagicString('problems = 99'); @@ -53,9 +53,9 @@ s.prepend('var ').append(';'); // most methods are chainable s.toString(); // 'var answer = 42;' const map = s.generateMap({ - source: 'source.js', - file: 'converted.js.map', - includeContent: true, + source: 'source.js', + file: 'converted.js.map', + includeContent: true }); // generates a v3 sourcemap fs.writeFileSync('converted.js', s.toString()); @@ -66,32 +66,14 @@ You can pass an options argument: ```js const s = new MagicString(someCode, { - // these options will be used if you later call `bundle.addSource( s )` - see below - filename: 'foo.js', - indentExclusionRanges: [ - /*...*/ - ], - // mark source as ignore in DevTools, see below #Bundling - ignoreList: false, - // adjust the incoming position - see below - offset: 0, + // these options will be used if you later call `bundle.addSource( s )` - see below + filename: 'foo.js', + indentExclusionRanges: [/*...*/], + // mark source as ignore in DevTools, see below #Bundling + ignoreList: false }); ``` -## Properties - -### s.offset - -Sets the offset property to adjust the incoming position for the following APIs: `slice`, `update`, `overwrite`, `appendLeft`, `prependLeft`, `appendRight`, `prependRight`, `move`, `reset`, and `remove`. - -Example usage: - -```ts -const s = new MagicString('hello world', { offset: 0 }); -s.offset = 6; -s.slice() === 'world'; -``` - ## Methods ### s.addSourcemapLocation( index ) @@ -104,11 +86,11 @@ Appends the specified content to the end of the string. Returns `this`. ### s.appendLeft( index, content ) -Appends the specified `content` at the `index` in the original string. If a range _ending_ with `index` is subsequently moved, the insert will be moved with it. Returns `this`. See also `s.prependLeft(...)`. +Appends the specified `content` at the `index` in the original string. If a range *ending* with `index` is subsequently moved, the insert will be moved with it. Returns `this`. See also `s.prependLeft(...)`. ### s.appendRight( index, content ) -Appends the specified `content` at the `index` in the original string. If a range _starting_ with `index` is subsequently moved, the insert will be moved with it. Returns `this`. See also `s.prependRight(...)`. +Appends the specified `content` at the `index` in the original string. If a range *starting* with `index` is subsequently moved, the insert will be moved with it. Returns `this`. See also `s.prependRight(...)`. ### s.clone() @@ -122,15 +104,15 @@ Generates a sourcemap object with raw mappings in array form, rather than encode Generates a [version 3 sourcemap](https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit). All options are, well, optional: -- `file` - the filename where you plan to write the sourcemap -- `source` - the filename of the file containing the original source -- `includeContent` - whether to include the original content in the map's `sourcesContent` array -- `hires` - whether the mapping should be high-resolution. Hi-res mappings map every single character, meaning (for example) your devtools will always be able to pinpoint the exact location of function calls and so on. With lo-res mappings, devtools may only be able to identify the correct line - but they're quicker to generate and less bulky. You can also set `"boundary"` to generate a semi-hi-res mappings segmented per word boundary instead of per character, suitable for string semantics that are separated by words. If sourcemap locations have been specified with `s.addSourcemapLocation()`, they will be used here. +* `file` - the filename where you plan to write the sourcemap +* `source` - the filename of the file containing the original source +* `includeContent` - whether to include the original content in the map's `sourcesContent` array +* `hires` - whether the mapping should be high-resolution. Hi-res mappings map every single character, meaning (for example) your devtools will always be able to pinpoint the exact location of function calls and so on. With lo-res mappings, devtools may only be able to identify the correct line - but they're quicker to generate and less bulky. You can also set `"boundary"` to generate a semi-hi-res mappings segmented per word boundary instead of per character, suitable for string semantics that are separated by words. If sourcemap locations have been specified with `s.addSourcemapLocation()`, they will be used here. The returned sourcemap has two (non-enumerable) methods attached for convenience: -- `toString` - returns the equivalent of `JSON.stringify(map)` -- `toUrl` - returns a DataURI containing the sourcemap. Useful for doing this sort of thing: +* `toString` - returns the equivalent of `JSON.stringify(map)` +* `toUrl` - returns a DataURI containing the sourcemap. Useful for doing this sort of thing: ```js code += '\n//# sourceMappingURL=' + map.toUrl(); @@ -184,35 +166,34 @@ Prepends the string with the specified content. Returns `this`. ### s.prependLeft ( index, content ) -Same as `s.appendLeft(...)`, except that the inserted content will go _before_ any previous appends or prepends at `index` +Same as `s.appendLeft(...)`, except that the inserted content will go *before* any previous appends or prepends at `index` ### s.prependRight ( index, content ) -Same as `s.appendRight(...)`, except that the inserted content will go _before_ any previous appends or prepends at `index` +Same as `s.appendRight(...)`, except that the inserted content will go *before* any previous appends or prepends at `index` ### s.replace( regexpOrString, substitution ) String replacement with RegExp or string. When using a RegExp, replacer function is also supported. Returns `this`. ```ts -import MagicString from 'magic-string'; +import MagicString from 'magic-string' -const s = new MagicString(source); +const s = new MagicString(source) -s.replace('foo', 'bar'); -s.replace(/foo/g, 'bar'); -s.replace(/(\w)(\d+)/g, (_, $1, $2) => $1.toUpperCase() + $2); +s.replace('foo', 'bar') +s.replace(/foo/g, 'bar') +s.replace(/(\w)(\d+)/g, (_, $1, $2) => $1.toUpperCase() + $2) ``` -The differences from [`String.replace`](<(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace)>): - +The differences from [`String.replace`]((https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace)): - It will always match against the **original string** - It mutates the magic string state (use `.clone()` to be immutable) ### s.replaceAll( regexpOrString, substitution ) Same as `s.replace`, but replace all matched strings instead of just one. -If `regexpOrString` is a regex, then it must have the global (`g`) flag set, or a `TypeError` is thrown. Matches the behavior of the builtin [`String.property.replaceAll`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll). Returns `this`. +If `substitution` is a regex, then it must have the global (`g`) flag set, or a `TypeError` is thrown. Matches the behavior of the builtin [`String.property.replaceAll`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll). ### s.remove( start, end ) @@ -267,32 +248,31 @@ To concatenate several sources, use `MagicString.Bundle`: const bundle = new MagicString.Bundle(); bundle.addSource({ - filename: 'foo.js', - content: new MagicString('var answer = 42;'), + filename: 'foo.js', + content: new MagicString('var answer = 42;') }); bundle.addSource({ - filename: 'bar.js', - content: new MagicString('console.log( answer )'), + filename: 'bar.js', + content: new MagicString('console.log( answer )') }); // Sources can be marked as ignore-listed, which provides a hint to debuggers // to not step into this code and also don't show the source files depending // on user preferences. bundle.addSource({ - filename: 'some-3rdparty-library.js', - content: new MagicString('function myLib(){}'), - ignoreList: false, // <-- -}); + filename: 'some-3rdparty-library.js', + content: new MagicString('function myLib(){}'), + ignoreList: false // <-- +}) // Advanced: a source can include an `indentExclusionRanges` property // alongside `filename` and `content`. This will be passed to `s.indent()` // - see documentation above -bundle - .indent() // optionally, pass an indent string, otherwise it will be guessed - .prepend('(function () {\n') - .append('}());'); +bundle.indent() // optionally, pass an indent string, otherwise it will be guessed + .prepend('(function () {\n') + .append('}());'); bundle.toString(); // (function () { @@ -302,9 +282,9 @@ bundle.toString(); // options are as per `s.generateMap()` above const map = bundle.generateMap({ - file: 'bundle.js', - includeContent: true, - hires: true, + file: 'bundle.js', + includeContent: true, + hires: true }); ``` @@ -313,7 +293,7 @@ As an alternative syntax, if you a) don't have `filename` or `indentExclusionRan ```js const bundle = new MagicString.Bundle(); const source = new MagicString(someCode, { - filename: 'foo.js', + filename: 'foo.js' }); bundle.addSource(source); diff --git a/node_modules/magic-string/dist/magic-string.cjs.d.ts b/node_modules/magic-string/dist/magic-string.cjs.d.ts index 76cc537d..f8540ddb 100644 --- a/node_modules/magic-string/dist/magic-string.cjs.d.ts +++ b/node_modules/magic-string/dist/magic-string.cjs.d.ts @@ -1,289 +1,268 @@ export interface BundleOptions { - intro?: string; - separator?: string; + intro?: string; + separator?: string; } export interface SourceMapOptions { - /** - * Whether the mapping should be high-resolution. - * Hi-res mappings map every single character, meaning (for example) your devtools will always - * be able to pinpoint the exact location of function calls and so on. - * With lo-res mappings, devtools may only be able to identify the correct - * line - but they're quicker to generate and less bulky. - * You can also set `"boundary"` to generate a semi-hi-res mappings segmented per word boundary - * instead of per character, suitable for string semantics that are separated by words. - * If sourcemap locations have been specified with s.addSourceMapLocation(), they will be used here. - */ - hires?: boolean | 'boundary'; - /** - * The filename where you plan to write the sourcemap. - */ - file?: string; - /** - * The filename of the file containing the original source. - */ - source?: string; - /** - * Whether to include the original content in the map's sourcesContent array. - */ - includeContent?: boolean; + /** + * Whether the mapping should be high-resolution. + * Hi-res mappings map every single character, meaning (for example) your devtools will always + * be able to pinpoint the exact location of function calls and so on. + * With lo-res mappings, devtools may only be able to identify the correct + * line - but they're quicker to generate and less bulky. + * You can also set `"boundary"` to generate a semi-hi-res mappings segmented per word boundary + * instead of per character, suitable for string semantics that are separated by words. + * If sourcemap locations have been specified with s.addSourceMapLocation(), they will be used here. + */ + hires?: boolean | 'boundary'; + /** + * The filename where you plan to write the sourcemap. + */ + file?: string; + /** + * The filename of the file containing the original source. + */ + source?: string; + /** + * Whether to include the original content in the map's sourcesContent array. + */ + includeContent?: boolean; } export type SourceMapSegment = - | [number] - | [number, number, number, number] - | [number, number, number, number, number]; + | [number] + | [number, number, number, number] + | [number, number, number, number, number]; export interface DecodedSourceMap { - file: string; - sources: string[]; - sourcesContent?: string[]; - names: string[]; - mappings: SourceMapSegment[][]; - x_google_ignoreList?: number[]; + file: string; + sources: string[]; + sourcesContent?: string[]; + names: string[]; + mappings: SourceMapSegment[][]; + x_google_ignoreList?: number[]; } export class SourceMap { - constructor(properties: DecodedSourceMap); + constructor(properties: DecodedSourceMap); - version: number; - file: string; - sources: string[]; - sourcesContent?: string[]; - names: string[]; - mappings: string; - x_google_ignoreList?: number[]; - debugId?: string; + version: number; + file: string; + sources: string[]; + sourcesContent?: string[]; + names: string[]; + mappings: string; + x_google_ignoreList?: number[]; - /** - * Returns the equivalent of `JSON.stringify(map)` - */ - toString(): string; - /** - * Returns a DataURI containing the sourcemap. Useful for doing this sort of thing: - * `generateMap(options?: SourceMapOptions): SourceMap;` - */ - toUrl(): string; + /** + * Returns the equivalent of `JSON.stringify(map)` + */ + toString(): string; + /** + * Returns a DataURI containing the sourcemap. Useful for doing this sort of thing: + * `generateMap(options?: SourceMapOptions): SourceMap;` + */ + toUrl(): string; } export class Bundle { - constructor(options?: BundleOptions); - /** - * Adds the specified source to the bundle, which can either be a `MagicString` object directly, - * or an options object that holds a magic string `content` property and optionally provides - * a `filename` for the source within the bundle, as well as an optional `ignoreList` hint - * (which defaults to `false`). The `filename` is used when constructing the source map for the - * bundle, to identify this `source` in the source map's `sources` field. The `ignoreList` hint - * is used to populate the `x_google_ignoreList` extension field in the source map, which is a - * mechanism for tools to signal to debuggers that certain sources should be ignored by default - * (depending on user preferences). - */ - addSource( - source: MagicString | { filename?: string; content: MagicString; ignoreList?: boolean }, - ): this; - append(str: string, options?: BundleOptions): this; - clone(): this; - generateMap( - options?: SourceMapOptions, - ): Omit & { sourcesContent: Array }; - generateDecodedMap( - options?: SourceMapOptions, - ): Omit & { sourcesContent: Array }; - getIndentString(): string; - indent(indentStr?: string): this; - indentExclusionRanges: ExclusionRange | Array; - prepend(str: string): this; - toString(): string; - trimLines(): this; - trim(charType?: string): this; - trimStart(charType?: string): this; - trimEnd(charType?: string): this; - isEmpty(): boolean; - length(): number; + constructor(options?: BundleOptions); + /** + * Adds the specified source to the bundle, which can either be a `MagicString` object directly, + * or an options object that holds a magic string `content` property and optionally provides + * a `filename` for the source within the bundle, as well as an optional `ignoreList` hint + * (which defaults to `false`). The `filename` is used when constructing the source map for the + * bundle, to identify this `source` in the source map's `sources` field. The `ignoreList` hint + * is used to populate the `x_google_ignoreList` extension field in the source map, which is a + * mechanism for tools to signal to debuggers that certain sources should be ignored by default + * (depending on user preferences). + */ + addSource(source: MagicString | { filename?: string, content: MagicString, ignoreList?: boolean }): this; + append(str: string, options?: BundleOptions): this; + clone(): this; + generateMap(options?: SourceMapOptions): Omit & { sourcesContent: Array }; + generateDecodedMap(options?: SourceMapOptions): Omit & { sourcesContent: Array }; + getIndentString(): string; + indent(indentStr?: string): this; + indentExclusionRanges: ExclusionRange | Array; + prepend(str: string): this; + toString(): string; + trimLines(): this; + trim(charType?: string): this; + trimStart(charType?: string): this; + trimEnd(charType?: string): this; + isEmpty(): boolean; + length(): number; } -export type ExclusionRange = [number, number]; +export type ExclusionRange = [ number, number ]; export interface MagicStringOptions { - filename?: string; - indentExclusionRanges?: ExclusionRange | Array; - offset?: number; + filename?: string, + indentExclusionRanges?: ExclusionRange | Array; } export interface IndentOptions { - exclude?: ExclusionRange | Array; - indentStart?: boolean; + exclude?: ExclusionRange | Array; + indentStart?: boolean; } export interface OverwriteOptions { - storeName?: boolean; - contentOnly?: boolean; + storeName?: boolean; + contentOnly?: boolean; } export interface UpdateOptions { - storeName?: boolean; - overwrite?: boolean; + storeName?: boolean; + overwrite?: boolean; } export default class MagicString { - constructor(str: string, options?: MagicStringOptions); - /** - * Adds the specified character index (with respect to the original string) to sourcemap mappings, if `hires` is false. - */ - addSourcemapLocation(char: number): void; - /** - * Appends the specified content to the end of the string. - */ - append(content: string): this; - /** - * Appends the specified content at the index in the original string. - * If a range *ending* with index is subsequently moved, the insert will be moved with it. - * See also `s.prependLeft(...)`. - */ - appendLeft(index: number, content: string): this; - /** - * Appends the specified content at the index in the original string. - * If a range *starting* with index is subsequently moved, the insert will be moved with it. - * See also `s.prependRight(...)`. - */ - appendRight(index: number, content: string): this; - /** - * Does what you'd expect. - */ - clone(): this; - /** - * Generates a version 3 sourcemap. - */ - generateMap(options?: SourceMapOptions): SourceMap; - /** - * Generates a sourcemap object with raw mappings in array form, rather than encoded as a string. - * Useful if you need to manipulate the sourcemap further, but most of the time you will use `generateMap` instead. - */ - generateDecodedMap(options?: SourceMapOptions): DecodedSourceMap; - getIndentString(): string; + constructor(str: string, options?: MagicStringOptions); + /** + * Adds the specified character index (with respect to the original string) to sourcemap mappings, if `hires` is false. + */ + addSourcemapLocation(char: number): void; + /** + * Appends the specified content to the end of the string. + */ + append(content: string): this; + /** + * Appends the specified content at the index in the original string. + * If a range *ending* with index is subsequently moved, the insert will be moved with it. + * See also `s.prependLeft(...)`. + */ + appendLeft(index: number, content: string): this; + /** + * Appends the specified content at the index in the original string. + * If a range *starting* with index is subsequently moved, the insert will be moved with it. + * See also `s.prependRight(...)`. + */ + appendRight(index: number, content: string): this; + /** + * Does what you'd expect. + */ + clone(): this; + /** + * Generates a version 3 sourcemap. + */ + generateMap(options?: SourceMapOptions): SourceMap; + /** + * Generates a sourcemap object with raw mappings in array form, rather than encoded as a string. + * Useful if you need to manipulate the sourcemap further, but most of the time you will use `generateMap` instead. + */ + generateDecodedMap(options?: SourceMapOptions): DecodedSourceMap; + getIndentString(): string; - /** - * Prefixes each line of the string with prefix. - * If prefix is not supplied, the indentation will be guessed from the original content, falling back to a single tab character. - */ - indent(options?: IndentOptions): this; - /** - * Prefixes each line of the string with prefix. - * If prefix is not supplied, the indentation will be guessed from the original content, falling back to a single tab character. - * - * The options argument can have an exclude property, which is an array of [start, end] character ranges. - * These ranges will be excluded from the indentation - useful for (e.g.) multiline strings. - */ - indent(indentStr?: string, options?: IndentOptions): this; - indentExclusionRanges: ExclusionRange | Array; + /** + * Prefixes each line of the string with prefix. + * If prefix is not supplied, the indentation will be guessed from the original content, falling back to a single tab character. + */ + indent(options?: IndentOptions): this; + /** + * Prefixes each line of the string with prefix. + * If prefix is not supplied, the indentation will be guessed from the original content, falling back to a single tab character. + * + * The options argument can have an exclude property, which is an array of [start, end] character ranges. + * These ranges will be excluded from the indentation - useful for (e.g.) multiline strings. + */ + indent(indentStr?: string, options?: IndentOptions): this; + indentExclusionRanges: ExclusionRange | Array; - /** - * Moves the characters from `start` and `end` to `index`. - */ - move(start: number, end: number, index: number): this; - /** - * Replaces the characters from `start` to `end` with `content`, along with the appended/prepended content in - * that range. The same restrictions as `s.remove()` apply. - * - * The fourth argument is optional. It can have a storeName property — if true, the original name will be stored - * for later inclusion in a sourcemap's names array — and a contentOnly property which determines whether only - * the content is overwritten, or anything that was appended/prepended to the range as well. - * - * It may be preferred to use `s.update(...)` instead if you wish to avoid overwriting the appended/prepended content. - */ - overwrite( - start: number, - end: number, - content: string, - options?: boolean | OverwriteOptions, - ): this; - /** - * Replaces the characters from `start` to `end` with `content`. The same restrictions as `s.remove()` apply. - * - * The fourth argument is optional. It can have a storeName property — if true, the original name will be stored - * for later inclusion in a sourcemap's names array — and an overwrite property which determines whether only - * the content is overwritten, or anything that was appended/prepended to the range as well. - */ - update(start: number, end: number, content: string, options?: boolean | UpdateOptions): this; - /** - * Prepends the string with the specified content. - */ - prepend(content: string): this; - /** - * Same as `s.appendLeft(...)`, except that the inserted content will go *before* any previous appends or prepends at index - */ - prependLeft(index: number, content: string): this; - /** - * Same as `s.appendRight(...)`, except that the inserted content will go *before* any previous appends or prepends at `index` - */ - prependRight(index: number, content: string): this; - /** - * Removes the characters from `start` to `end` (of the original string, **not** the generated string). - * Removing the same content twice, or making removals that partially overlap, will cause an error. - */ - remove(start: number, end: number): this; - /** - * Reset the modified characters from `start` to `end` (of the original string, **not** the generated string). - */ - reset(start: number, end: number): this; - /** - * Returns the content of the generated string that corresponds to the slice between `start` and `end` of the original string. - * Throws error if the indices are for characters that were already removed. - */ - slice(start: number, end: number): string; - /** - * Returns a clone of `s`, with all content before the `start` and `end` characters of the original string removed. - */ - snip(start: number, end: number): this; - /** - * Trims content matching `charType` (defaults to `\s`, i.e. whitespace) from the start and end. - */ - trim(charType?: string): this; - /** - * Trims content matching `charType` (defaults to `\s`, i.e. whitespace) from the start. - */ - trimStart(charType?: string): this; - /** - * Trims content matching `charType` (defaults to `\s`, i.e. whitespace) from the end. - */ - trimEnd(charType?: string): this; - /** - * Removes empty lines from the start and end. - */ - trimLines(): this; - /** - * String replacement with RegExp or string. - */ - replace( - regex: RegExp | string, - replacement: string | ((substring: string, ...args: any[]) => string), - ): this; - /** - * Same as `s.replace`, but replace all matched strings instead of just one. - */ - replaceAll( - regex: RegExp | string, - replacement: string | ((substring: string, ...args: any[]) => string), - ): this; + /** + * Moves the characters from `start and `end` to `index`. + */ + move(start: number, end: number, index: number): this; + /** + * Replaces the characters from `start` to `end` with `content`, along with the appended/prepended content in + * that range. The same restrictions as `s.remove()` apply. + * + * The fourth argument is optional. It can have a storeName property — if true, the original name will be stored + * for later inclusion in a sourcemap's names array — and a contentOnly property which determines whether only + * the content is overwritten, or anything that was appended/prepended to the range as well. + * + * It may be preferred to use `s.update(...)` instead if you wish to avoid overwriting the appended/prepended content. + */ + overwrite(start: number, end: number, content: string, options?: boolean | OverwriteOptions): this; + /** + * Replaces the characters from `start` to `end` with `content`. The same restrictions as `s.remove()` apply. + * + * The fourth argument is optional. It can have a storeName property — if true, the original name will be stored + * for later inclusion in a sourcemap's names array — and an overwrite property which determines whether only + * the content is overwritten, or anything that was appended/prepended to the range as well. + */ + update(start: number, end: number, content: string, options?: boolean | UpdateOptions): this; + /** + * Prepends the string with the specified content. + */ + prepend(content: string): this; + /** + * Same as `s.appendLeft(...)`, except that the inserted content will go *before* any previous appends or prepends at index + */ + prependLeft(index: number, content: string): this; + /** + * Same as `s.appendRight(...)`, except that the inserted content will go *before* any previous appends or prepends at `index` + */ + prependRight(index: number, content: string): this; + /** + * Removes the characters from `start` to `end` (of the original string, **not** the generated string). + * Removing the same content twice, or making removals that partially overlap, will cause an error. + */ + remove(start: number, end: number): this; + /** + * Reset the modified characters from `start` to `end` (of the original string, **not** the generated string). + */ + reset(start: number, end: number): this; + /** + * Returns the content of the generated string that corresponds to the slice between `start` and `end` of the original string. + * Throws error if the indices are for characters that were already removed. + */ + slice(start: number, end: number): string; + /** + * Returns a clone of `s`, with all content before the `start` and `end` characters of the original string removed. + */ + snip(start: number, end: number): this; + /** + * Trims content matching `charType` (defaults to `\s`, i.e. whitespace) from the start and end. + */ + trim(charType?: string): this; + /** + * Trims content matching `charType` (defaults to `\s`, i.e. whitespace) from the start. + */ + trimStart(charType?: string): this; + /** + * Trims content matching `charType` (defaults to `\s`, i.e. whitespace) from the end. + */ + trimEnd(charType?: string): this; + /** + * Removes empty lines from the start and end. + */ + trimLines(): this; + /** + * String replacement with RegExp or string. + */ + replace(regex: RegExp | string, replacement: string | ((substring: string, ...args: any[]) => string)): this; + /** + * Same as `s.replace`, but replace all matched strings instead of just one. + */ + replaceAll(regex: RegExp | string, replacement: string | ((substring: string, ...args: any[]) => string)): this; - lastChar(): string; - lastLine(): string; - /** - * Returns true if the resulting source is empty (disregarding white space). - */ - isEmpty(): boolean; - length(): number; + lastChar(): string; + lastLine(): string; + /** + * Returns true if the resulting source is empty (disregarding white space). + */ + isEmpty(): boolean; + length(): number; - /** - * Indicates if the string has been changed. - */ - hasChanged(): boolean; + /** + * Indicates if the string has been changed. + */ + hasChanged(): boolean; - original: string; - /** - * Returns the generated string. - */ - toString(): string; - - offset: number; + original: string; + /** + * Returns the generated string. + */ + toString(): string; } diff --git a/node_modules/magic-string/dist/magic-string.cjs.js b/node_modules/magic-string/dist/magic-string.cjs.js index c7453ebc..8d4e1b97 100644 --- a/node_modules/magic-string/dist/magic-string.cjs.js +++ b/node_modules/magic-string/dist/magic-string.cjs.js @@ -127,7 +127,7 @@ class Chunk { // ' test'.trim() // split -> ' ' + 'test' // ✔️ edit -> '' + 'test' - // ✖️ edit -> 'test' + '' + // ✖️ edit -> 'test' + '' // TODO is this block necessary?... newChunk.edit('', false); this.content = ''; @@ -220,9 +220,6 @@ class SourceMap { if (typeof properties.x_google_ignoreList !== 'undefined') { this.x_google_ignoreList = properties.x_google_ignoreList; } - if (typeof properties.debugId !== 'undefined') { - this.debugId = properties.debugId; - } } toString() { @@ -367,6 +364,27 @@ class Mappings { let charInHiresBoundary = false; while (originalCharIndex < chunk.end) { + if (this.hires || first || sourcemapLocations.has(originalCharIndex)) { + const segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column]; + + if (this.hires === 'boundary') { + // in hires "boundary", group segments per word boundary than per char + if (wordRegex.test(original[originalCharIndex])) { + // for first char in the boundary found, start the boundary by pushing a segment + if (!charInHiresBoundary) { + this.rawSegments.push(segment); + charInHiresBoundary = true; + } + } else { + // for non-word char, end the boundary by pushing a segment + this.rawSegments.push(segment); + charInHiresBoundary = false; + } + } else { + this.rawSegments.push(segment); + } + } + if (original[originalCharIndex] === '\n') { loc.line += 1; loc.column = 0; @@ -374,29 +392,7 @@ class Mappings { this.raw[this.generatedCodeLine] = this.rawSegments = []; this.generatedCodeColumn = 0; first = true; - charInHiresBoundary = false; } else { - if (this.hires || first || sourcemapLocations.has(originalCharIndex)) { - const segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column]; - - if (this.hires === 'boundary') { - // in hires "boundary", group segments per word boundary than per char - if (wordRegex.test(original[originalCharIndex])) { - // for first char in the boundary found, start the boundary by pushing a segment - if (!charInHiresBoundary) { - this.rawSegments.push(segment); - charInHiresBoundary = true; - } - } else { - // for non-word char, end the boundary by pushing a segment - this.rawSegments.push(segment); - charInHiresBoundary = false; - } - } else { - this.rawSegments.push(segment); - } - } - loc.column += 1; this.generatedCodeColumn += 1; first = false; @@ -452,7 +448,6 @@ class MagicString { storedNames: { writable: true, value: {} }, indentStr: { writable: true, value: undefined }, ignoreList: { writable: true, value: options.ignoreList }, - offset: { writable: true, value: options.offset || 0 }, }); this.byStart[0] = chunk; @@ -471,8 +466,6 @@ class MagicString { } appendLeft(index, content) { - index = index + this.offset; - if (typeof content !== 'string') throw new TypeError('inserted content must be a string'); this._split(index); @@ -488,8 +481,6 @@ class MagicString { } appendRight(index, content) { - index = index + this.offset; - if (typeof content !== 'string') throw new TypeError('inserted content must be a string'); this._split(index); @@ -505,7 +496,7 @@ class MagicString { } clone() { - const cloned = new MagicString(this.original, { filename: this.filename, offset: this.offset }); + const cloned = new MagicString(this.original, { filename: this.filename }); let originalChunk = this.firstChunk; let clonedChunk = (cloned.firstChunk = cloned.lastSearchedChunk = originalChunk.clone()); @@ -703,7 +694,7 @@ class MagicString { if (!warned.insertLeft) { console.warn( 'magicString.insertLeft(...) is deprecated. Use magicString.appendLeft(...) instead', - ); + ); // eslint-disable-line no-console warned.insertLeft = true; } @@ -714,7 +705,7 @@ class MagicString { if (!warned.insertRight) { console.warn( 'magicString.insertRight(...) is deprecated. Use magicString.prependRight(...) instead', - ); + ); // eslint-disable-line no-console warned.insertRight = true; } @@ -722,10 +713,6 @@ class MagicString { } move(start, end, index) { - start = start + this.offset; - end = end + this.offset; - index = index + this.offset; - if (index >= start && index <= end) throw new Error('Cannot move a selection inside itself'); this._split(start); @@ -768,9 +755,6 @@ class MagicString { } update(start, end, content, options) { - start = start + this.offset; - end = end + this.offset; - if (typeof content !== 'string') throw new TypeError('replacement content must be a string'); if (this.original.length !== 0) { @@ -791,7 +775,7 @@ class MagicString { if (!warned.storeName) { console.warn( 'The final argument to magicString.overwrite(...) should be an options object. See https://github.com/rich-harris/magic-string', - ); + ); // eslint-disable-line no-console warned.storeName = true; } @@ -842,8 +826,6 @@ class MagicString { } prependLeft(index, content) { - index = index + this.offset; - if (typeof content !== 'string') throw new TypeError('inserted content must be a string'); this._split(index); @@ -859,8 +841,6 @@ class MagicString { } prependRight(index, content) { - index = index + this.offset; - if (typeof content !== 'string') throw new TypeError('inserted content must be a string'); this._split(index); @@ -876,9 +856,6 @@ class MagicString { } remove(start, end) { - start = start + this.offset; - end = end + this.offset; - if (this.original.length !== 0) { while (start < 0) start += this.original.length; while (end < 0) end += this.original.length; @@ -905,9 +882,6 @@ class MagicString { } reset(start, end) { - start = start + this.offset; - end = end + this.offset; - if (this.original.length !== 0) { while (start < 0) start += this.original.length; while (end < 0) end += this.original.length; @@ -972,10 +946,7 @@ class MagicString { return this.intro + lineStr; } - slice(start = 0, end = this.original.length - this.offset) { - start = start + this.offset; - end = end + this.offset; - + slice(start = 0, end = this.original.length) { if (this.original.length !== 0) { while (start < 0) start += this.original.length; while (end < 0) end += this.original.length; @@ -1211,7 +1182,11 @@ class MagicString { if (match.index != null) { const replacement = getReplacement(match, this.original); if (replacement !== match[0]) { - this.overwrite(match.index, match.index + match[0].length, replacement); + this.overwrite( + match.index, + match.index + match[0].length, + replacement + ); } } }); @@ -1220,7 +1195,11 @@ class MagicString { if (match && match.index != null) { const replacement = getReplacement(match, this.original); if (replacement !== match[0]) { - this.overwrite(match.index, match.index + match[0].length, replacement); + this.overwrite( + match.index, + match.index + match[0].length, + replacement + ); } } } @@ -1255,7 +1234,8 @@ class MagicString { index = original.indexOf(string, index + stringLength) ) { const previous = original.slice(index, index + stringLength); - if (previous !== replacement) this.overwrite(index, index + stringLength, replacement); + if (previous !== replacement) + this.overwrite(index, index + stringLength, replacement); } return this; diff --git a/node_modules/magic-string/dist/magic-string.cjs.js.map b/node_modules/magic-string/dist/magic-string.cjs.js.map index e8df93fc..dafb64be 100644 --- a/node_modules/magic-string/dist/magic-string.cjs.js.map +++ b/node_modules/magic-string/dist/magic-string.cjs.js.map @@ -1 +1 @@ -{"version":3,"file":"magic-string.cjs.js","sources":["../src/BitSet.js","../src/Chunk.js","../src/SourceMap.js","../src/utils/guessIndent.js","../src/utils/getRelativePath.js","../src/utils/isObject.js","../src/utils/getLocator.js","../src/utils/Mappings.js","../src/MagicString.js","../src/Bundle.js","../src/index-legacy.js"],"sourcesContent":["export default class BitSet {\n\tconstructor(arg) {\n\t\tthis.bits = arg instanceof BitSet ? arg.bits.slice() : [];\n\t}\n\n\tadd(n) {\n\t\tthis.bits[n >> 5] |= 1 << (n & 31);\n\t}\n\n\thas(n) {\n\t\treturn !!(this.bits[n >> 5] & (1 << (n & 31)));\n\t}\n}\n","export default class Chunk {\n\tconstructor(start, end, content) {\n\t\tthis.start = start;\n\t\tthis.end = end;\n\t\tthis.original = content;\n\n\t\tthis.intro = '';\n\t\tthis.outro = '';\n\n\t\tthis.content = content;\n\t\tthis.storeName = false;\n\t\tthis.edited = false;\n\n\t\tif (DEBUG) {\n\t\t\t// we make these non-enumerable, for sanity while debugging\n\t\t\tObject.defineProperties(this, {\n\t\t\t\tprevious: { writable: true, value: null },\n\t\t\t\tnext: { writable: true, value: null },\n\t\t\t});\n\t\t} else {\n\t\t\tthis.previous = null;\n\t\t\tthis.next = null;\n\t\t}\n\t}\n\n\tappendLeft(content) {\n\t\tthis.outro += content;\n\t}\n\n\tappendRight(content) {\n\t\tthis.intro = this.intro + content;\n\t}\n\n\tclone() {\n\t\tconst chunk = new Chunk(this.start, this.end, this.original);\n\n\t\tchunk.intro = this.intro;\n\t\tchunk.outro = this.outro;\n\t\tchunk.content = this.content;\n\t\tchunk.storeName = this.storeName;\n\t\tchunk.edited = this.edited;\n\n\t\treturn chunk;\n\t}\n\n\tcontains(index) {\n\t\treturn this.start < index && index < this.end;\n\t}\n\n\teachNext(fn) {\n\t\tlet chunk = this;\n\t\twhile (chunk) {\n\t\t\tfn(chunk);\n\t\t\tchunk = chunk.next;\n\t\t}\n\t}\n\n\teachPrevious(fn) {\n\t\tlet chunk = this;\n\t\twhile (chunk) {\n\t\t\tfn(chunk);\n\t\t\tchunk = chunk.previous;\n\t\t}\n\t}\n\n\tedit(content, storeName, contentOnly) {\n\t\tthis.content = content;\n\t\tif (!contentOnly) {\n\t\t\tthis.intro = '';\n\t\t\tthis.outro = '';\n\t\t}\n\t\tthis.storeName = storeName;\n\n\t\tthis.edited = true;\n\n\t\treturn this;\n\t}\n\n\tprependLeft(content) {\n\t\tthis.outro = content + this.outro;\n\t}\n\n\tprependRight(content) {\n\t\tthis.intro = content + this.intro;\n\t}\n\n\treset() {\n\t\tthis.intro = '';\n\t\tthis.outro = '';\n\t\tif (this.edited) {\n\t\t\tthis.content = this.original;\n\t\t\tthis.storeName = false;\n\t\t\tthis.edited = false;\n\t\t}\n\t}\n\n\tsplit(index) {\n\t\tconst sliceIndex = index - this.start;\n\n\t\tconst originalBefore = this.original.slice(0, sliceIndex);\n\t\tconst originalAfter = this.original.slice(sliceIndex);\n\n\t\tthis.original = originalBefore;\n\n\t\tconst newChunk = new Chunk(index, this.end, originalAfter);\n\t\tnewChunk.outro = this.outro;\n\t\tthis.outro = '';\n\n\t\tthis.end = index;\n\n\t\tif (this.edited) {\n\t\t\t// after split we should save the edit content record into the correct chunk\n\t\t\t// to make sure sourcemap correct\n\t\t\t// For example:\n\t\t\t// ' test'.trim()\n\t\t\t// split -> ' ' + 'test'\n\t\t\t// ✔️ edit -> '' + 'test'\n\t\t\t// ✖️ edit -> 'test' + ''\n\t\t\t// TODO is this block necessary?...\n\t\t\tnewChunk.edit('', false);\n\t\t\tthis.content = '';\n\t\t} else {\n\t\t\tthis.content = originalBefore;\n\t\t}\n\n\t\tnewChunk.next = this.next;\n\t\tif (newChunk.next) newChunk.next.previous = newChunk;\n\t\tnewChunk.previous = this;\n\t\tthis.next = newChunk;\n\n\t\treturn newChunk;\n\t}\n\n\ttoString() {\n\t\treturn this.intro + this.content + this.outro;\n\t}\n\n\ttrimEnd(rx) {\n\t\tthis.outro = this.outro.replace(rx, '');\n\t\tif (this.outro.length) return true;\n\n\t\tconst trimmed = this.content.replace(rx, '');\n\n\t\tif (trimmed.length) {\n\t\t\tif (trimmed !== this.content) {\n\t\t\t\tthis.split(this.start + trimmed.length).edit('', undefined, true);\n\t\t\t\tif (this.edited) {\n\t\t\t\t\t// save the change, if it has been edited\n\t\t\t\t\tthis.edit(trimmed, this.storeName, true);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} else {\n\t\t\tthis.edit('', undefined, true);\n\n\t\t\tthis.intro = this.intro.replace(rx, '');\n\t\t\tif (this.intro.length) return true;\n\t\t}\n\t}\n\n\ttrimStart(rx) {\n\t\tthis.intro = this.intro.replace(rx, '');\n\t\tif (this.intro.length) return true;\n\n\t\tconst trimmed = this.content.replace(rx, '');\n\n\t\tif (trimmed.length) {\n\t\t\tif (trimmed !== this.content) {\n\t\t\t\tconst newChunk = this.split(this.end - trimmed.length);\n\t\t\t\tif (this.edited) {\n\t\t\t\t\t// save the change, if it has been edited\n\t\t\t\t\tnewChunk.edit(trimmed, this.storeName, true);\n\t\t\t\t}\n\t\t\t\tthis.edit('', undefined, true);\n\t\t\t}\n\t\t\treturn true;\n\t\t} else {\n\t\t\tthis.edit('', undefined, true);\n\n\t\t\tthis.outro = this.outro.replace(rx, '');\n\t\t\tif (this.outro.length) return true;\n\t\t}\n\t}\n}\n","import { encode } from '@jridgewell/sourcemap-codec';\n\nfunction getBtoa() {\n\tif (typeof globalThis !== 'undefined' && typeof globalThis.btoa === 'function') {\n\t\treturn (str) => globalThis.btoa(unescape(encodeURIComponent(str)));\n\t} else if (typeof Buffer === 'function') {\n\t\treturn (str) => Buffer.from(str, 'utf-8').toString('base64');\n\t} else {\n\t\treturn () => {\n\t\t\tthrow new Error('Unsupported environment: `window.btoa` or `Buffer` should be supported.');\n\t\t};\n\t}\n}\n\nconst btoa = /*#__PURE__*/ getBtoa();\n\nexport default class SourceMap {\n\tconstructor(properties) {\n\t\tthis.version = 3;\n\t\tthis.file = properties.file;\n\t\tthis.sources = properties.sources;\n\t\tthis.sourcesContent = properties.sourcesContent;\n\t\tthis.names = properties.names;\n\t\tthis.mappings = encode(properties.mappings);\n\t\tif (typeof properties.x_google_ignoreList !== 'undefined') {\n\t\t\tthis.x_google_ignoreList = properties.x_google_ignoreList;\n\t\t}\n\t\tif (typeof properties.debugId !== 'undefined') {\n\t\t\tthis.debugId = properties.debugId;\n\t\t}\n\t}\n\n\ttoString() {\n\t\treturn JSON.stringify(this);\n\t}\n\n\ttoUrl() {\n\t\treturn 'data:application/json;charset=utf-8;base64,' + btoa(this.toString());\n\t}\n}\n","export default function guessIndent(code) {\n\tconst lines = code.split('\\n');\n\n\tconst tabbed = lines.filter((line) => /^\\t+/.test(line));\n\tconst spaced = lines.filter((line) => /^ {2,}/.test(line));\n\n\tif (tabbed.length === 0 && spaced.length === 0) {\n\t\treturn null;\n\t}\n\n\t// More lines tabbed than spaced? Assume tabs, and\n\t// default to tabs in the case of a tie (or nothing\n\t// to go on)\n\tif (tabbed.length >= spaced.length) {\n\t\treturn '\\t';\n\t}\n\n\t// Otherwise, we need to guess the multiple\n\tconst min = spaced.reduce((previous, current) => {\n\t\tconst numSpaces = /^ +/.exec(current)[0].length;\n\t\treturn Math.min(numSpaces, previous);\n\t}, Infinity);\n\n\treturn new Array(min + 1).join(' ');\n}\n","export default function getRelativePath(from, to) {\n\tconst fromParts = from.split(/[/\\\\]/);\n\tconst toParts = to.split(/[/\\\\]/);\n\n\tfromParts.pop(); // get dirname\n\n\twhile (fromParts[0] === toParts[0]) {\n\t\tfromParts.shift();\n\t\ttoParts.shift();\n\t}\n\n\tif (fromParts.length) {\n\t\tlet i = fromParts.length;\n\t\twhile (i--) fromParts[i] = '..';\n\t}\n\n\treturn fromParts.concat(toParts).join('/');\n}\n","const toString = Object.prototype.toString;\n\nexport default function isObject(thing) {\n\treturn toString.call(thing) === '[object Object]';\n}\n","export default function getLocator(source) {\n\tconst originalLines = source.split('\\n');\n\tconst lineOffsets = [];\n\n\tfor (let i = 0, pos = 0; i < originalLines.length; i++) {\n\t\tlineOffsets.push(pos);\n\t\tpos += originalLines[i].length + 1;\n\t}\n\n\treturn function locate(index) {\n\t\tlet i = 0;\n\t\tlet j = lineOffsets.length;\n\t\twhile (i < j) {\n\t\t\tconst m = (i + j) >> 1;\n\t\t\tif (index < lineOffsets[m]) {\n\t\t\t\tj = m;\n\t\t\t} else {\n\t\t\t\ti = m + 1;\n\t\t\t}\n\t\t}\n\t\tconst line = i - 1;\n\t\tconst column = index - lineOffsets[line];\n\t\treturn { line, column };\n\t};\n}\n","const wordRegex = /\\w/;\n\nexport default class Mappings {\n\tconstructor(hires) {\n\t\tthis.hires = hires;\n\t\tthis.generatedCodeLine = 0;\n\t\tthis.generatedCodeColumn = 0;\n\t\tthis.raw = [];\n\t\tthis.rawSegments = this.raw[this.generatedCodeLine] = [];\n\t\tthis.pending = null;\n\t}\n\n\taddEdit(sourceIndex, content, loc, nameIndex) {\n\t\tif (content.length) {\n\t\t\tconst contentLengthMinusOne = content.length - 1;\n\t\t\tlet contentLineEnd = content.indexOf('\\n', 0);\n\t\t\tlet previousContentLineEnd = -1;\n\t\t\t// Loop through each line in the content and add a segment, but stop if the last line is empty,\n\t\t\t// else code afterwards would fill one line too many\n\t\t\twhile (contentLineEnd >= 0 && contentLengthMinusOne > contentLineEnd) {\n\t\t\t\tconst segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];\n\t\t\t\tif (nameIndex >= 0) {\n\t\t\t\t\tsegment.push(nameIndex);\n\t\t\t\t}\n\t\t\t\tthis.rawSegments.push(segment);\n\n\t\t\t\tthis.generatedCodeLine += 1;\n\t\t\t\tthis.raw[this.generatedCodeLine] = this.rawSegments = [];\n\t\t\t\tthis.generatedCodeColumn = 0;\n\n\t\t\t\tpreviousContentLineEnd = contentLineEnd;\n\t\t\t\tcontentLineEnd = content.indexOf('\\n', contentLineEnd + 1);\n\t\t\t}\n\n\t\t\tconst segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];\n\t\t\tif (nameIndex >= 0) {\n\t\t\t\tsegment.push(nameIndex);\n\t\t\t}\n\t\t\tthis.rawSegments.push(segment);\n\n\t\t\tthis.advance(content.slice(previousContentLineEnd + 1));\n\t\t} else if (this.pending) {\n\t\t\tthis.rawSegments.push(this.pending);\n\t\t\tthis.advance(content);\n\t\t}\n\n\t\tthis.pending = null;\n\t}\n\n\taddUneditedChunk(sourceIndex, chunk, original, loc, sourcemapLocations) {\n\t\tlet originalCharIndex = chunk.start;\n\t\tlet first = true;\n\t\t// when iterating each char, check if it's in a word boundary\n\t\tlet charInHiresBoundary = false;\n\n\t\twhile (originalCharIndex < chunk.end) {\n\t\t\tif (original[originalCharIndex] === '\\n') {\n\t\t\t\tloc.line += 1;\n\t\t\t\tloc.column = 0;\n\t\t\t\tthis.generatedCodeLine += 1;\n\t\t\t\tthis.raw[this.generatedCodeLine] = this.rawSegments = [];\n\t\t\t\tthis.generatedCodeColumn = 0;\n\t\t\t\tfirst = true;\n\t\t\t\tcharInHiresBoundary = false;\n\t\t\t} else {\n\t\t\t\tif (this.hires || first || sourcemapLocations.has(originalCharIndex)) {\n\t\t\t\t\tconst segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];\n\n\t\t\t\t\tif (this.hires === 'boundary') {\n\t\t\t\t\t\t// in hires \"boundary\", group segments per word boundary than per char\n\t\t\t\t\t\tif (wordRegex.test(original[originalCharIndex])) {\n\t\t\t\t\t\t\t// for first char in the boundary found, start the boundary by pushing a segment\n\t\t\t\t\t\t\tif (!charInHiresBoundary) {\n\t\t\t\t\t\t\t\tthis.rawSegments.push(segment);\n\t\t\t\t\t\t\t\tcharInHiresBoundary = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// for non-word char, end the boundary by pushing a segment\n\t\t\t\t\t\t\tthis.rawSegments.push(segment);\n\t\t\t\t\t\t\tcharInHiresBoundary = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.rawSegments.push(segment);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tloc.column += 1;\n\t\t\t\tthis.generatedCodeColumn += 1;\n\t\t\t\tfirst = false;\n\t\t\t}\n\n\t\t\toriginalCharIndex += 1;\n\t\t}\n\n\t\tthis.pending = null;\n\t}\n\n\tadvance(str) {\n\t\tif (!str) return;\n\n\t\tconst lines = str.split('\\n');\n\n\t\tif (lines.length > 1) {\n\t\t\tfor (let i = 0; i < lines.length - 1; i++) {\n\t\t\t\tthis.generatedCodeLine++;\n\t\t\t\tthis.raw[this.generatedCodeLine] = this.rawSegments = [];\n\t\t\t}\n\t\t\tthis.generatedCodeColumn = 0;\n\t\t}\n\n\t\tthis.generatedCodeColumn += lines[lines.length - 1].length;\n\t}\n}\n","import BitSet from './BitSet.js';\nimport Chunk from './Chunk.js';\nimport SourceMap from './SourceMap.js';\nimport guessIndent from './utils/guessIndent.js';\nimport getRelativePath from './utils/getRelativePath.js';\nimport isObject from './utils/isObject.js';\nimport getLocator from './utils/getLocator.js';\nimport Mappings from './utils/Mappings.js';\nimport Stats from './utils/Stats.js';\n\nconst n = '\\n';\n\nconst warned = {\n\tinsertLeft: false,\n\tinsertRight: false,\n\tstoreName: false,\n};\n\nexport default class MagicString {\n\tconstructor(string, options = {}) {\n\t\tconst chunk = new Chunk(0, string.length, string);\n\n\t\tObject.defineProperties(this, {\n\t\t\toriginal: { writable: true, value: string },\n\t\t\toutro: { writable: true, value: '' },\n\t\t\tintro: { writable: true, value: '' },\n\t\t\tfirstChunk: { writable: true, value: chunk },\n\t\t\tlastChunk: { writable: true, value: chunk },\n\t\t\tlastSearchedChunk: { writable: true, value: chunk },\n\t\t\tbyStart: { writable: true, value: {} },\n\t\t\tbyEnd: { writable: true, value: {} },\n\t\t\tfilename: { writable: true, value: options.filename },\n\t\t\tindentExclusionRanges: { writable: true, value: options.indentExclusionRanges },\n\t\t\tsourcemapLocations: { writable: true, value: new BitSet() },\n\t\t\tstoredNames: { writable: true, value: {} },\n\t\t\tindentStr: { writable: true, value: undefined },\n\t\t\tignoreList: { writable: true, value: options.ignoreList },\n\t\t\toffset: { writable: true, value: options.offset || 0 },\n\t\t});\n\n\t\tif (DEBUG) {\n\t\t\tObject.defineProperty(this, 'stats', { value: new Stats() });\n\t\t}\n\n\t\tthis.byStart[0] = chunk;\n\t\tthis.byEnd[string.length] = chunk;\n\t}\n\n\taddSourcemapLocation(char) {\n\t\tthis.sourcemapLocations.add(char);\n\t}\n\n\tappend(content) {\n\t\tif (typeof content !== 'string') throw new TypeError('outro content must be a string');\n\n\t\tthis.outro += content;\n\t\treturn this;\n\t}\n\n\tappendLeft(index, content) {\n\t\tindex = index + this.offset;\n\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tif (DEBUG) this.stats.time('appendLeft');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byEnd[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.appendLeft(content);\n\t\t} else {\n\t\t\tthis.intro += content;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('appendLeft');\n\t\treturn this;\n\t}\n\n\tappendRight(index, content) {\n\t\tindex = index + this.offset;\n\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tif (DEBUG) this.stats.time('appendRight');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byStart[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.appendRight(content);\n\t\t} else {\n\t\t\tthis.outro += content;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('appendRight');\n\t\treturn this;\n\t}\n\n\tclone() {\n\t\tconst cloned = new MagicString(this.original, { filename: this.filename, offset: this.offset });\n\n\t\tlet originalChunk = this.firstChunk;\n\t\tlet clonedChunk = (cloned.firstChunk = cloned.lastSearchedChunk = originalChunk.clone());\n\n\t\twhile (originalChunk) {\n\t\t\tcloned.byStart[clonedChunk.start] = clonedChunk;\n\t\t\tcloned.byEnd[clonedChunk.end] = clonedChunk;\n\n\t\t\tconst nextOriginalChunk = originalChunk.next;\n\t\t\tconst nextClonedChunk = nextOriginalChunk && nextOriginalChunk.clone();\n\n\t\t\tif (nextClonedChunk) {\n\t\t\t\tclonedChunk.next = nextClonedChunk;\n\t\t\t\tnextClonedChunk.previous = clonedChunk;\n\n\t\t\t\tclonedChunk = nextClonedChunk;\n\t\t\t}\n\n\t\t\toriginalChunk = nextOriginalChunk;\n\t\t}\n\n\t\tcloned.lastChunk = clonedChunk;\n\n\t\tif (this.indentExclusionRanges) {\n\t\t\tcloned.indentExclusionRanges = this.indentExclusionRanges.slice();\n\t\t}\n\n\t\tcloned.sourcemapLocations = new BitSet(this.sourcemapLocations);\n\n\t\tcloned.intro = this.intro;\n\t\tcloned.outro = this.outro;\n\n\t\treturn cloned;\n\t}\n\n\tgenerateDecodedMap(options) {\n\t\toptions = options || {};\n\n\t\tconst sourceIndex = 0;\n\t\tconst names = Object.keys(this.storedNames);\n\t\tconst mappings = new Mappings(options.hires);\n\n\t\tconst locate = getLocator(this.original);\n\n\t\tif (this.intro) {\n\t\t\tmappings.advance(this.intro);\n\t\t}\n\n\t\tthis.firstChunk.eachNext((chunk) => {\n\t\t\tconst loc = locate(chunk.start);\n\n\t\t\tif (chunk.intro.length) mappings.advance(chunk.intro);\n\n\t\t\tif (chunk.edited) {\n\t\t\t\tmappings.addEdit(\n\t\t\t\t\tsourceIndex,\n\t\t\t\t\tchunk.content,\n\t\t\t\t\tloc,\n\t\t\t\t\tchunk.storeName ? names.indexOf(chunk.original) : -1,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tmappings.addUneditedChunk(sourceIndex, chunk, this.original, loc, this.sourcemapLocations);\n\t\t\t}\n\n\t\t\tif (chunk.outro.length) mappings.advance(chunk.outro);\n\t\t});\n\n\t\treturn {\n\t\t\tfile: options.file ? options.file.split(/[/\\\\]/).pop() : undefined,\n\t\t\tsources: [\n\t\t\t\toptions.source ? getRelativePath(options.file || '', options.source) : options.file || '',\n\t\t\t],\n\t\t\tsourcesContent: options.includeContent ? [this.original] : undefined,\n\t\t\tnames,\n\t\t\tmappings: mappings.raw,\n\t\t\tx_google_ignoreList: this.ignoreList ? [sourceIndex] : undefined,\n\t\t};\n\t}\n\n\tgenerateMap(options) {\n\t\treturn new SourceMap(this.generateDecodedMap(options));\n\t}\n\n\t_ensureindentStr() {\n\t\tif (this.indentStr === undefined) {\n\t\t\tthis.indentStr = guessIndent(this.original);\n\t\t}\n\t}\n\n\t_getRawIndentString() {\n\t\tthis._ensureindentStr();\n\t\treturn this.indentStr;\n\t}\n\n\tgetIndentString() {\n\t\tthis._ensureindentStr();\n\t\treturn this.indentStr === null ? '\\t' : this.indentStr;\n\t}\n\n\tindent(indentStr, options) {\n\t\tconst pattern = /^[^\\r\\n]/gm;\n\n\t\tif (isObject(indentStr)) {\n\t\t\toptions = indentStr;\n\t\t\tindentStr = undefined;\n\t\t}\n\n\t\tif (indentStr === undefined) {\n\t\t\tthis._ensureindentStr();\n\t\t\tindentStr = this.indentStr || '\\t';\n\t\t}\n\n\t\tif (indentStr === '') return this; // noop\n\n\t\toptions = options || {};\n\n\t\t// Process exclusion ranges\n\t\tconst isExcluded = {};\n\n\t\tif (options.exclude) {\n\t\t\tconst exclusions =\n\t\t\t\ttypeof options.exclude[0] === 'number' ? [options.exclude] : options.exclude;\n\t\t\texclusions.forEach((exclusion) => {\n\t\t\t\tfor (let i = exclusion[0]; i < exclusion[1]; i += 1) {\n\t\t\t\t\tisExcluded[i] = true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tlet shouldIndentNextCharacter = options.indentStart !== false;\n\t\tconst replacer = (match) => {\n\t\t\tif (shouldIndentNextCharacter) return `${indentStr}${match}`;\n\t\t\tshouldIndentNextCharacter = true;\n\t\t\treturn match;\n\t\t};\n\n\t\tthis.intro = this.intro.replace(pattern, replacer);\n\n\t\tlet charIndex = 0;\n\t\tlet chunk = this.firstChunk;\n\n\t\twhile (chunk) {\n\t\t\tconst end = chunk.end;\n\n\t\t\tif (chunk.edited) {\n\t\t\t\tif (!isExcluded[charIndex]) {\n\t\t\t\t\tchunk.content = chunk.content.replace(pattern, replacer);\n\n\t\t\t\t\tif (chunk.content.length) {\n\t\t\t\t\t\tshouldIndentNextCharacter = chunk.content[chunk.content.length - 1] === '\\n';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcharIndex = chunk.start;\n\n\t\t\t\twhile (charIndex < end) {\n\t\t\t\t\tif (!isExcluded[charIndex]) {\n\t\t\t\t\t\tconst char = this.original[charIndex];\n\n\t\t\t\t\t\tif (char === '\\n') {\n\t\t\t\t\t\t\tshouldIndentNextCharacter = true;\n\t\t\t\t\t\t} else if (char !== '\\r' && shouldIndentNextCharacter) {\n\t\t\t\t\t\t\tshouldIndentNextCharacter = false;\n\n\t\t\t\t\t\t\tif (charIndex === chunk.start) {\n\t\t\t\t\t\t\t\tchunk.prependRight(indentStr);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis._splitChunk(chunk, charIndex);\n\t\t\t\t\t\t\t\tchunk = chunk.next;\n\t\t\t\t\t\t\t\tchunk.prependRight(indentStr);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcharIndex += 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcharIndex = chunk.end;\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\tthis.outro = this.outro.replace(pattern, replacer);\n\n\t\treturn this;\n\t}\n\n\tinsert() {\n\t\tthrow new Error(\n\t\t\t'magicString.insert(...) is deprecated. Use prependRight(...) or appendLeft(...)',\n\t\t);\n\t}\n\n\tinsertLeft(index, content) {\n\t\tif (!warned.insertLeft) {\n\t\t\tconsole.warn(\n\t\t\t\t'magicString.insertLeft(...) is deprecated. Use magicString.appendLeft(...) instead',\n\t\t\t);\n\t\t\twarned.insertLeft = true;\n\t\t}\n\n\t\treturn this.appendLeft(index, content);\n\t}\n\n\tinsertRight(index, content) {\n\t\tif (!warned.insertRight) {\n\t\t\tconsole.warn(\n\t\t\t\t'magicString.insertRight(...) is deprecated. Use magicString.prependRight(...) instead',\n\t\t\t);\n\t\t\twarned.insertRight = true;\n\t\t}\n\n\t\treturn this.prependRight(index, content);\n\t}\n\n\tmove(start, end, index) {\n\t\tstart = start + this.offset;\n\t\tend = end + this.offset;\n\t\tindex = index + this.offset;\n\n\t\tif (index >= start && index <= end) throw new Error('Cannot move a selection inside itself');\n\n\t\tif (DEBUG) this.stats.time('move');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\t\tthis._split(index);\n\n\t\tconst first = this.byStart[start];\n\t\tconst last = this.byEnd[end];\n\n\t\tconst oldLeft = first.previous;\n\t\tconst oldRight = last.next;\n\n\t\tconst newRight = this.byStart[index];\n\t\tif (!newRight && last === this.lastChunk) return this;\n\t\tconst newLeft = newRight ? newRight.previous : this.lastChunk;\n\n\t\tif (oldLeft) oldLeft.next = oldRight;\n\t\tif (oldRight) oldRight.previous = oldLeft;\n\n\t\tif (newLeft) newLeft.next = first;\n\t\tif (newRight) newRight.previous = last;\n\n\t\tif (!first.previous) this.firstChunk = last.next;\n\t\tif (!last.next) {\n\t\t\tthis.lastChunk = first.previous;\n\t\t\tthis.lastChunk.next = null;\n\t\t}\n\n\t\tfirst.previous = newLeft;\n\t\tlast.next = newRight || null;\n\n\t\tif (!newLeft) this.firstChunk = first;\n\t\tif (!newRight) this.lastChunk = last;\n\n\t\tif (DEBUG) this.stats.timeEnd('move');\n\t\treturn this;\n\t}\n\n\toverwrite(start, end, content, options) {\n\t\toptions = options || {};\n\t\treturn this.update(start, end, content, { ...options, overwrite: !options.contentOnly });\n\t}\n\n\tupdate(start, end, content, options) {\n\t\tstart = start + this.offset;\n\t\tend = end + this.offset;\n\n\t\tif (typeof content !== 'string') throw new TypeError('replacement content must be a string');\n\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tif (end > this.original.length) throw new Error('end is out of bounds');\n\t\tif (start === end)\n\t\t\tthrow new Error(\n\t\t\t\t'Cannot overwrite a zero-length range – use appendLeft or prependRight instead',\n\t\t\t);\n\n\t\tif (DEBUG) this.stats.time('overwrite');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\n\t\tif (options === true) {\n\t\t\tif (!warned.storeName) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'The final argument to magicString.overwrite(...) should be an options object. See https://github.com/rich-harris/magic-string',\n\t\t\t\t);\n\t\t\t\twarned.storeName = true;\n\t\t\t}\n\n\t\t\toptions = { storeName: true };\n\t\t}\n\t\tconst storeName = options !== undefined ? options.storeName : false;\n\t\tconst overwrite = options !== undefined ? options.overwrite : false;\n\n\t\tif (storeName) {\n\t\t\tconst original = this.original.slice(start, end);\n\t\t\tObject.defineProperty(this.storedNames, original, {\n\t\t\t\twritable: true,\n\t\t\t\tvalue: true,\n\t\t\t\tenumerable: true,\n\t\t\t});\n\t\t}\n\n\t\tconst first = this.byStart[start];\n\t\tconst last = this.byEnd[end];\n\n\t\tif (first) {\n\t\t\tlet chunk = first;\n\t\t\twhile (chunk !== last) {\n\t\t\t\tif (chunk.next !== this.byStart[chunk.end]) {\n\t\t\t\t\tthrow new Error('Cannot overwrite across a split point');\n\t\t\t\t}\n\t\t\t\tchunk = chunk.next;\n\t\t\t\tchunk.edit('', false);\n\t\t\t}\n\n\t\t\tfirst.edit(content, storeName, !overwrite);\n\t\t} else {\n\t\t\t// must be inserting at the end\n\t\t\tconst newChunk = new Chunk(start, end, '').edit(content, storeName);\n\n\t\t\t// TODO last chunk in the array may not be the last chunk, if it's moved...\n\t\t\tlast.next = newChunk;\n\t\t\tnewChunk.previous = last;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('overwrite');\n\t\treturn this;\n\t}\n\n\tprepend(content) {\n\t\tif (typeof content !== 'string') throw new TypeError('outro content must be a string');\n\n\t\tthis.intro = content + this.intro;\n\t\treturn this;\n\t}\n\n\tprependLeft(index, content) {\n\t\tindex = index + this.offset;\n\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tif (DEBUG) this.stats.time('insertRight');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byEnd[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.prependLeft(content);\n\t\t} else {\n\t\t\tthis.intro = content + this.intro;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('insertRight');\n\t\treturn this;\n\t}\n\n\tprependRight(index, content) {\n\t\tindex = index + this.offset;\n\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tif (DEBUG) this.stats.time('insertRight');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byStart[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.prependRight(content);\n\t\t} else {\n\t\t\tthis.outro = content + this.outro;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('insertRight');\n\t\treturn this;\n\t}\n\n\tremove(start, end) {\n\t\tstart = start + this.offset;\n\t\tend = end + this.offset;\n\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tif (start === end) return this;\n\n\t\tif (start < 0 || end > this.original.length) throw new Error('Character is out of bounds');\n\t\tif (start > end) throw new Error('end must be greater than start');\n\n\t\tif (DEBUG) this.stats.time('remove');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\n\t\tlet chunk = this.byStart[start];\n\n\t\twhile (chunk) {\n\t\t\tchunk.intro = '';\n\t\t\tchunk.outro = '';\n\t\t\tchunk.edit('');\n\n\t\t\tchunk = end > chunk.end ? this.byStart[chunk.end] : null;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('remove');\n\t\treturn this;\n\t}\n\n\treset(start, end) {\n\t\tstart = start + this.offset;\n\t\tend = end + this.offset;\n\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tif (start === end) return this;\n\n\t\tif (start < 0 || end > this.original.length) throw new Error('Character is out of bounds');\n\t\tif (start > end) throw new Error('end must be greater than start');\n\n\t\tif (DEBUG) this.stats.time('reset');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\n\t\tlet chunk = this.byStart[start];\n\n\t\twhile (chunk) {\n\t\t\tchunk.reset();\n\n\t\t\tchunk = end > chunk.end ? this.byStart[chunk.end] : null;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('reset');\n\t\treturn this;\n\t}\n\n\tlastChar() {\n\t\tif (this.outro.length) return this.outro[this.outro.length - 1];\n\t\tlet chunk = this.lastChunk;\n\t\tdo {\n\t\t\tif (chunk.outro.length) return chunk.outro[chunk.outro.length - 1];\n\t\t\tif (chunk.content.length) return chunk.content[chunk.content.length - 1];\n\t\t\tif (chunk.intro.length) return chunk.intro[chunk.intro.length - 1];\n\t\t} while ((chunk = chunk.previous));\n\t\tif (this.intro.length) return this.intro[this.intro.length - 1];\n\t\treturn '';\n\t}\n\n\tlastLine() {\n\t\tlet lineIndex = this.outro.lastIndexOf(n);\n\t\tif (lineIndex !== -1) return this.outro.substr(lineIndex + 1);\n\t\tlet lineStr = this.outro;\n\t\tlet chunk = this.lastChunk;\n\t\tdo {\n\t\t\tif (chunk.outro.length > 0) {\n\t\t\t\tlineIndex = chunk.outro.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1) return chunk.outro.substr(lineIndex + 1) + lineStr;\n\t\t\t\tlineStr = chunk.outro + lineStr;\n\t\t\t}\n\n\t\t\tif (chunk.content.length > 0) {\n\t\t\t\tlineIndex = chunk.content.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1) return chunk.content.substr(lineIndex + 1) + lineStr;\n\t\t\t\tlineStr = chunk.content + lineStr;\n\t\t\t}\n\n\t\t\tif (chunk.intro.length > 0) {\n\t\t\t\tlineIndex = chunk.intro.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1) return chunk.intro.substr(lineIndex + 1) + lineStr;\n\t\t\t\tlineStr = chunk.intro + lineStr;\n\t\t\t}\n\t\t} while ((chunk = chunk.previous));\n\t\tlineIndex = this.intro.lastIndexOf(n);\n\t\tif (lineIndex !== -1) return this.intro.substr(lineIndex + 1) + lineStr;\n\t\treturn this.intro + lineStr;\n\t}\n\n\tslice(start = 0, end = this.original.length - this.offset) {\n\t\tstart = start + this.offset;\n\t\tend = end + this.offset;\n\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tlet result = '';\n\n\t\t// find start chunk\n\t\tlet chunk = this.firstChunk;\n\t\twhile (chunk && (chunk.start > start || chunk.end <= start)) {\n\t\t\t// found end chunk before start\n\t\t\tif (chunk.start < end && chunk.end >= end) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\tif (chunk && chunk.edited && chunk.start !== start)\n\t\t\tthrow new Error(`Cannot use replaced character ${start} as slice start anchor.`);\n\n\t\tconst startChunk = chunk;\n\t\twhile (chunk) {\n\t\t\tif (chunk.intro && (startChunk !== chunk || chunk.start === start)) {\n\t\t\t\tresult += chunk.intro;\n\t\t\t}\n\n\t\t\tconst containsEnd = chunk.start < end && chunk.end >= end;\n\t\t\tif (containsEnd && chunk.edited && chunk.end !== end)\n\t\t\t\tthrow new Error(`Cannot use replaced character ${end} as slice end anchor.`);\n\n\t\t\tconst sliceStart = startChunk === chunk ? start - chunk.start : 0;\n\t\t\tconst sliceEnd = containsEnd ? chunk.content.length + end - chunk.end : chunk.content.length;\n\n\t\t\tresult += chunk.content.slice(sliceStart, sliceEnd);\n\n\t\t\tif (chunk.outro && (!containsEnd || chunk.end === end)) {\n\t\t\t\tresult += chunk.outro;\n\t\t\t}\n\n\t\t\tif (containsEnd) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// TODO deprecate this? not really very useful\n\tsnip(start, end) {\n\t\tconst clone = this.clone();\n\t\tclone.remove(0, start);\n\t\tclone.remove(end, clone.original.length);\n\n\t\treturn clone;\n\t}\n\n\t_split(index) {\n\t\tif (this.byStart[index] || this.byEnd[index]) return;\n\n\t\tif (DEBUG) this.stats.time('_split');\n\n\t\tlet chunk = this.lastSearchedChunk;\n\t\tconst searchForward = index > chunk.end;\n\n\t\twhile (chunk) {\n\t\t\tif (chunk.contains(index)) return this._splitChunk(chunk, index);\n\n\t\t\tchunk = searchForward ? this.byStart[chunk.end] : this.byEnd[chunk.start];\n\t\t}\n\t}\n\n\t_splitChunk(chunk, index) {\n\t\tif (chunk.edited && chunk.content.length) {\n\t\t\t// zero-length edited chunks are a special case (overlapping replacements)\n\t\t\tconst loc = getLocator(this.original)(index);\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot split a chunk that has already been edited (${loc.line}:${loc.column} – \"${chunk.original}\")`,\n\t\t\t);\n\t\t}\n\n\t\tconst newChunk = chunk.split(index);\n\n\t\tthis.byEnd[index] = chunk;\n\t\tthis.byStart[index] = newChunk;\n\t\tthis.byEnd[newChunk.end] = newChunk;\n\n\t\tif (chunk === this.lastChunk) this.lastChunk = newChunk;\n\n\t\tthis.lastSearchedChunk = chunk;\n\t\tif (DEBUG) this.stats.timeEnd('_split');\n\t\treturn true;\n\t}\n\n\ttoString() {\n\t\tlet str = this.intro;\n\n\t\tlet chunk = this.firstChunk;\n\t\twhile (chunk) {\n\t\t\tstr += chunk.toString();\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\treturn str + this.outro;\n\t}\n\n\tisEmpty() {\n\t\tlet chunk = this.firstChunk;\n\t\tdo {\n\t\t\tif (\n\t\t\t\t(chunk.intro.length && chunk.intro.trim()) ||\n\t\t\t\t(chunk.content.length && chunk.content.trim()) ||\n\t\t\t\t(chunk.outro.length && chunk.outro.trim())\n\t\t\t)\n\t\t\t\treturn false;\n\t\t} while ((chunk = chunk.next));\n\t\treturn true;\n\t}\n\n\tlength() {\n\t\tlet chunk = this.firstChunk;\n\t\tlet length = 0;\n\t\tdo {\n\t\t\tlength += chunk.intro.length + chunk.content.length + chunk.outro.length;\n\t\t} while ((chunk = chunk.next));\n\t\treturn length;\n\t}\n\n\ttrimLines() {\n\t\treturn this.trim('[\\\\r\\\\n]');\n\t}\n\n\ttrim(charType) {\n\t\treturn this.trimStart(charType).trimEnd(charType);\n\t}\n\n\ttrimEndAborted(charType) {\n\t\tconst rx = new RegExp((charType || '\\\\s') + '+$');\n\n\t\tthis.outro = this.outro.replace(rx, '');\n\t\tif (this.outro.length) return true;\n\n\t\tlet chunk = this.lastChunk;\n\n\t\tdo {\n\t\t\tconst end = chunk.end;\n\t\t\tconst aborted = chunk.trimEnd(rx);\n\n\t\t\t// if chunk was trimmed, we have a new lastChunk\n\t\t\tif (chunk.end !== end) {\n\t\t\t\tif (this.lastChunk === chunk) {\n\t\t\t\t\tthis.lastChunk = chunk.next;\n\t\t\t\t}\n\n\t\t\t\tthis.byEnd[chunk.end] = chunk;\n\t\t\t\tthis.byStart[chunk.next.start] = chunk.next;\n\t\t\t\tthis.byEnd[chunk.next.end] = chunk.next;\n\t\t\t}\n\n\t\t\tif (aborted) return true;\n\t\t\tchunk = chunk.previous;\n\t\t} while (chunk);\n\n\t\treturn false;\n\t}\n\n\ttrimEnd(charType) {\n\t\tthis.trimEndAborted(charType);\n\t\treturn this;\n\t}\n\ttrimStartAborted(charType) {\n\t\tconst rx = new RegExp('^' + (charType || '\\\\s') + '+');\n\n\t\tthis.intro = this.intro.replace(rx, '');\n\t\tif (this.intro.length) return true;\n\n\t\tlet chunk = this.firstChunk;\n\n\t\tdo {\n\t\t\tconst end = chunk.end;\n\t\t\tconst aborted = chunk.trimStart(rx);\n\n\t\t\tif (chunk.end !== end) {\n\t\t\t\t// special case...\n\t\t\t\tif (chunk === this.lastChunk) this.lastChunk = chunk.next;\n\n\t\t\t\tthis.byEnd[chunk.end] = chunk;\n\t\t\t\tthis.byStart[chunk.next.start] = chunk.next;\n\t\t\t\tthis.byEnd[chunk.next.end] = chunk.next;\n\t\t\t}\n\n\t\t\tif (aborted) return true;\n\t\t\tchunk = chunk.next;\n\t\t} while (chunk);\n\n\t\treturn false;\n\t}\n\n\ttrimStart(charType) {\n\t\tthis.trimStartAborted(charType);\n\t\treturn this;\n\t}\n\n\thasChanged() {\n\t\treturn this.original !== this.toString();\n\t}\n\n\t_replaceRegexp(searchValue, replacement) {\n\t\tfunction getReplacement(match, str) {\n\t\t\tif (typeof replacement === 'string') {\n\t\t\t\treturn replacement.replace(/\\$(\\$|&|\\d+)/g, (_, i) => {\n\t\t\t\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_a_parameter\n\t\t\t\t\tif (i === '$') return '$';\n\t\t\t\t\tif (i === '&') return match[0];\n\t\t\t\t\tconst num = +i;\n\t\t\t\t\tif (num < match.length) return match[+i];\n\t\t\t\t\treturn `$${i}`;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn replacement(...match, match.index, str, match.groups);\n\t\t\t}\n\t\t}\n\t\tfunction matchAll(re, str) {\n\t\t\tlet match;\n\t\t\tconst matches = [];\n\t\t\twhile ((match = re.exec(str))) {\n\t\t\t\tmatches.push(match);\n\t\t\t}\n\t\t\treturn matches;\n\t\t}\n\t\tif (searchValue.global) {\n\t\t\tconst matches = matchAll(searchValue, this.original);\n\t\t\tmatches.forEach((match) => {\n\t\t\t\tif (match.index != null) {\n\t\t\t\t\tconst replacement = getReplacement(match, this.original);\n\t\t\t\t\tif (replacement !== match[0]) {\n\t\t\t\t\t\tthis.overwrite(match.index, match.index + match[0].length, replacement);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tconst match = this.original.match(searchValue);\n\t\t\tif (match && match.index != null) {\n\t\t\t\tconst replacement = getReplacement(match, this.original);\n\t\t\t\tif (replacement !== match[0]) {\n\t\t\t\t\tthis.overwrite(match.index, match.index + match[0].length, replacement);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\t_replaceString(string, replacement) {\n\t\tconst { original } = this;\n\t\tconst index = original.indexOf(string);\n\n\t\tif (index !== -1) {\n\t\t\tthis.overwrite(index, index + string.length, replacement);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\treplace(searchValue, replacement) {\n\t\tif (typeof searchValue === 'string') {\n\t\t\treturn this._replaceString(searchValue, replacement);\n\t\t}\n\n\t\treturn this._replaceRegexp(searchValue, replacement);\n\t}\n\n\t_replaceAllString(string, replacement) {\n\t\tconst { original } = this;\n\t\tconst stringLength = string.length;\n\t\tfor (\n\t\t\tlet index = original.indexOf(string);\n\t\t\tindex !== -1;\n\t\t\tindex = original.indexOf(string, index + stringLength)\n\t\t) {\n\t\t\tconst previous = original.slice(index, index + stringLength);\n\t\t\tif (previous !== replacement) this.overwrite(index, index + stringLength, replacement);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\treplaceAll(searchValue, replacement) {\n\t\tif (typeof searchValue === 'string') {\n\t\t\treturn this._replaceAllString(searchValue, replacement);\n\t\t}\n\n\t\tif (!searchValue.global) {\n\t\t\tthrow new TypeError(\n\t\t\t\t'MagicString.prototype.replaceAll called with a non-global RegExp argument',\n\t\t\t);\n\t\t}\n\n\t\treturn this._replaceRegexp(searchValue, replacement);\n\t}\n}\n","import MagicString from './MagicString.js';\nimport SourceMap from './SourceMap.js';\nimport getRelativePath from './utils/getRelativePath.js';\nimport isObject from './utils/isObject.js';\nimport getLocator from './utils/getLocator.js';\nimport Mappings from './utils/Mappings.js';\n\nconst hasOwnProp = Object.prototype.hasOwnProperty;\n\nexport default class Bundle {\n\tconstructor(options = {}) {\n\t\tthis.intro = options.intro || '';\n\t\tthis.separator = options.separator !== undefined ? options.separator : '\\n';\n\t\tthis.sources = [];\n\t\tthis.uniqueSources = [];\n\t\tthis.uniqueSourceIndexByFilename = {};\n\t}\n\n\taddSource(source) {\n\t\tif (source instanceof MagicString) {\n\t\t\treturn this.addSource({\n\t\t\t\tcontent: source,\n\t\t\t\tfilename: source.filename,\n\t\t\t\tseparator: this.separator,\n\t\t\t});\n\t\t}\n\n\t\tif (!isObject(source) || !source.content) {\n\t\t\tthrow new Error(\n\t\t\t\t'bundle.addSource() takes an object with a `content` property, which should be an instance of MagicString, and an optional `filename`',\n\t\t\t);\n\t\t}\n\n\t\t['filename', 'ignoreList', 'indentExclusionRanges', 'separator'].forEach((option) => {\n\t\t\tif (!hasOwnProp.call(source, option)) source[option] = source.content[option];\n\t\t});\n\n\t\tif (source.separator === undefined) {\n\t\t\t// TODO there's a bunch of this sort of thing, needs cleaning up\n\t\t\tsource.separator = this.separator;\n\t\t}\n\n\t\tif (source.filename) {\n\t\t\tif (!hasOwnProp.call(this.uniqueSourceIndexByFilename, source.filename)) {\n\t\t\t\tthis.uniqueSourceIndexByFilename[source.filename] = this.uniqueSources.length;\n\t\t\t\tthis.uniqueSources.push({ filename: source.filename, content: source.content.original });\n\t\t\t} else {\n\t\t\t\tconst uniqueSource = this.uniqueSources[this.uniqueSourceIndexByFilename[source.filename]];\n\t\t\t\tif (source.content.original !== uniqueSource.content) {\n\t\t\t\t\tthrow new Error(`Illegal source: same filename (${source.filename}), different contents`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.sources.push(source);\n\t\treturn this;\n\t}\n\n\tappend(str, options) {\n\t\tthis.addSource({\n\t\t\tcontent: new MagicString(str),\n\t\t\tseparator: (options && options.separator) || '',\n\t\t});\n\n\t\treturn this;\n\t}\n\n\tclone() {\n\t\tconst bundle = new Bundle({\n\t\t\tintro: this.intro,\n\t\t\tseparator: this.separator,\n\t\t});\n\n\t\tthis.sources.forEach((source) => {\n\t\t\tbundle.addSource({\n\t\t\t\tfilename: source.filename,\n\t\t\t\tcontent: source.content.clone(),\n\t\t\t\tseparator: source.separator,\n\t\t\t});\n\t\t});\n\n\t\treturn bundle;\n\t}\n\n\tgenerateDecodedMap(options = {}) {\n\t\tconst names = [];\n\t\tlet x_google_ignoreList = undefined;\n\t\tthis.sources.forEach((source) => {\n\t\t\tObject.keys(source.content.storedNames).forEach((name) => {\n\t\t\t\tif (!~names.indexOf(name)) names.push(name);\n\t\t\t});\n\t\t});\n\n\t\tconst mappings = new Mappings(options.hires);\n\n\t\tif (this.intro) {\n\t\t\tmappings.advance(this.intro);\n\t\t}\n\n\t\tthis.sources.forEach((source, i) => {\n\t\t\tif (i > 0) {\n\t\t\t\tmappings.advance(this.separator);\n\t\t\t}\n\n\t\t\tconst sourceIndex = source.filename ? this.uniqueSourceIndexByFilename[source.filename] : -1;\n\t\t\tconst magicString = source.content;\n\t\t\tconst locate = getLocator(magicString.original);\n\n\t\t\tif (magicString.intro) {\n\t\t\t\tmappings.advance(magicString.intro);\n\t\t\t}\n\n\t\t\tmagicString.firstChunk.eachNext((chunk) => {\n\t\t\t\tconst loc = locate(chunk.start);\n\n\t\t\t\tif (chunk.intro.length) mappings.advance(chunk.intro);\n\n\t\t\t\tif (source.filename) {\n\t\t\t\t\tif (chunk.edited) {\n\t\t\t\t\t\tmappings.addEdit(\n\t\t\t\t\t\t\tsourceIndex,\n\t\t\t\t\t\t\tchunk.content,\n\t\t\t\t\t\t\tloc,\n\t\t\t\t\t\t\tchunk.storeName ? names.indexOf(chunk.original) : -1,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmappings.addUneditedChunk(\n\t\t\t\t\t\t\tsourceIndex,\n\t\t\t\t\t\t\tchunk,\n\t\t\t\t\t\t\tmagicString.original,\n\t\t\t\t\t\t\tloc,\n\t\t\t\t\t\t\tmagicString.sourcemapLocations,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tmappings.advance(chunk.content);\n\t\t\t\t}\n\n\t\t\t\tif (chunk.outro.length) mappings.advance(chunk.outro);\n\t\t\t});\n\n\t\t\tif (magicString.outro) {\n\t\t\t\tmappings.advance(magicString.outro);\n\t\t\t}\n\n\t\t\tif (source.ignoreList && sourceIndex !== -1) {\n\t\t\t\tif (x_google_ignoreList === undefined) {\n\t\t\t\t\tx_google_ignoreList = [];\n\t\t\t\t}\n\t\t\t\tx_google_ignoreList.push(sourceIndex);\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tfile: options.file ? options.file.split(/[/\\\\]/).pop() : undefined,\n\t\t\tsources: this.uniqueSources.map((source) => {\n\t\t\t\treturn options.file ? getRelativePath(options.file, source.filename) : source.filename;\n\t\t\t}),\n\t\t\tsourcesContent: this.uniqueSources.map((source) => {\n\t\t\t\treturn options.includeContent ? source.content : null;\n\t\t\t}),\n\t\t\tnames,\n\t\t\tmappings: mappings.raw,\n\t\t\tx_google_ignoreList,\n\t\t};\n\t}\n\n\tgenerateMap(options) {\n\t\treturn new SourceMap(this.generateDecodedMap(options));\n\t}\n\n\tgetIndentString() {\n\t\tconst indentStringCounts = {};\n\n\t\tthis.sources.forEach((source) => {\n\t\t\tconst indentStr = source.content._getRawIndentString();\n\n\t\t\tif (indentStr === null) return;\n\n\t\t\tif (!indentStringCounts[indentStr]) indentStringCounts[indentStr] = 0;\n\t\t\tindentStringCounts[indentStr] += 1;\n\t\t});\n\n\t\treturn (\n\t\t\tObject.keys(indentStringCounts).sort((a, b) => {\n\t\t\t\treturn indentStringCounts[a] - indentStringCounts[b];\n\t\t\t})[0] || '\\t'\n\t\t);\n\t}\n\n\tindent(indentStr) {\n\t\tif (!arguments.length) {\n\t\t\tindentStr = this.getIndentString();\n\t\t}\n\n\t\tif (indentStr === '') return this; // noop\n\n\t\tlet trailingNewline = !this.intro || this.intro.slice(-1) === '\\n';\n\n\t\tthis.sources.forEach((source, i) => {\n\t\t\tconst separator = source.separator !== undefined ? source.separator : this.separator;\n\t\t\tconst indentStart = trailingNewline || (i > 0 && /\\r?\\n$/.test(separator));\n\n\t\t\tsource.content.indent(indentStr, {\n\t\t\t\texclude: source.indentExclusionRanges,\n\t\t\t\tindentStart, //: trailingNewline || /\\r?\\n$/.test( separator ) //true///\\r?\\n/.test( separator )\n\t\t\t});\n\n\t\t\ttrailingNewline = source.content.lastChar() === '\\n';\n\t\t});\n\n\t\tif (this.intro) {\n\t\t\tthis.intro =\n\t\t\t\tindentStr +\n\t\t\t\tthis.intro.replace(/^[^\\n]/gm, (match, index) => {\n\t\t\t\t\treturn index > 0 ? indentStr + match : match;\n\t\t\t\t});\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tprepend(str) {\n\t\tthis.intro = str + this.intro;\n\t\treturn this;\n\t}\n\n\ttoString() {\n\t\tconst body = this.sources\n\t\t\t.map((source, i) => {\n\t\t\t\tconst separator = source.separator !== undefined ? source.separator : this.separator;\n\t\t\t\tconst str = (i > 0 ? separator : '') + source.content.toString();\n\n\t\t\t\treturn str;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn this.intro + body;\n\t}\n\n\tisEmpty() {\n\t\tif (this.intro.length && this.intro.trim()) return false;\n\t\tif (this.sources.some((source) => !source.content.isEmpty())) return false;\n\t\treturn true;\n\t}\n\n\tlength() {\n\t\treturn this.sources.reduce(\n\t\t\t(length, source) => length + source.content.length(),\n\t\t\tthis.intro.length,\n\t\t);\n\t}\n\n\ttrimLines() {\n\t\treturn this.trim('[\\\\r\\\\n]');\n\t}\n\n\ttrim(charType) {\n\t\treturn this.trimStart(charType).trimEnd(charType);\n\t}\n\n\ttrimStart(charType) {\n\t\tconst rx = new RegExp('^' + (charType || '\\\\s') + '+');\n\t\tthis.intro = this.intro.replace(rx, '');\n\n\t\tif (!this.intro) {\n\t\t\tlet source;\n\t\t\tlet i = 0;\n\n\t\t\tdo {\n\t\t\t\tsource = this.sources[i++];\n\t\t\t\tif (!source) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} while (!source.content.trimStartAborted(charType));\n\t\t}\n\n\t\treturn this;\n\t}\n\n\ttrimEnd(charType) {\n\t\tconst rx = new RegExp((charType || '\\\\s') + '+$');\n\n\t\tlet source;\n\t\tlet i = this.sources.length - 1;\n\n\t\tdo {\n\t\t\tsource = this.sources[i--];\n\t\t\tif (!source) {\n\t\t\t\tthis.intro = this.intro.replace(rx, '');\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} while (!source.content.trimEndAborted(charType));\n\n\t\treturn this;\n\t}\n}\n","import MagicString from './MagicString.js';\nimport Bundle from './Bundle.js';\nimport SourceMap from './SourceMap.js';\n\nMagicString.Bundle = Bundle;\nMagicString.SourceMap = SourceMap;\nMagicString.default = MagicString; // work around TypeScript bug https://github.com/Rich-Harris/magic-string/pull/121\n\nexport default MagicString;\n"],"names":["encode"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"magic-string.cjs.js","sources":["../src/BitSet.js","../src/Chunk.js","../src/SourceMap.js","../src/utils/guessIndent.js","../src/utils/getRelativePath.js","../src/utils/isObject.js","../src/utils/getLocator.js","../src/utils/Mappings.js","../src/MagicString.js","../src/Bundle.js","../src/index-legacy.js"],"sourcesContent":["export default class BitSet {\n\tconstructor(arg) {\n\t\tthis.bits = arg instanceof BitSet ? arg.bits.slice() : [];\n\t}\n\n\tadd(n) {\n\t\tthis.bits[n >> 5] |= 1 << (n & 31);\n\t}\n\n\thas(n) {\n\t\treturn !!(this.bits[n >> 5] & (1 << (n & 31)));\n\t}\n}\n","export default class Chunk {\n\tconstructor(start, end, content) {\n\t\tthis.start = start;\n\t\tthis.end = end;\n\t\tthis.original = content;\n\n\t\tthis.intro = '';\n\t\tthis.outro = '';\n\n\t\tthis.content = content;\n\t\tthis.storeName = false;\n\t\tthis.edited = false;\n\n\t\tif (DEBUG) {\n\t\t\t// we make these non-enumerable, for sanity while debugging\n\t\t\tObject.defineProperties(this, {\n\t\t\t\tprevious: { writable: true, value: null },\n\t\t\t\tnext: { writable: true, value: null },\n\t\t\t});\n\t\t} else {\n\t\t\tthis.previous = null;\n\t\t\tthis.next = null;\n\t\t}\n\t}\n\n\tappendLeft(content) {\n\t\tthis.outro += content;\n\t}\n\n\tappendRight(content) {\n\t\tthis.intro = this.intro + content;\n\t}\n\n\tclone() {\n\t\tconst chunk = new Chunk(this.start, this.end, this.original);\n\n\t\tchunk.intro = this.intro;\n\t\tchunk.outro = this.outro;\n\t\tchunk.content = this.content;\n\t\tchunk.storeName = this.storeName;\n\t\tchunk.edited = this.edited;\n\n\t\treturn chunk;\n\t}\n\n\tcontains(index) {\n\t\treturn this.start < index && index < this.end;\n\t}\n\n\teachNext(fn) {\n\t\tlet chunk = this;\n\t\twhile (chunk) {\n\t\t\tfn(chunk);\n\t\t\tchunk = chunk.next;\n\t\t}\n\t}\n\n\teachPrevious(fn) {\n\t\tlet chunk = this;\n\t\twhile (chunk) {\n\t\t\tfn(chunk);\n\t\t\tchunk = chunk.previous;\n\t\t}\n\t}\n\n\tedit(content, storeName, contentOnly) {\n\t\tthis.content = content;\n\t\tif (!contentOnly) {\n\t\t\tthis.intro = '';\n\t\t\tthis.outro = '';\n\t\t}\n\t\tthis.storeName = storeName;\n\n\t\tthis.edited = true;\n\n\t\treturn this;\n\t}\n\n\tprependLeft(content) {\n\t\tthis.outro = content + this.outro;\n\t}\n\n\tprependRight(content) {\n\t\tthis.intro = content + this.intro;\n\t}\n\n\treset() {\n\t\tthis.intro = '';\n\t\tthis.outro = '';\n\t\tif (this.edited) {\n\t\t\tthis.content = this.original;\n\t\t\tthis.storeName = false;\n\t\t\tthis.edited = false;\n\t\t}\n\t}\n\n\tsplit(index) {\n\t\tconst sliceIndex = index - this.start;\n\n\t\tconst originalBefore = this.original.slice(0, sliceIndex);\n\t\tconst originalAfter = this.original.slice(sliceIndex);\n\n\t\tthis.original = originalBefore;\n\n\t\tconst newChunk = new Chunk(index, this.end, originalAfter);\n\t\tnewChunk.outro = this.outro;\n\t\tthis.outro = '';\n\n\t\tthis.end = index;\n\n\t\tif (this.edited) {\n\t\t\t// after split we should save the edit content record into the correct chunk\n\t\t\t// to make sure sourcemap correct\n\t\t\t// For example:\n\t\t\t// ' test'.trim()\n\t\t\t// split -> ' ' + 'test'\n\t\t\t// ✔️ edit -> '' + 'test'\n\t\t\t// ✖️ edit -> 'test' + '' \n\t\t\t// TODO is this block necessary?...\n\t\t\tnewChunk.edit('', false);\n\t\t\tthis.content = '';\n\t\t} else {\n\t\t\tthis.content = originalBefore;\n\t\t}\n\n\t\tnewChunk.next = this.next;\n\t\tif (newChunk.next) newChunk.next.previous = newChunk;\n\t\tnewChunk.previous = this;\n\t\tthis.next = newChunk;\n\n\t\treturn newChunk;\n\t}\n\n\ttoString() {\n\t\treturn this.intro + this.content + this.outro;\n\t}\n\n\ttrimEnd(rx) {\n\t\tthis.outro = this.outro.replace(rx, '');\n\t\tif (this.outro.length) return true;\n\n\t\tconst trimmed = this.content.replace(rx, '');\n\n\t\tif (trimmed.length) {\n\t\t\tif (trimmed !== this.content) {\n\t\t\t\tthis.split(this.start + trimmed.length).edit('', undefined, true);\n\t\t\t\tif (this.edited) {\n\t\t\t\t\t// save the change, if it has been edited\n\t\t\t\t\tthis.edit(trimmed, this.storeName, true);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} else {\n\t\t\tthis.edit('', undefined, true);\n\n\t\t\tthis.intro = this.intro.replace(rx, '');\n\t\t\tif (this.intro.length) return true;\n\t\t}\n\t}\n\n\ttrimStart(rx) {\n\t\tthis.intro = this.intro.replace(rx, '');\n\t\tif (this.intro.length) return true;\n\n\t\tconst trimmed = this.content.replace(rx, '');\n\n\t\tif (trimmed.length) {\n\t\t\tif (trimmed !== this.content) {\n\t\t\t\tconst newChunk = this.split(this.end - trimmed.length);\n\t\t\t\tif (this.edited) {\n\t\t\t\t\t// save the change, if it has been edited\n\t\t\t\t\tnewChunk.edit(trimmed, this.storeName, true);\n\t\t\t\t}\n\t\t\t\tthis.edit('', undefined, true);\n\t\t\t}\n\t\t\treturn true;\n\t\t} else {\n\t\t\tthis.edit('', undefined, true);\n\n\t\t\tthis.outro = this.outro.replace(rx, '');\n\t\t\tif (this.outro.length) return true;\n\t\t}\n\t}\n}\n","import { encode } from '@jridgewell/sourcemap-codec';\n\nfunction getBtoa() {\n\tif (typeof globalThis !== 'undefined' && typeof globalThis.btoa === 'function') {\n\t\treturn (str) => globalThis.btoa(unescape(encodeURIComponent(str)));\n\t} else if (typeof Buffer === 'function') {\n\t\treturn (str) => Buffer.from(str, 'utf-8').toString('base64');\n\t} else {\n\t\treturn () => {\n\t\t\tthrow new Error('Unsupported environment: `window.btoa` or `Buffer` should be supported.');\n\t\t};\n\t}\n}\n\nconst btoa = /*#__PURE__*/ getBtoa();\n\nexport default class SourceMap {\n\tconstructor(properties) {\n\t\tthis.version = 3;\n\t\tthis.file = properties.file;\n\t\tthis.sources = properties.sources;\n\t\tthis.sourcesContent = properties.sourcesContent;\n\t\tthis.names = properties.names;\n\t\tthis.mappings = encode(properties.mappings);\n\t\tif (typeof properties.x_google_ignoreList !== 'undefined') {\n\t\t\tthis.x_google_ignoreList = properties.x_google_ignoreList;\n\t\t}\n\t}\n\n\ttoString() {\n\t\treturn JSON.stringify(this);\n\t}\n\n\ttoUrl() {\n\t\treturn 'data:application/json;charset=utf-8;base64,' + btoa(this.toString());\n\t}\n}\n","export default function guessIndent(code) {\n\tconst lines = code.split('\\n');\n\n\tconst tabbed = lines.filter((line) => /^\\t+/.test(line));\n\tconst spaced = lines.filter((line) => /^ {2,}/.test(line));\n\n\tif (tabbed.length === 0 && spaced.length === 0) {\n\t\treturn null;\n\t}\n\n\t// More lines tabbed than spaced? Assume tabs, and\n\t// default to tabs in the case of a tie (or nothing\n\t// to go on)\n\tif (tabbed.length >= spaced.length) {\n\t\treturn '\\t';\n\t}\n\n\t// Otherwise, we need to guess the multiple\n\tconst min = spaced.reduce((previous, current) => {\n\t\tconst numSpaces = /^ +/.exec(current)[0].length;\n\t\treturn Math.min(numSpaces, previous);\n\t}, Infinity);\n\n\treturn new Array(min + 1).join(' ');\n}\n","export default function getRelativePath(from, to) {\n\tconst fromParts = from.split(/[/\\\\]/);\n\tconst toParts = to.split(/[/\\\\]/);\n\n\tfromParts.pop(); // get dirname\n\n\twhile (fromParts[0] === toParts[0]) {\n\t\tfromParts.shift();\n\t\ttoParts.shift();\n\t}\n\n\tif (fromParts.length) {\n\t\tlet i = fromParts.length;\n\t\twhile (i--) fromParts[i] = '..';\n\t}\n\n\treturn fromParts.concat(toParts).join('/');\n}\n","const toString = Object.prototype.toString;\n\nexport default function isObject(thing) {\n\treturn toString.call(thing) === '[object Object]';\n}\n","export default function getLocator(source) {\n\tconst originalLines = source.split('\\n');\n\tconst lineOffsets = [];\n\n\tfor (let i = 0, pos = 0; i < originalLines.length; i++) {\n\t\tlineOffsets.push(pos);\n\t\tpos += originalLines[i].length + 1;\n\t}\n\n\treturn function locate(index) {\n\t\tlet i = 0;\n\t\tlet j = lineOffsets.length;\n\t\twhile (i < j) {\n\t\t\tconst m = (i + j) >> 1;\n\t\t\tif (index < lineOffsets[m]) {\n\t\t\t\tj = m;\n\t\t\t} else {\n\t\t\t\ti = m + 1;\n\t\t\t}\n\t\t}\n\t\tconst line = i - 1;\n\t\tconst column = index - lineOffsets[line];\n\t\treturn { line, column };\n\t};\n}\n","const wordRegex = /\\w/;\n\nexport default class Mappings {\n\tconstructor(hires) {\n\t\tthis.hires = hires;\n\t\tthis.generatedCodeLine = 0;\n\t\tthis.generatedCodeColumn = 0;\n\t\tthis.raw = [];\n\t\tthis.rawSegments = this.raw[this.generatedCodeLine] = [];\n\t\tthis.pending = null;\n\t}\n\n\taddEdit(sourceIndex, content, loc, nameIndex) {\n\t\tif (content.length) {\n\t\t\tconst contentLengthMinusOne = content.length - 1;\n\t\t\tlet contentLineEnd = content.indexOf('\\n', 0);\n\t\t\tlet previousContentLineEnd = -1;\n\t\t\t// Loop through each line in the content and add a segment, but stop if the last line is empty,\n\t\t\t// else code afterwards would fill one line too many\n\t\t\twhile (contentLineEnd >= 0 && contentLengthMinusOne > contentLineEnd) {\n\t\t\t\tconst segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];\n\t\t\t\tif (nameIndex >= 0) {\n\t\t\t\t\tsegment.push(nameIndex);\n\t\t\t\t}\n\t\t\t\tthis.rawSegments.push(segment);\n\n\t\t\t\tthis.generatedCodeLine += 1;\n\t\t\t\tthis.raw[this.generatedCodeLine] = this.rawSegments = [];\n\t\t\t\tthis.generatedCodeColumn = 0;\n\n\t\t\t\tpreviousContentLineEnd = contentLineEnd;\n\t\t\t\tcontentLineEnd = content.indexOf('\\n', contentLineEnd + 1);\n\t\t\t}\n\n\t\t\tconst segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];\n\t\t\tif (nameIndex >= 0) {\n\t\t\t\tsegment.push(nameIndex);\n\t\t\t}\n\t\t\tthis.rawSegments.push(segment);\n\n\t\t\tthis.advance(content.slice(previousContentLineEnd + 1));\n\t\t} else if (this.pending) {\n\t\t\tthis.rawSegments.push(this.pending);\n\t\t\tthis.advance(content);\n\t\t}\n\n\t\tthis.pending = null;\n\t}\n\n\taddUneditedChunk(sourceIndex, chunk, original, loc, sourcemapLocations) {\n\t\tlet originalCharIndex = chunk.start;\n\t\tlet first = true;\n\t\t// when iterating each char, check if it's in a word boundary\n\t\tlet charInHiresBoundary = false;\n\n\t\twhile (originalCharIndex < chunk.end) {\n\t\t\tif (this.hires || first || sourcemapLocations.has(originalCharIndex)) {\n\t\t\t\tconst segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];\n\n\t\t\t\tif (this.hires === 'boundary') {\n\t\t\t\t\t// in hires \"boundary\", group segments per word boundary than per char\n\t\t\t\t\tif (wordRegex.test(original[originalCharIndex])) {\n\t\t\t\t\t\t// for first char in the boundary found, start the boundary by pushing a segment\n\t\t\t\t\t\tif (!charInHiresBoundary) {\n\t\t\t\t\t\t\tthis.rawSegments.push(segment);\n\t\t\t\t\t\t\tcharInHiresBoundary = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// for non-word char, end the boundary by pushing a segment\n\t\t\t\t\t\tthis.rawSegments.push(segment);\n\t\t\t\t\t\tcharInHiresBoundary = false;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.rawSegments.push(segment);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (original[originalCharIndex] === '\\n') {\n\t\t\t\tloc.line += 1;\n\t\t\t\tloc.column = 0;\n\t\t\t\tthis.generatedCodeLine += 1;\n\t\t\t\tthis.raw[this.generatedCodeLine] = this.rawSegments = [];\n\t\t\t\tthis.generatedCodeColumn = 0;\n\t\t\t\tfirst = true;\n\t\t\t} else {\n\t\t\t\tloc.column += 1;\n\t\t\t\tthis.generatedCodeColumn += 1;\n\t\t\t\tfirst = false;\n\t\t\t}\n\n\t\t\toriginalCharIndex += 1;\n\t\t}\n\n\t\tthis.pending = null;\n\t}\n\n\tadvance(str) {\n\t\tif (!str) return;\n\n\t\tconst lines = str.split('\\n');\n\n\t\tif (lines.length > 1) {\n\t\t\tfor (let i = 0; i < lines.length - 1; i++) {\n\t\t\t\tthis.generatedCodeLine++;\n\t\t\t\tthis.raw[this.generatedCodeLine] = this.rawSegments = [];\n\t\t\t}\n\t\t\tthis.generatedCodeColumn = 0;\n\t\t}\n\n\t\tthis.generatedCodeColumn += lines[lines.length - 1].length;\n\t}\n}\n","import BitSet from './BitSet.js';\nimport Chunk from './Chunk.js';\nimport SourceMap from './SourceMap.js';\nimport guessIndent from './utils/guessIndent.js';\nimport getRelativePath from './utils/getRelativePath.js';\nimport isObject from './utils/isObject.js';\nimport getLocator from './utils/getLocator.js';\nimport Mappings from './utils/Mappings.js';\nimport Stats from './utils/Stats.js';\n\nconst n = '\\n';\n\nconst warned = {\n\tinsertLeft: false,\n\tinsertRight: false,\n\tstoreName: false,\n};\n\nexport default class MagicString {\n\tconstructor(string, options = {}) {\n\t\tconst chunk = new Chunk(0, string.length, string);\n\n\t\tObject.defineProperties(this, {\n\t\t\toriginal: { writable: true, value: string },\n\t\t\toutro: { writable: true, value: '' },\n\t\t\tintro: { writable: true, value: '' },\n\t\t\tfirstChunk: { writable: true, value: chunk },\n\t\t\tlastChunk: { writable: true, value: chunk },\n\t\t\tlastSearchedChunk: { writable: true, value: chunk },\n\t\t\tbyStart: { writable: true, value: {} },\n\t\t\tbyEnd: { writable: true, value: {} },\n\t\t\tfilename: { writable: true, value: options.filename },\n\t\t\tindentExclusionRanges: { writable: true, value: options.indentExclusionRanges },\n\t\t\tsourcemapLocations: { writable: true, value: new BitSet() },\n\t\t\tstoredNames: { writable: true, value: {} },\n\t\t\tindentStr: { writable: true, value: undefined },\n\t\t\tignoreList: { writable: true, value: options.ignoreList },\n\t\t});\n\n\t\tif (DEBUG) {\n\t\t\tObject.defineProperty(this, 'stats', { value: new Stats() });\n\t\t}\n\n\t\tthis.byStart[0] = chunk;\n\t\tthis.byEnd[string.length] = chunk;\n\t}\n\n\taddSourcemapLocation(char) {\n\t\tthis.sourcemapLocations.add(char);\n\t}\n\n\tappend(content) {\n\t\tif (typeof content !== 'string') throw new TypeError('outro content must be a string');\n\n\t\tthis.outro += content;\n\t\treturn this;\n\t}\n\n\tappendLeft(index, content) {\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tif (DEBUG) this.stats.time('appendLeft');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byEnd[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.appendLeft(content);\n\t\t} else {\n\t\t\tthis.intro += content;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('appendLeft');\n\t\treturn this;\n\t}\n\n\tappendRight(index, content) {\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tif (DEBUG) this.stats.time('appendRight');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byStart[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.appendRight(content);\n\t\t} else {\n\t\t\tthis.outro += content;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('appendRight');\n\t\treturn this;\n\t}\n\n\tclone() {\n\t\tconst cloned = new MagicString(this.original, { filename: this.filename });\n\n\t\tlet originalChunk = this.firstChunk;\n\t\tlet clonedChunk = (cloned.firstChunk = cloned.lastSearchedChunk = originalChunk.clone());\n\n\t\twhile (originalChunk) {\n\t\t\tcloned.byStart[clonedChunk.start] = clonedChunk;\n\t\t\tcloned.byEnd[clonedChunk.end] = clonedChunk;\n\n\t\t\tconst nextOriginalChunk = originalChunk.next;\n\t\t\tconst nextClonedChunk = nextOriginalChunk && nextOriginalChunk.clone();\n\n\t\t\tif (nextClonedChunk) {\n\t\t\t\tclonedChunk.next = nextClonedChunk;\n\t\t\t\tnextClonedChunk.previous = clonedChunk;\n\n\t\t\t\tclonedChunk = nextClonedChunk;\n\t\t\t}\n\n\t\t\toriginalChunk = nextOriginalChunk;\n\t\t}\n\n\t\tcloned.lastChunk = clonedChunk;\n\n\t\tif (this.indentExclusionRanges) {\n\t\t\tcloned.indentExclusionRanges = this.indentExclusionRanges.slice();\n\t\t}\n\n\t\tcloned.sourcemapLocations = new BitSet(this.sourcemapLocations);\n\n\t\tcloned.intro = this.intro;\n\t\tcloned.outro = this.outro;\n\n\t\treturn cloned;\n\t}\n\n\tgenerateDecodedMap(options) {\n\t\toptions = options || {};\n\n\t\tconst sourceIndex = 0;\n\t\tconst names = Object.keys(this.storedNames);\n\t\tconst mappings = new Mappings(options.hires);\n\n\t\tconst locate = getLocator(this.original);\n\n\t\tif (this.intro) {\n\t\t\tmappings.advance(this.intro);\n\t\t}\n\n\t\tthis.firstChunk.eachNext((chunk) => {\n\t\t\tconst loc = locate(chunk.start);\n\n\t\t\tif (chunk.intro.length) mappings.advance(chunk.intro);\n\n\t\t\tif (chunk.edited) {\n\t\t\t\tmappings.addEdit(\n\t\t\t\t\tsourceIndex,\n\t\t\t\t\tchunk.content,\n\t\t\t\t\tloc,\n\t\t\t\t\tchunk.storeName ? names.indexOf(chunk.original) : -1,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tmappings.addUneditedChunk(sourceIndex, chunk, this.original, loc, this.sourcemapLocations);\n\t\t\t}\n\n\t\t\tif (chunk.outro.length) mappings.advance(chunk.outro);\n\t\t});\n\n\t\treturn {\n\t\t\tfile: options.file ? options.file.split(/[/\\\\]/).pop() : undefined,\n\t\t\tsources: [\n\t\t\t\toptions.source ? getRelativePath(options.file || '', options.source) : options.file || '',\n\t\t\t],\n\t\t\tsourcesContent: options.includeContent ? [this.original] : undefined,\n\t\t\tnames,\n\t\t\tmappings: mappings.raw,\n\t\t\tx_google_ignoreList: this.ignoreList ? [sourceIndex] : undefined,\n\t\t};\n\t}\n\n\tgenerateMap(options) {\n\t\treturn new SourceMap(this.generateDecodedMap(options));\n\t}\n\n\t_ensureindentStr() {\n\t\tif (this.indentStr === undefined) {\n\t\t\tthis.indentStr = guessIndent(this.original);\n\t\t}\n\t}\n\n\t_getRawIndentString() {\n\t\tthis._ensureindentStr();\n\t\treturn this.indentStr;\n\t}\n\n\tgetIndentString() {\n\t\tthis._ensureindentStr();\n\t\treturn this.indentStr === null ? '\\t' : this.indentStr;\n\t}\n\n\tindent(indentStr, options) {\n\t\tconst pattern = /^[^\\r\\n]/gm;\n\n\t\tif (isObject(indentStr)) {\n\t\t\toptions = indentStr;\n\t\t\tindentStr = undefined;\n\t\t}\n\n\t\tif (indentStr === undefined) {\n\t\t\tthis._ensureindentStr();\n\t\t\tindentStr = this.indentStr || '\\t';\n\t\t}\n\n\t\tif (indentStr === '') return this; // noop\n\n\t\toptions = options || {};\n\n\t\t// Process exclusion ranges\n\t\tconst isExcluded = {};\n\n\t\tif (options.exclude) {\n\t\t\tconst exclusions =\n\t\t\t\ttypeof options.exclude[0] === 'number' ? [options.exclude] : options.exclude;\n\t\t\texclusions.forEach((exclusion) => {\n\t\t\t\tfor (let i = exclusion[0]; i < exclusion[1]; i += 1) {\n\t\t\t\t\tisExcluded[i] = true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tlet shouldIndentNextCharacter = options.indentStart !== false;\n\t\tconst replacer = (match) => {\n\t\t\tif (shouldIndentNextCharacter) return `${indentStr}${match}`;\n\t\t\tshouldIndentNextCharacter = true;\n\t\t\treturn match;\n\t\t};\n\n\t\tthis.intro = this.intro.replace(pattern, replacer);\n\n\t\tlet charIndex = 0;\n\t\tlet chunk = this.firstChunk;\n\n\t\twhile (chunk) {\n\t\t\tconst end = chunk.end;\n\n\t\t\tif (chunk.edited) {\n\t\t\t\tif (!isExcluded[charIndex]) {\n\t\t\t\t\tchunk.content = chunk.content.replace(pattern, replacer);\n\n\t\t\t\t\tif (chunk.content.length) {\n\t\t\t\t\t\tshouldIndentNextCharacter = chunk.content[chunk.content.length - 1] === '\\n';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcharIndex = chunk.start;\n\n\t\t\t\twhile (charIndex < end) {\n\t\t\t\t\tif (!isExcluded[charIndex]) {\n\t\t\t\t\t\tconst char = this.original[charIndex];\n\n\t\t\t\t\t\tif (char === '\\n') {\n\t\t\t\t\t\t\tshouldIndentNextCharacter = true;\n\t\t\t\t\t\t} else if (char !== '\\r' && shouldIndentNextCharacter) {\n\t\t\t\t\t\t\tshouldIndentNextCharacter = false;\n\n\t\t\t\t\t\t\tif (charIndex === chunk.start) {\n\t\t\t\t\t\t\t\tchunk.prependRight(indentStr);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis._splitChunk(chunk, charIndex);\n\t\t\t\t\t\t\t\tchunk = chunk.next;\n\t\t\t\t\t\t\t\tchunk.prependRight(indentStr);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcharIndex += 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcharIndex = chunk.end;\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\tthis.outro = this.outro.replace(pattern, replacer);\n\n\t\treturn this;\n\t}\n\n\tinsert() {\n\t\tthrow new Error(\n\t\t\t'magicString.insert(...) is deprecated. Use prependRight(...) or appendLeft(...)',\n\t\t);\n\t}\n\n\tinsertLeft(index, content) {\n\t\tif (!warned.insertLeft) {\n\t\t\tconsole.warn(\n\t\t\t\t'magicString.insertLeft(...) is deprecated. Use magicString.appendLeft(...) instead',\n\t\t\t); // eslint-disable-line no-console\n\t\t\twarned.insertLeft = true;\n\t\t}\n\n\t\treturn this.appendLeft(index, content);\n\t}\n\n\tinsertRight(index, content) {\n\t\tif (!warned.insertRight) {\n\t\t\tconsole.warn(\n\t\t\t\t'magicString.insertRight(...) is deprecated. Use magicString.prependRight(...) instead',\n\t\t\t); // eslint-disable-line no-console\n\t\t\twarned.insertRight = true;\n\t\t}\n\n\t\treturn this.prependRight(index, content);\n\t}\n\n\tmove(start, end, index) {\n\t\tif (index >= start && index <= end) throw new Error('Cannot move a selection inside itself');\n\n\t\tif (DEBUG) this.stats.time('move');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\t\tthis._split(index);\n\n\t\tconst first = this.byStart[start];\n\t\tconst last = this.byEnd[end];\n\n\t\tconst oldLeft = first.previous;\n\t\tconst oldRight = last.next;\n\n\t\tconst newRight = this.byStart[index];\n\t\tif (!newRight && last === this.lastChunk) return this;\n\t\tconst newLeft = newRight ? newRight.previous : this.lastChunk;\n\n\t\tif (oldLeft) oldLeft.next = oldRight;\n\t\tif (oldRight) oldRight.previous = oldLeft;\n\n\t\tif (newLeft) newLeft.next = first;\n\t\tif (newRight) newRight.previous = last;\n\n\t\tif (!first.previous) this.firstChunk = last.next;\n\t\tif (!last.next) {\n\t\t\tthis.lastChunk = first.previous;\n\t\t\tthis.lastChunk.next = null;\n\t\t}\n\n\t\tfirst.previous = newLeft;\n\t\tlast.next = newRight || null;\n\n\t\tif (!newLeft) this.firstChunk = first;\n\t\tif (!newRight) this.lastChunk = last;\n\n\t\tif (DEBUG) this.stats.timeEnd('move');\n\t\treturn this;\n\t}\n\n\toverwrite(start, end, content, options) {\n\t\toptions = options || {};\n\t\treturn this.update(start, end, content, { ...options, overwrite: !options.contentOnly });\n\t}\n\n\tupdate(start, end, content, options) {\n\t\tif (typeof content !== 'string') throw new TypeError('replacement content must be a string');\n\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tif (end > this.original.length) throw new Error('end is out of bounds');\n\t\tif (start === end)\n\t\t\tthrow new Error(\n\t\t\t\t'Cannot overwrite a zero-length range – use appendLeft or prependRight instead',\n\t\t\t);\n\n\t\tif (DEBUG) this.stats.time('overwrite');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\n\t\tif (options === true) {\n\t\t\tif (!warned.storeName) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'The final argument to magicString.overwrite(...) should be an options object. See https://github.com/rich-harris/magic-string',\n\t\t\t\t); // eslint-disable-line no-console\n\t\t\t\twarned.storeName = true;\n\t\t\t}\n\n\t\t\toptions = { storeName: true };\n\t\t}\n\t\tconst storeName = options !== undefined ? options.storeName : false;\n\t\tconst overwrite = options !== undefined ? options.overwrite : false;\n\n\t\tif (storeName) {\n\t\t\tconst original = this.original.slice(start, end);\n\t\t\tObject.defineProperty(this.storedNames, original, {\n\t\t\t\twritable: true,\n\t\t\t\tvalue: true,\n\t\t\t\tenumerable: true,\n\t\t\t});\n\t\t}\n\n\t\tconst first = this.byStart[start];\n\t\tconst last = this.byEnd[end];\n\n\t\tif (first) {\n\t\t\tlet chunk = first;\n\t\t\twhile (chunk !== last) {\n\t\t\t\tif (chunk.next !== this.byStart[chunk.end]) {\n\t\t\t\t\tthrow new Error('Cannot overwrite across a split point');\n\t\t\t\t}\n\t\t\t\tchunk = chunk.next;\n\t\t\t\tchunk.edit('', false);\n\t\t\t}\n\n\t\t\tfirst.edit(content, storeName, !overwrite);\n\t\t} else {\n\t\t\t// must be inserting at the end\n\t\t\tconst newChunk = new Chunk(start, end, '').edit(content, storeName);\n\n\t\t\t// TODO last chunk in the array may not be the last chunk, if it's moved...\n\t\t\tlast.next = newChunk;\n\t\t\tnewChunk.previous = last;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('overwrite');\n\t\treturn this;\n\t}\n\n\tprepend(content) {\n\t\tif (typeof content !== 'string') throw new TypeError('outro content must be a string');\n\n\t\tthis.intro = content + this.intro;\n\t\treturn this;\n\t}\n\n\tprependLeft(index, content) {\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tif (DEBUG) this.stats.time('insertRight');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byEnd[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.prependLeft(content);\n\t\t} else {\n\t\t\tthis.intro = content + this.intro;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('insertRight');\n\t\treturn this;\n\t}\n\n\tprependRight(index, content) {\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tif (DEBUG) this.stats.time('insertRight');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byStart[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.prependRight(content);\n\t\t} else {\n\t\t\tthis.outro = content + this.outro;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('insertRight');\n\t\treturn this;\n\t}\n\n\tremove(start, end) {\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tif (start === end) return this;\n\n\t\tif (start < 0 || end > this.original.length) throw new Error('Character is out of bounds');\n\t\tif (start > end) throw new Error('end must be greater than start');\n\n\t\tif (DEBUG) this.stats.time('remove');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\n\t\tlet chunk = this.byStart[start];\n\n\t\twhile (chunk) {\n\t\t\tchunk.intro = '';\n\t\t\tchunk.outro = '';\n\t\t\tchunk.edit('');\n\n\t\t\tchunk = end > chunk.end ? this.byStart[chunk.end] : null;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('remove');\n\t\treturn this;\n\t}\n\n\treset(start, end) {\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tif (start === end) return this;\n\n\t\tif (start < 0 || end > this.original.length) throw new Error('Character is out of bounds');\n\t\tif (start > end) throw new Error('end must be greater than start');\n\n\t\tif (DEBUG) this.stats.time('reset');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\n\t\tlet chunk = this.byStart[start];\n\n\t\twhile (chunk) {\n\t\t\tchunk.reset();\n\n\t\t\tchunk = end > chunk.end ? this.byStart[chunk.end] : null;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('reset');\n\t\treturn this;\n\t}\n\n\tlastChar() {\n\t\tif (this.outro.length) return this.outro[this.outro.length - 1];\n\t\tlet chunk = this.lastChunk;\n\t\tdo {\n\t\t\tif (chunk.outro.length) return chunk.outro[chunk.outro.length - 1];\n\t\t\tif (chunk.content.length) return chunk.content[chunk.content.length - 1];\n\t\t\tif (chunk.intro.length) return chunk.intro[chunk.intro.length - 1];\n\t\t} while ((chunk = chunk.previous));\n\t\tif (this.intro.length) return this.intro[this.intro.length - 1];\n\t\treturn '';\n\t}\n\n\tlastLine() {\n\t\tlet lineIndex = this.outro.lastIndexOf(n);\n\t\tif (lineIndex !== -1) return this.outro.substr(lineIndex + 1);\n\t\tlet lineStr = this.outro;\n\t\tlet chunk = this.lastChunk;\n\t\tdo {\n\t\t\tif (chunk.outro.length > 0) {\n\t\t\t\tlineIndex = chunk.outro.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1) return chunk.outro.substr(lineIndex + 1) + lineStr;\n\t\t\t\tlineStr = chunk.outro + lineStr;\n\t\t\t}\n\n\t\t\tif (chunk.content.length > 0) {\n\t\t\t\tlineIndex = chunk.content.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1) return chunk.content.substr(lineIndex + 1) + lineStr;\n\t\t\t\tlineStr = chunk.content + lineStr;\n\t\t\t}\n\n\t\t\tif (chunk.intro.length > 0) {\n\t\t\t\tlineIndex = chunk.intro.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1) return chunk.intro.substr(lineIndex + 1) + lineStr;\n\t\t\t\tlineStr = chunk.intro + lineStr;\n\t\t\t}\n\t\t} while ((chunk = chunk.previous));\n\t\tlineIndex = this.intro.lastIndexOf(n);\n\t\tif (lineIndex !== -1) return this.intro.substr(lineIndex + 1) + lineStr;\n\t\treturn this.intro + lineStr;\n\t}\n\n\tslice(start = 0, end = this.original.length) {\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tlet result = '';\n\n\t\t// find start chunk\n\t\tlet chunk = this.firstChunk;\n\t\twhile (chunk && (chunk.start > start || chunk.end <= start)) {\n\t\t\t// found end chunk before start\n\t\t\tif (chunk.start < end && chunk.end >= end) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\tif (chunk && chunk.edited && chunk.start !== start)\n\t\t\tthrow new Error(`Cannot use replaced character ${start} as slice start anchor.`);\n\n\t\tconst startChunk = chunk;\n\t\twhile (chunk) {\n\t\t\tif (chunk.intro && (startChunk !== chunk || chunk.start === start)) {\n\t\t\t\tresult += chunk.intro;\n\t\t\t}\n\n\t\t\tconst containsEnd = chunk.start < end && chunk.end >= end;\n\t\t\tif (containsEnd && chunk.edited && chunk.end !== end)\n\t\t\t\tthrow new Error(`Cannot use replaced character ${end} as slice end anchor.`);\n\n\t\t\tconst sliceStart = startChunk === chunk ? start - chunk.start : 0;\n\t\t\tconst sliceEnd = containsEnd ? chunk.content.length + end - chunk.end : chunk.content.length;\n\n\t\t\tresult += chunk.content.slice(sliceStart, sliceEnd);\n\n\t\t\tif (chunk.outro && (!containsEnd || chunk.end === end)) {\n\t\t\t\tresult += chunk.outro;\n\t\t\t}\n\n\t\t\tif (containsEnd) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// TODO deprecate this? not really very useful\n\tsnip(start, end) {\n\t\tconst clone = this.clone();\n\t\tclone.remove(0, start);\n\t\tclone.remove(end, clone.original.length);\n\n\t\treturn clone;\n\t}\n\n\t_split(index) {\n\t\tif (this.byStart[index] || this.byEnd[index]) return;\n\n\t\tif (DEBUG) this.stats.time('_split');\n\n\t\tlet chunk = this.lastSearchedChunk;\n\t\tconst searchForward = index > chunk.end;\n\n\t\twhile (chunk) {\n\t\t\tif (chunk.contains(index)) return this._splitChunk(chunk, index);\n\n\t\t\tchunk = searchForward ? this.byStart[chunk.end] : this.byEnd[chunk.start];\n\t\t}\n\t}\n\n\t_splitChunk(chunk, index) {\n\t\tif (chunk.edited && chunk.content.length) {\n\t\t\t// zero-length edited chunks are a special case (overlapping replacements)\n\t\t\tconst loc = getLocator(this.original)(index);\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot split a chunk that has already been edited (${loc.line}:${loc.column} – \"${chunk.original}\")`,\n\t\t\t);\n\t\t}\n\n\t\tconst newChunk = chunk.split(index);\n\n\t\tthis.byEnd[index] = chunk;\n\t\tthis.byStart[index] = newChunk;\n\t\tthis.byEnd[newChunk.end] = newChunk;\n\n\t\tif (chunk === this.lastChunk) this.lastChunk = newChunk;\n\n\t\tthis.lastSearchedChunk = chunk;\n\t\tif (DEBUG) this.stats.timeEnd('_split');\n\t\treturn true;\n\t}\n\n\ttoString() {\n\t\tlet str = this.intro;\n\n\t\tlet chunk = this.firstChunk;\n\t\twhile (chunk) {\n\t\t\tstr += chunk.toString();\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\treturn str + this.outro;\n\t}\n\n\tisEmpty() {\n\t\tlet chunk = this.firstChunk;\n\t\tdo {\n\t\t\tif (\n\t\t\t\t(chunk.intro.length && chunk.intro.trim()) ||\n\t\t\t\t(chunk.content.length && chunk.content.trim()) ||\n\t\t\t\t(chunk.outro.length && chunk.outro.trim())\n\t\t\t)\n\t\t\t\treturn false;\n\t\t} while ((chunk = chunk.next));\n\t\treturn true;\n\t}\n\n\tlength() {\n\t\tlet chunk = this.firstChunk;\n\t\tlet length = 0;\n\t\tdo {\n\t\t\tlength += chunk.intro.length + chunk.content.length + chunk.outro.length;\n\t\t} while ((chunk = chunk.next));\n\t\treturn length;\n\t}\n\n\ttrimLines() {\n\t\treturn this.trim('[\\\\r\\\\n]');\n\t}\n\n\ttrim(charType) {\n\t\treturn this.trimStart(charType).trimEnd(charType);\n\t}\n\n\ttrimEndAborted(charType) {\n\t\tconst rx = new RegExp((charType || '\\\\s') + '+$');\n\n\t\tthis.outro = this.outro.replace(rx, '');\n\t\tif (this.outro.length) return true;\n\n\t\tlet chunk = this.lastChunk;\n\n\t\tdo {\n\t\t\tconst end = chunk.end;\n\t\t\tconst aborted = chunk.trimEnd(rx);\n\n\t\t\t// if chunk was trimmed, we have a new lastChunk\n\t\t\tif (chunk.end !== end) {\n\t\t\t\tif (this.lastChunk === chunk) {\n\t\t\t\t\tthis.lastChunk = chunk.next;\n\t\t\t\t}\n\n\t\t\t\tthis.byEnd[chunk.end] = chunk;\n\t\t\t\tthis.byStart[chunk.next.start] = chunk.next;\n\t\t\t\tthis.byEnd[chunk.next.end] = chunk.next;\n\t\t\t}\n\n\t\t\tif (aborted) return true;\n\t\t\tchunk = chunk.previous;\n\t\t} while (chunk);\n\n\t\treturn false;\n\t}\n\n\ttrimEnd(charType) {\n\t\tthis.trimEndAborted(charType);\n\t\treturn this;\n\t}\n\ttrimStartAborted(charType) {\n\t\tconst rx = new RegExp('^' + (charType || '\\\\s') + '+');\n\n\t\tthis.intro = this.intro.replace(rx, '');\n\t\tif (this.intro.length) return true;\n\n\t\tlet chunk = this.firstChunk;\n\n\t\tdo {\n\t\t\tconst end = chunk.end;\n\t\t\tconst aborted = chunk.trimStart(rx);\n\n\t\t\tif (chunk.end !== end) {\n\t\t\t\t// special case...\n\t\t\t\tif (chunk === this.lastChunk) this.lastChunk = chunk.next;\n\n\t\t\t\tthis.byEnd[chunk.end] = chunk;\n\t\t\t\tthis.byStart[chunk.next.start] = chunk.next;\n\t\t\t\tthis.byEnd[chunk.next.end] = chunk.next;\n\t\t\t}\n\n\t\t\tif (aborted) return true;\n\t\t\tchunk = chunk.next;\n\t\t} while (chunk);\n\n\t\treturn false;\n\t}\n\n\ttrimStart(charType) {\n\t\tthis.trimStartAborted(charType);\n\t\treturn this;\n\t}\n\n\thasChanged() {\n\t\treturn this.original !== this.toString();\n\t}\n\n\t_replaceRegexp(searchValue, replacement) {\n\t\tfunction getReplacement(match, str) {\n\t\t\tif (typeof replacement === 'string') {\n\t\t\t\treturn replacement.replace(/\\$(\\$|&|\\d+)/g, (_, i) => {\n\t\t\t\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_a_parameter\n\t\t\t\t\tif (i === '$') return '$';\n\t\t\t\t\tif (i === '&') return match[0];\n\t\t\t\t\tconst num = +i;\n\t\t\t\t\tif (num < match.length) return match[+i];\n\t\t\t\t\treturn `$${i}`;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn replacement(...match, match.index, str, match.groups);\n\t\t\t}\n\t\t}\n\t\tfunction matchAll(re, str) {\n\t\t\tlet match;\n\t\t\tconst matches = [];\n\t\t\twhile ((match = re.exec(str))) {\n\t\t\t\tmatches.push(match);\n\t\t\t}\n\t\t\treturn matches;\n\t\t}\n\t\tif (searchValue.global) {\n\t\t\tconst matches = matchAll(searchValue, this.original);\n\t\t\tmatches.forEach((match) => {\n\t\t\t\tif (match.index != null) {\n\t\t\t\t\tconst replacement = getReplacement(match, this.original);\n\t\t\t\t\tif (replacement !== match[0]) {\n\t\t\t\t\t\tthis.overwrite(\n\t\t\t\t\t\t\tmatch.index,\n\t\t\t\t\t\t\tmatch.index + match[0].length,\n\t\t\t\t\t\t\treplacement\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tconst match = this.original.match(searchValue);\n\t\t\tif (match && match.index != null) {\n\t\t\t\tconst replacement = getReplacement(match, this.original);\n\t\t\t\tif (replacement !== match[0]) {\n\t\t\t\t\tthis.overwrite(\n\t\t\t\t\t\tmatch.index,\n\t\t\t\t\t\tmatch.index + match[0].length,\n\t\t\t\t\t\treplacement\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\t_replaceString(string, replacement) {\n\t\tconst { original } = this;\n\t\tconst index = original.indexOf(string);\n\n\t\tif (index !== -1) {\n\t\t\tthis.overwrite(index, index + string.length, replacement);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\treplace(searchValue, replacement) {\n\t\tif (typeof searchValue === 'string') {\n\t\t\treturn this._replaceString(searchValue, replacement);\n\t\t}\n\n\t\treturn this._replaceRegexp(searchValue, replacement);\n\t}\n\n\t_replaceAllString(string, replacement) {\n\t\tconst { original } = this;\n\t\tconst stringLength = string.length;\n\t\tfor (\n\t\t\tlet index = original.indexOf(string);\n\t\t\tindex !== -1;\n\t\t\tindex = original.indexOf(string, index + stringLength)\n\t\t) {\n\t\t\tconst previous = original.slice(index, index + stringLength);\n\t\t\tif (previous !== replacement)\n\t\t\t\tthis.overwrite(index, index + stringLength, replacement);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\treplaceAll(searchValue, replacement) {\n\t\tif (typeof searchValue === 'string') {\n\t\t\treturn this._replaceAllString(searchValue, replacement);\n\t\t}\n\n\t\tif (!searchValue.global) {\n\t\t\tthrow new TypeError(\n\t\t\t\t'MagicString.prototype.replaceAll called with a non-global RegExp argument',\n\t\t\t);\n\t\t}\n\n\t\treturn this._replaceRegexp(searchValue, replacement);\n\t}\n}\n","import MagicString from './MagicString.js';\nimport SourceMap from './SourceMap.js';\nimport getRelativePath from './utils/getRelativePath.js';\nimport isObject from './utils/isObject.js';\nimport getLocator from './utils/getLocator.js';\nimport Mappings from './utils/Mappings.js';\n\nconst hasOwnProp = Object.prototype.hasOwnProperty;\n\nexport default class Bundle {\n\tconstructor(options = {}) {\n\t\tthis.intro = options.intro || '';\n\t\tthis.separator = options.separator !== undefined ? options.separator : '\\n';\n\t\tthis.sources = [];\n\t\tthis.uniqueSources = [];\n\t\tthis.uniqueSourceIndexByFilename = {};\n\t}\n\n\taddSource(source) {\n\t\tif (source instanceof MagicString) {\n\t\t\treturn this.addSource({\n\t\t\t\tcontent: source,\n\t\t\t\tfilename: source.filename,\n\t\t\t\tseparator: this.separator,\n\t\t\t});\n\t\t}\n\n\t\tif (!isObject(source) || !source.content) {\n\t\t\tthrow new Error(\n\t\t\t\t'bundle.addSource() takes an object with a `content` property, which should be an instance of MagicString, and an optional `filename`',\n\t\t\t);\n\t\t}\n\n\t\t['filename', 'ignoreList', 'indentExclusionRanges', 'separator'].forEach((option) => {\n\t\t\tif (!hasOwnProp.call(source, option)) source[option] = source.content[option];\n\t\t});\n\n\t\tif (source.separator === undefined) {\n\t\t\t// TODO there's a bunch of this sort of thing, needs cleaning up\n\t\t\tsource.separator = this.separator;\n\t\t}\n\n\t\tif (source.filename) {\n\t\t\tif (!hasOwnProp.call(this.uniqueSourceIndexByFilename, source.filename)) {\n\t\t\t\tthis.uniqueSourceIndexByFilename[source.filename] = this.uniqueSources.length;\n\t\t\t\tthis.uniqueSources.push({ filename: source.filename, content: source.content.original });\n\t\t\t} else {\n\t\t\t\tconst uniqueSource = this.uniqueSources[this.uniqueSourceIndexByFilename[source.filename]];\n\t\t\t\tif (source.content.original !== uniqueSource.content) {\n\t\t\t\t\tthrow new Error(`Illegal source: same filename (${source.filename}), different contents`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.sources.push(source);\n\t\treturn this;\n\t}\n\n\tappend(str, options) {\n\t\tthis.addSource({\n\t\t\tcontent: new MagicString(str),\n\t\t\tseparator: (options && options.separator) || '',\n\t\t});\n\n\t\treturn this;\n\t}\n\n\tclone() {\n\t\tconst bundle = new Bundle({\n\t\t\tintro: this.intro,\n\t\t\tseparator: this.separator,\n\t\t});\n\n\t\tthis.sources.forEach((source) => {\n\t\t\tbundle.addSource({\n\t\t\t\tfilename: source.filename,\n\t\t\t\tcontent: source.content.clone(),\n\t\t\t\tseparator: source.separator,\n\t\t\t});\n\t\t});\n\n\t\treturn bundle;\n\t}\n\n\tgenerateDecodedMap(options = {}) {\n\t\tconst names = [];\n\t\tlet x_google_ignoreList = undefined;\n\t\tthis.sources.forEach((source) => {\n\t\t\tObject.keys(source.content.storedNames).forEach((name) => {\n\t\t\t\tif (!~names.indexOf(name)) names.push(name);\n\t\t\t});\n\t\t});\n\n\t\tconst mappings = new Mappings(options.hires);\n\n\t\tif (this.intro) {\n\t\t\tmappings.advance(this.intro);\n\t\t}\n\n\t\tthis.sources.forEach((source, i) => {\n\t\t\tif (i > 0) {\n\t\t\t\tmappings.advance(this.separator);\n\t\t\t}\n\n\t\t\tconst sourceIndex = source.filename ? this.uniqueSourceIndexByFilename[source.filename] : -1;\n\t\t\tconst magicString = source.content;\n\t\t\tconst locate = getLocator(magicString.original);\n\n\t\t\tif (magicString.intro) {\n\t\t\t\tmappings.advance(magicString.intro);\n\t\t\t}\n\n\t\t\tmagicString.firstChunk.eachNext((chunk) => {\n\t\t\t\tconst loc = locate(chunk.start);\n\n\t\t\t\tif (chunk.intro.length) mappings.advance(chunk.intro);\n\n\t\t\t\tif (source.filename) {\n\t\t\t\t\tif (chunk.edited) {\n\t\t\t\t\t\tmappings.addEdit(\n\t\t\t\t\t\t\tsourceIndex,\n\t\t\t\t\t\t\tchunk.content,\n\t\t\t\t\t\t\tloc,\n\t\t\t\t\t\t\tchunk.storeName ? names.indexOf(chunk.original) : -1,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmappings.addUneditedChunk(\n\t\t\t\t\t\t\tsourceIndex,\n\t\t\t\t\t\t\tchunk,\n\t\t\t\t\t\t\tmagicString.original,\n\t\t\t\t\t\t\tloc,\n\t\t\t\t\t\t\tmagicString.sourcemapLocations,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tmappings.advance(chunk.content);\n\t\t\t\t}\n\n\t\t\t\tif (chunk.outro.length) mappings.advance(chunk.outro);\n\t\t\t});\n\n\t\t\tif (magicString.outro) {\n\t\t\t\tmappings.advance(magicString.outro);\n\t\t\t}\n\n\t\t\tif (source.ignoreList && sourceIndex !== -1) {\n\t\t\t\tif (x_google_ignoreList === undefined) {\n\t\t\t\t\tx_google_ignoreList = [];\n\t\t\t\t}\n\t\t\t\tx_google_ignoreList.push(sourceIndex);\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tfile: options.file ? options.file.split(/[/\\\\]/).pop() : undefined,\n\t\t\tsources: this.uniqueSources.map((source) => {\n\t\t\t\treturn options.file ? getRelativePath(options.file, source.filename) : source.filename;\n\t\t\t}),\n\t\t\tsourcesContent: this.uniqueSources.map((source) => {\n\t\t\t\treturn options.includeContent ? source.content : null;\n\t\t\t}),\n\t\t\tnames,\n\t\t\tmappings: mappings.raw,\n\t\t\tx_google_ignoreList,\n\t\t};\n\t}\n\n\tgenerateMap(options) {\n\t\treturn new SourceMap(this.generateDecodedMap(options));\n\t}\n\n\tgetIndentString() {\n\t\tconst indentStringCounts = {};\n\n\t\tthis.sources.forEach((source) => {\n\t\t\tconst indentStr = source.content._getRawIndentString();\n\n\t\t\tif (indentStr === null) return;\n\n\t\t\tif (!indentStringCounts[indentStr]) indentStringCounts[indentStr] = 0;\n\t\t\tindentStringCounts[indentStr] += 1;\n\t\t});\n\n\t\treturn (\n\t\t\tObject.keys(indentStringCounts).sort((a, b) => {\n\t\t\t\treturn indentStringCounts[a] - indentStringCounts[b];\n\t\t\t})[0] || '\\t'\n\t\t);\n\t}\n\n\tindent(indentStr) {\n\t\tif (!arguments.length) {\n\t\t\tindentStr = this.getIndentString();\n\t\t}\n\n\t\tif (indentStr === '') return this; // noop\n\n\t\tlet trailingNewline = !this.intro || this.intro.slice(-1) === '\\n';\n\n\t\tthis.sources.forEach((source, i) => {\n\t\t\tconst separator = source.separator !== undefined ? source.separator : this.separator;\n\t\t\tconst indentStart = trailingNewline || (i > 0 && /\\r?\\n$/.test(separator));\n\n\t\t\tsource.content.indent(indentStr, {\n\t\t\t\texclude: source.indentExclusionRanges,\n\t\t\t\tindentStart, //: trailingNewline || /\\r?\\n$/.test( separator ) //true///\\r?\\n/.test( separator )\n\t\t\t});\n\n\t\t\ttrailingNewline = source.content.lastChar() === '\\n';\n\t\t});\n\n\t\tif (this.intro) {\n\t\t\tthis.intro =\n\t\t\t\tindentStr +\n\t\t\t\tthis.intro.replace(/^[^\\n]/gm, (match, index) => {\n\t\t\t\t\treturn index > 0 ? indentStr + match : match;\n\t\t\t\t});\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tprepend(str) {\n\t\tthis.intro = str + this.intro;\n\t\treturn this;\n\t}\n\n\ttoString() {\n\t\tconst body = this.sources\n\t\t\t.map((source, i) => {\n\t\t\t\tconst separator = source.separator !== undefined ? source.separator : this.separator;\n\t\t\t\tconst str = (i > 0 ? separator : '') + source.content.toString();\n\n\t\t\t\treturn str;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn this.intro + body;\n\t}\n\n\tisEmpty() {\n\t\tif (this.intro.length && this.intro.trim()) return false;\n\t\tif (this.sources.some((source) => !source.content.isEmpty())) return false;\n\t\treturn true;\n\t}\n\n\tlength() {\n\t\treturn this.sources.reduce(\n\t\t\t(length, source) => length + source.content.length(),\n\t\t\tthis.intro.length,\n\t\t);\n\t}\n\n\ttrimLines() {\n\t\treturn this.trim('[\\\\r\\\\n]');\n\t}\n\n\ttrim(charType) {\n\t\treturn this.trimStart(charType).trimEnd(charType);\n\t}\n\n\ttrimStart(charType) {\n\t\tconst rx = new RegExp('^' + (charType || '\\\\s') + '+');\n\t\tthis.intro = this.intro.replace(rx, '');\n\n\t\tif (!this.intro) {\n\t\t\tlet source;\n\t\t\tlet i = 0;\n\n\t\t\tdo {\n\t\t\t\tsource = this.sources[i++];\n\t\t\t\tif (!source) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} while (!source.content.trimStartAborted(charType));\n\t\t}\n\n\t\treturn this;\n\t}\n\n\ttrimEnd(charType) {\n\t\tconst rx = new RegExp((charType || '\\\\s') + '+$');\n\n\t\tlet source;\n\t\tlet i = this.sources.length - 1;\n\n\t\tdo {\n\t\t\tsource = this.sources[i--];\n\t\t\tif (!source) {\n\t\t\t\tthis.intro = this.intro.replace(rx, '');\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} while (!source.content.trimEndAborted(charType));\n\n\t\treturn this;\n\t}\n}\n","import MagicString from './MagicString.js';\nimport Bundle from './Bundle.js';\nimport SourceMap from './SourceMap.js';\n\nMagicString.Bundle = Bundle;\nMagicString.SourceMap = SourceMap;\nMagicString.default = MagicString; // work around TypeScript bug https://github.com/Rich-Harris/magic-string/pull/121\n\nexport default MagicString;\n"],"names":["encode"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/magic-string/dist/magic-string.es.d.mts b/node_modules/magic-string/dist/magic-string.es.d.mts index 76cc537d..f8540ddb 100644 --- a/node_modules/magic-string/dist/magic-string.es.d.mts +++ b/node_modules/magic-string/dist/magic-string.es.d.mts @@ -1,289 +1,268 @@ export interface BundleOptions { - intro?: string; - separator?: string; + intro?: string; + separator?: string; } export interface SourceMapOptions { - /** - * Whether the mapping should be high-resolution. - * Hi-res mappings map every single character, meaning (for example) your devtools will always - * be able to pinpoint the exact location of function calls and so on. - * With lo-res mappings, devtools may only be able to identify the correct - * line - but they're quicker to generate and less bulky. - * You can also set `"boundary"` to generate a semi-hi-res mappings segmented per word boundary - * instead of per character, suitable for string semantics that are separated by words. - * If sourcemap locations have been specified with s.addSourceMapLocation(), they will be used here. - */ - hires?: boolean | 'boundary'; - /** - * The filename where you plan to write the sourcemap. - */ - file?: string; - /** - * The filename of the file containing the original source. - */ - source?: string; - /** - * Whether to include the original content in the map's sourcesContent array. - */ - includeContent?: boolean; + /** + * Whether the mapping should be high-resolution. + * Hi-res mappings map every single character, meaning (for example) your devtools will always + * be able to pinpoint the exact location of function calls and so on. + * With lo-res mappings, devtools may only be able to identify the correct + * line - but they're quicker to generate and less bulky. + * You can also set `"boundary"` to generate a semi-hi-res mappings segmented per word boundary + * instead of per character, suitable for string semantics that are separated by words. + * If sourcemap locations have been specified with s.addSourceMapLocation(), they will be used here. + */ + hires?: boolean | 'boundary'; + /** + * The filename where you plan to write the sourcemap. + */ + file?: string; + /** + * The filename of the file containing the original source. + */ + source?: string; + /** + * Whether to include the original content in the map's sourcesContent array. + */ + includeContent?: boolean; } export type SourceMapSegment = - | [number] - | [number, number, number, number] - | [number, number, number, number, number]; + | [number] + | [number, number, number, number] + | [number, number, number, number, number]; export interface DecodedSourceMap { - file: string; - sources: string[]; - sourcesContent?: string[]; - names: string[]; - mappings: SourceMapSegment[][]; - x_google_ignoreList?: number[]; + file: string; + sources: string[]; + sourcesContent?: string[]; + names: string[]; + mappings: SourceMapSegment[][]; + x_google_ignoreList?: number[]; } export class SourceMap { - constructor(properties: DecodedSourceMap); + constructor(properties: DecodedSourceMap); - version: number; - file: string; - sources: string[]; - sourcesContent?: string[]; - names: string[]; - mappings: string; - x_google_ignoreList?: number[]; - debugId?: string; + version: number; + file: string; + sources: string[]; + sourcesContent?: string[]; + names: string[]; + mappings: string; + x_google_ignoreList?: number[]; - /** - * Returns the equivalent of `JSON.stringify(map)` - */ - toString(): string; - /** - * Returns a DataURI containing the sourcemap. Useful for doing this sort of thing: - * `generateMap(options?: SourceMapOptions): SourceMap;` - */ - toUrl(): string; + /** + * Returns the equivalent of `JSON.stringify(map)` + */ + toString(): string; + /** + * Returns a DataURI containing the sourcemap. Useful for doing this sort of thing: + * `generateMap(options?: SourceMapOptions): SourceMap;` + */ + toUrl(): string; } export class Bundle { - constructor(options?: BundleOptions); - /** - * Adds the specified source to the bundle, which can either be a `MagicString` object directly, - * or an options object that holds a magic string `content` property and optionally provides - * a `filename` for the source within the bundle, as well as an optional `ignoreList` hint - * (which defaults to `false`). The `filename` is used when constructing the source map for the - * bundle, to identify this `source` in the source map's `sources` field. The `ignoreList` hint - * is used to populate the `x_google_ignoreList` extension field in the source map, which is a - * mechanism for tools to signal to debuggers that certain sources should be ignored by default - * (depending on user preferences). - */ - addSource( - source: MagicString | { filename?: string; content: MagicString; ignoreList?: boolean }, - ): this; - append(str: string, options?: BundleOptions): this; - clone(): this; - generateMap( - options?: SourceMapOptions, - ): Omit & { sourcesContent: Array }; - generateDecodedMap( - options?: SourceMapOptions, - ): Omit & { sourcesContent: Array }; - getIndentString(): string; - indent(indentStr?: string): this; - indentExclusionRanges: ExclusionRange | Array; - prepend(str: string): this; - toString(): string; - trimLines(): this; - trim(charType?: string): this; - trimStart(charType?: string): this; - trimEnd(charType?: string): this; - isEmpty(): boolean; - length(): number; + constructor(options?: BundleOptions); + /** + * Adds the specified source to the bundle, which can either be a `MagicString` object directly, + * or an options object that holds a magic string `content` property and optionally provides + * a `filename` for the source within the bundle, as well as an optional `ignoreList` hint + * (which defaults to `false`). The `filename` is used when constructing the source map for the + * bundle, to identify this `source` in the source map's `sources` field. The `ignoreList` hint + * is used to populate the `x_google_ignoreList` extension field in the source map, which is a + * mechanism for tools to signal to debuggers that certain sources should be ignored by default + * (depending on user preferences). + */ + addSource(source: MagicString | { filename?: string, content: MagicString, ignoreList?: boolean }): this; + append(str: string, options?: BundleOptions): this; + clone(): this; + generateMap(options?: SourceMapOptions): Omit & { sourcesContent: Array }; + generateDecodedMap(options?: SourceMapOptions): Omit & { sourcesContent: Array }; + getIndentString(): string; + indent(indentStr?: string): this; + indentExclusionRanges: ExclusionRange | Array; + prepend(str: string): this; + toString(): string; + trimLines(): this; + trim(charType?: string): this; + trimStart(charType?: string): this; + trimEnd(charType?: string): this; + isEmpty(): boolean; + length(): number; } -export type ExclusionRange = [number, number]; +export type ExclusionRange = [ number, number ]; export interface MagicStringOptions { - filename?: string; - indentExclusionRanges?: ExclusionRange | Array; - offset?: number; + filename?: string, + indentExclusionRanges?: ExclusionRange | Array; } export interface IndentOptions { - exclude?: ExclusionRange | Array; - indentStart?: boolean; + exclude?: ExclusionRange | Array; + indentStart?: boolean; } export interface OverwriteOptions { - storeName?: boolean; - contentOnly?: boolean; + storeName?: boolean; + contentOnly?: boolean; } export interface UpdateOptions { - storeName?: boolean; - overwrite?: boolean; + storeName?: boolean; + overwrite?: boolean; } export default class MagicString { - constructor(str: string, options?: MagicStringOptions); - /** - * Adds the specified character index (with respect to the original string) to sourcemap mappings, if `hires` is false. - */ - addSourcemapLocation(char: number): void; - /** - * Appends the specified content to the end of the string. - */ - append(content: string): this; - /** - * Appends the specified content at the index in the original string. - * If a range *ending* with index is subsequently moved, the insert will be moved with it. - * See also `s.prependLeft(...)`. - */ - appendLeft(index: number, content: string): this; - /** - * Appends the specified content at the index in the original string. - * If a range *starting* with index is subsequently moved, the insert will be moved with it. - * See also `s.prependRight(...)`. - */ - appendRight(index: number, content: string): this; - /** - * Does what you'd expect. - */ - clone(): this; - /** - * Generates a version 3 sourcemap. - */ - generateMap(options?: SourceMapOptions): SourceMap; - /** - * Generates a sourcemap object with raw mappings in array form, rather than encoded as a string. - * Useful if you need to manipulate the sourcemap further, but most of the time you will use `generateMap` instead. - */ - generateDecodedMap(options?: SourceMapOptions): DecodedSourceMap; - getIndentString(): string; + constructor(str: string, options?: MagicStringOptions); + /** + * Adds the specified character index (with respect to the original string) to sourcemap mappings, if `hires` is false. + */ + addSourcemapLocation(char: number): void; + /** + * Appends the specified content to the end of the string. + */ + append(content: string): this; + /** + * Appends the specified content at the index in the original string. + * If a range *ending* with index is subsequently moved, the insert will be moved with it. + * See also `s.prependLeft(...)`. + */ + appendLeft(index: number, content: string): this; + /** + * Appends the specified content at the index in the original string. + * If a range *starting* with index is subsequently moved, the insert will be moved with it. + * See also `s.prependRight(...)`. + */ + appendRight(index: number, content: string): this; + /** + * Does what you'd expect. + */ + clone(): this; + /** + * Generates a version 3 sourcemap. + */ + generateMap(options?: SourceMapOptions): SourceMap; + /** + * Generates a sourcemap object with raw mappings in array form, rather than encoded as a string. + * Useful if you need to manipulate the sourcemap further, but most of the time you will use `generateMap` instead. + */ + generateDecodedMap(options?: SourceMapOptions): DecodedSourceMap; + getIndentString(): string; - /** - * Prefixes each line of the string with prefix. - * If prefix is not supplied, the indentation will be guessed from the original content, falling back to a single tab character. - */ - indent(options?: IndentOptions): this; - /** - * Prefixes each line of the string with prefix. - * If prefix is not supplied, the indentation will be guessed from the original content, falling back to a single tab character. - * - * The options argument can have an exclude property, which is an array of [start, end] character ranges. - * These ranges will be excluded from the indentation - useful for (e.g.) multiline strings. - */ - indent(indentStr?: string, options?: IndentOptions): this; - indentExclusionRanges: ExclusionRange | Array; + /** + * Prefixes each line of the string with prefix. + * If prefix is not supplied, the indentation will be guessed from the original content, falling back to a single tab character. + */ + indent(options?: IndentOptions): this; + /** + * Prefixes each line of the string with prefix. + * If prefix is not supplied, the indentation will be guessed from the original content, falling back to a single tab character. + * + * The options argument can have an exclude property, which is an array of [start, end] character ranges. + * These ranges will be excluded from the indentation - useful for (e.g.) multiline strings. + */ + indent(indentStr?: string, options?: IndentOptions): this; + indentExclusionRanges: ExclusionRange | Array; - /** - * Moves the characters from `start` and `end` to `index`. - */ - move(start: number, end: number, index: number): this; - /** - * Replaces the characters from `start` to `end` with `content`, along with the appended/prepended content in - * that range. The same restrictions as `s.remove()` apply. - * - * The fourth argument is optional. It can have a storeName property — if true, the original name will be stored - * for later inclusion in a sourcemap's names array — and a contentOnly property which determines whether only - * the content is overwritten, or anything that was appended/prepended to the range as well. - * - * It may be preferred to use `s.update(...)` instead if you wish to avoid overwriting the appended/prepended content. - */ - overwrite( - start: number, - end: number, - content: string, - options?: boolean | OverwriteOptions, - ): this; - /** - * Replaces the characters from `start` to `end` with `content`. The same restrictions as `s.remove()` apply. - * - * The fourth argument is optional. It can have a storeName property — if true, the original name will be stored - * for later inclusion in a sourcemap's names array — and an overwrite property which determines whether only - * the content is overwritten, or anything that was appended/prepended to the range as well. - */ - update(start: number, end: number, content: string, options?: boolean | UpdateOptions): this; - /** - * Prepends the string with the specified content. - */ - prepend(content: string): this; - /** - * Same as `s.appendLeft(...)`, except that the inserted content will go *before* any previous appends or prepends at index - */ - prependLeft(index: number, content: string): this; - /** - * Same as `s.appendRight(...)`, except that the inserted content will go *before* any previous appends or prepends at `index` - */ - prependRight(index: number, content: string): this; - /** - * Removes the characters from `start` to `end` (of the original string, **not** the generated string). - * Removing the same content twice, or making removals that partially overlap, will cause an error. - */ - remove(start: number, end: number): this; - /** - * Reset the modified characters from `start` to `end` (of the original string, **not** the generated string). - */ - reset(start: number, end: number): this; - /** - * Returns the content of the generated string that corresponds to the slice between `start` and `end` of the original string. - * Throws error if the indices are for characters that were already removed. - */ - slice(start: number, end: number): string; - /** - * Returns a clone of `s`, with all content before the `start` and `end` characters of the original string removed. - */ - snip(start: number, end: number): this; - /** - * Trims content matching `charType` (defaults to `\s`, i.e. whitespace) from the start and end. - */ - trim(charType?: string): this; - /** - * Trims content matching `charType` (defaults to `\s`, i.e. whitespace) from the start. - */ - trimStart(charType?: string): this; - /** - * Trims content matching `charType` (defaults to `\s`, i.e. whitespace) from the end. - */ - trimEnd(charType?: string): this; - /** - * Removes empty lines from the start and end. - */ - trimLines(): this; - /** - * String replacement with RegExp or string. - */ - replace( - regex: RegExp | string, - replacement: string | ((substring: string, ...args: any[]) => string), - ): this; - /** - * Same as `s.replace`, but replace all matched strings instead of just one. - */ - replaceAll( - regex: RegExp | string, - replacement: string | ((substring: string, ...args: any[]) => string), - ): this; + /** + * Moves the characters from `start and `end` to `index`. + */ + move(start: number, end: number, index: number): this; + /** + * Replaces the characters from `start` to `end` with `content`, along with the appended/prepended content in + * that range. The same restrictions as `s.remove()` apply. + * + * The fourth argument is optional. It can have a storeName property — if true, the original name will be stored + * for later inclusion in a sourcemap's names array — and a contentOnly property which determines whether only + * the content is overwritten, or anything that was appended/prepended to the range as well. + * + * It may be preferred to use `s.update(...)` instead if you wish to avoid overwriting the appended/prepended content. + */ + overwrite(start: number, end: number, content: string, options?: boolean | OverwriteOptions): this; + /** + * Replaces the characters from `start` to `end` with `content`. The same restrictions as `s.remove()` apply. + * + * The fourth argument is optional. It can have a storeName property — if true, the original name will be stored + * for later inclusion in a sourcemap's names array — and an overwrite property which determines whether only + * the content is overwritten, or anything that was appended/prepended to the range as well. + */ + update(start: number, end: number, content: string, options?: boolean | UpdateOptions): this; + /** + * Prepends the string with the specified content. + */ + prepend(content: string): this; + /** + * Same as `s.appendLeft(...)`, except that the inserted content will go *before* any previous appends or prepends at index + */ + prependLeft(index: number, content: string): this; + /** + * Same as `s.appendRight(...)`, except that the inserted content will go *before* any previous appends or prepends at `index` + */ + prependRight(index: number, content: string): this; + /** + * Removes the characters from `start` to `end` (of the original string, **not** the generated string). + * Removing the same content twice, or making removals that partially overlap, will cause an error. + */ + remove(start: number, end: number): this; + /** + * Reset the modified characters from `start` to `end` (of the original string, **not** the generated string). + */ + reset(start: number, end: number): this; + /** + * Returns the content of the generated string that corresponds to the slice between `start` and `end` of the original string. + * Throws error if the indices are for characters that were already removed. + */ + slice(start: number, end: number): string; + /** + * Returns a clone of `s`, with all content before the `start` and `end` characters of the original string removed. + */ + snip(start: number, end: number): this; + /** + * Trims content matching `charType` (defaults to `\s`, i.e. whitespace) from the start and end. + */ + trim(charType?: string): this; + /** + * Trims content matching `charType` (defaults to `\s`, i.e. whitespace) from the start. + */ + trimStart(charType?: string): this; + /** + * Trims content matching `charType` (defaults to `\s`, i.e. whitespace) from the end. + */ + trimEnd(charType?: string): this; + /** + * Removes empty lines from the start and end. + */ + trimLines(): this; + /** + * String replacement with RegExp or string. + */ + replace(regex: RegExp | string, replacement: string | ((substring: string, ...args: any[]) => string)): this; + /** + * Same as `s.replace`, but replace all matched strings instead of just one. + */ + replaceAll(regex: RegExp | string, replacement: string | ((substring: string, ...args: any[]) => string)): this; - lastChar(): string; - lastLine(): string; - /** - * Returns true if the resulting source is empty (disregarding white space). - */ - isEmpty(): boolean; - length(): number; + lastChar(): string; + lastLine(): string; + /** + * Returns true if the resulting source is empty (disregarding white space). + */ + isEmpty(): boolean; + length(): number; - /** - * Indicates if the string has been changed. - */ - hasChanged(): boolean; + /** + * Indicates if the string has been changed. + */ + hasChanged(): boolean; - original: string; - /** - * Returns the generated string. - */ - toString(): string; - - offset: number; + original: string; + /** + * Returns the generated string. + */ + toString(): string; } diff --git a/node_modules/magic-string/dist/magic-string.es.mjs b/node_modules/magic-string/dist/magic-string.es.mjs index 76f3642c..320efaa9 100644 --- a/node_modules/magic-string/dist/magic-string.es.mjs +++ b/node_modules/magic-string/dist/magic-string.es.mjs @@ -125,7 +125,7 @@ class Chunk { // ' test'.trim() // split -> ' ' + 'test' // ✔️ edit -> '' + 'test' - // ✖️ edit -> 'test' + '' + // ✖️ edit -> 'test' + '' // TODO is this block necessary?... newChunk.edit('', false); this.content = ''; @@ -218,9 +218,6 @@ class SourceMap { if (typeof properties.x_google_ignoreList !== 'undefined') { this.x_google_ignoreList = properties.x_google_ignoreList; } - if (typeof properties.debugId !== 'undefined') { - this.debugId = properties.debugId; - } } toString() { @@ -365,6 +362,27 @@ class Mappings { let charInHiresBoundary = false; while (originalCharIndex < chunk.end) { + if (this.hires || first || sourcemapLocations.has(originalCharIndex)) { + const segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column]; + + if (this.hires === 'boundary') { + // in hires "boundary", group segments per word boundary than per char + if (wordRegex.test(original[originalCharIndex])) { + // for first char in the boundary found, start the boundary by pushing a segment + if (!charInHiresBoundary) { + this.rawSegments.push(segment); + charInHiresBoundary = true; + } + } else { + // for non-word char, end the boundary by pushing a segment + this.rawSegments.push(segment); + charInHiresBoundary = false; + } + } else { + this.rawSegments.push(segment); + } + } + if (original[originalCharIndex] === '\n') { loc.line += 1; loc.column = 0; @@ -372,29 +390,7 @@ class Mappings { this.raw[this.generatedCodeLine] = this.rawSegments = []; this.generatedCodeColumn = 0; first = true; - charInHiresBoundary = false; } else { - if (this.hires || first || sourcemapLocations.has(originalCharIndex)) { - const segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column]; - - if (this.hires === 'boundary') { - // in hires "boundary", group segments per word boundary than per char - if (wordRegex.test(original[originalCharIndex])) { - // for first char in the boundary found, start the boundary by pushing a segment - if (!charInHiresBoundary) { - this.rawSegments.push(segment); - charInHiresBoundary = true; - } - } else { - // for non-word char, end the boundary by pushing a segment - this.rawSegments.push(segment); - charInHiresBoundary = false; - } - } else { - this.rawSegments.push(segment); - } - } - loc.column += 1; this.generatedCodeColumn += 1; first = false; @@ -450,7 +446,6 @@ class MagicString { storedNames: { writable: true, value: {} }, indentStr: { writable: true, value: undefined }, ignoreList: { writable: true, value: options.ignoreList }, - offset: { writable: true, value: options.offset || 0 }, }); this.byStart[0] = chunk; @@ -469,8 +464,6 @@ class MagicString { } appendLeft(index, content) { - index = index + this.offset; - if (typeof content !== 'string') throw new TypeError('inserted content must be a string'); this._split(index); @@ -486,8 +479,6 @@ class MagicString { } appendRight(index, content) { - index = index + this.offset; - if (typeof content !== 'string') throw new TypeError('inserted content must be a string'); this._split(index); @@ -503,7 +494,7 @@ class MagicString { } clone() { - const cloned = new MagicString(this.original, { filename: this.filename, offset: this.offset }); + const cloned = new MagicString(this.original, { filename: this.filename }); let originalChunk = this.firstChunk; let clonedChunk = (cloned.firstChunk = cloned.lastSearchedChunk = originalChunk.clone()); @@ -701,7 +692,7 @@ class MagicString { if (!warned.insertLeft) { console.warn( 'magicString.insertLeft(...) is deprecated. Use magicString.appendLeft(...) instead', - ); + ); // eslint-disable-line no-console warned.insertLeft = true; } @@ -712,7 +703,7 @@ class MagicString { if (!warned.insertRight) { console.warn( 'magicString.insertRight(...) is deprecated. Use magicString.prependRight(...) instead', - ); + ); // eslint-disable-line no-console warned.insertRight = true; } @@ -720,10 +711,6 @@ class MagicString { } move(start, end, index) { - start = start + this.offset; - end = end + this.offset; - index = index + this.offset; - if (index >= start && index <= end) throw new Error('Cannot move a selection inside itself'); this._split(start); @@ -766,9 +753,6 @@ class MagicString { } update(start, end, content, options) { - start = start + this.offset; - end = end + this.offset; - if (typeof content !== 'string') throw new TypeError('replacement content must be a string'); if (this.original.length !== 0) { @@ -789,7 +773,7 @@ class MagicString { if (!warned.storeName) { console.warn( 'The final argument to magicString.overwrite(...) should be an options object. See https://github.com/rich-harris/magic-string', - ); + ); // eslint-disable-line no-console warned.storeName = true; } @@ -840,8 +824,6 @@ class MagicString { } prependLeft(index, content) { - index = index + this.offset; - if (typeof content !== 'string') throw new TypeError('inserted content must be a string'); this._split(index); @@ -857,8 +839,6 @@ class MagicString { } prependRight(index, content) { - index = index + this.offset; - if (typeof content !== 'string') throw new TypeError('inserted content must be a string'); this._split(index); @@ -874,9 +854,6 @@ class MagicString { } remove(start, end) { - start = start + this.offset; - end = end + this.offset; - if (this.original.length !== 0) { while (start < 0) start += this.original.length; while (end < 0) end += this.original.length; @@ -903,9 +880,6 @@ class MagicString { } reset(start, end) { - start = start + this.offset; - end = end + this.offset; - if (this.original.length !== 0) { while (start < 0) start += this.original.length; while (end < 0) end += this.original.length; @@ -970,10 +944,7 @@ class MagicString { return this.intro + lineStr; } - slice(start = 0, end = this.original.length - this.offset) { - start = start + this.offset; - end = end + this.offset; - + slice(start = 0, end = this.original.length) { if (this.original.length !== 0) { while (start < 0) start += this.original.length; while (end < 0) end += this.original.length; @@ -1209,7 +1180,11 @@ class MagicString { if (match.index != null) { const replacement = getReplacement(match, this.original); if (replacement !== match[0]) { - this.overwrite(match.index, match.index + match[0].length, replacement); + this.overwrite( + match.index, + match.index + match[0].length, + replacement + ); } } }); @@ -1218,7 +1193,11 @@ class MagicString { if (match && match.index != null) { const replacement = getReplacement(match, this.original); if (replacement !== match[0]) { - this.overwrite(match.index, match.index + match[0].length, replacement); + this.overwrite( + match.index, + match.index + match[0].length, + replacement + ); } } } @@ -1253,7 +1232,8 @@ class MagicString { index = original.indexOf(string, index + stringLength) ) { const previous = original.slice(index, index + stringLength); - if (previous !== replacement) this.overwrite(index, index + stringLength, replacement); + if (previous !== replacement) + this.overwrite(index, index + stringLength, replacement); } return this; diff --git a/node_modules/magic-string/dist/magic-string.es.mjs.map b/node_modules/magic-string/dist/magic-string.es.mjs.map index 0d699150..5126fbe9 100644 --- a/node_modules/magic-string/dist/magic-string.es.mjs.map +++ b/node_modules/magic-string/dist/magic-string.es.mjs.map @@ -1 +1 @@ -{"version":3,"file":"magic-string.es.mjs","sources":["../src/BitSet.js","../src/Chunk.js","../src/SourceMap.js","../src/utils/guessIndent.js","../src/utils/getRelativePath.js","../src/utils/isObject.js","../src/utils/getLocator.js","../src/utils/Mappings.js","../src/MagicString.js","../src/Bundle.js"],"sourcesContent":["export default class BitSet {\n\tconstructor(arg) {\n\t\tthis.bits = arg instanceof BitSet ? arg.bits.slice() : [];\n\t}\n\n\tadd(n) {\n\t\tthis.bits[n >> 5] |= 1 << (n & 31);\n\t}\n\n\thas(n) {\n\t\treturn !!(this.bits[n >> 5] & (1 << (n & 31)));\n\t}\n}\n","export default class Chunk {\n\tconstructor(start, end, content) {\n\t\tthis.start = start;\n\t\tthis.end = end;\n\t\tthis.original = content;\n\n\t\tthis.intro = '';\n\t\tthis.outro = '';\n\n\t\tthis.content = content;\n\t\tthis.storeName = false;\n\t\tthis.edited = false;\n\n\t\tif (DEBUG) {\n\t\t\t// we make these non-enumerable, for sanity while debugging\n\t\t\tObject.defineProperties(this, {\n\t\t\t\tprevious: { writable: true, value: null },\n\t\t\t\tnext: { writable: true, value: null },\n\t\t\t});\n\t\t} else {\n\t\t\tthis.previous = null;\n\t\t\tthis.next = null;\n\t\t}\n\t}\n\n\tappendLeft(content) {\n\t\tthis.outro += content;\n\t}\n\n\tappendRight(content) {\n\t\tthis.intro = this.intro + content;\n\t}\n\n\tclone() {\n\t\tconst chunk = new Chunk(this.start, this.end, this.original);\n\n\t\tchunk.intro = this.intro;\n\t\tchunk.outro = this.outro;\n\t\tchunk.content = this.content;\n\t\tchunk.storeName = this.storeName;\n\t\tchunk.edited = this.edited;\n\n\t\treturn chunk;\n\t}\n\n\tcontains(index) {\n\t\treturn this.start < index && index < this.end;\n\t}\n\n\teachNext(fn) {\n\t\tlet chunk = this;\n\t\twhile (chunk) {\n\t\t\tfn(chunk);\n\t\t\tchunk = chunk.next;\n\t\t}\n\t}\n\n\teachPrevious(fn) {\n\t\tlet chunk = this;\n\t\twhile (chunk) {\n\t\t\tfn(chunk);\n\t\t\tchunk = chunk.previous;\n\t\t}\n\t}\n\n\tedit(content, storeName, contentOnly) {\n\t\tthis.content = content;\n\t\tif (!contentOnly) {\n\t\t\tthis.intro = '';\n\t\t\tthis.outro = '';\n\t\t}\n\t\tthis.storeName = storeName;\n\n\t\tthis.edited = true;\n\n\t\treturn this;\n\t}\n\n\tprependLeft(content) {\n\t\tthis.outro = content + this.outro;\n\t}\n\n\tprependRight(content) {\n\t\tthis.intro = content + this.intro;\n\t}\n\n\treset() {\n\t\tthis.intro = '';\n\t\tthis.outro = '';\n\t\tif (this.edited) {\n\t\t\tthis.content = this.original;\n\t\t\tthis.storeName = false;\n\t\t\tthis.edited = false;\n\t\t}\n\t}\n\n\tsplit(index) {\n\t\tconst sliceIndex = index - this.start;\n\n\t\tconst originalBefore = this.original.slice(0, sliceIndex);\n\t\tconst originalAfter = this.original.slice(sliceIndex);\n\n\t\tthis.original = originalBefore;\n\n\t\tconst newChunk = new Chunk(index, this.end, originalAfter);\n\t\tnewChunk.outro = this.outro;\n\t\tthis.outro = '';\n\n\t\tthis.end = index;\n\n\t\tif (this.edited) {\n\t\t\t// after split we should save the edit content record into the correct chunk\n\t\t\t// to make sure sourcemap correct\n\t\t\t// For example:\n\t\t\t// ' test'.trim()\n\t\t\t// split -> ' ' + 'test'\n\t\t\t// ✔️ edit -> '' + 'test'\n\t\t\t// ✖️ edit -> 'test' + ''\n\t\t\t// TODO is this block necessary?...\n\t\t\tnewChunk.edit('', false);\n\t\t\tthis.content = '';\n\t\t} else {\n\t\t\tthis.content = originalBefore;\n\t\t}\n\n\t\tnewChunk.next = this.next;\n\t\tif (newChunk.next) newChunk.next.previous = newChunk;\n\t\tnewChunk.previous = this;\n\t\tthis.next = newChunk;\n\n\t\treturn newChunk;\n\t}\n\n\ttoString() {\n\t\treturn this.intro + this.content + this.outro;\n\t}\n\n\ttrimEnd(rx) {\n\t\tthis.outro = this.outro.replace(rx, '');\n\t\tif (this.outro.length) return true;\n\n\t\tconst trimmed = this.content.replace(rx, '');\n\n\t\tif (trimmed.length) {\n\t\t\tif (trimmed !== this.content) {\n\t\t\t\tthis.split(this.start + trimmed.length).edit('', undefined, true);\n\t\t\t\tif (this.edited) {\n\t\t\t\t\t// save the change, if it has been edited\n\t\t\t\t\tthis.edit(trimmed, this.storeName, true);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} else {\n\t\t\tthis.edit('', undefined, true);\n\n\t\t\tthis.intro = this.intro.replace(rx, '');\n\t\t\tif (this.intro.length) return true;\n\t\t}\n\t}\n\n\ttrimStart(rx) {\n\t\tthis.intro = this.intro.replace(rx, '');\n\t\tif (this.intro.length) return true;\n\n\t\tconst trimmed = this.content.replace(rx, '');\n\n\t\tif (trimmed.length) {\n\t\t\tif (trimmed !== this.content) {\n\t\t\t\tconst newChunk = this.split(this.end - trimmed.length);\n\t\t\t\tif (this.edited) {\n\t\t\t\t\t// save the change, if it has been edited\n\t\t\t\t\tnewChunk.edit(trimmed, this.storeName, true);\n\t\t\t\t}\n\t\t\t\tthis.edit('', undefined, true);\n\t\t\t}\n\t\t\treturn true;\n\t\t} else {\n\t\t\tthis.edit('', undefined, true);\n\n\t\t\tthis.outro = this.outro.replace(rx, '');\n\t\t\tif (this.outro.length) return true;\n\t\t}\n\t}\n}\n","import { encode } from '@jridgewell/sourcemap-codec';\n\nfunction getBtoa() {\n\tif (typeof globalThis !== 'undefined' && typeof globalThis.btoa === 'function') {\n\t\treturn (str) => globalThis.btoa(unescape(encodeURIComponent(str)));\n\t} else if (typeof Buffer === 'function') {\n\t\treturn (str) => Buffer.from(str, 'utf-8').toString('base64');\n\t} else {\n\t\treturn () => {\n\t\t\tthrow new Error('Unsupported environment: `window.btoa` or `Buffer` should be supported.');\n\t\t};\n\t}\n}\n\nconst btoa = /*#__PURE__*/ getBtoa();\n\nexport default class SourceMap {\n\tconstructor(properties) {\n\t\tthis.version = 3;\n\t\tthis.file = properties.file;\n\t\tthis.sources = properties.sources;\n\t\tthis.sourcesContent = properties.sourcesContent;\n\t\tthis.names = properties.names;\n\t\tthis.mappings = encode(properties.mappings);\n\t\tif (typeof properties.x_google_ignoreList !== 'undefined') {\n\t\t\tthis.x_google_ignoreList = properties.x_google_ignoreList;\n\t\t}\n\t\tif (typeof properties.debugId !== 'undefined') {\n\t\t\tthis.debugId = properties.debugId;\n\t\t}\n\t}\n\n\ttoString() {\n\t\treturn JSON.stringify(this);\n\t}\n\n\ttoUrl() {\n\t\treturn 'data:application/json;charset=utf-8;base64,' + btoa(this.toString());\n\t}\n}\n","export default function guessIndent(code) {\n\tconst lines = code.split('\\n');\n\n\tconst tabbed = lines.filter((line) => /^\\t+/.test(line));\n\tconst spaced = lines.filter((line) => /^ {2,}/.test(line));\n\n\tif (tabbed.length === 0 && spaced.length === 0) {\n\t\treturn null;\n\t}\n\n\t// More lines tabbed than spaced? Assume tabs, and\n\t// default to tabs in the case of a tie (or nothing\n\t// to go on)\n\tif (tabbed.length >= spaced.length) {\n\t\treturn '\\t';\n\t}\n\n\t// Otherwise, we need to guess the multiple\n\tconst min = spaced.reduce((previous, current) => {\n\t\tconst numSpaces = /^ +/.exec(current)[0].length;\n\t\treturn Math.min(numSpaces, previous);\n\t}, Infinity);\n\n\treturn new Array(min + 1).join(' ');\n}\n","export default function getRelativePath(from, to) {\n\tconst fromParts = from.split(/[/\\\\]/);\n\tconst toParts = to.split(/[/\\\\]/);\n\n\tfromParts.pop(); // get dirname\n\n\twhile (fromParts[0] === toParts[0]) {\n\t\tfromParts.shift();\n\t\ttoParts.shift();\n\t}\n\n\tif (fromParts.length) {\n\t\tlet i = fromParts.length;\n\t\twhile (i--) fromParts[i] = '..';\n\t}\n\n\treturn fromParts.concat(toParts).join('/');\n}\n","const toString = Object.prototype.toString;\n\nexport default function isObject(thing) {\n\treturn toString.call(thing) === '[object Object]';\n}\n","export default function getLocator(source) {\n\tconst originalLines = source.split('\\n');\n\tconst lineOffsets = [];\n\n\tfor (let i = 0, pos = 0; i < originalLines.length; i++) {\n\t\tlineOffsets.push(pos);\n\t\tpos += originalLines[i].length + 1;\n\t}\n\n\treturn function locate(index) {\n\t\tlet i = 0;\n\t\tlet j = lineOffsets.length;\n\t\twhile (i < j) {\n\t\t\tconst m = (i + j) >> 1;\n\t\t\tif (index < lineOffsets[m]) {\n\t\t\t\tj = m;\n\t\t\t} else {\n\t\t\t\ti = m + 1;\n\t\t\t}\n\t\t}\n\t\tconst line = i - 1;\n\t\tconst column = index - lineOffsets[line];\n\t\treturn { line, column };\n\t};\n}\n","const wordRegex = /\\w/;\n\nexport default class Mappings {\n\tconstructor(hires) {\n\t\tthis.hires = hires;\n\t\tthis.generatedCodeLine = 0;\n\t\tthis.generatedCodeColumn = 0;\n\t\tthis.raw = [];\n\t\tthis.rawSegments = this.raw[this.generatedCodeLine] = [];\n\t\tthis.pending = null;\n\t}\n\n\taddEdit(sourceIndex, content, loc, nameIndex) {\n\t\tif (content.length) {\n\t\t\tconst contentLengthMinusOne = content.length - 1;\n\t\t\tlet contentLineEnd = content.indexOf('\\n', 0);\n\t\t\tlet previousContentLineEnd = -1;\n\t\t\t// Loop through each line in the content and add a segment, but stop if the last line is empty,\n\t\t\t// else code afterwards would fill one line too many\n\t\t\twhile (contentLineEnd >= 0 && contentLengthMinusOne > contentLineEnd) {\n\t\t\t\tconst segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];\n\t\t\t\tif (nameIndex >= 0) {\n\t\t\t\t\tsegment.push(nameIndex);\n\t\t\t\t}\n\t\t\t\tthis.rawSegments.push(segment);\n\n\t\t\t\tthis.generatedCodeLine += 1;\n\t\t\t\tthis.raw[this.generatedCodeLine] = this.rawSegments = [];\n\t\t\t\tthis.generatedCodeColumn = 0;\n\n\t\t\t\tpreviousContentLineEnd = contentLineEnd;\n\t\t\t\tcontentLineEnd = content.indexOf('\\n', contentLineEnd + 1);\n\t\t\t}\n\n\t\t\tconst segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];\n\t\t\tif (nameIndex >= 0) {\n\t\t\t\tsegment.push(nameIndex);\n\t\t\t}\n\t\t\tthis.rawSegments.push(segment);\n\n\t\t\tthis.advance(content.slice(previousContentLineEnd + 1));\n\t\t} else if (this.pending) {\n\t\t\tthis.rawSegments.push(this.pending);\n\t\t\tthis.advance(content);\n\t\t}\n\n\t\tthis.pending = null;\n\t}\n\n\taddUneditedChunk(sourceIndex, chunk, original, loc, sourcemapLocations) {\n\t\tlet originalCharIndex = chunk.start;\n\t\tlet first = true;\n\t\t// when iterating each char, check if it's in a word boundary\n\t\tlet charInHiresBoundary = false;\n\n\t\twhile (originalCharIndex < chunk.end) {\n\t\t\tif (original[originalCharIndex] === '\\n') {\n\t\t\t\tloc.line += 1;\n\t\t\t\tloc.column = 0;\n\t\t\t\tthis.generatedCodeLine += 1;\n\t\t\t\tthis.raw[this.generatedCodeLine] = this.rawSegments = [];\n\t\t\t\tthis.generatedCodeColumn = 0;\n\t\t\t\tfirst = true;\n\t\t\t\tcharInHiresBoundary = false;\n\t\t\t} else {\n\t\t\t\tif (this.hires || first || sourcemapLocations.has(originalCharIndex)) {\n\t\t\t\t\tconst segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];\n\n\t\t\t\t\tif (this.hires === 'boundary') {\n\t\t\t\t\t\t// in hires \"boundary\", group segments per word boundary than per char\n\t\t\t\t\t\tif (wordRegex.test(original[originalCharIndex])) {\n\t\t\t\t\t\t\t// for first char in the boundary found, start the boundary by pushing a segment\n\t\t\t\t\t\t\tif (!charInHiresBoundary) {\n\t\t\t\t\t\t\t\tthis.rawSegments.push(segment);\n\t\t\t\t\t\t\t\tcharInHiresBoundary = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// for non-word char, end the boundary by pushing a segment\n\t\t\t\t\t\t\tthis.rawSegments.push(segment);\n\t\t\t\t\t\t\tcharInHiresBoundary = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.rawSegments.push(segment);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tloc.column += 1;\n\t\t\t\tthis.generatedCodeColumn += 1;\n\t\t\t\tfirst = false;\n\t\t\t}\n\n\t\t\toriginalCharIndex += 1;\n\t\t}\n\n\t\tthis.pending = null;\n\t}\n\n\tadvance(str) {\n\t\tif (!str) return;\n\n\t\tconst lines = str.split('\\n');\n\n\t\tif (lines.length > 1) {\n\t\t\tfor (let i = 0; i < lines.length - 1; i++) {\n\t\t\t\tthis.generatedCodeLine++;\n\t\t\t\tthis.raw[this.generatedCodeLine] = this.rawSegments = [];\n\t\t\t}\n\t\t\tthis.generatedCodeColumn = 0;\n\t\t}\n\n\t\tthis.generatedCodeColumn += lines[lines.length - 1].length;\n\t}\n}\n","import BitSet from './BitSet.js';\nimport Chunk from './Chunk.js';\nimport SourceMap from './SourceMap.js';\nimport guessIndent from './utils/guessIndent.js';\nimport getRelativePath from './utils/getRelativePath.js';\nimport isObject from './utils/isObject.js';\nimport getLocator from './utils/getLocator.js';\nimport Mappings from './utils/Mappings.js';\nimport Stats from './utils/Stats.js';\n\nconst n = '\\n';\n\nconst warned = {\n\tinsertLeft: false,\n\tinsertRight: false,\n\tstoreName: false,\n};\n\nexport default class MagicString {\n\tconstructor(string, options = {}) {\n\t\tconst chunk = new Chunk(0, string.length, string);\n\n\t\tObject.defineProperties(this, {\n\t\t\toriginal: { writable: true, value: string },\n\t\t\toutro: { writable: true, value: '' },\n\t\t\tintro: { writable: true, value: '' },\n\t\t\tfirstChunk: { writable: true, value: chunk },\n\t\t\tlastChunk: { writable: true, value: chunk },\n\t\t\tlastSearchedChunk: { writable: true, value: chunk },\n\t\t\tbyStart: { writable: true, value: {} },\n\t\t\tbyEnd: { writable: true, value: {} },\n\t\t\tfilename: { writable: true, value: options.filename },\n\t\t\tindentExclusionRanges: { writable: true, value: options.indentExclusionRanges },\n\t\t\tsourcemapLocations: { writable: true, value: new BitSet() },\n\t\t\tstoredNames: { writable: true, value: {} },\n\t\t\tindentStr: { writable: true, value: undefined },\n\t\t\tignoreList: { writable: true, value: options.ignoreList },\n\t\t\toffset: { writable: true, value: options.offset || 0 },\n\t\t});\n\n\t\tif (DEBUG) {\n\t\t\tObject.defineProperty(this, 'stats', { value: new Stats() });\n\t\t}\n\n\t\tthis.byStart[0] = chunk;\n\t\tthis.byEnd[string.length] = chunk;\n\t}\n\n\taddSourcemapLocation(char) {\n\t\tthis.sourcemapLocations.add(char);\n\t}\n\n\tappend(content) {\n\t\tif (typeof content !== 'string') throw new TypeError('outro content must be a string');\n\n\t\tthis.outro += content;\n\t\treturn this;\n\t}\n\n\tappendLeft(index, content) {\n\t\tindex = index + this.offset;\n\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tif (DEBUG) this.stats.time('appendLeft');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byEnd[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.appendLeft(content);\n\t\t} else {\n\t\t\tthis.intro += content;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('appendLeft');\n\t\treturn this;\n\t}\n\n\tappendRight(index, content) {\n\t\tindex = index + this.offset;\n\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tif (DEBUG) this.stats.time('appendRight');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byStart[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.appendRight(content);\n\t\t} else {\n\t\t\tthis.outro += content;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('appendRight');\n\t\treturn this;\n\t}\n\n\tclone() {\n\t\tconst cloned = new MagicString(this.original, { filename: this.filename, offset: this.offset });\n\n\t\tlet originalChunk = this.firstChunk;\n\t\tlet clonedChunk = (cloned.firstChunk = cloned.lastSearchedChunk = originalChunk.clone());\n\n\t\twhile (originalChunk) {\n\t\t\tcloned.byStart[clonedChunk.start] = clonedChunk;\n\t\t\tcloned.byEnd[clonedChunk.end] = clonedChunk;\n\n\t\t\tconst nextOriginalChunk = originalChunk.next;\n\t\t\tconst nextClonedChunk = nextOriginalChunk && nextOriginalChunk.clone();\n\n\t\t\tif (nextClonedChunk) {\n\t\t\t\tclonedChunk.next = nextClonedChunk;\n\t\t\t\tnextClonedChunk.previous = clonedChunk;\n\n\t\t\t\tclonedChunk = nextClonedChunk;\n\t\t\t}\n\n\t\t\toriginalChunk = nextOriginalChunk;\n\t\t}\n\n\t\tcloned.lastChunk = clonedChunk;\n\n\t\tif (this.indentExclusionRanges) {\n\t\t\tcloned.indentExclusionRanges = this.indentExclusionRanges.slice();\n\t\t}\n\n\t\tcloned.sourcemapLocations = new BitSet(this.sourcemapLocations);\n\n\t\tcloned.intro = this.intro;\n\t\tcloned.outro = this.outro;\n\n\t\treturn cloned;\n\t}\n\n\tgenerateDecodedMap(options) {\n\t\toptions = options || {};\n\n\t\tconst sourceIndex = 0;\n\t\tconst names = Object.keys(this.storedNames);\n\t\tconst mappings = new Mappings(options.hires);\n\n\t\tconst locate = getLocator(this.original);\n\n\t\tif (this.intro) {\n\t\t\tmappings.advance(this.intro);\n\t\t}\n\n\t\tthis.firstChunk.eachNext((chunk) => {\n\t\t\tconst loc = locate(chunk.start);\n\n\t\t\tif (chunk.intro.length) mappings.advance(chunk.intro);\n\n\t\t\tif (chunk.edited) {\n\t\t\t\tmappings.addEdit(\n\t\t\t\t\tsourceIndex,\n\t\t\t\t\tchunk.content,\n\t\t\t\t\tloc,\n\t\t\t\t\tchunk.storeName ? names.indexOf(chunk.original) : -1,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tmappings.addUneditedChunk(sourceIndex, chunk, this.original, loc, this.sourcemapLocations);\n\t\t\t}\n\n\t\t\tif (chunk.outro.length) mappings.advance(chunk.outro);\n\t\t});\n\n\t\treturn {\n\t\t\tfile: options.file ? options.file.split(/[/\\\\]/).pop() : undefined,\n\t\t\tsources: [\n\t\t\t\toptions.source ? getRelativePath(options.file || '', options.source) : options.file || '',\n\t\t\t],\n\t\t\tsourcesContent: options.includeContent ? [this.original] : undefined,\n\t\t\tnames,\n\t\t\tmappings: mappings.raw,\n\t\t\tx_google_ignoreList: this.ignoreList ? [sourceIndex] : undefined,\n\t\t};\n\t}\n\n\tgenerateMap(options) {\n\t\treturn new SourceMap(this.generateDecodedMap(options));\n\t}\n\n\t_ensureindentStr() {\n\t\tif (this.indentStr === undefined) {\n\t\t\tthis.indentStr = guessIndent(this.original);\n\t\t}\n\t}\n\n\t_getRawIndentString() {\n\t\tthis._ensureindentStr();\n\t\treturn this.indentStr;\n\t}\n\n\tgetIndentString() {\n\t\tthis._ensureindentStr();\n\t\treturn this.indentStr === null ? '\\t' : this.indentStr;\n\t}\n\n\tindent(indentStr, options) {\n\t\tconst pattern = /^[^\\r\\n]/gm;\n\n\t\tif (isObject(indentStr)) {\n\t\t\toptions = indentStr;\n\t\t\tindentStr = undefined;\n\t\t}\n\n\t\tif (indentStr === undefined) {\n\t\t\tthis._ensureindentStr();\n\t\t\tindentStr = this.indentStr || '\\t';\n\t\t}\n\n\t\tif (indentStr === '') return this; // noop\n\n\t\toptions = options || {};\n\n\t\t// Process exclusion ranges\n\t\tconst isExcluded = {};\n\n\t\tif (options.exclude) {\n\t\t\tconst exclusions =\n\t\t\t\ttypeof options.exclude[0] === 'number' ? [options.exclude] : options.exclude;\n\t\t\texclusions.forEach((exclusion) => {\n\t\t\t\tfor (let i = exclusion[0]; i < exclusion[1]; i += 1) {\n\t\t\t\t\tisExcluded[i] = true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tlet shouldIndentNextCharacter = options.indentStart !== false;\n\t\tconst replacer = (match) => {\n\t\t\tif (shouldIndentNextCharacter) return `${indentStr}${match}`;\n\t\t\tshouldIndentNextCharacter = true;\n\t\t\treturn match;\n\t\t};\n\n\t\tthis.intro = this.intro.replace(pattern, replacer);\n\n\t\tlet charIndex = 0;\n\t\tlet chunk = this.firstChunk;\n\n\t\twhile (chunk) {\n\t\t\tconst end = chunk.end;\n\n\t\t\tif (chunk.edited) {\n\t\t\t\tif (!isExcluded[charIndex]) {\n\t\t\t\t\tchunk.content = chunk.content.replace(pattern, replacer);\n\n\t\t\t\t\tif (chunk.content.length) {\n\t\t\t\t\t\tshouldIndentNextCharacter = chunk.content[chunk.content.length - 1] === '\\n';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcharIndex = chunk.start;\n\n\t\t\t\twhile (charIndex < end) {\n\t\t\t\t\tif (!isExcluded[charIndex]) {\n\t\t\t\t\t\tconst char = this.original[charIndex];\n\n\t\t\t\t\t\tif (char === '\\n') {\n\t\t\t\t\t\t\tshouldIndentNextCharacter = true;\n\t\t\t\t\t\t} else if (char !== '\\r' && shouldIndentNextCharacter) {\n\t\t\t\t\t\t\tshouldIndentNextCharacter = false;\n\n\t\t\t\t\t\t\tif (charIndex === chunk.start) {\n\t\t\t\t\t\t\t\tchunk.prependRight(indentStr);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis._splitChunk(chunk, charIndex);\n\t\t\t\t\t\t\t\tchunk = chunk.next;\n\t\t\t\t\t\t\t\tchunk.prependRight(indentStr);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcharIndex += 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcharIndex = chunk.end;\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\tthis.outro = this.outro.replace(pattern, replacer);\n\n\t\treturn this;\n\t}\n\n\tinsert() {\n\t\tthrow new Error(\n\t\t\t'magicString.insert(...) is deprecated. Use prependRight(...) or appendLeft(...)',\n\t\t);\n\t}\n\n\tinsertLeft(index, content) {\n\t\tif (!warned.insertLeft) {\n\t\t\tconsole.warn(\n\t\t\t\t'magicString.insertLeft(...) is deprecated. Use magicString.appendLeft(...) instead',\n\t\t\t);\n\t\t\twarned.insertLeft = true;\n\t\t}\n\n\t\treturn this.appendLeft(index, content);\n\t}\n\n\tinsertRight(index, content) {\n\t\tif (!warned.insertRight) {\n\t\t\tconsole.warn(\n\t\t\t\t'magicString.insertRight(...) is deprecated. Use magicString.prependRight(...) instead',\n\t\t\t);\n\t\t\twarned.insertRight = true;\n\t\t}\n\n\t\treturn this.prependRight(index, content);\n\t}\n\n\tmove(start, end, index) {\n\t\tstart = start + this.offset;\n\t\tend = end + this.offset;\n\t\tindex = index + this.offset;\n\n\t\tif (index >= start && index <= end) throw new Error('Cannot move a selection inside itself');\n\n\t\tif (DEBUG) this.stats.time('move');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\t\tthis._split(index);\n\n\t\tconst first = this.byStart[start];\n\t\tconst last = this.byEnd[end];\n\n\t\tconst oldLeft = first.previous;\n\t\tconst oldRight = last.next;\n\n\t\tconst newRight = this.byStart[index];\n\t\tif (!newRight && last === this.lastChunk) return this;\n\t\tconst newLeft = newRight ? newRight.previous : this.lastChunk;\n\n\t\tif (oldLeft) oldLeft.next = oldRight;\n\t\tif (oldRight) oldRight.previous = oldLeft;\n\n\t\tif (newLeft) newLeft.next = first;\n\t\tif (newRight) newRight.previous = last;\n\n\t\tif (!first.previous) this.firstChunk = last.next;\n\t\tif (!last.next) {\n\t\t\tthis.lastChunk = first.previous;\n\t\t\tthis.lastChunk.next = null;\n\t\t}\n\n\t\tfirst.previous = newLeft;\n\t\tlast.next = newRight || null;\n\n\t\tif (!newLeft) this.firstChunk = first;\n\t\tif (!newRight) this.lastChunk = last;\n\n\t\tif (DEBUG) this.stats.timeEnd('move');\n\t\treturn this;\n\t}\n\n\toverwrite(start, end, content, options) {\n\t\toptions = options || {};\n\t\treturn this.update(start, end, content, { ...options, overwrite: !options.contentOnly });\n\t}\n\n\tupdate(start, end, content, options) {\n\t\tstart = start + this.offset;\n\t\tend = end + this.offset;\n\n\t\tif (typeof content !== 'string') throw new TypeError('replacement content must be a string');\n\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tif (end > this.original.length) throw new Error('end is out of bounds');\n\t\tif (start === end)\n\t\t\tthrow new Error(\n\t\t\t\t'Cannot overwrite a zero-length range – use appendLeft or prependRight instead',\n\t\t\t);\n\n\t\tif (DEBUG) this.stats.time('overwrite');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\n\t\tif (options === true) {\n\t\t\tif (!warned.storeName) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'The final argument to magicString.overwrite(...) should be an options object. See https://github.com/rich-harris/magic-string',\n\t\t\t\t);\n\t\t\t\twarned.storeName = true;\n\t\t\t}\n\n\t\t\toptions = { storeName: true };\n\t\t}\n\t\tconst storeName = options !== undefined ? options.storeName : false;\n\t\tconst overwrite = options !== undefined ? options.overwrite : false;\n\n\t\tif (storeName) {\n\t\t\tconst original = this.original.slice(start, end);\n\t\t\tObject.defineProperty(this.storedNames, original, {\n\t\t\t\twritable: true,\n\t\t\t\tvalue: true,\n\t\t\t\tenumerable: true,\n\t\t\t});\n\t\t}\n\n\t\tconst first = this.byStart[start];\n\t\tconst last = this.byEnd[end];\n\n\t\tif (first) {\n\t\t\tlet chunk = first;\n\t\t\twhile (chunk !== last) {\n\t\t\t\tif (chunk.next !== this.byStart[chunk.end]) {\n\t\t\t\t\tthrow new Error('Cannot overwrite across a split point');\n\t\t\t\t}\n\t\t\t\tchunk = chunk.next;\n\t\t\t\tchunk.edit('', false);\n\t\t\t}\n\n\t\t\tfirst.edit(content, storeName, !overwrite);\n\t\t} else {\n\t\t\t// must be inserting at the end\n\t\t\tconst newChunk = new Chunk(start, end, '').edit(content, storeName);\n\n\t\t\t// TODO last chunk in the array may not be the last chunk, if it's moved...\n\t\t\tlast.next = newChunk;\n\t\t\tnewChunk.previous = last;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('overwrite');\n\t\treturn this;\n\t}\n\n\tprepend(content) {\n\t\tif (typeof content !== 'string') throw new TypeError('outro content must be a string');\n\n\t\tthis.intro = content + this.intro;\n\t\treturn this;\n\t}\n\n\tprependLeft(index, content) {\n\t\tindex = index + this.offset;\n\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tif (DEBUG) this.stats.time('insertRight');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byEnd[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.prependLeft(content);\n\t\t} else {\n\t\t\tthis.intro = content + this.intro;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('insertRight');\n\t\treturn this;\n\t}\n\n\tprependRight(index, content) {\n\t\tindex = index + this.offset;\n\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tif (DEBUG) this.stats.time('insertRight');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byStart[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.prependRight(content);\n\t\t} else {\n\t\t\tthis.outro = content + this.outro;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('insertRight');\n\t\treturn this;\n\t}\n\n\tremove(start, end) {\n\t\tstart = start + this.offset;\n\t\tend = end + this.offset;\n\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tif (start === end) return this;\n\n\t\tif (start < 0 || end > this.original.length) throw new Error('Character is out of bounds');\n\t\tif (start > end) throw new Error('end must be greater than start');\n\n\t\tif (DEBUG) this.stats.time('remove');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\n\t\tlet chunk = this.byStart[start];\n\n\t\twhile (chunk) {\n\t\t\tchunk.intro = '';\n\t\t\tchunk.outro = '';\n\t\t\tchunk.edit('');\n\n\t\t\tchunk = end > chunk.end ? this.byStart[chunk.end] : null;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('remove');\n\t\treturn this;\n\t}\n\n\treset(start, end) {\n\t\tstart = start + this.offset;\n\t\tend = end + this.offset;\n\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tif (start === end) return this;\n\n\t\tif (start < 0 || end > this.original.length) throw new Error('Character is out of bounds');\n\t\tif (start > end) throw new Error('end must be greater than start');\n\n\t\tif (DEBUG) this.stats.time('reset');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\n\t\tlet chunk = this.byStart[start];\n\n\t\twhile (chunk) {\n\t\t\tchunk.reset();\n\n\t\t\tchunk = end > chunk.end ? this.byStart[chunk.end] : null;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('reset');\n\t\treturn this;\n\t}\n\n\tlastChar() {\n\t\tif (this.outro.length) return this.outro[this.outro.length - 1];\n\t\tlet chunk = this.lastChunk;\n\t\tdo {\n\t\t\tif (chunk.outro.length) return chunk.outro[chunk.outro.length - 1];\n\t\t\tif (chunk.content.length) return chunk.content[chunk.content.length - 1];\n\t\t\tif (chunk.intro.length) return chunk.intro[chunk.intro.length - 1];\n\t\t} while ((chunk = chunk.previous));\n\t\tif (this.intro.length) return this.intro[this.intro.length - 1];\n\t\treturn '';\n\t}\n\n\tlastLine() {\n\t\tlet lineIndex = this.outro.lastIndexOf(n);\n\t\tif (lineIndex !== -1) return this.outro.substr(lineIndex + 1);\n\t\tlet lineStr = this.outro;\n\t\tlet chunk = this.lastChunk;\n\t\tdo {\n\t\t\tif (chunk.outro.length > 0) {\n\t\t\t\tlineIndex = chunk.outro.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1) return chunk.outro.substr(lineIndex + 1) + lineStr;\n\t\t\t\tlineStr = chunk.outro + lineStr;\n\t\t\t}\n\n\t\t\tif (chunk.content.length > 0) {\n\t\t\t\tlineIndex = chunk.content.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1) return chunk.content.substr(lineIndex + 1) + lineStr;\n\t\t\t\tlineStr = chunk.content + lineStr;\n\t\t\t}\n\n\t\t\tif (chunk.intro.length > 0) {\n\t\t\t\tlineIndex = chunk.intro.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1) return chunk.intro.substr(lineIndex + 1) + lineStr;\n\t\t\t\tlineStr = chunk.intro + lineStr;\n\t\t\t}\n\t\t} while ((chunk = chunk.previous));\n\t\tlineIndex = this.intro.lastIndexOf(n);\n\t\tif (lineIndex !== -1) return this.intro.substr(lineIndex + 1) + lineStr;\n\t\treturn this.intro + lineStr;\n\t}\n\n\tslice(start = 0, end = this.original.length - this.offset) {\n\t\tstart = start + this.offset;\n\t\tend = end + this.offset;\n\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tlet result = '';\n\n\t\t// find start chunk\n\t\tlet chunk = this.firstChunk;\n\t\twhile (chunk && (chunk.start > start || chunk.end <= start)) {\n\t\t\t// found end chunk before start\n\t\t\tif (chunk.start < end && chunk.end >= end) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\tif (chunk && chunk.edited && chunk.start !== start)\n\t\t\tthrow new Error(`Cannot use replaced character ${start} as slice start anchor.`);\n\n\t\tconst startChunk = chunk;\n\t\twhile (chunk) {\n\t\t\tif (chunk.intro && (startChunk !== chunk || chunk.start === start)) {\n\t\t\t\tresult += chunk.intro;\n\t\t\t}\n\n\t\t\tconst containsEnd = chunk.start < end && chunk.end >= end;\n\t\t\tif (containsEnd && chunk.edited && chunk.end !== end)\n\t\t\t\tthrow new Error(`Cannot use replaced character ${end} as slice end anchor.`);\n\n\t\t\tconst sliceStart = startChunk === chunk ? start - chunk.start : 0;\n\t\t\tconst sliceEnd = containsEnd ? chunk.content.length + end - chunk.end : chunk.content.length;\n\n\t\t\tresult += chunk.content.slice(sliceStart, sliceEnd);\n\n\t\t\tif (chunk.outro && (!containsEnd || chunk.end === end)) {\n\t\t\t\tresult += chunk.outro;\n\t\t\t}\n\n\t\t\tif (containsEnd) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// TODO deprecate this? not really very useful\n\tsnip(start, end) {\n\t\tconst clone = this.clone();\n\t\tclone.remove(0, start);\n\t\tclone.remove(end, clone.original.length);\n\n\t\treturn clone;\n\t}\n\n\t_split(index) {\n\t\tif (this.byStart[index] || this.byEnd[index]) return;\n\n\t\tif (DEBUG) this.stats.time('_split');\n\n\t\tlet chunk = this.lastSearchedChunk;\n\t\tconst searchForward = index > chunk.end;\n\n\t\twhile (chunk) {\n\t\t\tif (chunk.contains(index)) return this._splitChunk(chunk, index);\n\n\t\t\tchunk = searchForward ? this.byStart[chunk.end] : this.byEnd[chunk.start];\n\t\t}\n\t}\n\n\t_splitChunk(chunk, index) {\n\t\tif (chunk.edited && chunk.content.length) {\n\t\t\t// zero-length edited chunks are a special case (overlapping replacements)\n\t\t\tconst loc = getLocator(this.original)(index);\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot split a chunk that has already been edited (${loc.line}:${loc.column} – \"${chunk.original}\")`,\n\t\t\t);\n\t\t}\n\n\t\tconst newChunk = chunk.split(index);\n\n\t\tthis.byEnd[index] = chunk;\n\t\tthis.byStart[index] = newChunk;\n\t\tthis.byEnd[newChunk.end] = newChunk;\n\n\t\tif (chunk === this.lastChunk) this.lastChunk = newChunk;\n\n\t\tthis.lastSearchedChunk = chunk;\n\t\tif (DEBUG) this.stats.timeEnd('_split');\n\t\treturn true;\n\t}\n\n\ttoString() {\n\t\tlet str = this.intro;\n\n\t\tlet chunk = this.firstChunk;\n\t\twhile (chunk) {\n\t\t\tstr += chunk.toString();\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\treturn str + this.outro;\n\t}\n\n\tisEmpty() {\n\t\tlet chunk = this.firstChunk;\n\t\tdo {\n\t\t\tif (\n\t\t\t\t(chunk.intro.length && chunk.intro.trim()) ||\n\t\t\t\t(chunk.content.length && chunk.content.trim()) ||\n\t\t\t\t(chunk.outro.length && chunk.outro.trim())\n\t\t\t)\n\t\t\t\treturn false;\n\t\t} while ((chunk = chunk.next));\n\t\treturn true;\n\t}\n\n\tlength() {\n\t\tlet chunk = this.firstChunk;\n\t\tlet length = 0;\n\t\tdo {\n\t\t\tlength += chunk.intro.length + chunk.content.length + chunk.outro.length;\n\t\t} while ((chunk = chunk.next));\n\t\treturn length;\n\t}\n\n\ttrimLines() {\n\t\treturn this.trim('[\\\\r\\\\n]');\n\t}\n\n\ttrim(charType) {\n\t\treturn this.trimStart(charType).trimEnd(charType);\n\t}\n\n\ttrimEndAborted(charType) {\n\t\tconst rx = new RegExp((charType || '\\\\s') + '+$');\n\n\t\tthis.outro = this.outro.replace(rx, '');\n\t\tif (this.outro.length) return true;\n\n\t\tlet chunk = this.lastChunk;\n\n\t\tdo {\n\t\t\tconst end = chunk.end;\n\t\t\tconst aborted = chunk.trimEnd(rx);\n\n\t\t\t// if chunk was trimmed, we have a new lastChunk\n\t\t\tif (chunk.end !== end) {\n\t\t\t\tif (this.lastChunk === chunk) {\n\t\t\t\t\tthis.lastChunk = chunk.next;\n\t\t\t\t}\n\n\t\t\t\tthis.byEnd[chunk.end] = chunk;\n\t\t\t\tthis.byStart[chunk.next.start] = chunk.next;\n\t\t\t\tthis.byEnd[chunk.next.end] = chunk.next;\n\t\t\t}\n\n\t\t\tif (aborted) return true;\n\t\t\tchunk = chunk.previous;\n\t\t} while (chunk);\n\n\t\treturn false;\n\t}\n\n\ttrimEnd(charType) {\n\t\tthis.trimEndAborted(charType);\n\t\treturn this;\n\t}\n\ttrimStartAborted(charType) {\n\t\tconst rx = new RegExp('^' + (charType || '\\\\s') + '+');\n\n\t\tthis.intro = this.intro.replace(rx, '');\n\t\tif (this.intro.length) return true;\n\n\t\tlet chunk = this.firstChunk;\n\n\t\tdo {\n\t\t\tconst end = chunk.end;\n\t\t\tconst aborted = chunk.trimStart(rx);\n\n\t\t\tif (chunk.end !== end) {\n\t\t\t\t// special case...\n\t\t\t\tif (chunk === this.lastChunk) this.lastChunk = chunk.next;\n\n\t\t\t\tthis.byEnd[chunk.end] = chunk;\n\t\t\t\tthis.byStart[chunk.next.start] = chunk.next;\n\t\t\t\tthis.byEnd[chunk.next.end] = chunk.next;\n\t\t\t}\n\n\t\t\tif (aborted) return true;\n\t\t\tchunk = chunk.next;\n\t\t} while (chunk);\n\n\t\treturn false;\n\t}\n\n\ttrimStart(charType) {\n\t\tthis.trimStartAborted(charType);\n\t\treturn this;\n\t}\n\n\thasChanged() {\n\t\treturn this.original !== this.toString();\n\t}\n\n\t_replaceRegexp(searchValue, replacement) {\n\t\tfunction getReplacement(match, str) {\n\t\t\tif (typeof replacement === 'string') {\n\t\t\t\treturn replacement.replace(/\\$(\\$|&|\\d+)/g, (_, i) => {\n\t\t\t\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_a_parameter\n\t\t\t\t\tif (i === '$') return '$';\n\t\t\t\t\tif (i === '&') return match[0];\n\t\t\t\t\tconst num = +i;\n\t\t\t\t\tif (num < match.length) return match[+i];\n\t\t\t\t\treturn `$${i}`;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn replacement(...match, match.index, str, match.groups);\n\t\t\t}\n\t\t}\n\t\tfunction matchAll(re, str) {\n\t\t\tlet match;\n\t\t\tconst matches = [];\n\t\t\twhile ((match = re.exec(str))) {\n\t\t\t\tmatches.push(match);\n\t\t\t}\n\t\t\treturn matches;\n\t\t}\n\t\tif (searchValue.global) {\n\t\t\tconst matches = matchAll(searchValue, this.original);\n\t\t\tmatches.forEach((match) => {\n\t\t\t\tif (match.index != null) {\n\t\t\t\t\tconst replacement = getReplacement(match, this.original);\n\t\t\t\t\tif (replacement !== match[0]) {\n\t\t\t\t\t\tthis.overwrite(match.index, match.index + match[0].length, replacement);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tconst match = this.original.match(searchValue);\n\t\t\tif (match && match.index != null) {\n\t\t\t\tconst replacement = getReplacement(match, this.original);\n\t\t\t\tif (replacement !== match[0]) {\n\t\t\t\t\tthis.overwrite(match.index, match.index + match[0].length, replacement);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\t_replaceString(string, replacement) {\n\t\tconst { original } = this;\n\t\tconst index = original.indexOf(string);\n\n\t\tif (index !== -1) {\n\t\t\tthis.overwrite(index, index + string.length, replacement);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\treplace(searchValue, replacement) {\n\t\tif (typeof searchValue === 'string') {\n\t\t\treturn this._replaceString(searchValue, replacement);\n\t\t}\n\n\t\treturn this._replaceRegexp(searchValue, replacement);\n\t}\n\n\t_replaceAllString(string, replacement) {\n\t\tconst { original } = this;\n\t\tconst stringLength = string.length;\n\t\tfor (\n\t\t\tlet index = original.indexOf(string);\n\t\t\tindex !== -1;\n\t\t\tindex = original.indexOf(string, index + stringLength)\n\t\t) {\n\t\t\tconst previous = original.slice(index, index + stringLength);\n\t\t\tif (previous !== replacement) this.overwrite(index, index + stringLength, replacement);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\treplaceAll(searchValue, replacement) {\n\t\tif (typeof searchValue === 'string') {\n\t\t\treturn this._replaceAllString(searchValue, replacement);\n\t\t}\n\n\t\tif (!searchValue.global) {\n\t\t\tthrow new TypeError(\n\t\t\t\t'MagicString.prototype.replaceAll called with a non-global RegExp argument',\n\t\t\t);\n\t\t}\n\n\t\treturn this._replaceRegexp(searchValue, replacement);\n\t}\n}\n","import MagicString from './MagicString.js';\nimport SourceMap from './SourceMap.js';\nimport getRelativePath from './utils/getRelativePath.js';\nimport isObject from './utils/isObject.js';\nimport getLocator from './utils/getLocator.js';\nimport Mappings from './utils/Mappings.js';\n\nconst hasOwnProp = Object.prototype.hasOwnProperty;\n\nexport default class Bundle {\n\tconstructor(options = {}) {\n\t\tthis.intro = options.intro || '';\n\t\tthis.separator = options.separator !== undefined ? options.separator : '\\n';\n\t\tthis.sources = [];\n\t\tthis.uniqueSources = [];\n\t\tthis.uniqueSourceIndexByFilename = {};\n\t}\n\n\taddSource(source) {\n\t\tif (source instanceof MagicString) {\n\t\t\treturn this.addSource({\n\t\t\t\tcontent: source,\n\t\t\t\tfilename: source.filename,\n\t\t\t\tseparator: this.separator,\n\t\t\t});\n\t\t}\n\n\t\tif (!isObject(source) || !source.content) {\n\t\t\tthrow new Error(\n\t\t\t\t'bundle.addSource() takes an object with a `content` property, which should be an instance of MagicString, and an optional `filename`',\n\t\t\t);\n\t\t}\n\n\t\t['filename', 'ignoreList', 'indentExclusionRanges', 'separator'].forEach((option) => {\n\t\t\tif (!hasOwnProp.call(source, option)) source[option] = source.content[option];\n\t\t});\n\n\t\tif (source.separator === undefined) {\n\t\t\t// TODO there's a bunch of this sort of thing, needs cleaning up\n\t\t\tsource.separator = this.separator;\n\t\t}\n\n\t\tif (source.filename) {\n\t\t\tif (!hasOwnProp.call(this.uniqueSourceIndexByFilename, source.filename)) {\n\t\t\t\tthis.uniqueSourceIndexByFilename[source.filename] = this.uniqueSources.length;\n\t\t\t\tthis.uniqueSources.push({ filename: source.filename, content: source.content.original });\n\t\t\t} else {\n\t\t\t\tconst uniqueSource = this.uniqueSources[this.uniqueSourceIndexByFilename[source.filename]];\n\t\t\t\tif (source.content.original !== uniqueSource.content) {\n\t\t\t\t\tthrow new Error(`Illegal source: same filename (${source.filename}), different contents`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.sources.push(source);\n\t\treturn this;\n\t}\n\n\tappend(str, options) {\n\t\tthis.addSource({\n\t\t\tcontent: new MagicString(str),\n\t\t\tseparator: (options && options.separator) || '',\n\t\t});\n\n\t\treturn this;\n\t}\n\n\tclone() {\n\t\tconst bundle = new Bundle({\n\t\t\tintro: this.intro,\n\t\t\tseparator: this.separator,\n\t\t});\n\n\t\tthis.sources.forEach((source) => {\n\t\t\tbundle.addSource({\n\t\t\t\tfilename: source.filename,\n\t\t\t\tcontent: source.content.clone(),\n\t\t\t\tseparator: source.separator,\n\t\t\t});\n\t\t});\n\n\t\treturn bundle;\n\t}\n\n\tgenerateDecodedMap(options = {}) {\n\t\tconst names = [];\n\t\tlet x_google_ignoreList = undefined;\n\t\tthis.sources.forEach((source) => {\n\t\t\tObject.keys(source.content.storedNames).forEach((name) => {\n\t\t\t\tif (!~names.indexOf(name)) names.push(name);\n\t\t\t});\n\t\t});\n\n\t\tconst mappings = new Mappings(options.hires);\n\n\t\tif (this.intro) {\n\t\t\tmappings.advance(this.intro);\n\t\t}\n\n\t\tthis.sources.forEach((source, i) => {\n\t\t\tif (i > 0) {\n\t\t\t\tmappings.advance(this.separator);\n\t\t\t}\n\n\t\t\tconst sourceIndex = source.filename ? this.uniqueSourceIndexByFilename[source.filename] : -1;\n\t\t\tconst magicString = source.content;\n\t\t\tconst locate = getLocator(magicString.original);\n\n\t\t\tif (magicString.intro) {\n\t\t\t\tmappings.advance(magicString.intro);\n\t\t\t}\n\n\t\t\tmagicString.firstChunk.eachNext((chunk) => {\n\t\t\t\tconst loc = locate(chunk.start);\n\n\t\t\t\tif (chunk.intro.length) mappings.advance(chunk.intro);\n\n\t\t\t\tif (source.filename) {\n\t\t\t\t\tif (chunk.edited) {\n\t\t\t\t\t\tmappings.addEdit(\n\t\t\t\t\t\t\tsourceIndex,\n\t\t\t\t\t\t\tchunk.content,\n\t\t\t\t\t\t\tloc,\n\t\t\t\t\t\t\tchunk.storeName ? names.indexOf(chunk.original) : -1,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmappings.addUneditedChunk(\n\t\t\t\t\t\t\tsourceIndex,\n\t\t\t\t\t\t\tchunk,\n\t\t\t\t\t\t\tmagicString.original,\n\t\t\t\t\t\t\tloc,\n\t\t\t\t\t\t\tmagicString.sourcemapLocations,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tmappings.advance(chunk.content);\n\t\t\t\t}\n\n\t\t\t\tif (chunk.outro.length) mappings.advance(chunk.outro);\n\t\t\t});\n\n\t\t\tif (magicString.outro) {\n\t\t\t\tmappings.advance(magicString.outro);\n\t\t\t}\n\n\t\t\tif (source.ignoreList && sourceIndex !== -1) {\n\t\t\t\tif (x_google_ignoreList === undefined) {\n\t\t\t\t\tx_google_ignoreList = [];\n\t\t\t\t}\n\t\t\t\tx_google_ignoreList.push(sourceIndex);\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tfile: options.file ? options.file.split(/[/\\\\]/).pop() : undefined,\n\t\t\tsources: this.uniqueSources.map((source) => {\n\t\t\t\treturn options.file ? getRelativePath(options.file, source.filename) : source.filename;\n\t\t\t}),\n\t\t\tsourcesContent: this.uniqueSources.map((source) => {\n\t\t\t\treturn options.includeContent ? source.content : null;\n\t\t\t}),\n\t\t\tnames,\n\t\t\tmappings: mappings.raw,\n\t\t\tx_google_ignoreList,\n\t\t};\n\t}\n\n\tgenerateMap(options) {\n\t\treturn new SourceMap(this.generateDecodedMap(options));\n\t}\n\n\tgetIndentString() {\n\t\tconst indentStringCounts = {};\n\n\t\tthis.sources.forEach((source) => {\n\t\t\tconst indentStr = source.content._getRawIndentString();\n\n\t\t\tif (indentStr === null) return;\n\n\t\t\tif (!indentStringCounts[indentStr]) indentStringCounts[indentStr] = 0;\n\t\t\tindentStringCounts[indentStr] += 1;\n\t\t});\n\n\t\treturn (\n\t\t\tObject.keys(indentStringCounts).sort((a, b) => {\n\t\t\t\treturn indentStringCounts[a] - indentStringCounts[b];\n\t\t\t})[0] || '\\t'\n\t\t);\n\t}\n\n\tindent(indentStr) {\n\t\tif (!arguments.length) {\n\t\t\tindentStr = this.getIndentString();\n\t\t}\n\n\t\tif (indentStr === '') return this; // noop\n\n\t\tlet trailingNewline = !this.intro || this.intro.slice(-1) === '\\n';\n\n\t\tthis.sources.forEach((source, i) => {\n\t\t\tconst separator = source.separator !== undefined ? source.separator : this.separator;\n\t\t\tconst indentStart = trailingNewline || (i > 0 && /\\r?\\n$/.test(separator));\n\n\t\t\tsource.content.indent(indentStr, {\n\t\t\t\texclude: source.indentExclusionRanges,\n\t\t\t\tindentStart, //: trailingNewline || /\\r?\\n$/.test( separator ) //true///\\r?\\n/.test( separator )\n\t\t\t});\n\n\t\t\ttrailingNewline = source.content.lastChar() === '\\n';\n\t\t});\n\n\t\tif (this.intro) {\n\t\t\tthis.intro =\n\t\t\t\tindentStr +\n\t\t\t\tthis.intro.replace(/^[^\\n]/gm, (match, index) => {\n\t\t\t\t\treturn index > 0 ? indentStr + match : match;\n\t\t\t\t});\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tprepend(str) {\n\t\tthis.intro = str + this.intro;\n\t\treturn this;\n\t}\n\n\ttoString() {\n\t\tconst body = this.sources\n\t\t\t.map((source, i) => {\n\t\t\t\tconst separator = source.separator !== undefined ? source.separator : this.separator;\n\t\t\t\tconst str = (i > 0 ? separator : '') + source.content.toString();\n\n\t\t\t\treturn str;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn this.intro + body;\n\t}\n\n\tisEmpty() {\n\t\tif (this.intro.length && this.intro.trim()) return false;\n\t\tif (this.sources.some((source) => !source.content.isEmpty())) return false;\n\t\treturn true;\n\t}\n\n\tlength() {\n\t\treturn this.sources.reduce(\n\t\t\t(length, source) => length + source.content.length(),\n\t\t\tthis.intro.length,\n\t\t);\n\t}\n\n\ttrimLines() {\n\t\treturn this.trim('[\\\\r\\\\n]');\n\t}\n\n\ttrim(charType) {\n\t\treturn this.trimStart(charType).trimEnd(charType);\n\t}\n\n\ttrimStart(charType) {\n\t\tconst rx = new RegExp('^' + (charType || '\\\\s') + '+');\n\t\tthis.intro = this.intro.replace(rx, '');\n\n\t\tif (!this.intro) {\n\t\t\tlet source;\n\t\t\tlet i = 0;\n\n\t\t\tdo {\n\t\t\t\tsource = this.sources[i++];\n\t\t\t\tif (!source) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} while (!source.content.trimStartAborted(charType));\n\t\t}\n\n\t\treturn this;\n\t}\n\n\ttrimEnd(charType) {\n\t\tconst rx = new RegExp((charType || '\\\\s') + '+$');\n\n\t\tlet source;\n\t\tlet i = this.sources.length - 1;\n\n\t\tdo {\n\t\t\tsource = this.sources[i--];\n\t\t\tif (!source) {\n\t\t\t\tthis.intro = this.intro.replace(rx, '');\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} while (!source.content.trimEndAborted(charType));\n\n\t\treturn this;\n\t}\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"magic-string.es.mjs","sources":["../src/BitSet.js","../src/Chunk.js","../src/SourceMap.js","../src/utils/guessIndent.js","../src/utils/getRelativePath.js","../src/utils/isObject.js","../src/utils/getLocator.js","../src/utils/Mappings.js","../src/MagicString.js","../src/Bundle.js"],"sourcesContent":["export default class BitSet {\n\tconstructor(arg) {\n\t\tthis.bits = arg instanceof BitSet ? arg.bits.slice() : [];\n\t}\n\n\tadd(n) {\n\t\tthis.bits[n >> 5] |= 1 << (n & 31);\n\t}\n\n\thas(n) {\n\t\treturn !!(this.bits[n >> 5] & (1 << (n & 31)));\n\t}\n}\n","export default class Chunk {\n\tconstructor(start, end, content) {\n\t\tthis.start = start;\n\t\tthis.end = end;\n\t\tthis.original = content;\n\n\t\tthis.intro = '';\n\t\tthis.outro = '';\n\n\t\tthis.content = content;\n\t\tthis.storeName = false;\n\t\tthis.edited = false;\n\n\t\tif (DEBUG) {\n\t\t\t// we make these non-enumerable, for sanity while debugging\n\t\t\tObject.defineProperties(this, {\n\t\t\t\tprevious: { writable: true, value: null },\n\t\t\t\tnext: { writable: true, value: null },\n\t\t\t});\n\t\t} else {\n\t\t\tthis.previous = null;\n\t\t\tthis.next = null;\n\t\t}\n\t}\n\n\tappendLeft(content) {\n\t\tthis.outro += content;\n\t}\n\n\tappendRight(content) {\n\t\tthis.intro = this.intro + content;\n\t}\n\n\tclone() {\n\t\tconst chunk = new Chunk(this.start, this.end, this.original);\n\n\t\tchunk.intro = this.intro;\n\t\tchunk.outro = this.outro;\n\t\tchunk.content = this.content;\n\t\tchunk.storeName = this.storeName;\n\t\tchunk.edited = this.edited;\n\n\t\treturn chunk;\n\t}\n\n\tcontains(index) {\n\t\treturn this.start < index && index < this.end;\n\t}\n\n\teachNext(fn) {\n\t\tlet chunk = this;\n\t\twhile (chunk) {\n\t\t\tfn(chunk);\n\t\t\tchunk = chunk.next;\n\t\t}\n\t}\n\n\teachPrevious(fn) {\n\t\tlet chunk = this;\n\t\twhile (chunk) {\n\t\t\tfn(chunk);\n\t\t\tchunk = chunk.previous;\n\t\t}\n\t}\n\n\tedit(content, storeName, contentOnly) {\n\t\tthis.content = content;\n\t\tif (!contentOnly) {\n\t\t\tthis.intro = '';\n\t\t\tthis.outro = '';\n\t\t}\n\t\tthis.storeName = storeName;\n\n\t\tthis.edited = true;\n\n\t\treturn this;\n\t}\n\n\tprependLeft(content) {\n\t\tthis.outro = content + this.outro;\n\t}\n\n\tprependRight(content) {\n\t\tthis.intro = content + this.intro;\n\t}\n\n\treset() {\n\t\tthis.intro = '';\n\t\tthis.outro = '';\n\t\tif (this.edited) {\n\t\t\tthis.content = this.original;\n\t\t\tthis.storeName = false;\n\t\t\tthis.edited = false;\n\t\t}\n\t}\n\n\tsplit(index) {\n\t\tconst sliceIndex = index - this.start;\n\n\t\tconst originalBefore = this.original.slice(0, sliceIndex);\n\t\tconst originalAfter = this.original.slice(sliceIndex);\n\n\t\tthis.original = originalBefore;\n\n\t\tconst newChunk = new Chunk(index, this.end, originalAfter);\n\t\tnewChunk.outro = this.outro;\n\t\tthis.outro = '';\n\n\t\tthis.end = index;\n\n\t\tif (this.edited) {\n\t\t\t// after split we should save the edit content record into the correct chunk\n\t\t\t// to make sure sourcemap correct\n\t\t\t// For example:\n\t\t\t// ' test'.trim()\n\t\t\t// split -> ' ' + 'test'\n\t\t\t// ✔️ edit -> '' + 'test'\n\t\t\t// ✖️ edit -> 'test' + '' \n\t\t\t// TODO is this block necessary?...\n\t\t\tnewChunk.edit('', false);\n\t\t\tthis.content = '';\n\t\t} else {\n\t\t\tthis.content = originalBefore;\n\t\t}\n\n\t\tnewChunk.next = this.next;\n\t\tif (newChunk.next) newChunk.next.previous = newChunk;\n\t\tnewChunk.previous = this;\n\t\tthis.next = newChunk;\n\n\t\treturn newChunk;\n\t}\n\n\ttoString() {\n\t\treturn this.intro + this.content + this.outro;\n\t}\n\n\ttrimEnd(rx) {\n\t\tthis.outro = this.outro.replace(rx, '');\n\t\tif (this.outro.length) return true;\n\n\t\tconst trimmed = this.content.replace(rx, '');\n\n\t\tif (trimmed.length) {\n\t\t\tif (trimmed !== this.content) {\n\t\t\t\tthis.split(this.start + trimmed.length).edit('', undefined, true);\n\t\t\t\tif (this.edited) {\n\t\t\t\t\t// save the change, if it has been edited\n\t\t\t\t\tthis.edit(trimmed, this.storeName, true);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} else {\n\t\t\tthis.edit('', undefined, true);\n\n\t\t\tthis.intro = this.intro.replace(rx, '');\n\t\t\tif (this.intro.length) return true;\n\t\t}\n\t}\n\n\ttrimStart(rx) {\n\t\tthis.intro = this.intro.replace(rx, '');\n\t\tif (this.intro.length) return true;\n\n\t\tconst trimmed = this.content.replace(rx, '');\n\n\t\tif (trimmed.length) {\n\t\t\tif (trimmed !== this.content) {\n\t\t\t\tconst newChunk = this.split(this.end - trimmed.length);\n\t\t\t\tif (this.edited) {\n\t\t\t\t\t// save the change, if it has been edited\n\t\t\t\t\tnewChunk.edit(trimmed, this.storeName, true);\n\t\t\t\t}\n\t\t\t\tthis.edit('', undefined, true);\n\t\t\t}\n\t\t\treturn true;\n\t\t} else {\n\t\t\tthis.edit('', undefined, true);\n\n\t\t\tthis.outro = this.outro.replace(rx, '');\n\t\t\tif (this.outro.length) return true;\n\t\t}\n\t}\n}\n","import { encode } from '@jridgewell/sourcemap-codec';\n\nfunction getBtoa() {\n\tif (typeof globalThis !== 'undefined' && typeof globalThis.btoa === 'function') {\n\t\treturn (str) => globalThis.btoa(unescape(encodeURIComponent(str)));\n\t} else if (typeof Buffer === 'function') {\n\t\treturn (str) => Buffer.from(str, 'utf-8').toString('base64');\n\t} else {\n\t\treturn () => {\n\t\t\tthrow new Error('Unsupported environment: `window.btoa` or `Buffer` should be supported.');\n\t\t};\n\t}\n}\n\nconst btoa = /*#__PURE__*/ getBtoa();\n\nexport default class SourceMap {\n\tconstructor(properties) {\n\t\tthis.version = 3;\n\t\tthis.file = properties.file;\n\t\tthis.sources = properties.sources;\n\t\tthis.sourcesContent = properties.sourcesContent;\n\t\tthis.names = properties.names;\n\t\tthis.mappings = encode(properties.mappings);\n\t\tif (typeof properties.x_google_ignoreList !== 'undefined') {\n\t\t\tthis.x_google_ignoreList = properties.x_google_ignoreList;\n\t\t}\n\t}\n\n\ttoString() {\n\t\treturn JSON.stringify(this);\n\t}\n\n\ttoUrl() {\n\t\treturn 'data:application/json;charset=utf-8;base64,' + btoa(this.toString());\n\t}\n}\n","export default function guessIndent(code) {\n\tconst lines = code.split('\\n');\n\n\tconst tabbed = lines.filter((line) => /^\\t+/.test(line));\n\tconst spaced = lines.filter((line) => /^ {2,}/.test(line));\n\n\tif (tabbed.length === 0 && spaced.length === 0) {\n\t\treturn null;\n\t}\n\n\t// More lines tabbed than spaced? Assume tabs, and\n\t// default to tabs in the case of a tie (or nothing\n\t// to go on)\n\tif (tabbed.length >= spaced.length) {\n\t\treturn '\\t';\n\t}\n\n\t// Otherwise, we need to guess the multiple\n\tconst min = spaced.reduce((previous, current) => {\n\t\tconst numSpaces = /^ +/.exec(current)[0].length;\n\t\treturn Math.min(numSpaces, previous);\n\t}, Infinity);\n\n\treturn new Array(min + 1).join(' ');\n}\n","export default function getRelativePath(from, to) {\n\tconst fromParts = from.split(/[/\\\\]/);\n\tconst toParts = to.split(/[/\\\\]/);\n\n\tfromParts.pop(); // get dirname\n\n\twhile (fromParts[0] === toParts[0]) {\n\t\tfromParts.shift();\n\t\ttoParts.shift();\n\t}\n\n\tif (fromParts.length) {\n\t\tlet i = fromParts.length;\n\t\twhile (i--) fromParts[i] = '..';\n\t}\n\n\treturn fromParts.concat(toParts).join('/');\n}\n","const toString = Object.prototype.toString;\n\nexport default function isObject(thing) {\n\treturn toString.call(thing) === '[object Object]';\n}\n","export default function getLocator(source) {\n\tconst originalLines = source.split('\\n');\n\tconst lineOffsets = [];\n\n\tfor (let i = 0, pos = 0; i < originalLines.length; i++) {\n\t\tlineOffsets.push(pos);\n\t\tpos += originalLines[i].length + 1;\n\t}\n\n\treturn function locate(index) {\n\t\tlet i = 0;\n\t\tlet j = lineOffsets.length;\n\t\twhile (i < j) {\n\t\t\tconst m = (i + j) >> 1;\n\t\t\tif (index < lineOffsets[m]) {\n\t\t\t\tj = m;\n\t\t\t} else {\n\t\t\t\ti = m + 1;\n\t\t\t}\n\t\t}\n\t\tconst line = i - 1;\n\t\tconst column = index - lineOffsets[line];\n\t\treturn { line, column };\n\t};\n}\n","const wordRegex = /\\w/;\n\nexport default class Mappings {\n\tconstructor(hires) {\n\t\tthis.hires = hires;\n\t\tthis.generatedCodeLine = 0;\n\t\tthis.generatedCodeColumn = 0;\n\t\tthis.raw = [];\n\t\tthis.rawSegments = this.raw[this.generatedCodeLine] = [];\n\t\tthis.pending = null;\n\t}\n\n\taddEdit(sourceIndex, content, loc, nameIndex) {\n\t\tif (content.length) {\n\t\t\tconst contentLengthMinusOne = content.length - 1;\n\t\t\tlet contentLineEnd = content.indexOf('\\n', 0);\n\t\t\tlet previousContentLineEnd = -1;\n\t\t\t// Loop through each line in the content and add a segment, but stop if the last line is empty,\n\t\t\t// else code afterwards would fill one line too many\n\t\t\twhile (contentLineEnd >= 0 && contentLengthMinusOne > contentLineEnd) {\n\t\t\t\tconst segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];\n\t\t\t\tif (nameIndex >= 0) {\n\t\t\t\t\tsegment.push(nameIndex);\n\t\t\t\t}\n\t\t\t\tthis.rawSegments.push(segment);\n\n\t\t\t\tthis.generatedCodeLine += 1;\n\t\t\t\tthis.raw[this.generatedCodeLine] = this.rawSegments = [];\n\t\t\t\tthis.generatedCodeColumn = 0;\n\n\t\t\t\tpreviousContentLineEnd = contentLineEnd;\n\t\t\t\tcontentLineEnd = content.indexOf('\\n', contentLineEnd + 1);\n\t\t\t}\n\n\t\t\tconst segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];\n\t\t\tif (nameIndex >= 0) {\n\t\t\t\tsegment.push(nameIndex);\n\t\t\t}\n\t\t\tthis.rawSegments.push(segment);\n\n\t\t\tthis.advance(content.slice(previousContentLineEnd + 1));\n\t\t} else if (this.pending) {\n\t\t\tthis.rawSegments.push(this.pending);\n\t\t\tthis.advance(content);\n\t\t}\n\n\t\tthis.pending = null;\n\t}\n\n\taddUneditedChunk(sourceIndex, chunk, original, loc, sourcemapLocations) {\n\t\tlet originalCharIndex = chunk.start;\n\t\tlet first = true;\n\t\t// when iterating each char, check if it's in a word boundary\n\t\tlet charInHiresBoundary = false;\n\n\t\twhile (originalCharIndex < chunk.end) {\n\t\t\tif (this.hires || first || sourcemapLocations.has(originalCharIndex)) {\n\t\t\t\tconst segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];\n\n\t\t\t\tif (this.hires === 'boundary') {\n\t\t\t\t\t// in hires \"boundary\", group segments per word boundary than per char\n\t\t\t\t\tif (wordRegex.test(original[originalCharIndex])) {\n\t\t\t\t\t\t// for first char in the boundary found, start the boundary by pushing a segment\n\t\t\t\t\t\tif (!charInHiresBoundary) {\n\t\t\t\t\t\t\tthis.rawSegments.push(segment);\n\t\t\t\t\t\t\tcharInHiresBoundary = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// for non-word char, end the boundary by pushing a segment\n\t\t\t\t\t\tthis.rawSegments.push(segment);\n\t\t\t\t\t\tcharInHiresBoundary = false;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.rawSegments.push(segment);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (original[originalCharIndex] === '\\n') {\n\t\t\t\tloc.line += 1;\n\t\t\t\tloc.column = 0;\n\t\t\t\tthis.generatedCodeLine += 1;\n\t\t\t\tthis.raw[this.generatedCodeLine] = this.rawSegments = [];\n\t\t\t\tthis.generatedCodeColumn = 0;\n\t\t\t\tfirst = true;\n\t\t\t} else {\n\t\t\t\tloc.column += 1;\n\t\t\t\tthis.generatedCodeColumn += 1;\n\t\t\t\tfirst = false;\n\t\t\t}\n\n\t\t\toriginalCharIndex += 1;\n\t\t}\n\n\t\tthis.pending = null;\n\t}\n\n\tadvance(str) {\n\t\tif (!str) return;\n\n\t\tconst lines = str.split('\\n');\n\n\t\tif (lines.length > 1) {\n\t\t\tfor (let i = 0; i < lines.length - 1; i++) {\n\t\t\t\tthis.generatedCodeLine++;\n\t\t\t\tthis.raw[this.generatedCodeLine] = this.rawSegments = [];\n\t\t\t}\n\t\t\tthis.generatedCodeColumn = 0;\n\t\t}\n\n\t\tthis.generatedCodeColumn += lines[lines.length - 1].length;\n\t}\n}\n","import BitSet from './BitSet.js';\nimport Chunk from './Chunk.js';\nimport SourceMap from './SourceMap.js';\nimport guessIndent from './utils/guessIndent.js';\nimport getRelativePath from './utils/getRelativePath.js';\nimport isObject from './utils/isObject.js';\nimport getLocator from './utils/getLocator.js';\nimport Mappings from './utils/Mappings.js';\nimport Stats from './utils/Stats.js';\n\nconst n = '\\n';\n\nconst warned = {\n\tinsertLeft: false,\n\tinsertRight: false,\n\tstoreName: false,\n};\n\nexport default class MagicString {\n\tconstructor(string, options = {}) {\n\t\tconst chunk = new Chunk(0, string.length, string);\n\n\t\tObject.defineProperties(this, {\n\t\t\toriginal: { writable: true, value: string },\n\t\t\toutro: { writable: true, value: '' },\n\t\t\tintro: { writable: true, value: '' },\n\t\t\tfirstChunk: { writable: true, value: chunk },\n\t\t\tlastChunk: { writable: true, value: chunk },\n\t\t\tlastSearchedChunk: { writable: true, value: chunk },\n\t\t\tbyStart: { writable: true, value: {} },\n\t\t\tbyEnd: { writable: true, value: {} },\n\t\t\tfilename: { writable: true, value: options.filename },\n\t\t\tindentExclusionRanges: { writable: true, value: options.indentExclusionRanges },\n\t\t\tsourcemapLocations: { writable: true, value: new BitSet() },\n\t\t\tstoredNames: { writable: true, value: {} },\n\t\t\tindentStr: { writable: true, value: undefined },\n\t\t\tignoreList: { writable: true, value: options.ignoreList },\n\t\t});\n\n\t\tif (DEBUG) {\n\t\t\tObject.defineProperty(this, 'stats', { value: new Stats() });\n\t\t}\n\n\t\tthis.byStart[0] = chunk;\n\t\tthis.byEnd[string.length] = chunk;\n\t}\n\n\taddSourcemapLocation(char) {\n\t\tthis.sourcemapLocations.add(char);\n\t}\n\n\tappend(content) {\n\t\tif (typeof content !== 'string') throw new TypeError('outro content must be a string');\n\n\t\tthis.outro += content;\n\t\treturn this;\n\t}\n\n\tappendLeft(index, content) {\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tif (DEBUG) this.stats.time('appendLeft');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byEnd[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.appendLeft(content);\n\t\t} else {\n\t\t\tthis.intro += content;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('appendLeft');\n\t\treturn this;\n\t}\n\n\tappendRight(index, content) {\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tif (DEBUG) this.stats.time('appendRight');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byStart[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.appendRight(content);\n\t\t} else {\n\t\t\tthis.outro += content;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('appendRight');\n\t\treturn this;\n\t}\n\n\tclone() {\n\t\tconst cloned = new MagicString(this.original, { filename: this.filename });\n\n\t\tlet originalChunk = this.firstChunk;\n\t\tlet clonedChunk = (cloned.firstChunk = cloned.lastSearchedChunk = originalChunk.clone());\n\n\t\twhile (originalChunk) {\n\t\t\tcloned.byStart[clonedChunk.start] = clonedChunk;\n\t\t\tcloned.byEnd[clonedChunk.end] = clonedChunk;\n\n\t\t\tconst nextOriginalChunk = originalChunk.next;\n\t\t\tconst nextClonedChunk = nextOriginalChunk && nextOriginalChunk.clone();\n\n\t\t\tif (nextClonedChunk) {\n\t\t\t\tclonedChunk.next = nextClonedChunk;\n\t\t\t\tnextClonedChunk.previous = clonedChunk;\n\n\t\t\t\tclonedChunk = nextClonedChunk;\n\t\t\t}\n\n\t\t\toriginalChunk = nextOriginalChunk;\n\t\t}\n\n\t\tcloned.lastChunk = clonedChunk;\n\n\t\tif (this.indentExclusionRanges) {\n\t\t\tcloned.indentExclusionRanges = this.indentExclusionRanges.slice();\n\t\t}\n\n\t\tcloned.sourcemapLocations = new BitSet(this.sourcemapLocations);\n\n\t\tcloned.intro = this.intro;\n\t\tcloned.outro = this.outro;\n\n\t\treturn cloned;\n\t}\n\n\tgenerateDecodedMap(options) {\n\t\toptions = options || {};\n\n\t\tconst sourceIndex = 0;\n\t\tconst names = Object.keys(this.storedNames);\n\t\tconst mappings = new Mappings(options.hires);\n\n\t\tconst locate = getLocator(this.original);\n\n\t\tif (this.intro) {\n\t\t\tmappings.advance(this.intro);\n\t\t}\n\n\t\tthis.firstChunk.eachNext((chunk) => {\n\t\t\tconst loc = locate(chunk.start);\n\n\t\t\tif (chunk.intro.length) mappings.advance(chunk.intro);\n\n\t\t\tif (chunk.edited) {\n\t\t\t\tmappings.addEdit(\n\t\t\t\t\tsourceIndex,\n\t\t\t\t\tchunk.content,\n\t\t\t\t\tloc,\n\t\t\t\t\tchunk.storeName ? names.indexOf(chunk.original) : -1,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tmappings.addUneditedChunk(sourceIndex, chunk, this.original, loc, this.sourcemapLocations);\n\t\t\t}\n\n\t\t\tif (chunk.outro.length) mappings.advance(chunk.outro);\n\t\t});\n\n\t\treturn {\n\t\t\tfile: options.file ? options.file.split(/[/\\\\]/).pop() : undefined,\n\t\t\tsources: [\n\t\t\t\toptions.source ? getRelativePath(options.file || '', options.source) : options.file || '',\n\t\t\t],\n\t\t\tsourcesContent: options.includeContent ? [this.original] : undefined,\n\t\t\tnames,\n\t\t\tmappings: mappings.raw,\n\t\t\tx_google_ignoreList: this.ignoreList ? [sourceIndex] : undefined,\n\t\t};\n\t}\n\n\tgenerateMap(options) {\n\t\treturn new SourceMap(this.generateDecodedMap(options));\n\t}\n\n\t_ensureindentStr() {\n\t\tif (this.indentStr === undefined) {\n\t\t\tthis.indentStr = guessIndent(this.original);\n\t\t}\n\t}\n\n\t_getRawIndentString() {\n\t\tthis._ensureindentStr();\n\t\treturn this.indentStr;\n\t}\n\n\tgetIndentString() {\n\t\tthis._ensureindentStr();\n\t\treturn this.indentStr === null ? '\\t' : this.indentStr;\n\t}\n\n\tindent(indentStr, options) {\n\t\tconst pattern = /^[^\\r\\n]/gm;\n\n\t\tif (isObject(indentStr)) {\n\t\t\toptions = indentStr;\n\t\t\tindentStr = undefined;\n\t\t}\n\n\t\tif (indentStr === undefined) {\n\t\t\tthis._ensureindentStr();\n\t\t\tindentStr = this.indentStr || '\\t';\n\t\t}\n\n\t\tif (indentStr === '') return this; // noop\n\n\t\toptions = options || {};\n\n\t\t// Process exclusion ranges\n\t\tconst isExcluded = {};\n\n\t\tif (options.exclude) {\n\t\t\tconst exclusions =\n\t\t\t\ttypeof options.exclude[0] === 'number' ? [options.exclude] : options.exclude;\n\t\t\texclusions.forEach((exclusion) => {\n\t\t\t\tfor (let i = exclusion[0]; i < exclusion[1]; i += 1) {\n\t\t\t\t\tisExcluded[i] = true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tlet shouldIndentNextCharacter = options.indentStart !== false;\n\t\tconst replacer = (match) => {\n\t\t\tif (shouldIndentNextCharacter) return `${indentStr}${match}`;\n\t\t\tshouldIndentNextCharacter = true;\n\t\t\treturn match;\n\t\t};\n\n\t\tthis.intro = this.intro.replace(pattern, replacer);\n\n\t\tlet charIndex = 0;\n\t\tlet chunk = this.firstChunk;\n\n\t\twhile (chunk) {\n\t\t\tconst end = chunk.end;\n\n\t\t\tif (chunk.edited) {\n\t\t\t\tif (!isExcluded[charIndex]) {\n\t\t\t\t\tchunk.content = chunk.content.replace(pattern, replacer);\n\n\t\t\t\t\tif (chunk.content.length) {\n\t\t\t\t\t\tshouldIndentNextCharacter = chunk.content[chunk.content.length - 1] === '\\n';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcharIndex = chunk.start;\n\n\t\t\t\twhile (charIndex < end) {\n\t\t\t\t\tif (!isExcluded[charIndex]) {\n\t\t\t\t\t\tconst char = this.original[charIndex];\n\n\t\t\t\t\t\tif (char === '\\n') {\n\t\t\t\t\t\t\tshouldIndentNextCharacter = true;\n\t\t\t\t\t\t} else if (char !== '\\r' && shouldIndentNextCharacter) {\n\t\t\t\t\t\t\tshouldIndentNextCharacter = false;\n\n\t\t\t\t\t\t\tif (charIndex === chunk.start) {\n\t\t\t\t\t\t\t\tchunk.prependRight(indentStr);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis._splitChunk(chunk, charIndex);\n\t\t\t\t\t\t\t\tchunk = chunk.next;\n\t\t\t\t\t\t\t\tchunk.prependRight(indentStr);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcharIndex += 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcharIndex = chunk.end;\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\tthis.outro = this.outro.replace(pattern, replacer);\n\n\t\treturn this;\n\t}\n\n\tinsert() {\n\t\tthrow new Error(\n\t\t\t'magicString.insert(...) is deprecated. Use prependRight(...) or appendLeft(...)',\n\t\t);\n\t}\n\n\tinsertLeft(index, content) {\n\t\tif (!warned.insertLeft) {\n\t\t\tconsole.warn(\n\t\t\t\t'magicString.insertLeft(...) is deprecated. Use magicString.appendLeft(...) instead',\n\t\t\t); // eslint-disable-line no-console\n\t\t\twarned.insertLeft = true;\n\t\t}\n\n\t\treturn this.appendLeft(index, content);\n\t}\n\n\tinsertRight(index, content) {\n\t\tif (!warned.insertRight) {\n\t\t\tconsole.warn(\n\t\t\t\t'magicString.insertRight(...) is deprecated. Use magicString.prependRight(...) instead',\n\t\t\t); // eslint-disable-line no-console\n\t\t\twarned.insertRight = true;\n\t\t}\n\n\t\treturn this.prependRight(index, content);\n\t}\n\n\tmove(start, end, index) {\n\t\tif (index >= start && index <= end) throw new Error('Cannot move a selection inside itself');\n\n\t\tif (DEBUG) this.stats.time('move');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\t\tthis._split(index);\n\n\t\tconst first = this.byStart[start];\n\t\tconst last = this.byEnd[end];\n\n\t\tconst oldLeft = first.previous;\n\t\tconst oldRight = last.next;\n\n\t\tconst newRight = this.byStart[index];\n\t\tif (!newRight && last === this.lastChunk) return this;\n\t\tconst newLeft = newRight ? newRight.previous : this.lastChunk;\n\n\t\tif (oldLeft) oldLeft.next = oldRight;\n\t\tif (oldRight) oldRight.previous = oldLeft;\n\n\t\tif (newLeft) newLeft.next = first;\n\t\tif (newRight) newRight.previous = last;\n\n\t\tif (!first.previous) this.firstChunk = last.next;\n\t\tif (!last.next) {\n\t\t\tthis.lastChunk = first.previous;\n\t\t\tthis.lastChunk.next = null;\n\t\t}\n\n\t\tfirst.previous = newLeft;\n\t\tlast.next = newRight || null;\n\n\t\tif (!newLeft) this.firstChunk = first;\n\t\tif (!newRight) this.lastChunk = last;\n\n\t\tif (DEBUG) this.stats.timeEnd('move');\n\t\treturn this;\n\t}\n\n\toverwrite(start, end, content, options) {\n\t\toptions = options || {};\n\t\treturn this.update(start, end, content, { ...options, overwrite: !options.contentOnly });\n\t}\n\n\tupdate(start, end, content, options) {\n\t\tif (typeof content !== 'string') throw new TypeError('replacement content must be a string');\n\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tif (end > this.original.length) throw new Error('end is out of bounds');\n\t\tif (start === end)\n\t\t\tthrow new Error(\n\t\t\t\t'Cannot overwrite a zero-length range – use appendLeft or prependRight instead',\n\t\t\t);\n\n\t\tif (DEBUG) this.stats.time('overwrite');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\n\t\tif (options === true) {\n\t\t\tif (!warned.storeName) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'The final argument to magicString.overwrite(...) should be an options object. See https://github.com/rich-harris/magic-string',\n\t\t\t\t); // eslint-disable-line no-console\n\t\t\t\twarned.storeName = true;\n\t\t\t}\n\n\t\t\toptions = { storeName: true };\n\t\t}\n\t\tconst storeName = options !== undefined ? options.storeName : false;\n\t\tconst overwrite = options !== undefined ? options.overwrite : false;\n\n\t\tif (storeName) {\n\t\t\tconst original = this.original.slice(start, end);\n\t\t\tObject.defineProperty(this.storedNames, original, {\n\t\t\t\twritable: true,\n\t\t\t\tvalue: true,\n\t\t\t\tenumerable: true,\n\t\t\t});\n\t\t}\n\n\t\tconst first = this.byStart[start];\n\t\tconst last = this.byEnd[end];\n\n\t\tif (first) {\n\t\t\tlet chunk = first;\n\t\t\twhile (chunk !== last) {\n\t\t\t\tif (chunk.next !== this.byStart[chunk.end]) {\n\t\t\t\t\tthrow new Error('Cannot overwrite across a split point');\n\t\t\t\t}\n\t\t\t\tchunk = chunk.next;\n\t\t\t\tchunk.edit('', false);\n\t\t\t}\n\n\t\t\tfirst.edit(content, storeName, !overwrite);\n\t\t} else {\n\t\t\t// must be inserting at the end\n\t\t\tconst newChunk = new Chunk(start, end, '').edit(content, storeName);\n\n\t\t\t// TODO last chunk in the array may not be the last chunk, if it's moved...\n\t\t\tlast.next = newChunk;\n\t\t\tnewChunk.previous = last;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('overwrite');\n\t\treturn this;\n\t}\n\n\tprepend(content) {\n\t\tif (typeof content !== 'string') throw new TypeError('outro content must be a string');\n\n\t\tthis.intro = content + this.intro;\n\t\treturn this;\n\t}\n\n\tprependLeft(index, content) {\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tif (DEBUG) this.stats.time('insertRight');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byEnd[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.prependLeft(content);\n\t\t} else {\n\t\t\tthis.intro = content + this.intro;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('insertRight');\n\t\treturn this;\n\t}\n\n\tprependRight(index, content) {\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tif (DEBUG) this.stats.time('insertRight');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byStart[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.prependRight(content);\n\t\t} else {\n\t\t\tthis.outro = content + this.outro;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('insertRight');\n\t\treturn this;\n\t}\n\n\tremove(start, end) {\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tif (start === end) return this;\n\n\t\tif (start < 0 || end > this.original.length) throw new Error('Character is out of bounds');\n\t\tif (start > end) throw new Error('end must be greater than start');\n\n\t\tif (DEBUG) this.stats.time('remove');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\n\t\tlet chunk = this.byStart[start];\n\n\t\twhile (chunk) {\n\t\t\tchunk.intro = '';\n\t\t\tchunk.outro = '';\n\t\t\tchunk.edit('');\n\n\t\t\tchunk = end > chunk.end ? this.byStart[chunk.end] : null;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('remove');\n\t\treturn this;\n\t}\n\n\treset(start, end) {\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tif (start === end) return this;\n\n\t\tif (start < 0 || end > this.original.length) throw new Error('Character is out of bounds');\n\t\tif (start > end) throw new Error('end must be greater than start');\n\n\t\tif (DEBUG) this.stats.time('reset');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\n\t\tlet chunk = this.byStart[start];\n\n\t\twhile (chunk) {\n\t\t\tchunk.reset();\n\n\t\t\tchunk = end > chunk.end ? this.byStart[chunk.end] : null;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('reset');\n\t\treturn this;\n\t}\n\n\tlastChar() {\n\t\tif (this.outro.length) return this.outro[this.outro.length - 1];\n\t\tlet chunk = this.lastChunk;\n\t\tdo {\n\t\t\tif (chunk.outro.length) return chunk.outro[chunk.outro.length - 1];\n\t\t\tif (chunk.content.length) return chunk.content[chunk.content.length - 1];\n\t\t\tif (chunk.intro.length) return chunk.intro[chunk.intro.length - 1];\n\t\t} while ((chunk = chunk.previous));\n\t\tif (this.intro.length) return this.intro[this.intro.length - 1];\n\t\treturn '';\n\t}\n\n\tlastLine() {\n\t\tlet lineIndex = this.outro.lastIndexOf(n);\n\t\tif (lineIndex !== -1) return this.outro.substr(lineIndex + 1);\n\t\tlet lineStr = this.outro;\n\t\tlet chunk = this.lastChunk;\n\t\tdo {\n\t\t\tif (chunk.outro.length > 0) {\n\t\t\t\tlineIndex = chunk.outro.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1) return chunk.outro.substr(lineIndex + 1) + lineStr;\n\t\t\t\tlineStr = chunk.outro + lineStr;\n\t\t\t}\n\n\t\t\tif (chunk.content.length > 0) {\n\t\t\t\tlineIndex = chunk.content.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1) return chunk.content.substr(lineIndex + 1) + lineStr;\n\t\t\t\tlineStr = chunk.content + lineStr;\n\t\t\t}\n\n\t\t\tif (chunk.intro.length > 0) {\n\t\t\t\tlineIndex = chunk.intro.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1) return chunk.intro.substr(lineIndex + 1) + lineStr;\n\t\t\t\tlineStr = chunk.intro + lineStr;\n\t\t\t}\n\t\t} while ((chunk = chunk.previous));\n\t\tlineIndex = this.intro.lastIndexOf(n);\n\t\tif (lineIndex !== -1) return this.intro.substr(lineIndex + 1) + lineStr;\n\t\treturn this.intro + lineStr;\n\t}\n\n\tslice(start = 0, end = this.original.length) {\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tlet result = '';\n\n\t\t// find start chunk\n\t\tlet chunk = this.firstChunk;\n\t\twhile (chunk && (chunk.start > start || chunk.end <= start)) {\n\t\t\t// found end chunk before start\n\t\t\tif (chunk.start < end && chunk.end >= end) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\tif (chunk && chunk.edited && chunk.start !== start)\n\t\t\tthrow new Error(`Cannot use replaced character ${start} as slice start anchor.`);\n\n\t\tconst startChunk = chunk;\n\t\twhile (chunk) {\n\t\t\tif (chunk.intro && (startChunk !== chunk || chunk.start === start)) {\n\t\t\t\tresult += chunk.intro;\n\t\t\t}\n\n\t\t\tconst containsEnd = chunk.start < end && chunk.end >= end;\n\t\t\tif (containsEnd && chunk.edited && chunk.end !== end)\n\t\t\t\tthrow new Error(`Cannot use replaced character ${end} as slice end anchor.`);\n\n\t\t\tconst sliceStart = startChunk === chunk ? start - chunk.start : 0;\n\t\t\tconst sliceEnd = containsEnd ? chunk.content.length + end - chunk.end : chunk.content.length;\n\n\t\t\tresult += chunk.content.slice(sliceStart, sliceEnd);\n\n\t\t\tif (chunk.outro && (!containsEnd || chunk.end === end)) {\n\t\t\t\tresult += chunk.outro;\n\t\t\t}\n\n\t\t\tif (containsEnd) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// TODO deprecate this? not really very useful\n\tsnip(start, end) {\n\t\tconst clone = this.clone();\n\t\tclone.remove(0, start);\n\t\tclone.remove(end, clone.original.length);\n\n\t\treturn clone;\n\t}\n\n\t_split(index) {\n\t\tif (this.byStart[index] || this.byEnd[index]) return;\n\n\t\tif (DEBUG) this.stats.time('_split');\n\n\t\tlet chunk = this.lastSearchedChunk;\n\t\tconst searchForward = index > chunk.end;\n\n\t\twhile (chunk) {\n\t\t\tif (chunk.contains(index)) return this._splitChunk(chunk, index);\n\n\t\t\tchunk = searchForward ? this.byStart[chunk.end] : this.byEnd[chunk.start];\n\t\t}\n\t}\n\n\t_splitChunk(chunk, index) {\n\t\tif (chunk.edited && chunk.content.length) {\n\t\t\t// zero-length edited chunks are a special case (overlapping replacements)\n\t\t\tconst loc = getLocator(this.original)(index);\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot split a chunk that has already been edited (${loc.line}:${loc.column} – \"${chunk.original}\")`,\n\t\t\t);\n\t\t}\n\n\t\tconst newChunk = chunk.split(index);\n\n\t\tthis.byEnd[index] = chunk;\n\t\tthis.byStart[index] = newChunk;\n\t\tthis.byEnd[newChunk.end] = newChunk;\n\n\t\tif (chunk === this.lastChunk) this.lastChunk = newChunk;\n\n\t\tthis.lastSearchedChunk = chunk;\n\t\tif (DEBUG) this.stats.timeEnd('_split');\n\t\treturn true;\n\t}\n\n\ttoString() {\n\t\tlet str = this.intro;\n\n\t\tlet chunk = this.firstChunk;\n\t\twhile (chunk) {\n\t\t\tstr += chunk.toString();\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\treturn str + this.outro;\n\t}\n\n\tisEmpty() {\n\t\tlet chunk = this.firstChunk;\n\t\tdo {\n\t\t\tif (\n\t\t\t\t(chunk.intro.length && chunk.intro.trim()) ||\n\t\t\t\t(chunk.content.length && chunk.content.trim()) ||\n\t\t\t\t(chunk.outro.length && chunk.outro.trim())\n\t\t\t)\n\t\t\t\treturn false;\n\t\t} while ((chunk = chunk.next));\n\t\treturn true;\n\t}\n\n\tlength() {\n\t\tlet chunk = this.firstChunk;\n\t\tlet length = 0;\n\t\tdo {\n\t\t\tlength += chunk.intro.length + chunk.content.length + chunk.outro.length;\n\t\t} while ((chunk = chunk.next));\n\t\treturn length;\n\t}\n\n\ttrimLines() {\n\t\treturn this.trim('[\\\\r\\\\n]');\n\t}\n\n\ttrim(charType) {\n\t\treturn this.trimStart(charType).trimEnd(charType);\n\t}\n\n\ttrimEndAborted(charType) {\n\t\tconst rx = new RegExp((charType || '\\\\s') + '+$');\n\n\t\tthis.outro = this.outro.replace(rx, '');\n\t\tif (this.outro.length) return true;\n\n\t\tlet chunk = this.lastChunk;\n\n\t\tdo {\n\t\t\tconst end = chunk.end;\n\t\t\tconst aborted = chunk.trimEnd(rx);\n\n\t\t\t// if chunk was trimmed, we have a new lastChunk\n\t\t\tif (chunk.end !== end) {\n\t\t\t\tif (this.lastChunk === chunk) {\n\t\t\t\t\tthis.lastChunk = chunk.next;\n\t\t\t\t}\n\n\t\t\t\tthis.byEnd[chunk.end] = chunk;\n\t\t\t\tthis.byStart[chunk.next.start] = chunk.next;\n\t\t\t\tthis.byEnd[chunk.next.end] = chunk.next;\n\t\t\t}\n\n\t\t\tif (aborted) return true;\n\t\t\tchunk = chunk.previous;\n\t\t} while (chunk);\n\n\t\treturn false;\n\t}\n\n\ttrimEnd(charType) {\n\t\tthis.trimEndAborted(charType);\n\t\treturn this;\n\t}\n\ttrimStartAborted(charType) {\n\t\tconst rx = new RegExp('^' + (charType || '\\\\s') + '+');\n\n\t\tthis.intro = this.intro.replace(rx, '');\n\t\tif (this.intro.length) return true;\n\n\t\tlet chunk = this.firstChunk;\n\n\t\tdo {\n\t\t\tconst end = chunk.end;\n\t\t\tconst aborted = chunk.trimStart(rx);\n\n\t\t\tif (chunk.end !== end) {\n\t\t\t\t// special case...\n\t\t\t\tif (chunk === this.lastChunk) this.lastChunk = chunk.next;\n\n\t\t\t\tthis.byEnd[chunk.end] = chunk;\n\t\t\t\tthis.byStart[chunk.next.start] = chunk.next;\n\t\t\t\tthis.byEnd[chunk.next.end] = chunk.next;\n\t\t\t}\n\n\t\t\tif (aborted) return true;\n\t\t\tchunk = chunk.next;\n\t\t} while (chunk);\n\n\t\treturn false;\n\t}\n\n\ttrimStart(charType) {\n\t\tthis.trimStartAborted(charType);\n\t\treturn this;\n\t}\n\n\thasChanged() {\n\t\treturn this.original !== this.toString();\n\t}\n\n\t_replaceRegexp(searchValue, replacement) {\n\t\tfunction getReplacement(match, str) {\n\t\t\tif (typeof replacement === 'string') {\n\t\t\t\treturn replacement.replace(/\\$(\\$|&|\\d+)/g, (_, i) => {\n\t\t\t\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_a_parameter\n\t\t\t\t\tif (i === '$') return '$';\n\t\t\t\t\tif (i === '&') return match[0];\n\t\t\t\t\tconst num = +i;\n\t\t\t\t\tif (num < match.length) return match[+i];\n\t\t\t\t\treturn `$${i}`;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn replacement(...match, match.index, str, match.groups);\n\t\t\t}\n\t\t}\n\t\tfunction matchAll(re, str) {\n\t\t\tlet match;\n\t\t\tconst matches = [];\n\t\t\twhile ((match = re.exec(str))) {\n\t\t\t\tmatches.push(match);\n\t\t\t}\n\t\t\treturn matches;\n\t\t}\n\t\tif (searchValue.global) {\n\t\t\tconst matches = matchAll(searchValue, this.original);\n\t\t\tmatches.forEach((match) => {\n\t\t\t\tif (match.index != null) {\n\t\t\t\t\tconst replacement = getReplacement(match, this.original);\n\t\t\t\t\tif (replacement !== match[0]) {\n\t\t\t\t\t\tthis.overwrite(\n\t\t\t\t\t\t\tmatch.index,\n\t\t\t\t\t\t\tmatch.index + match[0].length,\n\t\t\t\t\t\t\treplacement\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tconst match = this.original.match(searchValue);\n\t\t\tif (match && match.index != null) {\n\t\t\t\tconst replacement = getReplacement(match, this.original);\n\t\t\t\tif (replacement !== match[0]) {\n\t\t\t\t\tthis.overwrite(\n\t\t\t\t\t\tmatch.index,\n\t\t\t\t\t\tmatch.index + match[0].length,\n\t\t\t\t\t\treplacement\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\t_replaceString(string, replacement) {\n\t\tconst { original } = this;\n\t\tconst index = original.indexOf(string);\n\n\t\tif (index !== -1) {\n\t\t\tthis.overwrite(index, index + string.length, replacement);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\treplace(searchValue, replacement) {\n\t\tif (typeof searchValue === 'string') {\n\t\t\treturn this._replaceString(searchValue, replacement);\n\t\t}\n\n\t\treturn this._replaceRegexp(searchValue, replacement);\n\t}\n\n\t_replaceAllString(string, replacement) {\n\t\tconst { original } = this;\n\t\tconst stringLength = string.length;\n\t\tfor (\n\t\t\tlet index = original.indexOf(string);\n\t\t\tindex !== -1;\n\t\t\tindex = original.indexOf(string, index + stringLength)\n\t\t) {\n\t\t\tconst previous = original.slice(index, index + stringLength);\n\t\t\tif (previous !== replacement)\n\t\t\t\tthis.overwrite(index, index + stringLength, replacement);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\treplaceAll(searchValue, replacement) {\n\t\tif (typeof searchValue === 'string') {\n\t\t\treturn this._replaceAllString(searchValue, replacement);\n\t\t}\n\n\t\tif (!searchValue.global) {\n\t\t\tthrow new TypeError(\n\t\t\t\t'MagicString.prototype.replaceAll called with a non-global RegExp argument',\n\t\t\t);\n\t\t}\n\n\t\treturn this._replaceRegexp(searchValue, replacement);\n\t}\n}\n","import MagicString from './MagicString.js';\nimport SourceMap from './SourceMap.js';\nimport getRelativePath from './utils/getRelativePath.js';\nimport isObject from './utils/isObject.js';\nimport getLocator from './utils/getLocator.js';\nimport Mappings from './utils/Mappings.js';\n\nconst hasOwnProp = Object.prototype.hasOwnProperty;\n\nexport default class Bundle {\n\tconstructor(options = {}) {\n\t\tthis.intro = options.intro || '';\n\t\tthis.separator = options.separator !== undefined ? options.separator : '\\n';\n\t\tthis.sources = [];\n\t\tthis.uniqueSources = [];\n\t\tthis.uniqueSourceIndexByFilename = {};\n\t}\n\n\taddSource(source) {\n\t\tif (source instanceof MagicString) {\n\t\t\treturn this.addSource({\n\t\t\t\tcontent: source,\n\t\t\t\tfilename: source.filename,\n\t\t\t\tseparator: this.separator,\n\t\t\t});\n\t\t}\n\n\t\tif (!isObject(source) || !source.content) {\n\t\t\tthrow new Error(\n\t\t\t\t'bundle.addSource() takes an object with a `content` property, which should be an instance of MagicString, and an optional `filename`',\n\t\t\t);\n\t\t}\n\n\t\t['filename', 'ignoreList', 'indentExclusionRanges', 'separator'].forEach((option) => {\n\t\t\tif (!hasOwnProp.call(source, option)) source[option] = source.content[option];\n\t\t});\n\n\t\tif (source.separator === undefined) {\n\t\t\t// TODO there's a bunch of this sort of thing, needs cleaning up\n\t\t\tsource.separator = this.separator;\n\t\t}\n\n\t\tif (source.filename) {\n\t\t\tif (!hasOwnProp.call(this.uniqueSourceIndexByFilename, source.filename)) {\n\t\t\t\tthis.uniqueSourceIndexByFilename[source.filename] = this.uniqueSources.length;\n\t\t\t\tthis.uniqueSources.push({ filename: source.filename, content: source.content.original });\n\t\t\t} else {\n\t\t\t\tconst uniqueSource = this.uniqueSources[this.uniqueSourceIndexByFilename[source.filename]];\n\t\t\t\tif (source.content.original !== uniqueSource.content) {\n\t\t\t\t\tthrow new Error(`Illegal source: same filename (${source.filename}), different contents`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.sources.push(source);\n\t\treturn this;\n\t}\n\n\tappend(str, options) {\n\t\tthis.addSource({\n\t\t\tcontent: new MagicString(str),\n\t\t\tseparator: (options && options.separator) || '',\n\t\t});\n\n\t\treturn this;\n\t}\n\n\tclone() {\n\t\tconst bundle = new Bundle({\n\t\t\tintro: this.intro,\n\t\t\tseparator: this.separator,\n\t\t});\n\n\t\tthis.sources.forEach((source) => {\n\t\t\tbundle.addSource({\n\t\t\t\tfilename: source.filename,\n\t\t\t\tcontent: source.content.clone(),\n\t\t\t\tseparator: source.separator,\n\t\t\t});\n\t\t});\n\n\t\treturn bundle;\n\t}\n\n\tgenerateDecodedMap(options = {}) {\n\t\tconst names = [];\n\t\tlet x_google_ignoreList = undefined;\n\t\tthis.sources.forEach((source) => {\n\t\t\tObject.keys(source.content.storedNames).forEach((name) => {\n\t\t\t\tif (!~names.indexOf(name)) names.push(name);\n\t\t\t});\n\t\t});\n\n\t\tconst mappings = new Mappings(options.hires);\n\n\t\tif (this.intro) {\n\t\t\tmappings.advance(this.intro);\n\t\t}\n\n\t\tthis.sources.forEach((source, i) => {\n\t\t\tif (i > 0) {\n\t\t\t\tmappings.advance(this.separator);\n\t\t\t}\n\n\t\t\tconst sourceIndex = source.filename ? this.uniqueSourceIndexByFilename[source.filename] : -1;\n\t\t\tconst magicString = source.content;\n\t\t\tconst locate = getLocator(magicString.original);\n\n\t\t\tif (magicString.intro) {\n\t\t\t\tmappings.advance(magicString.intro);\n\t\t\t}\n\n\t\t\tmagicString.firstChunk.eachNext((chunk) => {\n\t\t\t\tconst loc = locate(chunk.start);\n\n\t\t\t\tif (chunk.intro.length) mappings.advance(chunk.intro);\n\n\t\t\t\tif (source.filename) {\n\t\t\t\t\tif (chunk.edited) {\n\t\t\t\t\t\tmappings.addEdit(\n\t\t\t\t\t\t\tsourceIndex,\n\t\t\t\t\t\t\tchunk.content,\n\t\t\t\t\t\t\tloc,\n\t\t\t\t\t\t\tchunk.storeName ? names.indexOf(chunk.original) : -1,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmappings.addUneditedChunk(\n\t\t\t\t\t\t\tsourceIndex,\n\t\t\t\t\t\t\tchunk,\n\t\t\t\t\t\t\tmagicString.original,\n\t\t\t\t\t\t\tloc,\n\t\t\t\t\t\t\tmagicString.sourcemapLocations,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tmappings.advance(chunk.content);\n\t\t\t\t}\n\n\t\t\t\tif (chunk.outro.length) mappings.advance(chunk.outro);\n\t\t\t});\n\n\t\t\tif (magicString.outro) {\n\t\t\t\tmappings.advance(magicString.outro);\n\t\t\t}\n\n\t\t\tif (source.ignoreList && sourceIndex !== -1) {\n\t\t\t\tif (x_google_ignoreList === undefined) {\n\t\t\t\t\tx_google_ignoreList = [];\n\t\t\t\t}\n\t\t\t\tx_google_ignoreList.push(sourceIndex);\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tfile: options.file ? options.file.split(/[/\\\\]/).pop() : undefined,\n\t\t\tsources: this.uniqueSources.map((source) => {\n\t\t\t\treturn options.file ? getRelativePath(options.file, source.filename) : source.filename;\n\t\t\t}),\n\t\t\tsourcesContent: this.uniqueSources.map((source) => {\n\t\t\t\treturn options.includeContent ? source.content : null;\n\t\t\t}),\n\t\t\tnames,\n\t\t\tmappings: mappings.raw,\n\t\t\tx_google_ignoreList,\n\t\t};\n\t}\n\n\tgenerateMap(options) {\n\t\treturn new SourceMap(this.generateDecodedMap(options));\n\t}\n\n\tgetIndentString() {\n\t\tconst indentStringCounts = {};\n\n\t\tthis.sources.forEach((source) => {\n\t\t\tconst indentStr = source.content._getRawIndentString();\n\n\t\t\tif (indentStr === null) return;\n\n\t\t\tif (!indentStringCounts[indentStr]) indentStringCounts[indentStr] = 0;\n\t\t\tindentStringCounts[indentStr] += 1;\n\t\t});\n\n\t\treturn (\n\t\t\tObject.keys(indentStringCounts).sort((a, b) => {\n\t\t\t\treturn indentStringCounts[a] - indentStringCounts[b];\n\t\t\t})[0] || '\\t'\n\t\t);\n\t}\n\n\tindent(indentStr) {\n\t\tif (!arguments.length) {\n\t\t\tindentStr = this.getIndentString();\n\t\t}\n\n\t\tif (indentStr === '') return this; // noop\n\n\t\tlet trailingNewline = !this.intro || this.intro.slice(-1) === '\\n';\n\n\t\tthis.sources.forEach((source, i) => {\n\t\t\tconst separator = source.separator !== undefined ? source.separator : this.separator;\n\t\t\tconst indentStart = trailingNewline || (i > 0 && /\\r?\\n$/.test(separator));\n\n\t\t\tsource.content.indent(indentStr, {\n\t\t\t\texclude: source.indentExclusionRanges,\n\t\t\t\tindentStart, //: trailingNewline || /\\r?\\n$/.test( separator ) //true///\\r?\\n/.test( separator )\n\t\t\t});\n\n\t\t\ttrailingNewline = source.content.lastChar() === '\\n';\n\t\t});\n\n\t\tif (this.intro) {\n\t\t\tthis.intro =\n\t\t\t\tindentStr +\n\t\t\t\tthis.intro.replace(/^[^\\n]/gm, (match, index) => {\n\t\t\t\t\treturn index > 0 ? indentStr + match : match;\n\t\t\t\t});\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tprepend(str) {\n\t\tthis.intro = str + this.intro;\n\t\treturn this;\n\t}\n\n\ttoString() {\n\t\tconst body = this.sources\n\t\t\t.map((source, i) => {\n\t\t\t\tconst separator = source.separator !== undefined ? source.separator : this.separator;\n\t\t\t\tconst str = (i > 0 ? separator : '') + source.content.toString();\n\n\t\t\t\treturn str;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn this.intro + body;\n\t}\n\n\tisEmpty() {\n\t\tif (this.intro.length && this.intro.trim()) return false;\n\t\tif (this.sources.some((source) => !source.content.isEmpty())) return false;\n\t\treturn true;\n\t}\n\n\tlength() {\n\t\treturn this.sources.reduce(\n\t\t\t(length, source) => length + source.content.length(),\n\t\t\tthis.intro.length,\n\t\t);\n\t}\n\n\ttrimLines() {\n\t\treturn this.trim('[\\\\r\\\\n]');\n\t}\n\n\ttrim(charType) {\n\t\treturn this.trimStart(charType).trimEnd(charType);\n\t}\n\n\ttrimStart(charType) {\n\t\tconst rx = new RegExp('^' + (charType || '\\\\s') + '+');\n\t\tthis.intro = this.intro.replace(rx, '');\n\n\t\tif (!this.intro) {\n\t\t\tlet source;\n\t\t\tlet i = 0;\n\n\t\t\tdo {\n\t\t\t\tsource = this.sources[i++];\n\t\t\t\tif (!source) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} while (!source.content.trimStartAborted(charType));\n\t\t}\n\n\t\treturn this;\n\t}\n\n\ttrimEnd(charType) {\n\t\tconst rx = new RegExp((charType || '\\\\s') + '+$');\n\n\t\tlet source;\n\t\tlet i = this.sources.length - 1;\n\n\t\tdo {\n\t\t\tsource = this.sources[i--];\n\t\t\tif (!source) {\n\t\t\t\tthis.intro = this.intro.replace(rx, '');\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} while (!source.content.trimEndAborted(charType));\n\n\t\treturn this;\n\t}\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/magic-string/dist/magic-string.umd.js b/node_modules/magic-string/dist/magic-string.umd.js index bb2be85c..39e28c05 100644 --- a/node_modules/magic-string/dist/magic-string.umd.js +++ b/node_modules/magic-string/dist/magic-string.umd.js @@ -129,7 +129,7 @@ // ' test'.trim() // split -> ' ' + 'test' // ✔️ edit -> '' + 'test' - // ✖️ edit -> 'test' + '' + // ✖️ edit -> 'test' + '' // TODO is this block necessary?... newChunk.edit('', false); this.content = ''; @@ -315,9 +315,6 @@ if (typeof properties.x_google_ignoreList !== 'undefined') { this.x_google_ignoreList = properties.x_google_ignoreList; } - if (typeof properties.debugId !== 'undefined') { - this.debugId = properties.debugId; - } } toString() { @@ -462,6 +459,27 @@ let charInHiresBoundary = false; while (originalCharIndex < chunk.end) { + if (this.hires || first || sourcemapLocations.has(originalCharIndex)) { + const segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column]; + + if (this.hires === 'boundary') { + // in hires "boundary", group segments per word boundary than per char + if (wordRegex.test(original[originalCharIndex])) { + // for first char in the boundary found, start the boundary by pushing a segment + if (!charInHiresBoundary) { + this.rawSegments.push(segment); + charInHiresBoundary = true; + } + } else { + // for non-word char, end the boundary by pushing a segment + this.rawSegments.push(segment); + charInHiresBoundary = false; + } + } else { + this.rawSegments.push(segment); + } + } + if (original[originalCharIndex] === '\n') { loc.line += 1; loc.column = 0; @@ -469,29 +487,7 @@ this.raw[this.generatedCodeLine] = this.rawSegments = []; this.generatedCodeColumn = 0; first = true; - charInHiresBoundary = false; } else { - if (this.hires || first || sourcemapLocations.has(originalCharIndex)) { - const segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column]; - - if (this.hires === 'boundary') { - // in hires "boundary", group segments per word boundary than per char - if (wordRegex.test(original[originalCharIndex])) { - // for first char in the boundary found, start the boundary by pushing a segment - if (!charInHiresBoundary) { - this.rawSegments.push(segment); - charInHiresBoundary = true; - } - } else { - // for non-word char, end the boundary by pushing a segment - this.rawSegments.push(segment); - charInHiresBoundary = false; - } - } else { - this.rawSegments.push(segment); - } - } - loc.column += 1; this.generatedCodeColumn += 1; first = false; @@ -547,7 +543,6 @@ storedNames: { writable: true, value: {} }, indentStr: { writable: true, value: undefined }, ignoreList: { writable: true, value: options.ignoreList }, - offset: { writable: true, value: options.offset || 0 }, }); this.byStart[0] = chunk; @@ -566,8 +561,6 @@ } appendLeft(index, content) { - index = index + this.offset; - if (typeof content !== 'string') throw new TypeError('inserted content must be a string'); this._split(index); @@ -583,8 +576,6 @@ } appendRight(index, content) { - index = index + this.offset; - if (typeof content !== 'string') throw new TypeError('inserted content must be a string'); this._split(index); @@ -600,7 +591,7 @@ } clone() { - const cloned = new MagicString(this.original, { filename: this.filename, offset: this.offset }); + const cloned = new MagicString(this.original, { filename: this.filename }); let originalChunk = this.firstChunk; let clonedChunk = (cloned.firstChunk = cloned.lastSearchedChunk = originalChunk.clone()); @@ -798,7 +789,7 @@ if (!warned.insertLeft) { console.warn( 'magicString.insertLeft(...) is deprecated. Use magicString.appendLeft(...) instead', - ); + ); // eslint-disable-line no-console warned.insertLeft = true; } @@ -809,7 +800,7 @@ if (!warned.insertRight) { console.warn( 'magicString.insertRight(...) is deprecated. Use magicString.prependRight(...) instead', - ); + ); // eslint-disable-line no-console warned.insertRight = true; } @@ -817,10 +808,6 @@ } move(start, end, index) { - start = start + this.offset; - end = end + this.offset; - index = index + this.offset; - if (index >= start && index <= end) throw new Error('Cannot move a selection inside itself'); this._split(start); @@ -863,9 +850,6 @@ } update(start, end, content, options) { - start = start + this.offset; - end = end + this.offset; - if (typeof content !== 'string') throw new TypeError('replacement content must be a string'); if (this.original.length !== 0) { @@ -886,7 +870,7 @@ if (!warned.storeName) { console.warn( 'The final argument to magicString.overwrite(...) should be an options object. See https://github.com/rich-harris/magic-string', - ); + ); // eslint-disable-line no-console warned.storeName = true; } @@ -937,8 +921,6 @@ } prependLeft(index, content) { - index = index + this.offset; - if (typeof content !== 'string') throw new TypeError('inserted content must be a string'); this._split(index); @@ -954,8 +936,6 @@ } prependRight(index, content) { - index = index + this.offset; - if (typeof content !== 'string') throw new TypeError('inserted content must be a string'); this._split(index); @@ -971,9 +951,6 @@ } remove(start, end) { - start = start + this.offset; - end = end + this.offset; - if (this.original.length !== 0) { while (start < 0) start += this.original.length; while (end < 0) end += this.original.length; @@ -1000,9 +977,6 @@ } reset(start, end) { - start = start + this.offset; - end = end + this.offset; - if (this.original.length !== 0) { while (start < 0) start += this.original.length; while (end < 0) end += this.original.length; @@ -1067,10 +1041,7 @@ return this.intro + lineStr; } - slice(start = 0, end = this.original.length - this.offset) { - start = start + this.offset; - end = end + this.offset; - + slice(start = 0, end = this.original.length) { if (this.original.length !== 0) { while (start < 0) start += this.original.length; while (end < 0) end += this.original.length; @@ -1306,7 +1277,11 @@ if (match.index != null) { const replacement = getReplacement(match, this.original); if (replacement !== match[0]) { - this.overwrite(match.index, match.index + match[0].length, replacement); + this.overwrite( + match.index, + match.index + match[0].length, + replacement + ); } } }); @@ -1315,7 +1290,11 @@ if (match && match.index != null) { const replacement = getReplacement(match, this.original); if (replacement !== match[0]) { - this.overwrite(match.index, match.index + match[0].length, replacement); + this.overwrite( + match.index, + match.index + match[0].length, + replacement + ); } } } @@ -1350,7 +1329,8 @@ index = original.indexOf(string, index + stringLength) ) { const previous = original.slice(index, index + stringLength); - if (previous !== replacement) this.overwrite(index, index + stringLength, replacement); + if (previous !== replacement) + this.overwrite(index, index + stringLength, replacement); } return this; diff --git a/node_modules/magic-string/dist/magic-string.umd.js.map b/node_modules/magic-string/dist/magic-string.umd.js.map index 5d36fdf5..51721c10 100644 --- a/node_modules/magic-string/dist/magic-string.umd.js.map +++ b/node_modules/magic-string/dist/magic-string.umd.js.map @@ -1 +1 @@ -{"version":3,"file":"magic-string.umd.js","sources":["../src/BitSet.js","../src/Chunk.js","../node_modules/.pnpm/@jridgewell+sourcemap-codec@1.5.0/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs","../src/SourceMap.js","../src/utils/guessIndent.js","../src/utils/getRelativePath.js","../src/utils/isObject.js","../src/utils/getLocator.js","../src/utils/Mappings.js","../src/MagicString.js","../src/Bundle.js","../src/index-legacy.js"],"sourcesContent":["export default class BitSet {\n\tconstructor(arg) {\n\t\tthis.bits = arg instanceof BitSet ? arg.bits.slice() : [];\n\t}\n\n\tadd(n) {\n\t\tthis.bits[n >> 5] |= 1 << (n & 31);\n\t}\n\n\thas(n) {\n\t\treturn !!(this.bits[n >> 5] & (1 << (n & 31)));\n\t}\n}\n","export default class Chunk {\n\tconstructor(start, end, content) {\n\t\tthis.start = start;\n\t\tthis.end = end;\n\t\tthis.original = content;\n\n\t\tthis.intro = '';\n\t\tthis.outro = '';\n\n\t\tthis.content = content;\n\t\tthis.storeName = false;\n\t\tthis.edited = false;\n\n\t\tif (DEBUG) {\n\t\t\t// we make these non-enumerable, for sanity while debugging\n\t\t\tObject.defineProperties(this, {\n\t\t\t\tprevious: { writable: true, value: null },\n\t\t\t\tnext: { writable: true, value: null },\n\t\t\t});\n\t\t} else {\n\t\t\tthis.previous = null;\n\t\t\tthis.next = null;\n\t\t}\n\t}\n\n\tappendLeft(content) {\n\t\tthis.outro += content;\n\t}\n\n\tappendRight(content) {\n\t\tthis.intro = this.intro + content;\n\t}\n\n\tclone() {\n\t\tconst chunk = new Chunk(this.start, this.end, this.original);\n\n\t\tchunk.intro = this.intro;\n\t\tchunk.outro = this.outro;\n\t\tchunk.content = this.content;\n\t\tchunk.storeName = this.storeName;\n\t\tchunk.edited = this.edited;\n\n\t\treturn chunk;\n\t}\n\n\tcontains(index) {\n\t\treturn this.start < index && index < this.end;\n\t}\n\n\teachNext(fn) {\n\t\tlet chunk = this;\n\t\twhile (chunk) {\n\t\t\tfn(chunk);\n\t\t\tchunk = chunk.next;\n\t\t}\n\t}\n\n\teachPrevious(fn) {\n\t\tlet chunk = this;\n\t\twhile (chunk) {\n\t\t\tfn(chunk);\n\t\t\tchunk = chunk.previous;\n\t\t}\n\t}\n\n\tedit(content, storeName, contentOnly) {\n\t\tthis.content = content;\n\t\tif (!contentOnly) {\n\t\t\tthis.intro = '';\n\t\t\tthis.outro = '';\n\t\t}\n\t\tthis.storeName = storeName;\n\n\t\tthis.edited = true;\n\n\t\treturn this;\n\t}\n\n\tprependLeft(content) {\n\t\tthis.outro = content + this.outro;\n\t}\n\n\tprependRight(content) {\n\t\tthis.intro = content + this.intro;\n\t}\n\n\treset() {\n\t\tthis.intro = '';\n\t\tthis.outro = '';\n\t\tif (this.edited) {\n\t\t\tthis.content = this.original;\n\t\t\tthis.storeName = false;\n\t\t\tthis.edited = false;\n\t\t}\n\t}\n\n\tsplit(index) {\n\t\tconst sliceIndex = index - this.start;\n\n\t\tconst originalBefore = this.original.slice(0, sliceIndex);\n\t\tconst originalAfter = this.original.slice(sliceIndex);\n\n\t\tthis.original = originalBefore;\n\n\t\tconst newChunk = new Chunk(index, this.end, originalAfter);\n\t\tnewChunk.outro = this.outro;\n\t\tthis.outro = '';\n\n\t\tthis.end = index;\n\n\t\tif (this.edited) {\n\t\t\t// after split we should save the edit content record into the correct chunk\n\t\t\t// to make sure sourcemap correct\n\t\t\t// For example:\n\t\t\t// ' test'.trim()\n\t\t\t// split -> ' ' + 'test'\n\t\t\t// ✔️ edit -> '' + 'test'\n\t\t\t// ✖️ edit -> 'test' + ''\n\t\t\t// TODO is this block necessary?...\n\t\t\tnewChunk.edit('', false);\n\t\t\tthis.content = '';\n\t\t} else {\n\t\t\tthis.content = originalBefore;\n\t\t}\n\n\t\tnewChunk.next = this.next;\n\t\tif (newChunk.next) newChunk.next.previous = newChunk;\n\t\tnewChunk.previous = this;\n\t\tthis.next = newChunk;\n\n\t\treturn newChunk;\n\t}\n\n\ttoString() {\n\t\treturn this.intro + this.content + this.outro;\n\t}\n\n\ttrimEnd(rx) {\n\t\tthis.outro = this.outro.replace(rx, '');\n\t\tif (this.outro.length) return true;\n\n\t\tconst trimmed = this.content.replace(rx, '');\n\n\t\tif (trimmed.length) {\n\t\t\tif (trimmed !== this.content) {\n\t\t\t\tthis.split(this.start + trimmed.length).edit('', undefined, true);\n\t\t\t\tif (this.edited) {\n\t\t\t\t\t// save the change, if it has been edited\n\t\t\t\t\tthis.edit(trimmed, this.storeName, true);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} else {\n\t\t\tthis.edit('', undefined, true);\n\n\t\t\tthis.intro = this.intro.replace(rx, '');\n\t\t\tif (this.intro.length) return true;\n\t\t}\n\t}\n\n\ttrimStart(rx) {\n\t\tthis.intro = this.intro.replace(rx, '');\n\t\tif (this.intro.length) return true;\n\n\t\tconst trimmed = this.content.replace(rx, '');\n\n\t\tif (trimmed.length) {\n\t\t\tif (trimmed !== this.content) {\n\t\t\t\tconst newChunk = this.split(this.end - trimmed.length);\n\t\t\t\tif (this.edited) {\n\t\t\t\t\t// save the change, if it has been edited\n\t\t\t\t\tnewChunk.edit(trimmed, this.storeName, true);\n\t\t\t\t}\n\t\t\t\tthis.edit('', undefined, true);\n\t\t\t}\n\t\t\treturn true;\n\t\t} else {\n\t\t\tthis.edit('', undefined, true);\n\n\t\t\tthis.outro = this.outro.replace(rx, '');\n\t\t\tif (this.outro.length) return true;\n\t\t}\n\t}\n}\n","const comma = ','.charCodeAt(0);\nconst semicolon = ';'.charCodeAt(0);\nconst chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nconst intToChar = new Uint8Array(64); // 64 possible chars.\nconst charToInt = new Uint8Array(128); // z is 122 in ASCII\nfor (let i = 0; i < chars.length; i++) {\n const c = chars.charCodeAt(i);\n intToChar[i] = c;\n charToInt[c] = i;\n}\nfunction decodeInteger(reader, relative) {\n let value = 0;\n let shift = 0;\n let integer = 0;\n do {\n const c = reader.next();\n integer = charToInt[c];\n value |= (integer & 31) << shift;\n shift += 5;\n } while (integer & 32);\n const shouldNegate = value & 1;\n value >>>= 1;\n if (shouldNegate) {\n value = -0x80000000 | -value;\n }\n return relative + value;\n}\nfunction encodeInteger(builder, num, relative) {\n let delta = num - relative;\n delta = delta < 0 ? (-delta << 1) | 1 : delta << 1;\n do {\n let clamped = delta & 0b011111;\n delta >>>= 5;\n if (delta > 0)\n clamped |= 0b100000;\n builder.write(intToChar[clamped]);\n } while (delta > 0);\n return num;\n}\nfunction hasMoreVlq(reader, max) {\n if (reader.pos >= max)\n return false;\n return reader.peek() !== comma;\n}\n\nconst bufLength = 1024 * 16;\n// Provide a fallback for older environments.\nconst td = typeof TextDecoder !== 'undefined'\n ? /* #__PURE__ */ new TextDecoder()\n : typeof Buffer !== 'undefined'\n ? {\n decode(buf) {\n const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength);\n return out.toString();\n },\n }\n : {\n decode(buf) {\n let out = '';\n for (let i = 0; i < buf.length; i++) {\n out += String.fromCharCode(buf[i]);\n }\n return out;\n },\n };\nclass StringWriter {\n constructor() {\n this.pos = 0;\n this.out = '';\n this.buffer = new Uint8Array(bufLength);\n }\n write(v) {\n const { buffer } = this;\n buffer[this.pos++] = v;\n if (this.pos === bufLength) {\n this.out += td.decode(buffer);\n this.pos = 0;\n }\n }\n flush() {\n const { buffer, out, pos } = this;\n return pos > 0 ? out + td.decode(buffer.subarray(0, pos)) : out;\n }\n}\nclass StringReader {\n constructor(buffer) {\n this.pos = 0;\n this.buffer = buffer;\n }\n next() {\n return this.buffer.charCodeAt(this.pos++);\n }\n peek() {\n return this.buffer.charCodeAt(this.pos);\n }\n indexOf(char) {\n const { buffer, pos } = this;\n const idx = buffer.indexOf(char, pos);\n return idx === -1 ? buffer.length : idx;\n }\n}\n\nconst EMPTY = [];\nfunction decodeOriginalScopes(input) {\n const { length } = input;\n const reader = new StringReader(input);\n const scopes = [];\n const stack = [];\n let line = 0;\n for (; reader.pos < length; reader.pos++) {\n line = decodeInteger(reader, line);\n const column = decodeInteger(reader, 0);\n if (!hasMoreVlq(reader, length)) {\n const last = stack.pop();\n last[2] = line;\n last[3] = column;\n continue;\n }\n const kind = decodeInteger(reader, 0);\n const fields = decodeInteger(reader, 0);\n const hasName = fields & 0b0001;\n const scope = (hasName ? [line, column, 0, 0, kind, decodeInteger(reader, 0)] : [line, column, 0, 0, kind]);\n let vars = EMPTY;\n if (hasMoreVlq(reader, length)) {\n vars = [];\n do {\n const varsIndex = decodeInteger(reader, 0);\n vars.push(varsIndex);\n } while (hasMoreVlq(reader, length));\n }\n scope.vars = vars;\n scopes.push(scope);\n stack.push(scope);\n }\n return scopes;\n}\nfunction encodeOriginalScopes(scopes) {\n const writer = new StringWriter();\n for (let i = 0; i < scopes.length;) {\n i = _encodeOriginalScopes(scopes, i, writer, [0]);\n }\n return writer.flush();\n}\nfunction _encodeOriginalScopes(scopes, index, writer, state) {\n const scope = scopes[index];\n const { 0: startLine, 1: startColumn, 2: endLine, 3: endColumn, 4: kind, vars } = scope;\n if (index > 0)\n writer.write(comma);\n state[0] = encodeInteger(writer, startLine, state[0]);\n encodeInteger(writer, startColumn, 0);\n encodeInteger(writer, kind, 0);\n const fields = scope.length === 6 ? 0b0001 : 0;\n encodeInteger(writer, fields, 0);\n if (scope.length === 6)\n encodeInteger(writer, scope[5], 0);\n for (const v of vars) {\n encodeInteger(writer, v, 0);\n }\n for (index++; index < scopes.length;) {\n const next = scopes[index];\n const { 0: l, 1: c } = next;\n if (l > endLine || (l === endLine && c >= endColumn)) {\n break;\n }\n index = _encodeOriginalScopes(scopes, index, writer, state);\n }\n writer.write(comma);\n state[0] = encodeInteger(writer, endLine, state[0]);\n encodeInteger(writer, endColumn, 0);\n return index;\n}\nfunction decodeGeneratedRanges(input) {\n const { length } = input;\n const reader = new StringReader(input);\n const ranges = [];\n const stack = [];\n let genLine = 0;\n let definitionSourcesIndex = 0;\n let definitionScopeIndex = 0;\n let callsiteSourcesIndex = 0;\n let callsiteLine = 0;\n let callsiteColumn = 0;\n let bindingLine = 0;\n let bindingColumn = 0;\n do {\n const semi = reader.indexOf(';');\n let genColumn = 0;\n for (; reader.pos < semi; reader.pos++) {\n genColumn = decodeInteger(reader, genColumn);\n if (!hasMoreVlq(reader, semi)) {\n const last = stack.pop();\n last[2] = genLine;\n last[3] = genColumn;\n continue;\n }\n const fields = decodeInteger(reader, 0);\n const hasDefinition = fields & 0b0001;\n const hasCallsite = fields & 0b0010;\n const hasScope = fields & 0b0100;\n let callsite = null;\n let bindings = EMPTY;\n let range;\n if (hasDefinition) {\n const defSourcesIndex = decodeInteger(reader, definitionSourcesIndex);\n definitionScopeIndex = decodeInteger(reader, definitionSourcesIndex === defSourcesIndex ? definitionScopeIndex : 0);\n definitionSourcesIndex = defSourcesIndex;\n range = [genLine, genColumn, 0, 0, defSourcesIndex, definitionScopeIndex];\n }\n else {\n range = [genLine, genColumn, 0, 0];\n }\n range.isScope = !!hasScope;\n if (hasCallsite) {\n const prevCsi = callsiteSourcesIndex;\n const prevLine = callsiteLine;\n callsiteSourcesIndex = decodeInteger(reader, callsiteSourcesIndex);\n const sameSource = prevCsi === callsiteSourcesIndex;\n callsiteLine = decodeInteger(reader, sameSource ? callsiteLine : 0);\n callsiteColumn = decodeInteger(reader, sameSource && prevLine === callsiteLine ? callsiteColumn : 0);\n callsite = [callsiteSourcesIndex, callsiteLine, callsiteColumn];\n }\n range.callsite = callsite;\n if (hasMoreVlq(reader, semi)) {\n bindings = [];\n do {\n bindingLine = genLine;\n bindingColumn = genColumn;\n const expressionsCount = decodeInteger(reader, 0);\n let expressionRanges;\n if (expressionsCount < -1) {\n expressionRanges = [[decodeInteger(reader, 0)]];\n for (let i = -1; i > expressionsCount; i--) {\n const prevBl = bindingLine;\n bindingLine = decodeInteger(reader, bindingLine);\n bindingColumn = decodeInteger(reader, bindingLine === prevBl ? bindingColumn : 0);\n const expression = decodeInteger(reader, 0);\n expressionRanges.push([expression, bindingLine, bindingColumn]);\n }\n }\n else {\n expressionRanges = [[expressionsCount]];\n }\n bindings.push(expressionRanges);\n } while (hasMoreVlq(reader, semi));\n }\n range.bindings = bindings;\n ranges.push(range);\n stack.push(range);\n }\n genLine++;\n reader.pos = semi + 1;\n } while (reader.pos < length);\n return ranges;\n}\nfunction encodeGeneratedRanges(ranges) {\n if (ranges.length === 0)\n return '';\n const writer = new StringWriter();\n for (let i = 0; i < ranges.length;) {\n i = _encodeGeneratedRanges(ranges, i, writer, [0, 0, 0, 0, 0, 0, 0]);\n }\n return writer.flush();\n}\nfunction _encodeGeneratedRanges(ranges, index, writer, state) {\n const range = ranges[index];\n const { 0: startLine, 1: startColumn, 2: endLine, 3: endColumn, isScope, callsite, bindings, } = range;\n if (state[0] < startLine) {\n catchupLine(writer, state[0], startLine);\n state[0] = startLine;\n state[1] = 0;\n }\n else if (index > 0) {\n writer.write(comma);\n }\n state[1] = encodeInteger(writer, range[1], state[1]);\n const fields = (range.length === 6 ? 0b0001 : 0) | (callsite ? 0b0010 : 0) | (isScope ? 0b0100 : 0);\n encodeInteger(writer, fields, 0);\n if (range.length === 6) {\n const { 4: sourcesIndex, 5: scopesIndex } = range;\n if (sourcesIndex !== state[2]) {\n state[3] = 0;\n }\n state[2] = encodeInteger(writer, sourcesIndex, state[2]);\n state[3] = encodeInteger(writer, scopesIndex, state[3]);\n }\n if (callsite) {\n const { 0: sourcesIndex, 1: callLine, 2: callColumn } = range.callsite;\n if (sourcesIndex !== state[4]) {\n state[5] = 0;\n state[6] = 0;\n }\n else if (callLine !== state[5]) {\n state[6] = 0;\n }\n state[4] = encodeInteger(writer, sourcesIndex, state[4]);\n state[5] = encodeInteger(writer, callLine, state[5]);\n state[6] = encodeInteger(writer, callColumn, state[6]);\n }\n if (bindings) {\n for (const binding of bindings) {\n if (binding.length > 1)\n encodeInteger(writer, -binding.length, 0);\n const expression = binding[0][0];\n encodeInteger(writer, expression, 0);\n let bindingStartLine = startLine;\n let bindingStartColumn = startColumn;\n for (let i = 1; i < binding.length; i++) {\n const expRange = binding[i];\n bindingStartLine = encodeInteger(writer, expRange[1], bindingStartLine);\n bindingStartColumn = encodeInteger(writer, expRange[2], bindingStartColumn);\n encodeInteger(writer, expRange[0], 0);\n }\n }\n }\n for (index++; index < ranges.length;) {\n const next = ranges[index];\n const { 0: l, 1: c } = next;\n if (l > endLine || (l === endLine && c >= endColumn)) {\n break;\n }\n index = _encodeGeneratedRanges(ranges, index, writer, state);\n }\n if (state[0] < endLine) {\n catchupLine(writer, state[0], endLine);\n state[0] = endLine;\n state[1] = 0;\n }\n else {\n writer.write(comma);\n }\n state[1] = encodeInteger(writer, endColumn, state[1]);\n return index;\n}\nfunction catchupLine(writer, lastLine, line) {\n do {\n writer.write(semicolon);\n } while (++lastLine < line);\n}\n\nfunction decode(mappings) {\n const { length } = mappings;\n const reader = new StringReader(mappings);\n const decoded = [];\n let genColumn = 0;\n let sourcesIndex = 0;\n let sourceLine = 0;\n let sourceColumn = 0;\n let namesIndex = 0;\n do {\n const semi = reader.indexOf(';');\n const line = [];\n let sorted = true;\n let lastCol = 0;\n genColumn = 0;\n while (reader.pos < semi) {\n let seg;\n genColumn = decodeInteger(reader, genColumn);\n if (genColumn < lastCol)\n sorted = false;\n lastCol = genColumn;\n if (hasMoreVlq(reader, semi)) {\n sourcesIndex = decodeInteger(reader, sourcesIndex);\n sourceLine = decodeInteger(reader, sourceLine);\n sourceColumn = decodeInteger(reader, sourceColumn);\n if (hasMoreVlq(reader, semi)) {\n namesIndex = decodeInteger(reader, namesIndex);\n seg = [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex];\n }\n else {\n seg = [genColumn, sourcesIndex, sourceLine, sourceColumn];\n }\n }\n else {\n seg = [genColumn];\n }\n line.push(seg);\n reader.pos++;\n }\n if (!sorted)\n sort(line);\n decoded.push(line);\n reader.pos = semi + 1;\n } while (reader.pos <= length);\n return decoded;\n}\nfunction sort(line) {\n line.sort(sortComparator);\n}\nfunction sortComparator(a, b) {\n return a[0] - b[0];\n}\nfunction encode(decoded) {\n const writer = new StringWriter();\n let sourcesIndex = 0;\n let sourceLine = 0;\n let sourceColumn = 0;\n let namesIndex = 0;\n for (let i = 0; i < decoded.length; i++) {\n const line = decoded[i];\n if (i > 0)\n writer.write(semicolon);\n if (line.length === 0)\n continue;\n let genColumn = 0;\n for (let j = 0; j < line.length; j++) {\n const segment = line[j];\n if (j > 0)\n writer.write(comma);\n genColumn = encodeInteger(writer, segment[0], genColumn);\n if (segment.length === 1)\n continue;\n sourcesIndex = encodeInteger(writer, segment[1], sourcesIndex);\n sourceLine = encodeInteger(writer, segment[2], sourceLine);\n sourceColumn = encodeInteger(writer, segment[3], sourceColumn);\n if (segment.length === 4)\n continue;\n namesIndex = encodeInteger(writer, segment[4], namesIndex);\n }\n }\n return writer.flush();\n}\n\nexport { decode, decodeGeneratedRanges, decodeOriginalScopes, encode, encodeGeneratedRanges, encodeOriginalScopes };\n//# sourceMappingURL=sourcemap-codec.mjs.map\n","import { encode } from '@jridgewell/sourcemap-codec';\n\nfunction getBtoa() {\n\tif (typeof globalThis !== 'undefined' && typeof globalThis.btoa === 'function') {\n\t\treturn (str) => globalThis.btoa(unescape(encodeURIComponent(str)));\n\t} else if (typeof Buffer === 'function') {\n\t\treturn (str) => Buffer.from(str, 'utf-8').toString('base64');\n\t} else {\n\t\treturn () => {\n\t\t\tthrow new Error('Unsupported environment: `window.btoa` or `Buffer` should be supported.');\n\t\t};\n\t}\n}\n\nconst btoa = /*#__PURE__*/ getBtoa();\n\nexport default class SourceMap {\n\tconstructor(properties) {\n\t\tthis.version = 3;\n\t\tthis.file = properties.file;\n\t\tthis.sources = properties.sources;\n\t\tthis.sourcesContent = properties.sourcesContent;\n\t\tthis.names = properties.names;\n\t\tthis.mappings = encode(properties.mappings);\n\t\tif (typeof properties.x_google_ignoreList !== 'undefined') {\n\t\t\tthis.x_google_ignoreList = properties.x_google_ignoreList;\n\t\t}\n\t\tif (typeof properties.debugId !== 'undefined') {\n\t\t\tthis.debugId = properties.debugId;\n\t\t}\n\t}\n\n\ttoString() {\n\t\treturn JSON.stringify(this);\n\t}\n\n\ttoUrl() {\n\t\treturn 'data:application/json;charset=utf-8;base64,' + btoa(this.toString());\n\t}\n}\n","export default function guessIndent(code) {\n\tconst lines = code.split('\\n');\n\n\tconst tabbed = lines.filter((line) => /^\\t+/.test(line));\n\tconst spaced = lines.filter((line) => /^ {2,}/.test(line));\n\n\tif (tabbed.length === 0 && spaced.length === 0) {\n\t\treturn null;\n\t}\n\n\t// More lines tabbed than spaced? Assume tabs, and\n\t// default to tabs in the case of a tie (or nothing\n\t// to go on)\n\tif (tabbed.length >= spaced.length) {\n\t\treturn '\\t';\n\t}\n\n\t// Otherwise, we need to guess the multiple\n\tconst min = spaced.reduce((previous, current) => {\n\t\tconst numSpaces = /^ +/.exec(current)[0].length;\n\t\treturn Math.min(numSpaces, previous);\n\t}, Infinity);\n\n\treturn new Array(min + 1).join(' ');\n}\n","export default function getRelativePath(from, to) {\n\tconst fromParts = from.split(/[/\\\\]/);\n\tconst toParts = to.split(/[/\\\\]/);\n\n\tfromParts.pop(); // get dirname\n\n\twhile (fromParts[0] === toParts[0]) {\n\t\tfromParts.shift();\n\t\ttoParts.shift();\n\t}\n\n\tif (fromParts.length) {\n\t\tlet i = fromParts.length;\n\t\twhile (i--) fromParts[i] = '..';\n\t}\n\n\treturn fromParts.concat(toParts).join('/');\n}\n","const toString = Object.prototype.toString;\n\nexport default function isObject(thing) {\n\treturn toString.call(thing) === '[object Object]';\n}\n","export default function getLocator(source) {\n\tconst originalLines = source.split('\\n');\n\tconst lineOffsets = [];\n\n\tfor (let i = 0, pos = 0; i < originalLines.length; i++) {\n\t\tlineOffsets.push(pos);\n\t\tpos += originalLines[i].length + 1;\n\t}\n\n\treturn function locate(index) {\n\t\tlet i = 0;\n\t\tlet j = lineOffsets.length;\n\t\twhile (i < j) {\n\t\t\tconst m = (i + j) >> 1;\n\t\t\tif (index < lineOffsets[m]) {\n\t\t\t\tj = m;\n\t\t\t} else {\n\t\t\t\ti = m + 1;\n\t\t\t}\n\t\t}\n\t\tconst line = i - 1;\n\t\tconst column = index - lineOffsets[line];\n\t\treturn { line, column };\n\t};\n}\n","const wordRegex = /\\w/;\n\nexport default class Mappings {\n\tconstructor(hires) {\n\t\tthis.hires = hires;\n\t\tthis.generatedCodeLine = 0;\n\t\tthis.generatedCodeColumn = 0;\n\t\tthis.raw = [];\n\t\tthis.rawSegments = this.raw[this.generatedCodeLine] = [];\n\t\tthis.pending = null;\n\t}\n\n\taddEdit(sourceIndex, content, loc, nameIndex) {\n\t\tif (content.length) {\n\t\t\tconst contentLengthMinusOne = content.length - 1;\n\t\t\tlet contentLineEnd = content.indexOf('\\n', 0);\n\t\t\tlet previousContentLineEnd = -1;\n\t\t\t// Loop through each line in the content and add a segment, but stop if the last line is empty,\n\t\t\t// else code afterwards would fill one line too many\n\t\t\twhile (contentLineEnd >= 0 && contentLengthMinusOne > contentLineEnd) {\n\t\t\t\tconst segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];\n\t\t\t\tif (nameIndex >= 0) {\n\t\t\t\t\tsegment.push(nameIndex);\n\t\t\t\t}\n\t\t\t\tthis.rawSegments.push(segment);\n\n\t\t\t\tthis.generatedCodeLine += 1;\n\t\t\t\tthis.raw[this.generatedCodeLine] = this.rawSegments = [];\n\t\t\t\tthis.generatedCodeColumn = 0;\n\n\t\t\t\tpreviousContentLineEnd = contentLineEnd;\n\t\t\t\tcontentLineEnd = content.indexOf('\\n', contentLineEnd + 1);\n\t\t\t}\n\n\t\t\tconst segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];\n\t\t\tif (nameIndex >= 0) {\n\t\t\t\tsegment.push(nameIndex);\n\t\t\t}\n\t\t\tthis.rawSegments.push(segment);\n\n\t\t\tthis.advance(content.slice(previousContentLineEnd + 1));\n\t\t} else if (this.pending) {\n\t\t\tthis.rawSegments.push(this.pending);\n\t\t\tthis.advance(content);\n\t\t}\n\n\t\tthis.pending = null;\n\t}\n\n\taddUneditedChunk(sourceIndex, chunk, original, loc, sourcemapLocations) {\n\t\tlet originalCharIndex = chunk.start;\n\t\tlet first = true;\n\t\t// when iterating each char, check if it's in a word boundary\n\t\tlet charInHiresBoundary = false;\n\n\t\twhile (originalCharIndex < chunk.end) {\n\t\t\tif (original[originalCharIndex] === '\\n') {\n\t\t\t\tloc.line += 1;\n\t\t\t\tloc.column = 0;\n\t\t\t\tthis.generatedCodeLine += 1;\n\t\t\t\tthis.raw[this.generatedCodeLine] = this.rawSegments = [];\n\t\t\t\tthis.generatedCodeColumn = 0;\n\t\t\t\tfirst = true;\n\t\t\t\tcharInHiresBoundary = false;\n\t\t\t} else {\n\t\t\t\tif (this.hires || first || sourcemapLocations.has(originalCharIndex)) {\n\t\t\t\t\tconst segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];\n\n\t\t\t\t\tif (this.hires === 'boundary') {\n\t\t\t\t\t\t// in hires \"boundary\", group segments per word boundary than per char\n\t\t\t\t\t\tif (wordRegex.test(original[originalCharIndex])) {\n\t\t\t\t\t\t\t// for first char in the boundary found, start the boundary by pushing a segment\n\t\t\t\t\t\t\tif (!charInHiresBoundary) {\n\t\t\t\t\t\t\t\tthis.rawSegments.push(segment);\n\t\t\t\t\t\t\t\tcharInHiresBoundary = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// for non-word char, end the boundary by pushing a segment\n\t\t\t\t\t\t\tthis.rawSegments.push(segment);\n\t\t\t\t\t\t\tcharInHiresBoundary = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.rawSegments.push(segment);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tloc.column += 1;\n\t\t\t\tthis.generatedCodeColumn += 1;\n\t\t\t\tfirst = false;\n\t\t\t}\n\n\t\t\toriginalCharIndex += 1;\n\t\t}\n\n\t\tthis.pending = null;\n\t}\n\n\tadvance(str) {\n\t\tif (!str) return;\n\n\t\tconst lines = str.split('\\n');\n\n\t\tif (lines.length > 1) {\n\t\t\tfor (let i = 0; i < lines.length - 1; i++) {\n\t\t\t\tthis.generatedCodeLine++;\n\t\t\t\tthis.raw[this.generatedCodeLine] = this.rawSegments = [];\n\t\t\t}\n\t\t\tthis.generatedCodeColumn = 0;\n\t\t}\n\n\t\tthis.generatedCodeColumn += lines[lines.length - 1].length;\n\t}\n}\n","import BitSet from './BitSet.js';\nimport Chunk from './Chunk.js';\nimport SourceMap from './SourceMap.js';\nimport guessIndent from './utils/guessIndent.js';\nimport getRelativePath from './utils/getRelativePath.js';\nimport isObject from './utils/isObject.js';\nimport getLocator from './utils/getLocator.js';\nimport Mappings from './utils/Mappings.js';\nimport Stats from './utils/Stats.js';\n\nconst n = '\\n';\n\nconst warned = {\n\tinsertLeft: false,\n\tinsertRight: false,\n\tstoreName: false,\n};\n\nexport default class MagicString {\n\tconstructor(string, options = {}) {\n\t\tconst chunk = new Chunk(0, string.length, string);\n\n\t\tObject.defineProperties(this, {\n\t\t\toriginal: { writable: true, value: string },\n\t\t\toutro: { writable: true, value: '' },\n\t\t\tintro: { writable: true, value: '' },\n\t\t\tfirstChunk: { writable: true, value: chunk },\n\t\t\tlastChunk: { writable: true, value: chunk },\n\t\t\tlastSearchedChunk: { writable: true, value: chunk },\n\t\t\tbyStart: { writable: true, value: {} },\n\t\t\tbyEnd: { writable: true, value: {} },\n\t\t\tfilename: { writable: true, value: options.filename },\n\t\t\tindentExclusionRanges: { writable: true, value: options.indentExclusionRanges },\n\t\t\tsourcemapLocations: { writable: true, value: new BitSet() },\n\t\t\tstoredNames: { writable: true, value: {} },\n\t\t\tindentStr: { writable: true, value: undefined },\n\t\t\tignoreList: { writable: true, value: options.ignoreList },\n\t\t\toffset: { writable: true, value: options.offset || 0 },\n\t\t});\n\n\t\tif (DEBUG) {\n\t\t\tObject.defineProperty(this, 'stats', { value: new Stats() });\n\t\t}\n\n\t\tthis.byStart[0] = chunk;\n\t\tthis.byEnd[string.length] = chunk;\n\t}\n\n\taddSourcemapLocation(char) {\n\t\tthis.sourcemapLocations.add(char);\n\t}\n\n\tappend(content) {\n\t\tif (typeof content !== 'string') throw new TypeError('outro content must be a string');\n\n\t\tthis.outro += content;\n\t\treturn this;\n\t}\n\n\tappendLeft(index, content) {\n\t\tindex = index + this.offset;\n\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tif (DEBUG) this.stats.time('appendLeft');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byEnd[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.appendLeft(content);\n\t\t} else {\n\t\t\tthis.intro += content;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('appendLeft');\n\t\treturn this;\n\t}\n\n\tappendRight(index, content) {\n\t\tindex = index + this.offset;\n\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tif (DEBUG) this.stats.time('appendRight');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byStart[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.appendRight(content);\n\t\t} else {\n\t\t\tthis.outro += content;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('appendRight');\n\t\treturn this;\n\t}\n\n\tclone() {\n\t\tconst cloned = new MagicString(this.original, { filename: this.filename, offset: this.offset });\n\n\t\tlet originalChunk = this.firstChunk;\n\t\tlet clonedChunk = (cloned.firstChunk = cloned.lastSearchedChunk = originalChunk.clone());\n\n\t\twhile (originalChunk) {\n\t\t\tcloned.byStart[clonedChunk.start] = clonedChunk;\n\t\t\tcloned.byEnd[clonedChunk.end] = clonedChunk;\n\n\t\t\tconst nextOriginalChunk = originalChunk.next;\n\t\t\tconst nextClonedChunk = nextOriginalChunk && nextOriginalChunk.clone();\n\n\t\t\tif (nextClonedChunk) {\n\t\t\t\tclonedChunk.next = nextClonedChunk;\n\t\t\t\tnextClonedChunk.previous = clonedChunk;\n\n\t\t\t\tclonedChunk = nextClonedChunk;\n\t\t\t}\n\n\t\t\toriginalChunk = nextOriginalChunk;\n\t\t}\n\n\t\tcloned.lastChunk = clonedChunk;\n\n\t\tif (this.indentExclusionRanges) {\n\t\t\tcloned.indentExclusionRanges = this.indentExclusionRanges.slice();\n\t\t}\n\n\t\tcloned.sourcemapLocations = new BitSet(this.sourcemapLocations);\n\n\t\tcloned.intro = this.intro;\n\t\tcloned.outro = this.outro;\n\n\t\treturn cloned;\n\t}\n\n\tgenerateDecodedMap(options) {\n\t\toptions = options || {};\n\n\t\tconst sourceIndex = 0;\n\t\tconst names = Object.keys(this.storedNames);\n\t\tconst mappings = new Mappings(options.hires);\n\n\t\tconst locate = getLocator(this.original);\n\n\t\tif (this.intro) {\n\t\t\tmappings.advance(this.intro);\n\t\t}\n\n\t\tthis.firstChunk.eachNext((chunk) => {\n\t\t\tconst loc = locate(chunk.start);\n\n\t\t\tif (chunk.intro.length) mappings.advance(chunk.intro);\n\n\t\t\tif (chunk.edited) {\n\t\t\t\tmappings.addEdit(\n\t\t\t\t\tsourceIndex,\n\t\t\t\t\tchunk.content,\n\t\t\t\t\tloc,\n\t\t\t\t\tchunk.storeName ? names.indexOf(chunk.original) : -1,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tmappings.addUneditedChunk(sourceIndex, chunk, this.original, loc, this.sourcemapLocations);\n\t\t\t}\n\n\t\t\tif (chunk.outro.length) mappings.advance(chunk.outro);\n\t\t});\n\n\t\treturn {\n\t\t\tfile: options.file ? options.file.split(/[/\\\\]/).pop() : undefined,\n\t\t\tsources: [\n\t\t\t\toptions.source ? getRelativePath(options.file || '', options.source) : options.file || '',\n\t\t\t],\n\t\t\tsourcesContent: options.includeContent ? [this.original] : undefined,\n\t\t\tnames,\n\t\t\tmappings: mappings.raw,\n\t\t\tx_google_ignoreList: this.ignoreList ? [sourceIndex] : undefined,\n\t\t};\n\t}\n\n\tgenerateMap(options) {\n\t\treturn new SourceMap(this.generateDecodedMap(options));\n\t}\n\n\t_ensureindentStr() {\n\t\tif (this.indentStr === undefined) {\n\t\t\tthis.indentStr = guessIndent(this.original);\n\t\t}\n\t}\n\n\t_getRawIndentString() {\n\t\tthis._ensureindentStr();\n\t\treturn this.indentStr;\n\t}\n\n\tgetIndentString() {\n\t\tthis._ensureindentStr();\n\t\treturn this.indentStr === null ? '\\t' : this.indentStr;\n\t}\n\n\tindent(indentStr, options) {\n\t\tconst pattern = /^[^\\r\\n]/gm;\n\n\t\tif (isObject(indentStr)) {\n\t\t\toptions = indentStr;\n\t\t\tindentStr = undefined;\n\t\t}\n\n\t\tif (indentStr === undefined) {\n\t\t\tthis._ensureindentStr();\n\t\t\tindentStr = this.indentStr || '\\t';\n\t\t}\n\n\t\tif (indentStr === '') return this; // noop\n\n\t\toptions = options || {};\n\n\t\t// Process exclusion ranges\n\t\tconst isExcluded = {};\n\n\t\tif (options.exclude) {\n\t\t\tconst exclusions =\n\t\t\t\ttypeof options.exclude[0] === 'number' ? [options.exclude] : options.exclude;\n\t\t\texclusions.forEach((exclusion) => {\n\t\t\t\tfor (let i = exclusion[0]; i < exclusion[1]; i += 1) {\n\t\t\t\t\tisExcluded[i] = true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tlet shouldIndentNextCharacter = options.indentStart !== false;\n\t\tconst replacer = (match) => {\n\t\t\tif (shouldIndentNextCharacter) return `${indentStr}${match}`;\n\t\t\tshouldIndentNextCharacter = true;\n\t\t\treturn match;\n\t\t};\n\n\t\tthis.intro = this.intro.replace(pattern, replacer);\n\n\t\tlet charIndex = 0;\n\t\tlet chunk = this.firstChunk;\n\n\t\twhile (chunk) {\n\t\t\tconst end = chunk.end;\n\n\t\t\tif (chunk.edited) {\n\t\t\t\tif (!isExcluded[charIndex]) {\n\t\t\t\t\tchunk.content = chunk.content.replace(pattern, replacer);\n\n\t\t\t\t\tif (chunk.content.length) {\n\t\t\t\t\t\tshouldIndentNextCharacter = chunk.content[chunk.content.length - 1] === '\\n';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcharIndex = chunk.start;\n\n\t\t\t\twhile (charIndex < end) {\n\t\t\t\t\tif (!isExcluded[charIndex]) {\n\t\t\t\t\t\tconst char = this.original[charIndex];\n\n\t\t\t\t\t\tif (char === '\\n') {\n\t\t\t\t\t\t\tshouldIndentNextCharacter = true;\n\t\t\t\t\t\t} else if (char !== '\\r' && shouldIndentNextCharacter) {\n\t\t\t\t\t\t\tshouldIndentNextCharacter = false;\n\n\t\t\t\t\t\t\tif (charIndex === chunk.start) {\n\t\t\t\t\t\t\t\tchunk.prependRight(indentStr);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis._splitChunk(chunk, charIndex);\n\t\t\t\t\t\t\t\tchunk = chunk.next;\n\t\t\t\t\t\t\t\tchunk.prependRight(indentStr);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcharIndex += 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcharIndex = chunk.end;\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\tthis.outro = this.outro.replace(pattern, replacer);\n\n\t\treturn this;\n\t}\n\n\tinsert() {\n\t\tthrow new Error(\n\t\t\t'magicString.insert(...) is deprecated. Use prependRight(...) or appendLeft(...)',\n\t\t);\n\t}\n\n\tinsertLeft(index, content) {\n\t\tif (!warned.insertLeft) {\n\t\t\tconsole.warn(\n\t\t\t\t'magicString.insertLeft(...) is deprecated. Use magicString.appendLeft(...) instead',\n\t\t\t);\n\t\t\twarned.insertLeft = true;\n\t\t}\n\n\t\treturn this.appendLeft(index, content);\n\t}\n\n\tinsertRight(index, content) {\n\t\tif (!warned.insertRight) {\n\t\t\tconsole.warn(\n\t\t\t\t'magicString.insertRight(...) is deprecated. Use magicString.prependRight(...) instead',\n\t\t\t);\n\t\t\twarned.insertRight = true;\n\t\t}\n\n\t\treturn this.prependRight(index, content);\n\t}\n\n\tmove(start, end, index) {\n\t\tstart = start + this.offset;\n\t\tend = end + this.offset;\n\t\tindex = index + this.offset;\n\n\t\tif (index >= start && index <= end) throw new Error('Cannot move a selection inside itself');\n\n\t\tif (DEBUG) this.stats.time('move');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\t\tthis._split(index);\n\n\t\tconst first = this.byStart[start];\n\t\tconst last = this.byEnd[end];\n\n\t\tconst oldLeft = first.previous;\n\t\tconst oldRight = last.next;\n\n\t\tconst newRight = this.byStart[index];\n\t\tif (!newRight && last === this.lastChunk) return this;\n\t\tconst newLeft = newRight ? newRight.previous : this.lastChunk;\n\n\t\tif (oldLeft) oldLeft.next = oldRight;\n\t\tif (oldRight) oldRight.previous = oldLeft;\n\n\t\tif (newLeft) newLeft.next = first;\n\t\tif (newRight) newRight.previous = last;\n\n\t\tif (!first.previous) this.firstChunk = last.next;\n\t\tif (!last.next) {\n\t\t\tthis.lastChunk = first.previous;\n\t\t\tthis.lastChunk.next = null;\n\t\t}\n\n\t\tfirst.previous = newLeft;\n\t\tlast.next = newRight || null;\n\n\t\tif (!newLeft) this.firstChunk = first;\n\t\tif (!newRight) this.lastChunk = last;\n\n\t\tif (DEBUG) this.stats.timeEnd('move');\n\t\treturn this;\n\t}\n\n\toverwrite(start, end, content, options) {\n\t\toptions = options || {};\n\t\treturn this.update(start, end, content, { ...options, overwrite: !options.contentOnly });\n\t}\n\n\tupdate(start, end, content, options) {\n\t\tstart = start + this.offset;\n\t\tend = end + this.offset;\n\n\t\tif (typeof content !== 'string') throw new TypeError('replacement content must be a string');\n\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tif (end > this.original.length) throw new Error('end is out of bounds');\n\t\tif (start === end)\n\t\t\tthrow new Error(\n\t\t\t\t'Cannot overwrite a zero-length range – use appendLeft or prependRight instead',\n\t\t\t);\n\n\t\tif (DEBUG) this.stats.time('overwrite');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\n\t\tif (options === true) {\n\t\t\tif (!warned.storeName) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'The final argument to magicString.overwrite(...) should be an options object. See https://github.com/rich-harris/magic-string',\n\t\t\t\t);\n\t\t\t\twarned.storeName = true;\n\t\t\t}\n\n\t\t\toptions = { storeName: true };\n\t\t}\n\t\tconst storeName = options !== undefined ? options.storeName : false;\n\t\tconst overwrite = options !== undefined ? options.overwrite : false;\n\n\t\tif (storeName) {\n\t\t\tconst original = this.original.slice(start, end);\n\t\t\tObject.defineProperty(this.storedNames, original, {\n\t\t\t\twritable: true,\n\t\t\t\tvalue: true,\n\t\t\t\tenumerable: true,\n\t\t\t});\n\t\t}\n\n\t\tconst first = this.byStart[start];\n\t\tconst last = this.byEnd[end];\n\n\t\tif (first) {\n\t\t\tlet chunk = first;\n\t\t\twhile (chunk !== last) {\n\t\t\t\tif (chunk.next !== this.byStart[chunk.end]) {\n\t\t\t\t\tthrow new Error('Cannot overwrite across a split point');\n\t\t\t\t}\n\t\t\t\tchunk = chunk.next;\n\t\t\t\tchunk.edit('', false);\n\t\t\t}\n\n\t\t\tfirst.edit(content, storeName, !overwrite);\n\t\t} else {\n\t\t\t// must be inserting at the end\n\t\t\tconst newChunk = new Chunk(start, end, '').edit(content, storeName);\n\n\t\t\t// TODO last chunk in the array may not be the last chunk, if it's moved...\n\t\t\tlast.next = newChunk;\n\t\t\tnewChunk.previous = last;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('overwrite');\n\t\treturn this;\n\t}\n\n\tprepend(content) {\n\t\tif (typeof content !== 'string') throw new TypeError('outro content must be a string');\n\n\t\tthis.intro = content + this.intro;\n\t\treturn this;\n\t}\n\n\tprependLeft(index, content) {\n\t\tindex = index + this.offset;\n\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tif (DEBUG) this.stats.time('insertRight');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byEnd[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.prependLeft(content);\n\t\t} else {\n\t\t\tthis.intro = content + this.intro;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('insertRight');\n\t\treturn this;\n\t}\n\n\tprependRight(index, content) {\n\t\tindex = index + this.offset;\n\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tif (DEBUG) this.stats.time('insertRight');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byStart[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.prependRight(content);\n\t\t} else {\n\t\t\tthis.outro = content + this.outro;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('insertRight');\n\t\treturn this;\n\t}\n\n\tremove(start, end) {\n\t\tstart = start + this.offset;\n\t\tend = end + this.offset;\n\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tif (start === end) return this;\n\n\t\tif (start < 0 || end > this.original.length) throw new Error('Character is out of bounds');\n\t\tif (start > end) throw new Error('end must be greater than start');\n\n\t\tif (DEBUG) this.stats.time('remove');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\n\t\tlet chunk = this.byStart[start];\n\n\t\twhile (chunk) {\n\t\t\tchunk.intro = '';\n\t\t\tchunk.outro = '';\n\t\t\tchunk.edit('');\n\n\t\t\tchunk = end > chunk.end ? this.byStart[chunk.end] : null;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('remove');\n\t\treturn this;\n\t}\n\n\treset(start, end) {\n\t\tstart = start + this.offset;\n\t\tend = end + this.offset;\n\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tif (start === end) return this;\n\n\t\tif (start < 0 || end > this.original.length) throw new Error('Character is out of bounds');\n\t\tif (start > end) throw new Error('end must be greater than start');\n\n\t\tif (DEBUG) this.stats.time('reset');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\n\t\tlet chunk = this.byStart[start];\n\n\t\twhile (chunk) {\n\t\t\tchunk.reset();\n\n\t\t\tchunk = end > chunk.end ? this.byStart[chunk.end] : null;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('reset');\n\t\treturn this;\n\t}\n\n\tlastChar() {\n\t\tif (this.outro.length) return this.outro[this.outro.length - 1];\n\t\tlet chunk = this.lastChunk;\n\t\tdo {\n\t\t\tif (chunk.outro.length) return chunk.outro[chunk.outro.length - 1];\n\t\t\tif (chunk.content.length) return chunk.content[chunk.content.length - 1];\n\t\t\tif (chunk.intro.length) return chunk.intro[chunk.intro.length - 1];\n\t\t} while ((chunk = chunk.previous));\n\t\tif (this.intro.length) return this.intro[this.intro.length - 1];\n\t\treturn '';\n\t}\n\n\tlastLine() {\n\t\tlet lineIndex = this.outro.lastIndexOf(n);\n\t\tif (lineIndex !== -1) return this.outro.substr(lineIndex + 1);\n\t\tlet lineStr = this.outro;\n\t\tlet chunk = this.lastChunk;\n\t\tdo {\n\t\t\tif (chunk.outro.length > 0) {\n\t\t\t\tlineIndex = chunk.outro.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1) return chunk.outro.substr(lineIndex + 1) + lineStr;\n\t\t\t\tlineStr = chunk.outro + lineStr;\n\t\t\t}\n\n\t\t\tif (chunk.content.length > 0) {\n\t\t\t\tlineIndex = chunk.content.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1) return chunk.content.substr(lineIndex + 1) + lineStr;\n\t\t\t\tlineStr = chunk.content + lineStr;\n\t\t\t}\n\n\t\t\tif (chunk.intro.length > 0) {\n\t\t\t\tlineIndex = chunk.intro.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1) return chunk.intro.substr(lineIndex + 1) + lineStr;\n\t\t\t\tlineStr = chunk.intro + lineStr;\n\t\t\t}\n\t\t} while ((chunk = chunk.previous));\n\t\tlineIndex = this.intro.lastIndexOf(n);\n\t\tif (lineIndex !== -1) return this.intro.substr(lineIndex + 1) + lineStr;\n\t\treturn this.intro + lineStr;\n\t}\n\n\tslice(start = 0, end = this.original.length - this.offset) {\n\t\tstart = start + this.offset;\n\t\tend = end + this.offset;\n\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tlet result = '';\n\n\t\t// find start chunk\n\t\tlet chunk = this.firstChunk;\n\t\twhile (chunk && (chunk.start > start || chunk.end <= start)) {\n\t\t\t// found end chunk before start\n\t\t\tif (chunk.start < end && chunk.end >= end) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\tif (chunk && chunk.edited && chunk.start !== start)\n\t\t\tthrow new Error(`Cannot use replaced character ${start} as slice start anchor.`);\n\n\t\tconst startChunk = chunk;\n\t\twhile (chunk) {\n\t\t\tif (chunk.intro && (startChunk !== chunk || chunk.start === start)) {\n\t\t\t\tresult += chunk.intro;\n\t\t\t}\n\n\t\t\tconst containsEnd = chunk.start < end && chunk.end >= end;\n\t\t\tif (containsEnd && chunk.edited && chunk.end !== end)\n\t\t\t\tthrow new Error(`Cannot use replaced character ${end} as slice end anchor.`);\n\n\t\t\tconst sliceStart = startChunk === chunk ? start - chunk.start : 0;\n\t\t\tconst sliceEnd = containsEnd ? chunk.content.length + end - chunk.end : chunk.content.length;\n\n\t\t\tresult += chunk.content.slice(sliceStart, sliceEnd);\n\n\t\t\tif (chunk.outro && (!containsEnd || chunk.end === end)) {\n\t\t\t\tresult += chunk.outro;\n\t\t\t}\n\n\t\t\tif (containsEnd) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// TODO deprecate this? not really very useful\n\tsnip(start, end) {\n\t\tconst clone = this.clone();\n\t\tclone.remove(0, start);\n\t\tclone.remove(end, clone.original.length);\n\n\t\treturn clone;\n\t}\n\n\t_split(index) {\n\t\tif (this.byStart[index] || this.byEnd[index]) return;\n\n\t\tif (DEBUG) this.stats.time('_split');\n\n\t\tlet chunk = this.lastSearchedChunk;\n\t\tconst searchForward = index > chunk.end;\n\n\t\twhile (chunk) {\n\t\t\tif (chunk.contains(index)) return this._splitChunk(chunk, index);\n\n\t\t\tchunk = searchForward ? this.byStart[chunk.end] : this.byEnd[chunk.start];\n\t\t}\n\t}\n\n\t_splitChunk(chunk, index) {\n\t\tif (chunk.edited && chunk.content.length) {\n\t\t\t// zero-length edited chunks are a special case (overlapping replacements)\n\t\t\tconst loc = getLocator(this.original)(index);\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot split a chunk that has already been edited (${loc.line}:${loc.column} – \"${chunk.original}\")`,\n\t\t\t);\n\t\t}\n\n\t\tconst newChunk = chunk.split(index);\n\n\t\tthis.byEnd[index] = chunk;\n\t\tthis.byStart[index] = newChunk;\n\t\tthis.byEnd[newChunk.end] = newChunk;\n\n\t\tif (chunk === this.lastChunk) this.lastChunk = newChunk;\n\n\t\tthis.lastSearchedChunk = chunk;\n\t\tif (DEBUG) this.stats.timeEnd('_split');\n\t\treturn true;\n\t}\n\n\ttoString() {\n\t\tlet str = this.intro;\n\n\t\tlet chunk = this.firstChunk;\n\t\twhile (chunk) {\n\t\t\tstr += chunk.toString();\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\treturn str + this.outro;\n\t}\n\n\tisEmpty() {\n\t\tlet chunk = this.firstChunk;\n\t\tdo {\n\t\t\tif (\n\t\t\t\t(chunk.intro.length && chunk.intro.trim()) ||\n\t\t\t\t(chunk.content.length && chunk.content.trim()) ||\n\t\t\t\t(chunk.outro.length && chunk.outro.trim())\n\t\t\t)\n\t\t\t\treturn false;\n\t\t} while ((chunk = chunk.next));\n\t\treturn true;\n\t}\n\n\tlength() {\n\t\tlet chunk = this.firstChunk;\n\t\tlet length = 0;\n\t\tdo {\n\t\t\tlength += chunk.intro.length + chunk.content.length + chunk.outro.length;\n\t\t} while ((chunk = chunk.next));\n\t\treturn length;\n\t}\n\n\ttrimLines() {\n\t\treturn this.trim('[\\\\r\\\\n]');\n\t}\n\n\ttrim(charType) {\n\t\treturn this.trimStart(charType).trimEnd(charType);\n\t}\n\n\ttrimEndAborted(charType) {\n\t\tconst rx = new RegExp((charType || '\\\\s') + '+$');\n\n\t\tthis.outro = this.outro.replace(rx, '');\n\t\tif (this.outro.length) return true;\n\n\t\tlet chunk = this.lastChunk;\n\n\t\tdo {\n\t\t\tconst end = chunk.end;\n\t\t\tconst aborted = chunk.trimEnd(rx);\n\n\t\t\t// if chunk was trimmed, we have a new lastChunk\n\t\t\tif (chunk.end !== end) {\n\t\t\t\tif (this.lastChunk === chunk) {\n\t\t\t\t\tthis.lastChunk = chunk.next;\n\t\t\t\t}\n\n\t\t\t\tthis.byEnd[chunk.end] = chunk;\n\t\t\t\tthis.byStart[chunk.next.start] = chunk.next;\n\t\t\t\tthis.byEnd[chunk.next.end] = chunk.next;\n\t\t\t}\n\n\t\t\tif (aborted) return true;\n\t\t\tchunk = chunk.previous;\n\t\t} while (chunk);\n\n\t\treturn false;\n\t}\n\n\ttrimEnd(charType) {\n\t\tthis.trimEndAborted(charType);\n\t\treturn this;\n\t}\n\ttrimStartAborted(charType) {\n\t\tconst rx = new RegExp('^' + (charType || '\\\\s') + '+');\n\n\t\tthis.intro = this.intro.replace(rx, '');\n\t\tif (this.intro.length) return true;\n\n\t\tlet chunk = this.firstChunk;\n\n\t\tdo {\n\t\t\tconst end = chunk.end;\n\t\t\tconst aborted = chunk.trimStart(rx);\n\n\t\t\tif (chunk.end !== end) {\n\t\t\t\t// special case...\n\t\t\t\tif (chunk === this.lastChunk) this.lastChunk = chunk.next;\n\n\t\t\t\tthis.byEnd[chunk.end] = chunk;\n\t\t\t\tthis.byStart[chunk.next.start] = chunk.next;\n\t\t\t\tthis.byEnd[chunk.next.end] = chunk.next;\n\t\t\t}\n\n\t\t\tif (aborted) return true;\n\t\t\tchunk = chunk.next;\n\t\t} while (chunk);\n\n\t\treturn false;\n\t}\n\n\ttrimStart(charType) {\n\t\tthis.trimStartAborted(charType);\n\t\treturn this;\n\t}\n\n\thasChanged() {\n\t\treturn this.original !== this.toString();\n\t}\n\n\t_replaceRegexp(searchValue, replacement) {\n\t\tfunction getReplacement(match, str) {\n\t\t\tif (typeof replacement === 'string') {\n\t\t\t\treturn replacement.replace(/\\$(\\$|&|\\d+)/g, (_, i) => {\n\t\t\t\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_a_parameter\n\t\t\t\t\tif (i === '$') return '$';\n\t\t\t\t\tif (i === '&') return match[0];\n\t\t\t\t\tconst num = +i;\n\t\t\t\t\tif (num < match.length) return match[+i];\n\t\t\t\t\treturn `$${i}`;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn replacement(...match, match.index, str, match.groups);\n\t\t\t}\n\t\t}\n\t\tfunction matchAll(re, str) {\n\t\t\tlet match;\n\t\t\tconst matches = [];\n\t\t\twhile ((match = re.exec(str))) {\n\t\t\t\tmatches.push(match);\n\t\t\t}\n\t\t\treturn matches;\n\t\t}\n\t\tif (searchValue.global) {\n\t\t\tconst matches = matchAll(searchValue, this.original);\n\t\t\tmatches.forEach((match) => {\n\t\t\t\tif (match.index != null) {\n\t\t\t\t\tconst replacement = getReplacement(match, this.original);\n\t\t\t\t\tif (replacement !== match[0]) {\n\t\t\t\t\t\tthis.overwrite(match.index, match.index + match[0].length, replacement);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tconst match = this.original.match(searchValue);\n\t\t\tif (match && match.index != null) {\n\t\t\t\tconst replacement = getReplacement(match, this.original);\n\t\t\t\tif (replacement !== match[0]) {\n\t\t\t\t\tthis.overwrite(match.index, match.index + match[0].length, replacement);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\t_replaceString(string, replacement) {\n\t\tconst { original } = this;\n\t\tconst index = original.indexOf(string);\n\n\t\tif (index !== -1) {\n\t\t\tthis.overwrite(index, index + string.length, replacement);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\treplace(searchValue, replacement) {\n\t\tif (typeof searchValue === 'string') {\n\t\t\treturn this._replaceString(searchValue, replacement);\n\t\t}\n\n\t\treturn this._replaceRegexp(searchValue, replacement);\n\t}\n\n\t_replaceAllString(string, replacement) {\n\t\tconst { original } = this;\n\t\tconst stringLength = string.length;\n\t\tfor (\n\t\t\tlet index = original.indexOf(string);\n\t\t\tindex !== -1;\n\t\t\tindex = original.indexOf(string, index + stringLength)\n\t\t) {\n\t\t\tconst previous = original.slice(index, index + stringLength);\n\t\t\tif (previous !== replacement) this.overwrite(index, index + stringLength, replacement);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\treplaceAll(searchValue, replacement) {\n\t\tif (typeof searchValue === 'string') {\n\t\t\treturn this._replaceAllString(searchValue, replacement);\n\t\t}\n\n\t\tif (!searchValue.global) {\n\t\t\tthrow new TypeError(\n\t\t\t\t'MagicString.prototype.replaceAll called with a non-global RegExp argument',\n\t\t\t);\n\t\t}\n\n\t\treturn this._replaceRegexp(searchValue, replacement);\n\t}\n}\n","import MagicString from './MagicString.js';\nimport SourceMap from './SourceMap.js';\nimport getRelativePath from './utils/getRelativePath.js';\nimport isObject from './utils/isObject.js';\nimport getLocator from './utils/getLocator.js';\nimport Mappings from './utils/Mappings.js';\n\nconst hasOwnProp = Object.prototype.hasOwnProperty;\n\nexport default class Bundle {\n\tconstructor(options = {}) {\n\t\tthis.intro = options.intro || '';\n\t\tthis.separator = options.separator !== undefined ? options.separator : '\\n';\n\t\tthis.sources = [];\n\t\tthis.uniqueSources = [];\n\t\tthis.uniqueSourceIndexByFilename = {};\n\t}\n\n\taddSource(source) {\n\t\tif (source instanceof MagicString) {\n\t\t\treturn this.addSource({\n\t\t\t\tcontent: source,\n\t\t\t\tfilename: source.filename,\n\t\t\t\tseparator: this.separator,\n\t\t\t});\n\t\t}\n\n\t\tif (!isObject(source) || !source.content) {\n\t\t\tthrow new Error(\n\t\t\t\t'bundle.addSource() takes an object with a `content` property, which should be an instance of MagicString, and an optional `filename`',\n\t\t\t);\n\t\t}\n\n\t\t['filename', 'ignoreList', 'indentExclusionRanges', 'separator'].forEach((option) => {\n\t\t\tif (!hasOwnProp.call(source, option)) source[option] = source.content[option];\n\t\t});\n\n\t\tif (source.separator === undefined) {\n\t\t\t// TODO there's a bunch of this sort of thing, needs cleaning up\n\t\t\tsource.separator = this.separator;\n\t\t}\n\n\t\tif (source.filename) {\n\t\t\tif (!hasOwnProp.call(this.uniqueSourceIndexByFilename, source.filename)) {\n\t\t\t\tthis.uniqueSourceIndexByFilename[source.filename] = this.uniqueSources.length;\n\t\t\t\tthis.uniqueSources.push({ filename: source.filename, content: source.content.original });\n\t\t\t} else {\n\t\t\t\tconst uniqueSource = this.uniqueSources[this.uniqueSourceIndexByFilename[source.filename]];\n\t\t\t\tif (source.content.original !== uniqueSource.content) {\n\t\t\t\t\tthrow new Error(`Illegal source: same filename (${source.filename}), different contents`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.sources.push(source);\n\t\treturn this;\n\t}\n\n\tappend(str, options) {\n\t\tthis.addSource({\n\t\t\tcontent: new MagicString(str),\n\t\t\tseparator: (options && options.separator) || '',\n\t\t});\n\n\t\treturn this;\n\t}\n\n\tclone() {\n\t\tconst bundle = new Bundle({\n\t\t\tintro: this.intro,\n\t\t\tseparator: this.separator,\n\t\t});\n\n\t\tthis.sources.forEach((source) => {\n\t\t\tbundle.addSource({\n\t\t\t\tfilename: source.filename,\n\t\t\t\tcontent: source.content.clone(),\n\t\t\t\tseparator: source.separator,\n\t\t\t});\n\t\t});\n\n\t\treturn bundle;\n\t}\n\n\tgenerateDecodedMap(options = {}) {\n\t\tconst names = [];\n\t\tlet x_google_ignoreList = undefined;\n\t\tthis.sources.forEach((source) => {\n\t\t\tObject.keys(source.content.storedNames).forEach((name) => {\n\t\t\t\tif (!~names.indexOf(name)) names.push(name);\n\t\t\t});\n\t\t});\n\n\t\tconst mappings = new Mappings(options.hires);\n\n\t\tif (this.intro) {\n\t\t\tmappings.advance(this.intro);\n\t\t}\n\n\t\tthis.sources.forEach((source, i) => {\n\t\t\tif (i > 0) {\n\t\t\t\tmappings.advance(this.separator);\n\t\t\t}\n\n\t\t\tconst sourceIndex = source.filename ? this.uniqueSourceIndexByFilename[source.filename] : -1;\n\t\t\tconst magicString = source.content;\n\t\t\tconst locate = getLocator(magicString.original);\n\n\t\t\tif (magicString.intro) {\n\t\t\t\tmappings.advance(magicString.intro);\n\t\t\t}\n\n\t\t\tmagicString.firstChunk.eachNext((chunk) => {\n\t\t\t\tconst loc = locate(chunk.start);\n\n\t\t\t\tif (chunk.intro.length) mappings.advance(chunk.intro);\n\n\t\t\t\tif (source.filename) {\n\t\t\t\t\tif (chunk.edited) {\n\t\t\t\t\t\tmappings.addEdit(\n\t\t\t\t\t\t\tsourceIndex,\n\t\t\t\t\t\t\tchunk.content,\n\t\t\t\t\t\t\tloc,\n\t\t\t\t\t\t\tchunk.storeName ? names.indexOf(chunk.original) : -1,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmappings.addUneditedChunk(\n\t\t\t\t\t\t\tsourceIndex,\n\t\t\t\t\t\t\tchunk,\n\t\t\t\t\t\t\tmagicString.original,\n\t\t\t\t\t\t\tloc,\n\t\t\t\t\t\t\tmagicString.sourcemapLocations,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tmappings.advance(chunk.content);\n\t\t\t\t}\n\n\t\t\t\tif (chunk.outro.length) mappings.advance(chunk.outro);\n\t\t\t});\n\n\t\t\tif (magicString.outro) {\n\t\t\t\tmappings.advance(magicString.outro);\n\t\t\t}\n\n\t\t\tif (source.ignoreList && sourceIndex !== -1) {\n\t\t\t\tif (x_google_ignoreList === undefined) {\n\t\t\t\t\tx_google_ignoreList = [];\n\t\t\t\t}\n\t\t\t\tx_google_ignoreList.push(sourceIndex);\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tfile: options.file ? options.file.split(/[/\\\\]/).pop() : undefined,\n\t\t\tsources: this.uniqueSources.map((source) => {\n\t\t\t\treturn options.file ? getRelativePath(options.file, source.filename) : source.filename;\n\t\t\t}),\n\t\t\tsourcesContent: this.uniqueSources.map((source) => {\n\t\t\t\treturn options.includeContent ? source.content : null;\n\t\t\t}),\n\t\t\tnames,\n\t\t\tmappings: mappings.raw,\n\t\t\tx_google_ignoreList,\n\t\t};\n\t}\n\n\tgenerateMap(options) {\n\t\treturn new SourceMap(this.generateDecodedMap(options));\n\t}\n\n\tgetIndentString() {\n\t\tconst indentStringCounts = {};\n\n\t\tthis.sources.forEach((source) => {\n\t\t\tconst indentStr = source.content._getRawIndentString();\n\n\t\t\tif (indentStr === null) return;\n\n\t\t\tif (!indentStringCounts[indentStr]) indentStringCounts[indentStr] = 0;\n\t\t\tindentStringCounts[indentStr] += 1;\n\t\t});\n\n\t\treturn (\n\t\t\tObject.keys(indentStringCounts).sort((a, b) => {\n\t\t\t\treturn indentStringCounts[a] - indentStringCounts[b];\n\t\t\t})[0] || '\\t'\n\t\t);\n\t}\n\n\tindent(indentStr) {\n\t\tif (!arguments.length) {\n\t\t\tindentStr = this.getIndentString();\n\t\t}\n\n\t\tif (indentStr === '') return this; // noop\n\n\t\tlet trailingNewline = !this.intro || this.intro.slice(-1) === '\\n';\n\n\t\tthis.sources.forEach((source, i) => {\n\t\t\tconst separator = source.separator !== undefined ? source.separator : this.separator;\n\t\t\tconst indentStart = trailingNewline || (i > 0 && /\\r?\\n$/.test(separator));\n\n\t\t\tsource.content.indent(indentStr, {\n\t\t\t\texclude: source.indentExclusionRanges,\n\t\t\t\tindentStart, //: trailingNewline || /\\r?\\n$/.test( separator ) //true///\\r?\\n/.test( separator )\n\t\t\t});\n\n\t\t\ttrailingNewline = source.content.lastChar() === '\\n';\n\t\t});\n\n\t\tif (this.intro) {\n\t\t\tthis.intro =\n\t\t\t\tindentStr +\n\t\t\t\tthis.intro.replace(/^[^\\n]/gm, (match, index) => {\n\t\t\t\t\treturn index > 0 ? indentStr + match : match;\n\t\t\t\t});\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tprepend(str) {\n\t\tthis.intro = str + this.intro;\n\t\treturn this;\n\t}\n\n\ttoString() {\n\t\tconst body = this.sources\n\t\t\t.map((source, i) => {\n\t\t\t\tconst separator = source.separator !== undefined ? source.separator : this.separator;\n\t\t\t\tconst str = (i > 0 ? separator : '') + source.content.toString();\n\n\t\t\t\treturn str;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn this.intro + body;\n\t}\n\n\tisEmpty() {\n\t\tif (this.intro.length && this.intro.trim()) return false;\n\t\tif (this.sources.some((source) => !source.content.isEmpty())) return false;\n\t\treturn true;\n\t}\n\n\tlength() {\n\t\treturn this.sources.reduce(\n\t\t\t(length, source) => length + source.content.length(),\n\t\t\tthis.intro.length,\n\t\t);\n\t}\n\n\ttrimLines() {\n\t\treturn this.trim('[\\\\r\\\\n]');\n\t}\n\n\ttrim(charType) {\n\t\treturn this.trimStart(charType).trimEnd(charType);\n\t}\n\n\ttrimStart(charType) {\n\t\tconst rx = new RegExp('^' + (charType || '\\\\s') + '+');\n\t\tthis.intro = this.intro.replace(rx, '');\n\n\t\tif (!this.intro) {\n\t\t\tlet source;\n\t\t\tlet i = 0;\n\n\t\t\tdo {\n\t\t\t\tsource = this.sources[i++];\n\t\t\t\tif (!source) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} while (!source.content.trimStartAborted(charType));\n\t\t}\n\n\t\treturn this;\n\t}\n\n\ttrimEnd(charType) {\n\t\tconst rx = new RegExp((charType || '\\\\s') + '+$');\n\n\t\tlet source;\n\t\tlet i = this.sources.length - 1;\n\n\t\tdo {\n\t\t\tsource = this.sources[i--];\n\t\t\tif (!source) {\n\t\t\t\tthis.intro = this.intro.replace(rx, '');\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} while (!source.content.trimEndAborted(charType));\n\n\t\treturn this;\n\t}\n}\n","import MagicString from './MagicString.js';\nimport Bundle from './Bundle.js';\nimport SourceMap from './SourceMap.js';\n\nMagicString.Bundle = Bundle;\nMagicString.SourceMap = SourceMap;\nMagicString.default = MagicString; // work around TypeScript bug https://github.com/Rich-Harris/magic-string/pull/121\n\nexport default MagicString;\n"],"names":[],"mappings":"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","x_google_ignoreList":[2]} \ No newline at end of file +{"version":3,"file":"magic-string.umd.js","sources":["../src/BitSet.js","../src/Chunk.js","../node_modules/.pnpm/@jridgewell+sourcemap-codec@1.5.0/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs","../src/SourceMap.js","../src/utils/guessIndent.js","../src/utils/getRelativePath.js","../src/utils/isObject.js","../src/utils/getLocator.js","../src/utils/Mappings.js","../src/MagicString.js","../src/Bundle.js","../src/index-legacy.js"],"sourcesContent":["export default class BitSet {\n\tconstructor(arg) {\n\t\tthis.bits = arg instanceof BitSet ? arg.bits.slice() : [];\n\t}\n\n\tadd(n) {\n\t\tthis.bits[n >> 5] |= 1 << (n & 31);\n\t}\n\n\thas(n) {\n\t\treturn !!(this.bits[n >> 5] & (1 << (n & 31)));\n\t}\n}\n","export default class Chunk {\n\tconstructor(start, end, content) {\n\t\tthis.start = start;\n\t\tthis.end = end;\n\t\tthis.original = content;\n\n\t\tthis.intro = '';\n\t\tthis.outro = '';\n\n\t\tthis.content = content;\n\t\tthis.storeName = false;\n\t\tthis.edited = false;\n\n\t\tif (DEBUG) {\n\t\t\t// we make these non-enumerable, for sanity while debugging\n\t\t\tObject.defineProperties(this, {\n\t\t\t\tprevious: { writable: true, value: null },\n\t\t\t\tnext: { writable: true, value: null },\n\t\t\t});\n\t\t} else {\n\t\t\tthis.previous = null;\n\t\t\tthis.next = null;\n\t\t}\n\t}\n\n\tappendLeft(content) {\n\t\tthis.outro += content;\n\t}\n\n\tappendRight(content) {\n\t\tthis.intro = this.intro + content;\n\t}\n\n\tclone() {\n\t\tconst chunk = new Chunk(this.start, this.end, this.original);\n\n\t\tchunk.intro = this.intro;\n\t\tchunk.outro = this.outro;\n\t\tchunk.content = this.content;\n\t\tchunk.storeName = this.storeName;\n\t\tchunk.edited = this.edited;\n\n\t\treturn chunk;\n\t}\n\n\tcontains(index) {\n\t\treturn this.start < index && index < this.end;\n\t}\n\n\teachNext(fn) {\n\t\tlet chunk = this;\n\t\twhile (chunk) {\n\t\t\tfn(chunk);\n\t\t\tchunk = chunk.next;\n\t\t}\n\t}\n\n\teachPrevious(fn) {\n\t\tlet chunk = this;\n\t\twhile (chunk) {\n\t\t\tfn(chunk);\n\t\t\tchunk = chunk.previous;\n\t\t}\n\t}\n\n\tedit(content, storeName, contentOnly) {\n\t\tthis.content = content;\n\t\tif (!contentOnly) {\n\t\t\tthis.intro = '';\n\t\t\tthis.outro = '';\n\t\t}\n\t\tthis.storeName = storeName;\n\n\t\tthis.edited = true;\n\n\t\treturn this;\n\t}\n\n\tprependLeft(content) {\n\t\tthis.outro = content + this.outro;\n\t}\n\n\tprependRight(content) {\n\t\tthis.intro = content + this.intro;\n\t}\n\n\treset() {\n\t\tthis.intro = '';\n\t\tthis.outro = '';\n\t\tif (this.edited) {\n\t\t\tthis.content = this.original;\n\t\t\tthis.storeName = false;\n\t\t\tthis.edited = false;\n\t\t}\n\t}\n\n\tsplit(index) {\n\t\tconst sliceIndex = index - this.start;\n\n\t\tconst originalBefore = this.original.slice(0, sliceIndex);\n\t\tconst originalAfter = this.original.slice(sliceIndex);\n\n\t\tthis.original = originalBefore;\n\n\t\tconst newChunk = new Chunk(index, this.end, originalAfter);\n\t\tnewChunk.outro = this.outro;\n\t\tthis.outro = '';\n\n\t\tthis.end = index;\n\n\t\tif (this.edited) {\n\t\t\t// after split we should save the edit content record into the correct chunk\n\t\t\t// to make sure sourcemap correct\n\t\t\t// For example:\n\t\t\t// ' test'.trim()\n\t\t\t// split -> ' ' + 'test'\n\t\t\t// ✔️ edit -> '' + 'test'\n\t\t\t// ✖️ edit -> 'test' + '' \n\t\t\t// TODO is this block necessary?...\n\t\t\tnewChunk.edit('', false);\n\t\t\tthis.content = '';\n\t\t} else {\n\t\t\tthis.content = originalBefore;\n\t\t}\n\n\t\tnewChunk.next = this.next;\n\t\tif (newChunk.next) newChunk.next.previous = newChunk;\n\t\tnewChunk.previous = this;\n\t\tthis.next = newChunk;\n\n\t\treturn newChunk;\n\t}\n\n\ttoString() {\n\t\treturn this.intro + this.content + this.outro;\n\t}\n\n\ttrimEnd(rx) {\n\t\tthis.outro = this.outro.replace(rx, '');\n\t\tif (this.outro.length) return true;\n\n\t\tconst trimmed = this.content.replace(rx, '');\n\n\t\tif (trimmed.length) {\n\t\t\tif (trimmed !== this.content) {\n\t\t\t\tthis.split(this.start + trimmed.length).edit('', undefined, true);\n\t\t\t\tif (this.edited) {\n\t\t\t\t\t// save the change, if it has been edited\n\t\t\t\t\tthis.edit(trimmed, this.storeName, true);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} else {\n\t\t\tthis.edit('', undefined, true);\n\n\t\t\tthis.intro = this.intro.replace(rx, '');\n\t\t\tif (this.intro.length) return true;\n\t\t}\n\t}\n\n\ttrimStart(rx) {\n\t\tthis.intro = this.intro.replace(rx, '');\n\t\tif (this.intro.length) return true;\n\n\t\tconst trimmed = this.content.replace(rx, '');\n\n\t\tif (trimmed.length) {\n\t\t\tif (trimmed !== this.content) {\n\t\t\t\tconst newChunk = this.split(this.end - trimmed.length);\n\t\t\t\tif (this.edited) {\n\t\t\t\t\t// save the change, if it has been edited\n\t\t\t\t\tnewChunk.edit(trimmed, this.storeName, true);\n\t\t\t\t}\n\t\t\t\tthis.edit('', undefined, true);\n\t\t\t}\n\t\t\treturn true;\n\t\t} else {\n\t\t\tthis.edit('', undefined, true);\n\n\t\t\tthis.outro = this.outro.replace(rx, '');\n\t\t\tif (this.outro.length) return true;\n\t\t}\n\t}\n}\n","const comma = ','.charCodeAt(0);\nconst semicolon = ';'.charCodeAt(0);\nconst chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nconst intToChar = new Uint8Array(64); // 64 possible chars.\nconst charToInt = new Uint8Array(128); // z is 122 in ASCII\nfor (let i = 0; i < chars.length; i++) {\n const c = chars.charCodeAt(i);\n intToChar[i] = c;\n charToInt[c] = i;\n}\nfunction decodeInteger(reader, relative) {\n let value = 0;\n let shift = 0;\n let integer = 0;\n do {\n const c = reader.next();\n integer = charToInt[c];\n value |= (integer & 31) << shift;\n shift += 5;\n } while (integer & 32);\n const shouldNegate = value & 1;\n value >>>= 1;\n if (shouldNegate) {\n value = -0x80000000 | -value;\n }\n return relative + value;\n}\nfunction encodeInteger(builder, num, relative) {\n let delta = num - relative;\n delta = delta < 0 ? (-delta << 1) | 1 : delta << 1;\n do {\n let clamped = delta & 0b011111;\n delta >>>= 5;\n if (delta > 0)\n clamped |= 0b100000;\n builder.write(intToChar[clamped]);\n } while (delta > 0);\n return num;\n}\nfunction hasMoreVlq(reader, max) {\n if (reader.pos >= max)\n return false;\n return reader.peek() !== comma;\n}\n\nconst bufLength = 1024 * 16;\n// Provide a fallback for older environments.\nconst td = typeof TextDecoder !== 'undefined'\n ? /* #__PURE__ */ new TextDecoder()\n : typeof Buffer !== 'undefined'\n ? {\n decode(buf) {\n const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength);\n return out.toString();\n },\n }\n : {\n decode(buf) {\n let out = '';\n for (let i = 0; i < buf.length; i++) {\n out += String.fromCharCode(buf[i]);\n }\n return out;\n },\n };\nclass StringWriter {\n constructor() {\n this.pos = 0;\n this.out = '';\n this.buffer = new Uint8Array(bufLength);\n }\n write(v) {\n const { buffer } = this;\n buffer[this.pos++] = v;\n if (this.pos === bufLength) {\n this.out += td.decode(buffer);\n this.pos = 0;\n }\n }\n flush() {\n const { buffer, out, pos } = this;\n return pos > 0 ? out + td.decode(buffer.subarray(0, pos)) : out;\n }\n}\nclass StringReader {\n constructor(buffer) {\n this.pos = 0;\n this.buffer = buffer;\n }\n next() {\n return this.buffer.charCodeAt(this.pos++);\n }\n peek() {\n return this.buffer.charCodeAt(this.pos);\n }\n indexOf(char) {\n const { buffer, pos } = this;\n const idx = buffer.indexOf(char, pos);\n return idx === -1 ? buffer.length : idx;\n }\n}\n\nconst EMPTY = [];\nfunction decodeOriginalScopes(input) {\n const { length } = input;\n const reader = new StringReader(input);\n const scopes = [];\n const stack = [];\n let line = 0;\n for (; reader.pos < length; reader.pos++) {\n line = decodeInteger(reader, line);\n const column = decodeInteger(reader, 0);\n if (!hasMoreVlq(reader, length)) {\n const last = stack.pop();\n last[2] = line;\n last[3] = column;\n continue;\n }\n const kind = decodeInteger(reader, 0);\n const fields = decodeInteger(reader, 0);\n const hasName = fields & 0b0001;\n const scope = (hasName ? [line, column, 0, 0, kind, decodeInteger(reader, 0)] : [line, column, 0, 0, kind]);\n let vars = EMPTY;\n if (hasMoreVlq(reader, length)) {\n vars = [];\n do {\n const varsIndex = decodeInteger(reader, 0);\n vars.push(varsIndex);\n } while (hasMoreVlq(reader, length));\n }\n scope.vars = vars;\n scopes.push(scope);\n stack.push(scope);\n }\n return scopes;\n}\nfunction encodeOriginalScopes(scopes) {\n const writer = new StringWriter();\n for (let i = 0; i < scopes.length;) {\n i = _encodeOriginalScopes(scopes, i, writer, [0]);\n }\n return writer.flush();\n}\nfunction _encodeOriginalScopes(scopes, index, writer, state) {\n const scope = scopes[index];\n const { 0: startLine, 1: startColumn, 2: endLine, 3: endColumn, 4: kind, vars } = scope;\n if (index > 0)\n writer.write(comma);\n state[0] = encodeInteger(writer, startLine, state[0]);\n encodeInteger(writer, startColumn, 0);\n encodeInteger(writer, kind, 0);\n const fields = scope.length === 6 ? 0b0001 : 0;\n encodeInteger(writer, fields, 0);\n if (scope.length === 6)\n encodeInteger(writer, scope[5], 0);\n for (const v of vars) {\n encodeInteger(writer, v, 0);\n }\n for (index++; index < scopes.length;) {\n const next = scopes[index];\n const { 0: l, 1: c } = next;\n if (l > endLine || (l === endLine && c >= endColumn)) {\n break;\n }\n index = _encodeOriginalScopes(scopes, index, writer, state);\n }\n writer.write(comma);\n state[0] = encodeInteger(writer, endLine, state[0]);\n encodeInteger(writer, endColumn, 0);\n return index;\n}\nfunction decodeGeneratedRanges(input) {\n const { length } = input;\n const reader = new StringReader(input);\n const ranges = [];\n const stack = [];\n let genLine = 0;\n let definitionSourcesIndex = 0;\n let definitionScopeIndex = 0;\n let callsiteSourcesIndex = 0;\n let callsiteLine = 0;\n let callsiteColumn = 0;\n let bindingLine = 0;\n let bindingColumn = 0;\n do {\n const semi = reader.indexOf(';');\n let genColumn = 0;\n for (; reader.pos < semi; reader.pos++) {\n genColumn = decodeInteger(reader, genColumn);\n if (!hasMoreVlq(reader, semi)) {\n const last = stack.pop();\n last[2] = genLine;\n last[3] = genColumn;\n continue;\n }\n const fields = decodeInteger(reader, 0);\n const hasDefinition = fields & 0b0001;\n const hasCallsite = fields & 0b0010;\n const hasScope = fields & 0b0100;\n let callsite = null;\n let bindings = EMPTY;\n let range;\n if (hasDefinition) {\n const defSourcesIndex = decodeInteger(reader, definitionSourcesIndex);\n definitionScopeIndex = decodeInteger(reader, definitionSourcesIndex === defSourcesIndex ? definitionScopeIndex : 0);\n definitionSourcesIndex = defSourcesIndex;\n range = [genLine, genColumn, 0, 0, defSourcesIndex, definitionScopeIndex];\n }\n else {\n range = [genLine, genColumn, 0, 0];\n }\n range.isScope = !!hasScope;\n if (hasCallsite) {\n const prevCsi = callsiteSourcesIndex;\n const prevLine = callsiteLine;\n callsiteSourcesIndex = decodeInteger(reader, callsiteSourcesIndex);\n const sameSource = prevCsi === callsiteSourcesIndex;\n callsiteLine = decodeInteger(reader, sameSource ? callsiteLine : 0);\n callsiteColumn = decodeInteger(reader, sameSource && prevLine === callsiteLine ? callsiteColumn : 0);\n callsite = [callsiteSourcesIndex, callsiteLine, callsiteColumn];\n }\n range.callsite = callsite;\n if (hasMoreVlq(reader, semi)) {\n bindings = [];\n do {\n bindingLine = genLine;\n bindingColumn = genColumn;\n const expressionsCount = decodeInteger(reader, 0);\n let expressionRanges;\n if (expressionsCount < -1) {\n expressionRanges = [[decodeInteger(reader, 0)]];\n for (let i = -1; i > expressionsCount; i--) {\n const prevBl = bindingLine;\n bindingLine = decodeInteger(reader, bindingLine);\n bindingColumn = decodeInteger(reader, bindingLine === prevBl ? bindingColumn : 0);\n const expression = decodeInteger(reader, 0);\n expressionRanges.push([expression, bindingLine, bindingColumn]);\n }\n }\n else {\n expressionRanges = [[expressionsCount]];\n }\n bindings.push(expressionRanges);\n } while (hasMoreVlq(reader, semi));\n }\n range.bindings = bindings;\n ranges.push(range);\n stack.push(range);\n }\n genLine++;\n reader.pos = semi + 1;\n } while (reader.pos < length);\n return ranges;\n}\nfunction encodeGeneratedRanges(ranges) {\n if (ranges.length === 0)\n return '';\n const writer = new StringWriter();\n for (let i = 0; i < ranges.length;) {\n i = _encodeGeneratedRanges(ranges, i, writer, [0, 0, 0, 0, 0, 0, 0]);\n }\n return writer.flush();\n}\nfunction _encodeGeneratedRanges(ranges, index, writer, state) {\n const range = ranges[index];\n const { 0: startLine, 1: startColumn, 2: endLine, 3: endColumn, isScope, callsite, bindings, } = range;\n if (state[0] < startLine) {\n catchupLine(writer, state[0], startLine);\n state[0] = startLine;\n state[1] = 0;\n }\n else if (index > 0) {\n writer.write(comma);\n }\n state[1] = encodeInteger(writer, range[1], state[1]);\n const fields = (range.length === 6 ? 0b0001 : 0) | (callsite ? 0b0010 : 0) | (isScope ? 0b0100 : 0);\n encodeInteger(writer, fields, 0);\n if (range.length === 6) {\n const { 4: sourcesIndex, 5: scopesIndex } = range;\n if (sourcesIndex !== state[2]) {\n state[3] = 0;\n }\n state[2] = encodeInteger(writer, sourcesIndex, state[2]);\n state[3] = encodeInteger(writer, scopesIndex, state[3]);\n }\n if (callsite) {\n const { 0: sourcesIndex, 1: callLine, 2: callColumn } = range.callsite;\n if (sourcesIndex !== state[4]) {\n state[5] = 0;\n state[6] = 0;\n }\n else if (callLine !== state[5]) {\n state[6] = 0;\n }\n state[4] = encodeInteger(writer, sourcesIndex, state[4]);\n state[5] = encodeInteger(writer, callLine, state[5]);\n state[6] = encodeInteger(writer, callColumn, state[6]);\n }\n if (bindings) {\n for (const binding of bindings) {\n if (binding.length > 1)\n encodeInteger(writer, -binding.length, 0);\n const expression = binding[0][0];\n encodeInteger(writer, expression, 0);\n let bindingStartLine = startLine;\n let bindingStartColumn = startColumn;\n for (let i = 1; i < binding.length; i++) {\n const expRange = binding[i];\n bindingStartLine = encodeInteger(writer, expRange[1], bindingStartLine);\n bindingStartColumn = encodeInteger(writer, expRange[2], bindingStartColumn);\n encodeInteger(writer, expRange[0], 0);\n }\n }\n }\n for (index++; index < ranges.length;) {\n const next = ranges[index];\n const { 0: l, 1: c } = next;\n if (l > endLine || (l === endLine && c >= endColumn)) {\n break;\n }\n index = _encodeGeneratedRanges(ranges, index, writer, state);\n }\n if (state[0] < endLine) {\n catchupLine(writer, state[0], endLine);\n state[0] = endLine;\n state[1] = 0;\n }\n else {\n writer.write(comma);\n }\n state[1] = encodeInteger(writer, endColumn, state[1]);\n return index;\n}\nfunction catchupLine(writer, lastLine, line) {\n do {\n writer.write(semicolon);\n } while (++lastLine < line);\n}\n\nfunction decode(mappings) {\n const { length } = mappings;\n const reader = new StringReader(mappings);\n const decoded = [];\n let genColumn = 0;\n let sourcesIndex = 0;\n let sourceLine = 0;\n let sourceColumn = 0;\n let namesIndex = 0;\n do {\n const semi = reader.indexOf(';');\n const line = [];\n let sorted = true;\n let lastCol = 0;\n genColumn = 0;\n while (reader.pos < semi) {\n let seg;\n genColumn = decodeInteger(reader, genColumn);\n if (genColumn < lastCol)\n sorted = false;\n lastCol = genColumn;\n if (hasMoreVlq(reader, semi)) {\n sourcesIndex = decodeInteger(reader, sourcesIndex);\n sourceLine = decodeInteger(reader, sourceLine);\n sourceColumn = decodeInteger(reader, sourceColumn);\n if (hasMoreVlq(reader, semi)) {\n namesIndex = decodeInteger(reader, namesIndex);\n seg = [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex];\n }\n else {\n seg = [genColumn, sourcesIndex, sourceLine, sourceColumn];\n }\n }\n else {\n seg = [genColumn];\n }\n line.push(seg);\n reader.pos++;\n }\n if (!sorted)\n sort(line);\n decoded.push(line);\n reader.pos = semi + 1;\n } while (reader.pos <= length);\n return decoded;\n}\nfunction sort(line) {\n line.sort(sortComparator);\n}\nfunction sortComparator(a, b) {\n return a[0] - b[0];\n}\nfunction encode(decoded) {\n const writer = new StringWriter();\n let sourcesIndex = 0;\n let sourceLine = 0;\n let sourceColumn = 0;\n let namesIndex = 0;\n for (let i = 0; i < decoded.length; i++) {\n const line = decoded[i];\n if (i > 0)\n writer.write(semicolon);\n if (line.length === 0)\n continue;\n let genColumn = 0;\n for (let j = 0; j < line.length; j++) {\n const segment = line[j];\n if (j > 0)\n writer.write(comma);\n genColumn = encodeInteger(writer, segment[0], genColumn);\n if (segment.length === 1)\n continue;\n sourcesIndex = encodeInteger(writer, segment[1], sourcesIndex);\n sourceLine = encodeInteger(writer, segment[2], sourceLine);\n sourceColumn = encodeInteger(writer, segment[3], sourceColumn);\n if (segment.length === 4)\n continue;\n namesIndex = encodeInteger(writer, segment[4], namesIndex);\n }\n }\n return writer.flush();\n}\n\nexport { decode, decodeGeneratedRanges, decodeOriginalScopes, encode, encodeGeneratedRanges, encodeOriginalScopes };\n//# sourceMappingURL=sourcemap-codec.mjs.map\n","import { encode } from '@jridgewell/sourcemap-codec';\n\nfunction getBtoa() {\n\tif (typeof globalThis !== 'undefined' && typeof globalThis.btoa === 'function') {\n\t\treturn (str) => globalThis.btoa(unescape(encodeURIComponent(str)));\n\t} else if (typeof Buffer === 'function') {\n\t\treturn (str) => Buffer.from(str, 'utf-8').toString('base64');\n\t} else {\n\t\treturn () => {\n\t\t\tthrow new Error('Unsupported environment: `window.btoa` or `Buffer` should be supported.');\n\t\t};\n\t}\n}\n\nconst btoa = /*#__PURE__*/ getBtoa();\n\nexport default class SourceMap {\n\tconstructor(properties) {\n\t\tthis.version = 3;\n\t\tthis.file = properties.file;\n\t\tthis.sources = properties.sources;\n\t\tthis.sourcesContent = properties.sourcesContent;\n\t\tthis.names = properties.names;\n\t\tthis.mappings = encode(properties.mappings);\n\t\tif (typeof properties.x_google_ignoreList !== 'undefined') {\n\t\t\tthis.x_google_ignoreList = properties.x_google_ignoreList;\n\t\t}\n\t}\n\n\ttoString() {\n\t\treturn JSON.stringify(this);\n\t}\n\n\ttoUrl() {\n\t\treturn 'data:application/json;charset=utf-8;base64,' + btoa(this.toString());\n\t}\n}\n","export default function guessIndent(code) {\n\tconst lines = code.split('\\n');\n\n\tconst tabbed = lines.filter((line) => /^\\t+/.test(line));\n\tconst spaced = lines.filter((line) => /^ {2,}/.test(line));\n\n\tif (tabbed.length === 0 && spaced.length === 0) {\n\t\treturn null;\n\t}\n\n\t// More lines tabbed than spaced? Assume tabs, and\n\t// default to tabs in the case of a tie (or nothing\n\t// to go on)\n\tif (tabbed.length >= spaced.length) {\n\t\treturn '\\t';\n\t}\n\n\t// Otherwise, we need to guess the multiple\n\tconst min = spaced.reduce((previous, current) => {\n\t\tconst numSpaces = /^ +/.exec(current)[0].length;\n\t\treturn Math.min(numSpaces, previous);\n\t}, Infinity);\n\n\treturn new Array(min + 1).join(' ');\n}\n","export default function getRelativePath(from, to) {\n\tconst fromParts = from.split(/[/\\\\]/);\n\tconst toParts = to.split(/[/\\\\]/);\n\n\tfromParts.pop(); // get dirname\n\n\twhile (fromParts[0] === toParts[0]) {\n\t\tfromParts.shift();\n\t\ttoParts.shift();\n\t}\n\n\tif (fromParts.length) {\n\t\tlet i = fromParts.length;\n\t\twhile (i--) fromParts[i] = '..';\n\t}\n\n\treturn fromParts.concat(toParts).join('/');\n}\n","const toString = Object.prototype.toString;\n\nexport default function isObject(thing) {\n\treturn toString.call(thing) === '[object Object]';\n}\n","export default function getLocator(source) {\n\tconst originalLines = source.split('\\n');\n\tconst lineOffsets = [];\n\n\tfor (let i = 0, pos = 0; i < originalLines.length; i++) {\n\t\tlineOffsets.push(pos);\n\t\tpos += originalLines[i].length + 1;\n\t}\n\n\treturn function locate(index) {\n\t\tlet i = 0;\n\t\tlet j = lineOffsets.length;\n\t\twhile (i < j) {\n\t\t\tconst m = (i + j) >> 1;\n\t\t\tif (index < lineOffsets[m]) {\n\t\t\t\tj = m;\n\t\t\t} else {\n\t\t\t\ti = m + 1;\n\t\t\t}\n\t\t}\n\t\tconst line = i - 1;\n\t\tconst column = index - lineOffsets[line];\n\t\treturn { line, column };\n\t};\n}\n","const wordRegex = /\\w/;\n\nexport default class Mappings {\n\tconstructor(hires) {\n\t\tthis.hires = hires;\n\t\tthis.generatedCodeLine = 0;\n\t\tthis.generatedCodeColumn = 0;\n\t\tthis.raw = [];\n\t\tthis.rawSegments = this.raw[this.generatedCodeLine] = [];\n\t\tthis.pending = null;\n\t}\n\n\taddEdit(sourceIndex, content, loc, nameIndex) {\n\t\tif (content.length) {\n\t\t\tconst contentLengthMinusOne = content.length - 1;\n\t\t\tlet contentLineEnd = content.indexOf('\\n', 0);\n\t\t\tlet previousContentLineEnd = -1;\n\t\t\t// Loop through each line in the content and add a segment, but stop if the last line is empty,\n\t\t\t// else code afterwards would fill one line too many\n\t\t\twhile (contentLineEnd >= 0 && contentLengthMinusOne > contentLineEnd) {\n\t\t\t\tconst segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];\n\t\t\t\tif (nameIndex >= 0) {\n\t\t\t\t\tsegment.push(nameIndex);\n\t\t\t\t}\n\t\t\t\tthis.rawSegments.push(segment);\n\n\t\t\t\tthis.generatedCodeLine += 1;\n\t\t\t\tthis.raw[this.generatedCodeLine] = this.rawSegments = [];\n\t\t\t\tthis.generatedCodeColumn = 0;\n\n\t\t\t\tpreviousContentLineEnd = contentLineEnd;\n\t\t\t\tcontentLineEnd = content.indexOf('\\n', contentLineEnd + 1);\n\t\t\t}\n\n\t\t\tconst segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];\n\t\t\tif (nameIndex >= 0) {\n\t\t\t\tsegment.push(nameIndex);\n\t\t\t}\n\t\t\tthis.rawSegments.push(segment);\n\n\t\t\tthis.advance(content.slice(previousContentLineEnd + 1));\n\t\t} else if (this.pending) {\n\t\t\tthis.rawSegments.push(this.pending);\n\t\t\tthis.advance(content);\n\t\t}\n\n\t\tthis.pending = null;\n\t}\n\n\taddUneditedChunk(sourceIndex, chunk, original, loc, sourcemapLocations) {\n\t\tlet originalCharIndex = chunk.start;\n\t\tlet first = true;\n\t\t// when iterating each char, check if it's in a word boundary\n\t\tlet charInHiresBoundary = false;\n\n\t\twhile (originalCharIndex < chunk.end) {\n\t\t\tif (this.hires || first || sourcemapLocations.has(originalCharIndex)) {\n\t\t\t\tconst segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];\n\n\t\t\t\tif (this.hires === 'boundary') {\n\t\t\t\t\t// in hires \"boundary\", group segments per word boundary than per char\n\t\t\t\t\tif (wordRegex.test(original[originalCharIndex])) {\n\t\t\t\t\t\t// for first char in the boundary found, start the boundary by pushing a segment\n\t\t\t\t\t\tif (!charInHiresBoundary) {\n\t\t\t\t\t\t\tthis.rawSegments.push(segment);\n\t\t\t\t\t\t\tcharInHiresBoundary = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// for non-word char, end the boundary by pushing a segment\n\t\t\t\t\t\tthis.rawSegments.push(segment);\n\t\t\t\t\t\tcharInHiresBoundary = false;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.rawSegments.push(segment);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (original[originalCharIndex] === '\\n') {\n\t\t\t\tloc.line += 1;\n\t\t\t\tloc.column = 0;\n\t\t\t\tthis.generatedCodeLine += 1;\n\t\t\t\tthis.raw[this.generatedCodeLine] = this.rawSegments = [];\n\t\t\t\tthis.generatedCodeColumn = 0;\n\t\t\t\tfirst = true;\n\t\t\t} else {\n\t\t\t\tloc.column += 1;\n\t\t\t\tthis.generatedCodeColumn += 1;\n\t\t\t\tfirst = false;\n\t\t\t}\n\n\t\t\toriginalCharIndex += 1;\n\t\t}\n\n\t\tthis.pending = null;\n\t}\n\n\tadvance(str) {\n\t\tif (!str) return;\n\n\t\tconst lines = str.split('\\n');\n\n\t\tif (lines.length > 1) {\n\t\t\tfor (let i = 0; i < lines.length - 1; i++) {\n\t\t\t\tthis.generatedCodeLine++;\n\t\t\t\tthis.raw[this.generatedCodeLine] = this.rawSegments = [];\n\t\t\t}\n\t\t\tthis.generatedCodeColumn = 0;\n\t\t}\n\n\t\tthis.generatedCodeColumn += lines[lines.length - 1].length;\n\t}\n}\n","import BitSet from './BitSet.js';\nimport Chunk from './Chunk.js';\nimport SourceMap from './SourceMap.js';\nimport guessIndent from './utils/guessIndent.js';\nimport getRelativePath from './utils/getRelativePath.js';\nimport isObject from './utils/isObject.js';\nimport getLocator from './utils/getLocator.js';\nimport Mappings from './utils/Mappings.js';\nimport Stats from './utils/Stats.js';\n\nconst n = '\\n';\n\nconst warned = {\n\tinsertLeft: false,\n\tinsertRight: false,\n\tstoreName: false,\n};\n\nexport default class MagicString {\n\tconstructor(string, options = {}) {\n\t\tconst chunk = new Chunk(0, string.length, string);\n\n\t\tObject.defineProperties(this, {\n\t\t\toriginal: { writable: true, value: string },\n\t\t\toutro: { writable: true, value: '' },\n\t\t\tintro: { writable: true, value: '' },\n\t\t\tfirstChunk: { writable: true, value: chunk },\n\t\t\tlastChunk: { writable: true, value: chunk },\n\t\t\tlastSearchedChunk: { writable: true, value: chunk },\n\t\t\tbyStart: { writable: true, value: {} },\n\t\t\tbyEnd: { writable: true, value: {} },\n\t\t\tfilename: { writable: true, value: options.filename },\n\t\t\tindentExclusionRanges: { writable: true, value: options.indentExclusionRanges },\n\t\t\tsourcemapLocations: { writable: true, value: new BitSet() },\n\t\t\tstoredNames: { writable: true, value: {} },\n\t\t\tindentStr: { writable: true, value: undefined },\n\t\t\tignoreList: { writable: true, value: options.ignoreList },\n\t\t});\n\n\t\tif (DEBUG) {\n\t\t\tObject.defineProperty(this, 'stats', { value: new Stats() });\n\t\t}\n\n\t\tthis.byStart[0] = chunk;\n\t\tthis.byEnd[string.length] = chunk;\n\t}\n\n\taddSourcemapLocation(char) {\n\t\tthis.sourcemapLocations.add(char);\n\t}\n\n\tappend(content) {\n\t\tif (typeof content !== 'string') throw new TypeError('outro content must be a string');\n\n\t\tthis.outro += content;\n\t\treturn this;\n\t}\n\n\tappendLeft(index, content) {\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tif (DEBUG) this.stats.time('appendLeft');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byEnd[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.appendLeft(content);\n\t\t} else {\n\t\t\tthis.intro += content;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('appendLeft');\n\t\treturn this;\n\t}\n\n\tappendRight(index, content) {\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tif (DEBUG) this.stats.time('appendRight');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byStart[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.appendRight(content);\n\t\t} else {\n\t\t\tthis.outro += content;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('appendRight');\n\t\treturn this;\n\t}\n\n\tclone() {\n\t\tconst cloned = new MagicString(this.original, { filename: this.filename });\n\n\t\tlet originalChunk = this.firstChunk;\n\t\tlet clonedChunk = (cloned.firstChunk = cloned.lastSearchedChunk = originalChunk.clone());\n\n\t\twhile (originalChunk) {\n\t\t\tcloned.byStart[clonedChunk.start] = clonedChunk;\n\t\t\tcloned.byEnd[clonedChunk.end] = clonedChunk;\n\n\t\t\tconst nextOriginalChunk = originalChunk.next;\n\t\t\tconst nextClonedChunk = nextOriginalChunk && nextOriginalChunk.clone();\n\n\t\t\tif (nextClonedChunk) {\n\t\t\t\tclonedChunk.next = nextClonedChunk;\n\t\t\t\tnextClonedChunk.previous = clonedChunk;\n\n\t\t\t\tclonedChunk = nextClonedChunk;\n\t\t\t}\n\n\t\t\toriginalChunk = nextOriginalChunk;\n\t\t}\n\n\t\tcloned.lastChunk = clonedChunk;\n\n\t\tif (this.indentExclusionRanges) {\n\t\t\tcloned.indentExclusionRanges = this.indentExclusionRanges.slice();\n\t\t}\n\n\t\tcloned.sourcemapLocations = new BitSet(this.sourcemapLocations);\n\n\t\tcloned.intro = this.intro;\n\t\tcloned.outro = this.outro;\n\n\t\treturn cloned;\n\t}\n\n\tgenerateDecodedMap(options) {\n\t\toptions = options || {};\n\n\t\tconst sourceIndex = 0;\n\t\tconst names = Object.keys(this.storedNames);\n\t\tconst mappings = new Mappings(options.hires);\n\n\t\tconst locate = getLocator(this.original);\n\n\t\tif (this.intro) {\n\t\t\tmappings.advance(this.intro);\n\t\t}\n\n\t\tthis.firstChunk.eachNext((chunk) => {\n\t\t\tconst loc = locate(chunk.start);\n\n\t\t\tif (chunk.intro.length) mappings.advance(chunk.intro);\n\n\t\t\tif (chunk.edited) {\n\t\t\t\tmappings.addEdit(\n\t\t\t\t\tsourceIndex,\n\t\t\t\t\tchunk.content,\n\t\t\t\t\tloc,\n\t\t\t\t\tchunk.storeName ? names.indexOf(chunk.original) : -1,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tmappings.addUneditedChunk(sourceIndex, chunk, this.original, loc, this.sourcemapLocations);\n\t\t\t}\n\n\t\t\tif (chunk.outro.length) mappings.advance(chunk.outro);\n\t\t});\n\n\t\treturn {\n\t\t\tfile: options.file ? options.file.split(/[/\\\\]/).pop() : undefined,\n\t\t\tsources: [\n\t\t\t\toptions.source ? getRelativePath(options.file || '', options.source) : options.file || '',\n\t\t\t],\n\t\t\tsourcesContent: options.includeContent ? [this.original] : undefined,\n\t\t\tnames,\n\t\t\tmappings: mappings.raw,\n\t\t\tx_google_ignoreList: this.ignoreList ? [sourceIndex] : undefined,\n\t\t};\n\t}\n\n\tgenerateMap(options) {\n\t\treturn new SourceMap(this.generateDecodedMap(options));\n\t}\n\n\t_ensureindentStr() {\n\t\tif (this.indentStr === undefined) {\n\t\t\tthis.indentStr = guessIndent(this.original);\n\t\t}\n\t}\n\n\t_getRawIndentString() {\n\t\tthis._ensureindentStr();\n\t\treturn this.indentStr;\n\t}\n\n\tgetIndentString() {\n\t\tthis._ensureindentStr();\n\t\treturn this.indentStr === null ? '\\t' : this.indentStr;\n\t}\n\n\tindent(indentStr, options) {\n\t\tconst pattern = /^[^\\r\\n]/gm;\n\n\t\tif (isObject(indentStr)) {\n\t\t\toptions = indentStr;\n\t\t\tindentStr = undefined;\n\t\t}\n\n\t\tif (indentStr === undefined) {\n\t\t\tthis._ensureindentStr();\n\t\t\tindentStr = this.indentStr || '\\t';\n\t\t}\n\n\t\tif (indentStr === '') return this; // noop\n\n\t\toptions = options || {};\n\n\t\t// Process exclusion ranges\n\t\tconst isExcluded = {};\n\n\t\tif (options.exclude) {\n\t\t\tconst exclusions =\n\t\t\t\ttypeof options.exclude[0] === 'number' ? [options.exclude] : options.exclude;\n\t\t\texclusions.forEach((exclusion) => {\n\t\t\t\tfor (let i = exclusion[0]; i < exclusion[1]; i += 1) {\n\t\t\t\t\tisExcluded[i] = true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tlet shouldIndentNextCharacter = options.indentStart !== false;\n\t\tconst replacer = (match) => {\n\t\t\tif (shouldIndentNextCharacter) return `${indentStr}${match}`;\n\t\t\tshouldIndentNextCharacter = true;\n\t\t\treturn match;\n\t\t};\n\n\t\tthis.intro = this.intro.replace(pattern, replacer);\n\n\t\tlet charIndex = 0;\n\t\tlet chunk = this.firstChunk;\n\n\t\twhile (chunk) {\n\t\t\tconst end = chunk.end;\n\n\t\t\tif (chunk.edited) {\n\t\t\t\tif (!isExcluded[charIndex]) {\n\t\t\t\t\tchunk.content = chunk.content.replace(pattern, replacer);\n\n\t\t\t\t\tif (chunk.content.length) {\n\t\t\t\t\t\tshouldIndentNextCharacter = chunk.content[chunk.content.length - 1] === '\\n';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcharIndex = chunk.start;\n\n\t\t\t\twhile (charIndex < end) {\n\t\t\t\t\tif (!isExcluded[charIndex]) {\n\t\t\t\t\t\tconst char = this.original[charIndex];\n\n\t\t\t\t\t\tif (char === '\\n') {\n\t\t\t\t\t\t\tshouldIndentNextCharacter = true;\n\t\t\t\t\t\t} else if (char !== '\\r' && shouldIndentNextCharacter) {\n\t\t\t\t\t\t\tshouldIndentNextCharacter = false;\n\n\t\t\t\t\t\t\tif (charIndex === chunk.start) {\n\t\t\t\t\t\t\t\tchunk.prependRight(indentStr);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis._splitChunk(chunk, charIndex);\n\t\t\t\t\t\t\t\tchunk = chunk.next;\n\t\t\t\t\t\t\t\tchunk.prependRight(indentStr);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcharIndex += 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcharIndex = chunk.end;\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\tthis.outro = this.outro.replace(pattern, replacer);\n\n\t\treturn this;\n\t}\n\n\tinsert() {\n\t\tthrow new Error(\n\t\t\t'magicString.insert(...) is deprecated. Use prependRight(...) or appendLeft(...)',\n\t\t);\n\t}\n\n\tinsertLeft(index, content) {\n\t\tif (!warned.insertLeft) {\n\t\t\tconsole.warn(\n\t\t\t\t'magicString.insertLeft(...) is deprecated. Use magicString.appendLeft(...) instead',\n\t\t\t); // eslint-disable-line no-console\n\t\t\twarned.insertLeft = true;\n\t\t}\n\n\t\treturn this.appendLeft(index, content);\n\t}\n\n\tinsertRight(index, content) {\n\t\tif (!warned.insertRight) {\n\t\t\tconsole.warn(\n\t\t\t\t'magicString.insertRight(...) is deprecated. Use magicString.prependRight(...) instead',\n\t\t\t); // eslint-disable-line no-console\n\t\t\twarned.insertRight = true;\n\t\t}\n\n\t\treturn this.prependRight(index, content);\n\t}\n\n\tmove(start, end, index) {\n\t\tif (index >= start && index <= end) throw new Error('Cannot move a selection inside itself');\n\n\t\tif (DEBUG) this.stats.time('move');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\t\tthis._split(index);\n\n\t\tconst first = this.byStart[start];\n\t\tconst last = this.byEnd[end];\n\n\t\tconst oldLeft = first.previous;\n\t\tconst oldRight = last.next;\n\n\t\tconst newRight = this.byStart[index];\n\t\tif (!newRight && last === this.lastChunk) return this;\n\t\tconst newLeft = newRight ? newRight.previous : this.lastChunk;\n\n\t\tif (oldLeft) oldLeft.next = oldRight;\n\t\tif (oldRight) oldRight.previous = oldLeft;\n\n\t\tif (newLeft) newLeft.next = first;\n\t\tif (newRight) newRight.previous = last;\n\n\t\tif (!first.previous) this.firstChunk = last.next;\n\t\tif (!last.next) {\n\t\t\tthis.lastChunk = first.previous;\n\t\t\tthis.lastChunk.next = null;\n\t\t}\n\n\t\tfirst.previous = newLeft;\n\t\tlast.next = newRight || null;\n\n\t\tif (!newLeft) this.firstChunk = first;\n\t\tif (!newRight) this.lastChunk = last;\n\n\t\tif (DEBUG) this.stats.timeEnd('move');\n\t\treturn this;\n\t}\n\n\toverwrite(start, end, content, options) {\n\t\toptions = options || {};\n\t\treturn this.update(start, end, content, { ...options, overwrite: !options.contentOnly });\n\t}\n\n\tupdate(start, end, content, options) {\n\t\tif (typeof content !== 'string') throw new TypeError('replacement content must be a string');\n\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tif (end > this.original.length) throw new Error('end is out of bounds');\n\t\tif (start === end)\n\t\t\tthrow new Error(\n\t\t\t\t'Cannot overwrite a zero-length range – use appendLeft or prependRight instead',\n\t\t\t);\n\n\t\tif (DEBUG) this.stats.time('overwrite');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\n\t\tif (options === true) {\n\t\t\tif (!warned.storeName) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'The final argument to magicString.overwrite(...) should be an options object. See https://github.com/rich-harris/magic-string',\n\t\t\t\t); // eslint-disable-line no-console\n\t\t\t\twarned.storeName = true;\n\t\t\t}\n\n\t\t\toptions = { storeName: true };\n\t\t}\n\t\tconst storeName = options !== undefined ? options.storeName : false;\n\t\tconst overwrite = options !== undefined ? options.overwrite : false;\n\n\t\tif (storeName) {\n\t\t\tconst original = this.original.slice(start, end);\n\t\t\tObject.defineProperty(this.storedNames, original, {\n\t\t\t\twritable: true,\n\t\t\t\tvalue: true,\n\t\t\t\tenumerable: true,\n\t\t\t});\n\t\t}\n\n\t\tconst first = this.byStart[start];\n\t\tconst last = this.byEnd[end];\n\n\t\tif (first) {\n\t\t\tlet chunk = first;\n\t\t\twhile (chunk !== last) {\n\t\t\t\tif (chunk.next !== this.byStart[chunk.end]) {\n\t\t\t\t\tthrow new Error('Cannot overwrite across a split point');\n\t\t\t\t}\n\t\t\t\tchunk = chunk.next;\n\t\t\t\tchunk.edit('', false);\n\t\t\t}\n\n\t\t\tfirst.edit(content, storeName, !overwrite);\n\t\t} else {\n\t\t\t// must be inserting at the end\n\t\t\tconst newChunk = new Chunk(start, end, '').edit(content, storeName);\n\n\t\t\t// TODO last chunk in the array may not be the last chunk, if it's moved...\n\t\t\tlast.next = newChunk;\n\t\t\tnewChunk.previous = last;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('overwrite');\n\t\treturn this;\n\t}\n\n\tprepend(content) {\n\t\tif (typeof content !== 'string') throw new TypeError('outro content must be a string');\n\n\t\tthis.intro = content + this.intro;\n\t\treturn this;\n\t}\n\n\tprependLeft(index, content) {\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tif (DEBUG) this.stats.time('insertRight');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byEnd[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.prependLeft(content);\n\t\t} else {\n\t\t\tthis.intro = content + this.intro;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('insertRight');\n\t\treturn this;\n\t}\n\n\tprependRight(index, content) {\n\t\tif (typeof content !== 'string') throw new TypeError('inserted content must be a string');\n\n\t\tif (DEBUG) this.stats.time('insertRight');\n\n\t\tthis._split(index);\n\n\t\tconst chunk = this.byStart[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.prependRight(content);\n\t\t} else {\n\t\t\tthis.outro = content + this.outro;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('insertRight');\n\t\treturn this;\n\t}\n\n\tremove(start, end) {\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tif (start === end) return this;\n\n\t\tif (start < 0 || end > this.original.length) throw new Error('Character is out of bounds');\n\t\tif (start > end) throw new Error('end must be greater than start');\n\n\t\tif (DEBUG) this.stats.time('remove');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\n\t\tlet chunk = this.byStart[start];\n\n\t\twhile (chunk) {\n\t\t\tchunk.intro = '';\n\t\t\tchunk.outro = '';\n\t\t\tchunk.edit('');\n\n\t\t\tchunk = end > chunk.end ? this.byStart[chunk.end] : null;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('remove');\n\t\treturn this;\n\t}\n\n\treset(start, end) {\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tif (start === end) return this;\n\n\t\tif (start < 0 || end > this.original.length) throw new Error('Character is out of bounds');\n\t\tif (start > end) throw new Error('end must be greater than start');\n\n\t\tif (DEBUG) this.stats.time('reset');\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\n\t\tlet chunk = this.byStart[start];\n\n\t\twhile (chunk) {\n\t\t\tchunk.reset();\n\n\t\t\tchunk = end > chunk.end ? this.byStart[chunk.end] : null;\n\t\t}\n\n\t\tif (DEBUG) this.stats.timeEnd('reset');\n\t\treturn this;\n\t}\n\n\tlastChar() {\n\t\tif (this.outro.length) return this.outro[this.outro.length - 1];\n\t\tlet chunk = this.lastChunk;\n\t\tdo {\n\t\t\tif (chunk.outro.length) return chunk.outro[chunk.outro.length - 1];\n\t\t\tif (chunk.content.length) return chunk.content[chunk.content.length - 1];\n\t\t\tif (chunk.intro.length) return chunk.intro[chunk.intro.length - 1];\n\t\t} while ((chunk = chunk.previous));\n\t\tif (this.intro.length) return this.intro[this.intro.length - 1];\n\t\treturn '';\n\t}\n\n\tlastLine() {\n\t\tlet lineIndex = this.outro.lastIndexOf(n);\n\t\tif (lineIndex !== -1) return this.outro.substr(lineIndex + 1);\n\t\tlet lineStr = this.outro;\n\t\tlet chunk = this.lastChunk;\n\t\tdo {\n\t\t\tif (chunk.outro.length > 0) {\n\t\t\t\tlineIndex = chunk.outro.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1) return chunk.outro.substr(lineIndex + 1) + lineStr;\n\t\t\t\tlineStr = chunk.outro + lineStr;\n\t\t\t}\n\n\t\t\tif (chunk.content.length > 0) {\n\t\t\t\tlineIndex = chunk.content.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1) return chunk.content.substr(lineIndex + 1) + lineStr;\n\t\t\t\tlineStr = chunk.content + lineStr;\n\t\t\t}\n\n\t\t\tif (chunk.intro.length > 0) {\n\t\t\t\tlineIndex = chunk.intro.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1) return chunk.intro.substr(lineIndex + 1) + lineStr;\n\t\t\t\tlineStr = chunk.intro + lineStr;\n\t\t\t}\n\t\t} while ((chunk = chunk.previous));\n\t\tlineIndex = this.intro.lastIndexOf(n);\n\t\tif (lineIndex !== -1) return this.intro.substr(lineIndex + 1) + lineStr;\n\t\treturn this.intro + lineStr;\n\t}\n\n\tslice(start = 0, end = this.original.length) {\n\t\tif (this.original.length !== 0) {\n\t\t\twhile (start < 0) start += this.original.length;\n\t\t\twhile (end < 0) end += this.original.length;\n\t\t}\n\n\t\tlet result = '';\n\n\t\t// find start chunk\n\t\tlet chunk = this.firstChunk;\n\t\twhile (chunk && (chunk.start > start || chunk.end <= start)) {\n\t\t\t// found end chunk before start\n\t\t\tif (chunk.start < end && chunk.end >= end) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\tif (chunk && chunk.edited && chunk.start !== start)\n\t\t\tthrow new Error(`Cannot use replaced character ${start} as slice start anchor.`);\n\n\t\tconst startChunk = chunk;\n\t\twhile (chunk) {\n\t\t\tif (chunk.intro && (startChunk !== chunk || chunk.start === start)) {\n\t\t\t\tresult += chunk.intro;\n\t\t\t}\n\n\t\t\tconst containsEnd = chunk.start < end && chunk.end >= end;\n\t\t\tif (containsEnd && chunk.edited && chunk.end !== end)\n\t\t\t\tthrow new Error(`Cannot use replaced character ${end} as slice end anchor.`);\n\n\t\t\tconst sliceStart = startChunk === chunk ? start - chunk.start : 0;\n\t\t\tconst sliceEnd = containsEnd ? chunk.content.length + end - chunk.end : chunk.content.length;\n\n\t\t\tresult += chunk.content.slice(sliceStart, sliceEnd);\n\n\t\t\tif (chunk.outro && (!containsEnd || chunk.end === end)) {\n\t\t\t\tresult += chunk.outro;\n\t\t\t}\n\n\t\t\tif (containsEnd) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// TODO deprecate this? not really very useful\n\tsnip(start, end) {\n\t\tconst clone = this.clone();\n\t\tclone.remove(0, start);\n\t\tclone.remove(end, clone.original.length);\n\n\t\treturn clone;\n\t}\n\n\t_split(index) {\n\t\tif (this.byStart[index] || this.byEnd[index]) return;\n\n\t\tif (DEBUG) this.stats.time('_split');\n\n\t\tlet chunk = this.lastSearchedChunk;\n\t\tconst searchForward = index > chunk.end;\n\n\t\twhile (chunk) {\n\t\t\tif (chunk.contains(index)) return this._splitChunk(chunk, index);\n\n\t\t\tchunk = searchForward ? this.byStart[chunk.end] : this.byEnd[chunk.start];\n\t\t}\n\t}\n\n\t_splitChunk(chunk, index) {\n\t\tif (chunk.edited && chunk.content.length) {\n\t\t\t// zero-length edited chunks are a special case (overlapping replacements)\n\t\t\tconst loc = getLocator(this.original)(index);\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot split a chunk that has already been edited (${loc.line}:${loc.column} – \"${chunk.original}\")`,\n\t\t\t);\n\t\t}\n\n\t\tconst newChunk = chunk.split(index);\n\n\t\tthis.byEnd[index] = chunk;\n\t\tthis.byStart[index] = newChunk;\n\t\tthis.byEnd[newChunk.end] = newChunk;\n\n\t\tif (chunk === this.lastChunk) this.lastChunk = newChunk;\n\n\t\tthis.lastSearchedChunk = chunk;\n\t\tif (DEBUG) this.stats.timeEnd('_split');\n\t\treturn true;\n\t}\n\n\ttoString() {\n\t\tlet str = this.intro;\n\n\t\tlet chunk = this.firstChunk;\n\t\twhile (chunk) {\n\t\t\tstr += chunk.toString();\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\treturn str + this.outro;\n\t}\n\n\tisEmpty() {\n\t\tlet chunk = this.firstChunk;\n\t\tdo {\n\t\t\tif (\n\t\t\t\t(chunk.intro.length && chunk.intro.trim()) ||\n\t\t\t\t(chunk.content.length && chunk.content.trim()) ||\n\t\t\t\t(chunk.outro.length && chunk.outro.trim())\n\t\t\t)\n\t\t\t\treturn false;\n\t\t} while ((chunk = chunk.next));\n\t\treturn true;\n\t}\n\n\tlength() {\n\t\tlet chunk = this.firstChunk;\n\t\tlet length = 0;\n\t\tdo {\n\t\t\tlength += chunk.intro.length + chunk.content.length + chunk.outro.length;\n\t\t} while ((chunk = chunk.next));\n\t\treturn length;\n\t}\n\n\ttrimLines() {\n\t\treturn this.trim('[\\\\r\\\\n]');\n\t}\n\n\ttrim(charType) {\n\t\treturn this.trimStart(charType).trimEnd(charType);\n\t}\n\n\ttrimEndAborted(charType) {\n\t\tconst rx = new RegExp((charType || '\\\\s') + '+$');\n\n\t\tthis.outro = this.outro.replace(rx, '');\n\t\tif (this.outro.length) return true;\n\n\t\tlet chunk = this.lastChunk;\n\n\t\tdo {\n\t\t\tconst end = chunk.end;\n\t\t\tconst aborted = chunk.trimEnd(rx);\n\n\t\t\t// if chunk was trimmed, we have a new lastChunk\n\t\t\tif (chunk.end !== end) {\n\t\t\t\tif (this.lastChunk === chunk) {\n\t\t\t\t\tthis.lastChunk = chunk.next;\n\t\t\t\t}\n\n\t\t\t\tthis.byEnd[chunk.end] = chunk;\n\t\t\t\tthis.byStart[chunk.next.start] = chunk.next;\n\t\t\t\tthis.byEnd[chunk.next.end] = chunk.next;\n\t\t\t}\n\n\t\t\tif (aborted) return true;\n\t\t\tchunk = chunk.previous;\n\t\t} while (chunk);\n\n\t\treturn false;\n\t}\n\n\ttrimEnd(charType) {\n\t\tthis.trimEndAborted(charType);\n\t\treturn this;\n\t}\n\ttrimStartAborted(charType) {\n\t\tconst rx = new RegExp('^' + (charType || '\\\\s') + '+');\n\n\t\tthis.intro = this.intro.replace(rx, '');\n\t\tif (this.intro.length) return true;\n\n\t\tlet chunk = this.firstChunk;\n\n\t\tdo {\n\t\t\tconst end = chunk.end;\n\t\t\tconst aborted = chunk.trimStart(rx);\n\n\t\t\tif (chunk.end !== end) {\n\t\t\t\t// special case...\n\t\t\t\tif (chunk === this.lastChunk) this.lastChunk = chunk.next;\n\n\t\t\t\tthis.byEnd[chunk.end] = chunk;\n\t\t\t\tthis.byStart[chunk.next.start] = chunk.next;\n\t\t\t\tthis.byEnd[chunk.next.end] = chunk.next;\n\t\t\t}\n\n\t\t\tif (aborted) return true;\n\t\t\tchunk = chunk.next;\n\t\t} while (chunk);\n\n\t\treturn false;\n\t}\n\n\ttrimStart(charType) {\n\t\tthis.trimStartAborted(charType);\n\t\treturn this;\n\t}\n\n\thasChanged() {\n\t\treturn this.original !== this.toString();\n\t}\n\n\t_replaceRegexp(searchValue, replacement) {\n\t\tfunction getReplacement(match, str) {\n\t\t\tif (typeof replacement === 'string') {\n\t\t\t\treturn replacement.replace(/\\$(\\$|&|\\d+)/g, (_, i) => {\n\t\t\t\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_a_parameter\n\t\t\t\t\tif (i === '$') return '$';\n\t\t\t\t\tif (i === '&') return match[0];\n\t\t\t\t\tconst num = +i;\n\t\t\t\t\tif (num < match.length) return match[+i];\n\t\t\t\t\treturn `$${i}`;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn replacement(...match, match.index, str, match.groups);\n\t\t\t}\n\t\t}\n\t\tfunction matchAll(re, str) {\n\t\t\tlet match;\n\t\t\tconst matches = [];\n\t\t\twhile ((match = re.exec(str))) {\n\t\t\t\tmatches.push(match);\n\t\t\t}\n\t\t\treturn matches;\n\t\t}\n\t\tif (searchValue.global) {\n\t\t\tconst matches = matchAll(searchValue, this.original);\n\t\t\tmatches.forEach((match) => {\n\t\t\t\tif (match.index != null) {\n\t\t\t\t\tconst replacement = getReplacement(match, this.original);\n\t\t\t\t\tif (replacement !== match[0]) {\n\t\t\t\t\t\tthis.overwrite(\n\t\t\t\t\t\t\tmatch.index,\n\t\t\t\t\t\t\tmatch.index + match[0].length,\n\t\t\t\t\t\t\treplacement\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tconst match = this.original.match(searchValue);\n\t\t\tif (match && match.index != null) {\n\t\t\t\tconst replacement = getReplacement(match, this.original);\n\t\t\t\tif (replacement !== match[0]) {\n\t\t\t\t\tthis.overwrite(\n\t\t\t\t\t\tmatch.index,\n\t\t\t\t\t\tmatch.index + match[0].length,\n\t\t\t\t\t\treplacement\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\t_replaceString(string, replacement) {\n\t\tconst { original } = this;\n\t\tconst index = original.indexOf(string);\n\n\t\tif (index !== -1) {\n\t\t\tthis.overwrite(index, index + string.length, replacement);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\treplace(searchValue, replacement) {\n\t\tif (typeof searchValue === 'string') {\n\t\t\treturn this._replaceString(searchValue, replacement);\n\t\t}\n\n\t\treturn this._replaceRegexp(searchValue, replacement);\n\t}\n\n\t_replaceAllString(string, replacement) {\n\t\tconst { original } = this;\n\t\tconst stringLength = string.length;\n\t\tfor (\n\t\t\tlet index = original.indexOf(string);\n\t\t\tindex !== -1;\n\t\t\tindex = original.indexOf(string, index + stringLength)\n\t\t) {\n\t\t\tconst previous = original.slice(index, index + stringLength);\n\t\t\tif (previous !== replacement)\n\t\t\t\tthis.overwrite(index, index + stringLength, replacement);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\treplaceAll(searchValue, replacement) {\n\t\tif (typeof searchValue === 'string') {\n\t\t\treturn this._replaceAllString(searchValue, replacement);\n\t\t}\n\n\t\tif (!searchValue.global) {\n\t\t\tthrow new TypeError(\n\t\t\t\t'MagicString.prototype.replaceAll called with a non-global RegExp argument',\n\t\t\t);\n\t\t}\n\n\t\treturn this._replaceRegexp(searchValue, replacement);\n\t}\n}\n","import MagicString from './MagicString.js';\nimport SourceMap from './SourceMap.js';\nimport getRelativePath from './utils/getRelativePath.js';\nimport isObject from './utils/isObject.js';\nimport getLocator from './utils/getLocator.js';\nimport Mappings from './utils/Mappings.js';\n\nconst hasOwnProp = Object.prototype.hasOwnProperty;\n\nexport default class Bundle {\n\tconstructor(options = {}) {\n\t\tthis.intro = options.intro || '';\n\t\tthis.separator = options.separator !== undefined ? options.separator : '\\n';\n\t\tthis.sources = [];\n\t\tthis.uniqueSources = [];\n\t\tthis.uniqueSourceIndexByFilename = {};\n\t}\n\n\taddSource(source) {\n\t\tif (source instanceof MagicString) {\n\t\t\treturn this.addSource({\n\t\t\t\tcontent: source,\n\t\t\t\tfilename: source.filename,\n\t\t\t\tseparator: this.separator,\n\t\t\t});\n\t\t}\n\n\t\tif (!isObject(source) || !source.content) {\n\t\t\tthrow new Error(\n\t\t\t\t'bundle.addSource() takes an object with a `content` property, which should be an instance of MagicString, and an optional `filename`',\n\t\t\t);\n\t\t}\n\n\t\t['filename', 'ignoreList', 'indentExclusionRanges', 'separator'].forEach((option) => {\n\t\t\tif (!hasOwnProp.call(source, option)) source[option] = source.content[option];\n\t\t});\n\n\t\tif (source.separator === undefined) {\n\t\t\t// TODO there's a bunch of this sort of thing, needs cleaning up\n\t\t\tsource.separator = this.separator;\n\t\t}\n\n\t\tif (source.filename) {\n\t\t\tif (!hasOwnProp.call(this.uniqueSourceIndexByFilename, source.filename)) {\n\t\t\t\tthis.uniqueSourceIndexByFilename[source.filename] = this.uniqueSources.length;\n\t\t\t\tthis.uniqueSources.push({ filename: source.filename, content: source.content.original });\n\t\t\t} else {\n\t\t\t\tconst uniqueSource = this.uniqueSources[this.uniqueSourceIndexByFilename[source.filename]];\n\t\t\t\tif (source.content.original !== uniqueSource.content) {\n\t\t\t\t\tthrow new Error(`Illegal source: same filename (${source.filename}), different contents`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.sources.push(source);\n\t\treturn this;\n\t}\n\n\tappend(str, options) {\n\t\tthis.addSource({\n\t\t\tcontent: new MagicString(str),\n\t\t\tseparator: (options && options.separator) || '',\n\t\t});\n\n\t\treturn this;\n\t}\n\n\tclone() {\n\t\tconst bundle = new Bundle({\n\t\t\tintro: this.intro,\n\t\t\tseparator: this.separator,\n\t\t});\n\n\t\tthis.sources.forEach((source) => {\n\t\t\tbundle.addSource({\n\t\t\t\tfilename: source.filename,\n\t\t\t\tcontent: source.content.clone(),\n\t\t\t\tseparator: source.separator,\n\t\t\t});\n\t\t});\n\n\t\treturn bundle;\n\t}\n\n\tgenerateDecodedMap(options = {}) {\n\t\tconst names = [];\n\t\tlet x_google_ignoreList = undefined;\n\t\tthis.sources.forEach((source) => {\n\t\t\tObject.keys(source.content.storedNames).forEach((name) => {\n\t\t\t\tif (!~names.indexOf(name)) names.push(name);\n\t\t\t});\n\t\t});\n\n\t\tconst mappings = new Mappings(options.hires);\n\n\t\tif (this.intro) {\n\t\t\tmappings.advance(this.intro);\n\t\t}\n\n\t\tthis.sources.forEach((source, i) => {\n\t\t\tif (i > 0) {\n\t\t\t\tmappings.advance(this.separator);\n\t\t\t}\n\n\t\t\tconst sourceIndex = source.filename ? this.uniqueSourceIndexByFilename[source.filename] : -1;\n\t\t\tconst magicString = source.content;\n\t\t\tconst locate = getLocator(magicString.original);\n\n\t\t\tif (magicString.intro) {\n\t\t\t\tmappings.advance(magicString.intro);\n\t\t\t}\n\n\t\t\tmagicString.firstChunk.eachNext((chunk) => {\n\t\t\t\tconst loc = locate(chunk.start);\n\n\t\t\t\tif (chunk.intro.length) mappings.advance(chunk.intro);\n\n\t\t\t\tif (source.filename) {\n\t\t\t\t\tif (chunk.edited) {\n\t\t\t\t\t\tmappings.addEdit(\n\t\t\t\t\t\t\tsourceIndex,\n\t\t\t\t\t\t\tchunk.content,\n\t\t\t\t\t\t\tloc,\n\t\t\t\t\t\t\tchunk.storeName ? names.indexOf(chunk.original) : -1,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmappings.addUneditedChunk(\n\t\t\t\t\t\t\tsourceIndex,\n\t\t\t\t\t\t\tchunk,\n\t\t\t\t\t\t\tmagicString.original,\n\t\t\t\t\t\t\tloc,\n\t\t\t\t\t\t\tmagicString.sourcemapLocations,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tmappings.advance(chunk.content);\n\t\t\t\t}\n\n\t\t\t\tif (chunk.outro.length) mappings.advance(chunk.outro);\n\t\t\t});\n\n\t\t\tif (magicString.outro) {\n\t\t\t\tmappings.advance(magicString.outro);\n\t\t\t}\n\n\t\t\tif (source.ignoreList && sourceIndex !== -1) {\n\t\t\t\tif (x_google_ignoreList === undefined) {\n\t\t\t\t\tx_google_ignoreList = [];\n\t\t\t\t}\n\t\t\t\tx_google_ignoreList.push(sourceIndex);\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tfile: options.file ? options.file.split(/[/\\\\]/).pop() : undefined,\n\t\t\tsources: this.uniqueSources.map((source) => {\n\t\t\t\treturn options.file ? getRelativePath(options.file, source.filename) : source.filename;\n\t\t\t}),\n\t\t\tsourcesContent: this.uniqueSources.map((source) => {\n\t\t\t\treturn options.includeContent ? source.content : null;\n\t\t\t}),\n\t\t\tnames,\n\t\t\tmappings: mappings.raw,\n\t\t\tx_google_ignoreList,\n\t\t};\n\t}\n\n\tgenerateMap(options) {\n\t\treturn new SourceMap(this.generateDecodedMap(options));\n\t}\n\n\tgetIndentString() {\n\t\tconst indentStringCounts = {};\n\n\t\tthis.sources.forEach((source) => {\n\t\t\tconst indentStr = source.content._getRawIndentString();\n\n\t\t\tif (indentStr === null) return;\n\n\t\t\tif (!indentStringCounts[indentStr]) indentStringCounts[indentStr] = 0;\n\t\t\tindentStringCounts[indentStr] += 1;\n\t\t});\n\n\t\treturn (\n\t\t\tObject.keys(indentStringCounts).sort((a, b) => {\n\t\t\t\treturn indentStringCounts[a] - indentStringCounts[b];\n\t\t\t})[0] || '\\t'\n\t\t);\n\t}\n\n\tindent(indentStr) {\n\t\tif (!arguments.length) {\n\t\t\tindentStr = this.getIndentString();\n\t\t}\n\n\t\tif (indentStr === '') return this; // noop\n\n\t\tlet trailingNewline = !this.intro || this.intro.slice(-1) === '\\n';\n\n\t\tthis.sources.forEach((source, i) => {\n\t\t\tconst separator = source.separator !== undefined ? source.separator : this.separator;\n\t\t\tconst indentStart = trailingNewline || (i > 0 && /\\r?\\n$/.test(separator));\n\n\t\t\tsource.content.indent(indentStr, {\n\t\t\t\texclude: source.indentExclusionRanges,\n\t\t\t\tindentStart, //: trailingNewline || /\\r?\\n$/.test( separator ) //true///\\r?\\n/.test( separator )\n\t\t\t});\n\n\t\t\ttrailingNewline = source.content.lastChar() === '\\n';\n\t\t});\n\n\t\tif (this.intro) {\n\t\t\tthis.intro =\n\t\t\t\tindentStr +\n\t\t\t\tthis.intro.replace(/^[^\\n]/gm, (match, index) => {\n\t\t\t\t\treturn index > 0 ? indentStr + match : match;\n\t\t\t\t});\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tprepend(str) {\n\t\tthis.intro = str + this.intro;\n\t\treturn this;\n\t}\n\n\ttoString() {\n\t\tconst body = this.sources\n\t\t\t.map((source, i) => {\n\t\t\t\tconst separator = source.separator !== undefined ? source.separator : this.separator;\n\t\t\t\tconst str = (i > 0 ? separator : '') + source.content.toString();\n\n\t\t\t\treturn str;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn this.intro + body;\n\t}\n\n\tisEmpty() {\n\t\tif (this.intro.length && this.intro.trim()) return false;\n\t\tif (this.sources.some((source) => !source.content.isEmpty())) return false;\n\t\treturn true;\n\t}\n\n\tlength() {\n\t\treturn this.sources.reduce(\n\t\t\t(length, source) => length + source.content.length(),\n\t\t\tthis.intro.length,\n\t\t);\n\t}\n\n\ttrimLines() {\n\t\treturn this.trim('[\\\\r\\\\n]');\n\t}\n\n\ttrim(charType) {\n\t\treturn this.trimStart(charType).trimEnd(charType);\n\t}\n\n\ttrimStart(charType) {\n\t\tconst rx = new RegExp('^' + (charType || '\\\\s') + '+');\n\t\tthis.intro = this.intro.replace(rx, '');\n\n\t\tif (!this.intro) {\n\t\t\tlet source;\n\t\t\tlet i = 0;\n\n\t\t\tdo {\n\t\t\t\tsource = this.sources[i++];\n\t\t\t\tif (!source) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} while (!source.content.trimStartAborted(charType));\n\t\t}\n\n\t\treturn this;\n\t}\n\n\ttrimEnd(charType) {\n\t\tconst rx = new RegExp((charType || '\\\\s') + '+$');\n\n\t\tlet source;\n\t\tlet i = this.sources.length - 1;\n\n\t\tdo {\n\t\t\tsource = this.sources[i--];\n\t\t\tif (!source) {\n\t\t\t\tthis.intro = this.intro.replace(rx, '');\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} while (!source.content.trimEndAborted(charType));\n\n\t\treturn this;\n\t}\n}\n","import MagicString from './MagicString.js';\nimport Bundle from './Bundle.js';\nimport SourceMap from './SourceMap.js';\n\nMagicString.Bundle = Bundle;\nMagicString.SourceMap = SourceMap;\nMagicString.default = MagicString; // work around TypeScript bug https://github.com/Rich-Harris/magic-string/pull/121\n\nexport default MagicString;\n"],"names":[],"mappings":"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","x_google_ignoreList":[2]} \ No newline at end of file diff --git a/node_modules/magic-string/package.json b/node_modules/magic-string/package.json index 3296eb3c..e16c7a6a 100644 --- a/node_modules/magic-string/package.json +++ b/node_modules/magic-string/package.json @@ -1,6 +1,7 @@ { "name": "magic-string", - "version": "0.30.17", + "version": "0.30.11", + "packageManager": "pnpm@9.6.0", "description": "Modify strings, generate sourcemaps", "keywords": [ "string", @@ -14,7 +15,6 @@ "author": "Rich Harris", "main": "./dist/magic-string.cjs.js", "module": "./dist/magic-string.es.mjs", - "sideEffects": false, "jsnext:main": "./dist/magic-string.es.mjs", "types": "./dist/magic-string.cjs.d.ts", "exports": { @@ -29,35 +29,35 @@ "index.d.ts", "README.md" ], - "devDependencies": { - "@eslint/js": "^9.16.0", - "@rollup/plugin-node-resolve": "^15.3.0", - "@rollup/plugin-replace": "^5.0.7", - "benchmark": "^2.1.4", - "bumpp": "^9.9.1", - "conventional-changelog-cli": "^3.0.0", - "eslint": "^9.16.0", - "prettier": "^3.4.2", - "publint": "^0.2.12", - "rollup": "^3.29.5", - "source-map-js": "^1.2.1", - "source-map-support": "^0.5.21", - "vitest": "^2.1.8" - }, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - }, "scripts": { "build": "rollup -c", "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s", - "format": "prettier --single-quote --print-width 100 --use-tabs --write .", + "format": "prettier --single-quote --print-width 100 --use-tabs --write src/*.js src/**/*.js", "lint": "eslint src test && publint", "lint:fix": "eslint src test --fix", + "prepare": "npm run build", + "prepublishOnly": "npm run lint && rm -rf dist && npm test", "release": "bumpp -x \"npm run changelog\" --all --commit --tag --push && npm publish", "pretest": "npm run build", - "test": "vitest run", - "test:dev": "vitest", + "test": "mocha", "bench": "npm run build && node benchmark/index.mjs", "watch": "rollup -cw" + }, + "devDependencies": { + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-replace": "^5.0.7", + "benchmark": "^2.1.4", + "bumpp": "^9.4.1", + "conventional-changelog-cli": "^3.0.0", + "eslint": "^8.57.0", + "mocha": "^10.7.0", + "prettier": "^3.3.3", + "publint": "^0.2.9", + "rollup": "^3.29.4", + "source-map-js": "^1.2.0", + "source-map-support": "^0.5.21" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" } -} \ No newline at end of file +} diff --git a/node_modules/picocolors/README.md b/node_modules/picocolors/README.md index 8e47aa8e..54e3aa3b 100644 --- a/node_modules/picocolors/README.md +++ b/node_modules/picocolors/README.md @@ -17,5 +17,161 @@ console.log( - TypeScript type declarations included. - [`NO_COLOR`](https://no-color.org/) friendly. -## Docs -Read **[full docs](https://github.com/alexeyraspopov/picocolors#readme)** on GitHub. +## Motivation + +With `picocolors` we are trying to draw attention to the `node_modules` size +problem and promote performance-first culture. + +## Prior Art + +Credits go to the following projects: + +- [Nanocolors](https://github.com/ai/nanocolors) by [@ai](https://github.com/ai) +- [Colorette](https://github.com/jorgebucaran/colorette) by [@jorgebucaran](https://github.com/jorgebucaran) +- [Kleur](https://github.com/lukeed/kleur) by [@lukeed](https://github.com/lukeed) +- [Colors.js](https://github.com/Marak/colors.js) by [@Marak](https://github.com/Marak) +- [Chalk](https://github.com/chalk/chalk) by [@sindresorhus](https://github.com/sindresorhus) + +## Benchmarks + +The space in node_modules including sub-dependencies: + +```diff +$ node ./benchmarks/size.js +Data from packagephobia.com + chalk 101 kB + cli-color 1249 kB + ansi-colors 25 kB + kleur 21 kB + colorette 17 kB + nanocolors 16 kB ++ picocolors 7 kB +``` + +Library loading time: + +```diff +$ node ./benchmarks/loading.js + chalk 6.167 ms + cli-color 31.431 ms + ansi-colors 1.585 ms + kleur 2.008 ms + kleur/colors 0.773 ms + colorette 2.476 ms + nanocolors 0.833 ms ++ picocolors 0.466 ms +``` + +Benchmark for simple use case: + +```diff +$ node ./benchmarks/simple.js + chalk 24,066,342 ops/sec + cli-color 938,700 ops/sec + ansi-colors 4,532,542 ops/sec + kleur 20,343,122 ops/sec + kleur/colors 35,415,770 ops/sec + colorette 34,244,834 ops/sec + nanocolors 33,443,265 ops/sec ++ picocolors 33,271,645 ops/sec +``` + +Benchmark for complex use cases: + +```diff +$ node ./benchmarks/complex.js + chalk 969,915 ops/sec + cli-color 131,639 ops/sec + ansi-colors 342,250 ops/sec + kleur 611,880 ops/sec + kleur/colors 1,129,526 ops/sec + colorette 1,747,277 ops/sec + nanocolors 1,251,312 ops/sec ++ picocolors 2,024,086 ops/sec +``` + +## Usage + +Picocolors provides an object which includes a variety of text coloring and formatting functions + +```javascript +import pc from "picocolors" +``` + +The object includes following coloring functions: `black`, `red`, `green`, `yellow`, `blue`, `magenta`, `cyan`, `white`, `gray`. + +```javascript +console.log(`I see a ${pc.red("red door")} and I want it painted ${pc.black("black")}`) +``` + +The object also includes following background color modifier functions: `bgBlack`, `bgRed`, `bgGreen`, `bgYellow`, `bgBlue`, `bgMagenta`, `bgCyan`, `bgWhite` and bright variants `bgBlackBright`, `bgRedBright`, `bgGreenBright`, `bgYellowBright`, `bgBlueBright`, `bgMagentaBright`, `bgCyanBright`, `bgWhiteBright`. + +```javascript +console.log( + pc.bgBlack( + pc.white(`Tom appeared on the sidewalk with a bucket of whitewash and a long-handled brush.`) + ) +) +``` + +Besides colors, the object includes following formatting functions: `dim`, `bold`, `hidden`, `italic`, `underline`, `strikethrough`, `reset`, `inverse` and bright variants `blackBright`, `redBright`, `greenBright`, `yellowBright`, `blueBright`, `magentaBright`, `cyanBright`, `whiteBright`. + +```javascript +for (let task of tasks) { + console.log(`${pc.bold(task.name)} ${pc.dim(task.durationMs + "ms")}`) +} +``` + +The library provides additional utilities to ensure the best results for the task: + +- `isColorSupported` — boolean, explicitly tells whether or not the colors or formatting appear on the screen + + ```javascript + import pc from "picocolors" + + if (pc.isColorSupported) { + console.log("Yay! This script can use colors and formatters") + } + ``` + +- `createColors(enabled)` — a function that returns a new API object with manually defined color support configuration + + ```javascript + import pc from "picocolors" + + let { red, bgWhite } = pc.createColors(options.enableColors) + ``` + +## Replacing `chalk` + +1. Replace package name in import: + + ```diff + - import chalk from 'chalk' + + import pico from 'picocolors' + ``` + +2. Replace variable: + + ```diff + - chalk.red(text) + + pico.red(text) + ``` + +3. Replace chains to nested calls: + + ```diff + - chalk.red.bold(text) + + pico.red(pico.bold(text)) + ``` + +4. You can use [`colorize-template`](https://github.com/usmanyunusov/colorize-template) + to replace chalk’s tagged template literal. + + ```diff + + import { createColorize } from 'colorize-template' + + + let colorize = createColorize(pico) + - chalk.red.bold`full {yellow ${"text"}}` + + colorize`{red.bold full {yellow ${"text"}}}` + ``` diff --git a/node_modules/picocolors/package.json b/node_modules/picocolors/package.json index 372d4b64..fd781f4b 100644 --- a/node_modules/picocolors/package.json +++ b/node_modules/picocolors/package.json @@ -1,6 +1,6 @@ { "name": "picocolors", - "version": "1.1.1", + "version": "1.1.0", "main": "./picocolors.js", "types": "./picocolors.d.ts", "browser": { @@ -8,9 +8,12 @@ }, "sideEffects": false, "description": "The tiniest and the fastest library for terminal output formatting with ANSI colors", + "scripts": { + "test": "node tests/test.js" + }, "files": [ "picocolors.*", - "types.d.ts" + "types.ts" ], "keywords": [ "terminal", @@ -21,5 +24,26 @@ ], "author": "Alexey Raspopov", "repository": "alexeyraspopov/picocolors", - "license": "ISC" + "license": "ISC", + "devDependencies": { + "ansi-colors": "^4.1.1", + "benchmark": "^2.1.4", + "chalk": "^4.1.2", + "clean-publish": "^3.0.3", + "cli-color": "^2.0.0", + "colorette": "^2.0.12", + "kleur": "^4.1.4", + "nanocolors": "^0.2.12", + "prettier": "^2.4.1" + }, + "prettier": { + "printWidth": 100, + "useTabs": true, + "tabWidth": 2, + "semi": false, + "arrowParens": "avoid" + }, + "clean-publish": { + "cleanDocs": true + } } diff --git a/node_modules/picocolors/picocolors.js b/node_modules/picocolors/picocolors.js index e32df854..f5ea2a18 100644 --- a/node_modules/picocolors/picocolors.js +++ b/node_modules/picocolors/picocolors.js @@ -1,16 +1,26 @@ -let p = process || {}, argv = p.argv || [], env = p.env || {} +let argv = process.argv || [], + env = process.env let isColorSupported = - !(!!env.NO_COLOR || argv.includes("--no-color")) && - (!!env.FORCE_COLOR || argv.includes("--color") || p.platform === "win32" || ((p.stdout || {}).isTTY && env.TERM !== "dumb") || !!env.CI) + !("NO_COLOR" in env || argv.includes("--no-color")) && + ("FORCE_COLOR" in env || + argv.includes("--color") || + process.platform === "win32" || + (require != null && require("tty").isatty(1) && env.TERM !== "dumb") || + "CI" in env) -let formatter = (open, close, replace = open) => +let formatter = + (open, close, replace = open) => input => { - let string = "" + input, index = string.indexOf(close, open.length) - return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close + let string = "" + input + let index = string.indexOf(close, open.length) + return ~index + ? open + replaceClose(string, close, replace, index) + close + : open + string + close } let replaceClose = (string, close, replace, index) => { - let result = "", cursor = 0 + let result = "" + let cursor = 0 do { result += string.substring(cursor, index) + replace cursor = index + close.length @@ -20,54 +30,54 @@ let replaceClose = (string, close, replace, index) => { } let createColors = (enabled = isColorSupported) => { - let f = enabled ? formatter : () => String + let init = enabled ? formatter : () => String return { isColorSupported: enabled, - reset: f("\x1b[0m", "\x1b[0m"), - bold: f("\x1b[1m", "\x1b[22m", "\x1b[22m\x1b[1m"), - dim: f("\x1b[2m", "\x1b[22m", "\x1b[22m\x1b[2m"), - italic: f("\x1b[3m", "\x1b[23m"), - underline: f("\x1b[4m", "\x1b[24m"), - inverse: f("\x1b[7m", "\x1b[27m"), - hidden: f("\x1b[8m", "\x1b[28m"), - strikethrough: f("\x1b[9m", "\x1b[29m"), + reset: init("\x1b[0m", "\x1b[0m"), + bold: init("\x1b[1m", "\x1b[22m", "\x1b[22m\x1b[1m"), + dim: init("\x1b[2m", "\x1b[22m", "\x1b[22m\x1b[2m"), + italic: init("\x1b[3m", "\x1b[23m"), + underline: init("\x1b[4m", "\x1b[24m"), + inverse: init("\x1b[7m", "\x1b[27m"), + hidden: init("\x1b[8m", "\x1b[28m"), + strikethrough: init("\x1b[9m", "\x1b[29m"), - black: f("\x1b[30m", "\x1b[39m"), - red: f("\x1b[31m", "\x1b[39m"), - green: f("\x1b[32m", "\x1b[39m"), - yellow: f("\x1b[33m", "\x1b[39m"), - blue: f("\x1b[34m", "\x1b[39m"), - magenta: f("\x1b[35m", "\x1b[39m"), - cyan: f("\x1b[36m", "\x1b[39m"), - white: f("\x1b[37m", "\x1b[39m"), - gray: f("\x1b[90m", "\x1b[39m"), + black: init("\x1b[30m", "\x1b[39m"), + red: init("\x1b[31m", "\x1b[39m"), + green: init("\x1b[32m", "\x1b[39m"), + yellow: init("\x1b[33m", "\x1b[39m"), + blue: init("\x1b[34m", "\x1b[39m"), + magenta: init("\x1b[35m", "\x1b[39m"), + cyan: init("\x1b[36m", "\x1b[39m"), + white: init("\x1b[37m", "\x1b[39m"), + gray: init("\x1b[90m", "\x1b[39m"), - bgBlack: f("\x1b[40m", "\x1b[49m"), - bgRed: f("\x1b[41m", "\x1b[49m"), - bgGreen: f("\x1b[42m", "\x1b[49m"), - bgYellow: f("\x1b[43m", "\x1b[49m"), - bgBlue: f("\x1b[44m", "\x1b[49m"), - bgMagenta: f("\x1b[45m", "\x1b[49m"), - bgCyan: f("\x1b[46m", "\x1b[49m"), - bgWhite: f("\x1b[47m", "\x1b[49m"), + bgBlack: init("\x1b[40m", "\x1b[49m"), + bgRed: init("\x1b[41m", "\x1b[49m"), + bgGreen: init("\x1b[42m", "\x1b[49m"), + bgYellow: init("\x1b[43m", "\x1b[49m"), + bgBlue: init("\x1b[44m", "\x1b[49m"), + bgMagenta: init("\x1b[45m", "\x1b[49m"), + bgCyan: init("\x1b[46m", "\x1b[49m"), + bgWhite: init("\x1b[47m", "\x1b[49m"), - blackBright: f("\x1b[90m", "\x1b[39m"), - redBright: f("\x1b[91m", "\x1b[39m"), - greenBright: f("\x1b[92m", "\x1b[39m"), - yellowBright: f("\x1b[93m", "\x1b[39m"), - blueBright: f("\x1b[94m", "\x1b[39m"), - magentaBright: f("\x1b[95m", "\x1b[39m"), - cyanBright: f("\x1b[96m", "\x1b[39m"), - whiteBright: f("\x1b[97m", "\x1b[39m"), + blackBright: init("\x1b[90m", "\x1b[39m"), + redBright: init("\x1b[91m", "\x1b[39m"), + greenBright: init("\x1b[92m", "\x1b[39m"), + yellowBright: init("\x1b[93m", "\x1b[39m"), + blueBright: init("\x1b[94m", "\x1b[39m"), + magentaBright: init("\x1b[95m", "\x1b[39m"), + cyanBright: init("\x1b[96m", "\x1b[39m"), + whiteBright: init("\x1b[97m", "\x1b[39m"), - bgBlackBright: f("\x1b[100m", "\x1b[49m"), - bgRedBright: f("\x1b[101m", "\x1b[49m"), - bgGreenBright: f("\x1b[102m", "\x1b[49m"), - bgYellowBright: f("\x1b[103m", "\x1b[49m"), - bgBlueBright: f("\x1b[104m", "\x1b[49m"), - bgMagentaBright: f("\x1b[105m", "\x1b[49m"), - bgCyanBright: f("\x1b[106m", "\x1b[49m"), - bgWhiteBright: f("\x1b[107m", "\x1b[49m"), + bgBlackBright: init("\x1b[100m","\x1b[49m"), + bgRedBright: init("\x1b[101m","\x1b[49m"), + bgGreenBright: init("\x1b[102m","\x1b[49m"), + bgYellowBright: init("\x1b[103m","\x1b[49m"), + bgBlueBright: init("\x1b[104m","\x1b[49m"), + bgMagentaBright: init("\x1b[105m","\x1b[49m"), + bgCyanBright: init("\x1b[106m","\x1b[49m"), + bgWhiteBright: init("\x1b[107m","\x1b[49m"), } } diff --git a/node_modules/picocolors/types.d.ts b/node_modules/picocolors/types.d.ts deleted file mode 100644 index cd1aec46..00000000 --- a/node_modules/picocolors/types.d.ts +++ /dev/null @@ -1,51 +0,0 @@ -export type Formatter = (input: string | number | null | undefined) => string - -export interface Colors { - isColorSupported: boolean - - reset: Formatter - bold: Formatter - dim: Formatter - italic: Formatter - underline: Formatter - inverse: Formatter - hidden: Formatter - strikethrough: Formatter - - black: Formatter - red: Formatter - green: Formatter - yellow: Formatter - blue: Formatter - magenta: Formatter - cyan: Formatter - white: Formatter - gray: Formatter - - bgBlack: Formatter - bgRed: Formatter - bgGreen: Formatter - bgYellow: Formatter - bgBlue: Formatter - bgMagenta: Formatter - bgCyan: Formatter - bgWhite: Formatter - - blackBright: Formatter - redBright: Formatter - greenBright: Formatter - yellowBright: Formatter - blueBright: Formatter - magentaBright: Formatter - cyanBright: Formatter - whiteBright: Formatter - - bgBlackBright: Formatter - bgRedBright: Formatter - bgGreenBright: Formatter - bgYellowBright: Formatter - bgBlueBright: Formatter - bgMagentaBright: Formatter - bgCyanBright: Formatter - bgWhiteBright: Formatter -} diff --git a/package-lock.json b/package-lock.json index 3d20a3c4..5607e3b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,18 +23,20 @@ "@vitejs/plugin-vue": "^4.0.0", "@vue/tsconfig": "^0.5.1", "typescript": "^4.9.0", - "vite": "^3.2.0", - "vue": "^3.2.0", + "vite": "^4.0.0", + "vue": "^3.3.0", "vue-tsc": "^1.0.0" } }, "node_modules/@amap/amap-jsapi-loader": { "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@amap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.1.tgz", + "integrity": "sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw==", "license": "MIT" }, "node_modules/@ampproject/remapping": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "license": "Apache-2.0", @@ -46,9 +48,19 @@ "node": ">=6.0.0" } }, + "node_modules/@antfu/utils": { + "version": "0.7.10", + "resolved": "https://registry.npmmirror.com/@antfu/utils/-/utils-0.7.10.tgz", + "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/@babel/code-frame": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.24.7.tgz", "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, "license": "MIT", @@ -61,9 +73,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", - "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "dev": true, "license": "MIT", "engines": { @@ -72,7 +84,7 @@ }, "node_modules/@babel/core": { "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.25.2.tgz", "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "dev": true, "license": "MIT", @@ -102,14 +114,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -118,9 +130,66 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/generator/node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/generator/node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure/node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-compilation-targets": { "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, "license": "MIT", @@ -135,9 +204,105 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz", + "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.10" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/@babel/helper-globals": { "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "resolved": "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz", "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "dev": true, "license": "MIT", @@ -145,9 +310,37 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-module-imports": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, "license": "MIT", @@ -159,9 +352,23 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-module-imports/node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-module-transforms": { "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, "license": "MIT", @@ -177,252 +384,213 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-string-parser": { + "node_modules/@babel/helper-optimise-call-expression": { "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", + "node_modules/@babel/helper-optimise-call-expression/node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-option": { + "node_modules/@babel/helper-plugin-utils": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/highlight": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", - "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/parser": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", - "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.4" - }, - "bin": { - "parser": "bin/babel-parser.js" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "node_modules/@babel/helper-skip-transparent-expression-wrappers/node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/template/node_modules/@babel/code-frame": { + "node_modules/@babel/helper-string-parser": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", - "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.4", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4", - "debug": "^4.3.1" - }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/@babel/code-frame": { + "node_modules/@babel/helper-validator-option": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.3", + "resolved": "https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/types": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", - "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "node_modules/@babel/helper-wrap-function/node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@dcloudio/types": { - "version": "3.4.22", - "resolved": "https://registry.npmjs.org/@dcloudio/types/-/types-3.4.22.tgz", - "integrity": "sha512-qVDGe+eZW2ONGbMfVn1XDelculyfcXYk3d/Dos+6Pddc3x9SBlQVY5HYoKzJrnIMjnlLJMbckiF5y1EjTFvWPQ==", + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, - "license": "Apache-2.0" + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@dcloudio/uni-automator": { - "version": "3.0.0-alpha-4080220250929001", - "resolved": "https://registry.npmjs.org/@dcloudio/uni-automator/-/uni-automator-3.0.0-alpha-4080220250929001.tgz", - "integrity": "sha512-K54EJ4k0slmIsh0KmliHJdNPPqxiaDWzTiM58Wn98npJAEGvHwh06f1vAsjFlJ++LyoCbWe2QIbUQ8OvkCjlNg==", + "node_modules/@babel/helpers/node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@dcloudio/uni-cli-shared": "3.0.0-alpha-4080220250929001", - "address": "^1.1.2", - "cross-env": "^7.0.3", - "debug": "4.3.7", - "default-gateway": "^6.0.3", - "fs-extra": "10.1.0", - "jsonc-parser": "3.3.1", - "licia": "1.41.1", - "merge": "2.1.1", - "qrcode-reader": "1.0.4", - "qrcode-terminal": "0.12.0", - "ws": "8.18.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, - "peerDependencies": { - "jest": "27.0.4", - "jest-environment-node": "27.5.1" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@dcloudio/uni-cli-shared": { - "version": "3.0.0-alpha-4080220250929001", - "resolved": "https://registry.npmjs.org/@dcloudio/uni-cli-shared/-/uni-cli-shared-3.0.0-alpha-4080220250929001.tgz", - "integrity": "sha512-oMH+rsTpi2ioSYPzqxegGAsyymxA05BD5igYIZcXL1/jX6fJPKMCyPZxNDhYvyTozrD0KkeT5G+p/b99pZ9dbQ==", + "node_modules/@babel/highlight": { + "version": "7.25.9", + "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.25.9.tgz", + "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.1.2", - "@babel/code-frame": "7.24.7", - "@babel/core": "7.25.2", - "@babel/parser": "7.25.6", - "@babel/types": "7.25.6", - "@dcloudio/uni-i18n": "3.0.0-alpha-4080220250929001", - "@dcloudio/uni-shared": "3.0.0-alpha-4080220250929001", - "@intlify/core-base": "9.1.9", - "@intlify/shared": "9.1.9", - "@intlify/vue-devtools": "9.1.9", - "@rollup/pluginutils": "5.1.0", - "@vue/compiler-core": "3.4.21", - "@vue/compiler-dom": "3.4.21", - "@vue/compiler-sfc": "3.4.21", - "@vue/compiler-ssr": "3.4.21", - "@vue/server-renderer": "3.4.21", - "@vue/shared": "3.4.21", - "adm-zip": "0.5.16", - "autoprefixer": "10.4.20", - "base64url": "^3.0.1", - "chokidar": "3.6.0", - "compare-versions": "^3.6.0", - "debug": "4.3.7", - "entities": "^4.5.0", - "es-module-lexer": "1.5.4", - "esbuild": "0.20.2", - "estree-walker": "2.0.2", - "fast-glob": "3.3.3", - "fs-extra": "10.1.0", - "hash-sum": "2.0.0", - "isbinaryfile": "5.0.2", - "jsonc-parser": "3.3.1", - "lines-and-columns": "^2.0.4", - "magic-string": "0.30.11", - "merge": "2.1.1", - "mime": "3.0.0", - "module-alias": "2.2.3", - "os-locale-s-fix": "^1.0.8-fix-1", - "picocolors": "1.1.0", - "postcss-import": "^14.0.2", - "postcss-load-config": "^3.1.1", - "postcss-modules": "^4.3.0", - "postcss-selector-parser": "6.1.2", - "resolve": "1.22.8", - "source-map-js": "1.2.1", - "tapable": "^2.2.0", - "unimport": "4.1.1", - "unplugin-auto-import": "19.1.0", - "xregexp": "3.1.0" + "@babel/helper-validator-identifier": "^7.25.9", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">=6.9.0" } }, - "node_modules/@dcloudio/uni-cli-shared/node_modules/@babel/parser": { + "node_modules/@babel/parser": { "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.25.6.tgz", "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", "dev": true, "license": "MIT", @@ -436,2280 +604,3743 @@ "node": ">=6.0.0" } }, - "node_modules/@dcloudio/uni-cli-shared/node_modules/@babel/types": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@dcloudio/uni-cli-shared/node_modules/@vue/compiler-core": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.21.tgz", - "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==", + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.23.9", - "@vue/shared": "3.4.21", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.0.2" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@dcloudio/uni-cli-shared/node_modules/@vue/compiler-dom": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz", - "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==", + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.4.21", - "@vue/shared": "3.4.21" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@dcloudio/uni-cli-shared/node_modules/@vue/compiler-sfc": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz", - "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.23.9", - "@vue/compiler-core": "3.4.21", - "@vue/compiler-dom": "3.4.21", - "@vue/compiler-ssr": "3.4.21", - "@vue/shared": "3.4.21", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.7", - "postcss": "^8.4.35", - "source-map-js": "^1.0.2" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" } }, - "node_modules/@dcloudio/uni-cli-shared/node_modules/@vue/compiler-ssr": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz", - "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.4.21", - "@vue/shared": "3.4.21" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@dcloudio/uni-cli-shared/node_modules/@vue/server-renderer": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.21.tgz", - "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, "license": "MIT", - "dependencies": { - "@vue/compiler-ssr": "3.4.21", - "@vue/shared": "3.4.21" + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "vue": "3.4.21" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@dcloudio/uni-cli-shared/node_modules/@vue/shared": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.21.tgz", - "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@dcloudio/uni-cli-shared/node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@dcloudio/uni-cli-shared/node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "dev": true, - "license": "ISC" - }, - "node_modules/@dcloudio/uni-components": { - "version": "3.0.0-alpha-3000020210521001", - "resolved": "https://registry.npmjs.org/@dcloudio/uni-components/-/uni-components-3.0.0-alpha-3000020210521001.tgz", - "integrity": "sha512-FxCzOPgOqE5V9owpogIZc0UvvfSlrzL77YVoKFWXB6BRJwAzc2bEpzA0+vUA+2V+RajWN6HrK9/czKjsArTS1A==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@dcloudio/uni-i18n": { - "version": "3.0.0-alpha-4080220250929001", - "resolved": "https://registry.npmjs.org/@dcloudio/uni-i18n/-/uni-i18n-3.0.0-alpha-4080220250929001.tgz", - "integrity": "sha512-HB8K4eg8jl2E4vTTHbEdhu2gPp4nlPbq78kEkxWeXip5VbD8Jfs5NNZI19IaWvfSTVp94F1USud5XSVG9/AW2A==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@dcloudio/uni-shared": { - "version": "3.0.0-alpha-4080220250929001", - "resolved": "https://registry.npmjs.org/@dcloudio/uni-shared/-/uni-shared-3.0.0-alpha-4080220250929001.tgz", - "integrity": "sha512-ZDMgUovxHcDiM41wEZjgdt1XCxfQ0GUuKLeewMFcMpcJrEMKx47nEiVRpJ3ugqgMwue86dPSiiha2U67RUYtbg==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@vue/shared": "3.4.21" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@dcloudio/uni-shared/node_modules/@vue/shared": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.21.tgz", - "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@dcloudio/uni-stacktracey": { - "version": "3.0.0-alpha-4080220250929001", - "resolved": "https://registry.npmjs.org/@dcloudio/uni-stacktracey/-/uni-stacktracey-3.0.0-alpha-4080220250929001.tgz", - "integrity": "sha512-Ba8KXiFnDnvkmVns7bmok/SGdukW9uAimz7MNrJVtVWixOThHZmgexwF1Sv7Vuz+/Rfrz8Bo2wjCYHS36GmXMA==", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@dcloudio/uni-ui": { - "version": "1.5.10", - "license": "Apache-2.0" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@dcloudio/vite-plugin-uni": { - "version": "3.0.0-alpha-3000020210521001", - "resolved": "https://registry.npmjs.org/@dcloudio/vite-plugin-uni/-/vite-plugin-uni-3.0.0-alpha-3000020210521001.tgz", - "integrity": "sha512-wJn71UxgqH55aFEiw0NOGFbEIGpAdp3NPiSPhMTqtJMhZSkQkfN3KnLEWm+/CFBVlqA2TCmjehFeO9U3Z3JQKQ==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@rollup/pluginutils": "^4.1.0", - "autoprefixer": "^10.2.5", - "cac": "^6.7.3", - "chalk": "^4.1.1", - "debug": "^4.3.1", - "estree-walker": "^2.0.1", - "express": "^4.17.1", - "fs-extra": "^9.0.1", - "jsonc-parser": "^3.0.0", - "mime": "^2.5.2", - "module-alias": "^2.2.2", - "postcss-selector-parser": "^6.0.4", - "rollup-plugin-copy": "^3.4.0", - "slash": "^3.0.0" + "@babel/helper-plugin-utils": "^7.27.1" }, - "bin": { - "uni": "bin/uni.js" + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@vitejs/plugin-vue": "^1.2.2", - "@vue/compiler-sfc": "^3.1.0-beta.3", - "@vue/server-renderer": "^3.1.0-beta.3", - "@vue/shared": "^3.1.0-beta.3", - "vite": "^2.3.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@dcloudio/vite-plugin-uni/node_modules/@rollup/pluginutils": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", "dev": true, "license": "MIT", "dependencies": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">= 8.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@dcloudio/vite-plugin-uni/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@dcloudio/vite-plugin-uni/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@dcloudio/vite-plugin-uni/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@dcloudio/vite-plugin-uni/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@dcloudio/vite-plugin-uni/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", "dev": true, "license": "MIT", "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@dcloudio/vite-plugin-uni/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@dcloudio/vite-plugin-uni/node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", + "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", "dev": true, "license": "MIT", - "bin": { - "mime": "cli.js" + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">=4.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@dcloudio/vite-plugin-uni/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", - "cpu": [ - "ppc64" - ], + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "aix" - ], + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", - "cpu": [ - "arm" - ], + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.4" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", - "cpu": [ - "arm" - ], + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", + "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", - "cpu": [ - "ia32" - ], + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", - "cpu": [ - "loong64" - ], + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", - "cpu": [ - "mips64el" - ], + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", - "cpu": [ - "ppc64" - ], + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", - "cpu": [ - "riscv64" - ], + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", - "cpu": [ - "s390x" - ], + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", + "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", + "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], + "dependencies": { + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.5" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", - "cpu": [ - "ia32" - ], + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@intlify/core-base": { - "version": "9.1.9", - "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.1.9.tgz", - "integrity": "sha512-x5T0p/Ja0S8hs5xs+ImKyYckVkL4CzcEXykVYYV6rcbXxJTe2o58IquSqX9bdncVKbRZP7GlBU1EcRaQEEJ+vw==", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", "dev": true, "license": "MIT", "dependencies": { - "@intlify/devtools-if": "9.1.9", - "@intlify/message-compiler": "9.1.9", - "@intlify/message-resolver": "9.1.9", - "@intlify/runtime": "9.1.9", - "@intlify/shared": "9.1.9", - "@intlify/vue-devtools": "9.1.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">= 10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@intlify/devtools-if": { - "version": "9.1.9", - "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.1.9.tgz", - "integrity": "sha512-oKSMKjttG3Ut/1UGEZjSdghuP3fwA15zpDPcjkf/1FjlOIm6uIBGMNS5jXzsZy593u+P/YcnrZD6cD3IVFz9vQ==", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", "dev": true, "license": "MIT", "dependencies": { - "@intlify/shared": "9.1.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">= 10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@intlify/message-compiler": { - "version": "9.1.9", - "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.1.9.tgz", - "integrity": "sha512-6YgCMF46Xd0IH2hMRLCssZI3gFG4aywidoWQ3QP4RGYQXQYYfFC54DxhSgfIPpVoPLQ+4AD29eoYmhiHZ+qLFQ==", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", "dev": true, "license": "MIT", "dependencies": { - "@intlify/message-resolver": "9.1.9", - "@intlify/shared": "9.1.9", - "source-map": "0.6.1" + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.4" }, "engines": { - "node": ">= 10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@intlify/message-resolver": { - "version": "9.1.9", - "resolved": "https://registry.npmjs.org/@intlify/message-resolver/-/message-resolver-9.1.9.tgz", - "integrity": "sha512-Lx/DBpigeK0sz2BBbzv5mu9/dAlt98HxwbG7xLawC3O2xMF9MNWU5FtOziwYG6TDIjNq0O/3ZbOJAxwITIWXEA==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, "engines": { - "node": ">= 10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@intlify/runtime": { - "version": "9.1.9", - "resolved": "https://registry.npmjs.org/@intlify/runtime/-/runtime-9.1.9.tgz", - "integrity": "sha512-XgPw8+UlHCiie3fI41HPVa/VDJb3/aSH7bLhY1hJvlvNV713PFtb4p4Jo+rlE0gAoMsMCGcsiT982fImolSltg==", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", "dev": true, "license": "MIT", "dependencies": { - "@intlify/message-compiler": "9.1.9", - "@intlify/message-resolver": "9.1.9", - "@intlify/shared": "9.1.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">= 10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@intlify/shared": { - "version": "9.1.9", - "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.1.9.tgz", - "integrity": "sha512-xKGM1d0EAxdDFCWedcYXOm6V5Pfw/TMudd6/qCdEb4tv0hk9EKeg7lwQF1azE0dP2phvx0yXxrt7UQK+IZjNdw==", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", + "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, "engines": { - "node": ">= 10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@intlify/vue-devtools": { - "version": "9.1.9", - "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.1.9.tgz", - "integrity": "sha512-YPehH9uL4vZcGXky4Ev5qQIITnHKIvsD2GKGXgqf+05osMUI6WSEQHaN9USRa318Rs8RyyPCiDfmA0hRu3k7og==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", "dev": true, "license": "MIT", "dependencies": { - "@intlify/message-resolver": "9.1.9", - "@intlify/runtime": "9.1.9", - "@intlify/shared": "9.1.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">= 10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@qiun/ucharts": { - "version": "2.5.0-20230101", - "license": "Apache" - }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { - "node": ">=14.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/fs-extra": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", - "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", "dev": true, "license": "MIT", "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.6.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.6.2.tgz", - "integrity": "sha512-d2L25Y4j+W3ZlNAeMKcy7yDsK425ibcAOO2t7aPTz6gNMH0z2GThtwENCDc0d/Pw9wgyRqE5Px1wkV7naz8ang==", + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.13.0" - } - }, - "node_modules/@vitejs/plugin-vue": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.6.2.tgz", - "integrity": "sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==", - "dev": true, - "license": "MIT", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "vite": "^4.0.0 || ^5.0.0", - "vue": "^3.2.25" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@volar/language-core": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.11.1.tgz", - "integrity": "sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==", + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.5.tgz", + "integrity": "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==", "dev": true, "license": "MIT", "dependencies": { - "@volar/source-map": "1.11.1" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@volar/source-map": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.11.1.tgz", - "integrity": "sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==", + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", "dev": true, "license": "MIT", "dependencies": { - "muggle-string": "^0.3.1" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@volar/typescript": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.11.1.tgz", - "integrity": "sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==", + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", "dev": true, "license": "MIT", "dependencies": { - "@volar/language-core": "1.11.1", - "path-browserify": "^1.0.1" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@vue/compiler-core": { - "version": "3.5.18", + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.0", - "@vue/shared": "3.5.18", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.18", + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.18", - "@vue/shared": "3.5.18" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.18", + "node_modules/@babel/preset-env": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.28.5.tgz", + "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.0", - "@vue/compiler-core": "3.5.18", - "@vue/compiler-dom": "3.5.18", - "@vue/compiler-ssr": "3.5.18", - "@vue/shared": "3.5.18", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.17", - "postcss": "^8.5.6", - "source-map-js": "^1.2.1" + "@babel/compat-data": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.5", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.4", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.28.5", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.28.5", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.4", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.4", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.18", + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.18", - "@vue/shared": "3.5.18" - } - }, - "node_modules/@vue/devtools-api": { - "version": "7.7.7", - "license": "MIT", - "dependencies": { - "@vue/devtools-kit": "^7.7.7" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@vue/devtools-kit": { - "version": "7.7.7", + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, "license": "MIT", "dependencies": { - "@vue/devtools-shared": "^7.7.7", - "birpc": "^2.3.0", - "hookable": "^5.5.3", - "mitt": "^3.0.1", - "perfect-debounce": "^1.0.0", - "speakingurl": "^14.0.1", - "superjson": "^2.2.2" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@vue/devtools-shared": { - "version": "7.7.7", + "node_modules/@babel/template/node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, "license": "MIT", "dependencies": { - "rfdc": "^1.4.1" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@vue/language-core": { - "version": "1.8.27", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.27.tgz", - "integrity": "sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==", + "node_modules/@babel/template/node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "dev": true, "license": "MIT", "dependencies": { - "@volar/language-core": "~1.11.1", - "@volar/source-map": "~1.11.1", - "@vue/compiler-dom": "^3.3.0", - "@vue/shared": "^3.3.0", - "computeds": "^0.0.1", - "minimatch": "^9.0.3", - "muggle-string": "^0.3.1", - "path-browserify": "^1.0.1", - "vue-template-compiler": "^2.7.14" + "@babel/types": "^7.28.5" }, - "peerDependencies": { - "typescript": "*" + "bin": { + "parser": "bin/babel-parser.js" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@vue/language-core/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "node_modules/@babel/template/node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@vue/language-core/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=6.9.0" } }, - "node_modules/@vue/reactivity": { - "version": "3.5.18", + "node_modules/@babel/template/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "dev": true, "license": "MIT", "dependencies": { - "@vue/shared": "3.5.18" + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@vue/runtime-core": { - "version": "3.5.18", + "node_modules/@babel/traverse/node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.18", - "@vue/shared": "3.5.18" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.18", + "node_modules/@babel/traverse/node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "dev": true, "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.18", - "@vue/runtime-core": "3.5.18", - "@vue/shared": "3.5.18", - "csstype": "^3.1.3" + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@vue/server-renderer": { - "version": "3.5.18", + "node_modules/@babel/traverse/node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.18", - "@vue/shared": "3.5.18" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, - "peerDependencies": { - "vue": "3.5.18" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@vue/shared": { - "version": "3.5.18", + "node_modules/@babel/traverse/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/@babel/types": { + "version": "7.25.6", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@dcloudio/types": { + "version": "3.4.28", + "resolved": "https://registry.npmmirror.com/@dcloudio/types/-/types-3.4.28.tgz", + "integrity": "sha512-uVIRp1VLBkrL0LaGLgIS/sT3bl1zzVTKZQbfqJEQcSAvBffRdirbSh5OvOHfA1WV5lmCAGfjhKsUQouNEVUQHg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@dcloudio/uni-automator": { + "version": "3.0.0-alpha-4080420251023001", + "resolved": "https://registry.npmmirror.com/@dcloudio/uni-automator/-/uni-automator-3.0.0-alpha-4080420251023001.tgz", + "integrity": "sha512-3kjVFTJvu+Kpn0UtgemwwPMfAqQpOVoy20WTubFrJraHOfExnJ0Xz+3aVy+47W4nPn5BaP1xvC+T0pGwDEtqnA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@dcloudio/uni-cli-shared": "3.0.0-alpha-4080420251023001", + "address": "^1.1.2", + "cross-env": "^7.0.3", + "debug": "4.3.7", + "default-gateway": "^6.0.3", + "fs-extra": "10.1.0", + "jsonc-parser": "3.3.1", + "licia": "1.41.1", + "merge": "2.1.1", + "qrcode-reader": "1.0.4", + "qrcode-terminal": "0.12.0", + "ws": "8.18.0" + }, + "peerDependencies": { + "jest": "27.0.4", + "jest-environment-node": "27.5.1" + } + }, + "node_modules/@dcloudio/uni-cli-shared": { + "version": "3.0.0-alpha-4080420251023001", + "resolved": "https://registry.npmmirror.com/@dcloudio/uni-cli-shared/-/uni-cli-shared-3.0.0-alpha-4080420251023001.tgz", + "integrity": "sha512-tOxDCqAZzQuMEcw8Q/HuZGBySdAELJfvGB3NgSXrVkw9dDdqLbRMNRyvG+NF38jAKe/LlnDpuXCAwot5AXwghw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@ampproject/remapping": "^2.1.2", + "@babel/code-frame": "7.24.7", + "@babel/core": "7.25.2", + "@babel/parser": "7.25.6", + "@babel/types": "7.25.6", + "@dcloudio/uni-i18n": "3.0.0-alpha-4080420251023001", + "@dcloudio/uni-shared": "3.0.0-alpha-4080420251023001", + "@intlify/core-base": "9.1.9", + "@intlify/shared": "9.1.9", + "@intlify/vue-devtools": "9.1.9", + "@rollup/pluginutils": "5.1.0", + "@vue/compiler-core": "3.4.21", + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-sfc": "3.4.21", + "@vue/compiler-ssr": "3.4.21", + "@vue/server-renderer": "3.4.21", + "@vue/shared": "3.4.21", + "adm-zip": "0.5.16", + "autoprefixer": "10.4.20", + "base64url": "^3.0.1", + "chokidar": "3.6.0", + "compare-versions": "^3.6.0", + "debug": "4.3.7", + "entities": "^4.5.0", + "es-module-lexer": "1.5.4", + "esbuild": "0.20.2", + "estree-walker": "2.0.2", + "fast-glob": "3.3.3", + "fs-extra": "10.1.0", + "hash-sum": "2.0.0", + "isbinaryfile": "5.0.2", + "jsonc-parser": "3.3.1", + "lines-and-columns": "^2.0.4", + "magic-string": "0.30.11", + "merge": "2.1.1", + "mime": "3.0.0", + "module-alias": "2.2.3", + "os-locale-s-fix": "^1.0.8-fix-1", + "picocolors": "1.1.0", + "postcss-import": "^14.0.2", + "postcss-load-config": "^3.1.1", + "postcss-modules": "^4.3.0", + "postcss-selector-parser": "6.1.2", + "resolve": "1.22.8", + "source-map-js": "1.2.1", + "tapable": "^2.2.0", + "unimport": "4.1.1", + "unplugin-auto-import": "19.1.0", + "xregexp": "3.1.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + } + }, + "node_modules/@dcloudio/uni-cli-shared/node_modules/@vue/compiler-sfc": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz", + "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.23.9", + "@vue/compiler-core": "3.4.21", + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.7", + "postcss": "^8.4.35", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@dcloudio/uni-cli-shared/node_modules/@vue/server-renderer": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.21.tgz", + "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21" + }, + "peerDependencies": { + "vue": "3.4.21" + } + }, + "node_modules/@dcloudio/uni-cli-shared/node_modules/@vue/shared": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.21.tgz", + "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@dcloudio/uni-cli-shared/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@dcloudio/uni-cli-shared/node_modules/unplugin-auto-import": { + "version": "19.1.0", + "resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-19.1.0.tgz", + "integrity": "sha512-B+TGBEBHqY9aR+7YfShfLujETOHstzpV+yaqgy5PkfV0QG7Py+TYMX7vJ9W4SrysHR+UzR+gzcx/nuZjmPeclA==", + "dev": true, + "license": "MIT", + "dependencies": { + "local-pkg": "^1.0.0", + "magic-string": "^0.30.17", + "picomatch": "^4.0.2", + "unimport": "^4.1.1", + "unplugin": "^2.2.0", + "unplugin-utils": "^0.2.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@nuxt/kit": "^3.2.2", + "@vueuse/core": "*" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "@vueuse/core": { + "optional": true + } + } + }, + "node_modules/@dcloudio/uni-cli-shared/node_modules/unplugin-auto-import/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/@dcloudio/uni-components": { + "version": "3.0.0-alpha-3000020210521001", + "resolved": "https://registry.npmmirror.com/@dcloudio/uni-components/-/uni-components-3.0.0-alpha-3000020210521001.tgz", + "integrity": "sha512-FxCzOPgOqE5V9owpogIZc0UvvfSlrzL77YVoKFWXB6BRJwAzc2bEpzA0+vUA+2V+RajWN6HrK9/czKjsArTS1A==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@dcloudio/uni-i18n": { + "version": "3.0.0-alpha-4080420251023001", + "resolved": "https://registry.npmmirror.com/@dcloudio/uni-i18n/-/uni-i18n-3.0.0-alpha-4080420251023001.tgz", + "integrity": "sha512-Z3mzznQGJJiQlTcsFHryTHH3+iRCcwcpSVryEAxcKofm7H8+UkyF3+cGty/fVZbYEZco4yRZ6HzpxpaJ2z7kXg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@dcloudio/uni-shared": { + "version": "3.0.0-alpha-4080420251023001", + "resolved": "https://registry.npmmirror.com/@dcloudio/uni-shared/-/uni-shared-3.0.0-alpha-4080420251023001.tgz", + "integrity": "sha512-JXqSGsceqVDDalTZuD4n+ISjfBt5Gfb/8iGxDQZiLLbrugZYWhQPur8bxHxfVoukL7lFzXYhSgaJ5kcOhlit8g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@vue/shared": "3.4.21" + } + }, + "node_modules/@dcloudio/uni-shared/node_modules/@vue/shared": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.21.tgz", + "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@dcloudio/uni-stacktracey": { + "version": "3.0.0-alpha-4080420251023001", + "resolved": "https://registry.npmmirror.com/@dcloudio/uni-stacktracey/-/uni-stacktracey-3.0.0-alpha-4080420251023001.tgz", + "integrity": "sha512-5gVNrWqRIvB5zEEXiFiuZ9BLVa7O0ilWODXd+1PqsldZabVxkA7/W8/MV4i/ilIFD04tsErkTmmxJ6wOyd7NKA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@dcloudio/uni-ui": { + "version": "1.5.11", + "resolved": "https://registry.npmmirror.com/@dcloudio/uni-ui/-/uni-ui-1.5.11.tgz", + "integrity": "sha512-DBtk046ofmeFd82zRI7d89SoEwrAxYzUN3WVPm1DIBkpLPG5F5QDNkHMnZGu2wNrMEmGBjBpUh3vqEY1L3jaMw==", + "license": "Apache-2.0" + }, + "node_modules/@dcloudio/vite-plugin-uni": { + "version": "3.0.0-4020920240930001", + "resolved": "https://registry.npmmirror.com/@dcloudio/vite-plugin-uni/-/vite-plugin-uni-3.0.0-4020920240930001.tgz", + "integrity": "sha512-ZtV5x4Jj8d2FzaK8uamYdfYwzRbMseWY3l6MTUdc94uMNIvnb2fBhJccoY3xexSDYRFRElPKk7+ed6AQ7tYtuw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@babel/core": "^7.23.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.23.3", + "@dcloudio/uni-cli-shared": "3.0.0-4020920240930001", + "@dcloudio/uni-shared": "3.0.0-4020920240930001", + "@rollup/pluginutils": "^5.0.5", + "@vitejs/plugin-legacy": "5.3.2", + "@vitejs/plugin-vue": "5.1.0", + "@vitejs/plugin-vue-jsx": "3.1.0", + "@vue/compiler-core": "3.4.21", + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-sfc": "3.4.21", + "@vue/shared": "3.4.21", + "cac": "6.7.9", + "debug": "^4.3.3", + "estree-walker": "^2.0.2", + "express": "^4.17.1", + "fast-glob": "^3.2.11", + "fs-extra": "^10.0.0", + "hash-sum": "^2.0.0", + "jsonc-parser": "^3.2.0", + "magic-string": "^0.30.7", + "picocolors": "^1.0.0", + "terser": "^5.4.0", + "unplugin-auto-import": "^0.16.7" + }, + "bin": { + "uni": "bin/uni.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^5.2.8" + } + }, + "node_modules/@dcloudio/vite-plugin-uni/node_modules/@dcloudio/uni-cli-shared": { + "version": "3.0.0-4020920240930001", + "resolved": "https://registry.npmmirror.com/@dcloudio/uni-cli-shared/-/uni-cli-shared-3.0.0-4020920240930001.tgz", + "integrity": "sha512-DpKcXXtAiyZXX8WxDSSRjl/PuTYFPBvWDcS7UfWR3Vw13gM3TUEu3WPl1URgGlxmwr30x5YLv6ZA6UoXSZ6MNw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@ampproject/remapping": "^2.1.2", + "@babel/code-frame": "^7.23.5", + "@babel/core": "^7.23.3", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.20.7", + "@dcloudio/uni-i18n": "3.0.0-4020920240930001", + "@dcloudio/uni-shared": "3.0.0-4020920240930001", + "@intlify/core-base": "9.1.9", + "@intlify/shared": "9.1.9", + "@intlify/vue-devtools": "9.1.9", + "@rollup/pluginutils": "^5.0.5", + "@vue/compiler-core": "3.4.21", + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-sfc": "3.4.21", + "@vue/compiler-ssr": "3.4.21", + "@vue/server-renderer": "3.4.21", + "@vue/shared": "3.4.21", + "adm-zip": "^0.5.12", + "autoprefixer": "^10.4.19", + "base64url": "^3.0.1", + "chokidar": "^3.5.3", + "compare-versions": "^3.6.0", + "debug": "^4.3.3", + "es-module-lexer": "^1.2.1", + "esbuild": "^0.20.1", + "estree-walker": "^2.0.2", + "fast-glob": "^3.2.11", + "fs-extra": "^10.0.0", + "hash-sum": "^2.0.0", + "isbinaryfile": "^5.0.2", + "jsonc-parser": "^3.2.0", + "lines-and-columns": "^2.0.4", + "magic-string": "^0.30.7", + "merge": "^2.1.1", + "mime": "^3.0.0", + "module-alias": "^2.2.2", + "os-locale-s-fix": "^1.0.8-fix-1", + "picocolors": "^1.0.0", + "postcss-import": "^14.0.2", + "postcss-load-config": "^3.1.1", + "postcss-modules": "^4.3.0", + "postcss-selector-parser": "^6.0.6", + "resolve": "^1.22.1", + "source-map-js": "^1.0.2", + "tapable": "^2.2.0", + "unplugin-auto-import": "^0.16.7", + "xregexp": "3.1.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + } + }, + "node_modules/@dcloudio/vite-plugin-uni/node_modules/@dcloudio/uni-i18n": { + "version": "3.0.0-4020920240930001", + "resolved": "https://registry.npmmirror.com/@dcloudio/uni-i18n/-/uni-i18n-3.0.0-4020920240930001.tgz", + "integrity": "sha512-ltKiciML0ptWRytvbFt1dd4YglEjh4fsUc0D/dY+y5YKNxK7h/V2HT3qkQtP05T1kjEput4KrWNn23fczO3YFg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@dcloudio/vite-plugin-uni/node_modules/@dcloudio/uni-shared": { + "version": "3.0.0-4020920240930001", + "resolved": "https://registry.npmmirror.com/@dcloudio/uni-shared/-/uni-shared-3.0.0-4020920240930001.tgz", + "integrity": "sha512-8EEQAaY+Y9BRCZIqpoaI7ciQFTO/sggxPO1kJNVAkxvJs/GVb4mawPlW9UNsMiWEqRvOJlV7KldCu6eMYlyyfg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@vue/shared": "3.4.21" + } + }, + "node_modules/@dcloudio/vite-plugin-uni/node_modules/@vitejs/plugin-vue": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.1.0.tgz", + "integrity": "sha512-QMRxARyrdiwi1mj3AW4fLByoHTavreXq0itdEW696EihXglf1MB3D4C2gBvE0jMPH29ZjC3iK8aIaUMLf4EOGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@dcloudio/vite-plugin-uni/node_modules/@vue/compiler-sfc": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz", + "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.23.9", + "@vue/compiler-core": "3.4.21", + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.7", + "postcss": "^8.4.35", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@dcloudio/vite-plugin-uni/node_modules/@vue/server-renderer": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.21.tgz", + "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21" + }, + "peerDependencies": { + "vue": "3.4.21" + } + }, + "node_modules/@dcloudio/vite-plugin-uni/node_modules/@vue/shared": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.21.tgz", + "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@intlify/core-base": { + "version": "9.1.9", + "resolved": "https://registry.npmmirror.com/@intlify/core-base/-/core-base-9.1.9.tgz", + "integrity": "sha512-x5T0p/Ja0S8hs5xs+ImKyYckVkL4CzcEXykVYYV6rcbXxJTe2o58IquSqX9bdncVKbRZP7GlBU1EcRaQEEJ+vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@intlify/devtools-if": "9.1.9", + "@intlify/message-compiler": "9.1.9", + "@intlify/message-resolver": "9.1.9", + "@intlify/runtime": "9.1.9", + "@intlify/shared": "9.1.9", + "@intlify/vue-devtools": "9.1.9" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@intlify/devtools-if": { + "version": "9.1.9", + "resolved": "https://registry.npmmirror.com/@intlify/devtools-if/-/devtools-if-9.1.9.tgz", + "integrity": "sha512-oKSMKjttG3Ut/1UGEZjSdghuP3fwA15zpDPcjkf/1FjlOIm6uIBGMNS5jXzsZy593u+P/YcnrZD6cD3IVFz9vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@intlify/shared": "9.1.9" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@intlify/message-compiler": { + "version": "9.1.9", + "resolved": "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-9.1.9.tgz", + "integrity": "sha512-6YgCMF46Xd0IH2hMRLCssZI3gFG4aywidoWQ3QP4RGYQXQYYfFC54DxhSgfIPpVoPLQ+4AD29eoYmhiHZ+qLFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@intlify/message-resolver": "9.1.9", + "@intlify/shared": "9.1.9", + "source-map": "0.6.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@intlify/message-resolver": { + "version": "9.1.9", + "resolved": "https://registry.npmmirror.com/@intlify/message-resolver/-/message-resolver-9.1.9.tgz", + "integrity": "sha512-Lx/DBpigeK0sz2BBbzv5mu9/dAlt98HxwbG7xLawC3O2xMF9MNWU5FtOziwYG6TDIjNq0O/3ZbOJAxwITIWXEA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@intlify/runtime": { + "version": "9.1.9", + "resolved": "https://registry.npmmirror.com/@intlify/runtime/-/runtime-9.1.9.tgz", + "integrity": "sha512-XgPw8+UlHCiie3fI41HPVa/VDJb3/aSH7bLhY1hJvlvNV713PFtb4p4Jo+rlE0gAoMsMCGcsiT982fImolSltg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@intlify/message-compiler": "9.1.9", + "@intlify/message-resolver": "9.1.9", + "@intlify/shared": "9.1.9" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@intlify/shared": { + "version": "9.1.9", + "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.1.9.tgz", + "integrity": "sha512-xKGM1d0EAxdDFCWedcYXOm6V5Pfw/TMudd6/qCdEb4tv0hk9EKeg7lwQF1azE0dP2phvx0yXxrt7UQK+IZjNdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@intlify/vue-devtools": { + "version": "9.1.9", + "resolved": "https://registry.npmmirror.com/@intlify/vue-devtools/-/vue-devtools-9.1.9.tgz", + "integrity": "sha512-YPehH9uL4vZcGXky4Ev5qQIITnHKIvsD2GKGXgqf+05osMUI6WSEQHaN9USRa318Rs8RyyPCiDfmA0hRu3k7og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@intlify/message-resolver": "9.1.9", + "@intlify/runtime": "9.1.9", + "@intlify/shared": "9.1.9" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@qiun/ucharts": { + "version": "2.5.0-20230101", + "resolved": "https://registry.npmmirror.com/@qiun/ucharts/-/ucharts-2.5.0-20230101.tgz", + "integrity": "sha512-C7ccBgfPuGF6dxTRuMW0NPPMSCf1k/kh3I9zkRVBc5PaivudX/rPL+jd2Wty6gn5ya5L3Ob+YmYe09V5xw66Cw==", + "license": "Apache" + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, - "node_modules/@vue/tsconfig": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.5.1.tgz", - "integrity": "sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==", + "node_modules/@vitejs/plugin-legacy": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-legacy/-/plugin-legacy-5.3.2.tgz", + "integrity": "sha512-8moCOrIMaZ/Rjln0Q6GsH6s8fAt1JOI3k8nmfX4tXUxE5KAExVctSyOBk+A25GClsdSWqIk2yaUthH3KJ2X4tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/preset-env": "^7.23.9", + "browserslist": "^4.23.0", + "browserslist-to-esbuild": "^2.1.1", + "core-js": "^3.36.0", + "magic-string": "^0.30.7", + "regenerator-runtime": "^0.14.1", + "systemjs": "^6.14.3" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "peerDependencies": { + "terser": "^5.4.0", + "vite": "^5.0.0" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.6.2.tgz", + "integrity": "sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0 || ^5.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitejs/plugin-vue-jsx": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.1.0.tgz", + "integrity": "sha512-w9M6F3LSEU5kszVb9An2/MmXNxocAnUb3WhRr8bHlimhDrXNt6n6D2nJQR3UXpGlZHh/EsgouOHCsM8V3Ln+WA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.3", + "@babel/plugin-transform-typescript": "^7.23.3", + "@vue/babel-plugin-jsx": "^1.1.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0 || ^5.0.0", + "vue": "^3.0.0" + } + }, + "node_modules/@volar/language-core": { + "version": "1.11.1", + "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-1.11.1.tgz", + "integrity": "sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "1.11.1" + } + }, + "node_modules/@volar/source-map": { + "version": "1.11.1", + "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-1.11.1.tgz", + "integrity": "sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "muggle-string": "^0.3.1" + } + }, + "node_modules/@volar/typescript": { + "version": "1.11.1", + "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-1.11.1.tgz", + "integrity": "sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "1.11.1", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.5.0.tgz", + "integrity": "sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==", "dev": true, "license": "MIT" }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.5.0.tgz", + "integrity": "sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==", "dev": true, "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.2", + "@vue/babel-helper-vue-transform-on": "1.5.0", + "@vue/babel-plugin-resolve-type": "1.5.0", + "@vue/shared": "^3.5.18" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-jsx/node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { - "node": ">= 0.6" + "node": ">=6.9.0" } }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.5.0.tgz", + "integrity": "sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/parser": "^7.28.0", + "@vue/compiler-sfc": "^3.5.18" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-plugin-resolve-type/node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@vue/babel-plugin-resolve-type/node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, "bin": { - "acorn": "bin/acorn" + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=0.4.0" + "node": ">=6.0.0" + } + }, + "node_modules/@vue/babel-plugin-resolve-type/node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@vue/babel-plugin-resolve-type/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vue/compiler-core": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.4.21.tgz", + "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.23.9", + "@vue/shared": "3.4.21", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-core/node_modules/@vue/shared": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.21.tgz", + "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/compiler-dom": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz", + "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/compiler-dom/node_modules/@vue/shared": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.21.tgz", + "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.22", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.22.tgz", + "integrity": "sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "@vue/compiler-core": "3.5.22", + "@vue/compiler-dom": "3.5.22", + "@vue/compiler-ssr": "3.5.22", + "@vue/shared": "3.5.22", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.19", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/@vue/compiler-core": { + "version": "3.5.22", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.22.tgz", + "integrity": "sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "@vue/shared": "3.5.22", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/@vue/compiler-dom": { + "version": "3.5.22", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.22.tgz", + "integrity": "sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.22", + "@vue/shared": "3.5.22" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/@vue/compiler-ssr": { + "version": "3.5.22", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.22.tgz", + "integrity": "sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.22", + "@vue/shared": "3.5.22" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz", + "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/compiler-ssr/node_modules/@vue/shared": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.21.tgz", + "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.7", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-7.7.7.tgz", + "integrity": "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.7" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.7", + "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz", + "integrity": "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.7", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" } }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "dev": true, + "node_modules/@vue/devtools-shared": { + "version": "7.7.7", + "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz", + "integrity": "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==", "license": "MIT", - "engines": { - "node": ">= 10.0.0" + "dependencies": { + "rfdc": "^1.4.1" } }, - "node_modules/adm-zip": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", - "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", + "node_modules/@vue/language-core": { + "version": "1.8.27", + "resolved": "https://registry.npmmirror.com/@vue/language-core/-/language-core-1.8.27.tgz", + "integrity": "sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12.0" + "dependencies": { + "@volar/language-core": "~1.11.1", + "@volar/source-map": "~1.11.1", + "@vue/compiler-dom": "^3.3.0", + "@vue/shared": "^3.3.0", + "computeds": "^0.0.1", + "minimatch": "^9.0.3", + "muggle-string": "^0.3.1", + "path-browserify": "^1.0.1", + "vue-template-compiler": "^2.7.14" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@vue/language-core/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" + "balanced-match": "^1.0.0" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "node_modules/@vue/language-core/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">= 8" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "node_modules/@vue/reactivity": { + "version": "3.5.22", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.22.tgz", + "integrity": "sha512-f2Wux4v/Z2pqc9+4SmgZC1p73Z53fyD90NFWXiX9AKVnVBEvLFOWCEgJD3GdGnlxPZt01PSlfmLqbLYzY/Fw4A==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.22" + } }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/@vue/runtime-core": { + "version": "3.5.22", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.22.tgz", + "integrity": "sha512-EHo4W/eiYeAzRTN5PCextDUZ0dMs9I8mQ2Fy+OkzvRPUYQEyK9yAjbasrMCXbLNhF7P0OUyivLjIy0yc6VrLJQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "@vue/reactivity": "3.5.22", + "@vue/shared": "3.5.22" } }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "node_modules/@vue/runtime-dom": { + "version": "3.5.22", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.22.tgz", + "integrity": "sha512-Av60jsryAkI023PlN7LsqrfPvwfxOd2yAwtReCjeuugTJTkgrksYJJstg1e12qle0NarkfhfFu1ox2D+cQotww==", "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.22", + "@vue/runtime-core": "3.5.22", + "@vue/shared": "3.5.22", + "csstype": "^3.1.3" } }, - "node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "node_modules/@vue/server-renderer": { + "version": "3.5.22", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.22.tgz", + "integrity": "sha512-gXjo+ao0oHYTSswF+a3KRHZ1WszxIqO7u6XwNHqcqb9JfyIL/pbWrrh/xLv7jeDqla9u+LK7yfZKHih1e1RKAQ==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", "dependencies": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" + "@vue/compiler-ssr": "3.5.22", + "@vue/shared": "3.5.22" }, "peerDependencies": { - "postcss": "^8.1.0" + "vue": "3.5.22" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/base64url": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", - "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", + "node_modules/@vue/server-renderer/node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, "engines": { "node": ">=6.0.0" } }, - "node_modules/baseline-browser-mapping": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.12.tgz", - "integrity": "sha512-vAPMQdnyKCBtkmQA6FMCBvU9qFIppS3nzyXnEM+Lo2IAhG4Mpjv9cCxMudhgV3YdNNJv6TNqXy97dfRVL2LmaQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "node_modules/@vue/server-renderer/node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/birpc": { - "version": "2.5.0", + "node_modules/@vue/server-renderer/node_modules/@vue/compiler-core": { + "version": "3.5.22", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.22.tgz", + "integrity": "sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==", + "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" + "dependencies": { + "@babel/parser": "^7.28.4", + "@vue/shared": "3.5.22", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" } }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "node_modules/@vue/server-renderer/node_modules/@vue/compiler-dom": { + "version": "3.5.22", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.22.tgz", + "integrity": "sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==", "dev": true, "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "@vue/compiler-core": "3.5.22", + "@vue/shared": "3.5.22" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@vue/server-renderer/node_modules/@vue/compiler-ssr": { + "version": "3.5.22", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.22.tgz", + "integrity": "sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==", "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "@vue/compiler-dom": "3.5.22", + "@vue/shared": "3.5.22" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "node_modules/@vue/shared": { + "version": "3.5.22", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.22.tgz", + "integrity": "sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==", "dev": true, "license": "MIT" }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/@vue/tsconfig": { + "version": "0.5.1", + "resolved": "https://registry.npmmirror.com/@vue/tsconfig/-/tsconfig-0.5.1.tgz", + "integrity": "sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==", "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "license": "MIT" }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "license": "MIT", "dependencies": { - "fill-range": "^7.1.1" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/browserslist": { - "version": "4.26.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", - "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.8.9", - "caniuse-lite": "^1.0.30001746", - "electron-to-chromium": "^1.5.227", - "node-releases": "^2.0.21", - "update-browserslist-db": "^1.1.3" - }, "bin": { - "browserslist": "cli.js" + "acorn": "bin/acorn" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=0.4.0" } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">= 10.0.0" } }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "node_modules/adm-zip": { + "version": "0.5.16", + "resolved": "https://registry.npmmirror.com/adm-zip/-/adm-zip-0.5.16.tgz", + "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12.0" } }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" + "color-convert": "^1.9.0" }, "engines": { - "node": ">= 0.4" + "node": ">=4" } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 8" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001747", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001747.tgz", - "integrity": "sha512-mzFa2DGIhuc5490Nd/G31xN1pnBnYMadtkyTjefPI7wzypqgCEpeWu9bJr0OnDsyKrW75zA9ZAt7pbQFmwLsQg==", + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "funding": [ { "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "url": "https://opencollective.com/postcss/" }, { "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + "url": "https://tidelift.com/funding/github/npm/autoprefixer" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" }, "engines": { - "node": ">=4" + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.14", + "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", "dev": true, "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", + "semver": "^6.3.1" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "dev": true, - "license": "MIT" - }, - "node_modules/compare-versions": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", - "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/computeds": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz", - "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.5", + "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "5.2.1" + "@babel/helper-define-polyfill-provider": "^0.6.5" }, - "engines": { - "node": ">= 0.6" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=6.0.0" } }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "node_modules/baseline-browser-mapping": { + "version": "2.8.23", + "resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.8.23.tgz", + "integrity": "sha512-616V5YX4bepJFzNyOfce5Fa8fDJMfoxzOIzDCZwaGL8MKVpFrXqfNUoIpRn9YMI5pXf/VKgzjB4htFMsFKKdiQ==", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true, - "license": "MIT" + "node_modules/birpc": { + "version": "2.6.1", + "resolved": "https://registry.npmmirror.com/birpc/-/birpc-2.6.1.tgz", + "integrity": "sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } }, - "node_modules/copy-anything": { - "version": "3.0.5", + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, "license": "MIT", "dependencies": { - "is-what": "^4.1.8" + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" + "ms": "2.0.0" } }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "fill-range": "^7.1.1" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "node_modules/browserslist": { + "version": "4.27.0", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.27.0.tgz", + "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.19", + "caniuse-lite": "^1.0.30001751", + "electron-to-chromium": "^1.5.238", + "node-releases": "^2.0.26", + "update-browserslist-db": "^1.1.4" + }, "bin": { - "cssesc": "bin/cssesc" + "browserslist": "cli.js" }, "engines": { - "node": ">=4" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/csstype": { - "version": "3.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "node_modules/browserslist-to-esbuild": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/browserslist-to-esbuild/-/browserslist-to-esbuild-2.1.1.tgz", + "integrity": "sha512-KN+mty6C3e9AN8Z5dI1xeN15ExcRNeISoC3g7V0Kax/MMF9MSoYA2G7lkTTcVUFntiEjkpI0HNgqJC1NjdyNUw==", "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "meow": "^13.0.0" + }, + "bin": { + "browserslist-to-esbuild": "cli/index.js" }, "engines": { - "node": ">=6.0" + "node": ">=18" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "peerDependencies": { + "browserslist": "*" } }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } + "license": "MIT" }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/cac": { + "version": "6.7.9", + "resolved": "https://registry.npmmirror.com/cac/-/cac-6.7.9.tgz", + "integrity": "sha512-XN5qEpfNQCJ8jRaZgitSkkukjMRCGio+X3Ks5KUbGGlPbV+pSem1l9VuzooCBXOiMFshUZgyYqg6rgN8rjkb/w==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=8" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, "license": "MIT", "dependencies": { - "path-type": "^4.0.0" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true, - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.230", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.230.tgz", - "integrity": "sha512-A6A6Fd3+gMdaed9wX83CvHYJb4UuapPD5X5SLq72VZJzxHSY0/LUweGXRWmQlh2ln7KV7iw7jnwXK7dlPoOnHQ==", + "node_modules/caniuse-lite": { + "version": "1.0.30001753", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001753.tgz", + "integrity": "sha512-Bj5H35MD/ebaOV4iDLqPEtiliTN29qkGtEHCwawWn4cYm+bPJM2NsaP30vtZcnERClMzp52J4+aw2UNbK4o+zw==", "dev": true, - "license": "ISC" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=4" } }, - "node_modules/entities": { - "version": "4.5.0", + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, "engines": { - "node": ">=0.12" + "node": ">= 8.10.0" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "color-name": "1.1.3" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } + "license": "MIT" }, - "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, "license": "MIT" }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "node_modules/compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } + "license": "MIT" }, - "node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "node_modules/computeds": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/computeds/-/computeds-0.0.1.tgz", + "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, - "hasInstallScript": true, "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" + "dependencies": { + "safe-buffer": "5.2.1" }, "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" + "node": ">= 0.6" } }, - "node_modules/esbuild-android-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", - "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", - "cpu": [ - "x64" - ], + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=12" + "node": ">= 0.6" } }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", - "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", - "cpu": [ - "arm64" - ], + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } + "license": "MIT" }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", - "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", - "cpu": [ - "x64" - ], + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">=12" + "node": ">= 0.6" } }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", - "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", - "cpu": [ - "arm64" - ], + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true, + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-4.0.5.tgz", + "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "is-what": "^5.2.0" + }, "engines": { - "node": ">=12" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" } }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", - "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", - "cpu": [ - "x64" - ], + "node_modules/core-js": { + "version": "3.46.0", + "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.46.0.tgz", + "integrity": "sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", - "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", - "cpu": [ - "arm64" - ], + "node_modules/core-js-compat": { + "version": "3.46.0", + "resolved": "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.46.0.tgz", + "integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" + "dependencies": { + "browserslist": "^4.26.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/esbuild-linux-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", - "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", - "cpu": [ - "ia32" - ], + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, "engines": { - "node": ">=12" + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" } }, - "node_modules/esbuild-linux-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", - "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", - "cpu": [ - "x64" - ], + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, "engines": { - "node": ">=12" + "node": ">= 8" } }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", - "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", - "cpu": [ - "arm" - ], + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "bin": { + "cssesc": "bin/cssesc" + }, "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", - "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", - "cpu": [ - "arm64" - ], + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">=12" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", - "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", - "cpu": [ - "mips64el" - ], + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, "engines": { - "node": ">=12" + "node": ">= 10" } }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", - "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", - "cpu": [ - "ppc64" - ], + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">= 0.8" } }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", - "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", - "cpu": [ - "riscv64" - ], + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", - "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", - "cpu": [ - "s390x" - ], + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", - "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", - "cpu": [ - "x64" - ], + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.244", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.244.tgz", + "integrity": "sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==", + "dev": true, + "license": "ISC" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], "engines": { - "node": ">=12" + "node": ">= 0.8" } }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", - "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", - "cpu": [ - "x64" - ], + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], + "license": "BSD-2-Clause", "engines": { - "node": ">=12" + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", - "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", - "cpu": [ - "x64" - ], + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/esbuild-windows-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", - "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", - "cpu": [ - "ia32" - ], + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/esbuild-windows-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", - "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", - "cpu": [ - "x64" - ], + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "es-errors": "^1.3.0" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", - "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", - "cpu": [ - "arm64" - ], + "node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" } }, "node_modules/escalade": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", @@ -2719,14 +4350,14 @@ }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true, "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", @@ -2736,12 +4367,24 @@ }, "node_modules/estree-walker": { "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, "license": "MIT" }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, "license": "MIT", @@ -2751,7 +4394,7 @@ }, "node_modules/execa": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "resolved": "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "license": "MIT", @@ -2775,7 +4418,7 @@ }, "node_modules/express": { "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "resolved": "https://registry.npmmirror.com/express/-/express-4.21.2.tgz", "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, "license": "MIT", @@ -2822,7 +4465,7 @@ }, "node_modules/express/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", @@ -2832,21 +4475,21 @@ }, "node_modules/express/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, "license": "MIT" }, "node_modules/exsolve": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", + "resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.0.7.tgz", "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", "dev": true, "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", @@ -2863,7 +4506,7 @@ }, "node_modules/fastq": { "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.19.1.tgz", "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, "license": "ISC", @@ -2873,7 +4516,7 @@ }, "node_modules/fill-range": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", @@ -2886,7 +4529,7 @@ }, "node_modules/finalhandler": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.3.1.tgz", "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, "license": "MIT", @@ -2905,7 +4548,7 @@ }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", @@ -2915,14 +4558,14 @@ }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, "license": "MIT" }, "node_modules/forwarded": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, "license": "MIT", @@ -2932,7 +4575,7 @@ }, "node_modules/fraction.js": { "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.3.7.tgz", "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, "license": "MIT", @@ -2946,7 +4589,7 @@ }, "node_modules/fresh": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, "license": "MIT", @@ -2956,7 +4599,7 @@ }, "node_modules/fs-extra": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, "license": "MIT", @@ -2969,16 +4612,9 @@ "node": ">=12" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, "node_modules/fsevents": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, @@ -2993,7 +4629,7 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, "license": "MIT", @@ -3003,7 +4639,7 @@ }, "node_modules/generic-names": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", + "resolved": "https://registry.npmmirror.com/generic-names/-/generic-names-4.0.0.tgz", "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", "dev": true, "license": "MIT", @@ -3013,7 +4649,7 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", @@ -3023,7 +4659,7 @@ }, "node_modules/get-intrinsic": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "license": "MIT", @@ -3048,7 +4684,7 @@ }, "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, "license": "MIT", @@ -3062,7 +4698,7 @@ }, "node_modules/get-stream": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, "license": "MIT", @@ -3073,2213 +4709,2785 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "is-glob": "^4.0.1" }, "engines": { - "node": "*" + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "dev": true, + "license": "MIT" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", + "dev": true, + "license": "ISC" + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/invert-kv": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/invert-kv/-/invert-kv-3.0.1.tgz", + "integrity": "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sindresorhus/invert-kv?sponsor=1" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "binary-extensions": "^2.0.0" }, "engines": { - "node": ">= 6" + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/globby": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", - "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", - "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, "engines": { - "node": ">=8" + "node": ">=0.12.0" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, + "node_modules/is-what": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/is-what/-/is-what-5.5.0.tgz", + "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", "license": "MIT", "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" } }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "node_modules/isbinaryfile": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/isbinaryfile/-/isbinaryfile-5.0.2.tgz", + "integrity": "sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">= 18.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/gjtorikian/" } }, - "node_modules/hash-sum": { + "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", - "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, "license": "MIT" }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" + "bin": { + "jsesc": "bin/jsesc" }, "engines": { - "node": ">= 0.4" + "node": ">=6" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", "bin": { - "he": "bin/he" + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" } }, - "node_modules/hookable": { - "version": "5.5.3", + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, "license": "MIT" }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lcid": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/lcid/-/lcid-3.1.1.tgz", + "integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "invert-kv": "^3.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/human-signals": { + "node_modules/licia": { + "version": "1.41.1", + "resolved": "https://registry.npmmirror.com/licia/-/licia-1.41.1.tgz", + "integrity": "sha512-XqObV8u1KEMdYWaNK0leRrTwhzKnLQEkhbnuUu7qGNH3zJoN7l9sfvF6PfHstSCuUOmpEP+0SBjRrk0I9uZs8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/lilconfig": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "engines": { - "node": ">=10.17.0" + "node": ">=10" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", "dev": true, "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, "engines": { - "node": ">=0.10.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", + "node_modules/loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "node_modules/local-pkg": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", "dev": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">=14" }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "node_modules/local-pkg/node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/local-pkg/node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 4" + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "yallist": "^3.0.2" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "node_modules/magic-string": { + "version": "0.30.11", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } }, - "node_modules/invert-kv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-3.0.1.tgz", - "integrity": "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==", + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sindresorhus/invert-kv?sponsor=1" + "node": ">= 0.4" } }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.10" + "node": ">= 0.6" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmmirror.com/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", "dev": true, "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "node_modules/merge": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/merge/-/merge-2.1.1.tgz", + "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 8" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.6" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", "dev": true, "license": "MIT", + "bin": { + "mime": "cli.js" + }, "engines": { - "node": ">=0.12.0" + "node": ">=10.0.0" } }, - "node_modules/is-plain-object": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz", - "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "mime-db": "1.52.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-what": { - "version": "4.1.16", - "license": "MIT", "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" + "node": ">= 0.6" } }, - "node_modules/isbinaryfile": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.2.tgz", - "integrity": "sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==", + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" + "node": ">=6" } }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", "license": "MIT" }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "node_modules/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", "dev": true, "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" } }, - "node_modules/json5": { + "node_modules/module-alias": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "resolved": "https://registry.npmmirror.com/module-alias/-/module-alias-2.2.3.tgz", + "integrity": "sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==", "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "node_modules/muggle-string": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.3.1.tgz", + "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" + "bin": { + "nanoid": "bin/nanoid.cjs" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/lcid": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-3.1.1.tgz", - "integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==", + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, "license": "MIT", - "dependencies": { - "invert-kv": "^3.0.0" - }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/licia": { - "version": "1.41.1", - "resolved": "https://registry.npmjs.org/licia/-/licia-1.41.1.tgz", - "integrity": "sha512-XqObV8u1KEMdYWaNK0leRrTwhzKnLQEkhbnuUu7qGNH3zJoN7l9sfvF6PfHstSCuUOmpEP+0SBjRrk0I9uZs8g==", + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true, "license": "MIT" }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/lines-and-columns": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", - "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=0.10.0" } }, - "node_modules/loader-utils": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", - "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, "engines": { - "node": ">= 12.13.0" + "node": ">=8" } }, - "node_modules/local-pkg": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", - "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, "license": "MIT", - "dependencies": { - "mlly": "^1.7.4", - "pkg-types": "^2.3.0", - "quansync": "^0.2.11" - }, "engines": { - "node": ">=14" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/antfu" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/local-pkg/node_modules/confbox": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", - "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/local-pkg/node_modules/pkg-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", - "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "license": "MIT", "dependencies": { - "confbox": "^0.2.2", - "exsolve": "^1.0.7", - "pathe": "^2.0.3" - } - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/magic-string": { - "version": "0.30.17", + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "node_modules/os-locale-s-fix": { + "version": "1.0.8-fix-1", + "resolved": "https://registry.npmmirror.com/os-locale-s-fix/-/os-locale-s-fix-1.0.8-fix-1.tgz", + "integrity": "sha512-Sv0OvhPiMutICiwORAUefv02DCPb62IelBmo8ZsSrRHyI3FStqIWZvjqDkvtjU+lcujo7UNir+dCwKSqlEQ/5w==", "dev": true, "license": "MIT", + "dependencies": { + "lcid": "^3.0.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=10", + "yarn": "^1.22.4" } }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, - "node_modules/merge": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz", - "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==", + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "dev": true, "license": "MIT" }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true, "license": "MIT" }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } + "license": "MIT" }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, "engines": { - "node": ">=8.6" + "node": ">=0.10.0" } }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true, + "node_modules/pinia": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/pinia/-/pinia-3.0.3.tgz", + "integrity": "sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA==", "license": "MIT", - "bin": { - "mime": "cli.js" + "dependencies": { + "@vue/devtools-api": "^7.7.2" }, - "engines": { - "node": ">=10.0.0" + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.4.4", + "vue": "^2.7.0 || ^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.6" + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">= 0.6" + "node": "^10 || ^12 || >=14" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "node_modules/postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmmirror.com/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", "dev": true, "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, "engines": { - "node": ">=6" + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" } }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" }, "engines": { - "node": "*" + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "node_modules/mitt": { - "version": "3.0.1", - "license": "MIT" - }, - "node_modules/mlly": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", - "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "node_modules/postcss-modules": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/postcss-modules/-/postcss-modules-4.3.1.tgz", + "integrity": "sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.15.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.1" + "generic-names": "^4.0.0", + "icss-replace-symbols": "^1.1.0", + "lodash.camelcase": "^4.3.0", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "string-hash": "^1.1.1" + }, + "peerDependencies": { + "postcss": "^8.0.0" } }, - "node_modules/module-alias": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.3.tgz", - "integrity": "sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/muggle-string": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz", - "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, - "license": "MIT" + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } }, - "node_modules/nanoid": { - "version": "3.3.11", + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dev": true, "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "node_modules/node-releases": { - "version": "2.0.23", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz", - "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dev": true, "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "path-key": "^3.0.0" + "icss-utils": "^5.0.0" }, "engines": { - "node": ">=8" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=4" } }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, "license": "MIT", "dependencies": { - "ee-first": "1.1.1" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.10" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/qrcode-reader": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/qrcode-reader/-/qrcode-reader-1.0.4.tgz", + "integrity": "sha512-rRjALGNh9zVqvweg1j5OKIQKNsw3bLC+7qwlnead5K/9cb1cEIAGkwikt/09U0K+2IDWGD9CC6SP7tHAjUeqvQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/qrcode-terminal": { + "version": "0.12.0", + "resolved": "https://registry.npmmirror.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", + "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "mimic-fn": "^2.1.0" + "side-channel": "^1.0.6" }, "engines": { - "node": ">=6" + "node": ">=0.6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/os-locale-s-fix": { - "version": "1.0.8-fix-1", - "resolved": "https://registry.npmjs.org/os-locale-s-fix/-/os-locale-s-fix-1.0.8-fix-1.tgz", - "integrity": "sha512-Sv0OvhPiMutICiwORAUefv02DCPb62IelBmo8ZsSrRHyI3FStqIWZvjqDkvtjU+lcujo7UNir+dCwKSqlEQ/5w==", + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmmirror.com/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, "license": "MIT", - "dependencies": { - "lcid": "^3.0.0" - }, "engines": { - "node": ">=10", - "yarn": "^1.22.4" + "node": ">= 0.6" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, "engines": { "node": ">= 0.8" } }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "pify": "^2.3.0" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, "engines": { - "node": ">=8" + "node": ">=8.10.0" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true, "license": "MIT" }, - "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "dev": true, "license": "MIT" }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", "dev": true, "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmmirror.com/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", "dev": true, "license": "MIT" }, - "node_modules/perfect-debounce": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", + "node_modules/regjsparser": { + "version": "0.13.0", + "resolved": "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", "dev": true, - "license": "ISC" + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8.6" + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, "license": "MIT", "engines": { + "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/pinia": { - "version": "3.0.3", + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rollup": { + "version": "3.29.5", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-3.29.5.tgz", + "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", + "dev": true, "license": "MIT", - "dependencies": { - "@vue/devtools-api": "^7.7.2" - }, - "funding": { - "url": "https://github.com/sponsors/posva" + "bin": { + "rollup": "dist/bin/rollup" }, - "peerDependencies": { - "typescript": ">=4.4.4", - "vue": "^2.7.0 || ^3.5.11" + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" + "queue-microtask": "^1.2.2" } }, - "node_modules/postcss": { - "version": "8.5.6", + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "type": "github", + "url": "https://github.com/sponsors/feross" }, { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" + "type": "patreon", + "url": "https://www.patreon.com/feross" }, { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "consulting", + "url": "https://feross.org/support" } ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmmirror.com/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">= 0.8.0" } }, - "node_modules/postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10.0.0" + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" }, - "peerDependencies": { - "postcss": "^8.0.0" + "engines": { + "node": ">=4" } }, - "node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, "license": "MIT", "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" }, "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } + "node": ">= 0.8.0" } }, - "node_modules/postcss-modules": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.3.1.tgz", - "integrity": "sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==", + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", "dependencies": { - "generic-names": "^4.0.0", - "icss-replace-symbols": "^1.1.0", - "lodash.camelcase": "^4.3.0", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "string-hash": "^1.1.1" + "shebang-regex": "^3.0.0" }, - "peerDependencies": { - "postcss": "^8.0.0" + "engines": { + "node": ">=8" } }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" }, - "peerDependencies": { - "postcss": "^8.1.0" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", - "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dev": true, "license": "MIT", "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.1.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" }, "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">= 0.4" }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, "license": "MIT", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-modules-scope": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", - "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^7.0.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">= 0.4" }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, + "license": "ISC" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, - "license": "ISC", - "dependencies": { - "icss-utils": "^5.0.0" - }, + "license": "BSD-3-Clause", "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=0.10.0" } }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "license": "MIT", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "license": "BSD-3-Clause", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "node_modules/string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, "engines": { - "node": ">= 0.10" + "node": ">=6" } }, - "node_modules/qrcode-reader": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/qrcode-reader/-/qrcode-reader-1.0.4.tgz", - "integrity": "sha512-rRjALGNh9zVqvweg1j5OKIQKNsw3bLC+7qwlnead5K/9cb1cEIAGkwikt/09U0K+2IDWGD9CC6SP7tHAjUeqvQ==", + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", "dev": true, - "license": "Apache-2.0" + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } }, - "node_modules/qrcode-terminal": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", - "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", "dev": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" + "license": "MIT" + }, + "node_modules/superjson": { + "version": "2.2.5", + "resolved": "https://registry.npmmirror.com/superjson/-/superjson-2.2.5.tgz", + "integrity": "sha512-zWPTX96LVsA/eVYnqOM2+ofcdPqdS1dAF1LN4TS2/MWuUpfitd9ctTa87wt4xrYnZnkLtS69xpBdSxVBP5Rm6w==", + "license": "MIT", + "dependencies": { + "copy-anything": "^4" + }, + "engines": { + "node": ">=16" } }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "side-channel": "^1.0.6" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=0.6" + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/quansync": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", - "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "node_modules/systemjs": { + "version": "6.15.1", + "resolved": "https://registry.npmmirror.com/systemjs/-/systemjs-6.15.1.tgz", + "integrity": "sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/antfu" - }, - { - "type": "individual", - "url": "https://github.com/sponsors/sxzz" - } - ], "license": "MIT" }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "node_modules/terser": { + "version": "5.44.0", + "resolved": "https://registry.npmmirror.com/terser/-/terser-5.44.0.tgz", + "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "is-number": "^7.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=8.0" } }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, "license": "MIT", - "dependencies": { - "pify": "^2.3.0" + "engines": { + "node": ">=0.6" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, "license": "MIT", "dependencies": { - "picomatch": "^2.2.1" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, "engines": { - "node": ">=8.10.0" + "node": ">= 0.6" } }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, + "license": "Apache-2.0", "bin": { - "resolve": "bin/resolve" + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=4.2.0" } }, - "node_modules/rfdc": { - "version": "1.4.1", + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "dev": true, "license": "MIT" }, - "node_modules/rollup": { - "version": "2.79.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", - "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "dev": true, "license": "MIT", - "bin": { - "rollup": "dist/bin/rollup" - }, "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=4" } }, - "node_modules/rollup-plugin-copy": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-copy/-/rollup-plugin-copy-3.5.0.tgz", - "integrity": "sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==", + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, "license": "MIT", "dependencies": { - "@types/fs-extra": "^8.0.1", - "colorette": "^1.1.0", - "fs-extra": "^8.1.0", - "globby": "10.0.1", - "is-plain-object": "^3.0.0" + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" }, "engines": { - "node": ">=8.3" + "node": ">=4" } }, - "node_modules/rollup-plugin-copy/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", "dev": true, "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=4" } }, - "node_modules/rollup-plugin-copy/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", "dev": true, "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">=4" } }, - "node_modules/rollup-plugin-copy/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "node_modules/unimport": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/unimport/-/unimport-4.1.1.tgz", + "integrity": "sha512-j9+fijH6aDd05yv1fXlyt7HSxtOWtGtrZeYTVBsSUg57Iuf+Ps2itIZjeyu7bEQ4k0WOgYhHrdW8m/pJgOpl5g==", "dev": true, "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "fast-glob": "^3.3.3", + "local-pkg": "^1.0.0", + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "pathe": "^2.0.2", + "picomatch": "^4.0.2", + "pkg-types": "^1.3.1", + "scule": "^1.3.0", + "strip-literal": "^3.0.0", + "unplugin": "^2.1.2", + "unplugin-utils": "^0.2.3" + }, "engines": { - "node": ">= 4.0.0" + "node": ">=18.12.0" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/unimport/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "node_modules/unimport/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "node_modules/unimport/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } }, - "node_modules/scule": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", - "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "node_modules/unimport/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "engines": { + "node": ">= 10.0.0" } }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.8" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/unplugin": { + "version": "2.3.10", + "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-2.3.10.tgz", + "integrity": "sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==", "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" } }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "node_modules/unplugin-auto-import": { + "version": "0.16.7", + "resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-0.16.7.tgz", + "integrity": "sha512-w7XmnRlchq6YUFJVFGSvG1T/6j8GrdYN6Em9Wf0Ye+HXgD/22kont+WnuCAA0UaUoxtuvRR1u/mXKy63g/hfqQ==", "dev": true, "license": "MIT", + "dependencies": { + "@antfu/utils": "^0.7.6", + "@rollup/pluginutils": "^5.0.5", + "fast-glob": "^3.3.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "minimatch": "^9.0.3", + "unimport": "^3.4.0", + "unplugin": "^1.5.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@nuxt/kit": "^3.2.2", + "@vueuse/core": "*" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "@vueuse/core": { + "optional": true + } } }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/unplugin-auto-import/node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", "dev": true, "license": "MIT", - "bin": { - "mime": "cli.js" + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, - "engines": { - "node": ">=4" + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "node_modules/unplugin-auto-import/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" + "balanced-match": "^1.0.0" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "node_modules/unplugin-auto-import/node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/unplugin-auto-import/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/unplugin-auto-import/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "node_modules/unplugin-auto-import/node_modules/local-pkg": { + "version": "0.5.1", + "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.5.1.tgz", + "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" + "mlly": "^1.7.3", + "pkg-types": "^1.2.1" }, "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "node_modules/unplugin-auto-import/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/unplugin-auto-import/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "node_modules/unplugin-auto-import/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "node_modules/unplugin-auto-import/node_modules/strip-literal": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-2.1.1.tgz", + "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" + "js-tokens": "^9.0.1" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "node_modules/unplugin-auto-import/node_modules/unimport": { + "version": "3.14.6", + "resolved": "https://registry.npmmirror.com/unimport/-/unimport-3.14.6.tgz", + "integrity": "sha512-CYvbDaTT04Rh8bmD8jz3WPmHYZRG/NnvYVzwD6V1YAlvvKROlAeNDUBhkBGzNav2RKaeuXvlWYaa1V4Lfi/O0g==", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.4", + "acorn": "^8.14.0", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "fast-glob": "^3.3.3", + "local-pkg": "^1.0.0", + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "pathe": "^2.0.1", + "picomatch": "^4.0.2", + "pkg-types": "^1.3.0", + "scule": "^1.3.0", + "strip-literal": "^2.1.1", + "unplugin": "^1.16.1" + } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/unplugin-auto-import/node_modules/unimport/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "@types/estree": "^1.0.0" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/unplugin-auto-import/node_modules/unimport/node_modules/local-pkg": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, "engines": { - "node": ">=0.10.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/source-map-js": { - "version": "1.2.1", + "node_modules/unplugin-auto-import/node_modules/unimport/node_modules/local-pkg/node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" } }, - "node_modules/speakingurl": { - "version": "14.0.1", - "license": "BSD-3-Clause", + "node_modules/unplugin-auto-import/node_modules/unplugin": { + "version": "1.16.1", + "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-1.16.1.tgz", + "integrity": "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "webpack-virtual-modules": "^0.6.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">=14.0.0" } }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "node_modules/unplugin-utils": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/unplugin-utils/-/unplugin-utils-0.2.5.tgz", + "integrity": "sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg==", "dev": true, "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.3" + }, "engines": { - "node": ">= 0.8" + "node": ">=18.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" } }, - "node_modules/string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "node_modules/unplugin-utils/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/strip-literal": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", - "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "node_modules/unplugin/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.1" + "engines": { + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/antfu" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "node_modules/update-browserslist-db": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", "dev": true, - "license": "MIT" - }, - "node_modules/superjson": { - "version": "2.2.2", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "copy-anything": "^3.0.2" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, - "engines": { - "node": ">=16" + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/update-browserslist-db/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true, "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, "engines": { - "node": ">=4" + "node": ">= 0.4.0" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8" } }, - "node_modules/tapable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "node_modules/vite": { + "version": "4.5.14", + "resolved": "https://registry.npmmirror.com/vite/-/vite-4.5.14.tgz", + "integrity": "sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==", "dev": true, "license": "MIT", + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, "engines": { - "node": ">=6" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8.0" + "node": ">=12" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=0.6" + "node": ">=12" } }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=4.2.0" + "node": ">=12" } }, - "node_modules/ufo": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", - "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/undici-types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.13.0.tgz", - "integrity": "sha512-Ov2Rr9Sx+fRgagJ5AX0qvItZG/JKKoBRAVITs1zk7IqZGTJUwgUr7qoYBpWwakpWilTZFM98rG/AFRocu10iIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/unimport": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/unimport/-/unimport-4.1.1.tgz", - "integrity": "sha512-j9+fijH6aDd05yv1fXlyt7HSxtOWtGtrZeYTVBsSUg57Iuf+Ps2itIZjeyu7bEQ4k0WOgYhHrdW8m/pJgOpl5g==", + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "acorn": "^8.14.0", - "escape-string-regexp": "^5.0.0", - "estree-walker": "^3.0.3", - "fast-glob": "^3.3.3", - "local-pkg": "^1.0.0", - "magic-string": "^0.30.17", - "mlly": "^1.7.4", - "pathe": "^2.0.2", - "picomatch": "^4.0.2", - "pkg-types": "^1.3.1", - "scule": "^1.3.0", - "strip-literal": "^3.0.0", - "unplugin": "^2.1.2", - "unplugin-utils": "^0.2.3" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=18.12.0" + "node": ">=12" } }, - "node_modules/unimport/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/unimport/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/unimport/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 10.0.0" + "node": ">=12" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.8" + "node": ">=12" } }, - "node_modules/unplugin": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.10.tgz", - "integrity": "sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==", + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.5", - "acorn": "^8.15.0", - "picomatch": "^4.0.3", - "webpack-virtual-modules": "^0.6.2" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18.12.0" + "node": ">=12" } }, - "node_modules/unplugin-auto-import": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-19.1.0.tgz", - "integrity": "sha512-B+TGBEBHqY9aR+7YfShfLujETOHstzpV+yaqgy5PkfV0QG7Py+TYMX7vJ9W4SrysHR+UzR+gzcx/nuZjmPeclA==", + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], "dev": true, "license": "MIT", - "dependencies": { - "local-pkg": "^1.0.0", - "magic-string": "^0.30.17", - "picomatch": "^4.0.2", - "unimport": "^4.1.1", - "unplugin": "^2.2.0", - "unplugin-utils": "^0.2.4" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@nuxt/kit": "^3.2.2", - "@vueuse/core": "*" - }, - "peerDependenciesMeta": { - "@nuxt/kit": { - "optional": true - }, - "@vueuse/core": { - "optional": true - } + "node": ">=12" } }, - "node_modules/unplugin-auto-import/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/unplugin-utils": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.2.5.tgz", - "integrity": "sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg==", + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "MIT", - "dependencies": { - "pathe": "^2.0.3", - "picomatch": "^4.0.3" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/sxzz" + "node": ">=12" } }, - "node_modules/unplugin-utils/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/unplugin/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" ], + "dev": true, "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">= 0.4.0" + "node": ">=12" } }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">= 0.8" + "node": ">=12" } }, - "node_modules/vite": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.11.tgz", - "integrity": "sha512-K/jGKL/PgbIgKCiJo5QbASQhFiV02X9Jh+Qq0AKCRCRKZtOTVi4t6wh75FDpGf2N9rYOnzH87OEFQNaFy6pdxQ==", + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "esbuild": "^0.15.9", - "postcss": "^8.4.18", - "resolve": "^1.22.1", - "rollup": "^2.79.1" - }, - "bin": { - "vite": "bin/vite.js" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } + "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", - "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", "cpu": [ - "arm" + "ia32" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "android" + "win32" ], "engines": { "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", - "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", "cpu": [ - "loong64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ], "engines": { "node": ">=12" } }, "node_modules/vite/node_modules/esbuild": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", - "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -5290,40 +7498,42 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.15.18", - "@esbuild/linux-loong64": "0.15.18", - "esbuild-android-64": "0.15.18", - "esbuild-android-arm64": "0.15.18", - "esbuild-darwin-64": "0.15.18", - "esbuild-darwin-arm64": "0.15.18", - "esbuild-freebsd-64": "0.15.18", - "esbuild-freebsd-arm64": "0.15.18", - "esbuild-linux-32": "0.15.18", - "esbuild-linux-64": "0.15.18", - "esbuild-linux-arm": "0.15.18", - "esbuild-linux-arm64": "0.15.18", - "esbuild-linux-mips64le": "0.15.18", - "esbuild-linux-ppc64le": "0.15.18", - "esbuild-linux-riscv64": "0.15.18", - "esbuild-linux-s390x": "0.15.18", - "esbuild-netbsd-64": "0.15.18", - "esbuild-openbsd-64": "0.15.18", - "esbuild-sunos-64": "0.15.18", - "esbuild-windows-32": "0.15.18", - "esbuild-windows-64": "0.15.18", - "esbuild-windows-arm64": "0.15.18" + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" } }, "node_modules/vue": { - "version": "3.5.18", + "version": "3.5.22", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.22.tgz", + "integrity": "sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.18", - "@vue/compiler-sfc": "3.5.18", - "@vue/runtime-dom": "3.5.18", - "@vue/server-renderer": "3.5.18", - "@vue/shared": "3.5.18" + "@vue/compiler-dom": "3.5.22", + "@vue/compiler-sfc": "3.5.22", + "@vue/runtime-dom": "3.5.22", + "@vue/server-renderer": "3.5.22", + "@vue/shared": "3.5.22" }, "peerDependencies": { "typescript": "*" @@ -5336,7 +7546,7 @@ }, "node_modules/vue-template-compiler": { "version": "2.7.16", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", + "resolved": "https://registry.npmmirror.com/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", "dev": true, "license": "MIT", @@ -5347,7 +7557,7 @@ }, "node_modules/vue-tsc": { "version": "1.8.27", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.27.tgz", + "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-1.8.27.tgz", "integrity": "sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==", "dev": true, "license": "MIT", @@ -5364,9 +7574,9 @@ } }, "node_modules/vue-tsc/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -5376,16 +7586,71 @@ "node": ">=10" } }, + "node_modules/vue/node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/vue/node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/vue/node_modules/@vue/compiler-core": { + "version": "3.5.22", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.22.tgz", + "integrity": "sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "@vue/shared": "3.5.22", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/vue/node_modules/@vue/compiler-dom": { + "version": "3.5.22", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.22.tgz", + "integrity": "sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.22", + "@vue/shared": "3.5.22" + } + }, "node_modules/webpack-virtual-modules": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", "dev": true, "license": "MIT" }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", @@ -5399,16 +7664,9 @@ "node": ">= 8" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, "node_modules/ws": { "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "resolved": "https://registry.npmmirror.com/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, "license": "MIT", @@ -5430,21 +7688,21 @@ }, "node_modules/xregexp": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-3.1.0.tgz", + "resolved": "https://registry.npmmirror.com/xregexp/-/xregexp-3.1.0.tgz", "integrity": "sha512-4Y1x6DyB8xRoxosooa6PlGWqmmSKatbzhrftZ7Purmm4B8R4qIEJG1A2hZsdz5DhmIqS0msC0I7KEq93GphEVg==", "dev": true, "license": "MIT" }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC" }, "node_modules/yaml": { "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "resolved": "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true, "license": "ISC", diff --git a/pages.json b/pages.json index 9d9bb9eb..e5cb0e22 100644 --- a/pages.json +++ b/pages.json @@ -583,7 +583,7 @@ }, "uniIdRouter": {}, "easycom": { - "autoscan": true, + "autoscan": false, "custom": { "^uni-(.*)": "@dcloudio/uni-ui/lib/uni-$1/uni-$1.vue" } diff --git a/pages.zip b/pages.zip deleted file mode 100644 index 60f246b6a080fe32cf93032abef20793ae3db243..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 311737 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%0Dlntbt@Zpwy0KQ~jOYs^*I#mb#Bm51 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%0D&hr3HMvbd~-gKIbF0;pM{nGc$j4;QT}+ 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�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
Wgr@Q*=+prWaG`iq6o*MEJgetb5g-|0Ax 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
pYcxSX&-foV7Yxz49``@q(7<>GAz%y8A_jPc) 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 diff --git a/pages/auth/login/index.vue b/pages/auth/login/index.vue index 3429ac52..ba0f2c5b 100644 --- a/pages/auth/login/index.vue +++ b/pages/auth/login/index.vue @@ -524,6 +524,21 @@ const login = async () => { osVersion: deviceInfo.value.osVersion }; try { + // 添加请求前的调试信息 + if (NETWORK_CONFIG.DEBUG) { + console.log('=== 登录请求开始 ==='); + console.log('请求URL:', `${NETWORK_CONFIG.API_BASE_URL}/auth/login`); + console.log('请求设备信息:', { + deviceId: deviceInfo.value.deviceId, + deviceType: deviceInfo.value.deviceType, + deviceBrand: deviceInfo.value.deviceBrand, + deviceName: deviceInfo.value.deviceName, + deviceModel: deviceInfo.value.deviceModel + }); + console.log('登录账户:', identifier.value); + console.log('登录类型:', loginType.value); + } + const res = await uni.request({ url: `${NETWORK_CONFIG.API_BASE_URL}/auth/login`, method: "POST", @@ -533,11 +548,108 @@ const login = async () => { }, data: loginRequest, }); - if (res.statusCode !== 200) { - errorMessage.value = (res.data && res.data.message) || "登录失败"; + + // 添加响应后的调试信息 + if (NETWORK_CONFIG.DEBUG) { + console.log('=== 登录响应接收 ==='); + console.log('响应状态码:', res.statusCode); + console.log('响应数据类型:', typeof res.data); + console.log('响应数据是否为字符串:', typeof res.data === 'string'); + console.log('响应数据:', res.data); + console.log('完整响应对象键名:', Object.keys(res)); + } + + // 解析响应数据(可能是字符串) + let responseData = res.data; + if (typeof responseData === 'string') { + try { + responseData = JSON.parse(responseData); + if (NETWORK_CONFIG.DEBUG) { + console.log('解析后的响应数据:', responseData); + } + } catch (e) { + if (NETWORK_CONFIG.DEBUG) { + console.error('解析响应数据失败:', e); + } + responseData = { message: responseData }; + } + } + + // 处理非200状态码或包含错误信息的响应 + // 403 状态码通常表示被禁止访问(可能是封禁) + if (res.statusCode === 403 || res.statusCode !== 200 || (responseData && responseData.message && ( + responseData.message.includes('封禁') || + responseData.message.includes('banned') || + responseData.message.includes('无法登录') + ))) { + const errorMsg = (responseData && responseData.message) || "登录失败"; + errorMessage.value = errorMsg; + + // 检查是否是封禁相关的错误(403 或包含封禁关键词) + const isBannedError = res.statusCode === 403 || (responseData && responseData.message && ( + responseData.message.includes('封禁') || + responseData.message.includes('banned') || + responseData.message.includes('无法登录') + )); + + if (isBannedError) { + console.error('登录失败 - 用户被封禁:', responseData); + if (NETWORK_CONFIG.DEBUG) { + console.log('=== 封禁错误详细信息 ==='); + console.log('响应状态码:', res.statusCode); + console.log('HTTP 403 表示后端明确拒绝了登录请求'); + console.log('完整响应数据:', JSON.stringify(responseData, null, 2)); + console.log('请求URL:', `${NETWORK_CONFIG.API_BASE_URL}/auth/login`); + console.log('请求设备信息:', { + deviceId: deviceInfo.value.deviceId, + deviceType: deviceInfo.value.deviceType, + deviceBrand: deviceInfo.value.deviceBrand, + deviceName: deviceInfo.value.deviceName, + deviceModel: deviceInfo.value.deviceModel + }); + console.log('请求数据:', JSON.stringify(loginRequest, null, 2)); + console.log('当前环境:', { + API_BASE_URL: NETWORK_CONFIG.API_BASE_URL, + WS_URL: NETWORK_CONFIG.WS_URL, + DEBUG: NETWORK_CONFIG.DEBUG + }); + console.log('========================'); + console.log('⚠️ 后端问题排查建议:'); + console.log('1. 检查后端数据库中该用户的 is_banned 字段是否为 0'); + console.log('2. 检查后端是否有设备相关的封禁逻辑(deviceId, deviceType等)'); + console.log('3. 检查后端登录接口的封禁检查逻辑'); + console.log('4. 对比微信小程序和 Android 模拟器的请求差异'); + console.log('5. 查看后端日志确认封禁检查的具体条件'); + } + // 显示更详细的错误信息给用户 + errorMessage.value = `${errorMsg}\n\n⚠️ 后端返回了 403 状态码,表示用户被封禁\n\n排查建议:\n1. 检查后端数据库中该用户的 is_banned 字段\n2. 检查后端是否有设备相关的封禁逻辑\n3. 查看后端日志确认封禁检查的具体条件\n4. 对比微信小程序和 Android 模拟器的请求差异`; + } + loginBtnLoading.value = false; + return; } else { - const data = res.data; - console.log("登录成功,返回数据:", data); + // 登录成功,检查响应数据 + const data = responseData; + if (NETWORK_CONFIG.DEBUG) { + console.log("登录成功,返回数据:", data); + console.log("数据键名:", data ? Object.keys(data) : '无数据'); + } + + // 检查用户是否被封禁(即使登录接口返回成功) + if (data && (data.is_banned === true || data.isBanned === true || data.banned === true)) { + errorMessage.value = "用户已被封禁,无法登录"; + console.error('用户被封禁,无法登录:', data); + if (NETWORK_CONFIG.DEBUG) { + console.log('=== 封禁状态检查 ==='); + console.log('完整响应数据:', JSON.stringify(data, null, 2)); + console.log('封禁字段:', { + is_banned: data.is_banned, + isBanned: data.isBanned, + banned: data.banned + }); + } + loginBtnLoading.value = false; + return; + } // 确保accessToken字段存在 if (data && data.accessToken) { diff --git a/pages/business/sponsorship/index.vue b/pages/business/sponsorship/index.vue index 12b2c3e7..ab486a27 100644 --- a/pages/business/sponsorship/index.vue +++ b/pages/business/sponsorship/index.vue @@ -606,7 +606,7 @@ try { } else { console.log('❌ uni.login()失败') console.log('errMsg:', loginRes.errMsg) - throw new Error('wx.login失败: ' + loginRes.errMsg) + throw new Error('uni.login失败: ' + loginRes.errMsg) } } catch (e) { console.error('=== 获取openId异常详情 ===') diff --git "a/pages/chat - \345\211\257\346\234\254/index.vue" "b/pages/chat - \345\211\257\346\234\254/index.vue" deleted file mode 100644 index 8c12fbd3..00000000 --- "a/pages/chat - \345\211\257\346\234\254/index.vue" +++ /dev/null @@ -1,573 +0,0 @@ - - - - - \ No newline at end of file diff --git "a/pages/chat - \345\211\257\346\234\254/test-websocket.vue" "b/pages/chat - \345\211\257\346\234\254/test-websocket.vue" deleted file mode 100644 index 3d76723a..00000000 --- "a/pages/chat - \345\211\257\346\234\254/test-websocket.vue" +++ /dev/null @@ -1,290 +0,0 @@ - - - - - diff --git a/pages/company/index.vue b/pages/company/index.vue index 99f14838..c701b731 100644 --- a/pages/company/index.vue +++ b/pages/company/index.vue @@ -63,6 +63,11 @@ import { ref, reactive, computed, watch } from 'vue' import { onLoad, onShow } from '@dcloudio/uni-app' import { NETWORK_CONFIG } from '@/config/network.js' + // 手动导入 uni-ui 组件(easycom autoscan 已禁用) + import uniForms from '@dcloudio/uni-ui/lib/uni-forms/uni-forms.vue' + import uniFormsItem from '@dcloudio/uni-ui/lib/uni-forms-item/uni-forms-item.vue' + import uniEasyinput from '@dcloudio/uni-ui/lib/uni-easyinput/uni-easyinput.vue' + import uniFilePicker from '@dcloudio/uni-ui/lib/uni-file-picker/uni-file-picker.vue' // 企业类型选项 const companyTypeOptions = ['学校', '政府机构', '民营企业', '国有企业', '其他'] diff --git a/pages/index/index.vue b/pages/index/index.vue index e9282865..53fd9157 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -20,8 +20,6 @@

@@ -1268,13 +1266,15 @@ import { NETWORK_CONFIG } from '@/config/network.js' }, name: "Home", setup() { + if (NETWORK_CONFIG.DEBUG) { console.log( "%c[geoData 检查]%c geoData =", "background: #4A90E2; color: #fff; font-weight: bold; padding: 2px 6px; border-radius: 4px;", "color: #4A90E2; font-weight: bold;", geoData ); - const userStore = useUserStore(); + } + const userStore = useUserStore(); // 安全的用户信息访问 const safeUserProfile = computed(() => { @@ -1473,23 +1473,29 @@ import { NETWORK_CONFIG } from '@/config/network.js' const totalPages = ref(0); - console.log('组件初始化时 userStore 状态:', userStore.$state) + if (NETWORK_CONFIG.DEBUG) { + console.log('组件初始化时 userStore 状态:', userStore.$state); + } if (!userStore.isLoggedIn) { - console.warn('用户未登录或数据未恢复,当前状态:', { - storeState: userStore.$state, - isLoggedIn: userStore.isLoggedIn, - userInfo: userStore.getUserInfo - }); + if (NETWORK_CONFIG.DEBUG) { + console.warn('用户未登录或数据未恢复,当前状态:', { + storeState: userStore.$state, + isLoggedIn: userStore.isLoggedIn, + userInfo: userStore.getUserInfo + }); + } // 尝试重新恢复用户数据 userStore.restoreUser(); // 重新获取用户信息 const restoredUserInfo = userStore.getUserInfo; - console.log('恢复后的完整 userStore 状态:', { - storeState: userStore.$state, - isLoggedIn: userStore.isLoggedIn, - userInfo: restoredUserInfo - }); + if (NETWORK_CONFIG.DEBUG) { + console.log('恢复后的完整 userStore 状态:', { + storeState: userStore.$state, + isLoggedIn: userStore.isLoggedIn, + userInfo: restoredUserInfo + }); + } } const getPageList = computed(() => { @@ -1518,7 +1524,9 @@ import { NETWORK_CONFIG } from '@/config/network.js' const checkAuth = () => { const token = uni.getStorageSync("accessToken"); if (!token) { - console.warn("未找到 accessToken,跳转到登录页"); + if (NETWORK_CONFIG.DEBUG) { + console.warn("未找到 accessToken,跳转到登录页"); + } uni.showToast({ title: '请先登录', icon: 'none', @@ -1550,22 +1558,30 @@ import { NETWORK_CONFIG } from '@/config/network.js' success: (res) => { currentLocation.value.latitude = res.latitude; currentLocation.value.longitude = res.longitude; - console.log(`使用 ${type} 坐标系获取位置成功:`, currentLocation.value); + if (NETWORK_CONFIG.DEBUG) { + console.log(`使用 ${type} 坐标系获取位置成功:`, currentLocation.value); + } fetchTasks(); // 在获取当前位置后调用 fetchTasks }, fail: (error) => { - console.error(`使用 ${type} 坐标系获取位置失败:`, error); + if (NETWORK_CONFIG.DEBUG) { + console.error(`使用 ${type} 坐标系获取位置失败:`, error); + } // 如果是 gcj02 失败且未重试过,尝试使用 wgs84 if (type === 'gcj02' && retryCount === 0) { - console.log('尝试使用 wgs84 坐标系...'); + if (NETWORK_CONFIG.DEBUG) { + console.log('尝试使用 wgs84 坐标系...'); + } tryGetLocation('wgs84', 1); return; } // 如果两种坐标系都失败了,使用默认位置 if (retryCount > 0) { - console.warn('所有坐标系都获取失败,使用默认位置'); + if (NETWORK_CONFIG.DEBUG) { + console.warn('所有坐标系都获取失败,使用默认位置'); + } useDefaultLocation(); } } @@ -1711,44 +1727,45 @@ import { NETWORK_CONFIG } from '@/config/network.js' } }); - console.log('=== API响应完整信息 ==='); - console.log('响应状态码:', response.statusCode); - console.log('响应头信息:', response.header); - console.log('响应数据:', response.data); - console.log('响应数据类型:', typeof response.data); - console.log('响应数据是否为数组:', Array.isArray(response.data)); - console.log('响应数据键名:', response.data ? Object.keys(response.data) : '无数据'); - console.log('========================'); - // uni.request 的返回数据在 res.data 中 const data = response.data; - // 详细检查数据结构 - console.log('=== 数据结构分析 ==='); - console.log('data存在:', !!data); - console.log('data类型:', typeof data); - if (data) { - console.log('data的所有属性:', Object.keys(data)); - console.log('data.tasks存在:', !!data.tasks); - console.log('data.tasks类型:', typeof data.tasks); - console.log('data.tasks是否为数组:', Array.isArray(data.tasks)); - if (data.tasks) { - console.log('data.tasks长度:', data.tasks.length); - console.log('data.tasks前3项:', data.tasks.slice(0, 3)); + if (NETWORK_CONFIG.DEBUG) { + console.log('=== API响应完整信息 ==='); + console.log('响应状态码:', response.statusCode); + console.log('响应数据:', response.data); + console.log('响应数据类型:', typeof response.data); + console.log('响应数据是否为数组:', Array.isArray(response.data)); + console.log('响应数据键名:', response.data ? Object.keys(response.data) : '无数据'); + + // 详细检查数据结构 + console.log('=== 数据结构分析 ==='); + console.log('data存在:', !!data); + console.log('data类型:', typeof data); + if (data) { + console.log('data的所有属性:', Object.keys(data)); + console.log('data.tasks存在:', !!data.tasks); + console.log('data.tasks类型:', typeof data.tasks); + console.log('data.tasks是否为数组:', Array.isArray(data.tasks)); + if (data.tasks) { + console.log('data.tasks长度:', data.tasks.length); + } + console.log('data.totalPages:', data.totalPages); + console.log('data.currentPage:', data.currentPage); } - console.log('data.totalPages:', data.totalPages); - console.log('data.currentPage:', data.currentPage); + console.log('=================='); } - console.log('=================='); if (!data || !data.tasks) { - console.error('数据格式检查失败:', { - hasData: !!data, - dataType: typeof data, - hasTasks: !!(data && data.tasks), - tasksType: data && data.tasks ? typeof data.tasks : 'undefined', - fullData: data - }); + if (NETWORK_CONFIG.DEBUG) { + console.error('数据格式检查失败:', { + hasData: !!data, + dataType: typeof data, + hasTasks: !!(data && data.tasks), + tasksType: data && data.tasks ? typeof data.tasks : 'undefined', + fullData: data + }); + } throw new Error('返回数据格式错误'); } @@ -1759,15 +1776,6 @@ import { NETWORK_CONFIG } from '@/config/network.js' try { const parsedTask = typeof task === 'string' ? JSON.parse(task) : task; - // 调试任务数据中的用户信息 - console.log('=== 任务数据处理调试 ==='); - console.log('任务ID:', parsedTask.taskId); - console.log('原始publisherId:', parsedTask.publisherId); - console.log('publisherId类型:', typeof parsedTask.publisherId); - console.log('publisherName:', parsedTask.publisherName); - console.log('userAvatar:', parsedTask.userAvatar); - console.log('======================='); - if (typeof parsedTask.badges === "string") { try { parsedTask.badges = JSON.parse(parsedTask.badges.replace(/'/g, '"')); @@ -1786,19 +1794,24 @@ import { NETWORK_CONFIG } from '@/config/network.js' parsedTask.latitude, parsedTask.longitude ); - console.log("计算的距离:", parsedTask.distance); + if (NETWORK_CONFIG.DEBUG) { + console.log("计算的距离:", parsedTask.distance); + } } else { parsedTask.distance = "未知距离"; - console.warn("无法计算距离:缺少位置信息", { - current: currentLocation.value, - task: { - latitude: parsedTask.latitude, - longitude: parsedTask.longitude - } - }); + // 只在首次出现或 DEBUG 模式下输出一次(避免刷屏) + if (NETWORK_CONFIG.DEBUG && !currentLocation.value._hasLoggedDistanceWarning) { + currentLocation.value._hasLoggedDistanceWarning = true; + console.warn("无法计算距离:缺少位置信息(此警告仅显示一次)", { + current: currentLocation.value, + taskCount: data.tasks?.length || 0 + }); + } } } catch (error) { - console.error("计算距离时出错:", error); + if (NETWORK_CONFIG.DEBUG) { + console.error("计算距离时出错:", error); + } parsedTask.distance = "计算失败"; } @@ -1806,21 +1819,25 @@ import { NETWORK_CONFIG } from '@/config/network.js' return parsedTask; } catch (error) { - console.error("处理任务数据失败:", error); + if (NETWORK_CONFIG.DEBUG) { + console.error("处理任务数据失败:", error); + } return null; } }).filter((task) => task !== null); - console.log("处理后的任务数据:", tasks.value); + if (NETWORK_CONFIG.DEBUG) { + console.log("处理后的任务数据数量:", tasks.value.length); + } } catch (error) { - console.log("=== 任务数据获取异常处理 ==="); - console.error("获取任务数据失败:", error); - console.log("错误类型:", typeof error); - console.log("错误消息:", error?.message || '无消息'); - console.log("错误堆栈:", error?.stack || '无堆栈'); - console.log("错误名称:", error?.name || '无名称'); - console.log("完整错误对象:", error); - console.log("==============================="); + if (NETWORK_CONFIG.DEBUG) { + console.log("=== 任务数据获取异常处理 ==="); + console.error("获取任务数据失败:", error); + console.log("错误类型:", typeof error); + console.log("错误消息:", error?.message || '无消息'); + console.log("错误堆栈:", error?.stack || '无堆栈'); + console.log("==============================="); + } uni.showToast({ title: '获取任务列表失败', @@ -1997,7 +2014,9 @@ import { NETWORK_CONFIG } from '@/config/network.js' minute: '2-digit' }); } catch (error) { - console.error('时间格式化错误:', error); + if (NETWORK_CONFIG.DEBUG) { + console.error('时间格式化错误:', error); + } return '时间格式错误'; } }; @@ -2034,7 +2053,9 @@ import { NETWORK_CONFIG } from '@/config/network.js' uni.navigateTo({ url: '/pages/task/publish/index', fail: (err) => { - console.error('跳转到发布任务页面失败:', err) + if (NETWORK_CONFIG.DEBUG) { + console.error('跳转到发布任务页面失败:', err) + } uni.showToast({ title: '页面跳转失败', icon: 'none' @@ -2047,7 +2068,9 @@ import { NETWORK_CONFIG } from '@/config/network.js' uni.navigateTo({ url: '/pages/push/recent/index', fail: (err) => { - console.error('跳转到近期推送页面失败:', err) + if (NETWORK_CONFIG.DEBUG) { + console.error('跳转到近期推送页面失败:', err) + } uni.showToast({ title: '页面跳转失败', icon: 'none' @@ -2058,7 +2081,9 @@ import { NETWORK_CONFIG } from '@/config/network.js' const goToTaskDetail = (taskId) => { if (!taskId) { - console.error('缺少任务ID') + if (NETWORK_CONFIG.DEBUG) { + console.error('缺少任务ID') + } return } @@ -2068,7 +2093,9 @@ import { NETWORK_CONFIG } from '@/config/network.js' uni.navigateTo({ url: `/pages/task/detail/index?id=${safeTaskId}`, fail: (err) => { - console.error('跳转到任务详情页面失败:', err) + if (NETWORK_CONFIG.DEBUG) { + console.error('跳转到任务详情页面失败:', err) + } uni.showToast({ title: '页面跳转失败', icon: 'none' @@ -2088,10 +2115,12 @@ import { NETWORK_CONFIG } from '@/config/network.js' // 用户信息展示跳转 const goToMyProfile = () => { - console.log('=== 点击自己头像跳转调试信息 ==='); - console.log('当前routeUid:', uni.getStorageSync('routeUid')); - console.log('清除routeUid,准备查看自己的主页'); - console.log('========================'); + if (NETWORK_CONFIG.DEBUG) { + console.log('=== 点击自己头像跳转调试信息 ==='); + console.log('当前routeUid:', uni.getStorageSync('routeUid')); + console.log('清除routeUid,准备查看自己的主页'); + console.log('========================'); + } // 清除routeUid,确保查看自己的主页 uni.removeStorageSync('routeUid'); @@ -2099,10 +2128,14 @@ import { NETWORK_CONFIG } from '@/config/network.js' uni.switchTab({ url: '/pages/profile/index', success: (res) => { - console.log('跳转到自己主页成功:', res); + if (NETWORK_CONFIG.DEBUG) { + console.log('跳转到自己主页成功:', res); + } }, fail: (err) => { - console.error('跳转到个人主页失败:', err) + if (NETWORK_CONFIG.DEBUG) { + console.error('跳转到个人主页失败:', err) + } uni.showToast({ title: '页面跳转失败', icon: 'none' @@ -2112,16 +2145,20 @@ import { NETWORK_CONFIG } from '@/config/network.js' }; const goToUserProfile = (publisherId) => { - console.log('=== 用户头像点击调试信息 ==='); - console.log('原始publisherId:', publisherId); - console.log('publisherId类型:', typeof publisherId); - console.log('publisherId是否为空:', !publisherId); - console.log('publisherId是否为空字符串:', publisherId === ''); - console.log('publisherId是否为null:', publisherId === null); - console.log('publisherId是否为undefined:', publisherId === undefined); + if (NETWORK_CONFIG.DEBUG) { + console.log('=== 用户头像点击调试信息 ==='); + console.log('原始publisherId:', publisherId); + console.log('publisherId类型:', typeof publisherId); + console.log('publisherId是否为空:', !publisherId); + console.log('publisherId是否为空字符串:', publisherId === ''); + console.log('publisherId是否为null:', publisherId === null); + console.log('publisherId是否为undefined:', publisherId === undefined); + } if (!publisherId) { - console.error('缺少发布者ID,无法跳转'); + if (NETWORK_CONFIG.DEBUG) { + console.error('缺少发布者ID,无法跳转'); + } uni.showToast({ title: '缺少用户ID', icon: 'none' @@ -2132,41 +2169,53 @@ import { NETWORK_CONFIG } from '@/config/network.js' // 确保publisherId是字符串且不为null/undefined const safePublisherId = String(publisherId).trim ? String(publisherId) : 'default-user'; - console.log('处理后的publisherId:', safePublisherId); - console.log('当前用户ID:', userStore.profile?.uid); - console.log('是否为查看自己:', safePublisherId === userStore.profile?.uid); + if (NETWORK_CONFIG.DEBUG) { + console.log('处理后的publisherId:', safePublisherId); + console.log('当前用户ID:', userStore.profile?.uid); + console.log('是否为查看自己:', safePublisherId === userStore.profile?.uid); + } // 将目标用户ID存储到routeUid中,供profile页面使用 if (safePublisherId !== userStore.profile?.uid) { - console.log('存储routeUid:', safePublisherId); + if (NETWORK_CONFIG.DEBUG) { + console.log('存储routeUid:', safePublisherId); + console.log('设置viewOtherUser标记为true'); + } uni.setStorageSync('routeUid', safePublisherId); // 设置查看其他用户标记 uni.setStorageSync('viewOtherUser', 'true'); - console.log('设置viewOtherUser标记为true'); } else { - console.log('查看自己,清除routeUid和viewOtherUser'); + if (NETWORK_CONFIG.DEBUG) { + console.log('查看自己,清除routeUid和viewOtherUser'); + } uni.removeStorageSync('routeUid'); uni.removeStorageSync('viewOtherUser'); } - console.log('准备跳转到用户主页...'); + if (NETWORK_CONFIG.DEBUG) { + console.log('准备跳转到用户主页...'); + } // 使用switchTab跳转到profile页面(因为它在tabBar中) uni.switchTab({ url: '/pages/profile/index', success: (res) => { - console.log('跳转到用户主页成功:', res); - console.log('跳转成功,查看用户ID:', safePublisherId); + if (NETWORK_CONFIG.DEBUG) { + console.log('跳转到用户主页成功:', res); + console.log('跳转成功,查看用户ID:', safePublisherId); + } }, fail: (err) => { - console.error('=== 跳转失败详细信息 ==='); - console.error('跳转到用户主页失败:', err); - console.error('错误对象:', JSON.stringify(err, null, 2)); - console.error('错误类型:', typeof err); - console.error('错误消息:', err.errMsg || err.message || '无错误消息'); - console.error('错误代码:', err.errCode || err.code || '无错误代码'); - console.error('publisherId:', safePublisherId); - console.error('========================'); + if (NETWORK_CONFIG.DEBUG) { + console.error('=== 跳转失败详细信息 ==='); + console.error('跳转到用户主页失败:', err); + console.error('错误对象:', JSON.stringify(err, null, 2)); + console.error('错误类型:', typeof err); + console.error('错误消息:', err.errMsg || err.message || '无错误消息'); + console.error('错误代码:', err.errCode || err.code || '无错误代码'); + console.error('publisherId:', safePublisherId); + console.error('========================'); + } uni.showToast({ title: `页面跳转失败: ${err.errMsg || '未知错误'}`, @@ -2198,26 +2247,34 @@ import { NETWORK_CONFIG } from '@/config/network.js' } }; - // 处理头像加载错误 + // 处理头像加载错误(静默处理,不输出日志,避免刷屏) const handleAvatarError = () => { - console.log('用户头像加载失败,使用默认头像'); + // 头像加载失败是正常情况,使用默认头像即可,不需要输出日志 + // 避免在任务列表页面大量任务时刷屏 }; - // 处理任务头像加载错误 + // 处理任务头像加载错误(静默处理,不输出日志,避免刷屏) const handleTaskAvatarError = () => { - console.log('任务发布者头像加载失败,使用默认头像'); + // 头像加载失败是正常情况,使用默认头像即可,不需要输出日志 + // 避免在任务列表页面大量任务时刷屏 }; // 导航方法 const goToNewPeople = () => { - console.log('尝试跳转到新人福利页面') + if (NETWORK_CONFIG.DEBUG) { + console.log('尝试跳转到新人福利页面') + } uni.navigateTo({ url: '/pages/newpeople/index', success: () => { - console.log('跳转到新人福利页面成功') + if (NETWORK_CONFIG.DEBUG) { + console.log('跳转到新人福利页面成功') + } }, fail: (err) => { - console.error('跳转到新人福利页面失败:', err) + if (NETWORK_CONFIG.DEBUG) { + console.error('跳转到新人福利页面失败:', err) + } uni.showToast({ title: '页面跳转失败', icon: 'none' @@ -2230,7 +2287,9 @@ import { NETWORK_CONFIG } from '@/config/network.js' uni.navigateTo({ url: '/pages/business/sponsorship/index', fail: (err) => { - console.error('跳转到赞助排行榜页面失败:', err) + if (NETWORK_CONFIG.DEBUG) { + console.error('跳转到赞助排行榜页面失败:', err) + } uni.showToast({ title: '页面跳转失败', icon: 'none' @@ -2243,7 +2302,9 @@ import { NETWORK_CONFIG } from '@/config/network.js' uni.navigateTo({ url: '/pages/apex/index', fail: (err) => { - console.error('跳转到巅峰人才榜页面失败:', err) + if (NETWORK_CONFIG.DEBUG) { + console.error('跳转到巅峰人才榜页面失败:', err) + } uni.showToast({ title: '页面跳转失败', icon: 'none' @@ -2256,7 +2317,9 @@ import { NETWORK_CONFIG } from '@/config/network.js' uni.switchTab({ url: '/pages/my-task/index', fail: (err) => { - console.error('跳转到我的任务页面失败:', err) + if (NETWORK_CONFIG.DEBUG) { + console.error('跳转到我的任务页面失败:', err) + } uni.showToast({ title: '页面跳转失败', icon: 'none' @@ -2273,7 +2336,9 @@ import { NETWORK_CONFIG } from '@/config/network.js' uni.switchTab({ url: '/pages/message/index', fail: (err) => { - console.error('跳转到消息中心页面失败:', err) + if (NETWORK_CONFIG.DEBUG) { + console.error('跳转到消息中心页面失败:', err) + } uni.showToast({ title: '页面跳转失败', icon: 'none' @@ -2286,7 +2351,9 @@ import { NETWORK_CONFIG } from '@/config/network.js' uni.navigateTo({ url: '/pages/education/index', fail: (err) => { - console.error('跳转到智索真源圈子页面失败:', err) + if (NETWORK_CONFIG.DEBUG) { + console.error('跳转到智索真源圈子页面失败:', err) + } uni.showToast({ title: '页面跳转失败', icon: 'none' @@ -2342,7 +2409,9 @@ import { NETWORK_CONFIG } from '@/config/network.js' onMounted(async () => { try { - console.log('首页开始初始化...'); + if (NETWORK_CONFIG.DEBUG) { + console.log('首页开始初始化...'); + } // 先初始化UI相关设置,不依赖网络请求 checkMobile(); @@ -2355,7 +2424,9 @@ import { NETWORK_CONFIG } from '@/config/network.js' // 检查是否有token,没有就跳转到登录页 const token = uni.getStorageSync("accessToken"); if (!token) { - console.log('未检测到token,执行认证检查'); + if (NETWORK_CONFIG.DEBUG) { + console.log('未检测到token,执行认证检查'); + } checkAuth(); // 这个函数会在没有token时跳转到登录页 return; // 如果需要跳转,就不继续执行了 } @@ -2367,12 +2438,18 @@ import { NETWORK_CONFIG } from '@/config/network.js' // 确保有用户信息 if (!userStore.profile) { - console.log('有token但无用户信息,尝试获取用户信息'); + if (NETWORK_CONFIG.DEBUG) { + console.log('有token但无用户信息,尝试获取用户信息'); + } try { await userStore.fetchUserProfile(); - console.log('获取用户信息成功:', userStore.profile); + if (NETWORK_CONFIG.DEBUG) { + console.log('获取用户信息成功:', userStore.profile); + } } catch (error) { - console.error('获取用户信息失败,使用默认值:', error); + if (NETWORK_CONFIG.DEBUG) { + console.error('获取用户信息失败,使用默认值:', error); + } // 设置默认用户资料,确保UI可以正常显示 userStore.setUser({ uid: 'default-user', @@ -2382,33 +2459,43 @@ import { NETWORK_CONFIG } from '@/config/network.js' } } - console.log('用户初始化完成,当前用户数据:', userStore); + if (NETWORK_CONFIG.DEBUG) { + console.log('用户初始化完成,当前用户数据:', userStore); + } // 初始化地理位置和任务数据 updateCities(); - // 先获取一次任务列表,不依赖位置 + // 先获取一次任务列表,不依赖位置 + if (NETWORK_CONFIG.DEBUG) { console.log('获取初始任务列表...'); - await fetchTasks(); - - // 然后异步获取位置信息 + } + await fetchTasks(); + + // 然后异步获取位置信息 + if (NETWORK_CONFIG.DEBUG) { console.log('开始获取位置信息...'); - setTimeout(() => { - try { - fetchCurrentLocation(); - } catch (locError) { + } + setTimeout(() => { + try { + fetchCurrentLocation(); + } catch (locError) { + if (NETWORK_CONFIG.DEBUG) { console.error('获取位置信息失败:', locError); - // 位置获取失败时使用默认位置 - currentLocation.value = { - latitude: 39.9042, - longitude: 116.4074 - }; - fetchTasks(); } - }, 500); + // 位置获取失败时使用默认位置 + currentLocation.value = { + latitude: 39.9042, + longitude: 116.4074 + }; + fetchTasks(); + } + }, 500); } catch (error) { - console.error('初始化首页失败:', error); + if (NETWORK_CONFIG.DEBUG) { + console.error('初始化首页失败:', error); + } uni.showToast({ title: '初始化失败,请重试', icon: 'none', @@ -2520,12 +2607,14 @@ import { NETWORK_CONFIG } from '@/config/network.js' } showRegionSelector.value = false // debug: 打印地区选择 - console.log('[DEBUG] 用户选择的地区:', { - province: selectedProvince.value, - city: selectedCity.value, - district: selectedDistrict.value, - adCode: selectedAdCode.value - }) + if (NETWORK_CONFIG.DEBUG) { + console.log('[DEBUG] 用户选择的地区:', { + province: selectedProvince.value, + city: selectedCity.value, + district: selectedDistrict.value, + adCode: selectedAdCode.value + }) + } uni.showToast({ title: `adCode: ${selectedAdCode.value}`, icon: 'none', diff --git a/pages/message/components/ActionMessage.vue b/pages/message/components/ActionMessage.vue new file mode 100644 index 00000000..752d8152 --- /dev/null +++ b/pages/message/components/ActionMessage.vue @@ -0,0 +1,49 @@ + + + + + + diff --git a/pages/message/components/BottomDecoration.vue b/pages/message/components/BottomDecoration.vue new file mode 100644 index 00000000..cc17f454 --- /dev/null +++ b/pages/message/components/BottomDecoration.vue @@ -0,0 +1,28 @@ + + + + + + diff --git a/pages/message/components/EmptyState.vue b/pages/message/components/EmptyState.vue new file mode 100644 index 00000000..cc633a97 --- /dev/null +++ b/pages/message/components/EmptyState.vue @@ -0,0 +1,56 @@ + + + + + + diff --git a/pages/message/components/ErrorState.vue b/pages/message/components/ErrorState.vue new file mode 100644 index 00000000..817eba25 --- /dev/null +++ b/pages/message/components/ErrorState.vue @@ -0,0 +1,54 @@ + + + + + + diff --git a/pages/message/components/ExamScheduleDialog.vue b/pages/message/components/ExamScheduleDialog.vue new file mode 100644 index 00000000..e29355ec --- /dev/null +++ b/pages/message/components/ExamScheduleDialog.vue @@ -0,0 +1,326 @@ + + + + + + diff --git a/pages/message/components/LoadingState.vue b/pages/message/components/LoadingState.vue new file mode 100644 index 00000000..c2248296 --- /dev/null +++ b/pages/message/components/LoadingState.vue @@ -0,0 +1,73 @@ + + + + + + diff --git a/pages/message/components/MessageCard.vue b/pages/message/components/MessageCard.vue new file mode 100644 index 00000000..a1aabc1b --- /dev/null +++ b/pages/message/components/MessageCard.vue @@ -0,0 +1,487 @@ + + + + + + diff --git a/pages/message/components/MessageFilters.vue b/pages/message/components/MessageFilters.vue new file mode 100644 index 00000000..1686a420 --- /dev/null +++ b/pages/message/components/MessageFilters.vue @@ -0,0 +1,236 @@ + + + + + + diff --git a/pages/message/components/MessageTabs.vue b/pages/message/components/MessageTabs.vue new file mode 100644 index 00000000..7b34d7f8 --- /dev/null +++ b/pages/message/components/MessageTabs.vue @@ -0,0 +1,271 @@ + + + + + + diff --git a/pages/message/components/Pagination.vue b/pages/message/components/Pagination.vue new file mode 100644 index 00000000..b3a87f5d --- /dev/null +++ b/pages/message/components/Pagination.vue @@ -0,0 +1,191 @@ + + + + + + diff --git a/pages/message/components/ReasonDialog.vue b/pages/message/components/ReasonDialog.vue new file mode 100644 index 00000000..635d2843 --- /dev/null +++ b/pages/message/components/ReasonDialog.vue @@ -0,0 +1,339 @@ + + + + + + diff --git a/pages/message/components/TaskModificationModal.vue b/pages/message/components/TaskModificationModal.vue new file mode 100644 index 00000000..f72b7d2e --- /dev/null +++ b/pages/message/components/TaskModificationModal.vue @@ -0,0 +1,92 @@ + + + + + + diff --git a/pages/message/components/TeamInvitationModal.vue b/pages/message/components/TeamInvitationModal.vue new file mode 100644 index 00000000..b51c6156 --- /dev/null +++ b/pages/message/components/TeamInvitationModal.vue @@ -0,0 +1,144 @@ + + + + + + diff --git a/pages/message/components/VoteModal.vue b/pages/message/components/VoteModal.vue new file mode 100644 index 00000000..bc75f94c --- /dev/null +++ b/pages/message/components/VoteModal.vue @@ -0,0 +1,760 @@ + + + + + + diff --git a/pages/message/components/WorkVerifyDialog.vue b/pages/message/components/WorkVerifyDialog.vue new file mode 100644 index 00000000..d729ebbb --- /dev/null +++ b/pages/message/components/WorkVerifyDialog.vue @@ -0,0 +1,362 @@ + + + + + + diff --git a/pages/message/composables/useExamSchedule.js b/pages/message/composables/useExamSchedule.js new file mode 100644 index 00000000..d6072e83 --- /dev/null +++ b/pages/message/composables/useExamSchedule.js @@ -0,0 +1,197 @@ +// pages/message/composables/useExamSchedule.js +import { ref } from 'vue'; +import { NETWORK_CONFIG } from '@/config/network.js'; + +export function useExamSchedule({ fetchMessages }) { + const showExamScheduleDialog = ref(false); + const currentExamInfo = ref({ examTaskId: null, questionCount: 0, messageId: null }); + const scheduledDateTime = ref(''); + const dateTimePickerValue = ref([0, 0, 0, 0]); + const dateTimePickerRange = ref([[], [], [], []]); + + // 获取最小日期时间(30分钟后) + const getMinDateTime = () => { + const now = new Date(); + now.setMinutes(now.getMinutes() + 30); // 至少30分钟后 + // 使用本地时间格式,避免时区问题 + const yearStr = String(now.getFullYear()); + const monthStr = String(now.getMonth() + 1).padStart(2, '0'); + const dayStr = String(now.getDate()).padStart(2, '0'); + const hourStr = String(now.getHours()).padStart(2, '0'); + const minuteStr = String(now.getMinutes()).padStart(2, '0'); + + const result = `${yearStr}-${monthStr}-${dayStr}T${hourStr}:${minuteStr}`; + if (NETWORK_CONFIG.DEBUG) { + console.log('[DEBUG] 最小预约时间:', result); + } + return result; + }; + + // 打开考试预约弹窗 + const openExamScheduleDialog = (examTaskId, questionCount, messageId) => { + currentExamInfo.value = { examTaskId, questionCount, messageId }; + scheduledDateTime.value = ''; + initDateTimePicker(); + showExamScheduleDialog.value = true; + }; + + // 初始化时间选择器数据 + const initDateTimePicker = () => { + const now = new Date(); + const minDate = new Date(now.getTime() + 30 * 60 * 1000); // 30分钟后 + + // 生成年份选项(当前年份到明年) + const years = []; + for (let year = now.getFullYear(); year <= now.getFullYear() + 1; year++) { + years.push(year + '年'); + } + + // 生成月份选项 + const months = []; + for (let month = 1; month <= 12; month++) { + months.push(month + '月'); + } + + // 生成日期选项(1-31日) + const days = []; + for (let day = 1; day <= 31; day++) { + days.push(day + '日'); + } + + // 生成小时选项(0-23时) + const hours = []; + for (let hour = 0; hour < 24; hour++) { + hours.push(hour + '时'); + } + + // 生成分钟选项(0-59分,每5分钟一个选项) + const minutes = []; + for (let minute = 0; minute < 60; minute += 5) { + minutes.push(minute + '分'); + } + + dateTimePickerRange.value = [years, months, days, hours, minutes]; + + // 设置默认值(30分钟后) + const yearIndex = minDate.getFullYear() - now.getFullYear(); + const monthIndex = minDate.getMonth(); + const dayIndex = minDate.getDate() - 1; + const hourIndex = minDate.getHours(); + // 计算最接近的5分钟间隔 + const minuteIndex = Math.floor(minDate.getMinutes() / 5); + + dateTimePickerValue.value = [yearIndex, monthIndex, dayIndex, hourIndex, minuteIndex]; + + // 更新scheduledDateTime + updateScheduledDateTime(); + }; + + // 时间选择器变化处理 + const onDateTimePickerChange = (e) => { + dateTimePickerValue.value = e.detail.value; + updateScheduledDateTime(); + }; + + // 更新预约时间字符串 + const updateScheduledDateTime = () => { + const [yearIndex, monthIndex, dayIndex, hourIndex, minuteIndex] = dateTimePickerValue.value; + const now = new Date(); + const year = now.getFullYear() + yearIndex; + const month = monthIndex + 1; + const day = dayIndex + 1; + const hour = hourIndex; + const minute = minuteIndex * 5; // 每5分钟一个间隔 + + // 直接使用选择的年月日时分,避免Date对象的时区转换 + const yearStr = String(year); + const monthStr = String(month).padStart(2, '0'); + const dayStr = String(day).padStart(2, '0'); + const hourStr = String(hour).padStart(2, '0'); + const minuteStr = String(minute).padStart(2, '0'); + + scheduledDateTime.value = `${yearStr}-${monthStr}-${dayStr}T${hourStr}:${minuteStr}`; + + if (NETWORK_CONFIG.DEBUG) { + console.log('[DEBUG] 预约时间设置:', { + selected: { year, month, day, hour, minute }, + formatted: scheduledDateTime.value + }); + } + }; + + // 格式化时间选择器显示 + const formatDateTimePickerDisplay = () => { + if (!scheduledDateTime.value) return '请选择时间'; + + try { + const date = new Date(scheduledDateTime.value); + return date.toLocaleString('zh-CN', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit' + }); + } catch (e) { + return '请选择时间'; + } + }; + + // 确认预约 + const confirmExamSchedule = async () => { + if (!scheduledDateTime.value) { + uni.showToast({ title: '请选择考试时间', icon: 'none' }); + return; + } + + try { + const token = uni.getStorageSync('accessToken'); + const res = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/exam/task/schedule`, + method: 'POST', + header: { 'Access-Token': `Bearer ${token}` }, + data: { + examTaskId: currentExamInfo.value.examTaskId, + scheduledStartTime: scheduledDateTime.value, + questionCount: currentExamInfo.value.questionCount + } + }); + + // 同时检查状态码和响应体中的success字段 + if (res.statusCode === 200 && res.data && res.data.success === true) { + uni.showToast({ title: '预约成功', icon: 'success' }); + showExamScheduleDialog.value = false; + fetchMessages(); // 刷新消息列表 + } else { + throw new Error(res.data?.message || res.data || '预约失败'); + } + } catch (e) { + uni.showToast({ title: e.message || '预约失败', icon: 'none' }); + } + }; + + // 取消预约 + const cancelExamSchedule = () => { + showExamScheduleDialog.value = false; + currentExamInfo.value = { examTaskId: null, questionCount: 0, messageId: null }; + scheduledDateTime.value = ''; + dateTimePickerValue.value = [0, 0, 0, 0]; + }; + + return { + showExamScheduleDialog, + currentExamInfo, + scheduledDateTime, + dateTimePickerValue, + dateTimePickerRange, + getMinDateTime, + openExamScheduleDialog, + initDateTimePicker, + onDateTimePickerChange, + updateScheduledDateTime, + formatDateTimePickerDisplay, + confirmExamSchedule, + cancelExamSchedule + }; +} + diff --git a/pages/message/composables/useMessageActions.js b/pages/message/composables/useMessageActions.js new file mode 100644 index 00000000..746c112b --- /dev/null +++ b/pages/message/composables/useMessageActions.js @@ -0,0 +1,327 @@ +/** + * 消息操作逻辑 Composable + * 负责消息的各种操作:任务申请、任务完成、投票、核验等 + */ + +import { ref } from 'vue'; +import { NETWORK_CONFIG } from '@/config/network.js'; +import { formatNumber } from '../utils/messageFormatters.js'; +import { getVoteRuleText, getVoteTypeText } from '../utils/messageHelpers.js'; + +/** + * 消息操作逻辑 Composable + * @param {Object} dependencies - 依赖对象 { fetchMessages, fetchUnreadCounts, getUserNickname } + * @returns {Object} 消息操作相关的响应式状态和方法 + */ +export function useMessageActions(dependencies = {}) { + const { fetchMessages, fetchUnreadCounts, getUserNickname, messages, currentFilters, resetPage } = dependencies; + + // 操作反馈消息 + const actionMsg = ref(''); + + /** + * 处理任务完成申请 + * @param {string|number} messageId - 消息ID + * @param {boolean} approve - 是否同意 + * @param {string} reason - 原因/证明材料 + */ + const handleTaskCompletion = async (messageId, approve, reason = '') => { + const token = uni.getStorageSync('accessToken'); + const result = await handleApiRequest({ + apiCall: () => uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/message/handle-task-completion?id=${messageId}&approve=${approve}&proof=${encodeURIComponent(reason)}`, + method: 'POST', + header: { 'Access-Token': `Bearer ${token}` } + }), + successHandlers: { + onSuccess: async (responseData) => { + actionMsg.value = (responseData && responseData.message) || (approve ? '已同意任务完成' : '已拒绝任务完成'); + uni.showToast({ + title: approve ? '已同意任务完成' : '已拒绝任务完成', + icon: 'success' + }); + + // 刷新消息列表 + await refreshMessagesAfterAction({ + fetchMessages, + fetchUnreadCounts, + currentFilters, + resetPage, + delay: 300 + }); + } + }, + errorHandler: (error) => { + console.error('[消息操作] 处理任务完成申请失败:', error); + } + }); + }; + + /** + * 处理任务申请 + * @param {string|number} id - 消息ID + * @param {boolean} approve - 是否同意 + * @param {string} reason - 拒绝原因(可选) + */ + const handleTaskApply = async (id, approve, reason = '') => { + if (NETWORK_CONFIG.DEBUG) { + console.log('[消息操作] 处理任务申请,消息ID:', id, '同意:', approve, '原因:', reason); + } + + const token = uni.getStorageSync('accessToken'); + const result = await handleApiRequest({ + apiCall: () => uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/message/handle-task-apply?id=${id}&approve=${approve}&reason=${encodeURIComponent(reason)}`, + method: 'POST', + header: { 'Access-Token': `Bearer ${token}` }, + timeout: 10000 + }), + successHandlers: { + onSuccess: async (responseData) => { + if (NETWORK_CONFIG.DEBUG) { + console.log('[消息操作] 任务申请处理响应成功:', responseData); + } + + actionMsg.value = (responseData && responseData.message) || (approve ? '已同意任务申请' : '已拒绝任务申请'); + uni.showToast({ + title: approve ? '已同意任务申请' : '已拒绝任务申请', + icon: 'success' + }); + + // 刷新消息列表 + await refreshMessagesAfterAction({ + fetchMessages, + fetchUnreadCounts, + currentFilters, + resetPage, + delay: 300 + }); + } + }, + errorHandler: (error) => { + console.error('[消息操作] 处理任务申请失败:', error); + } + }); + }; + + /** + * 处理企业入驻申请 + * @param {string|number} id - 消息ID + * @param {boolean} approve - 是否同意 + * @param {string} reason - 拒绝原因(可选) + */ + const handleOrgApply = async (id, approve, reason = '') => { + if (NETWORK_CONFIG.DEBUG) { + console.log('[消息操作] 处理组织申请,消息ID:', id, '同意:', approve); + } + + const token = uni.getStorageSync('accessToken'); + const result = await handleApiRequest({ + apiCall: () => uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/message/handle-org-apply?id=${id}&approve=${approve}&reason=${encodeURIComponent(reason)}`, + method: 'POST', + header: { 'Access-Token': `Bearer ${token}` }, + timeout: 10000 + }), + successHandlers: { + onSuccess: async (responseData) => { + if (NETWORK_CONFIG.DEBUG) { + console.log('[消息操作] 组织申请处理响应成功:', responseData); + } + + actionMsg.value = (responseData && responseData.message) || (approve ? '已同意企业入驻申请' : '已拒绝企业入驻申请'); + uni.showToast({ + title: approve ? '已同意企业入驻申请' : '已拒绝企业入驻申请', + icon: 'success' + }); + + // 刷新消息列表 + await refreshMessagesAfterAction({ + fetchMessages, + fetchUnreadCounts, + currentFilters, + resetPage, + delay: 300 + }); + } + }, + errorHandler: (error) => { + console.error('[消息操作] 处理组织申请失败:', error); + } + }); + }; + + /** + * 处理任务取消申请 + * @param {string|number} messageId - 消息ID + * @param {boolean} approve - 是否同意 + * @param {string} reason - 原因(可选) + * @param {Object} messages - 消息列表对象(用于查找任务ID) + */ + const handleTaskCancelRequest = async (messageId, approve, reason = '', messagesParam = null) => { + const token = uni.getStorageSync('accessToken'); + if (!token) { + uni.showToast({ title: '请先登录', icon: 'none' }); + return; + } + + // 从消息中提取任务ID(优先使用传入的 messages,否则使用依赖中的 messages) + const messagesToUse = messagesParam || messages; + const messagesContent = messagesToUse?.value?.content || messagesToUse?.content || []; + const message = messagesContent.find(msg => msg.id === messageId); + if (!message || !message.taskId) { + uni.showToast({ title: '无法获取任务信息', icon: 'none' }); + return; + } + + if (NETWORK_CONFIG.DEBUG) { + console.log('[消息操作] 处理任务取消申请,消息ID:', messageId, '同意:', approve); + } + + const url = `${NETWORK_CONFIG.API_BASE_URL}/task/handle-cancel-request?taskId=${message.taskId}&approve=${approve}`; + const data = { reason }; + + const result = await handleApiRequest({ + apiCall: () => uni.request({ + url, + method: 'POST', + data, + header: { + 'Content-Type': 'application/json', + 'Access-Token': `Bearer ${token}` + }, + timeout: 10000 + }), + successHandlers: { + onSuccess: async (responseData) => { + if (NETWORK_CONFIG.DEBUG) { + console.log('[消息操作] 任务取消申请处理响应成功:', responseData); + } + + uni.showToast({ + title: approve ? '已同意取消任务' : '已拒绝取消任务', + icon: 'success' + }); + + // 刷新消息列表 + await refreshMessagesAfterAction({ + fetchMessages, + fetchUnreadCounts, + currentFilters: currentFilters || { value: { category: 'user', type: '', status: '' } }, + resetPage, + delay: 300 + }); + + // 发送全局事件通知任务详情页面刷新 + if (approve) { + uni.$emit('task-cancel-approved', { + taskId: message.taskId, + message: '任务取消申请已同意,任务状态已更新' + }); + } + } + }, + errorHandler: (error) => { + console.error('[消息操作] 任务取消申请处理失败:', error); + } + }); + }; + + /** + * 统一处理操作(根据操作类型调用相应的处理函数) + * @param {Object} action - 操作对象 { id, type, approve, reason, messages } + */ + const handleAction = async (action) => { + if (!action || !action.id) { + if (NETWORK_CONFIG.DEBUG) { + console.warn('[消息操作] ⚠️ action 或 action.id 为空,无法处理'); + } + return; + } + + const { id, type, approve, reason = '', messages } = action; + + if (NETWORK_CONFIG.DEBUG) { + console.log('[消息操作] handleAction 被调用,参数:', action); + console.log('[消息操作] 操作详情 - ID:', id, '类型:', type, '同意:', approve); + } + + switch (type) { + case 'org-apply': + await handleOrgApply(id, approve, reason); + break; + case 'task-apply': + await handleTaskApply(id, approve, reason); + break; + case 'task-completion': + await handleTaskCompletion(id, approve, reason); + break; + case 'task-cancel-request': + await handleTaskCancelRequest(id, approve, reason, messages); + break; + default: + console.warn('[消息操作] ⚠️ 未知的操作类型:', type); + uni.showToast({ title: `未知的操作类型: ${type}`, icon: 'none' }); + } + }; + + /** + * 处理同意操作 + * @param {Object} action - 操作对象 + */ + const handleApprove = async (action) => { + if (!action || !action.id) { + if (NETWORK_CONFIG.DEBUG) { + console.warn('[消息操作] ⚠️ action 或 action.id 为空'); + } + uni.showToast({ title: '操作失败:缺少消息ID', icon: 'none' }); + return; + } + + if (NETWORK_CONFIG.DEBUG) { + console.log('[消息操作] handleApprove 被调用,参数:', action); + } + + await handleAction({ ...action, approve: true }); + }; + + /** + * 处理拒绝操作 + * @param {Object} action - 操作对象 + */ + const handleReject = async (action) => { + if (!action || !action.id) { + if (NETWORK_CONFIG.DEBUG) { + console.warn('[消息操作] ⚠️ action 或 action.id 为空'); + } + uni.showToast({ title: '操作失败:缺少消息ID', icon: 'none' }); + return; + } + + if (NETWORK_CONFIG.DEBUG) { + console.log('[消息操作] handleReject 被调用,参数:', action); + } + + await handleAction({ ...action, approve: false }); + }; + + return { + // 状态 + actionMsg, + + // 方法 + handleTaskCompletion, + handleTaskApply, + handleOrgApply, + handleTaskCancelRequest, + handleAction, + handleApprove, + handleReject, + + // 工具函数(重新导出,方便使用) + formatNumber, + getVoteRuleText, + getVoteTypeText + }; +} + diff --git a/pages/message/composables/useMessageData.js b/pages/message/composables/useMessageData.js new file mode 100644 index 00000000..a50c754b --- /dev/null +++ b/pages/message/composables/useMessageData.js @@ -0,0 +1,447 @@ +/** + * 消息数据管理 Composable + * 负责消息列表的获取、未读计数、倒计时管理等功能 + */ + +import { ref, reactive, onBeforeUnmount } from 'vue'; +import { NETWORK_CONFIG } from '@/config/network.js'; +import { getExpiresAt } from '../utils/messageHelpers.js'; + +/** + * 消息数据管理 Composable + * @returns {Object} 消息数据管理相关的响应式状态和方法 + */ +export function useMessageData() { + // 消息列表数据 + const messages = ref({ content: [], totalPages: 1, totalElements: 0 }); + const loading = ref(false); + const error = ref(''); + + // 分页参数 + const page = ref(0); + const size = ref(10); + + // 倒计时管理 + const msgCountdownMap = reactive({}); + let msgCountdownTimer = null; + + /** + * 获取消息列表 + * @param {Object} filters - 筛选参数 { category, type, status } + */ + const fetchMessages = async (filters = {}) => { + loading.value = true; + error.value = ''; + try { + const token = uni.getStorageSync('accessToken'); + const params = { page: page.value, size: size.value }; + + // 添加分类筛选参数(category 是必需的) + if (filters && typeof filters === 'object') { + // category 必须存在且不为空 + if (filters.category && filters.category.trim() !== '') { + params.category = filters.category; + } else { + // 如果没有 category,默认使用 'system' + params.category = 'system'; + } + + // status 是可选的 + if (filters.status !== undefined && filters.status !== null && filters.status !== '') { + params.status = Number(filters.status); + } + + // type 是可选的 + if (filters.type !== undefined && filters.type !== null && filters.type !== '') { + params.type = Number(filters.type); + } + } else { + // 如果 filters 无效,使用默认值 + params.category = 'system'; + } + + // 调试信息:打印请求参数(仅在DEBUG模式) + if (NETWORK_CONFIG.DEBUG) { + console.log('[消息列表] 请求参数:', JSON.stringify(params, null, 2)); + } + + const res = await new Promise((resolve, reject) => { + uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/message/list`, + method: 'GET', + header: { 'Access-Token': `Bearer ${token}` }, + data: params, + success: (result) => { + // 调试信息:打印响应数据(仅在DEBUG模式) + if (NETWORK_CONFIG.DEBUG) { + console.log('[消息列表] HTTP 状态码:', result.statusCode); + console.log('[消息列表] 响应数据:', JSON.stringify(result.data, null, 2)); + } + + // 检查 HTTP 状态码 + if (result.statusCode >= 200 && result.statusCode < 300) { + resolve(result); + } else { + console.error('[消息列表] HTTP 错误:', result.statusCode, result.data); + reject(new Error(`HTTP ${result.statusCode}: ${result.data?.message || '请求失败'}`)); + } + }, + fail: (err) => { + console.error('[消息列表] uni.request 失败:', err); + reject(new Error(err.errMsg || '网络请求失败')); + } + }); + }); + + // 确保数据结构正确(仅在DEBUG模式打印) + if (NETWORK_CONFIG.DEBUG) { + console.log('[消息列表] 处理响应数据,原始数据:', res.data); + } + + // 处理不同的响应格式 + let processedData = null; + + // 情况1: 标准分页格式 { content: [], totalPages: 1, totalElements: 0 } + if (res.data && res.data.content && Array.isArray(res.data.content)) { + processedData = res.data; + if (NETWORK_CONFIG.DEBUG) { + console.log('[消息列表] 使用标准分页格式,消息数量:', processedData.content.length); + } + } + // 情况2: 直接返回数组 + else if (Array.isArray(res.data)) { + processedData = { + content: res.data, + totalPages: 1, + totalElements: res.data.length + }; + if (NETWORK_CONFIG.DEBUG) { + console.log('[消息列表] 包装数组格式,消息数量:', processedData.content.length); + } + } + // 情况3: 后端返回的包装格式 { code: 200, data: { content: [] } } + else if (res.data && res.data.data) { + const backendData = res.data.data; + if (backendData.content && Array.isArray(backendData.content)) { + processedData = backendData; + if (NETWORK_CONFIG.DEBUG) { + console.log('[消息列表] 使用后端包装格式,消息数量:', processedData.content.length); + } + } else if (Array.isArray(backendData)) { + processedData = { + content: backendData, + totalPages: 1, + totalElements: backendData.length + }; + if (NETWORK_CONFIG.DEBUG) { + console.log('[消息列表] 使用后端数组格式,消息数量:', processedData.content.length); + } + } + } + // 情况4: 其他格式,尝试提取数据 + else if (res.data && typeof res.data === 'object') { + // 尝试查找 content 字段 + const possibleContent = res.data.content || res.data.list || res.data.items || res.data.messages || []; + if (Array.isArray(possibleContent)) { + processedData = { + content: possibleContent, + totalPages: res.data.totalPages || res.data.total_pages || 1, + totalElements: res.data.totalElements || res.data.total_elements || res.data.total || possibleContent.length + }; + if (NETWORK_CONFIG.DEBUG) { + console.log('[消息列表] 使用其他格式,消息数量:', processedData.content.length); + } + } + } + + // 如果还是没有找到数据,使用空数据 + if (!processedData) { + console.warn('[消息列表] 无法解析响应数据,使用空数据,原始响应:', res.data); + processedData = { content: [], totalPages: 1, totalElements: 0 }; + } + + messages.value = processedData; + + // 详细日志:显示每条消息的基本信息(仅在DEBUG模式) + if (NETWORK_CONFIG.DEBUG) { + console.log('[消息列表] 最终消息数量:', messages.value.content.length, '总页数:', messages.value.totalPages); + if (messages.value.content.length > 0) { + console.log('[消息列表] 消息详情:'); + messages.value.content.forEach((msg, index) => { + console.log(` [${index + 1}] ID: ${msg.id}, 类型: ${msg.type || msg.applicationType}, 标题: ${msg.title}, 状态: ${msg.status}`); + }); + } else { + console.log('[消息列表] 当前分类没有消息,分类:', params.category, '类型:', params.type || '全部', '状态:', params.status || '全部'); + } + } + + // 初始化/更新倒计时映射(基于后端 remainingSeconds 或过期时间) + (messages.value?.content || []).forEach(m => { + if (!m.id) return; + + // 优先使用后端返回的 remainingSeconds(如果有) + const sec = typeof m.remainingSeconds === 'number' ? m.remainingSeconds : null; + if (sec != null) { + msgCountdownMap[m.id] = Math.max(0, sec); + } else { + // 如果没有 remainingSeconds,尝试从过期时间计算 + // 只计算未投票(status === 0)且未过期(有 expiresAt)的消息 + const expiresAt = getExpiresAt(m); + if (expiresAt && m.status === 0) { + try { + let expiresMs = null; + if (typeof expiresAt === 'number') { + expiresMs = expiresAt < 1e12 ? expiresAt * 1000 : expiresAt; + } else if (typeof expiresAt === 'string') { + const trimmed = expiresAt.trim(); + if (/^\d+$/.test(trimmed)) { + const num = Number(trimmed); + expiresMs = num < 1e12 ? num * 1000 : num; + } else { + const looksISO = trimmed.includes('T'); + const hasZone = /[zZ]|[+\-]\d{2}:?\d{2}$/.test(trimmed); + + if (looksISO && !hasZone) { + const parsed = Date.parse(trimmed); + if (!isNaN(parsed)) expiresMs = parsed; + } else if (!looksISO && !hasZone) { + const localParsed = Date.parse(trimmed.replace(' ', 'T')); + const utc8Parsed = Date.parse(trimmed.replace(' ', 'T') + '+08:00'); + const now = Date.now(); + if (!isNaN(localParsed) && Math.abs(localParsed - now) < Math.abs((utc8Parsed || 0) - now)) { + expiresMs = localParsed; + } else if (!isNaN(utc8Parsed)) { + expiresMs = utc8Parsed; + } else if (!isNaN(localParsed)) { + expiresMs = localParsed; + } + } else { + const parsed = Date.parse(trimmed); + if (!isNaN(parsed)) expiresMs = parsed; + } + } + } else if (expiresAt instanceof Date) { + expiresMs = expiresAt.getTime(); + } + + if (expiresMs) { + const remainingMs = expiresMs - Date.now(); + const remainingSec = Math.floor(remainingMs / 1000); + if (remainingSec > 0) { + msgCountdownMap[m.id] = remainingSec; + } + } + } catch (e) { + console.error('计算投票消息倒计时失败:', e); + } + } + } + }); + + // 开启全局唯一的 setInterval + if (!msgCountdownTimer) { + msgCountdownTimer = setInterval(() => { + Object.keys(msgCountdownMap).forEach(k => { + const current = msgCountdownMap[k] || 0; + if (current > 0) { + msgCountdownMap[k] = current - 1; + // 倒计时到0时,检查是否需要更新状态或刷新 + if (msgCountdownMap[k] === 0) { + const msg = messages.value?.content?.find(m => m.id == k); + if (msg && msg.status === 0) { + // 延迟1秒后检查,给后端一些时间处理 + setTimeout(() => { + const stillPending = messages.value?.content?.find(m => m.id == k && m.status === 0); + if (stillPending) { + // 可以触发刷新,但为了不过于频繁,先不自动刷新 + } + }, 1000); + } + } + } + }); + }, 1000); + } + } catch (e) { + error.value = e.response?.data?.message || e.message || '请求失败'; + } finally { + loading.value = false; + } + }; + + /** + * 获取未读消息计数 + * @param {Array} mainTabs - 主选项卡数组(需要更新未读计数) + * @returns {Promise} 未读计数对象 + */ + const fetchUnreadCounts = async (mainTabs) => { + try { + const token = uni.getStorageSync('accessToken'); + + const res = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/message/unread-count`, + method: 'GET', + header: { 'Access-Token': `Bearer ${token}` } + }); + + if (res.data.success) { + const unreadCounts = res.data.unreadCounts; + + // 更新各选项卡的未读计数 + if (mainTabs && mainTabs.value) { + mainTabs.value.forEach(tab => { + tab.unreadCount = unreadCounts[tab.value] || 0; + }); + } + + // 计算总未读数量 + const totalUnread = (unreadCounts.system || 0) + + (unreadCounts.user || 0) + + (unreadCounts.vote || 0) + + (unreadCounts.verification || 0); + + // 更新底部导航栏的红点(消息页面在第3个位置,索引为2) + if (totalUnread > 0) { + uni.setTabBarBadge({ + index: 2, + text: totalUnread > 99 ? '99+' : totalUnread.toString() + }); + } else { + uni.removeTabBarBadge({ index: 2 }); + } + + return unreadCounts; + } + } catch (e) { + console.error('获取未读消息计数失败:', e); + } + return null; + }; + + /** + * 标记消息为已读 + * @param {string|number} id - 消息ID + * @param {string} category - 消息分类(可选) + */ + const markAsRead = async (id, category = null) => { + try { + const token = uni.getStorageSync('accessToken'); + await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/message/read?id=${id}`, + method: 'POST', + header: { 'Access-Token': `Bearer ${token}` } + }); + + // 更新本地消息状态 + const msg = messages.value.content.find(m => m.id == id); + if (msg) { + msg.status = 1; // 标记为已读 + } + } catch (e) { + console.error('标记已读失败:', e); + } + }; + + /** + * 批量标记系统消息为已读 + */ + const markAllSystemMessagesRead = async () => { + try { + uni.showLoading({ title: '处理中...' }); + const token = uni.getStorageSync('accessToken'); + + // 获取当前所有未读的系统消息 + const unreadMessages = messages.value.content.filter(msg => msg.status === 0); + + if (unreadMessages.length === 0) { + uni.hideLoading(); + uni.showToast({ title: '没有未读消息', icon: 'none' }); + return; + } + + // 批量标记为已读 + let successCount = 0; + for (const msg of unreadMessages) { + try { + await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/message/read?id=${msg.id}`, + method: 'POST', + header: { 'Access-Token': `Bearer ${token}` } + }); + successCount++; + } catch (e) { + console.error(`标记消息 ${msg.id} 为已读失败:`, e); + } + } + + uni.hideLoading(); + + if (successCount > 0) { + uni.showToast({ + title: `已标记 ${successCount} 条消息为已读`, + icon: 'success', + duration: 2000 + }); + + // 刷新消息列表和未读计数 + await fetchMessages({ category: 'system' }); + } else { + uni.showToast({ title: '操作失败', icon: 'none' }); + } + } catch (e) { + uni.hideLoading(); + console.error('批量标记已读失败:', e); + uni.showToast({ title: '操作失败,请重试', icon: 'none' }); + } + }; + + /** + * 切换页码 + * @param {number} p - 页码 + * @param {Object} filters - 筛选参数 + */ + const changePage = (p, filters = {}) => { + page.value = p; + fetchMessages(filters); + }; + + /** + * 重置页码到第一页 + */ + const resetPage = () => { + page.value = 0; + }; + + // 清理定时器 + const cleanup = () => { + if (msgCountdownTimer) { + clearInterval(msgCountdownTimer); + msgCountdownTimer = null; + } + }; + + // 组件卸载时清理 + onBeforeUnmount(() => { + cleanup(); + }); + + return { + // 状态 + messages, + loading, + error, + page, + size, + msgCountdownMap, + + // 方法 + fetchMessages, + fetchUnreadCounts, + markAsRead, + markAllSystemMessagesRead, + changePage, + resetPage, + cleanup + }; +} + diff --git a/pages/message/composables/useMessageFilters.js b/pages/message/composables/useMessageFilters.js new file mode 100644 index 00000000..8caa0f6f --- /dev/null +++ b/pages/message/composables/useMessageFilters.js @@ -0,0 +1,245 @@ +/** + * 消息筛选逻辑 Composable + * 负责选项卡切换、筛选器状态管理等功能 + */ + +import { ref, computed, watch } from 'vue'; + +/** + * 主选项卡配置 + */ +export const mainTabsConfig = [ + { value: 'system', label: '系统消息', count: 0, unreadCount: 0 }, + { value: 'user', label: '用户事务', count: 0, unreadCount: 0 }, + { value: 'vote', label: '投票事务', count: 0, unreadCount: 0 }, + { value: 'verification', label: '远程核验', count: 0, unreadCount: 0 } +]; + +/** + * 子类型选项卡配置 + */ +export const subTabsConfig = { + system: [ + { value: '', label: '全部系统通知' }, + { value: '-1', label: '通用通知' }, + { value: '-10', label: '任务申请通过' }, + { value: '-11', label: '任务申请拒绝' }, + { value: '-12', label: '任务完成通知' }, + { value: '-13', label: '任务取消通知' }, + { value: '-14', label: '组织申请通过' }, + { value: '-15', label: '组织申请拒绝' }, + { value: '-16', label: '申请已提交' }, + { value: '-17', label: '申请已撤回' }, + { value: '-18', label: '取消申请已发送' }, + { value: '-19', label: '任务申请撤回' }, + { value: '-20', label: '任务完成申请撤回' }, + { value: '-21', label: '任务取消申请处理结果' }, + { value: '-24', label: '团队邀请已同意' }, + { value: '-25', label: '团队邀请已拒绝' }, + { value: '-26', label: '团队邀请已撤回' }, + { value: '-27', label: '团队任务已申请' }, + { value: '-28', label: '团队任务已开始' }, + { value: '-29', label: '团队任务已取消' }, + { value: '-30', label: '团队任务无需处理' } + ], + user: [ + { value: '', label: '全部用户申请' }, + { value: '2', label: '好友请求' }, + { value: '3', label: '任务申请' }, + { value: '4', label: '任务完成' }, + { value: '5', label: '取消申请' }, + { value: '10', label: '团队邀请' } + ], + vote: [ + { value: '', label: '全部投票消息' }, + { value: '16', label: '团队投票' }, + { value: '17', label: '任务投票' }, + { value: '18', label: '选举投票' } + ], + verification: [ + { value: '', label: '全部核验消息' }, + { value: '64', label: '核验消息' }, + { value: '65', label: '工作核验' }, + { value: '66', label: 'AI远程提问' } + ] +}; + +/** + * 各分类的状态选项配置 + */ +export const statusOptionsConfig = { + system: [ + { value: '', label: '全部状态' }, + { value: '0', label: '未读' }, + { value: '1', label: '已读' } + ], + user: [ + { value: '', label: '全部状态' }, + { value: '0', label: '待处理' }, + { value: '1', label: '已同意' }, + { value: '2', label: '已拒绝' }, + { value: '3', label: '已撤回' } + ], + vote: [ + { value: '', label: '全部状态' }, + { value: '0', label: '待投票' }, + { value: '1', label: '已投同意' }, + { value: '2', label: '已投拒绝' }, + { value: '4', label: '已撤回' }, + { value: '5', label: '已结束' } + ], + verification: [ + { value: '', label: '全部状态' }, + { value: '0', label: '未处理' }, + { value: '1', label: '已处理' }, + { value: '2', label: '已过期' } + ] +}; + +/** + * 消息筛选逻辑 Composable + * @param {Function} fetchMessages - 获取消息列表的函数 + * @returns {Object} 筛选相关的响应式状态和方法 + */ +export function useMessageFilters(fetchMessages) { + // 筛选参数 + const category = ref('system'); // 默认显示系统消息 + const type = ref(''); + const status = ref(''); + const statusIndex = ref(0); + + // 主选项卡 + const mainTabs = ref(mainTabsConfig.map(tab => ({ ...tab }))); + + // 当前子选项卡 + const currentSubTabs = ref([]); + const showSubTabs = ref(false); + + // 当前状态选项(根据选中的主选项卡动态变化) + const currentStatusOptions = ref(statusOptionsConfig.system); + + // 计算当前筛选参数(确保 category 始终存在) + const currentFilters = computed(() => { + const cat = category.value && category.value.trim() !== '' + ? category.value + : 'system'; + + const filters = { + category: cat, + type: type.value || '', + status: status.value || '' + }; + + return filters; + }); + + /** + * 选择主选项卡 + * @param {string} tabValue - 选项卡值 + */ + const selectMainTab = (tabValue) => { + category.value = tabValue; + type.value = ''; // 重置子类型选择 + + // 更新子选项卡 + currentSubTabs.value = subTabsConfig[tabValue] || []; + showSubTabs.value = currentSubTabs.value.length > 1; + + // 更新状态选项 + currentStatusOptions.value = statusOptionsConfig[tabValue] || []; + status.value = ''; // 重置状态筛选 + statusIndex.value = 0; // 重置状态索引 + + // 重新获取消息 + if (fetchMessages) { + const filters = currentFilters.value; + fetchMessages(filters); + } + }; + + /** + * 选择子选项卡 + * @param {string} subTabValue - 子选项卡值 + */ + const selectSubTab = (subTabValue) => { + type.value = subTabValue; + + if (fetchMessages) { + fetchMessages(currentFilters.value); + } + }; + + /** + * 应用筛选 + */ + const applyFilter = () => { + if (fetchMessages) { + fetchMessages(currentFilters.value); + } + }; + + /** + * 重置筛选 + */ + const resetFilters = () => { + type.value = ''; + status.value = ''; + category.value = 'system'; // 重置为系统消息 + statusIndex.value = 0; + + // 重置状态选项 + currentStatusOptions.value = statusOptionsConfig['system'] || []; + + // 更新子选项卡 + currentSubTabs.value = subTabsConfig['system'] || []; + showSubTabs.value = currentSubTabs.value.length > 1; + + if (fetchMessages) { + fetchMessages(currentFilters.value); + } + }; + + /** + * 状态选择器变化处理(H5) + */ + const onStatusPickerChange = (e) => { + const index = e.detail.value; + statusIndex.value = index; + if (currentStatusOptions.value[index]) { + status.value = currentStatusOptions.value[index].value; + applyFilter(); + } + }; + + // 监听分类变化,更新状态选项 + watch(category, (newCategory) => { + currentStatusOptions.value = statusOptionsConfig[newCategory] || []; + status.value = ''; + statusIndex.value = 0; + }); + + // 初始化子选项卡 + currentSubTabs.value = subTabsConfig[category.value] || []; + showSubTabs.value = currentSubTabs.value.length > 1; + + return { + // 状态 + category, + type, + status, + statusIndex, + mainTabs, + currentSubTabs, + showSubTabs, + currentStatusOptions, + currentFilters, + + // 方法 + selectMainTab, + selectSubTab, + applyFilter, + resetFilters, + onStatusPickerChange + }; +} + diff --git a/pages/message/composables/useMessageHandlers.js b/pages/message/composables/useMessageHandlers.js new file mode 100644 index 00000000..f43387f3 --- /dev/null +++ b/pages/message/composables/useMessageHandlers.js @@ -0,0 +1,911 @@ +/** + * 消息处理逻辑 Composable + * 负责消息点击、跳转、弹窗显示等处理逻辑 + */ + +import { ref, nextTick } from 'vue'; +import { MessageType, SystemNotificationStatus, MessageUtils } from '@/utils/messageTypes'; +import { resolveMessageType, isLeaderTransferMsg } from '../utils/messageHelpers.js'; +import { formatScheduledTime } from '../utils/messageFormatters.js'; +import { getVerificationStatus, isExpired } from '../utils/messageHelpers.js'; +import { useUserStore } from '@/store/user'; +import { NETWORK_CONFIG } from '@/config/network.js'; +import { refreshMessagesAfterAction, parseResponseData, isSuccessResponse } from '../utils/apiHelpers.js'; + +/** + * 消息处理逻辑 Composable + * @param {Object} dependencies - 依赖对象 + * @returns {Object} 消息处理相关的响应式状态和方法 + */ +export function useMessageHandlers(dependencies = {}) { + const { + messages, + markAsRead, + fetchMessages, + fetchUnreadCounts, // 添加刷新未读计数函数 + currentFilters, // 添加当前筛选参数,用于刷新消息列表 + resetPage, // 重置页码函数(可选) + showVoteModal, + openWorkVerifyDialog, + openExamScheduleDialog, + showTeamInvitationModal, + openTaskModificationModal, + showReasonDialog, + setCurrentAction, + getUserInfo, + getUserNickname, + getUserAvatar, + handleAvatarError + } = dependencies; + + // 团队邀请相关 + const currentTeamInvitation = ref(null); + + /** + * 处理消息点击或跳转(统一入口) + * @param {Object} msg - 消息对象 + * @param {Event} event - 事件对象(可选) + */ + const handleMessageClickOrJump = async (msg, category = 'system') => { + + // 检查是否是系统消息 + const backendSystemTypes = [0, 101, 102, 103]; + const isSystemMsg = MessageUtils?.isSystemMessage?.(msg.type) + || category === 'system' + || (msg.notificationType !== undefined && backendSystemTypes.includes(msg.notificationType)) + || (msg.type !== undefined && backendSystemTypes.includes(msg.type)) + || isLeaderTransferMsg(msg); + + // 如果是系统消息,特殊处理 + if (isSystemMsg) { + // 如果未读,先标记为已读 + if (msg.status === 0 || msg.status === SystemNotificationStatus.UNREAD) { + await markAsRead?.(msg.id, 'system'); + msg.status = SystemNotificationStatus.READ || 1; + } + + // 如果有taskId,跳转到任务详情 + if (msg.taskId) { + uni.navigateTo({ + url: `/pages/task/detail/index?id=${msg.taskId}` + }); + return; + } + + // 如果没有taskId,显示详情弹窗 + uni.showModal({ + title: msg.title || '系统通知', + content: msg.content || '', + showCancel: false, + confirmText: '确定' + }); + return; + } + + // 非系统消息:如果是待处理状态,执行点击逻辑 + if (msg.status === 0) { + handleMessageClick(msg, category); + return; + } + + // 非系统消息且已处理:如果消息有taskId,跳转到任务详情 + if (msg.taskId) { + uni.navigateTo({ + url: `/pages/task/detail/index?id=${msg.taskId}` + }); + return; + } + }; + + /** + * 处理消息点击(根据消息类型执行不同操作) + * @param {Object} msg - 消息对象 + * @param {string} category - 当前分类 + */ + const handleMessageClick = async (msg, category = 'system') => { + try { + const workVerification = typeof msg.extraData === 'string' + ? JSON.parse(msg.extraData || '{}') + : (msg.extraData || {}); + + // 提前兜底:凡是标题/内容/extraData包含投票信号的,优先按投票处理 + const title = msg?.title || ''; + const content = msg?.content || ''; + const hasVoteSignal = title.includes('投票') || + content.includes('投票') || + !!workVerification?.voteId || + workVerification?.type === 'vote' || + workVerification?.eventType === 'TEAM_VOTE'; + + if (hasVoteSignal && msg.taskId) { + showVoteModal?.(msg); + return; + } + + // AI远程提问消息 + if (msg.type === MessageType.AI_EXAM) { + handleAiExamClick(msg); + return; + } + + // 企业入驻申请消息 + if (workVerification && workVerification.action === 'membership_application') { + setCurrentAction?.({ id: msg.id, type: 'org-apply', approve: true }); + showReasonDialog?.({ + title: '处理企业入驻申请', + placeholder: '若选择拒绝,可填写拒绝理由(可选)' + }); + return; + } + + // 任务申请消息 + if (msg.type === MessageType.TASK_APPLICATION && + msg.status !== 1 && msg.status !== 2) { + handleTaskApplyClick(msg); + return; + } + + // 任务申请撤回消息 + if (msg.type === MessageType.TASK_WITHDRAWAL) { + uni.showToast({ title: '任务申请已撤回', icon: 'none' }); + return; + } + + // 任务完成申请撤回消息 + if (msg.type === MessageType.TASK_COMPLETION_WITHDRAWAL) { + uni.showToast({ title: '任务完成申请已撤回', icon: 'none' }); + return; + } + + // 任务完成申请消息 - 直接跳转到任务界面 + if (msg.type === MessageType.TASK_COMPLETION || msg.type === 4) { + handleTaskCompletionClick(msg); + return; + } + + // 任务取消申请消息 + if (msg.type === MessageType.TASK_CANCELLATION) { + setCurrentAction?.({ id: msg.id, type: 'task-cancel-request', approve: true }); + showReasonDialog?.({ + title: '处理任务取消申请', + placeholder: '若选择拒绝,可填写拒绝理由(可选)' + }); + return; + } + + // 任务取消申请处理结果消息 + if (msg.type === MessageType.TASK_CANCELLATION_RESULT) { + const isApproved = msg.title.includes('已同意'); + uni.showToast({ + title: isApproved ? '取消申请已同意' : '取消申请被拒绝', + icon: isApproved ? 'success' : 'none' + }); + return; + } + + // 工作核验消息 + if (msg.type === MessageType.WORK_VERIFICATION) { + handleWorkVerificationClick(msg, workVerification); + return; + } + + // 任务修改申请消息处理 + if (msg.title?.includes('任务修改申请')) { + openTaskModificationModal?.(msg); + return; + } + + // 投票相关消息处理 + if (msg.title?.includes('投票') || msg.content?.includes('投票')) { + if (msg.taskId) { + showVoteModal?.(msg); + } else { + uni.showToast({ title: '请前往任务页面参与投票', icon: 'none' }); + } + return; + } + + // 团队投票消息(特殊处理) + if (msg.type === MessageType.SYSTEM_NOTIFICATION_TEAM_VOTE || + (msg.type === MessageType.SYSTEM_NOTIFICATION_TASK_CANCELLED && + (msg.title?.includes('投票') || msg.content?.includes('投票')))) { + if (msg.taskId) { + showVoteModal?.(msg); + } else { + uni.showToast({ title: '请前往任务页面参与投票', icon: 'none' }); + } + return; + } + + // 团队相关系统消息 + if ([MessageType.SYSTEM_NOTIFICATION_TEAM_INVITATION_ACCEPTED, + MessageType.SYSTEM_NOTIFICATION_TEAM_INVITATION_REJECTED, + MessageType.SYSTEM_NOTIFICATION_TEAM_INVITATION_WITHDRAWN, + MessageType.SYSTEM_NOTIFICATION_TEAM_TASK_APPLIED, + MessageType.SYSTEM_NOTIFICATION_TEAM_TASK_STARTED, + MessageType.SYSTEM_NOTIFICATION_TEAM_TASK_CANCELLED, + MessageType.SYSTEM_NOTIFICATION_TEAM_TASK_NO_NEED].includes(msg.type)) { + if (msg.taskId) { + uni.navigateTo({ + url: `/pages/task/detail/index?id=${msg.taskId}` + }); + } else { + uni.showToast({ title: msg.title || '团队消息', icon: 'none' }); + } + return; + } + + // 系统通知消息 + if (MessageUtils.isSystemMessage(msg.type)) { + if (msg.status === 0 || msg.status === SystemNotificationStatus.UNREAD) { + await markAsRead?.(msg.id, 'system'); + msg.status = SystemNotificationStatus.READ; + } + + if (msg.taskId) { + uni.navigateTo({ + url: `/pages/task/detail/index?id=${msg.taskId}` + }); + } else { + uni.showModal({ + title: msg.title || '系统通知', + content: msg.content || '', + showCancel: false, + confirmText: '确定' + }); + } + return; + } + + // 团队邀请消息 + if (msg.type === MessageType.TEAM_INVITATION) { + handleTeamInvitationClick(msg); + return; + } + + // 好友请求消息 + if (msg.type === MessageType.FRIEND_REQUEST) { + handleFriendRequestClick(msg); + return; + } + } catch (e) { + console.error('处理消息点击失败:', e); + } + }; + + /** + * 处理AI考试消息点击 + */ + const handleAiExamClick = (msg) => { + const extraData = typeof msg.extraData === 'string' + ? JSON.parse(msg.extraData || '{}') + : (msg.extraData || {}); + const examTaskId = extraData.examTaskId || extraData.id; + const status = extraData.status; + + if (!examTaskId) { + uni.showToast({ title: '缺少考试参数', icon: 'none' }); + return; + } + + // 兼容数字类型的status值 + if (status === 'pending' || status === 0) { + // 待预约状态,打开预约弹窗 + const questionCount = extraData.questionCount || 4; + openExamScheduleDialog?.(examTaskId, questionCount, msg.id); + } else if (status === 'scheduled' || status === 1) { + // 已预约状态,检查是否到时间 + const scheduledTime = extraData.scheduledStartTime; + if (scheduledTime) { + const now = new Date(); + const scheduled = new Date(scheduledTime); + if (now < scheduled) { + uni.showToast({ + title: `预约时间还未到!请在${formatScheduledTime(scheduledTime)}再开始考核`, + icon: 'none', + duration: 3000 + }); + return; + } + } + // 到时间了,跳转到考试页面 + uni.navigateTo({ + url: `/pages/exam/index?examTaskId=${examTaskId}` + }); + } else if (status === 'in_progress' || status === 2) { + // 进行中,跳转到考试页面 + uni.navigateTo({ + url: `/pages/exam/index?examTaskId=${examTaskId}` + }); + } else if (status === 'completed' || status === 3 || status === 'abnormal' || status === 4) { + // 已完成或异常,跳转到考试结果页面 + uni.navigateTo({ + url: `/pages/exam/result?examTaskId=${examTaskId}` + }); + } else { + uni.showToast({ title: '考试状态异常', icon: 'none' }); + } + }; + + /** + * 处理任务申请消息点击 + */ + const handleTaskApplyClick = async (msg) => { + // 解析团队信息 + let teamInfo = null; + try { + const extraData = typeof msg.extraData === 'string' + ? JSON.parse(msg.extraData || '{}') + : (msg.extraData || {}); + if (extraData.isTeam) { + teamInfo = extraData; + // 预加载团队成员信息 + if (teamInfo.members && teamInfo.members.length > 0) { + teamInfo.members.forEach(member => { + getUserInfo?.(member.userId); + }); + } + // 预加载队长信息 + if (teamInfo.leaderId) { + getUserInfo?.(teamInfo.leaderId); + } + } + } catch (e) { + console.error('解析团队信息失败:', e); + } + + setCurrentAction?.({ + id: msg.id, + type: 'task-apply', + approve: true, + teamInfo: teamInfo + }); + showReasonDialog?.({ + title: teamInfo ? '处理团队任务申请' : '处理任务申请', + placeholder: '若选择拒绝,可填写拒绝理由(可选)' + }); + }; + + /** + * 处理任务完成申请消息点击 + */ + const handleTaskCompletionClick = (msg) => { + let taskId = null; + try { + const extraData = typeof msg.extraData === 'string' + ? JSON.parse(msg.extraData || '{}') + : (msg.extraData || {}); + taskId = extraData.taskId || extraData.task_id || extraData.id || msg.taskId; + } catch (e) { + console.error('解析任务ID失败:', e); + } + + if (taskId) { + // 直接跳转到任务界面,并传递消息ID用于显示申请完成详情 + uni.navigateTo({ + url: `/pages/task/detail/index?id=${taskId}&messageId=${msg.id}&showCompletion=true` + }); + } else { + uni.showToast({ title: '未找到任务信息', icon: 'none' }); + } + }; + + /** + * 处理工作核验消息点击 + */ + const handleWorkVerificationClick = (msg, workVerification) => { + // 使用统一的过期检查函数 + if (isExpired(msg)) { + uni.showToast({ title: '核验已过期', icon: 'none' }); + return; + } + + const workVerificationId = workVerification && workVerification.id; + if (!workVerificationId) { + uni.showToast({ title: '缺少核验参数', icon: 'none' }); + return; + } + + // 检查核验状态 + const verificationResult = getVerificationStatus(msg); + + if (verificationResult === 1) { + // 核验成功 + uni.showToast({ title: '已核验成功', icon: 'success' }); + } else if (verificationResult === 0) { + // 核验失败,允许重新核验 + uni.showToast({ title: '核验失败,请重新核验', icon: 'none' }); + openWorkVerifyDialog?.(workVerificationId); + } else { + // 未核验过或其他状态,提示未核验并打开核验弹窗 + uni.showToast({ title: '未核验', icon: 'none' }); + openWorkVerifyDialog?.(workVerificationId); + } + }; + + /** + * 处理团队邀请消息点击 + */ + const handleTeamInvitationClick = async (msg) => { + try { + const extraData = typeof msg.extraData === 'string' + ? JSON.parse(msg.extraData || '{}') + : (msg.extraData || {}); + const teamId = msg.teamId || extraData.teamId; + const taskId = msg.taskId || extraData.taskId; + const leaderId = msg.senderId || extraData.leaderId; + const teamName = extraData.teamName; + + if (!teamId) { + uni.showToast({ title: '缺少团队信息', icon: 'none' }); + return; + } + + // 显示团队邀请处理对话框 + currentTeamInvitation.value = { + teamId, + taskId, + leaderId, + teamName, + leaderNickname: '加载中...', + leaderAvatar: '/static/images/default-avatar.png', + taskTitle: extraData.taskTitle, + taskContent: extraData.taskContent + }; + + showTeamInvitationModal?.(true); + + // 根据sender的uid获取真实的用户信息 + if (leaderId) { + await fetchUserInfoForInvitation(leaderId); + } + + // 根据taskId获取任务详细信息 + if (taskId) { + await fetchTaskInfoForInvitation(taskId); + } + } catch (error) { + console.error('处理团队邀请消息失败:', error); + uni.showToast({ title: '处理团队邀请失败', icon: 'none' }); + } + }; + + /** + * 处理好友请求消息点击 + */ + const handleFriendRequestClick = (msg) => { + // 优先使用消息对象中的 senderId 或 senderUserId + let senderId = msg.senderId || msg.senderUserId; + let senderName = msg.senderName || msg.senderNickname || msg.senderUsername; + + // 如果没有发送者名称,尝试从消息内容中解析 + if (!senderName) { + const content = msg.content || ''; + + // 尝试多种匹配模式 + const patterns = [ + /用户\s+(\S+)\s+想要添加您为好友/, + /(\S+)\s+想要添加您为好友/, + /(\S+)\s+申请添加您为好友/, + /(\S+)\s+请求添加您为好友/ + ]; + + for (const pattern of patterns) { + const match = content.match(pattern); + if (match && match[1]) { + senderName = match[1]; + break; + } + } + } + + // 如果既没有 senderId 也没有 senderName,尝试从 extraData 获取 + if (!senderId && !senderName) { + try { + const extraData = typeof msg.extraData === 'string' + ? JSON.parse(msg.extraData || '{}') + : (msg.extraData || {}); + senderId = extraData.senderId || extraData.senderUserId || extraData.userId; + senderName = extraData.senderName || extraData.senderNickname || extraData.nickname; + } catch (e) { + console.error('解析好友请求 extraData 失败:', e); + } + } + + // 显示确认对话框 + const displayName = senderName || '该用户'; + uni.showModal({ + title: '好友请求', + content: `${displayName} 想要添加您为好友,是否同意?`, + confirmText: '同意', + cancelText: '拒绝', + success: (res) => { + if (res.confirm) { + acceptFriendRequest(msg, senderName); + } else if (res.cancel) { + rejectFriendRequest(msg, senderName); + } + } + }); + }; + + /** + * 获取邀请人的用户信息 + */ + const fetchUserInfoForInvitation = async (leaderId) => { + try { + const token = uni.getStorageSync('accessToken'); + if (!token) return; + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/user/info`, + method: 'POST', + data: { uid: leaderId }, + header: { + 'Access-Token': `Bearer ${token}`, + 'Content-Type': 'application/json' + } + }); + + if (response.statusCode === 200 && response.data && currentTeamInvitation.value) { + const userInfo = response.data; + currentTeamInvitation.value.leaderNickname = userInfo.nickname || '未知用户'; + + let avatarUrl = userInfo.avatarUrl || '/static/images/default-avatar.png'; + if (avatarUrl.startsWith('/uploads/') || avatarUrl.startsWith('/')) { + avatarUrl = `${NETWORK_CONFIG.API_BASE_URL}${avatarUrl}`; + } + currentTeamInvitation.value.leaderAvatar = avatarUrl; + } + } catch (error) { + console.error('获取邀请人信息失败:', error); + if (currentTeamInvitation.value) { + currentTeamInvitation.value.leaderNickname = '获取失败'; + } + } + }; + + /** + * 获取任务详细信息 + */ + const fetchTaskInfoForInvitation = async (taskId) => { + try { + const token = uni.getStorageSync('accessToken'); + if (!token) return; + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/task/detail`, + method: 'GET', + data: { taskId: taskId }, + header: { + 'Access-Token': `Bearer ${token}`, + 'Content-Type': 'application/json' + } + }); + + if (response.statusCode === 200 && response.data && currentTeamInvitation.value) { + const taskInfo = response.data; + currentTeamInvitation.value.taskTitle = taskInfo.title || '未知任务'; + currentTeamInvitation.value.taskContent = taskInfo.description || '暂无描述'; + currentTeamInvitation.value.taskReward = taskInfo.reward || 0; + currentTeamInvitation.value.taskDeadline = taskInfo.deadline; + currentTeamInvitation.value.taskStatus = taskInfo.status; + currentTeamInvitation.value.taskLocation = taskInfo.location; + } + } catch (error) { + console.error('获取任务信息失败:', error); + if (currentTeamInvitation.value) { + currentTeamInvitation.value.taskTitle = '获取失败'; + currentTeamInvitation.value.taskContent = '无法获取任务详情'; + } + } + }; + + /** + * 同意好友请求 + */ + const acceptFriendRequest = async (msg, senderName) => { + try { + const token = uni.getStorageSync('accessToken'); + if (!token) { + uni.showToast({ title: '请先登录', icon: 'none' }); + return; + } + + let senderId = msg.senderId || msg.senderUserId; + + // 如果senderId为空,通过昵称查找用户ID + if (!senderId && senderName) { + try { + const searchResponse = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/friends/search?keyword=${encodeURIComponent(senderName)}`, + method: 'GET', + header: { 'Access-Token': `Bearer ${token}` }, + timeout: 10000 + }); + + if (searchResponse.statusCode === 200 && searchResponse.data) { + const responseData = typeof searchResponse.data === 'string' + ? JSON.parse(searchResponse.data) + : searchResponse.data; + + if (responseData.code === 200 && responseData.data && Array.isArray(responseData.data)) { + const matchedUser = responseData.data.find(user => + user.friendNickname === senderName || + user.nickname === senderName || + user.username === senderName + ); + if (matchedUser) { + senderId = matchedUser.friendId || matchedUser.userId || matchedUser.id; + } + } + } + } catch (searchError) { + console.error('搜索用户失败:', searchError); + } + } + + if (!senderId) { + uni.showToast({ title: '无法获取发送者信息', icon: 'none', duration: 3000 }); + return; + } + + uni.showLoading({ title: '处理中...' }); + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/friends/accept`, + method: 'POST', + header: { + 'Access-Token': `Bearer ${token}`, + 'Content-Type': 'application/json' + }, + data: { friendId: senderId }, + timeout: 10000 + }); + + uni.hideLoading(); + + // 检查 HTTP 状态码 + if (response.statusCode === 200) { + const responseData = typeof response.data === 'string' + ? JSON.parse(response.data) + : response.data; + + // 检查业务状态码 + if (responseData && (responseData.code === 200 || responseData.success === true || responseData.success !== false)) { + uni.showToast({ title: '已同意好友请求', icon: 'success' }); + + // 保存消息ID,用于刷新后更新状态 + const messageId = msg.id; + const newStatus = 1; // 已同意 + + // 刷新消息列表(使用当前筛选条件,并重置到第一页) + if (fetchMessages) { + const filters = currentFilters?.value || { category: 'user', type: '', status: '' }; + + // 重置页码(如果提供了重置函数) + if (resetPage) { + resetPage(); + } + + // 等待一段时间确保后端状态已更新(好友请求需要更长时间) + await new Promise(resolve => setTimeout(resolve, 800)); + + // 强制刷新消息列表(确保获取最新状态) + await fetchMessages(filters); + + // 刷新后,如果后端没有更新状态,手动更新本地状态 + // 增加延迟,确保 messages 已经更新 + await new Promise(resolve => setTimeout(resolve, 200)); + + const refreshedMsgIndex = messages?.value?.content?.findIndex(m => m.id === messageId); + if (refreshedMsgIndex !== undefined && refreshedMsgIndex >= 0 && messages?.value?.content) { + const refreshedMsg = messages.value.content[refreshedMsgIndex]; + + // 如果后端返回的状态仍然是旧的(status=0),手动更新 + if (refreshedMsg.status === 0) { + if (NETWORK_CONFIG.DEBUG) { + console.log('[好友请求] ⚠️ 后端状态未更新,手动更新本地状态为:', newStatus); + } + // 创建新的 content 数组,确保响应式更新 + const newContent = [...messages.value.content]; + newContent[refreshedMsgIndex] = { ...newContent[refreshedMsgIndex], status: newStatus }; + // 替换整个 messages 对象,确保 Vue 检测到变化 + messages.value = { + ...messages.value, + content: newContent + }; + // 使用 nextTick 确保视图更新 + await nextTick(); + } else if (NETWORK_CONFIG.DEBUG) { + console.log('[好友请求] ✓ 后端状态已更新,当前状态:', refreshedMsg.status); + } + } else if (NETWORK_CONFIG.DEBUG) { + console.warn('[好友请求] ⚠️ 刷新后未找到消息,ID:', messageId); + } + } + + // 刷新未读计数(确保未读数正确) + if (fetchUnreadCounts) { + await fetchUnreadCounts(); + } + } else { + const errorMsg = responseData?.message || responseData?.msg || '操作失败'; + console.error('同意好友请求失败:', responseData); + uni.showToast({ title: errorMsg, icon: 'none', duration: 3000 }); + } + } else { + const errorMsg = response.data?.message || `请求失败 (${response.statusCode})`; + console.error('同意好友请求HTTP错误:', response.statusCode); + uni.showToast({ title: errorMsg, icon: 'none', duration: 3000 }); + } + } catch (error) { + uni.hideLoading(); + console.error('同意好友请求异常:', error); + const errorMsg = error.message || error.errMsg || '操作失败,请稍后重试'; + uni.showToast({ title: errorMsg, icon: 'none', duration: 3000 }); + } + }; + + /** + * 拒绝好友请求 + */ + const rejectFriendRequest = async (msg, senderName) => { + try { + const token = uni.getStorageSync('accessToken'); + if (!token) { + uni.showToast({ title: '请先登录', icon: 'none' }); + return; + } + + let senderId = msg.senderId || msg.senderUserId; + + if (!senderId && senderName) { + try { + const searchResponse = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/friends/search?keyword=${encodeURIComponent(senderName)}`, + method: 'GET', + header: { 'Access-Token': `Bearer ${token}` }, + timeout: 10000 + }); + + if (searchResponse.statusCode === 200 && searchResponse.data) { + const responseData = typeof searchResponse.data === 'string' + ? JSON.parse(searchResponse.data) + : searchResponse.data; + + if (responseData.code === 200 && responseData.data && Array.isArray(responseData.data)) { + const matchedUser = responseData.data.find(user => + user.friendNickname === senderName || + user.nickname === senderName || + user.username === senderName + ); + if (matchedUser) { + senderId = matchedUser.friendId || matchedUser.userId || matchedUser.id; + } + } + } + } catch (searchError) { + console.error('搜索用户失败:', searchError); + } + } + + if (!senderId) { + uni.showToast({ title: '无法获取发送者信息', icon: 'none', duration: 3000 }); + return; + } + + uni.showLoading({ title: '处理中...' }); + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/friends/reject`, + method: 'POST', + header: { + 'Access-Token': `Bearer ${token}`, + 'Content-Type': 'application/json' + }, + data: { friendId: senderId }, + timeout: 10000 + }); + + uni.hideLoading(); + + // 检查 HTTP 状态码 + if (response.statusCode === 200) { + const responseData = typeof response.data === 'string' + ? JSON.parse(response.data) + : response.data; + + // 检查业务状态码 + if (responseData && (responseData.code === 200 || responseData.success === true || responseData.success !== false)) { + uni.showToast({ title: '已拒绝好友请求', icon: 'success' }); + + // 保存消息ID,用于刷新后更新状态 + const messageId = msg.id; + const newStatus = 2; // 已拒绝 + + // 刷新消息列表(使用当前筛选条件,并重置到第一页) + if (fetchMessages) { + const filters = currentFilters?.value || { category: 'user', type: '', status: '' }; + + // 重置页码(如果提供了重置函数) + if (resetPage) { + resetPage(); + } + + // 等待一段时间确保后端状态已更新 + await new Promise(resolve => setTimeout(resolve, 800)); + + // 强制刷新消息列表(确保获取最新状态) + await fetchMessages(filters); + + // 刷新后,如果后端没有更新状态,手动更新本地状态 + // 增加延迟,确保 messages 已经更新 + await new Promise(resolve => setTimeout(resolve, 200)); + + const refreshedMsgIndex = messages?.value?.content?.findIndex(m => m.id === messageId); + if (refreshedMsgIndex !== undefined && refreshedMsgIndex >= 0 && messages?.value?.content) { + const refreshedMsg = messages.value.content[refreshedMsgIndex]; + // 如果后端返回的状态仍然是旧的(status=0),手动更新 + if (refreshedMsg.status === 0) { + if (NETWORK_CONFIG.DEBUG) { + console.log('[好友请求] ⚠️ 后端状态未更新,手动更新本地状态为:', newStatus); + } + // 创建新的 content 数组,确保响应式更新 + const newContent = [...messages.value.content]; + newContent[refreshedMsgIndex] = { ...newContent[refreshedMsgIndex], status: newStatus }; + // 替换整个 messages 对象,确保 Vue 检测到变化 + messages.value = { + ...messages.value, + content: newContent + }; + // 使用 nextTick 确保视图更新 + await nextTick(); + } else if (NETWORK_CONFIG.DEBUG) { + console.log('[好友请求] ✓ 后端状态已更新,当前状态:', refreshedMsg.status); + } + } else if (NETWORK_CONFIG.DEBUG) { + console.warn('[好友请求] ⚠️ 刷新后未找到消息,ID:', messageId); + } + } + + // 刷新未读计数(确保未读数正确) + if (fetchUnreadCounts) { + await fetchUnreadCounts(); + } + } else { + const errorMsg = responseData?.message || responseData?.msg || '操作失败'; + console.error('拒绝好友请求失败:', responseData); + uni.showToast({ title: errorMsg, icon: 'none', duration: 3000 }); + } + } else { + const errorMsg = response.data?.message || `请求失败 (${response.statusCode})`; + console.error('拒绝好友请求HTTP错误:', response.statusCode); + uni.showToast({ title: errorMsg, icon: 'none', duration: 3000 }); + } + } catch (error) { + uni.hideLoading(); + console.error('拒绝好友请求异常:', error); + const errorMsg = error.message || error.errMsg || '操作失败,请稍后重试'; + uni.showToast({ title: errorMsg, icon: 'none', duration: 3000 }); + } + }; + + return { + // 状态 + currentTeamInvitation, + + // 方法 + handleMessageClickOrJump, + handleMessageClick, + handleAiExamClick, + handleTaskApplyClick, + handleTaskCompletionClick, + handleWorkVerificationClick, + handleTeamInvitationClick, + handleFriendRequestClick, + fetchUserInfoForInvitation, + fetchTaskInfoForInvitation + }; +} + diff --git a/pages/message/composables/useMessageModalHandlers.js b/pages/message/composables/useMessageModalHandlers.js new file mode 100644 index 00000000..3c9d7a2d --- /dev/null +++ b/pages/message/composables/useMessageModalHandlers.js @@ -0,0 +1,57 @@ +/** + * 消息模态框处理函数 Composable + * + * 功能:统一管理所有模态框的包装函数,简化 index.vue 中的代码 + * + * 说明: + * - 这些函数是对各个模态框 composable 方法的简单包装 + * - 目的是统一接口,方便传递给 useMessageHandlers + * - 如果将来需要添加统一的前置/后置处理,可以在这里统一添加 + * + * @param {Object} modalComposables - 模态框 composables 对象 + * @param {Object} modalComposables.workVerification - 工作核验 composable + * @param {Object} modalComposables.examSchedule - AI 远程提问预约 composable + * @param {Object} modalComposables.teamInvitation - 团队邀请 composable + * @param {Object} modalComposables.taskModification - 任务修改申请 composable + * @param {Object} modalComposables.reasonDialog - 原因输入对话框 composable + * @returns {Object} 模态框包装函数集合 + */ +export function useMessageModalHandlers({ + workVerification, + examSchedule, + teamInvitation, + taskModification, + reasonDialog +}) { + // 包装函数用于传递给 messageHandlers + const openWorkVerifyDialogFn = (id) => workVerification.openWorkVerifyDialog(id); + + const openExamScheduleDialogFn = (examTaskId, questionCount, messageId) => + examSchedule.openExamScheduleDialog(examTaskId, questionCount, messageId); + + const showTeamInvitationModalFn = (visible) => { + teamInvitation.showTeamInvitationModal.value = visible; + }; + + const openTaskModificationModalFn = (msg) => taskModification.openTaskModificationModal(msg); + + const showReasonDialogFn = (options) => { + reasonDialog.showDialog({ + title: options?.title || '', + placeholder: options?.placeholder || '', + action: options?.action || {} + }); + }; + + const setCurrentActionFn = (action) => reasonDialog.setCurrentAction(action); + + return { + openWorkVerifyDialogFn, + openExamScheduleDialogFn, + showTeamInvitationModalFn, + openTaskModificationModalFn, + showReasonDialogFn, + setCurrentActionFn + }; +} + diff --git a/pages/message/composables/usePagination.js b/pages/message/composables/usePagination.js new file mode 100644 index 00000000..5d820143 --- /dev/null +++ b/pages/message/composables/usePagination.js @@ -0,0 +1,107 @@ +/** + * 分页组件管理 Composable + * + * 功能: + * - 管理分页组件的定位和样式(fixed 定位,底部对齐 tabBar) + * - 动态检测和设置 tabBar 高度 + * - 提供调试工具(可选启用 watch 监听) + * + * 说明: + * - tabBarHeight: 用于计算分页组件的 bottom 位置 + * - paginationStyle: 响应式计算样式,确保样式实时更新 + * - detectTabBarHeight: 尝试从系统信息获取 tabBar 高度(小程序环境) + * - enableTabBarHeightWatch: 可选启用的调试工具 + * + * @returns {Object} 分页相关的响应式状态和方法 + */ +import { ref, computed, watch, nextTick } from 'vue'; +import { NETWORK_CONFIG } from '@/config/network.js'; + +export function usePagination() { + const tabBarHeight = ref(0); + const paginationRef = ref(null); + + // 计算分页组件的样式(确保响应式更新) + const paginationStyle = computed(() => ({ + bottom: `${tabBarHeight.value}px`, + position: 'fixed', + left: '0', + right: '0', + margin: '0', + 'margin-bottom': '0', + padding: '8px 16px', + display: 'flex', + 'align-items': 'center', + 'justify-content': 'space-between', + gap: '8px', + background: 'white', + 'z-index': '100' + })); + + // 尝试获取 tabBar 实际高度 + const detectTabBarHeight = () => { + // #ifdef MP-WEIXIN + try { + // 优先使用新的 API(微信小程序基础库 2.20.2+) + if (typeof wx !== 'undefined' && wx.getWindowInfo && wx.getDeviceInfo) { + try { + const windowInfo = wx.getWindowInfo(); + const deviceInfo = wx.getDeviceInfo(); + + // tabBar 通常占 48-50px,导航栏约 44-50px + // 总差值通常是 92-100px 左右 + } catch (newApiError) { + if (NETWORK_CONFIG.DEBUG) { + console.warn('新 API 调用失败,使用兼容模式:', newApiError); + } + throw newApiError; // 触发兼容模式 + } + } else { + // 兼容旧版本基础库 + throw new Error('新 API 不可用'); + } + } catch (e) { + // 如果新 API 不可用,尝试使用兼容方法(但会显示废弃警告) + try { + if (NETWORK_CONFIG.DEBUG) { + console.warn('使用废弃的 getSystemInfoSync,建议升级微信小程序基础库到 2.20.2+'); + } + const systemInfo = uni.getSystemInfoSync(); + } catch (compatError) { + if (NETWORK_CONFIG.DEBUG) { + console.warn('无法获取系统信息:', compatError); + } + } + } + // #endif + }; + + // 监听 tabBarHeight 变化(调试用,可选启用) + // 如果需要调试,可以在外部调用此函数启用监听 + const enableTabBarHeightWatch = () => { + watch(tabBarHeight, (newVal) => { + // 强制更新样式(可能需要的额外步骤) + nextTick(() => { + // 尝试直接操作 DOM(仅用于调试,H5 环境) + // #ifdef H5 + const paginationEl = document.querySelector('.pagination-fixed'); + if (paginationEl) { + const computedBottom = getComputedStyle(paginationEl).bottom; + if (computedBottom !== `${newVal}px`) { + paginationEl.style.setProperty('bottom', newVal + 'px', 'important'); + } + } + // #endif + }); + }, { immediate: true }); + }; + + return { + tabBarHeight, + paginationRef, + paginationStyle, + detectTabBarHeight, + enableTabBarHeightWatch + }; +} + diff --git a/pages/message/composables/useReasonDialog.js b/pages/message/composables/useReasonDialog.js new file mode 100644 index 00000000..a9c8a7dd --- /dev/null +++ b/pages/message/composables/useReasonDialog.js @@ -0,0 +1,262 @@ +// pages/message/composables/useReasonDialog.js +import { ref, watch } from 'vue'; +import { NETWORK_CONFIG } from '@/config/network.js'; + +export function useReasonDialog({ messages, fetchUsersInfo, getUserNickname, getUserAvatar, handleAvatarError }) { + const showReasonDialog = ref(false); + const reasonText = ref(''); + const dialogTitle = ref(''); + const dialogPlaceholder = ref(''); + const currentAction = ref({}); + const previewLoading = ref(false); + const previewError = ref(''); + const completePreview = ref(null); + const taskCancelPreview = ref(null); // 任务取消申请预览 + + // 显示原因输入对话框 + const showDialog = (options) => { + showReasonDialog.value = true; + reasonText.value = ''; + if (options) { + dialogTitle.value = options.title || ''; + dialogPlaceholder.value = options.placeholder || ''; + currentAction.value = options.action || {}; + } + }; + + // 关闭对话框 + const closeDialog = () => { + showReasonDialog.value = false; + reasonText.value = ''; + dialogTitle.value = ''; + dialogPlaceholder.value = ''; + currentAction.value = {}; + previewLoading.value = false; + previewError.value = ''; + completePreview.value = null; + taskCancelPreview.value = null; + }; + + // 设置当前操作 + const setCurrentAction = (action) => { + currentAction.value = action || {}; + }; + + // 获取徽章标题 + const badgeTitle = (b) => { + const assoc = b.association || b.assoc; + const level = b.level; + const badgeId = b.badgeId || b.id; + if (assoc && (level || level === 0)) return `徽章 Lv${level}`; + if (badgeId) return `铭牌 #${badgeId}`; + return '铭牌'; + }; + + // 获取用户名(用于显示) + const getUserName = (uid) => { + return getUserNickname(uid) || `用户${uid}`; + }; + + // 获取任务取消申请预览 + const fetchTaskCancelPreview = async (taskId, cancelReason) => { + previewLoading.value = true; + previewError.value = ''; + taskCancelPreview.value = null; + try { + const token = uni.getStorageSync('accessToken'); + if (!token) throw new Error('请先登录'); + + // 获取任务详情 + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/task/detail`, + method: 'GET', + data: { taskId }, + header: { 'Access-Token': `Bearer ${token}` }, + timeout: 8000 + }); + + if (response.statusCode === 200 && response.data) { + const taskData = typeof response.data === 'string' + ? JSON.parse(response.data) + : response.data; + + taskCancelPreview.value = { + taskId: taskData.taskId || taskId, + taskTitle: taskData.title || '未知任务', + taskDescription: taskData.description || '无描述', + taskReward: taskData.reward || 0, + taskDeadline: taskData.deadline || '', + taskStatus: taskData.status || 0, + cancelReason: cancelReason || '未填写取消原因' + }; + } else { + throw new Error('获取任务详情失败'); + } + } catch (e) { + previewError.value = e.message || '加载失败'; + } finally { + previewLoading.value = false; + } + }; + + // 获取任务完成申请预览 + const fetchTaskCompletionPreview = async (taskId) => { + previewLoading.value = true; + previewError.value = ''; + completePreview.value = null; + try { + const token = uni.getStorageSync('accessToken'); + if (!token) throw new Error('请先登录'); + const tryUrls = [ + `${NETWORK_CONFIG.API_BASE_URL}/task/applycomplete/detail?taskId=${taskId}` + ]; + let data = null; + for (let i = 0; i < tryUrls.length; i++) { + const res = await uni.request({ + url: tryUrls[i], + method: 'GET', + header: { 'Access-Token': `Bearer ${token}` }, + timeout: 8000 + }); + if (res.statusCode === 200 && res.data) { + data = res.data; + break; + } + } + if (!data) throw new Error('未获取到申请完成详情'); + + // 获取所有贡献者的UID + const contributorUids = []; + if (Array.isArray(data.badges)) { + data.badges.forEach(badge => { + if (Array.isArray(badge.contributors)) { + badge.contributors.forEach(contributor => { + if (contributor.uid) { + contributorUids.push(contributor.uid); + } + }); + } + }); + } + + // 批量获取用户信息 + if (contributorUids.length > 0) { + await fetchUsersInfo(contributorUids); + } + + completePreview.value = { + proof: data.proof || data.reason || data.description || '', + badges: Array.isArray(data.badges) ? data.badges : [] + }; + } catch (e) { + previewError.value = e.message || '加载失败'; + } finally { + previewLoading.value = false; + } + }; + + // 监听对话框显示,自动加载预览 + watch(showReasonDialog, (visible) => { + if (!visible) { + previewLoading.value = false; + previewError.value = ''; + completePreview.value = null; + taskCancelPreview.value = null; + return; + } + + if (!currentAction.value || !currentAction.value.id) return; + + try { + const targetMsg = (messages.value?.content || []).find(m => m.id === currentAction.value.id); + if (!targetMsg) { + previewError.value = '未找到消息'; + return; + } + + const actionType = currentAction.value.type; + + // 处理任务完成申请预览 + if (actionType === 'task-completion') { + const extra = typeof targetMsg.extraData === 'string' + ? JSON.parse(targetMsg.extraData || 'null') + : (targetMsg.extraData || {}); + + if (Array.isArray(extra) && extra.length && extra[0].badgeId) { + previewLoading.value = false; + previewError.value = ''; + completePreview.value = { proof: '', badges: extra }; + return; + } + + const extraObj = extra || {}; + const taskId = extraObj.taskId || extraObj.task_id || extraObj.id || targetMsg?.taskId; + if (taskId) { + fetchTaskCompletionPreview(taskId); + } else { + previewError.value = '未找到任务ID或分配数据'; + } + } + // 处理任务取消申请预览 + else if (actionType === 'task-cancel-request') { + const taskId = targetMsg.taskId; + if (!taskId) { + previewError.value = '未找到任务ID'; + return; + } + + // 从消息内容中提取取消原因 + let cancelReason = ''; + try { + // 尝试从 extraData 获取 + const extra = typeof targetMsg.extraData === 'string' + ? JSON.parse(targetMsg.extraData || '{}') + : (targetMsg.extraData || {}); + cancelReason = extra.reason || extra.cancelReason || ''; + + // 如果 extraData 中没有,尝试从 content 中提取 + if (!cancelReason && targetMsg.content) { + const reasonMatch = targetMsg.content.match(/取消原因[::]\s*(.+)/); + if (reasonMatch) { + cancelReason = reasonMatch[1]; + } else { + // 如果没有匹配到,尝试从 content 中提取引号内的内容 + const quotedMatch = targetMsg.content.match(/[""](.+?)[""]/); + if (quotedMatch) { + cancelReason = quotedMatch[1]; + } + } + } + } catch (e) { + console.error('解析取消原因失败:', e); + } + + fetchTaskCancelPreview(taskId, cancelReason); + } + } catch (e) { + previewError.value = e.message || '加载预览失败'; + console.error('加载预览失败:', e); + } + }); + + return { + showReasonDialog, + reasonText, + dialogTitle, + dialogPlaceholder, + currentAction, + previewLoading, + previewError, + completePreview, + taskCancelPreview, + showDialog, + closeDialog, + setCurrentAction, + badgeTitle, + getUserName, + getUserNickname, + getUserAvatar, + handleAvatarError + }; +} + diff --git a/pages/message/composables/useTaskModification.js b/pages/message/composables/useTaskModification.js new file mode 100644 index 00000000..923462b0 --- /dev/null +++ b/pages/message/composables/useTaskModification.js @@ -0,0 +1,119 @@ +// pages/message/composables/useTaskModification.js +import { ref } from 'vue'; +import { NETWORK_CONFIG } from '@/config/network.js'; + +export function useTaskModification({ fetchMessages }) { + const showTaskModificationModal = ref(false); + const taskModificationData = ref(null); + const taskModificationBadges = ref([]); + const currentTaskModificationMessage = ref(null); + + // 打开任务修改申请弹窗 + const openTaskModificationModal = async (message) => { + try { + currentTaskModificationMessage.value = message; + + if (message.extraData) { + taskModificationData.value = JSON.parse(message.extraData); + await loadTaskModificationBadges(message.taskId); + } + + showTaskModificationModal.value = true; + } catch (error) { + console.error('显示任务修改申请弹窗失败:', error); + uni.showToast({ title: '加载失败', icon: 'none' }); + } + }; + + // 关闭任务修改申请弹窗 + const closeTaskModificationModal = () => { + showTaskModificationModal.value = false; + currentTaskModificationMessage.value = null; + taskModificationData.value = null; + taskModificationBadges.value = []; + }; + + // 加载任务修改后的铭牌信息 + const loadTaskModificationBadges = async (taskId) => { + try { + const token = uni.getStorageSync('accessToken'); + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/task/modification-badges?taskId=${taskId}`, + method: 'GET', + header: { 'Access-Token': `Bearer ${token}` } + }); + + if (response.data && response.data.success) { + taskModificationBadges.value = response.data.data || []; + } + } catch (error) { + console.error('加载铭牌信息失败:', error); + } + }; + + // 同意任务修改申请 + const approveTaskModification = async () => { + try { + const token = uni.getStorageSync('accessToken'); + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/task/vote-modification`, + method: 'POST', + data: { + taskId: currentTaskModificationMessage.value.taskId, + approve: true + }, + header: { 'Access-Token': `Bearer ${token}` } + }); + + if (response.data && response.data.success) { + uni.showToast({ title: '已同意修改申请', icon: 'success' }); + closeTaskModificationModal(); + await fetchMessages(); + } else { + uni.showToast({ title: response.data?.message || '操作失败', icon: 'none' }); + } + } catch (error) { + console.error('同意修改申请失败:', error); + uni.showToast({ title: '操作失败', icon: 'none' }); + } + }; + + // 拒绝任务修改申请 + const rejectTaskModification = async () => { + try { + const token = uni.getStorageSync('accessToken'); + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/task/vote-modification`, + method: 'POST', + data: { + taskId: currentTaskModificationMessage.value.taskId, + approve: false + }, + header: { 'Access-Token': `Bearer ${token}` } + }); + + if (response.data && response.data.success) { + uni.showToast({ title: '已拒绝修改申请', icon: 'success' }); + closeTaskModificationModal(); + await fetchMessages(); + } else { + uni.showToast({ title: response.data?.message || '操作失败', icon: 'none' }); + } + } catch (error) { + console.error('拒绝修改申请失败:', error); + uni.showToast({ title: '操作失败', icon: 'none' }); + } + }; + + return { + showTaskModificationModal, + taskModificationData, + taskModificationBadges, + currentTaskModificationMessage, + openTaskModificationModal, + closeTaskModificationModal, + approveTaskModification, + rejectTaskModification + }; +} + diff --git a/pages/message/composables/useTeamInvitation.js b/pages/message/composables/useTeamInvitation.js new file mode 100644 index 00000000..663bbee5 --- /dev/null +++ b/pages/message/composables/useTeamInvitation.js @@ -0,0 +1,318 @@ +// pages/message/composables/useTeamInvitation.js +import { ref } from 'vue'; +import { NETWORK_CONFIG } from '@/config/network.js'; + +export function useTeamInvitation({ fetchMessages, getUserInfo, getUserNickname, getUserAvatar, handleAvatarError }) { + const showTeamInvitationModal = ref(false); + const currentTeamInvitation = ref(null); + + // 格式化任务截止时间 + const formatTaskDeadline = (deadline) => { + if (!deadline) return '未设置'; + + try { + const date = new Date(deadline); + const now = new Date(); + const diffTime = date.getTime() - now.getTime(); + const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); + + if (diffDays < 0) { + return '已过期'; + } else if (diffDays === 0) { + return '今天截止'; + } else if (diffDays === 1) { + return '明天截止'; + } else if (diffDays <= 7) { + return `${diffDays}天后截止`; + } else { + return date.toLocaleDateString('zh-CN', { + year: 'numeric', + month: 'short', + day: 'numeric' + }); + } + } catch (error) { + console.error('格式化截止时间失败:', error); + return '时间格式错误'; + } + }; + + // 获取任务状态文本 + const getTaskStatusText = (status) => { + const statusMap = { + 'PENDING': '待开始', + 'IN_PROGRESS': '进行中', + 'COMPLETED': '已完成', + 'CANCELLED': '已取消', + 'EXPIRED': '已过期' + }; + return statusMap[status] || '未知状态'; + }; + + // 获取任务状态样式类 + const getTaskStatusClass = (status) => { + const classMap = { + 'PENDING': 'status-pending', + 'IN_PROGRESS': 'status-progress', + 'COMPLETED': 'status-completed', + 'CANCELLED': 'status-cancelled', + 'EXPIRED': 'status-expired' + }; + return classMap[status] || 'status-unknown'; + }; + + // 处理团队邀请消息点击 + const handleTeamInvitationClick = async (msg) => { + try { + const extraData = typeof msg.extraData === 'string' ? JSON.parse(msg.extraData || '{}') : (msg.extraData || {}); + const teamId = msg.teamId || extraData.teamId; + const taskId = msg.taskId || extraData.taskId; + const leaderId = msg.senderId || extraData.leaderId; + const teamName = extraData.teamName; + + if (!teamId) { + uni.showToast({ title: '缺少团队信息', icon: 'none' }); + return; + } + + showTeamInvitationModal.value = true; + currentTeamInvitation.value = { + teamId, + taskId, + leaderId, + teamName, + leaderNickname: '加载中...', + leaderAvatar: '/static/images/default-avatar.png', + taskTitle: extraData.taskTitle, + taskContent: extraData.taskContent + }; + + if (leaderId) { + await fetchUserInfoForInvitation(leaderId); + } + + if (taskId) { + await fetchTaskInfoForInvitation(taskId); + } + + } catch (error) { + console.error('处理团队邀请消息失败:', error); + uni.showToast({ title: '处理团队邀请失败', icon: 'none' }); + } + }; + + // 获取邀请人的用户信息 + const fetchUserInfoForInvitation = async (leaderId) => { + try { + const token = uni.getStorageSync('accessToken'); + if (!token) { + console.error('未找到token,无法获取用户信息'); + return; + } + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/user/info`, + method: 'POST', + data: { uid: leaderId }, + header: { + 'Access-Token': `Bearer ${token}`, + 'Content-Type': 'application/json' + } + }); + + if (response.statusCode === 200 && response.data) { + const userInfo = response.data; + if (currentTeamInvitation.value) { + currentTeamInvitation.value.leaderNickname = userInfo.nickname || '未知用户'; + let avatarUrl = userInfo.avatarUrl || '/static/images/default-avatar.png'; + if (avatarUrl.startsWith('/uploads/') || avatarUrl.startsWith('/')) { + avatarUrl = `${NETWORK_CONFIG.API_BASE_URL}${avatarUrl}`; + } + currentTeamInvitation.value.leaderAvatar = avatarUrl; + } + } else { + if (currentTeamInvitation.value) { + currentTeamInvitation.value.leaderNickname = '获取失败'; + } + } + } catch (error) { + console.error('获取用户信息失败:', error); + if (currentTeamInvitation.value) { + currentTeamInvitation.value.leaderNickname = '获取失败'; + } + } + }; + + // 获取任务详细信息 + const fetchTaskInfoForInvitation = async (taskId) => { + try { + const token = uni.getStorageSync('accessToken'); + if (!token) { + console.error('未找到token,无法获取任务信息'); + return; + } + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/task/detail`, + method: 'GET', + data: { taskId: taskId }, + header: { + 'Access-Token': `Bearer ${token}`, + 'Content-Type': 'application/json' + } + }); + + if (response.statusCode === 200 && response.data) { + const taskInfo = response.data; + if (currentTeamInvitation.value) { + currentTeamInvitation.value.taskTitle = taskInfo.title || '未知任务'; + currentTeamInvitation.value.taskContent = taskInfo.description || '暂无描述'; + currentTeamInvitation.value.taskReward = taskInfo.reward || 0; + currentTeamInvitation.value.taskDeadline = taskInfo.deadline; + currentTeamInvitation.value.taskStatus = taskInfo.status; + currentTeamInvitation.value.taskLocation = taskInfo.location; + } + } else { + if (currentTeamInvitation.value) { + currentTeamInvitation.value.taskTitle = '获取失败'; + currentTeamInvitation.value.taskContent = '无法获取任务详情'; + } + } + } catch (error) { + console.error('获取任务信息失败:', error); + if (currentTeamInvitation.value) { + currentTeamInvitation.value.taskTitle = '获取失败'; + currentTeamInvitation.value.taskContent = '无法获取任务详情'; + } + } + }; + + // 处理团队邀请(同意/拒绝) + const handleTeamInvitation = async (teamId, accepted) => { + try { + const token = uni.getStorageSync('accessToken'); + + if (!token) { + uni.showToast({ title: '请先登录', icon: 'none' }); + return; + } + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/message/handle-team-invitation`, + method: 'POST', + header: { + 'Access-Token': `Bearer ${token}`, + 'Content-Type': 'application/json' + }, + data: { + teamId: teamId, + accepted: accepted + }, + timeout: 10000 + }); + + if (response.statusCode === 200 && response.data) { + let responseData = response.data; + if (typeof responseData === 'string') { + try { + responseData = JSON.parse(responseData); + } catch (e) { + responseData = { success: false, message: '响应数据格式错误' }; + } + } + + if (responseData.success !== false) { + const action = accepted ? '同意' : '拒绝'; + uni.showToast({ title: `已${action}团队邀请`, icon: 'success' }); + await fetchMessages(); + return true; + } else { + const errorCode = responseData.errorCode; + const errorMessage = responseData.message || '处理失败'; + + if (errorCode === 'IS_LEADER' || errorCode === 'IS_MEMBER') { + uni.showModal({ + title: '无法加入团队', + content: errorMessage, + showCancel: false, + confirmText: '知道了' + }); + } else { + uni.showToast({ title: errorMessage, icon: 'none', duration: 3000 }); + } + return false; + } + } else { + const errorMessage = response.data?.message || '处理失败'; + uni.showToast({ title: errorMessage, icon: 'none' }); + return false; + } + } catch (error) { + console.error('处理团队邀请失败:', error); + uni.showToast({ title: '网络错误或处理失败', icon: 'none' }); + return false; + } + }; + + // 同意团队邀请 + const handleTeamInvitationAccept = async () => { + if (currentTeamInvitation.value) { + const success = await handleTeamInvitation(currentTeamInvitation.value.teamId, true); + if (success) { + showTeamInvitationModal.value = false; + if (currentTeamInvitation.value.taskId) { + uni.navigateTo({ + url: `/pages/task/detail/index?id=${currentTeamInvitation.value.taskId}` + }); + } + } + } + }; + + // 拒绝团队邀请 + const handleTeamInvitationReject = async () => { + if (currentTeamInvitation.value) { + await handleTeamInvitation(currentTeamInvitation.value.teamId, false); + showTeamInvitationModal.value = false; + } + }; + + // 暂不处理团队邀请 + const handleTeamInvitationPostpone = () => { + showTeamInvitationModal.value = false; + uni.showToast({ + title: '已暂不处理,可稍后再次查看', + icon: 'none', + duration: 2000 + }); + }; + + // 跳转到任务页面 + const jumpToTaskFromModal = (taskId) => { + if (taskId) { + showTeamInvitationModal.value = false; + uni.navigateTo({ + url: `/pages/task/detail/index?id=${taskId}` + }); + } else { + uni.showToast({ title: '任务信息缺失', icon: 'none' }); + } + }; + + return { + showTeamInvitationModal, + currentTeamInvitation, + formatTaskDeadline, + getTaskStatusText, + getTaskStatusClass, + handleTeamInvitationClick, + handleTeamInvitationAccept, + handleTeamInvitationReject, + handleTeamInvitationPostpone, + jumpToTaskFromModal, + getUserNickname, + getUserAvatar, + handleAvatarError + }; +} + diff --git a/pages/message/composables/useUserInfo.js b/pages/message/composables/useUserInfo.js new file mode 100644 index 00000000..261cc479 --- /dev/null +++ b/pages/message/composables/useUserInfo.js @@ -0,0 +1,158 @@ +/** + * 用户信息管理 Composable + * 负责用户信息的获取、缓存、昵称和头像显示等功能 + */ + +import { ref } from 'vue'; +import { NETWORK_CONFIG } from '@/config/network.js'; + +/** + * 用户信息管理 Composable + * @returns {Object} 用户信息管理相关的响应式状态和方法 + */ +export function useUserInfo() { + // 用户信息缓存 + const userInfoCache = ref({}); + + /** + * 获取用户信息(带缓存) + * @param {string|number} userId - 用户ID + * @returns {Promise} 用户信息对象,失败返回null + */ + const getUserInfo = async (userId) => { + if (!userId) return null; + + // 先从缓存获取 + if (userInfoCache.value[userId]) { + return userInfoCache.value[userId]; + } + + try { + const token = uni.getStorageSync('accessToken'); + if (!token) return null; + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/user/info`, + method: 'POST', + data: { + uid: userId + }, + header: { + 'Access-Token': `Bearer ${token}`, + 'Content-Type': 'application/json' + } + }); + + if (response.statusCode === 200 && response.data) { + const userInfo = response.data; + // 缓存用户信息 + userInfoCache.value[userId] = userInfo; + return userInfo; + } else { + console.error('获取用户信息失败,响应:', response.data); + } + } catch (error) { + console.error('获取用户信息失败:', error); + } + + return null; + }; + + /** + * 批量获取用户信息 + * @param {Array} userIds - 用户ID数组 + * @returns {Promise} + */ + const fetchUsersInfo = async (userIds) => { + if (!Array.isArray(userIds) || userIds.length === 0) return; + + // 过滤掉已经缓存的用户ID + const uncachedUserIds = userIds.filter(id => !userInfoCache.value[id]); + + if (uncachedUserIds.length === 0) return; + + // 并发获取所有用户信息 + const promises = uncachedUserIds.map(userId => getUserInfo(userId)); + await Promise.all(promises); + }; + + /** + * 获取用户昵称 + * @param {string|number} userId - 用户ID + * @returns {string} 用户昵称,如果未加载则返回"加载中..." + */ + const getUserNickname = (userId) => { + if (!userId) return '未知用户'; + const userInfo = userInfoCache.value[userId]; + return userInfo ? (userInfo.nickname || `用户${userId}`) : '加载中...'; + }; + + /** + * 获取用户名称(兼容函数,同 getUserNickname) + * @param {string|number} userId - 用户ID + * @returns {string} 用户名称 + */ + const getUserName = (userId) => { + return getUserNickname(userId); + }; + + /** + * 获取用户头像URL + * @param {string|number} userId - 用户ID + * @returns {string} 头像URL,如果未加载或加载失败则返回默认头像 + */ + const getUserAvatar = (userId) => { + if (!userId) return '/static/images/default-avatar.png'; + + const userInfo = userInfoCache.value[userId]; + + if (userInfo && userInfo.avatarUrl) { + // 处理相对路径 + if (userInfo.avatarUrl.startsWith('/')) { + const fullUrl = `${NETWORK_CONFIG.API_BASE_URL}${userInfo.avatarUrl}`; + return fullUrl; + } + // 绝对路径直接返回 + return userInfo.avatarUrl; + } + + return '/static/images/default-avatar.png'; + }; + + /** + * 头像加载错误处理 + * @param {Event} e - 图片加载错误事件 + */ + const handleAvatarError = (e) => { + if (e && e.target) { + e.target.src = '/static/images/default-avatar.png'; + } + }; + + /** + * 清除用户信息缓存 + * @param {string|number} userId - 用户ID(可选,不传则清除所有缓存) + */ + const clearUserCache = (userId = null) => { + if (userId) { + delete userInfoCache.value[userId]; + } else { + userInfoCache.value = {}; + } + }; + + return { + // 状态 + userInfoCache, + + // 方法 + getUserInfo, + fetchUsersInfo, + getUserNickname, + getUserName, + getUserAvatar, + handleAvatarError, + clearUserCache + }; +} + diff --git a/pages/message/composables/useVoteModal.js b/pages/message/composables/useVoteModal.js new file mode 100644 index 00000000..0fbcd921 --- /dev/null +++ b/pages/message/composables/useVoteModal.js @@ -0,0 +1,565 @@ +// pages/message/composables/useVoteModal.js +import { ref, nextTick } from 'vue'; +import { NETWORK_CONFIG } from '@/config/network.js'; + +export function useVoteModal({ fetchMessages, getUserNickname, getUserAvatar, handleAvatarError }) { + const showVoteModalFlag = ref(false); + const currentVoteMessage = ref(null); + const voteData = ref(null); + const voteLoading = ref(false); + const withdrawLoading = ref(false); + const selectedCandidate = ref(null); + + // 显示投票模态框 + const showVoteModal = async (message) => { + try { + if (NETWORK_CONFIG.DEBUG) { + console.log('showVoteModal 被调用,消息:', message); + } + currentVoteMessage.value = message; + voteLoading.value = true; + + const token = uni.getStorageSync('accessToken'); + if (!token) { + uni.showToast({ title: '请先登录', icon: 'none' }); + return; + } + + try { + const taskResponse = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/task/detail?taskId=${message.taskId}`, + method: 'GET', + header: { 'Access-Token': `Bearer ${token}` } + }); + + if (taskResponse.data && taskResponse.statusCode === 200) { + // 获取当前用户ID(从localStorage) + let userId = null; + try { + const currentUser = uni.getStorageSync('userInfo'); + if (currentUser && currentUser.uid) { + userId = currentUser.uid; + } else { + // 尝试从 store/user 获取(如果可用) + try { + const { useUserStore } = require('@/store/user'); + const userStore = useUserStore(); + if (userStore?.profile?.uid) { + userId = userStore.profile.uid; + } + } catch (e) { + // 忽略 userStore 错误 + } + } + } catch (error) { + console.error('获取用户ID失败:', error); + userId = null; + } + + if (!userId) { + const taskData = taskResponse.data; + voteData.value = { + task: taskData, + message: message, + vote: null, + teamInfo: {} + }; + showVoteModalFlag.value = true; + await nextTick(); + return; + } + + // 获取团队信息和投票数据 + const teamResponse = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/team/info?taskId=${message.taskId}&userId=${userId}`, + method: 'GET', + header: { 'Access-Token': `Bearer ${token}` } + }); + + // 检查API响应是否成功 + if (teamResponse.statusCode !== 200 || !teamResponse.data || !teamResponse.data.success) { + console.error('团队信息获取失败:', teamResponse); + uni.showToast({ title: '获取团队信息失败', icon: 'none' }); + return; + } + + // 构建投票数据 + const taskData = taskResponse.data; + const teamData = teamResponse.data.teamInfo || {}; + const activeVotes = teamData.activeVotes || []; + + // 根据消息类型找到对应的投票 + let currentVote = null; + + // 如果消息标题包含"弹劾",优先查找弹劾投票 + if (message.title?.includes('弹劾')) { + currentVote = activeVotes.find(vote => + vote.voteType === 2 || vote.voteTitle?.includes('弹劾') + ); + } + // 如果消息标题包含"踢人"或"退出",查找踢人投票或退出投票 + else if (message.title?.includes('踢人') || message.title?.includes('退出')) { + currentVote = activeVotes.find(vote => + vote.voteType === 1 || vote.voteTitle?.includes('踢人') || vote.voteTitle?.includes('退出') + ); + } + // 如果消息标题包含"选举"或"新队长",查找选举投票 + else if (message.title?.includes('选举') || message.title?.includes('新队长')) { + currentVote = activeVotes.find(vote => + vote.voteType === 3 || vote.voteTitle?.includes('选举') || vote.voteTitle?.includes('新队长') + ); + } + + // 如果还没找到,尝试通用查找 + if (!currentVote) { + currentVote = activeVotes.find(vote => + vote.voteType === 1 || vote.voteType === 2 || vote.voteType === 3 || + vote.voteTitle?.includes('弹劾') || vote.voteTitle?.includes('踢人') || + vote.voteTitle?.includes('退出') || vote.voteTitle?.includes('选举') || vote.voteTitle?.includes('新队长') + ); + } + + // 如果没有找到投票,尝试其他方式 + if (!currentVote && activeVotes.length > 0) { + const firstVote = activeVotes[0]; + voteData.value = { + task: taskData, + message: message, + vote: firstVote, + teamInfo: teamData + }; + } else { + voteData.value = { + task: taskData, + message: message, + vote: currentVote, + teamInfo: teamData + }; + } + + showVoteModalFlag.value = true; + + // 强制更新DOM + await nextTick(); + } else { + uni.showToast({ title: '获取任务详情失败', icon: 'none' }); + } + } catch (apiError) { + console.error('API调用失败:', apiError); + uni.showToast({ title: '获取投票信息失败', icon: 'none' }); + } + } catch (error) { + console.error('获取投票信息失败:', error); + uni.showToast({ title: '获取投票信息失败', icon: 'none' }); + } finally { + voteLoading.value = false; + } + }; + + // 关闭投票模态框 + const closeVoteModal = () => { + showVoteModalFlag.value = false; + currentVoteMessage.value = null; + voteData.value = null; + selectedCandidate.value = null; + }; + + // 重新加载当前消息的投票数据(用于兜底/重试) + const reloadVoteData = async () => { + try { + const message = currentVoteMessage.value || voteData.value?.message; + if (!message?.taskId) return false; + const token = uni.getStorageSync('accessToken'); + let userId = null; + try { + const currentUser = uni.getStorageSync('userInfo'); + userId = currentUser?.uid || null; + if (!userId) { + // 尝试从 store/user 获取(如果可用) + try { + const { useUserStore } = require('@/store/user'); + const userStore = useUserStore(); + userId = userStore?.profile?.uid || null; + } catch (e) { + // 忽略错误 + } + } + } catch (_) {} + if (!userId) return false; + const teamResponse = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/team/info?taskId=${message.taskId}&userId=${userId}`, + method: 'GET', + header: { 'Access-Token': `Bearer ${token}` } + }); + if (teamResponse.statusCode !== 200 || !teamResponse.data?.success) return false; + const teamData = teamResponse.data.teamInfo || {}; + const activeVotes = teamData.activeVotes || []; + if (activeVotes.length === 0) return false; + const picked = activeVotes.find(v => (v.voteTitle || '').includes('投票')) || activeVotes[0]; + voteData.value = { ...(voteData.value || {}), message, teamInfo: teamData, vote: picked }; + return true; + } catch (e) { + console.error('reloadVoteData 失败:', e); + return false; + } + }; + + // 参与投票(使用新的 /message/vote 接口) + const submitVote = async (voteChoice) => { + try { + // 如果选择弃权,直接关闭对话框 + if (voteChoice === 'abstain') { + uni.showToast({ + title: '已选择不参与投票', + icon: 'none', + duration: 1500 + }); + closeVoteModal(); + return; + } + + const token = uni.getStorageSync('accessToken'); + if (!token) { + uni.showToast({ title: '请先登录', icon: 'none' }); + return; + } + + // 获取 messageId + let messageId = voteData.value?.vote?.messageId || currentVoteMessage.value?.id || voteData.value?.message?.id; + + if (!messageId) { + const ok = await reloadVoteData(); + messageId = voteData.value?.vote?.messageId || currentVoteMessage.value?.id || voteData.value?.message?.id; + if (!ok || !messageId) { + uni.showToast({ title: '投票消息已失效,请刷新后重试', icon: 'none' }); + return; + } + } + + if (NETWORK_CONFIG.DEBUG) { + console.log('提交投票,messageId:', messageId, 'voteChoice:', voteChoice); + } + + // 转换投票选择为数字格式 + let voteChoiceNum; + if (voteChoice === 'approve') { + voteChoiceNum = 1; // 同意 + } else if (voteChoice === 'reject') { + voteChoiceNum = 2; // 反对 + } else { + voteChoiceNum = null; + } + + if (!voteChoiceNum) { + uni.showToast({ title: '无效的投票选择', icon: 'none' }); + return; + } + + voteLoading.value = true; + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/message/vote`, + method: 'POST', + data: { + messageId: Number(messageId), + voteChoice: voteChoiceNum, + voteReason: '', + candidateId: null + }, + header: { + 'Access-Token': `Bearer ${token}`, + 'Content-Type': 'application/json' + } + }); + + // 解析响应数据 + let responseData; + if (typeof response.data === 'string') { + try { + responseData = JSON.parse(response.data); + } catch (e) { + console.error('解析响应数据失败:', e); + responseData = { success: false, message: '响应数据格式错误' }; + } + } else { + responseData = response.data; + } + + if (NETWORK_CONFIG.DEBUG) { + console.log('投票响应:', responseData); + } + + if (responseData && responseData.success) { + uni.showToast({ + title: voteChoice === 'approve' ? '已投票同意' : '已投票反对', + icon: 'success' + }); + closeVoteModal(); + await fetchMessages(); + } else { + uni.showToast({ title: responseData?.message || '投票失败', icon: 'none' }); + } + } catch (error) { + console.error('投票失败:', error); + uni.showToast({ title: '投票失败,请重试', icon: 'none' }); + } finally { + voteLoading.value = false; + } + }; + + // 撤回投票(使用新的 /message/withdraw-vote 接口) + const withdrawVote = async () => { + try { + withdrawLoading.value = true; + + const token = uni.getStorageSync('accessToken'); + if (!token) { + uni.showToast({ title: '请先登录', icon: 'none' }); + return; + } + + let messageId = voteData.value?.vote?.messageId || currentVoteMessage.value?.id || voteData.value?.message?.id; + + if (!messageId) { + uni.showToast({ title: '投票消息已失效,请刷新后重试', icon: 'none' }); + return; + } + + if (NETWORK_CONFIG.DEBUG) { + console.log('撤回投票,messageId:', messageId); + } + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/message/withdraw-vote`, + method: 'POST', + data: { + messageId: Number(messageId) + }, + header: { + 'Access-Token': `Bearer ${token}`, + 'Content-Type': 'application/json' + } + }); + + // 解析响应数据 + let responseData; + if (typeof response.data === 'string') { + try { + responseData = JSON.parse(response.data); + } catch (e) { + console.error('解析响应数据失败:', e); + responseData = { success: false, message: '响应数据格式错误' }; + } + } else { + responseData = response.data; + } + + if (NETWORK_CONFIG.DEBUG) { + console.log('撤回投票响应:', responseData); + } + + if (responseData && responseData.success) { + uni.showToast({ + title: '投票已撤回', + icon: 'success' + }); + + // 重新获取投票数据 + await showVoteModal(currentVoteMessage.value); + } else { + uni.showToast({ title: responseData?.message || '撤回失败', icon: 'none' }); + } + } catch (error) { + console.error('撤回投票失败:', error); + uni.showToast({ title: '撤回失败,请重试', icon: 'none' }); + } finally { + withdrawLoading.value = false; + } + }; + + // 提交候选人投票 + const submitCandidateVote = async () => { + if (!selectedCandidate.value) { + uni.showToast({ title: '请先选择候选人', icon: 'none' }); + return; + } + + try { + voteLoading.value = true; + + const token = uni.getStorageSync('accessToken'); + if (!token) { + uni.showToast({ title: '请先登录', icon: 'none' }); + return; + } + + let messageId = voteData.value?.vote?.messageId || currentVoteMessage.value?.id || voteData.value?.message?.id; + + if (!messageId) { + const ok = await reloadVoteData(); + messageId = voteData.value?.vote?.messageId || currentVoteMessage.value?.id || voteData.value?.message?.id; + if (!ok || !messageId) { + uni.showToast({ title: '投票消息已失效,请刷新后重试', icon: 'none' }); + return; + } + } + + if (NETWORK_CONFIG.DEBUG) { + console.log('提交候选人投票,messageId:', messageId, 'candidateId:', selectedCandidate.value); + } + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/message/vote`, + method: 'POST', + data: { + messageId: Number(messageId), + voteChoice: 1, // 选举投票统一为同意 + voteReason: `选择 ${getUserNickname(selectedCandidate.value)} 为新队长`, + candidateId: selectedCandidate.value + }, + header: { + 'Access-Token': `Bearer ${token}`, + 'Content-Type': 'application/json' + } + }); + + // 解析响应数据 + let responseData; + if (typeof response.data === 'string') { + try { + responseData = JSON.parse(response.data); + } catch (e) { + console.error('解析响应数据失败:', e); + responseData = { success: false, message: '响应数据格式错误' }; + } + } else { + responseData = response.data; + } + + if (NETWORK_CONFIG.DEBUG) { + console.log('候选人投票响应:', responseData); + } + + if (responseData && responseData.success) { + uni.showToast({ + title: `已选择 ${getUserNickname(selectedCandidate.value)} 为新队长`, + icon: 'success' + }); + closeVoteModal(); + await fetchMessages(); + } else { + uni.showToast({ title: responseData?.message || '投票失败', icon: 'none' }); + } + } catch (error) { + console.error('候选人投票失败:', error); + uni.showToast({ title: '投票失败,请重试', icon: 'none' }); + } finally { + voteLoading.value = false; + } + }; + + // 选择候选人 + const selectCandidate = (userId) => { + selectedCandidate.value = userId; + if (NETWORK_CONFIG.DEBUG) { + console.log('选择候选人:', userId); + } + }; + + // 获取候选人列表(排除当前队长) + const getCandidates = () => { + if (!voteData.value?.teamInfo?.members) { + return []; + } + + const currentLeaderId = voteData.value.teamInfo.leaderId; + + const candidates = voteData.value.teamInfo.members.filter(member => { + const isNotLeader = member.userId !== currentLeaderId; + const isConfirmed = member.status === 'confirmed' || member.status === 1; + return isNotLeader && isConfirmed; + }); + + return candidates; + }; + + // 跳转到任务详情页 + const goToTaskDetail = () => { + if (voteData.value && voteData.value.task) { + uni.navigateTo({ + url: `/pages/task/detail/index?id=${voteData.value.task.taskId}` + }); + } + }; + + // 格式化数字 + const formatNumber = (num) => { + if (num === null || num === undefined) return '0'; + return Number(num).toLocaleString(); + }; + + // 获取投票规则文本 + const getVoteRuleText = (vote) => { + if (!vote) return ''; + + if (vote.voteType === 2) { // 弹劾投票 + return `弹劾需要${vote.requiredVotes || 0}票(${vote.totalVoters || 0}人中的≥2/3)`; + } else if (vote.voteType === 1) { // 踢人投票 + return `踢人需要${vote.requiredVotes || 0}票(${vote.totalVoters || 0}人中的50%及以上)`; + } else if (vote.voteType === 3) { // 选举投票 + return `选举需要${vote.totalVoters || 0}人中的50%以上参与投票(不管投给谁)`; + } + + return ''; + }; + + // 获取投票类型文本 + const getVoteTypeText = (voteType) => { + switch (voteType) { + case 1: + return '踢人投票'; + case 2: + return '弹劾投票'; + case 3: + return '选举新队长投票'; + default: + return '未知投票类型'; + } + }; + + // 获取任务状态文本 + const getStatusText = (status) => { + const statusMap = { + '0': '待挑战', + '1': '进行中', + '2': '进行中', + '3': '已完成', + '4': '已取消', + '5': '已过期' + }; + return statusMap[status] || '未知状态'; + }; + + return { + showVoteModalFlag, + currentVoteMessage, + voteData, + voteLoading, + withdrawLoading, + selectedCandidate, + showVoteModal, + closeVoteModal, + reloadVoteData, + submitVote, + withdrawVote, + submitCandidateVote, + selectCandidate, + getCandidates, + goToTaskDetail, + formatNumber, + getVoteRuleText, + getVoteTypeText, + getStatusText + }; +} + diff --git a/pages/message/composables/useWorkVerification.js b/pages/message/composables/useWorkVerification.js new file mode 100644 index 00000000..189871c2 --- /dev/null +++ b/pages/message/composables/useWorkVerification.js @@ -0,0 +1,216 @@ +// pages/message/composables/useWorkVerification.js +import { ref, nextTick } from 'vue'; +import { NETWORK_CONFIG } from '@/config/network.js'; + +export function useWorkVerification({ fetchMessages, actionMsg }) { + const showWorkVerifyDialog = ref(false); + const isCameraActive = ref(false); + const isVerifying = ref(false); + const verifyStatus = ref(null); + const currentWorkVerificationId = ref(''); + const videoEl = ref(null); + const stream = ref(null); + + // videoWrap 需要通过 setVideoWrap 设置 + let videoWrap = null; + + const setVideoWrap = (ref) => { + videoWrap = ref; + }; + + // 开启工作核验弹窗 + const openWorkVerifyDialog = (workVerificationId) => { + currentWorkVerificationId.value = workVerificationId; + showWorkVerifyDialog.value = true; + verifyStatus.value = null; + // 自动开启摄像头 + nextTick(() => { + startCamera(); + }); + }; + + // 关闭工作核验弹窗 + const closeWorkVerifyDialog = () => { + showWorkVerifyDialog.value = false; + stopCamera(); + verifyStatus.value = null; + currentWorkVerificationId.value = ''; + }; + + // 切换摄像头 + const toggleCamera = async () => { + if (isCameraActive.value) { + stopCamera(); + } else { + await startCamera(); + } + }; + + // 开启摄像头 + const startCamera = async () => { + try { + // #ifdef H5 + if (videoWrap.value) { + const video = document.createElement('video'); + video.autoplay = true; + video.playsInline = true; + video.style.width = '100%'; + video.style.height = '200px'; + video.style.borderRadius = '8px'; + video.style.objectFit = 'cover'; + videoWrap.value.appendChild(video); + videoEl.value = video; + + const mediaStream = await navigator.mediaDevices.getUserMedia({ + video: { + facingMode: 'user', + width: { ideal: 640 }, + height: { ideal: 480 } + } + }); + video.srcObject = mediaStream; + stream.value = mediaStream; + } + // #endif + isCameraActive.value = true; + verifyStatus.value = { type: 'success', icon: '✅', message: '摄像头已开启' }; + } catch (e) { + console.error('开启摄像头失败:', e); + verifyStatus.value = { type: 'error', icon: '❌', message: '摄像头不可用' }; + isCameraActive.value = false; + } + }; + + // 关闭摄像头 + const stopCamera = () => { + // #ifdef H5 + if (stream.value) { + stream.value.getTracks().forEach(track => track.stop()); + stream.value = null; + } + if (videoEl.value) { + videoEl.value.remove(); + videoEl.value = null; + } + // #endif + isCameraActive.value = false; + verifyStatus.value = null; + }; + + // 摄像头错误处理 + const onCameraError = () => { + verifyStatus.value = { type: 'error', icon: '❌', message: '摄像头错误' }; + isCameraActive.value = false; + }; + + // 捕获图像并转换为 base64 + const captureBase64 = async () => { + // #ifdef H5 + if (videoEl.value && videoEl.value.videoWidth && videoEl.value.videoHeight) { + const canvas = document.createElement('canvas'); + canvas.width = videoEl.value.videoWidth; + canvas.height = videoEl.value.videoHeight; + const ctx = canvas.getContext('2d'); + ctx.drawImage(videoEl.value, 0, 0, canvas.width, canvas.height); + return canvas.toDataURL('image/jpeg', 0.85); + } + // #endif + // #ifdef APP-PLUS || MP-WEIXIN + const cameraContext = uni.createCameraContext(); + const p = await new Promise((resolve, reject) => { + cameraContext.takePhoto({ + quality: 'high', + success: (res) => { + uni.getFileSystemManager().readFile({ + filePath: res.tempImagePath, + encoding: 'base64', + success: (f) => resolve('data:image/jpeg;base64,' + f.data), + fail: reject + }); + }, + fail: reject + }); + }); + return p; + // #endif + }; + + // 开始核验 + const startVerification = async () => { + if (!currentWorkVerificationId.value) { + verifyStatus.value = { type: 'error', icon: '❌', message: '缺少核验参数' }; + return; + } + + isVerifying.value = true; + verifyStatus.value = { type: 'info', icon: '⏳', message: '正在核验...' }; + + try { + const frame = await captureBase64(); + if (!frame) { + throw new Error('无法采集图像'); + } + + const token = uni.getStorageSync('accessToken'); + const res = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/work/verify`, + method: 'POST', + header: { 'Access-Token': `Bearer ${token}` }, + data: { + id: Number(currentWorkVerificationId.value), + frames: [frame], + action: 'shake_head' + } + }); + + if (res.statusCode === 200) { + const verificationResult = res.data?.data?.result; + + if (verificationResult === 1) { + verifyStatus.value = { type: 'success', icon: '✅', message: '核验成功' }; + actionMsg.value = '工作核验成功'; + // 立即刷新消息列表,确保获取最新数据 + fetchMessages(); + setTimeout(() => { + closeWorkVerifyDialog(); + }, 1500); + } else if (verificationResult === 0) { + verifyStatus.value = { type: 'error', icon: '❌', message: '核验失败,请重新核验' }; + actionMsg.value = '工作核验失败'; + // 核验失败也要刷新消息列表,更新状态显示 + fetchMessages(); + } else { + if (NETWORK_CONFIG.DEBUG) { + console.log('核验结果异常,值:', verificationResult); + } + verifyStatus.value = { type: 'error', icon: '❌', message: `核验结果异常: ${verificationResult}` }; + } + } else { + console.error('核验请求失败,状态码:', res.statusCode, '响应:', res.data); + verifyStatus.value = { type: 'error', icon: '❌', message: res.data?.message || '核验失败' }; + } + } catch (e) { + console.error('核验失败:', e); + verifyStatus.value = { type: 'error', icon: '❌', message: e.message || '核验失败' }; + } finally { + isVerifying.value = false; + } + }; + + return { + showWorkVerifyDialog, + isCameraActive, + isVerifying, + verifyStatus, + currentWorkVerificationId, + setVideoWrap, + openWorkVerifyDialog, + closeWorkVerifyDialog, + toggleCamera, + startCamera, + stopCamera, + onCameraError, + startVerification + }; +} + diff --git a/pages/message/index.vue b/pages/message/index.vue index f99f2225..756667a7 100644 --- a/pages/message/index.vue +++ b/pages/message/index.vue @@ -1,6142 +1,545 @@ - -// 撤回投票(使用新的 /message/withdraw-vote 接口) -const withdrawVote = async () => { - try { - withdrawLoading.value = true; - - const token = uni.getStorageSync('accessToken'); - if (!token) { - uni.showToast({ title: '请先登录', icon: 'none' }); - return; - } - - // 获取 messageId(优先从 voteData.vote.messageId 获取,其次从 message.id 获取) - let messageId = voteData.value?.vote?.messageId || currentVoteMessage.value?.id || voteData.value?.message?.id; - - if (!messageId) { - uni.showToast({ title: '投票消息已失效,请刷新后重试', icon: 'none' }); - return; - } - - console.log('撤回投票,messageId:', messageId); - - const response = await uni.request({ - url: `${NETWORK_CONFIG.API_BASE_URL}/message/withdraw-vote`, - method: 'POST', - data: { - messageId: Number(messageId) - }, - header: { - 'Access-Token': `Bearer ${token}`, - 'Content-Type': 'application/json' - } - }); - - // 解析响应数据 - let responseData; - if (typeof response.data === 'string') { - try { - responseData = JSON.parse(response.data); - } catch (e) { - console.error('解析响应数据失败:', e); - responseData = { success: false, message: '响应数据格式错误' }; - } - } else { - responseData = response.data; - } - - console.log('撤回投票响应:', responseData); - - if (responseData && responseData.success) { - uni.showToast({ - title: '投票已撤回', - icon: 'success' - }); - - // 重新获取投票数据 - await showVoteModal(currentVoteMessage.value); - } else { - uni.showToast({ title: responseData?.message || '撤回失败', icon: 'none' }); - } - } catch (error) { - console.error('撤回投票失败:', error); - uni.showToast({ title: '撤回失败,请重试', icon: 'none' }); - } finally { - withdrawLoading.value = false; - } -}; + \ No newline at end of file diff --git a/pages/message/utils/apiHelpers.js b/pages/message/utils/apiHelpers.js new file mode 100644 index 00000000..ad5c58c3 --- /dev/null +++ b/pages/message/utils/apiHelpers.js @@ -0,0 +1,173 @@ +/** + * API 请求辅助工具函数 + * 统一处理 API 响应、错误处理、消息刷新等通用逻辑 + */ + +import { NETWORK_CONFIG } from '@/config/network.js'; + +/** + * 解析 API 响应数据 + * @param {*} data - 原始响应数据 + * @returns {Object} 解析后的响应数据对象 + */ +export function parseResponseData(data) { + if (typeof data === 'string') { + try { + return JSON.parse(data); + } catch (e) { + console.error('[API助手] JSON解析失败:', e); + return { success: false, message: '响应数据格式错误' }; + } + } + return data || {}; +} + +/** + * 检查响应是否成功 + * @param {Object} responseData - 解析后的响应数据 + * @returns {boolean} 是否成功 + */ +export function isSuccessResponse(responseData) { + if (!responseData) return false; + // 支持多种成功标识格式 + return responseData.code === 200 || + responseData.success === true || + responseData.success !== false; +} + +/** + * 获取错误消息 + * @param {Object} responseData - 响应数据 + * @param {Error} error - 错误对象 + * @param {string} defaultMsg - 默认错误消息 + * @returns {string} 错误消息 + */ +export function getErrorMessage(responseData, error, defaultMsg = '操作失败') { + if (responseData) { + return responseData.message || responseData.msg || defaultMsg; + } + if (error) { + return error.message || error.errMsg || error.response?.data || defaultMsg; + } + return defaultMsg; +} + +/** + * 刷新消息列表的通用逻辑 + * @param {Object} options - 选项对象 + * @param {Function} options.fetchMessages - 刷新消息列表的函数 + * @param {Function} options.fetchUnreadCounts - 刷新未读计数的函数(可选) + * @param {Object} options.currentFilters - 当前筛选条件 + * @param {Function} options.resetPage - 重置页码函数(可选) + * @param {number} options.delay - 延迟时间(毫秒),默认300 + * @returns {Promise} + */ +export async function refreshMessagesAfterAction({ + fetchMessages, + fetchUnreadCounts, + currentFilters, + resetPage, + delay = 300 +}) { + if (!fetchMessages) return; + + // 重置页码(如果提供了重置函数) + if (resetPage) { + resetPage(); + } + + // 等待一段时间确保后端状态已更新 + if (delay > 0) { + await new Promise(resolve => setTimeout(resolve, delay)); + } + + // 刷新消息列表(使用当前筛选条件) + const filters = currentFilters?.value || {}; + await fetchMessages(filters); + + // 刷新未读计数(如果提供了函数) + if (fetchUnreadCounts) { + await fetchUnreadCounts(); + } +} + +/** + * 处理 API 请求的通用模式 + * @param {Object} options - 选项对象 + * @param {Function} options.apiCall - API 调用函数(返回 Promise) + * @param {Object} options.successHandlers - 成功处理对象 + * @param {Function} options.errorHandler - 错误处理函数(可选) + * @param {boolean} options.showLoading - 是否显示加载提示,默认 true + * @param {string} options.loadingText - 加载提示文本,默认 '处理中...' + * @returns {Promise} 响应数据 + */ +export async function handleApiRequest({ + apiCall, + successHandlers = {}, + errorHandler, + showLoading = true, + loadingText = '处理中...' +}) { + try { + if (showLoading) { + uni.showLoading({ title: loadingText }); + } + + const response = await apiCall(); + + if (showLoading) { + uni.hideLoading(); + } + + // 检查 HTTP 状态码 + if (response.statusCode === 200 || (response.statusCode >= 200 && response.statusCode < 300)) { + const responseData = parseResponseData(response.data); + + // 检查业务状态码 + if (isSuccessResponse(responseData)) { + // 执行成功处理函数 + if (successHandlers.onSuccess) { + await successHandlers.onSuccess(responseData, response); + } + + return { success: true, data: responseData, response }; + } else { + // 业务逻辑失败 + const errorMsg = getErrorMessage(responseData); + if (successHandlers.onBusinessError) { + await successHandlers.onBusinessError(responseData, errorMsg); + } else if (errorHandler) { + errorHandler(new Error(errorMsg), responseData); + } else { + uni.showToast({ title: errorMsg, icon: 'none', duration: 3000 }); + } + + return { success: false, data: responseData, response, error: errorMsg }; + } + } else { + // HTTP 错误 + const errorMsg = response.data?.message || `请求失败 (${response.statusCode})`; + if (errorHandler) { + errorHandler(new Error(errorMsg), response.data); + } else { + uni.showToast({ title: errorMsg, icon: 'none', duration: 3000 }); + } + + return { success: false, data: response.data, response, error: errorMsg }; + } + } catch (error) { + if (showLoading) { + uni.hideLoading(); + } + + const errorMsg = getErrorMessage(null, error); + if (errorHandler) { + errorHandler(error); + } else { + uni.showToast({ title: errorMsg, icon: 'none', duration: 3000 }); + } + + return { success: false, error: errorMsg }; + } +} + diff --git a/pages/message/utils/messageFormatters.js b/pages/message/utils/messageFormatters.js new file mode 100644 index 00000000..1a0e4f70 --- /dev/null +++ b/pages/message/utils/messageFormatters.js @@ -0,0 +1,190 @@ +/** + * 消息格式化工具函数 + * 用于格式化消息相关的时间、数字等显示 + */ + +/** + * 格式化时间显示 + * @param {string|Date} t - 时间字符串或Date对象 + * @returns {string} 格式化后的时间字符串 + */ +export const formatTime = (t) => { + if (!t) return '-'; + return String(t).replace('T', ' ').slice(0, 19); +}; + +/** + * 格式化倒计时显示(秒数转换为 MM:SS 或 HH:MM:SS 格式) + * @param {number} seconds - 剩余秒数 + * @returns {string} 格式化后的倒计时字符串 + */ +export const formatCountdown = (seconds) => { + if (!seconds || seconds <= 0) return '00:00'; + + const hours = Math.floor(seconds / 3600); + const minutes = Math.floor((seconds % 3600) / 60); + const secs = seconds % 60; + + if (hours > 0) { + return `${hours}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`; + } else { + return `${minutes}:${secs.toString().padStart(2, '0')}`; + } +}; + +/** + * 解析时间字符串为毫秒数 + * @param {string|number|Date} raw - 时间原始值 + * @returns {number|null} 毫秒数,解析失败返回null + */ +const parseTimeToMs = (raw) => { + if (!raw) return null; + + try { + if (typeof raw === 'number') { + return raw < 1e12 ? raw * 1000 : raw; + } else if (typeof raw === 'string') { + const trimmed = raw.trim(); + // 纯数字字符串(时间戳) + if (/^\d+$/.test(trimmed)) { + const num = Number(trimmed); + return num < 1e12 ? num * 1000 : num; + } + + // 日期字符串 + const looksISO = trimmed.includes('T'); + const hasZone = /[zZ]|[+\-]\d{2}:?\d{2}$/.test(trimmed); + + if (looksISO && !hasZone) { + // ISO格式但没有时区:尝试添加UTC时区标识 + const parsed = Date.parse(trimmed + 'Z'); + if (!isNaN(parsed)) return parsed; + } else if (!looksISO && !hasZone) { + // 格式为 "yyyy-MM-dd HH:mm:ss":假设服务器在UTC+8时区 + const dateStr = trimmed.replace(' ', 'T') + '+08:00'; + const parsed = Date.parse(dateStr); + if (!isNaN(parsed)) { + return parsed; + } else { + // 备用方案:按本地时间解析 + const localParsed = Date.parse(trimmed.replace(' ', 'T')); + if (!isNaN(localParsed)) return localParsed; + } + } else { + // 有时区信息,直接解析 + const parsed = Date.parse(trimmed); + if (!isNaN(parsed)) return parsed; + } + } else if (raw instanceof Date) { + return raw.getTime(); + } + } catch (e) { + console.error('解析时间失败:', e); + } + + return null; +}; + +/** + * 格式化过期时间显示 + * @param {string|number|Date} expiresAt - 过期时间 + * @returns {string} 格式化后的过期时间字符串 + */ +export const formatExpiresTime = (expiresAt) => { + if (!expiresAt) return '-'; + + const expiresMs = parseTimeToMs(expiresAt); + if (!expiresMs) return '-'; + + try { + const now = Date.now(); + const diff = expiresMs - now; + + if (diff <= 0) { + return '已过期'; + } else if (diff < 60 * 1000) { + return `${Math.ceil(diff / 1000)}秒后过期`; + } else if (diff < 60 * 60 * 1000) { + return `${Math.ceil(diff / (60 * 1000))}分钟后过期`; + } else { + const date = new Date(expiresMs); + return date.toLocaleString('zh-CN', { + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit' + }); + } + } catch (e) { + return '-'; + } +}; + +/** + * 格式化预约时间显示 + * @param {string|Date} scheduledTime - 预约时间 + * @returns {string} 格式化后的预约时间字符串 + */ +export const formatScheduledTime = (scheduledTime) => { + if (!scheduledTime) return '-'; + + try { + const date = new Date(scheduledTime); + return date.toLocaleString('zh-CN', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit' + }); + } catch (e) { + return String(scheduledTime); + } +}; + +/** + * 格式化任务截止时间 + * @param {string|Date} deadline - 截止时间 + * @returns {string} 格式化后的截止时间字符串 + */ +export const formatTaskDeadline = (deadline) => { + if (!deadline) return '未设置'; + + try { + const date = new Date(deadline); + const now = new Date(); + const diffTime = date.getTime() - now.getTime(); + const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); + + if (diffDays < 0) { + return '已过期'; + } else if (diffDays === 0) { + return '今天截止'; + } else if (diffDays === 1) { + return '明天截止'; + } else if (diffDays <= 7) { + return `${diffDays}天后截止`; + } else { + return date.toLocaleDateString('zh-CN', { + year: 'numeric', + month: 'short', + day: 'numeric' + }); + } + } catch (error) { + console.error('格式化截止时间失败:', error); + return '时间格式错误'; + } +}; + +/** + * 格式化数字(千分位) + * @param {number} num - 要格式化的数字 + * @returns {string} 格式化后的数字字符串 + */ +export const formatNumber = (num) => { + if (num === null || num === undefined) return '0'; + return Number(num).toLocaleString(); +}; + diff --git a/pages/message/utils/messageHelpers.js b/pages/message/utils/messageHelpers.js new file mode 100644 index 00000000..4621fca3 --- /dev/null +++ b/pages/message/utils/messageHelpers.js @@ -0,0 +1,340 @@ +/** + * 消息辅助函数 + * 用于解析消息类型、状态、过期时间等 + */ + +import { MessageType, getStatusDescriptionByType, MessageUtils } from '@/utils/messageTypes'; + +/** + * 检查是否是队长转让相关消息 + * @param {Object} msg - 消息对象 + * @returns {boolean} 是否是队长转让消息 + */ +export const isLeaderTransferMsg = (msg) => { + const title = (msg?.title || '').trim(); + return title.includes('队长转让') || title.includes('成为新队长') || title.includes('队长已变更'); +}; + +/** + * 获取队长转让类型标签 + * @param {Object} msg - 消息对象 + * @returns {string} 类型标签 + */ +export const leaderTransferTypeLabel = (msg) => { + const title = (msg?.title || '').trim(); + if (title.includes('成为新队长')) return '成为新队长'; + if (title.includes('队长已变更')) return '队长已变更'; + return '队长转让'; +}; + +/** + * 统一解析消息的展示类型:如果文本里包含"投票",一律按投票处理 + * @param {Object} msg - 消息对象 + * @returns {number} 消息类型 + */ +export const resolveMessageType = (msg) => { + try { + const title = msg?.title || ''; + const content = msg?.content || ''; + const extra = typeof msg?.extraData === 'string' + ? JSON.parse(msg.extraData || '{}') + : (msg?.extraData || {}); + const hasVoteSignal = title.includes('投票') || + content.includes('投票') || + !!extra.voteId || + extra.type === 'vote' || + extra.eventType === 'TEAM_VOTE'; + if (hasVoteSignal) return MessageType.TEAM_VOTE; + } catch (_) {} + return msg?.type; +}; + +/** + * 获取消息类型文本 + * @param {number} t - 消息类型 + * @param {Object} msg - 消息对象 + * @returns {string} 类型文本 + */ +export const typeText = (t, msg) => { + const builtIn = MessageUtils.getTypeDescription(t); + if (builtIn && builtIn !== '未知类型') return builtIn; + if (isLeaderTransferMsg(msg)) return leaderTransferTypeLabel(msg); + return '系统通知'; +}; + +/** + * 获取消息状态文本 + * @param {number} s - 状态值 + * @param {number} messageType - 消息类型 + * @param {Object} msg - 消息对象 + * @param {string} category - 当前分类 + * @returns {string} 状态文本 + */ +export const statusText = (s, messageType, msg, category = 'system') => { + // 系统类消息统一使用"未读/已读" + const isSystem = MessageUtils?.isSystemMessage?.(messageType) || + category === 'system' || + isLeaderTransferMsg(msg); + if (isSystem) { + if (String(s) === '0') return '未读'; + if (String(s) === '1') return '已读'; + return '已读'; + } + // 其余类型使用内置映射 + const builtIn = getStatusDescriptionByType(s, messageType); + return builtIn || '未知状态'; +}; + +/** + * 获取消息的过期时间 + * @param {Object} msg - 消息对象 + * @returns {string|number|null} 过期时间 + */ +export const getExpiresAt = (msg) => { + try { + // 优先检查投票消息的过期时间字段 + if (msg.expiresAt) { + return msg.expiresAt; + } + if (msg.voteDeadline) { + return msg.voteDeadline; + } + // 工作核验消息的过期时间 + const workVerification = typeof msg.extraData === 'string' + ? JSON.parse(msg.extraData || '{}') + : (msg.extraData || {}); + return workVerification.verificationTime; + } catch (e) { + return null; + } +}; + +/** + * 检查是否已过期 + * @param {Object} msg - 消息对象 + * @returns {boolean} 是否已过期 + */ +export const isExpired = (msg) => { + const expiresAt = getExpiresAt(msg); + if (!expiresAt) return false; + + try { + const raw = expiresAt; + let expiresMs = null; + + if (typeof raw === 'number') { + expiresMs = raw < 1e12 ? raw * 1000 : raw; + } else if (typeof raw === 'string') { + const trimmed = raw.trim(); + if (/^\d+$/.test(trimmed)) { + const num = Number(trimmed); + expiresMs = num < 1e12 ? num * 1000 : num; + } else { + const looksISO = trimmed.includes('T'); + const hasZone = /[zZ]|[+\-]\d{2}:?\d{2}$/.test(trimmed); + + if (looksISO && !hasZone) { + const toParse = trimmed + 'Z'; + const parsed = Date.parse(toParse); + if (!isNaN(parsed)) expiresMs = parsed; + } else if (!looksISO && !hasZone) { + const dateStr = trimmed.replace(' ', 'T') + '+08:00'; + const parsed = Date.parse(dateStr); + if (!isNaN(parsed)) { + expiresMs = parsed; + } else { + const localParsed = Date.parse(trimmed.replace(' ', 'T')); + if (!isNaN(localParsed)) expiresMs = localParsed; + } + } else { + const parsed = Date.parse(trimmed); + if (!isNaN(parsed)) expiresMs = parsed; + } + } + } else if (raw instanceof Date) { + expiresMs = raw.getTime(); + } + + if (expiresMs) { + // 允许 90 秒时钟偏差的宽限 + return Date.now() - expiresMs > 90 * 1000; + } + return false; + } catch (e) { + return false; + } +}; + +/** + * 检查工作核验状态(从消息extraData中获取) + * @param {Object} msg - 消息对象 + * @returns {number|null} 核验状态:0=失败, 1=成功, null=未核验 + */ +export const getVerificationStatus = (msg) => { + try { + const workVerification = typeof msg.extraData === 'string' + ? JSON.parse(msg.extraData || '{}') + : (msg.extraData || {}); + return workVerification.result; + } catch (e) { + console.error('getVerificationStatus 解析错误:', e); + return null; + } +}; + +/** + * 获取核验状态文本 + * @param {Object} msg - 消息对象 + * @returns {string} 状态文本 + */ +export const getVerificationStatusText = (msg) => { + const status = getVerificationStatus(msg); + if (status === 1) return '已处理'; + if (status === 0) return '未处理'; + if (status === 2) return '已过期'; + return '未核验'; +}; + +/** + * 获取核验状态样式类 + * @param {Object} msg - 消息对象 + * @returns {string} 样式类名 + */ +export const getVerificationStatusClass = (msg) => { + const status = getVerificationStatus(msg); + if (status === 1) return 'status-processed'; + if (status === 0) return 'status-pending'; + if (status === 2) return 'status-expired'; + return 'status-pending'; +}; + +/** + * 获取AI考试预约时间 + * @param {Object} msg - 消息对象 + * @returns {string|null} 预约时间 + */ +export const getExamScheduledTime = (msg) => { + try { + const extraData = typeof msg.extraData === 'string' + ? JSON.parse(msg.extraData || '{}') + : (msg.extraData || {}); + return extraData.scheduledStartTime; + } catch (e) { + return null; + } +}; + +/** + * 获取考试状态文本 + * @param {Object} msg - 消息对象 + * @returns {string} 状态文本 + */ +export const getExamStatusText = (msg) => { + try { + const extraData = typeof msg.extraData === 'string' + ? JSON.parse(msg.extraData || '{}') + : (msg.extraData || {}); + const status = extraData.status; + if (status === 1) return '已预约'; + if (status === 2) return '进行中'; + if (status === 3) return '已完成'; + if (status === 4) return '异常'; + return '待预约'; + } catch (e) { + return '待预约'; + } +}; + +/** + * 获取考试状态样式类 + * @param {Object} msg - 消息对象 + * @returns {string} 样式类名 + */ +export const getExamStatusClass = (msg) => { + try { + const extraData = typeof msg.extraData === 'string' + ? JSON.parse(msg.extraData || '{}') + : (msg.extraData || {}); + const status = extraData.status; + if (status === 'scheduled' || status === 1) return 'status-scheduled'; + if (status === 'in_progress' || status === 2) return 'status-in-progress'; + if (status === 'completed' || status === 3) return 'status-completed'; + if (status === 4) return 'status-abnormal'; + return 'status-pending'; + } catch (e) { + return 'status-pending'; + } +}; + +/** + * 获取任务状态文本 + * @param {string} status - 任务状态 + * @returns {string} 状态文本 + */ +export const getTaskStatusText = (status) => { + const statusMap = { + 'PENDING': '待开始', + 'IN_PROGRESS': '进行中', + 'COMPLETED': '已完成', + 'CANCELLED': '已取消', + 'EXPIRED': '已过期' + }; + return statusMap[status] || '未知状态'; +}; + +/** + * 获取任务状态样式类 + * @param {string} status - 任务状态 + * @returns {string} 样式类名 + */ +export const getTaskStatusClass = (status) => { + const classMap = { + 'PENDING': 'status-pending', + 'IN_PROGRESS': 'status-progress', + 'COMPLETED': 'status-completed', + 'CANCELLED': 'status-cancelled', + 'EXPIRED': 'status-expired' + }; + return classMap[status] || 'status-unknown'; +}; + +/** + * 获取投票类型文本 + * @param {number} voteType - 投票类型 + * @returns {string} 投票类型文本 + */ +export const getVoteTypeText = (voteType) => { + switch (voteType) { + case 1: + return '踢人投票'; + case 2: + return '弹劾投票'; + case 3: + return '选举新队长投票'; + default: + return '未知投票类型'; + } +}; + +/** + * 获取投票规则文本(使用后端返回的数据) + * @param {Object} vote - 投票对象 + * @returns {string} 规则文本 + */ +export const getVoteRuleText = (vote) => { + if (!vote) return ''; + + if (vote.voteType === 2) { // 弹劾投票 + return `弹劾需要${vote.requiredVotes || 0}票(${vote.totalVoters || 0}人中的≥2/3)`; + } else if (vote.voteType === 1) { // 踢人投票 + return `踢人需要${vote.requiredVotes || 0}票(${vote.totalVoters || 0}人中的50%及以上)`; + } else if (vote.voteType === 3) { // 选举投票 + return `选举需要${vote.totalVoters || 0}人中的50%以上参与投票(不管投给谁)`; + } + + return ''; +}; + +// getStatusDescriptionByType 已从 @/utils/messageTypes 导入,直接导出 +export { getStatusDescriptionByType }; + diff --git a/pages/push/recent/index.vue b/pages/push/recent/index.vue index 6c0d4630..cc83fe1b 100644 --- a/pages/push/recent/index.vue +++ b/pages/push/recent/index.vue @@ -146,6 +146,8 @@ import { ref, onMounted } from 'vue'; import { useUserStore } from '@/store/user'; import { NETWORK_CONFIG } from '@/config/network.js'; +// 手动导入 uni-ui 组件(easycom autoscan 已禁用) +import uniNavBar from '@dcloudio/uni-ui/lib/uni-nav-bar/uni-nav-bar.vue'; const userStore = useUserStore(); const pushRecords = ref([]); diff --git a/pages/task/detail/REFACTOR_SUMMARY.md b/pages/task/detail/REFACTOR_SUMMARY.md deleted file mode 100644 index a210a6b8..00000000 --- a/pages/task/detail/REFACTOR_SUMMARY.md +++ /dev/null @@ -1,125 +0,0 @@ -# Task页面解耦重构总结 - -## 🎯 重构目标 -将原本4700+行的巨型task页面拆分为多个可维护的组件和逻辑模块。 - -## 📁 重构后的文件结构 - -``` -frontend/pages/task/detail/ -├── index.vue # 主页面(简化版,578行) -├── index-backup.vue # 原文件备份(4712行) -├── index-refactored.vue # 完整重构版本(578行) -├── index-simple.vue # 简化版本(用于调试) -├── components/ # 组件目录 -│ ├── TaskHeader.vue # 任务头部组件(126行) -│ ├── TaskActions.vue # 任务操作组件(155行) -│ ├── TeamManagement.vue # 团队管理组件 -│ ├── VoteSystem.vue # 投票系统组件 -│ ├── WorkRecords.vue # 工作记录组件 -│ └── TeamInvitationModal.vue # 团队邀请模态框 -└── composables/ # 逻辑模块 - ├── useTaskData.js # 任务数据管理(134行) - ├── useTeamManagement.js # 团队管理逻辑(275行) - ├── useVoteSystem.js # 投票系统逻辑(256行) - ├── useWorkRecords.js # 工作记录逻辑 - └── useWebSocket.js # WebSocket管理 -``` - -## ✅ 重构成果 - -### 1. 代码行数对比 -- **原文件**: 4712行 → **重构后**: 578行(主页面) -- **减少**: 4134行(87.7%的代码减少) -- **组件化**: 6个独立组件 -- **逻辑分离**: 5个composables模块 - -### 2. 功能模块化 -| 模块 | 原状态 | 重构后 | 改进 | -|------|--------|--------|------| -| **任务头部** | 内嵌在主页面 | TaskHeader.vue | ✅ 独立组件 | -| **任务操作** | 内嵌在主页面 | TaskActions.vue | ✅ 独立组件 | -| **团队管理** | 内嵌在主页面 | TeamManagement.vue | ✅ 独立组件 | -| **投票系统** | 内嵌在主页面 | VoteSystem.vue | ✅ 独立组件 | -| **工作记录** | 内嵌在主页面 | WorkRecords.vue | ✅ 独立组件 | -| **数据管理** | 分散在主页面 | useTaskData.js | ✅ 统一管理 | -| **团队逻辑** | 分散在主页面 | useTeamManagement.js | ✅ 统一管理 | -| **投票逻辑** | 分散在主页面 | useVoteSystem.js | ✅ 统一管理 | - -### 3. 性能优化 -- **响应式数据减少**: 从100+个响应式变量减少到核心变量 -- **组件懒加载**: 按需加载组件 -- **逻辑复用**: composables可在其他页面复用 -- **内存占用**: 显著降低内存使用 - -### 4. 维护性提升 -- **单一职责**: 每个组件只负责一个功能 -- **代码复用**: composables可在多个页面使用 -- **测试友好**: 组件和逻辑可独立测试 -- **调试便利**: 问题定位更精确 - -## 🔧 技术实现 - -### 组件化架构 -```vue - - -``` - -### Composables模式 -```javascript -// 数据管理 -const { taskData, loading, error, fetchTaskDetail } = useTaskData() -const { teamInfo, isTeamLeader, createTeam } = useTeamManagement() -const { activeVote, submitVote } = useVoteSystem() -``` - -## 🚀 使用方式 - -### 1. 当前版本(简化版) -- 使用传统的Vue 2 Options API -- 包含调试信息,便于问题排查 -- 确保基本功能正常 - -### 2. 完整重构版本 -- 使用Vue 3 Composition API -- 完整的组件化架构 -- 最佳的性能和维护性 - -### 3. 渐进式迁移 -1. 先使用简化版本确保功能正常 -2. 逐步迁移到完整重构版本 -3. 根据实际使用情况调整组件 - -## 📋 后续优化建议 - -### 短期(1-2周) -1. **完善错误处理**: 添加更详细的错误提示 -2. **优化加载状态**: 改善用户体验 -3. **添加单元测试**: 确保组件稳定性 - -### 中期(1个月) -1. **状态管理**: 引入Pinia进行全局状态管理 -2. **缓存优化**: 添加数据缓存机制 -3. **性能监控**: 添加性能监控指标 - -### 长期(3个月) -1. **微前端架构**: 考虑微前端拆分 -2. **服务端渲染**: 优化首屏加载 -3. **国际化支持**: 添加多语言支持 - -## 🎉 总结 - -通过这次重构,我们成功将: -- **4712行的巨型文件** → **578行的主页面 + 6个组件 + 5个逻辑模块** -- **难以维护的代码** → **清晰可读的组件化架构** -- **性能问题** → **优化的响应式数据管理** -- **调试困难** → **模块化的错误定位** - -这次重构为后续的功能开发和维护奠定了坚实的基础! diff --git a/pages/task/detail/STYLE_DISTRIBUTION.md b/pages/task/detail/STYLE_DISTRIBUTION.md new file mode 100644 index 00000000..4e4e67ff --- /dev/null +++ b/pages/task/detail/STYLE_DISTRIBUTION.md @@ -0,0 +1,122 @@ +# 样式分布说明 + +## 问题说明 + +当前 `index.vue` 中包含了很多样式,但实际上这些样式应该分布在各自的组件文件中。这是因为: + +1. **组件化架构**:我们已经将功能拆分成了独立的组件(如 `TaskHeader.vue`, `TaskInfoSection.vue` 等) +2. **样式封装**:每个组件应该包含自己的样式,实现"组件自包含"的原则 +3. **样式复用**:但有些样式是多个组件共享的,需要保留在 `index.vue` 中 + +## 样式分布原则 + +### ✅ 应该在组件文件中的样式 + +每个组件文件(`.vue`)应该在 ` + diff --git a/pages/task/detail/components/ApplyCompleteForm.vue b/pages/task/detail/components/ApplyCompleteForm.vue new file mode 100644 index 00000000..59ac0347 --- /dev/null +++ b/pages/task/detail/components/ApplyCompleteForm.vue @@ -0,0 +1,127 @@ + + + + + + + diff --git a/pages/task/detail/components/ApplyCompletePreview.vue b/pages/task/detail/components/ApplyCompletePreview.vue new file mode 100644 index 00000000..de9e38ee --- /dev/null +++ b/pages/task/detail/components/ApplyCompletePreview.vue @@ -0,0 +1,173 @@ + + + + + + + diff --git a/pages/task/detail/components/CancelRequestModal.vue b/pages/task/detail/components/CancelRequestModal.vue new file mode 100644 index 00000000..675f0e93 --- /dev/null +++ b/pages/task/detail/components/CancelRequestModal.vue @@ -0,0 +1,196 @@ + + + + + + + diff --git a/pages/task/detail/components/ChallengeApplicationForm.vue b/pages/task/detail/components/ChallengeApplicationForm.vue new file mode 100644 index 00000000..7b5054de --- /dev/null +++ b/pages/task/detail/components/ChallengeApplicationForm.vue @@ -0,0 +1,635 @@ + + + + + + + diff --git a/pages/task/detail/components/EditTaskModal.vue b/pages/task/detail/components/EditTaskModal.vue new file mode 100644 index 00000000..1783e364 --- /dev/null +++ b/pages/task/detail/components/EditTaskModal.vue @@ -0,0 +1,264 @@ + + + + + + + diff --git a/pages/task/detail/components/FriendSearchSection.vue b/pages/task/detail/components/FriendSearchSection.vue new file mode 100644 index 00000000..e7a79df1 --- /dev/null +++ b/pages/task/detail/components/FriendSearchSection.vue @@ -0,0 +1,304 @@ + + + + + + + diff --git a/pages/task/detail/components/QuickActionsBar.vue b/pages/task/detail/components/QuickActionsBar.vue new file mode 100644 index 00000000..0acbb8a8 --- /dev/null +++ b/pages/task/detail/components/QuickActionsBar.vue @@ -0,0 +1,55 @@ + + + + + + + diff --git a/pages/task/detail/components/TaskActionsSection.vue b/pages/task/detail/components/TaskActionsSection.vue new file mode 100644 index 00000000..59b7b148 --- /dev/null +++ b/pages/task/detail/components/TaskActionsSection.vue @@ -0,0 +1,144 @@ + + + + + + diff --git a/pages/task/detail/components/TaskBadgesSection.vue b/pages/task/detail/components/TaskBadgesSection.vue new file mode 100644 index 00000000..c30a1478 --- /dev/null +++ b/pages/task/detail/components/TaskBadgesSection.vue @@ -0,0 +1,72 @@ + + + + + + diff --git a/pages/task/detail/components/TaskHeader.vue b/pages/task/detail/components/TaskHeader.vue index c0be3796..49667e4b 100644 --- a/pages/task/detail/components/TaskHeader.vue +++ b/pages/task/detail/components/TaskHeader.vue @@ -15,48 +15,32 @@ - 发布者:{{ task?.userName || '未知用户' }} ({{ task?.orgName || '未知企业' }}) + 发布者:{{ task?.userName || task?.publisherName || '未知用户' }} ({{ task?.orgName || '未知企业' }}) - 发布时间:{{ task?.publishTime }} - 截止日期:{{ task?.deadline }} + 发布时间:{{ task?.publishTime || task?.createdAt || '—' }} + 截止日期:{{ task?.deadline || '—' }} diff --git a/pages/task/detail/components/TaskInfoSection.vue b/pages/task/detail/components/TaskInfoSection.vue new file mode 100644 index 00000000..c727ae99 --- /dev/null +++ b/pages/task/detail/components/TaskInfoSection.vue @@ -0,0 +1,96 @@ + + + + + + diff --git a/pages/task/detail/components/TaskMapSection.vue b/pages/task/detail/components/TaskMapSection.vue new file mode 100644 index 00000000..5e3d1252 --- /dev/null +++ b/pages/task/detail/components/TaskMapSection.vue @@ -0,0 +1,630 @@ + + + + + + diff --git a/pages/task/detail/components/TeamApplicationForm.vue b/pages/task/detail/components/TeamApplicationForm.vue new file mode 100644 index 00000000..91e801fd --- /dev/null +++ b/pages/task/detail/components/TeamApplicationForm.vue @@ -0,0 +1,584 @@ + + + + + + + diff --git a/pages/task/detail/components/TeamMembersSection.vue b/pages/task/detail/components/TeamMembersSection.vue new file mode 100644 index 00000000..fd719b9a --- /dev/null +++ b/pages/task/detail/components/TeamMembersSection.vue @@ -0,0 +1,252 @@ + + + + + + + diff --git a/pages/task/detail/components/VoteHistorySection.vue b/pages/task/detail/components/VoteHistorySection.vue new file mode 100644 index 00000000..dedae76b --- /dev/null +++ b/pages/task/detail/components/VoteHistorySection.vue @@ -0,0 +1,233 @@ + + + + + + + diff --git a/pages/task/detail/components/WorkRecordsSection.vue b/pages/task/detail/components/WorkRecordsSection.vue new file mode 100644 index 00000000..871d64d6 --- /dev/null +++ b/pages/task/detail/components/WorkRecordsSection.vue @@ -0,0 +1,147 @@ + + + + + + diff --git a/pages/task/detail/composables/useBadgeContributors.js b/pages/task/detail/composables/useBadgeContributors.js new file mode 100644 index 00000000..45543d56 --- /dev/null +++ b/pages/task/detail/composables/useBadgeContributors.js @@ -0,0 +1,145 @@ +/** + * 徽章贡献者管理 Composable + * 处理徽章贡献者的添加、删除、选择、百分比分配等功能 + */ +import { reactive, computed, watch } from 'vue' + +export function useBadgeContributors(dependencies = {}) { + const { task, teamInfo, getUserNickname, getUserAvatar } = dependencies + + // 响应式数据 + const badgeContributors = reactive({}) + const badgeContributions = reactive({}) + + // 初始化徽章贡献者 + const initializeBadgeContributors = (currentUserId) => { + if (task.value && Array.isArray(task.value.badges)) { + task.value.badges.forEach(badge => { + if (!badgeContributors[badge.id]) { + badgeContributors[badge.id] = [{ + uid: currentUserId || '', + role: '主要贡献者', + percentage: 100 + }] + } + badgeContributions[badge.id] = 100 + }) + } + } + + // 监听任务变化,自动初始化 + if (task && task.value) { + watch(() => task.value, (newTask) => { + if (newTask && Array.isArray(newTask.badges)) { + newTask.badges.forEach(badge => { + badgeContributions[badge.id] = 100 + }) + // 需要传入当前用户ID,这里先设置为空,由外部调用时传入 + initializeBadgeContributors() + } + }, { immediate: true }) + } + + // 添加贡献者 + const addContributor = (badgeId) => { + if (!badgeContributors[badgeId]) { + badgeContributors[badgeId] = [] + } + badgeContributors[badgeId].push({ uid: '', role: '', percentage: 0 }) + redistributePercentage(badgeId) + } + + // 删除贡献者 + const removeContributor = (badgeId, index) => { + if (badgeContributors[badgeId]) { + badgeContributors[badgeId].splice(index, 1) + redistributePercentage(badgeId) + } + } + + // 选择贡献者 + const selectContributor = (badgeId, index, member) => { + if (badgeContributors[badgeId] && badgeContributors[badgeId][index]) { + badgeContributors[badgeId][index].uid = member.userId + badgeContributors[badgeId][index].nickname = member.nickname + } + } + + // 清空贡献者 + const clearContributor = (badgeId, index) => { + if (badgeContributors[badgeId] && badgeContributors[badgeId][index]) { + badgeContributors[badgeId][index].uid = '' + badgeContributors[badgeId][index].nickname = '' + } + } + + // 计算总百分比 + const calculateTotalPercentage = (badgeId) => { + if (!badgeContributors[badgeId]) return 0 + return badgeContributors[badgeId].reduce((sum, contributor) => sum + (contributor.percentage || 0), 0) + } + + // 验证总百分比 + const validateTotalPercentage = (badgeId) => { + return calculateTotalPercentage(badgeId) === 100 + } + + // 重新分配百分比 + const redistributePercentage = (badgeId) => { + const contributors = badgeContributors[badgeId] + if (!contributors || contributors.length === 0) return + + if (contributors.length === 1) { + contributors[0].percentage = 100 + return + } + + const equalShare = Math.floor(100 / contributors.length) + const remainder = 100 - (equalShare * contributors.length) + + contributors.forEach((contributor, index) => { + contributor.percentage = equalShare + (index === 0 ? remainder : 0) + }) + } + + // 获取团队成员数据,转换为TeamMemberSelector需要的格式 + const getTeamMembersForBadge = () => { + if (!teamInfo || !teamInfo.value || !teamInfo.value.members) { + return [] + } + + return teamInfo.value.members.map(member => ({ + userId: member.userId, + nickname: getUserNickname ? getUserNickname(member.userId) : '未知', + avatarUrl: getUserAvatar ? getUserAvatar(member.userId) : '', + role: member.role + })) + } + + // 验证所有徽章的贡献者分配是否有效 + const allBadgesValid = computed(() => { + if (!task || !task.value || !task.value.badges) return false + return task.value.badges.every(b => calculateTotalPercentage(b.id) === 100) + }) + + return { + // 响应式数据 + badgeContributors, + badgeContributions, + + // 计算属性 + allBadgesValid, + + // 方法 + initializeBadgeContributors, + addContributor, + removeContributor, + selectContributor, + clearContributor, + calculateTotalPercentage, + validateTotalPercentage, + redistributePercentage, + getTeamMembersForBadge + } +} + diff --git a/pages/task/detail/composables/useBadgeInitialization.js b/pages/task/detail/composables/useBadgeInitialization.js new file mode 100644 index 00000000..d84a95f2 --- /dev/null +++ b/pages/task/detail/composables/useBadgeInitialization.js @@ -0,0 +1,46 @@ +/** + * 徽章初始化 Composable + * 整合徽章贡献者的初始化逻辑和 watch + */ +import { watch } from 'vue' + +export function useBadgeInitialization(dependencies = {}) { + const { + task, + badgeContributorsComposable, + badgeContributions, + userStore + } = dependencies + + /** + * 初始化徽章贡献者 + */ + const initializeBadgeContributors = (currentUserId) => { + if (task.value && Array.isArray(task.value.badges)) { + badgeContributorsComposable.initializeBadgeContributors(currentUserId) + } + } + + /** + * 设置任务变化监听 + */ + const setupTaskWatcher = () => { + watch(() => task.value, (newTask) => { + if (newTask && Array.isArray(newTask.badges)) { + newTask.badges.forEach(badge => { + badgeContributions[badge.id] = 100 + }) + const currentUserId = userStore.profile?.uid + if (currentUserId) { + initializeBadgeContributors(currentUserId) + } + } + }, { immediate: true }) + } + + return { + initializeBadgeContributors, + setupTaskWatcher + } +} + diff --git a/pages/task/detail/composables/useFormatUtils.js b/pages/task/detail/composables/useFormatUtils.js new file mode 100644 index 00000000..e782123f --- /dev/null +++ b/pages/task/detail/composables/useFormatUtils.js @@ -0,0 +1,75 @@ +/** + * 格式化工具函数 Composable + * 提供数字、日期、时间等格式化功能 + */ +export function useFormatUtils() { + /** + * 数字格式化 - 使用千分位分隔符 + */ + const formatNumber = (num) => { + if (num === null || num === undefined || isNaN(num)) { + return '0' + } + const number = Number(num) + return number.toLocaleString() + } + + /** + * 百分比格式化 + */ + const formatPercentage = (num) => { + if (num === null || num === undefined || isNaN(num)) { + return '0' + } + return Number(num).toLocaleString() + } + + /** + * 日期时间格式化 + */ + const formatDateTime = (timestamp) => { + if (!timestamp) return '未知时间' + const date = new Date(timestamp) + const year = date.getFullYear() + const month = String(date.getMonth() + 1).padStart(2, '0') + const day = String(date.getDate()).padStart(2, '0') + const hours = String(date.getHours()).padStart(2, '0') + const minutes = String(date.getMinutes()).padStart(2, '0') + return `${year}-${month}-${day} ${hours}:${minutes}` + } + + /** + * 相对时间格式化(如:刚刚、5分钟前) + */ + const formatTime = (timeStr) => { + if (!timeStr) return '' + const date = new Date(timeStr) + const now = new Date() + const diff = now - date + + if (diff < 60000) return '刚刚' + if (diff < 3600000) return Math.floor(diff / 60000) + '分钟前' + if (diff < 86400000) return Math.floor(diff / 3600000) + '小时前' + return Math.floor(diff / 86400000) + '天前' + } + + /** + * 倒计时格式化(HH:MM:SS) + */ + const formatCountdown = (seconds) => { + if (!seconds || seconds <= 0) return '00:00:00' + const hours = Math.floor(seconds / 3600) + const minutes = Math.floor((seconds % 3600) / 60) + const secs = seconds % 60 + return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}` + } + + return { + formatNumber, + formatPercentage, + formatDateTime, + formatTime, + formatCountdown + } +} + diff --git a/pages/task/detail/composables/useFriendSearch.js b/pages/task/detail/composables/useFriendSearch.js new file mode 100644 index 00000000..f5a8a272 --- /dev/null +++ b/pages/task/detail/composables/useFriendSearch.js @@ -0,0 +1,189 @@ +/** + * 好友搜索和邀请 Composable + * 处理好友搜索、邀请用户加入团队等功能 + */ +import { ref } from 'vue' +import { NETWORK_CONFIG } from '@/config/network.js' + +export function useFriendSearch(dependencies = {}) { + const { parseJwtToken, taskData, teamName } = dependencies + + // 响应式数据 + const searchKeyword = ref('') + const searchResults = ref([]) + const searchLoading = ref(false) + const searchError = ref(null) + const invitedUsers = ref(new Set()) // 已邀请的用户 + + /** + * 搜索好友 + */ + const searchFriends = async (teamInfo = null) => { + if (!searchKeyword.value.trim()) { + searchResults.value = [] + return + } + + // 如果团队已解散,不允许搜索 + if (teamInfo && teamInfo.status === 2) { + uni.showToast({ title: '团队已解散,无法邀请成员', icon: 'none' }) + return + } + + searchLoading.value = true + searchError.value = null + + try { + const token = uni.getStorageSync('accessToken') + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/friends/search?keyword=${encodeURIComponent(searchKeyword.value)}`, + method: 'GET', + header: { + 'Access-Token': `Bearer ${token}` + } + }) + + if (response.data && response.data.code === 200) { + const allResults = response.data.data || [] + searchResults.value = allResults.sort((a, b) => { + if (a.friendStatus === 'accepted' && b.friendStatus !== 'accepted') return -1 + if (a.friendStatus !== 'accepted' && b.friendStatus === 'accepted') return 1 + return 0 + }) + } else { + searchError.value = response.data?.message || '搜索失败' + } + } catch (error) { + console.error('搜索好友失败:', error) + searchError.value = '搜索失败,请重试' + } finally { + searchLoading.value = false + } + } + + /** + * 邀请单个用户 + */ + const inviteSingleUser = async (friendId) => { + try { + const token = uni.getStorageSync('accessToken') + const currentUser = uni.getStorageSync('userInfo') + + let leaderId = null + if (currentUser && currentUser.uid) { + leaderId = currentUser.uid + } else { + try { + const tokenPayload = parseJwtToken?.(token) + leaderId = tokenPayload?.uid || tokenPayload?.sub + } catch (tokenError) { + console.error('解析token失败:', tokenError) + return + } + } + + if (!leaderId) return + + // 检查是否尝试邀请自己 + if (String(leaderId) === String(friendId)) { + uni.showToast({ title: '不能邀请自己加入团队', icon: 'none' }) + return + } + + // 检查是否尝试邀请任务发布者 + const taskDataVal = typeof taskData === 'function' ? taskData() : taskData + if (taskDataVal?.publisherId && String(taskDataVal.publisherId) === String(friendId)) { + uni.showToast({ title: '不能邀请任务发布者加入团队', icon: 'none' }) + return + } + + const teamNameVal = typeof teamName === 'function' ? teamName() : teamName + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/team/send-invitation`, + method: 'POST', + data: { + taskId: Number(taskDataVal?.taskId), + leaderId: Number(leaderId), + teamName: (teamNameVal?.value || teamNameVal || '临时团队').trim() || '临时团队', + inviteeIds: [Number(friendId)] + }, + header: { + 'Access-Token': `Bearer ${token}`, + 'Content-Type': 'application/json' + } + }) + + if (response.data && response.data.success) { + uni.showToast({ + title: '邀请发送成功', + icon: 'success' + }) + markUserAsInvited(friendId) + return true + } else { + uni.showToast({ + title: response.data?.message || '发送邀请失败', + icon: 'none' + }) + return false + } + } catch (error) { + console.error('发送邀请失败:', error) + uni.showToast({ + title: '发送邀请失败', + icon: 'none' + }) + return false + } + } + + /** + * 标记用户已邀请 + */ + const markUserAsInvited = (friendId) => { + invitedUsers.value.add(friendId) + } + + /** + * 检查用户是否已邀请 + */ + const isUserInvited = (friendId) => { + return invitedUsers.value.has(friendId) + } + + /** + * 清除搜索状态 + */ + const clearSearch = () => { + searchKeyword.value = '' + searchResults.value = [] + searchError.value = null + } + + /** + * 初始化已邀请用户列表(从团队成员) + */ + const initializeInvitedUsers = (memberIds = []) => { + memberIds.forEach(memberId => { + invitedUsers.value.add(memberId) + }) + } + + return { + // 响应式数据 + searchKeyword, + searchResults, + searchLoading, + searchError, + invitedUsers, + + // 方法 + searchFriends, + inviteSingleUser, + markUserAsInvited, + isUserInvited, + clearSearch, + initializeInvitedUsers + } +} + diff --git a/pages/task/detail/composables/useTaskActions.js b/pages/task/detail/composables/useTaskActions.js new file mode 100644 index 00000000..d8a91d38 --- /dev/null +++ b/pages/task/detail/composables/useTaskActions.js @@ -0,0 +1,145 @@ +/** + * 任务操作相关逻辑 Composable + * 处理任务删除、申请取消等操作 + */ +import { ref } from 'vue' +import { NETWORK_CONFIG } from '@/config/network.js' + +export function useTaskActions(dependencies = {}) { + const { + task, + taskData, + fetchTaskDetail, + checkUserApplied, + checkPendingMessages + } = dependencies + + // 响应式数据 + const showCancelRequestModal = ref(false) + const cancelReason = ref('') + + // 打开取消申请模态框 + const openCancelRequestModal = () => { + cancelReason.value = '' + showCancelRequestModal.value = true + } + + // 关闭取消申请模态框 + const closeCancelRequestModal = () => { + showCancelRequestModal.value = false + cancelReason.value = '' + } + + // 提交取消申请 + const submitCancelRequest = async () => { + if (!cancelReason.value.trim()) { + uni.showToast({ title: '请输入取消原因', icon: 'none' }) + return + } + + uni.showLoading({ title: '提交申请中...' }) + + try { + const token = uni.getStorageSync('accessToken') + if (!token) throw new Error('请先登录') + + const taskIdVal = taskData.value?.taskId || task.value?.taskId + if (!taskIdVal) throw new Error('任务 ID 缺失') + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/task/request-cancel?taskId=${taskIdVal}&reason=${encodeURIComponent(cancelReason.value)}`, + method: 'POST', + header: { 'Access-Token': `Bearer ${token}` }, + timeout: 8000 + }) + + if (response.statusCode === 200) { + uni.hideLoading() + uni.showToast({ title: '取消申请已发送', icon: 'success' }) + closeCancelRequestModal() + + // 刷新任务详情 + if (fetchTaskDetail) { + await fetchTaskDetail(taskIdVal) + } + } else { + throw new Error(response.data?.message || '提交申请失败') + } + } catch (e) { + uni.hideLoading() + uni.showToast({ title: e.message || '提交申请失败', icon: 'none' }) + } + } + + // 删除任务 + const deleteTask = async () => { + uni.showModal({ + title: '确认删除任务', + content: `确定要删除任务《${taskData.value?.title || '该任务'}》吗?删除后无法恢复。`, + success: async (res) => { + if (res.confirm) { + uni.showLoading({ title: '删除中...' }) + + try { + const token = uni.getStorageSync('accessToken') + if (!token) throw new Error('请先登录') + + const taskIdVal = taskData.value?.taskId || task.value?.taskId + if (!taskIdVal) throw new Error('任务 ID 缺失') + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/task/delete?taskId=${taskIdVal}`, + method: 'DELETE', + header: { 'Access-Token': `Bearer ${token}` }, + timeout: 8000 + }) + + if (response.statusCode === 200) { + uni.hideLoading() + uni.showToast({ title: '任务已删除', icon: 'success' }) + + // 返回上一页 + setTimeout(() => { + uni.navigateBack() + }, 1500) + } else { + throw new Error(response.data?.message || '删除任务失败') + } + } catch (e) { + uni.hideLoading() + uni.showToast({ title: e.message || '删除任务失败', icon: 'none' }) + } + } + } + }) + } + + // 跳转到消息中心(tabbar 页面,使用 switchTab) + const goToMessages = () => { + uni.switchTab({ + url: '/pages/message/index' + }) + } + + // 跳转到修改任务页面 + const goToEditTask = (taskId) => { + uni.navigateTo({ + url: `/pages/task/publish/index?taskId=${taskId}&mode=edit` + }) + } + + return { + // 响应式数据 + showCancelRequestModal, + cancelReason, + + // 方法 + openCancelRequestModal, + closeCancelRequestModal, + submitCancelRequest, + deleteTask, + goToMessages, + goToEditTask + } +} + diff --git a/pages/task/detail/composables/useTaskApplication.js b/pages/task/detail/composables/useTaskApplication.js new file mode 100644 index 00000000..e47a5d3d --- /dev/null +++ b/pages/task/detail/composables/useTaskApplication.js @@ -0,0 +1,234 @@ +/** + * 任务申请相关逻辑 Composable + * 处理任务申请、撤回申请等功能 + */ +import { ref, computed } from 'vue' +import { NETWORK_CONFIG } from '@/config/network.js' + +export function useTaskApplication(dependencies = {}) { + const { + task, + teamInfo, + fetchTaskDetail, + checkUserApplied, + parseJwtToken + } = dependencies + + // 响应式数据 + const challengeContent = ref('') + const teamRole = ref('leader') // 'leader' | 'member' + const challengeType = ref('team') // 现在只支持'team' + const applying = ref(false) + + // 计算属性 + const canSubmitApplication = computed(() => { + return challengeContent.value.trim().length > 0 + }) + + const formatCharacterCount = (count) => { + return `${count}/1000` + } + + // 申请任务 + const applyForTask = async () => { + if (!challengeContent.value.trim()) { + uni.showToast({ title: "请输入申请理由!", icon: 'none' }) + return + } + + applying.value = true + uni.showLoading({ title: '提交申请中...' }) + + try { + const token = uni.getStorageSync("accessToken") + if (!token) { + uni.showToast({ title: "请先登录", icon: 'none' }) + return + } + + // 构建请求数据 + const requestData = { + taskId: task.value?.taskId, + content: challengeContent.value.trim() + } + + // 如果是团队申请,添加teamId + if (teamInfo.value && teamInfo.value.teamId) { + requestData.teamId = teamInfo.value.teamId + } + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/task/apply`, + method: 'POST', + data: requestData, + header: { + 'Content-Type': 'application/json', + 'Access-Token': `Bearer ${token}`, + }, + }) + + if (response.statusCode === 200) { + uni.hideLoading() + uni.showToast({ + title: response.data.message || "申请成功!", + icon: 'success' + }) + + // 申请成功后刷新页面 + if (fetchTaskDetail && task.value?.taskId) { + await fetchTaskDetail(task.value.taskId) + } + if (checkUserApplied) { + await checkUserApplied() + } + } else { + throw new Error(response.data?.message || `申请失败,状态码: ${response.statusCode}`) + } + } catch (err) { + uni.hideLoading() + uni.showToast({ + title: err.message || "申请失败,请稍后重试!", + icon: 'none', + duration: 3000 + }) + } finally { + applying.value = false + } + } + + // 撤回申请 + const cancelTaskApply = async () => { + try { + uni.showModal({ + title: '确认撤回', + content: '确定要撤回任务申请吗?', + success: async (res) => { + if (res.confirm) { + uni.showLoading({ title: '撤回中...' }) + + try { + const token = uni.getStorageSync('accessToken') + if (!token) { + uni.showToast({ title: '请先登录', icon: 'none' }) + return + } + + const taskId = task.value?.taskId + if (!taskId) { + uni.showToast({ title: '任务ID缺失', icon: 'none' }) + return + } + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/task/cancel-apply`, + method: 'POST', + data: { taskId }, + header: { + 'Access-Token': `Bearer ${token}`, + 'Content-Type': 'application/json' + } + }) + + if (response.statusCode === 200 && response.data?.success) { + uni.showToast({ title: '已撤回申请', icon: 'success' }) + + // 刷新任务数据 + if (fetchTaskDetail) { + await fetchTaskDetail(taskId) + } + if (checkUserApplied) { + await checkUserApplied() + } + } else { + throw new Error(response.data?.message || '撤回失败') + } + } catch (err) { + uni.showToast({ + title: err.message || '撤回失败,请重试', + icon: 'none' + }) + } finally { + uni.hideLoading() + } + } + } + }) + } catch (err) { + console.error('撤回申请失败:', err) + } + } + + // 选择团队角色 + const selectTeamRole = (role) => { + teamRole.value = role + } + + // 清空申请内容 + const clearApplication = () => { + challengeContent.value = '' + } + + // 处理团队申请(包含团队信息验证) + const handleTeamApplication = async () => { + if (!teamInfo.value) { + uni.showToast({ title: '团队信息不存在,请重新勾选组队申请', icon: 'none' }) + return + } + try { + await applyForTask() + } catch (error) { + if (NETWORK_CONFIG.DEBUG) { + console.error('组队申请失败:', error) + } + uni.showToast({ title: '组队申请失败', icon: 'none' }) + } + } + + // 处理单人申请(兼容旧代码) + const handleSingleApplication = async () => { + if (!challengeContent.value.trim()) { + uni.showToast({ title: '请填写挑战内容', icon: 'none' }) + return + } + try { + await applyForTask() + } catch (error) { + if (NETWORK_CONFIG.DEBUG) { + console.error('单人申请失败:', error) + } + uni.showToast({ title: '申请失败,请重试', icon: 'none' }) + } + } + + // 统一处理申请(根据 challengeType 自动选择) + const handleApplication = async () => { + // 根据 challengeType 决定使用哪种申请方式 + if (challengeType.value === 'team') { + await handleTeamApplication() + } else { + await handleSingleApplication() + } + } + + return { + // 响应式数据 + challengeContent, + teamRole, + challengeType, + applying, + + // 计算属性 + canSubmitApplication, + + // 方法 + applyForTask, + cancelTaskApply, + selectTeamRole, + formatCharacterCount, + clearApplication, + handleTeamApplication, + handleSingleApplication, + handleApplication + } +} + diff --git a/pages/task/detail/composables/useTaskCompletion.js b/pages/task/detail/composables/useTaskCompletion.js new file mode 100644 index 00000000..b5246252 --- /dev/null +++ b/pages/task/detail/composables/useTaskCompletion.js @@ -0,0 +1,431 @@ +/** + * 任务完成申请相关逻辑 Composable + * 处理申请完成、查看完成详情等功能 + */ +import { ref, computed } from 'vue' +import { NETWORK_CONFIG } from '@/config/network.js' + +export function useTaskCompletion(dependencies = {}) { + const { + task, + taskData, + fetchUsersInfo, + allBadgesValid + } = dependencies + + // 响应式数据 + const completeProof = ref('') + const showCompletePreview = ref(false) + const previewLoading = ref(false) + const previewError = ref('') + const completePreview = ref(null) + const hasAppliedCompletion = ref(false) + + // 计算属性 + const canSubmitComplete = computed(() => { + return !!completeProof.value && (allBadgesValid?.value ?? true) + }) + + // 格式化字符数 + const formatCharacterCount = (count) => { + return `${count}/500` + } + + // 跳转到申请完成区域 + const goToApplyComplete = (scrollIntoView) => { + if (!scrollIntoView || scrollIntoView.value === undefined) { + return + } + + // 延迟设置 scrollIntoView,确保 DOM 已渲染 + setTimeout(() => { + if (scrollIntoView && scrollIntoView.value !== undefined) { + scrollIntoView.value = 'apply-complete-anchor' + // 滚动后清空,避免重复触发和 DOM 访问错误 + setTimeout(() => { + if (scrollIntoView && scrollIntoView.value !== undefined) { + scrollIntoView.value = '' + } + }, 300) + } + }, 100) + } + + // 获取申请完成详情预览 + const fetchApplyCompletePreview = async () => { + previewError.value = '' + previewLoading.value = true + completePreview.value = null + + try { + const token = uni.getStorageSync('accessToken') + if (!token) throw new Error('请先登录') + + const taskIdVal = taskData.value?.taskId || task.value?.taskId + if (!taskIdVal) throw new Error('任务 ID 缺失') + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/message/applycomplete/detail?taskId=${taskIdVal}`, + method: 'GET', + header: { 'Access-Token': `Bearer ${token}` }, + timeout: 8000 + }) + + if (response.statusCode === 200 && response.data) { + const data = response.data + + // 获取所有贡献者的UID + const contributorUids = [] + if (Array.isArray(data.badges)) { + data.badges.forEach(badge => { + if (Array.isArray(badge.contributors)) { + badge.contributors.forEach(contributor => { + if (contributor.uid) { + contributorUids.push(contributor.uid) + } + }) + } + }) + } + + // 批量获取用户信息 + if (contributorUids.length > 0 && fetchUsersInfo) { + await fetchUsersInfo(contributorUids) + } + + // 兼容字段:proof、badges、messageId + completePreview.value = { + proof: data.proof || data.reason || data.description || '', + badges: Array.isArray(data.badges) ? data.badges : [], + messageId: data.messageId, + taskId: data.taskId, + createTime: data.createTime, + status: data.status + } + } else { + throw new Error('未获取到申请完成详情') + } + } catch (e) { + previewError.value = e.message || '加载失败' + } finally { + previewLoading.value = false + } + } + + // 查看申请完成详情 + const viewApplyCompleteInfo = async () => { + showCompletePreview.value = true + await fetchApplyCompletePreview() + } + + // 关闭完成预览 + const closeCompletePreview = () => { + showCompletePreview.value = false + } + + // 提交完成申请(需要在外部实现,因为依赖较多) + const submitComplete = async (badgeContributors, taskIdVal) => { + if (!completeProof.value) { + uni.showToast({ title: '请输入完成证明', icon: 'none' }) + return + } + + if (!allBadgesValid?.value) { + uni.showToast({ title: '请正确分配所有徽章的贡献者', icon: 'none' }) + return + } + + uni.showLoading({ title: '提交中...' }) + + try { + const token = uni.getStorageSync('accessToken') + if (!token) throw new Error('请先登录') + + if (!taskIdVal) { + taskIdVal = taskData.value?.taskId || task.value?.taskId + } + if (!taskIdVal) throw new Error('任务 ID 缺失') + + // 构建请求数据 + const requestData = { + taskId: taskIdVal, + proof: completeProof.value, + badges: [] + } + + // 添加徽章数据 + if (badgeContributors) { + Object.keys(badgeContributors).forEach(badgeId => { + const contributors = badgeContributors[badgeId] + if (Array.isArray(contributors) && contributors.length > 0) { + requestData.badges.push({ + badgeId: badgeId, + contributors: contributors.map(c => ({ + uid: c.uid, + role: c.role, + percentage: c.percentage + })) + }) + } + }) + } + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/task/applycomplete`, + method: 'POST', + data: requestData, + header: { + 'Access-Token': `Bearer ${token}`, + 'Content-Type': 'application/json' + }, + timeout: 8000 + }) + + if (response.statusCode === 200 && response.data?.success) { + uni.hideLoading() + uni.showToast({ title: '完成申请已提交', icon: 'success' }) + completeProof.value = '' + showCompletePreview.value = false + return true + } else { + throw new Error(response.data?.message || '提交失败') + } + } catch (e) { + uni.hideLoading() + uni.showToast({ title: e.message || '提交失败,请重试', icon: 'none' }) + return false + } + } + + // 处理驳回申请完成 + const handleRejectCompletion = (dependencies = {}) => { + const { fetchTaskDetail, closeCompletePreview, taskId } = dependencies + + uni.showModal({ + title: '驳回申请', + content: '确定要驳回这个完成申请吗?', + success: async (res) => { + if (res.confirm) { + try { + const token = uni.getStorageSync('accessToken') + if (!token) { + uni.showToast({ title: '请先登录', icon: 'none' }) + return + } + + const requestData = `approve=false&proof=${encodeURIComponent(completePreview.value?.proof || '')}&id=${completePreview.value?.messageId}` + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/message/handle-task-completion`, + method: 'POST', + header: { + 'Access-Token': `Bearer ${token}`, + 'Content-Type': 'application/x-www-form-urlencoded' + }, + data: requestData + }) + + if (response.statusCode === 200) { + uni.showToast({ title: '已驳回申请', icon: 'success' }) + if (closeCompletePreview) { + closeCompletePreview() + } + // 刷新任务数据 + if (fetchTaskDetail && taskId) { + await fetchTaskDetail(taskId) + } + } else { + uni.showToast({ title: '驳回失败', icon: 'error' }) + } + } catch (error) { + console.error('驳回申请失败:', error) + uni.showToast({ title: '驳回失败', icon: 'error' }) + } + } + } + }) + } + + // 处理同意申请完成 + const handleApproveCompletion = (dependencies = {}) => { + const { userStore, fetchTaskDetail, closeCompletePreview, taskId } = dependencies + + uni.showModal({ + title: '同意申请', + content: '确定要同意这个完成申请吗?', + success: async (res) => { + if (res.confirm) { + try { + // 从 userStore 获取 token + const token = userStore?.token || uni.getStorageSync('accessToken') + if (!token) { + uni.showToast({ title: '请先登录', icon: 'none' }) + return + } + + const requestData = `approve=true&proof=${encodeURIComponent(completePreview.value?.proof || '')}&id=${completePreview.value?.messageId}` + + let response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/message/handle-task-completion`, + method: 'POST', + header: { + 'Access-Token': `Bearer ${token}`, + 'Content-Type': 'application/x-www-form-urlencoded' + }, + data: requestData + }) + + // 如果返回401,提示用户重新登录 + if (response.statusCode === 401) { + console.log('收到401响应,token已过期') + uni.showToast({ title: '登录已过期,请重新登录', icon: 'none' }) + // 清除用户状态并跳转到登录页面 + if (userStore?.clearUserState) { + userStore.clearUserState() + } + uni.reLaunch({ + url: '/pages/auth/login/index' + }) + return + } + + if (response.statusCode === 200) { + uni.showToast({ title: '已同意申请', icon: 'success' }) + if (closeCompletePreview) { + closeCompletePreview() + } + // 刷新任务数据 + if (fetchTaskDetail && taskId) { + await fetchTaskDetail(taskId) + } + } else { + uni.showToast({ title: '同意失败', icon: 'error' }) + } + } catch (error) { + console.error('同意申请失败:', error) + uni.showToast({ title: '同意失败', icon: 'error' }) + } + } + } + }) + } + + // 撤回完成申请(通过任务ID) + const cancelCompletionByTask = async (dependencies = {}) => { + const { taskData, task, hasAppliedCompletion, checkPendingMessages } = dependencies + + return new Promise((resolve) => { + uni.showModal({ + title: '撤回完成申请', + content: '确认撤回已提交的完成申请吗?', + success: async (res) => { + if (!res.confirm) { + resolve(false) + return + } + + try { + const token = uni.getStorageSync('accessToken') + if (!token) { + throw new Error('请先登录') + } + + const taskIdVal = taskData?.value?.taskId || task?.value?.taskId + if (!taskIdVal) { + throw new Error('任务 ID 缺失') + } + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/message/cancel-task-completion-by-task?taskId=${taskIdVal}`, + method: 'POST', + header: { 'Access-Token': `Bearer ${token}` } + }) + + if (response.statusCode === 200) { + uni.showToast({ title: '已撤回完成申请', icon: 'success' }) + if (hasAppliedCompletion) { + hasAppliedCompletion.value = false + } + if (checkPendingMessages) { + await checkPendingMessages() + } + resolve(true) + } else if (response.statusCode === 404) { + // 回退:查找消息ID并按ID撤回 + try { + const respId = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/message/completion-apply/message-id?taskId=${taskIdVal}`, + method: 'GET', + header: { 'Access-Token': `Bearer ${token}` } + }) + + if (respId.statusCode === 200 && respId.data && respId.data.messageId) { + const msgId = respId.data.messageId + const respCancel = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/message/cancel-task-completion?id=${msgId}`, + method: 'POST', + header: { 'Access-Token': `Bearer ${token}` } + }) + + if (respCancel.statusCode === 200) { + uni.showToast({ title: '已撤回完成申请', icon: 'success' }) + if (hasAppliedCompletion) { + hasAppliedCompletion.value = false + } + if (checkPendingMessages) { + await checkPendingMessages() + } + resolve(true) + } else { + throw new Error(respCancel.data?.message || '撤回失败') + } + } else { + throw new Error(respId.data?.message || '未找到申请消息') + } + } catch (fallbackError) { + if (NETWORK_CONFIG.DEBUG) { + console.error('回退撤回失败:', fallbackError) + } + uni.showToast({ title: fallbackError.message || '撤回失败', icon: 'none' }) + resolve(false) + } + } else { + throw new Error(response.data?.message || '撤回失败') + } + } catch (e) { + if (NETWORK_CONFIG.DEBUG) { + console.error('撤回完成申请失败:', e) + } + uni.showToast({ title: e.message || '撤回失败', icon: 'none' }) + resolve(false) + } + } + }) + }) + } + + return { + // 响应式数据 + completeProof, + showCompletePreview, + previewLoading, + previewError, + completePreview, + hasAppliedCompletion, + + // 计算属性 + canSubmitComplete, + + // 方法 + formatCharacterCount, + goToApplyComplete, + fetchApplyCompletePreview, + viewApplyCompleteInfo, + closeCompletePreview, + submitComplete, + handleRejectCompletion, + handleApproveCompletion, + cancelCompletionByTask + } +} + diff --git a/pages/task/detail/composables/useTaskCompletionOperations.js b/pages/task/detail/composables/useTaskCompletionOperations.js new file mode 100644 index 00000000..b0c40b8d --- /dev/null +++ b/pages/task/detail/composables/useTaskCompletionOperations.js @@ -0,0 +1,83 @@ +/** + * 任务完成操作 Composable + * 整合任务完成相关的高级操作函数,包括验证和额外逻辑 + */ +import { NETWORK_CONFIG } from '@/config/network.js' + +export function useTaskCompletionOperations(dependencies = {}) { + const { + taskData, + task, + teamInfo, + taskCompletionComposable, + badgeContributors, + calculateTotalPercentage, + isTeamTask, + hasAppliedCompletion, + checkPendingMessages + } = dependencies + + /** + * 申请完成任务(包含验证逻辑) + */ + const applyCompleteTask = async () => { + // 验证每个铭牌的贡献比例总和是否为100% + let isValid = true + taskData.value?.badges.forEach(badge => { + if (calculateTotalPercentage(badge.id) !== 100) { + isValid = false + } + }) + if (!isValid) { + uni.showToast({ title: '每个铭牌的贡献比例总和必须为100%', icon: 'none' }) + return + } + + // 如果是团队任务,验证所有团队成员都在铭牌分配中 + if (isTeamTask() && teamInfo.value && teamInfo.value.members) { + const allMembersAssigned = new Set() + + taskData.value?.badges.forEach(badge => { + if (badgeContributors[badge.id]) { + badgeContributors[badge.id].forEach(contributor => { + if (contributor.uid && contributor.percentage > 0) { + allMembersAssigned.add(String(contributor.uid)) + } + }) + } + }) + + const unassignedMembers = teamInfo.value.members.filter(member => { + const memberId = String(member.userId) + return !allMembersAssigned.has(memberId) + }) + + if (unassignedMembers.length > 0) { + uni.showToast({ + title: `所有成员必须分配到铭牌。未分配成员数:${unassignedMembers.length}`, + icon: 'none', + duration: 3000 + }) + return + } + } + + // 使用 composable 的 submitComplete + const taskIdVal = taskData.value?.taskId || task.value?.taskId + const success = await taskCompletionComposable.submitComplete(badgeContributors, taskIdVal) + + if (success) { + if (hasAppliedCompletion && hasAppliedCompletion.value !== undefined) { + hasAppliedCompletion.value = true + } + if (checkPendingMessages) { + await checkPendingMessages() + } + } + } + + return { + applyCompleteTask + } +} + diff --git a/pages/task/detail/composables/useTaskDataTransform.js b/pages/task/detail/composables/useTaskDataTransform.js new file mode 100644 index 00000000..d77a083a --- /dev/null +++ b/pages/task/detail/composables/useTaskDataTransform.js @@ -0,0 +1,42 @@ +/** + * 任务数据转换 Composable + * 将原始的 task 数据转换为格式化后的 taskData + */ +import { computed } from 'vue' +import { getAvatarUrl } from '@/utils/imageUtils.js' + +export function useTaskDataTransform(dependencies = {}) { + const { task } = dependencies + + /** + * 转换任务数据为格式化后的格式 + */ + const taskData = computed(() => { + if (!task.value) return null + + return { + title: task.value.title || '', + userName: task.value.publisherName || task.value.userName || '未知用户', + orgName: task.value.orgName || '未知企业', + publishTime: task.value.publishTime || '', + deadline: task.value.deadline || '', + description: task.value.description || '', + reward: task.value.reward || 0, + currentPaid: task.value.currentPaid || 0, + status: task.value.status || '', + challengerId: task.value.challengerId || null, + teamId: task.value.teamId || null, + publisherId: task.value.publisherId || null, + userAvatar: getAvatarUrl(task.value.userAvatar), + longitude: task.value.longitude || 116.397128, + latitude: task.value.latitude || 39.916527, + badges: task.value.badges || [], + taskId: task.value.taskId || null + } + }) + + return { + taskData + } +} + diff --git a/pages/task/detail/composables/useTaskDetail.js b/pages/task/detail/composables/useTaskDetail.js new file mode 100644 index 00000000..4aa39aed --- /dev/null +++ b/pages/task/detail/composables/useTaskDetail.js @@ -0,0 +1,194 @@ +/** + * 任务详情数据获取 Composable + * 处理任务详情的获取、刷新和数据处理 + * + * 功能: + * 1. 获取任务详情数据 + * 2. 处理网络错误和加载状态 + * 3. 自动加载团队信息(如果任务有挑战者) + * 4. 初始化工作记录数据 + * 5. 提供刷新功能 + */ +import { ref } from 'vue' +import { NETWORK_CONFIG } from '@/config/network.js' + +export function useTaskDetail(dependencies = {}) { + const { + task, + workTimes, + loadTeamInfo, + taskIdRef + } = dependencies + + // 响应式状态 + const loading = ref(true) + const error = ref(null) + const refreshing = ref(false) + + /** + * 获取任务详情 + * @param {number|string} taskId - 任务ID + * @returns {Promise} + */ + const fetchTaskDetail = async (taskId) => { + if (!taskId) { + error.value = '任务ID缺失' + loading.value = false + return + } + + // 更新 taskIdRef(如果提供) + if (taskIdRef && typeof taskIdRef === 'object' && 'value' in taskIdRef) { + taskIdRef.value = taskId + } + + try { + loading.value = true + error.value = null + + // 检查网络连接 + const networkType = await uni.getNetworkType() + if (networkType.networkType === 'none') { + throw new Error('网络连接不可用,请检查网络设置') + } + + // 发送请求获取任务详情 + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/task/detail`, + method: 'GET', + data: { taskId }, + timeout: 10000 + }) + + if (response.statusCode === 200) { + let data = response.data + + // 后端可能返回字符串形式的JSON,做一次安全解析 + if (typeof data === 'string') { + try { + data = JSON.parse(data) + } catch (parseError) { + if (NETWORK_CONFIG.DEBUG) { + console.warn('解析任务详情JSON失败:', parseError) + } + } + } + + // 更新任务数据 + if (task && typeof task === 'object' && 'value' in task) { + task.value = data + } + + // 如果任务有挑战者且状态为进行中,加载团队信息 + if (data.challengerId && (data.status === 2 || data.status === '2')) { + // 优先使用teamId,如果没有则使用challengerId + const teamId = data.teamId || data.challengerId + if (loadTeamInfo && typeof loadTeamInfo === 'function') { + try { + await loadTeamInfo(teamId) + } catch (teamError) { + if (NETWORK_CONFIG.DEBUG) { + console.warn('加载团队信息失败:', teamError) + } + // 团队信息加载失败不影响任务详情显示 + } + } + } + + // 若详情内带有工作记录(TaskService.detail 已包含 workTimes),初始化它 + if (workTimes && typeof workTimes === 'object' && 'value' in workTimes) { + try { + const rawWorkTimes = data?.workTimes + if (rawWorkTimes) { + if (Array.isArray(rawWorkTimes)) { + workTimes.value = rawWorkTimes + } else if (typeof rawWorkTimes === 'string') { + const parsed = JSON.parse(rawWorkTimes) + if (Array.isArray(parsed)) { + workTimes.value = parsed + } + } + } + } catch (workTimesError) { + if (NETWORK_CONFIG.DEBUG) { + console.warn('解析工作记录失败:', workTimesError) + } + // 工作记录解析失败不影响任务详情显示 + } + } + } else { + throw new Error(`服务器响应错误: ${response.statusCode}`) + } + } catch (err) { + const errorMessage = err.message || '加载任务详情失败' + error.value = `加载任务详情失败: ${errorMessage}` + + if (NETWORK_CONFIG.DEBUG) { + console.error('加载任务详情失败:', err) + } + } finally { + loading.value = false + } + } + + /** + * 刷新任务详情 + * @param {number|string} taskId - 任务ID(可选,如果不提供则使用 taskIdRef) + * @returns {Promise} + */ + const onRefresh = async (taskId = null) => { + // 如果没有提供 taskId,尝试从 taskIdRef 获取 + const currentTaskId = taskId || (taskIdRef && typeof taskIdRef === 'object' && 'value' in taskIdRef ? taskIdRef.value : null) + + if (!currentTaskId) { + if (NETWORK_CONFIG.DEBUG) { + console.warn('刷新任务详情失败: 任务ID缺失') + } + uni.showToast({ title: '任务ID缺失', icon: 'none' }) + return + } + + refreshing.value = true + try { + await fetchTaskDetail(currentTaskId) + uni.showToast({ title: '刷新成功', icon: 'success', duration: 1500 }) + } catch (err) { + uni.showToast({ + title: '刷新失败: ' + (err.message || '未知错误'), + icon: 'none', + duration: 2000 + }) + } finally { + refreshing.value = false + } + } + + /** + * 重置加载状态(用于错误恢复) + */ + const resetLoading = () => { + loading.value = true + error.value = null + } + + /** + * 清除错误信息 + */ + const clearError = () => { + error.value = null + } + + return { + // 响应式状态 + loading, + error, + refreshing, + + // 方法 + fetchTaskDetail, + onRefresh, + resetLoading, + clearError + } +} + diff --git a/pages/task/detail/composables/useTaskDetailExports.js b/pages/task/detail/composables/useTaskDetailExports.js new file mode 100644 index 00000000..61e93848 --- /dev/null +++ b/pages/task/detail/composables/useTaskDetailExports.js @@ -0,0 +1,653 @@ +/** + * 任务详情页面 Exports Composable + * 整合所有需要导出到模板的状态和函数,简化 return 语句 + * + * 功能: + * 1. 从所有 composables 中提取需要的状态和函数 + * 2. 组织并返回所有需要在模板中使用的值 + * 3. 处理一些包装函数和计算逻辑 + */ +import { computed, ref } from 'vue' +import { getBadgeNameByAssociation } from "@/utils/skillUtils" +import { getAvatarUrl } from '@/utils/imageUtils.js' + +/** + * 创建默认的 exports 对象,确保所有属性都有值 + * 用于错误情况下的回退 + */ +function createDefaultExports(userStore) { + return { + // 基础状态 + task: ref(null), + loading: ref(false), + error: ref(null), + scrollIntoView: ref(''), + taskData: computed(() => null), + currentUserId: computed(() => null), + refreshing: ref(false), + + // 工具函数 + getStatusText: (status) => { + switch (status) { + case "0": return "审核中" + case "1": return "未完成" + case "2": return "进行中" + case "3": return "已完成" + default: return "未知状态" + } + }, + getBadgeNameByAssociation, + moveToTaskLocation: () => {}, + mapMarkers: computed(() => []), + getAvatarUrl: (url) => url || '/static/images/default-avatar.png', + handleError: (err, context) => { + console.error(`错误 [${context}]:`, err) + uni.showToast({ title: '操作失败,请稍后重试', icon: 'none', duration: 2000 }) + }, + + // taskId + taskId: computed(() => null), + + // 任务详情相关 + fetchTaskDetail: () => Promise.resolve(), + onRefresh: () => Promise.resolve(), + + // 任务申请相关 + applyForTask: () => {}, + challengeContent: ref(''), + teamRole: ref(''), + challengeType: ref(''), + cancelTaskApply: () => {}, + selectTeamRole: () => {}, + formatCharacterCount: (count) => `${count}/1000`, + handleTeamApplication: () => {}, + handleSingleApplication: () => {}, + handleApplication: () => {}, + + // 任务完成相关 + showApplyCompleteBtn: computed(() => false), + completeProof: ref(''), + canSubmitComplete: computed(() => false), + goToApplyComplete: () => {}, + showCompletePreview: ref(false), + previewLoading: ref(false), + previewError: ref(null), + completePreview: ref(null), + viewApplyCompleteInfo: () => {}, + closeCompletePreview: () => {}, + badgeContributions: {}, + applyCompleteTask: () => {}, + hasAppliedCompletion: computed(() => false), + cancelCompletionByTask: () => Promise.resolve(), + handleRejectCompletion: () => {}, + handleApproveCompletion: () => {}, + + // 徽章贡献者相关 + badgeContributors: {}, + addContributor: () => {}, + removeContributor: () => {}, + selectContributor: () => {}, + clearContributor: () => {}, + getTeamMembersForBadge: () => [], + calculateTotalPercentage: () => 0, + validateTotalPercentage: () => {}, + debouncedValidateTotalPercentage: () => {}, + allBadgesValid: computed(() => false), + + // 权限和状态判断 + isPublisherAndInProgress: computed(() => false), + showTaskActions: computed(() => false), + canCancelApply: computed(() => false), + canRequestCancel: computed(() => false), + canDeleteTask: computed(() => false), + canEditTask: computed(() => false), + isTaskPublisher: computed(() => false), + canShowTeamMode: computed(() => false), + canShowTeamInfo: computed(() => false), + canShowBadgeAllocation: computed(() => false), + canEditBadgeAllocation: computed(() => false), + showWorkControls: computed(() => false), + hasOngoingWork: computed(() => false), + + // 任务状态相关 + hasPendingMessages: computed(() => false), + pendingMessageTypes: computed(() => []), + hasUserApplied: computed(() => false), + checkPendingMessages: () => {}, + checkUserApplied: () => {}, + + // 任务操作相关 + showCancelRequestModal: ref(false), + cancelReason: ref(''), + openCancelRequestModal: () => {}, + closeCancelRequestModal: () => {}, + submitCancelRequest: () => {}, + deleteTask: () => {}, + goToMessages: () => {}, + goToEditTask: () => {}, + + // 任务编辑相关 + showEditTaskModal: ref(false), + editTaskForm: ref({}), + taskEditInfo: ref(null), + openEditTaskModal: () => {}, + closeEditTaskModal: () => {}, + submitEditTask: () => {}, + canSubmitEdit: computed(() => false), + + // 用户信息相关 + getUserAvatar: () => '', + getSafeUserAvatar: () => '', + getUserName: () => '', + handleAvatarError: () => {}, + handleTaskAvatarError: () => {}, + getUserInfo: () => null, + getUserNickname: () => '', + + // 组队相关 + showTeamInvitationModal: ref(false), + teamInfo: ref(null), + openTeamInvitationModal: () => {}, + closeTeamInvitationModal: () => {}, + handleTeamInvitationConfirm: () => {}, + loadTeamInfo: () => {}, + updateTeamName: () => {}, + handleUpdateTeamName: () => {}, + teamMode: ref(false), + teamName: ref(''), + editingTeamName: ref(''), + userInfoCache: {}, + canShowTeamMode: computed(() => false), + canShowBadgeAllocation: computed(() => false), + searchKeyword: ref(''), + searchResults: ref([]), + searchLoading: ref(false), + searchError: ref(null), + invitedUsers: ref([]), + toggleTeamMode: () => {}, + checkExistingTeam: () => Promise.resolve(), + showContactLeaderModal: ref(false), + selectChallengeType: () => {}, + getTeamStatusText: () => '', + formatTime: () => '', + searchFriends: () => {}, + inviteSingleUser: () => {}, + markUserAsInvited: () => {}, + isUserInvited: () => false, + saveTeamName: () => {}, + isTeamLeader: computed(() => false), + removeTeamMember: () => {}, + leaveTeam: () => {}, + dissolveTeam: () => {}, + recreateTeamFromDissolved: () => {}, + initiateRemoveMemberVote: () => {}, + transferLeadership: () => {}, + initiateImpeachLeaderVote: () => {}, + voteOnProposal: () => {}, + withdrawVote: () => {}, + withdrawLoading: ref(false), + + // 投票相关 + activeTeamVotes: ref([]), + voteHistory: ref([]), + voteLoading: ref(false), + selectedCandidateId: ref(null), + submitVote: () => {}, + submitCandidateVote: () => {}, + selectCandidate: () => {}, + withdrawVoteFromTask: () => {}, + loadTeamVotes: () => {}, + loadVoteHistory: () => {}, + getVoteTitle: () => '', + getVoteTypeText: () => '', + getVoteRuleText: () => '', + getVoteChoiceText: () => '', + getVoteStatusText: () => '', + getVoteChoiceDetailText: () => '', + formatCountdown: () => '', + + // 任务类型显示 + getTaskTypeText: () => '团队任务', + getChallengeTypeText: () => '个人挑战', + isTeamTask() { + return false + }, + + // 工作记录相关 + workTimes: ref([]), + workLoading: ref(false), + workError: ref(null), + startWorking: ref(false), + endWorking: ref(false), + startWork: () => {}, + endWork: () => {}, + + // 格式化工具函数 + formatNumber: (num) => { + if (num === null || num === undefined) return '0' + return String(Number(num) || 0) + }, + formatPercentage: (num) => { + if (num === null || num === undefined) return '0' + return String(Number(num) || 0) + }, + formatDateTime: (date) => { + if (!date) return '' + return String(date) + }, + + // WebSocket 消息处理 + handleTaskCancelApproved: async () => {}, + handleTeamMemberChange: () => {}, + handleTeamInvitationMessage: () => {}, + handleTeamMemberJoined: () => {}, + handleTeamMemberLeft: () => {}, + handleTeamMemberRemoved: () => {}, + handleTeamVoteInitiated: () => {}, + handleTeamVoteResult: () => {}, + + // Store + userStore + } +} + +/** + * 任务详情页面 Exports Composable + * @param {Object} setupResult - useTaskDetailSetup 返回的结果 + * @param {Object} userStore - 用户 store + * @param {Function} getTaskId - 获取 taskId 的函数 + * @returns {Object} 包含所有需要在模板中使用的状态和函数 + */ +export function useTaskDetailExports(setupResult, userStore, getTaskId) { + // 安全检查:确保 setupResult 和 composables 存在 + if (!setupResult) { + console.error('useTaskDetailExports: setupResult 未定义') + // 返回一个包含所有必需属性的空对象,避免页面空白 + return createDefaultExports(userStore) + } + + if (!setupResult.composables) { + console.error('useTaskDetailExports: composables 未定义,setupResult:', setupResult) + // 返回一个包含所有必需属性的空对象,避免页面空白 + return createDefaultExports(userStore) + } + + const { + task, + taskIdRef, + scrollIntoView, + teamName, + editingTeamName, + selectedCandidateId, + currentUserId, + taskData, + composables + } = setupResult + + // 确保所有必需的基础状态存在 + const safeTask = task || ref(null) + const safeTaskIdRef = taskIdRef || ref(null) + const safeScrollIntoView = scrollIntoView || ref('') + const safeTeamName = teamName || ref('') + const safeEditingTeamName = editingTeamName || ref('') + const safeSelectedCandidateId = selectedCandidateId || ref(null) + const safeCurrentUserId = currentUserId || computed(() => null) + // 确保 taskData 保持响应式,如果不存在则创建一个依赖于 safeTask 的 computed + const safeTaskData = taskData || computed(() => { + if (!safeTask.value) return null + return { + title: safeTask.value.title || '', + userName: safeTask.value.publisherName || safeTask.value.userName || '未知用户', + orgName: safeTask.value.orgName || '未知企业', + publishTime: safeTask.value.publishTime || '', + deadline: safeTask.value.deadline || '', + description: safeTask.value.description || '', + reward: safeTask.value.reward || 0, + currentPaid: safeTask.value.currentPaid || 0, + status: safeTask.value.status || '', + challengerId: safeTask.value.challengerId || null, + teamId: safeTask.value.teamId || null, + publisherId: safeTask.value.publisherId || null, + userAvatar: safeTask.value.userAvatar || '', + longitude: safeTask.value.longitude || 116.397128, + latitude: safeTask.value.latitude || 39.916527, + badges: safeTask.value.badges || [], + taskId: safeTask.value.taskId || null + } + }) + + const { + userInfoCache: userInfoCacheComposable = {}, + taskMap: taskMapComposable = {}, + taskUtils = {}, + formatUtils = {}, + voteHelpers = {}, + taskDetail: taskDetailComposable = {}, + taskStatus: taskStatusComposable = {}, + taskActions: taskActionsComposable = {}, + taskEdit: taskEditComposable = {}, + taskApplication: taskApplicationComposable = {}, + badgeContributors: badgeContributorsComposable = {}, + taskCompletion: taskCompletionComposable = {}, + taskCompletionOperations: taskCompletionOperationsComposable = {}, + teamManagement: teamManagementComposable = {}, + teamCreation: teamCreationComposable = {}, + teamOperations: teamOperationsComposable = {}, + friendSearch: friendSearchComposable = {}, + voteSystem: voteSystemComposable = {}, + voteOperations: voteOperationsComposable = {}, + workRecords: workRecordsComposable = {}, + workOperations: workOperationsComposable = {}, + taskPermissions: taskPermissionsComposable = {}, + taskHelpers: taskHelpersComposable = {}, + wsHandlers: wsHandlersComposable = {} + } = composables + + // 获取当前 taskId + const getCurrentTaskId = () => { + const taskId = getTaskId ? getTaskId() : null + return taskId || safeTaskIdRef.value + } + + // 任务完成操作相关(包装函数) + const handleRejectCompletion = () => { + const taskIdVal = getCurrentTaskId() + taskCompletionComposable.handleRejectCompletion({ + fetchTaskDetail: (id) => taskDetailComposable.fetchTaskDetail(id || taskIdVal), + closeCompletePreview: taskCompletionComposable.closeCompletePreview, + taskId: taskIdVal + }) + } + + const handleApproveCompletion = () => { + const taskIdVal = getCurrentTaskId() + taskCompletionComposable.handleApproveCompletion({ + userStore, + fetchTaskDetail: (id) => taskDetailComposable.fetchTaskDetail(id || taskIdVal), + closeCompletePreview: taskCompletionComposable.closeCompletePreview, + taskId: taskIdVal + }) + } + + const cancelCompletionByTask = () => { + if (!taskCompletionComposable.cancelCompletionByTask) { + return Promise.resolve() + } + return taskCompletionComposable.cancelCompletionByTask({ + taskData: computed(() => safeTaskData.value), + task: safeTask, + hasAppliedCompletion: taskCompletionComposable.hasAppliedCompletion, + checkPendingMessages: () => taskStatusComposable.checkPendingMessages?.() || (() => {}) + }) + } + + // WebSocket 消息处理(包装函数) + const handleTaskCancelApproved = async (eventData) => { + if (!wsHandlersComposable.handleTaskCancelApproved) return + await wsHandlersComposable.handleTaskCancelApproved( + eventData, + (taskId) => (taskDetailComposable.fetchTaskDetail || (() => Promise.resolve()))(taskId), + () => (taskStatusComposable.checkUserApplied || (() => {}))(), + () => (taskStatusComposable.checkPendingMessages || (() => {}))() + ) + } + + // 返回所有需要在模板中使用的状态和函数 + // 确保函数存在,如果不存在则提供默认实现 + const safeGetAvatarUrl = getAvatarUrl || ((url) => url || '/static/images/default-avatar.png') + const safeGetStatusText = taskUtils.getStatusText || ((status) => { + switch (status) { + case "0": return "审核中" + case "1": return "未完成" + case "2": return "进行中" + case "3": return "已完成" + default: return "未知状态" + } + }) + + // 获取 taskId(优先使用 taskData,然后是 task,最后是 taskIdRef) + const currentTaskId = computed(() => { + if (safeTaskData.value && safeTaskData.value.taskId) { + return safeTaskData.value.taskId + } + if (safeTask.value && safeTask.value.taskId) { + return safeTask.value.taskId + } + if (safeTaskIdRef && safeTaskIdRef.value) { + return safeTaskIdRef.value + } + return getCurrentTaskId() + }) + + return { + // 基础状态 + task: safeTask, + loading: taskDetailComposable.loading || ref(false), + error: taskDetailComposable.error || ref(null), + scrollIntoView: safeScrollIntoView, + taskData: safeTaskData, + currentUserId: safeCurrentUserId, + refreshing: taskDetailComposable.refreshing || ref(false), + + // 工具函数(使用安全的函数包装) + getStatusText: safeGetStatusText, + getBadgeNameByAssociation, + moveToTaskLocation: taskMapComposable.moveToTaskLocation || (() => {}), + mapMarkers: taskMapComposable.mapMarkers || computed(() => []), + getAvatarUrl: safeGetAvatarUrl, + handleError: taskUtils.handleError || ((err, context) => { + console.error(`错误 [${context}]:`, err) + uni.showToast({ title: '操作失败,请稍后重试', icon: 'none', duration: 2000 }) + }), + + // taskId(计算属性,确保始终有值) + taskId: currentTaskId, + + // 任务详情相关 + fetchTaskDetail: (taskId) => (taskDetailComposable.fetchTaskDetail || (() => Promise.resolve()))(taskId), + onRefresh: () => (taskDetailComposable.onRefresh || (() => Promise.resolve()))(getCurrentTaskId()), + + // 任务申请相关 + applyForTask: taskApplicationComposable.applyForTask || (() => {}), + challengeContent: taskApplicationComposable.challengeContent || ref(''), + teamRole: taskApplicationComposable.teamRole || ref(''), + challengeType: taskApplicationComposable.challengeType || ref(''), + cancelTaskApply: taskApplicationComposable.cancelTaskApply || (() => {}), + selectTeamRole: taskApplicationComposable.selectTeamRole || (() => {}), + formatCharacterCount: taskApplicationComposable.formatCharacterCount || ((count) => `${count}/1000`), + handleTeamApplication: taskApplicationComposable.handleTeamApplication || (() => {}), + handleSingleApplication: taskApplicationComposable.handleSingleApplication || (() => {}), + handleApplication: taskApplicationComposable.handleApplication || (() => {}), + + // 任务完成相关 + showApplyCompleteBtn: taskPermissionsComposable.showApplyCompleteBtn || computed(() => false), + completeProof: taskCompletionComposable.completeProof || ref(''), + canSubmitComplete: taskCompletionComposable.canSubmitComplete || computed(() => false), + goToApplyComplete: taskHelpersComposable.goToApplyComplete || (() => {}), + showCompletePreview: taskCompletionComposable.showCompletePreview || ref(false), + previewLoading: taskCompletionComposable.previewLoading || ref(false), + previewError: taskCompletionComposable.previewError || ref(null), + completePreview: taskCompletionComposable.completePreview || ref(null), + viewApplyCompleteInfo: taskCompletionComposable.viewApplyCompleteInfo || (() => {}), + closeCompletePreview: taskCompletionComposable.closeCompletePreview || (() => {}), + badgeContributions: badgeContributorsComposable.badgeContributions || {}, + applyCompleteTask: taskCompletionOperationsComposable.applyCompleteTask || (() => {}), + hasAppliedCompletion: taskCompletionComposable.hasAppliedCompletion || computed(() => false), + cancelCompletionByTask, + handleRejectCompletion, + handleApproveCompletion, + + // 徽章贡献者相关 + badgeContributors: badgeContributorsComposable.badgeContributors || {}, + addContributor: badgeContributorsComposable.addContributor || (() => {}), + removeContributor: badgeContributorsComposable.removeContributor || (() => {}), + selectContributor: badgeContributorsComposable.selectContributor || (() => {}), + clearContributor: badgeContributorsComposable.clearContributor || (() => {}), + getTeamMembersForBadge: badgeContributorsComposable.getTeamMembersForBadge || (() => []), + calculateTotalPercentage: badgeContributorsComposable.calculateTotalPercentage || (() => 0), + validateTotalPercentage: badgeContributorsComposable.validateTotalPercentage || (() => {}), + debouncedValidateTotalPercentage: taskHelpersComposable.debouncedValidateTotalPercentage || (() => {}), + allBadgesValid: badgeContributorsComposable.allBadgesValid || computed(() => false), + + // 权限和状态判断 + isPublisherAndInProgress: taskPermissionsComposable.isPublisherAndInProgress || computed(() => false), + showTaskActions: taskPermissionsComposable.showTaskActions || computed(() => false), + canCancelApply: taskPermissionsComposable.canCancelApply || computed(() => false), + canRequestCancel: taskPermissionsComposable.canRequestCancel || computed(() => false), + canDeleteTask: taskPermissionsComposable.canDeleteTask || computed(() => false), + canEditTask: taskPermissionsComposable.canEditTask || computed(() => false), + isTaskPublisher: taskPermissionsComposable.isTaskPublisher || computed(() => false), + canShowTeamMode: taskPermissionsComposable.canShowTeamMode || computed(() => false), + canShowTeamInfo: taskPermissionsComposable.canShowTeamInfo || computed(() => false), + canShowBadgeAllocation: taskPermissionsComposable.canShowBadgeAllocation || computed(() => false), + canEditBadgeAllocation: taskPermissionsComposable.canEditBadgeAllocation || computed(() => false), + showWorkControls: taskPermissionsComposable.showWorkControls || computed(() => false), + hasOngoingWork: taskPermissionsComposable.hasOngoingWork || computed(() => false), + + // 任务状态相关 + hasPendingMessages: taskStatusComposable.hasPendingMessages || computed(() => false), + pendingMessageTypes: taskStatusComposable.pendingMessageTypes || computed(() => []), + hasUserApplied: taskStatusComposable.hasUserApplied || computed(() => false), + checkPendingMessages: taskStatusComposable.checkPendingMessages || (() => {}), + checkUserApplied: taskStatusComposable.checkUserApplied || (() => {}), + + // 任务操作相关 + showCancelRequestModal: taskActionsComposable.showCancelRequestModal || ref(false), + cancelReason: taskActionsComposable.cancelReason || ref(''), + openCancelRequestModal: taskActionsComposable.openCancelRequestModal || (() => {}), + closeCancelRequestModal: taskActionsComposable.closeCancelRequestModal || (() => {}), + submitCancelRequest: taskActionsComposable.submitCancelRequest || (() => {}), + deleteTask: taskActionsComposable.deleteTask || (() => {}), + goToMessages: taskActionsComposable.goToMessages || (() => {}), + goToEditTask: () => (taskActionsComposable.goToEditTask || (() => {}))(getCurrentTaskId()), + + // 任务编辑相关 + showEditTaskModal: taskEditComposable.showEditTaskModal || ref(false), + editTaskForm: taskEditComposable.editTaskForm || ref({}), + taskEditInfo: taskEditComposable.taskEditInfo || ref(null), + openEditTaskModal: taskEditComposable.openEditTaskModal || (() => {}), + closeEditTaskModal: taskEditComposable.closeEditTaskModal || (() => {}), + submitEditTask: taskEditComposable.submitEditTask || (() => {}), + canSubmitEdit: taskEditComposable.canSubmitEdit || computed(() => false), + + // 用户信息相关 + getUserAvatar: userInfoCacheComposable.getUserAvatar || (() => ''), + getSafeUserAvatar: userInfoCacheComposable.getSafeUserAvatar || (() => ''), + getUserName: userInfoCacheComposable.getUserName || (() => ''), + handleAvatarError: taskUtils.handleAvatarError || (() => {}), + handleTaskAvatarError: taskUtils.handleTaskAvatarError || (() => {}), + getUserInfo: userInfoCacheComposable.getUserInfo || (() => null), + getUserNickname: userInfoCacheComposable.getUserNickname || (() => ''), + + // 组队相关 + showTeamInvitationModal: teamManagementComposable.showTeamInvitationModal || ref(false), + teamInfo: teamManagementComposable.teamInfo || ref(null), + openTeamInvitationModal: teamOperationsComposable.openTeamInvitationModal || (() => {}), + closeTeamInvitationModal: teamManagementComposable.closeInvitationModal || (() => {}), + handleTeamInvitationConfirm: teamOperationsComposable.handleTeamInvitationConfirm || (() => {}), + loadTeamInfo: teamOperationsComposable.loadTeamInfoWithExtra || (() => {}), + updateTeamName: teamManagementComposable.updateTeamName || (() => {}), + handleUpdateTeamName: teamOperationsComposable.handleUpdateTeamName || (() => {}), + teamMode: teamManagementComposable.teamMode || ref(false), + teamName: safeTeamName, + editingTeamName: safeEditingTeamName, + userInfoCache: userInfoCacheComposable.userInfoCache || {}, + canShowTeamMode: taskPermissionsComposable.canShowTeamMode || computed(() => false), + canShowBadgeAllocation: taskPermissionsComposable.canShowBadgeAllocation || computed(() => false), + searchKeyword: friendSearchComposable.searchKeyword || ref(''), + searchResults: friendSearchComposable.searchResults || ref([]), + searchLoading: friendSearchComposable.searchLoading || ref(false), + searchError: friendSearchComposable.searchError || ref(null), + invitedUsers: friendSearchComposable.invitedUsers || ref([]), + toggleTeamMode: teamCreationComposable.toggleTeamMode || (() => {}), + checkExistingTeam: () => (teamOperationsComposable.checkExistingTeamWithExtra || (() => Promise.resolve()))(), + showContactLeaderModal: teamOperationsComposable.showContactLeaderModal || ref(false), + selectChallengeType: teamCreationComposable.selectChallengeType || (() => {}), + getTeamStatusText: teamManagementComposable.getTeamStatusText || (() => ''), + formatTime: formatUtils.formatTime || (() => ''), + searchFriends: friendSearchComposable.searchFriends || (() => {}), + inviteSingleUser: friendSearchComposable.inviteSingleUser || (() => {}), + markUserAsInvited: friendSearchComposable.markUserAsInvited || (() => {}), + isUserInvited: friendSearchComposable.isUserInvited || (() => false), + saveTeamName: () => (teamManagementComposable.saveTeamName || (() => {}))(safeEditingTeamName.value), + isTeamLeader: teamManagementComposable.isTeamLeader || computed(() => false), + removeTeamMember: teamManagementComposable.removeTeamMember || (() => {}), + leaveTeam: teamOperationsComposable.leaveTeamWithExtra || (() => {}), + dissolveTeam: teamOperationsComposable.dissolveTeamWithExtra || (() => {}), + recreateTeamFromDissolved: teamOperationsComposable.recreateTeamFromDissolved || (() => {}), + initiateRemoveMemberVote: voteOperationsComposable.initiateRemoveMemberVote || (() => {}), + transferLeadership: teamManagementComposable.transferLeadership || (() => {}), + initiateImpeachLeaderVote: voteOperationsComposable.initiateImpeachLeaderVote || (() => {}), + voteOnProposal: voteOperationsComposable.voteOnProposal || (() => {}), + withdrawVote: voteOperationsComposable.withdrawVote || (() => {}), + withdrawLoading: voteSystemComposable.withdrawLoading || ref(false), + + // 投票相关 + activeTeamVotes: voteSystemComposable.activeTeamVotes || ref([]), + voteHistory: voteSystemComposable.voteHistory || ref([]), + voteLoading: voteSystemComposable.voteLoadingLocal || ref(false), + selectedCandidateId: safeSelectedCandidateId, + submitVote: voteOperationsComposable.submitVote || (() => {}), + submitCandidateVote: voteOperationsComposable.submitCandidateVote || (() => {}), + selectCandidate: voteOperationsComposable.selectCandidate || (() => {}), + withdrawVoteFromTask: voteOperationsComposable.withdrawVoteFromTask || (() => {}), + loadTeamVotes: voteSystemComposable.loadTeamVotes || (() => {}), + loadVoteHistory: voteSystemComposable.loadVoteHistory || (() => {}), + getVoteTitle: voteHelpers.getVoteTitle || (() => ''), + getVoteTypeText: voteSystemComposable.getVoteTypeText || (() => ''), + getVoteRuleText: voteHelpers.getVoteRuleText || (() => ''), + getVoteChoiceText: voteHelpers.getVoteChoiceText || (() => ''), + getVoteStatusText: voteSystemComposable.getVoteStatusText || (() => ''), + getVoteChoiceDetailText: voteHelpers.getVoteChoiceDetailText || (() => ''), + formatCountdown: formatUtils.formatCountdown || (() => ''), + + // 任务类型显示 + getTaskTypeText: taskUtils.getTaskTypeText || (() => '团队任务'), + getChallengeTypeText: () => { + if (!taskUtils.getChallengeTypeText) return '个人挑战' + return taskUtils.getChallengeTypeText(safeTaskData.value) + }, + isTeamTask() { + if (!taskUtils.isTeamTask) return false + const teamInfo = teamManagementComposable.teamInfo?.value || null + return taskUtils.isTeamTask(safeTaskData.value, teamInfo) + }, + + // 工作记录相关 + workTimes: workRecordsComposable.workTimes || ref([]), + workLoading: workRecordsComposable.workLoading || ref(false), + workError: workRecordsComposable.workError || ref(null), + startWorking: workOperationsComposable.startWorking || ref(false), + endWorking: workOperationsComposable.endWorking || ref(false), + startWork: workOperationsComposable.startWork || (() => {}), + endWork: workOperationsComposable.endWork || (() => {}), + + // 格式化工具函数(确保函数存在) + formatNumber: formatUtils.formatNumber || ((num) => { + if (num === null || num === undefined) return '0' + return String(Number(num) || 0) + }), + formatPercentage: formatUtils.formatPercentage || ((num) => { + if (num === null || num === undefined) return '0' + return String(Number(num) || 0) + }), + formatDateTime: formatUtils.formatDateTime || ((date) => { + if (!date) return '' + return String(date) + }), + + // WebSocket 消息处理 + handleTaskCancelApproved, + handleTeamMemberChange: wsHandlersComposable.handleTeamMemberChange || (() => {}), + handleTeamInvitationMessage: wsHandlersComposable.handleTeamInvitationMessage || (() => {}), + handleTeamMemberJoined: wsHandlersComposable.handleTeamMemberJoined || (() => {}), + handleTeamMemberLeft: wsHandlersComposable.handleTeamMemberLeft || (() => {}), + handleTeamMemberRemoved: wsHandlersComposable.handleTeamMemberRemoved || (() => {}), + handleTeamVoteInitiated: wsHandlersComposable.handleTeamVoteInitiated || (() => {}), + handleTeamVoteResult: wsHandlersComposable.handleTeamVoteResult || (() => {}), + + // Store + userStore + } +} + diff --git a/pages/task/detail/composables/useTaskDetailSetup.js b/pages/task/detail/composables/useTaskDetailSetup.js new file mode 100644 index 00000000..99875bb5 --- /dev/null +++ b/pages/task/detail/composables/useTaskDetailSetup.js @@ -0,0 +1,376 @@ +/** + * 任务详情页面 Setup Composable + * 整合所有 composable 的初始化逻辑,简化主组件的 setup 函数 + * + * 功能: + * 1. 初始化所有相关的 composables + * 2. 处理 composable 之间的依赖关系 + * 3. 返回所有需要的状态和函数 + */ +import { ref, computed } from 'vue' +import { NETWORK_CONFIG } from '@/config/network.js' +import { useUserStore } from '@/store/user' + +// 导入所有 composables +import { useUserInfoCache } from './useUserInfoCache.js' +import { useTaskMap } from './useTaskMap.js' +import { useTaskUtils } from './useTaskUtils.js' +import { useFormatUtils } from './useFormatUtils.js' +import { useVoteHelpers } from './useVoteHelpers.js' +import { useTaskDataTransform } from './useTaskDataTransform.js' +import { useWorkRecords } from './useWorkRecords.js' +import { useTaskDetail } from './useTaskDetail.js' +import { useTaskStatus } from './useTaskStatus.js' +import { useTaskActions } from './useTaskActions.js' +import { useTaskEdit } from './useTaskEdit.js' +import { useBadgeContributors } from './useBadgeContributors.js' +import { useTaskCompletion } from './useTaskCompletion.js' +import { useTeamManagement } from './useTeamManagement.js' +import { useVoteSystem } from './useVoteSystem.js' +import { useFriendSearch } from './useFriendSearch.js' +import { useWebSocketHandlers } from './useWebSocketHandlers.js' +import { useTaskApplication } from './useTaskApplication.js' +import { useTaskPermissions } from './useTaskPermissions.js' +import { useTeamCreation } from './useTeamCreation.js' +import { useTeamOperations } from './useTeamOperations.js' +import { useVoteOperations } from './useVoteOperations.js' +import { useTaskCompletionOperations } from './useTaskCompletionOperations.js' +import { useTaskHelpers } from './useTaskHelpers.js' +import { useWorkOperations } from './useWorkOperations.js' +import { useBadgeInitialization } from './useBadgeInitialization.js' +import { useTaskLifecycle } from './useTaskLifecycle.js' + +/** + * 任务详情页面 Setup Composable + * @param {Object} options - 配置选项 + * @returns {Object} 包含所有 composables 和公共状态的对象 + */ +export function useTaskDetailSetup(options = {}) { + const userStore = useUserStore() + + // ========== 基础状态 ========== + const task = ref(null) + let taskId = null + const scrollIntoView = ref('') + const teamInfoRef = ref(null) + const taskIdRef = ref(null) + const teamName = ref('') + const editingTeamName = ref('') + const selectedCandidateId = ref(null) + + // ========== 初始化基础 Composables ========== + + // 用户信息缓存 + const userInfoCacheComposable = useUserInfoCache() + + // 任务工具函数 + const taskUtils = useTaskUtils() + + // 格式化工具函数 + const formatUtils = useFormatUtils() + + // 投票辅助函数 + const voteHelpers = useVoteHelpers() + + // 任务数据转换 + const taskDataTransformComposable = useTaskDataTransform({ task }) + const taskData = taskDataTransformComposable.taskData + + const currentUserId = computed(() => userStore.profile?.uid || null) + + // ========== 初始化依赖基础 Composables 的 Composables ========== + + // 任务地图(需要在 taskData 初始化后) + const taskMapComposable = useTaskMap({ task, taskData }) + + // 工作记录 + const workRecordsComposable = useWorkRecords({ + taskData: computed(() => taskData.value), + taskId: computed(() => taskId || taskIdRef.value) + }) + + // 任务详情数据获取(loadTeamInfo 将在后面设置) + const taskDetailComposable = useTaskDetail({ + task, + workTimes: workRecordsComposable.workTimes, + loadTeamInfo: null, // 将在后面设置 + taskIdRef + }) + + // 徽章贡献者管理(需要在 taskData 初始化后) + const badgeContributorsComposable = useBadgeContributors({ + task, + teamInfo: teamInfoRef, + getUserNickname: userInfoCacheComposable.getUserNickname, + getUserAvatar: userInfoCacheComposable.getUserAvatar + }) + + // 任务完成申请(allBadgesValid 需要 badgeContributorsComposable) + const allBadgesValidComputed = computed(() => { + if (!taskData.value?.badges || !badgeContributorsComposable) return false + return taskData.value.badges.every(b => + badgeContributorsComposable.calculateTotalPercentage(b.id) === 100 + ) + }) + + // 任务完成申请 + const taskCompletionComposable = useTaskCompletion({ + task, + taskData: computed(() => taskData.value), + fetchUsersInfo: userInfoCacheComposable.fetchUsersInfo, + allBadgesValid: allBadgesValidComputed + }) + + // 任务状态相关(需要在 taskCompletionComposable 初始化后) + const taskStatusComposable = useTaskStatus({ + taskData: computed(() => taskData.value), + task, + hasAppliedCompletion: taskCompletionComposable.hasAppliedCompletion + }) + + // 任务编辑 + const taskEditComposable = useTaskEdit({ + taskId: computed(() => taskIdRef.value || taskId), + taskData: computed(() => taskData.value), + fetchTaskDetail: (id) => taskDetailComposable.fetchTaskDetail(id || taskId) + }) + + // 任务申请相关 + const taskApplicationComposable = useTaskApplication({ + task, + teamInfo: teamInfoRef, + fetchTaskDetail: () => taskDetailComposable.fetchTaskDetail(taskId), + checkUserApplied: () => taskStatusComposable.checkUserApplied(), + parseJwtToken: taskUtils.parseJwtToken + }) + + // 团队管理(checkExistingTeam 和 loadTeamVotes 将在后面设置) + const teamManagementComposable = useTeamManagement({ + taskData: computed(() => taskData.value), + currentUserId: computed(() => currentUserId.value), + parseJwtToken: taskUtils.parseJwtToken, + checkExistingTeam: null, // 将在后面设置 + loadTeamVotes: null // 将在后面设置 + }) + + // 投票系统(checkExistingTeam 将在后面设置) + const voteSystemComposable = useVoteSystem({ + parseJwtToken: taskUtils.parseJwtToken, + checkExistingTeam: null // 将在后面设置 + }) + + // 好友搜索 + const friendSearchComposable = useFriendSearch({ + parseJwtToken: taskUtils.parseJwtToken, + taskData: computed(() => taskData.value), + teamName: computed(() => teamName.value) + }) + + // 任务操作 + const taskActionsComposable = useTaskActions({ + task, + taskData: computed(() => taskData.value), + fetchTaskDetail: (id) => taskDetailComposable.fetchTaskDetail(id || taskId), + checkUserApplied: () => taskStatusComposable.checkUserApplied(), + checkPendingMessages: () => taskStatusComposable.checkPendingMessages() + }) + + // WebSocket 消息处理(依赖将在后面设置) + const wsHandlersComposable = useWebSocketHandlers({ + taskId: computed(() => taskId || taskIdRef.value), + checkExistingTeam: null, // 将在后面设置 + loadTeamVotes: null, // 将在后面设置 + loadVoteHistory: null // 将在后面设置 + }) + + // 任务权限相关 + const taskPermissionsComposable = useTaskPermissions({ + taskData: computed(() => taskData.value), + currentUserId: computed(() => currentUserId.value), + teamInfo: teamManagementComposable.teamInfo, + hasUserApplied: taskStatusComposable.hasUserApplied, + taskEditInfo: taskEditComposable.taskEditInfo, + workTimes: workRecordsComposable.workTimes + }) + + // 团队创建相关 + const teamCreationComposable = useTeamCreation({ + taskData: computed(() => taskData.value), + teamInfo: teamManagementComposable.teamInfo, + teamMode: teamManagementComposable.teamMode, + isTeamLeader: teamManagementComposable.isTeamLeader, + challengeType: taskApplicationComposable.challengeType, + teamName: computed(() => teamName.value), + editingTeamName: computed(() => editingTeamName.value), + parseJwtToken: taskUtils.parseJwtToken, + checkExistingTeam: null, // 将在后面设置 + fetchUsersInfo: userInfoCacheComposable.fetchUsersInfo, + friendSearchComposable, + teamManagementComposable + }) + + // 团队操作相关 + const teamOperationsComposable = useTeamOperations({ + taskData: computed(() => taskData.value), + task, + teamInfo: teamManagementComposable.teamInfo, + teamMode: teamManagementComposable.teamMode, + editingTeamName: computed(() => editingTeamName.value), + teamName: computed(() => teamName.value), + teamManagementComposable, + friendSearchComposable, + fetchUsersInfo: userInfoCacheComposable.fetchUsersInfo, + loadTeamVotes: (teamId) => voteSystemComposable.loadTeamVotes?.(teamId), + loadVoteHistory: (teamId) => voteSystemComposable.loadVoteHistory?.(teamId) + }) + + // 更新依赖(解决循环依赖问题) + const checkExistingTeamFn = () => teamOperationsComposable.checkExistingTeamWithExtra() + teamManagementComposable.checkExistingTeam = checkExistingTeamFn + voteSystemComposable.checkExistingTeam = checkExistingTeamFn + teamCreationComposable.checkExistingTeam = checkExistingTeamFn + wsHandlersComposable.checkExistingTeam = checkExistingTeamFn + teamManagementComposable.loadTeamVotes = (teamId) => voteSystemComposable.loadTeamVotes?.(teamId) + wsHandlersComposable.loadTeamVotes = (teamId) => voteSystemComposable.loadTeamVotes?.(teamId) + wsHandlersComposable.loadVoteHistory = (teamId) => voteSystemComposable.loadVoteHistory?.(teamId) + taskDetailComposable.loadTeamInfo = (teamId) => teamOperationsComposable.loadTeamInfoWithExtra?.(teamId) + + // 投票操作相关 + const voteOperationsComposable = useVoteOperations({ + teamInfo: teamManagementComposable.teamInfo, + voteSystemComposable, + activeTeamVotes: voteSystemComposable.activeTeamVotes, + selectedCandidateId, + checkExistingTeam: checkExistingTeamFn, + loadTeamVotes: (teamId) => voteSystemComposable.loadTeamVotes?.(teamId) + }) + + // 任务完成操作相关 + const taskCompletionOperationsComposable = useTaskCompletionOperations({ + taskData: computed(() => taskData.value), + task, + teamInfo: teamManagementComposable.teamInfo, + taskCompletionComposable, + badgeContributors: badgeContributorsComposable.badgeContributors, + calculateTotalPercentage: badgeContributorsComposable.calculateTotalPercentage, + isTeamTask: () => taskUtils.isTeamTask(taskData.value, teamManagementComposable.teamInfo.value), + hasAppliedCompletion: taskCompletionComposable.hasAppliedCompletion, + checkPendingMessages: () => taskStatusComposable.checkPendingMessages() + }) + + // 任务辅助函数 + const taskHelpersComposable = useTaskHelpers({ + scrollIntoView, + taskCompletionComposable, + validateTotalPercentage: badgeContributorsComposable.validateTotalPercentage + }) + + // 工作记录操作(taskId 将在 onLoad 中设置,这里传递 null,因为内部会从 taskData 或 task 获取) + const workOperationsComposable = useWorkOperations({ + taskData: computed(() => taskData.value), + task, + taskId: null, // 内部会从 taskData 或 task 获取,这里传递 null + workRecordsComposable + }) + + // 徽章初始化 + const badgeInitializationComposable = useBadgeInitialization({ + task, + badgeContributorsComposable, + badgeContributions: badgeContributorsComposable.badgeContributions, + userStore + }) + + // 设置任务变化监听 + badgeInitializationComposable.setupTaskWatcher() + + // 任务生命周期 + const taskLifecycleComposable = useTaskLifecycle({ + taskIdRef, + fetchTaskDetail: (taskId) => taskDetailComposable.fetchTaskDetail(taskId), + fetchWorkTimes: workOperationsComposable.fetchWorkTimes, + checkPendingMessages: () => taskStatusComposable.checkPendingMessages(), + checkUserApplied: () => taskStatusComposable.checkUserApplied(), + checkExistingTeam: checkExistingTeamFn, + fetchApplyCompletePreview: taskCompletionComposable.fetchApplyCompletePreview, + showCompletePreview: taskCompletionComposable.showCompletePreview, + wsHandlersComposable, + handleTaskCancelApproved: async (eventData) => { + await wsHandlersComposable.handleTaskCancelApproved( + eventData, + (taskId) => taskDetailComposable.fetchTaskDetail(taskId), + () => taskStatusComposable.checkUserApplied(), + () => taskStatusComposable.checkPendingMessages() + ) + }, + userStore + }) + + // ========== 返回所有 Composables 和辅助函数 ========== + + return { + // 基础状态 ref + task, + taskIdRef, + scrollIntoView, + teamInfoRef, + teamName, + editingTeamName, + selectedCandidateId, + + // 计算属性 + currentUserId, + taskData, + + // 所有 Composables(按功能分组) + composables: { + // 基础工具 + userInfoCache: userInfoCacheComposable, + taskMap: taskMapComposable, + taskUtils, + formatUtils, + voteHelpers, + + // 核心功能 + taskDetail: taskDetailComposable, + taskStatus: taskStatusComposable, + taskActions: taskActionsComposable, + taskEdit: taskEditComposable, + taskApplication: taskApplicationComposable, + + // 徽章和完成 + badgeContributors: badgeContributorsComposable, + badgeInitialization: badgeInitializationComposable, + taskCompletion: taskCompletionComposable, + taskCompletionOperations: taskCompletionOperationsComposable, + + // 团队相关 + teamManagement: teamManagementComposable, + teamCreation: teamCreationComposable, + teamOperations: teamOperationsComposable, + friendSearch: friendSearchComposable, + + // 投票相关 + voteSystem: voteSystemComposable, + voteOperations: voteOperationsComposable, + + // 工作记录 + workRecords: workRecordsComposable, + workOperations: workOperationsComposable, + + // 其他 + taskPermissions: taskPermissionsComposable, + taskHelpers: taskHelpersComposable, + wsHandlers: wsHandlersComposable, + taskLifecycle: taskLifecycleComposable + }, + + // 辅助函数:获取 taskId(用于更新) + getTaskId: () => taskId, + setTaskId: (id) => { taskId = id }, + + // 辅助函数:更新 teamInfoRef + updateTeamInfoRef: (info) => { teamInfoRef.value = info } + } +} + diff --git a/pages/task/detail/composables/useTaskEdit.js b/pages/task/detail/composables/useTaskEdit.js new file mode 100644 index 00000000..46802bd3 --- /dev/null +++ b/pages/task/detail/composables/useTaskEdit.js @@ -0,0 +1,138 @@ +/** + * 任务编辑相关逻辑 Composable + * 处理任务修改申请等功能 + */ +import { ref, reactive, computed } from 'vue' +import { NETWORK_CONFIG } from '@/config/network.js' + +export function useTaskEdit(dependencies = {}) { + const { taskId, taskData, fetchTaskDetail } = dependencies + + // 响应式数据 + const showEditTaskModal = ref(false) + const editTaskForm = reactive({ + title: '', + description: '', + address: '', + reward: null + }) + const taskEditInfo = reactive({ + editCount: 0, + remainingEdits: 3 + }) + + // 计算属性 + const canSubmitEdit = computed(() => { + return editTaskForm.title.trim() && + editTaskForm.description.trim() && + editTaskForm.address.trim() && + editTaskForm.reward > 0 && + (taskEditInfo.editCount || 0) < 3 + }) + + // 打开编辑模态框 + const openEditTaskModal = async () => { + try { + const token = uni.getStorageSync('accessToken') + if (!token) { + uni.showToast({ title: '请先登录', icon: 'none' }) + return + } + + // 获取任务修改信息 + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/task/edit-info?taskId=${taskId}`, + method: 'GET', + header: { 'Access-Token': `Bearer ${token}` } + }) + + if (response.data && response.data.success) { + taskEditInfo.editCount = response.data.editCount || 0 + taskEditInfo.remainingEdits = response.data.remainingEdits || 3 + } + + // 填充表单数据 + if (taskData && taskData.value) { + editTaskForm.title = taskData.value.title || '' + editTaskForm.description = taskData.value.description || '' + editTaskForm.address = taskData.value.address || '' + editTaskForm.reward = taskData.value.reward || 0 + } + + showEditTaskModal.value = true + } catch (error) { + console.error('获取任务修改信息失败:', error) + uni.showToast({ title: '获取修改信息失败', icon: 'none' }) + } + } + + // 关闭编辑模态框 + const closeEditTaskModal = () => { + showEditTaskModal.value = false + // 重置表单 + editTaskForm.title = '' + editTaskForm.description = '' + editTaskForm.address = '' + editTaskForm.reward = null + } + + // 提交编辑申请 + const submitEditTask = async () => { + if (!canSubmitEdit.value) { + uni.showToast({ title: '请填写完整的修改信息', icon: 'none' }) + return + } + + try { + const token = uni.getStorageSync('accessToken') + if (!token) { + uni.showToast({ title: '请先登录', icon: 'none' }) + return + } + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/task/request-update`, + method: 'POST', + data: { + taskId: taskId, + title: editTaskForm.title, + description: editTaskForm.description, + address: editTaskForm.address, + reward: editTaskForm.reward + }, + header: { 'Access-Token': `Bearer ${token}` } + }) + + if (response.data && response.data.success) { + uni.showToast({ title: '修改申请已提交,等待同意', icon: 'success' }) + closeEditTaskModal() + + // 重新加载任务数据 + if (fetchTaskDetail) { + await fetchTaskDetail(taskId) + } + } else { + uni.showToast({ title: response.data?.message || '提交失败', icon: 'none' }) + } + } catch (error) { + console.error('提交任务修改失败:', error) + uni.showToast({ title: '提交失败,请重试', icon: 'none' }) + } + } + + return { + // 响应式数据 + showEditTaskModal, + editTaskForm, + taskEditInfo, + + // 计算属性 + canSubmitEdit, + + // 方法 + openEditTaskModal, + closeEditTaskModal, + submitEditTask + } +} + diff --git a/pages/task/detail/composables/useTaskHelpers.js b/pages/task/detail/composables/useTaskHelpers.js new file mode 100644 index 00000000..d9c0a296 --- /dev/null +++ b/pages/task/detail/composables/useTaskHelpers.js @@ -0,0 +1,47 @@ +/** + * 任务辅助函数 Composable + * 整合各种简单的辅助函数和工具函数 + */ +export function useTaskHelpers(dependencies = {}) { + const { + scrollIntoView, + taskCompletionComposable, + validateTotalPercentage + } = dependencies + + /** + * 防抖函数 + */ + const debounce = (func, wait) => { + let timeout + return function executedFunction(...args) { + const later = () => { + clearTimeout(timeout) + func(...args) + } + clearTimeout(timeout) + timeout = setTimeout(later, wait) + } + } + + /** + * 防抖的验证总百分比函数 + */ + const debouncedValidateTotalPercentage = debounce(validateTotalPercentage, 300) + + /** + * 跳转到申请完成区域 + */ + const goToApplyComplete = () => { + if (taskCompletionComposable && taskCompletionComposable.goToApplyComplete) { + taskCompletionComposable.goToApplyComplete({ value: scrollIntoView }) + } + } + + return { + debounce, + debouncedValidateTotalPercentage, + goToApplyComplete + } +} + diff --git a/pages/task/detail/composables/useTaskLifecycle.js b/pages/task/detail/composables/useTaskLifecycle.js new file mode 100644 index 00000000..16118f7d --- /dev/null +++ b/pages/task/detail/composables/useTaskLifecycle.js @@ -0,0 +1,103 @@ +/** + * 任务详情生命周期 Composable + * 整合页面生命周期相关的逻辑 + */ +import { NETWORK_CONFIG } from '@/config/network.js' + +export function useTaskLifecycle(dependencies = {}) { + const { + taskIdRef, + fetchTaskDetail, + fetchWorkTimes, + checkPendingMessages, + checkUserApplied, + checkExistingTeam, + fetchApplyCompletePreview, + showCompletePreview, + wsHandlersComposable, + handleTaskCancelApproved, + userStore + } = dependencies + + /** + * 页面加载时的处理 + */ + const onTaskLoad = async (options) => { + uni.setNavigationBarTitle({ title: '任务详情' }) + const taskId = options.id || options.taskId || options.task_id + + if (taskIdRef && taskIdRef.value !== undefined) { + taskIdRef.value = taskId // 更新 ref 以便 composables 使用 + } + + const messageId = options.messageId + const showCompletion = options.showCompletion === 'true' + + // 确保用户信息已初始化 + if (userStore && !userStore.isInitialized) { + await userStore.initialize() + } + + if (taskId) { + if (fetchTaskDetail) { + await fetchTaskDetail(taskId) + } + if (fetchWorkTimes) { + await fetchWorkTimes() // 详情完成后再拉取工作记录,避免任务ID为空 + } + if (checkPendingMessages) { + await checkPendingMessages() // 检查待处理消息 + } + if (checkUserApplied) { + await checkUserApplied() // 检查用户申请状态 + } + if (checkExistingTeam) { + await checkExistingTeam() // 检查是否已有团队,决定是否默认勾选组队模式 + } + + // 如果是从消息跳转过来且需要显示申请完成详情 + if (showCompletion && messageId && fetchApplyCompletePreview) { + // 延迟一点时间确保任务数据已加载完成 + setTimeout(async () => { + await fetchApplyCompletePreview() + if (showCompletePreview && showCompletePreview.value !== undefined) { + showCompletePreview.value = true + } + }, 500) + } + } else { + if (NETWORK_CONFIG.DEBUG) { + console.error('任务 ID 缺失') + } + } + + // 监听任务取消申请被同意的事件 + if (handleTaskCancelApproved) { + uni.$on('task-cancel-approved', handleTaskCancelApproved) + } + + // 注册 WebSocket 消息监听器(使用 composable 版本) + if (wsHandlersComposable && wsHandlersComposable.registerWebSocketListeners) { + wsHandlersComposable.registerWebSocketListeners() + } + } + + /** + * 页面卸载时的处理 + */ + const onTaskUnload = () => { + // 清理事件监听器 + uni.$off('task-cancel-approved', handleTaskCancelApproved) + + // 取消注册 WebSocket 消息监听器(使用 composable 版本) + if (wsHandlersComposable && wsHandlersComposable.unregisterWebSocketListeners) { + wsHandlersComposable.unregisterWebSocketListeners() + } + } + + return { + onTaskLoad, + onTaskUnload + } +} + diff --git a/pages/task/detail/composables/useTaskMap.js b/pages/task/detail/composables/useTaskMap.js new file mode 100644 index 00000000..859406af --- /dev/null +++ b/pages/task/detail/composables/useTaskMap.js @@ -0,0 +1,114 @@ +/** + * 任务地图相关逻辑 Composable + * 处理地图标记、定位等功能 + */ +import { computed } from 'vue' +import { NETWORK_CONFIG } from '@/config/network.js' + +export function useTaskMap(dependencies = {}) { + const { task, taskData } = dependencies + + // 获取经纬度(优先使用 taskData,如果没有则使用 task) + const getLongitude = () => { + if (taskData && taskData.value && taskData.value.longitude) { + return taskData.value.longitude + } + if (task && task.value && task.value.longitude) { + return task.value.longitude + } + return 116.397128 // 默认北京天安门 + } + + const getLatitude = () => { + if (taskData && taskData.value && taskData.value.latitude) { + return taskData.value.latitude + } + if (task && task.value && task.value.latitude) { + return task.value.latitude + } + return 39.916527 // 默认北京天安门 + } + + const getTitle = () => { + if (taskData && taskData.value && taskData.value.title) { + return taskData.value.title + } + if (task && task.value && task.value.title) { + return task.value.title + } + return '任务位置' + } + + // 地图标记点 + const mapMarkers = computed(() => { + const longitude = getLongitude() + const latitude = getLatitude() + const title = getTitle() + + return [{ + id: 1, + longitude: parseFloat(longitude), + latitude: parseFloat(latitude), + title: title, + width: 30, + height: 30, + iconPath: '', // 使用默认图标 + callout: { + content: title, + color: '#333', + fontSize: 14, + borderRadius: 4, + bgColor: '#fff', + padding: 8, + display: 'BYCLICK' + } + }] + }) + + // 定位到任务位置 + const moveToTaskLocation = () => { + const longitude = getLongitude() + const latitude = getLatitude() + + const mpLongitude = parseFloat(longitude) + const mpLatitude = parseFloat(latitude) + + if (isNaN(mpLongitude) || isNaN(mpLatitude)) { + uni.showToast({ title: '任务坐标无效', icon: 'none' }) + return + } + + try { + // 让地图回正 + const mapCtx = uni.createMapContext('map3D') + if (mapCtx && mapCtx.moveToLocation) { + mapCtx.moveToLocation({ + longitude: mpLongitude, + latitude: mpLatitude, + success: () => { + // 成功回调 + }, + fail: (err) => { + if (NETWORK_CONFIG.DEBUG) { + console.error('地图定位失败:', err) + } + } + }) + } else { + // 如果 moveToLocation 不可用,尝试使用其他方法 + uni.showToast({ title: '地图定位功能暂不可用', icon: 'none' }) + } + } catch (error) { + if (NETWORK_CONFIG.DEBUG) { + console.error('地图定位错误:', error) + } + uni.showToast({ title: '地图定位失败', icon: 'none' }) + } + } + + return { + mapMarkers, + moveToTaskLocation + } +} + diff --git a/pages/task/detail/composables/useTaskPermissions.js b/pages/task/detail/composables/useTaskPermissions.js new file mode 100644 index 00000000..e7947cb5 --- /dev/null +++ b/pages/task/detail/composables/useTaskPermissions.js @@ -0,0 +1,287 @@ +/** + * 任务权限判断 Composable + * 处理任务相关的权限判断和显示逻辑 + */ +import { computed } from 'vue' +import { NETWORK_CONFIG } from '@/config/network.js' + +export function useTaskPermissions(dependencies = {}) { + const { + taskData, + currentUserId, + teamInfo, + hasUserApplied, + taskEditInfo, + workTimes + } = dependencies + + // 是否是任务发布者 + const isTaskPublisher = computed(() => { + if (!taskData.value || !currentUserId.value) return false + return String(taskData.value.publisherId) === String(currentUserId.value) + }) + + // 是否是团队成员 + const isTeamMember = computed(() => { + if (!teamInfo.value || !teamInfo.value.members || !currentUserId.value) return false + return teamInfo.value.members.some(member => + String(member.userId) === String(currentUserId.value) + ) + }) + + // 是否是挑战者(团队成员) + const isChallenger = computed(() => { + return isTeamMember.value + }) + + // 发布者且任务进行中 + const isPublisherAndInProgress = computed(() => { + if (!taskData.value || !currentUserId.value) return false + return isTaskPublisher.value && String(taskData.value.status) === '2' + }) + + // 是否可以显示申请完成按钮 + const showApplyCompleteBtn = computed(() => { + if (!taskData.value || !currentUserId.value) { + if (NETWORK_CONFIG.DEBUG) { + console.log('showApplyCompleteBtn: 缺少必要数据', { + hasTaskData: !!taskData.value, + hasCurrentUserId: !!currentUserId.value + }) + } + return false + } + + const status = taskData.value.status + const publisherId = taskData.value.publisherId + + // 发布者不应该看到申请完成按钮 + if (isTaskPublisher.value) { + if (NETWORK_CONFIG.DEBUG) { + console.log('showApplyCompleteBtn: 发布者不应该看到申请完成按钮') + } + return false + } + + const result = isChallenger.value && String(status) === '2' + if (NETWORK_CONFIG.DEBUG) { + console.log('showApplyCompleteBtn 计算结果:', { + status, + isChallenger: isChallenger.value, + isPublisher: isTaskPublisher.value, + statusMatch: String(status) === '2', + result + }) + } + return result + }) + + // 是否可以显示任务操作按钮 + const showTaskActions = computed(() => { + if (!taskData.value || !currentUserId.value) return false + + if (NETWORK_CONFIG.DEBUG) { + console.log('showTaskActions 调试信息:', { + isPublisher: isTaskPublisher.value, + isChallenger: isChallenger.value, + hasUserApplied: hasUserApplied?.value, + status: taskData.value?.status, + publisherId: taskData.value?.publisherId, + teamId: taskData.value?.teamId, + currentUserId: currentUserId.value, + result: isTaskPublisher.value || isChallenger.value || hasUserApplied?.value + }) + } + + return isTaskPublisher.value || isChallenger.value || hasUserApplied?.value + }) + + // 是否可以撤回申请 + const canCancelApply = computed(() => { + if (!taskData.value || !currentUserId.value) return false + + const status = taskData.value.status + + if (NETWORK_CONFIG.DEBUG) { + console.log('canCancelApply 调试信息:', { + status, + teamId: taskData.value?.teamId, + isChallenger: isChallenger.value, + hasUserApplied: hasUserApplied?.value, + currentUserId: currentUserId.value, + result: (isChallenger.value && String(status) === '1') || (String(status) === '1' && hasUserApplied?.value) + }) + } + + return (isChallenger.value && String(status) === '1') || + (String(status) === '1' && hasUserApplied?.value) + }) + + // 是否可以申请取消任务 + const canRequestCancel = computed(() => { + if (!taskData.value || !currentUserId.value) return false + const status = taskData.value.status + return (isTaskPublisher.value || isChallenger.value) && String(status) === '2' + }) + + // 是否可以删除任务 + const canDeleteTask = computed(() => { + if (!taskData.value || !currentUserId.value) return false + const status = taskData.value.status + return isTaskPublisher.value && (String(status) === '0' || String(status) === '1') + }) + + // 是否可以编辑任务 + const canEditTask = computed(() => { + if (!taskData.value || !currentUserId.value) return false + const status = taskData.value.status + return isTaskPublisher.value && + (String(status) === '1' || String(status) === '2') && + (taskEditInfo?.value?.editCount || 0) < 3 + }) + + // 是否可以显示组队模式 + const canShowTeamMode = computed(() => { + if (!taskData.value) return false + + // 如果任务状态为2(进行中),禁止创建团队,但允许查看团队信息 + if (taskData.value.status === '2') { + return isTaskPublisher.value + } + + // 如果用户是团队成员但没有团队信息,不显示组队模式 + if (isTeamMember.value && !teamInfo.value) { + return false + } + + return true + }) + + // 是否可以显示团队信息 + const canShowTeamInfo = computed(() => { + if (teamInfo.value) { + return true + } + + // 任务发布者在任务进行中时也可以查看团队信息 + if (taskData.value?.status === '2') { + return isTaskPublisher.value + } + + return false + }) + + // 是否可以显示铭牌分配 + const canShowBadgeAllocation = computed(() => { + if (!taskData.value || !currentUserId.value) return false + + const status = taskData.value.status + const isPublisher = isTaskPublisher.value + + // 发布者可以看到铭牌分配,但不能修改 + if (isPublisher) { + if (NETWORK_CONFIG.DEBUG) { + console.log('canShowBadgeAllocation: 发布者可以看到铭牌分配(只读)') + } + return true + } + + // 如果任务状态为2(进行中),挑战者可以看到铭牌分配 + if (String(status) === '2') { + return isTeamMember.value + } + + // 其他状态下的逻辑 + if (isTeamMember.value && !teamInfo.value) { + return false + } + + return true + }) + + // 是否可以修改铭牌分配 + const canEditBadgeAllocation = computed(() => { + if (!taskData.value || !currentUserId.value) return false + + // 发布者不能修改铭牌分配 + if (isTaskPublisher.value) { + if (NETWORK_CONFIG.DEBUG) { + console.log('canEditBadgeAllocation: 发布者不能修改铭牌分配') + } + return false + } + + // 现在所有任务都是团队任务,只有队长可以修改铭牌分配 + if (!teamInfo.value || !teamInfo.value.members) return false + + // 检查用户是否是队长 + const isLeader = teamInfo.value.members.some(member => + String(member.userId) === String(currentUserId.value) && + (member.role === 1 || member.role === '1') + ) + + if (NETWORK_CONFIG.DEBUG) { + console.log('canEditBadgeAllocation: 团队任务,用户是否是队长:', isLeader) + } + + return isLeader + }) + + // 是否可以显示工作控制按钮 + const showWorkControls = computed(() => { + if (taskData.value?.status !== '2') return false // 只在进行中时显示工作控制 + + if (!currentUserId.value) return false + + // 发布者不能看到工作控制按钮 + if (isTaskPublisher.value) { + if (NETWORK_CONFIG.DEBUG) { + console.log('showWorkControls: 发布者不能看到工作控制按钮') + } + return false + } + + if (NETWORK_CONFIG.DEBUG) { + console.log('showWorkControls 计算结果:', { + currentUserId: currentUserId.value, + publisherId: taskData.value?.publisherId, + isPublisher: isTaskPublisher.value, + isChallenger: isChallenger.value, + status: taskData.value?.status, + result: isChallenger.value + }) + } + + return isChallenger.value + }) + + // 是否有进行中的工作 + const hasOngoingWork = computed(() => { + if (!Array.isArray(workTimes?.value)) return false + return workTimes.value.some(wt => { + const endVal = wt?.endTime ?? wt?.end_at ?? wt?.end + return endVal === null || endVal === undefined + }) + }) + + return { + // 计算属性 + isTaskPublisher, + isTeamMember, + isChallenger, + isPublisherAndInProgress, + showApplyCompleteBtn, + showTaskActions, + canCancelApply, + canRequestCancel, + canDeleteTask, + canEditTask, + canShowTeamMode, + canShowTeamInfo, + canShowBadgeAllocation, + canEditBadgeAllocation, + showWorkControls, + hasOngoingWork + } +} + diff --git a/pages/task/detail/composables/useTaskStatus.js b/pages/task/detail/composables/useTaskStatus.js new file mode 100644 index 00000000..c6f81d1c --- /dev/null +++ b/pages/task/detail/composables/useTaskStatus.js @@ -0,0 +1,109 @@ +/** + * 任务状态检查 Composable + * 处理任务申请状态和待处理消息检查 + */ +import { ref } from 'vue' +import { NETWORK_CONFIG } from '@/config/network.js' + +export function useTaskStatus(dependencies = {}) { + const { + taskData, + task, + hasAppliedCompletion + } = dependencies + + // 响应式数据 + const hasPendingMessages = ref(false) + const pendingMessageTypes = ref([]) + const hasUserApplied = ref(false) + + // 检查待处理消息 + const checkPendingMessages = async () => { + try { + const token = uni.getStorageSync('accessToken') + if (!token) return + + const taskIdVal = taskData.value?.taskId || task.value?.taskId + if (!taskIdVal) return + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/message/pending?taskId=${taskIdVal}`, + method: 'GET', + header: { 'Access-Token': `Bearer ${token}` }, + timeout: 8000 + }) + + if (response.statusCode === 200 && response.data) { + hasPendingMessages.value = response.data.hasPending + pendingMessageTypes.value = response.data.messageTypes || [] + // 注意:pendingMessageTypes 是别人发给我的待处理消息,不用于判断我是否已申请完成 + // hasAppliedCompletion 应该通过专门的 check-completion-apply 接口来设置 + } + } catch (e) { + if (NETWORK_CONFIG.DEBUG) { + console.log('检查待处理消息失败:', e) + } + } + } + + // 检查用户是否申请了该任务 + const checkUserApplied = async () => { + try { + const token = uni.getStorageSync('accessToken') + if (!token) return + + const taskIdVal = taskData.value?.taskId || task.value?.taskId + if (!taskIdVal) return + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/message/check-apply?taskId=${taskIdVal}`, + method: 'GET', + header: { 'Access-Token': `Bearer ${token}` }, + timeout: 8000 + }) + + if (response.statusCode === 200 && response.data) { + hasUserApplied.value = response.data.hasApplied || false + if (NETWORK_CONFIG.DEBUG) { + console.log('检查用户申请状态结果:', { + taskId: taskIdVal, + hasApplied: hasUserApplied.value, + response: response.data + }) + } + } + + // 同时检查是否有未处理的完成申请,驱动"撤回完成申请"按钮显示 + try { + const resp2 = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/message/check-completion-apply?taskId=${taskIdVal}`, + method: 'GET', + header: { 'Access-Token': `Bearer ${token}` }, + timeout: 8000 + }) + if (resp2.statusCode === 200 && resp2.data) { + const hasAppliedCompletionRef = hasAppliedCompletion + if (hasAppliedCompletionRef && typeof hasAppliedCompletionRef === 'object' && 'value' in hasAppliedCompletionRef) { + hasAppliedCompletionRef.value = !!resp2.data.hasApplied + } + } + } catch (_) {} + } catch (e) { + if (NETWORK_CONFIG.DEBUG) { + console.log('检查用户申请状态失败:', e) + } + } + } + + return { + // 响应式数据 + hasPendingMessages, + pendingMessageTypes, + hasUserApplied, + + // 方法 + checkPendingMessages, + checkUserApplied + } +} + diff --git a/pages/task/detail/composables/useTaskUtils.js b/pages/task/detail/composables/useTaskUtils.js new file mode 100644 index 00000000..d99e6e0a --- /dev/null +++ b/pages/task/detail/composables/useTaskUtils.js @@ -0,0 +1,108 @@ +/** + * 任务工具函数 Composable + * 提供任务相关的工具函数 + */ +import { NETWORK_CONFIG } from '@/config/network.js' + +export function useTaskUtils() { + // 解析JWT token的工具函数(兼容微信小程序) + const parseJwtToken = (token) => { + try { + const tokenParts = token.split('.') + if (tokenParts.length !== 3) { + throw new Error('Invalid token format') + } + + const payloadBase64 = tokenParts[1] + // 添加填充字符以确保 base64 长度正确 + const paddedBase64 = payloadBase64 + '='.repeat((4 - payloadBase64.length % 4) % 4) + + // 在微信小程序环境中使用 uni.base64ToArrayBuffer + const arrayBuffer = uni.base64ToArrayBuffer(paddedBase64) + const payloadString = String.fromCharCode.apply(null, new Uint8Array(arrayBuffer)) + return JSON.parse(payloadString) + } catch (error) { + if (NETWORK_CONFIG.DEBUG) { + console.error('解析JWT token失败:', error) + } + return null + } + } + + // 获取任务状态文本 + const getStatusText = (status) => { + switch (status) { + case "0": return "审核中" + case "1": return "未完成" + case "2": return "进行中" + case "3": return "已完成" + default: return "未知状态" + } + } + + // 获取任务类型文本(现在所有任务都是团队任务) + const getTaskTypeText = () => { + return '团队任务' + } + + // 获取挑战类型文本 + const getChallengeTypeText = (taskData) => { + if (!taskData) return '个人挑战' + + // 根据challengerType判断挑战类型 + if (taskData.challengerType === 'team' || taskData.challengeType === 'team') { + return '团队挑战' + } + + // 如果有teamId,也认为是团队挑战 + if (taskData.teamId) { + return '团队挑战' + } + + return '个人挑战' + } + + // 判断是否为团队任务(现在所有任务都是团队任务,只要存在teamId就认为是团队任务) + const isTeamTask = (taskData, teamInfo) => { + if (!taskData) return false + // 只要有teamId就认为是团队任务 + return !!(taskData.teamId || (teamInfo && teamInfo.members && teamInfo.members.length > 0)) + } + + // 处理头像加载错误 + const handleAvatarError = (e) => { + if (NETWORK_CONFIG.DEBUG) { + console.log('头像加载失败:', e) + } + if (e.target) { + e.target.src = '/static/images/default-avatar.png' + } + } + + // 处理任务发布者头像加载错误 + const handleTaskAvatarError = () => { + if (NETWORK_CONFIG.DEBUG) { + console.log('任务发布者头像加载失败,使用默认头像') + } + } + + // 处理错误 + const handleError = (err, context) => { + if (NETWORK_CONFIG.DEBUG) { + console.error(`错误 [${context}]:`, err) + } + uni.showToast({ title: '操作失败,请稍后重试', icon: 'none', duration: 2000 }) + } + + return { + parseJwtToken, + getStatusText, + getTaskTypeText, + getChallengeTypeText, + isTeamTask, + handleAvatarError, + handleTaskAvatarError, + handleError + } +} + diff --git a/pages/task/detail/composables/useTeamCreation.js b/pages/task/detail/composables/useTeamCreation.js new file mode 100644 index 00000000..05e88f6d --- /dev/null +++ b/pages/task/detail/composables/useTeamCreation.js @@ -0,0 +1,210 @@ +/** + * 团队创建相关逻辑 Composable + * 处理团队创建、切换团队模式等逻辑 + */ +import { ref } from 'vue' +import { NETWORK_CONFIG } from '@/config/network.js' + +export function useTeamCreation(dependencies = {}) { + const { + taskData, + teamInfo, + teamMode, + isTeamLeader, + challengeType, + teamName, + editingTeamName, + parseJwtToken, + fetchUsersInfo, + checkExistingTeam, + friendSearchComposable + } = dependencies + + // 切换组队模式(保持向后兼容) + const toggleTeamMode = async (e) => { + if (NETWORK_CONFIG.DEBUG) { + console.log('切换组队模式,当前状态:', teamMode.value) + } + + if (teamMode.value) { + // 当前是开启状态,用户要关闭 + teamMode.value = false + isTeamLeader.value = false + teamInfo.value = null + challengeType.value = 'team' // 所有挑战都通过团队实现 + } else { + // 当前是关闭状态,用户要开启 + teamMode.value = true + challengeType.value = 'team' + + // 先检查是否已有团队 + if (checkExistingTeam) { + await checkExistingTeam() + } + + // 如果检查后没有团队信息,则创建新团队 + if (!teamInfo.value) { + if (NETWORK_CONFIG.DEBUG) { + console.log('检查后没有团队信息,创建新团队') + } + await createTeamImmediately() + // 创建团队后,确保组队模式保持开启状态 + teamMode.value = true + } else { + if (NETWORK_CONFIG.DEBUG) { + console.log('检查后发现有团队信息,用户角色:', isTeamLeader.value ? '队长' : '队员') + } + } + } + } + + // 立即创建团队 + const createTeamImmediately = async () => { + try { + const token = uni.getStorageSync('accessToken') + const currentUser = uni.getStorageSync('userInfo') + + if (!token) { + uni.showToast({ title: '请先登录', icon: 'none' }) + return + } + + let leaderId = null + if (currentUser && currentUser.uid) { + leaderId = currentUser.uid + } else { + try { + const tokenPayload = parseJwtToken(token) + if (tokenPayload) { + leaderId = tokenPayload.uid || tokenPayload.sub + } + } catch (tokenError) { + if (NETWORK_CONFIG.DEBUG) { + console.error('解析token失败:', tokenError) + } + uni.showToast({ title: '用户信息获取失败,请重新登录', icon: 'none' }) + return + } + } + + if (!leaderId) { + uni.showToast({ title: '用户信息获取失败,请重新登录', icon: 'none' }) + return + } + + if (NETWORK_CONFIG.DEBUG) { + console.log('立即创建团队,参数:', { + taskId: taskData.value?.taskId, + leaderId: leaderId, + teamName: teamName.value.trim() || '临时团队' + }) + } + + // 创建团队 + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/team/create-invitation`, + method: 'POST', + data: { + taskId: Number(taskData.value?.taskId), + leaderId: Number(leaderId), + teamName: teamName.value.trim() || '临时团队', + inviteeIds: [] // 暂时不邀请任何人,只创建团队 + }, + header: { + 'Access-Token': `Bearer ${token}`, + 'Content-Type': 'application/json' + } + }) + + if (NETWORK_CONFIG.DEBUG) { + console.log('团队创建响应:', response) + } + + if (response.data && response.data.success) { + // 根据是否已存在显示不同消息 + if (response.data.isExisting) { + uni.showToast({ title: '团队已存在', icon: 'success' }) + } else { + uni.showToast({ title: '已为您创建团队', icon: 'success' }) + } + + // 保存团队信息到响应式数据 + if (response.data.teamInfo) { + teamInfo.value = response.data.teamInfo + editingTeamName.value = teamInfo.value.teamName || '临时团队' + + // 设置队长状态 - 创建团队的用户自动成为队长 + isTeamLeader.value = true + if (NETWORK_CONFIG.DEBUG) { + console.log('团队信息:', teamInfo.value) + console.log('设置editingTeamName为:', editingTeamName.value) + console.log('用户角色: 队长') + } + + // 自动获取团队成员的用户信息 + if (teamInfo.value.members && teamInfo.value.members.length > 0) { + const memberIds = teamInfo.value.members.map(member => member.userId) + if (NETWORK_CONFIG.DEBUG) { + console.log('获取团队成员信息,memberIds:', memberIds) + } + if (fetchUsersInfo) { + await fetchUsersInfo(memberIds) + } + // 初始化已邀请用户列表 + if (friendSearchComposable && friendSearchComposable.initializeInvitedUsers) { + friendSearchComposable.initializeInvitedUsers(memberIds) + } + } + } + } else { + // 处理团队已存在的情况 + if (response.data?.message && response.data.message.includes('团队已存在')) { + uni.showToast({ title: '团队已存在,正在加载团队信息...', icon: 'none' }) + // 重新检查团队信息 + if (checkExistingTeam) { + await checkExistingTeam() + } + } else { + uni.showToast({ title: response.data?.message || '团队创建失败', icon: 'none' }) + } + } + } catch (error) { + if (NETWORK_CONFIG.DEBUG) { + console.error('创建团队失败:', error) + } + // 如果是重复创建错误,尝试重新检查团队信息 + if (error.message && error.message.includes('团队已存在')) { + uni.showToast({ title: '团队已存在,正在加载团队信息...', icon: 'none' }) + if (checkExistingTeam) { + await checkExistingTeam() + } + } else { + uni.showToast({ title: '创建团队失败', icon: 'none' }) + } + } + } + + // 选择挑战类型(现在只支持团队类型) + const selectChallengeType = (type) => { + // 强制设置为团队类型(所有挑战都通过团队实现) + challengeType.value = 'team' + if (NETWORK_CONFIG.DEBUG) { + console.log('选择挑战类型: team (所有挑战都通过团队实现)') + } + + // 启用组队模式 + teamMode.value = true + // 检查现有团队 + if (checkExistingTeam) { + checkExistingTeam() + } + } + + return { + // 方法 + toggleTeamMode, + createTeamImmediately, + selectChallengeType + } +} + diff --git a/pages/task/detail/composables/useTeamManagement.js b/pages/task/detail/composables/useTeamManagement.js index 88273136..b2cb1242 100644 --- a/pages/task/detail/composables/useTeamManagement.js +++ b/pages/task/detail/composables/useTeamManagement.js @@ -2,8 +2,16 @@ * 团队管理 Composable */ import { ref, computed } from 'vue' +import { NETWORK_CONFIG } from '@/config/network.js' -export function useTeamManagement() { +export function useTeamManagement(dependencies = {}) { + const { + taskData, + currentUserId, + parseJwtToken, + checkExistingTeam: checkExistingTeamCallback, + loadTeamVotes + } = dependencies // 响应式数据 const teamInfo = ref(null) const isTeamLeader = ref(false) @@ -110,7 +118,7 @@ export function useTeamManagement() { } const response = await uni.request({ - url: '${NETWORK_CONFIG.API_BASE_URL}/team/create-invitation', + url: `${NETWORK_CONFIG.API_BASE_URL}/team/create-invitation`, method: 'POST', data: { taskId: Number(taskId), @@ -165,7 +173,7 @@ export function useTeamManagement() { } const response = await uni.request({ - url: '${NETWORK_CONFIG.API_BASE_URL}/team/leave-team', + url: `${NETWORK_CONFIG.API_BASE_URL}/team/leave-team`, method: 'POST', data: { teamId: teamId, @@ -217,7 +225,7 @@ export function useTeamManagement() { } const response = await uni.request({ - url: '${NETWORK_CONFIG.API_BASE_URL}/team/dissolve-team', + url: `${NETWORK_CONFIG.API_BASE_URL}/team/dissolve-team`, method: 'POST', data: { teamId: teamId, @@ -252,6 +260,275 @@ export function useTeamManagement() { showTeamInvitationModal.value = false } + // 加载团队信息 + const loadTeamInfo = async (teamId = null) => { + try { + const token = uni.getStorageSync('accessToken') + const taskIdVal = taskData?.value?.taskId || taskData?.taskId + + if (!taskIdVal) return + + let url = `${NETWORK_CONFIG.API_BASE_URL}/team/info?taskId=${taskIdVal}` + if (teamId) { + url += `&teamId=${teamId}` + } + + const response = await uni.request({ + url: url, + method: 'GET', + header: { 'Access-Token': `Bearer ${token}` } + }) + + if (response.data && response.data.success) { + teamInfo.value = response.data.data + + // 判断用户是否是队长 + if (teamInfo.value && currentUserId?.value) { + const leaderId = teamInfo.value.leaderId + isTeamLeader.value = String(leaderId) === String(currentUserId.value) + } + + return teamInfo.value + } + } catch (error) { + console.error('加载团队信息失败:', error) + throw error + } + } + + // 更新团队名称 + const updateTeamName = async (teamId, teamName) => { + if (!teamId || !teamName?.trim()) { + throw new Error('团队ID和团队名称不能为空') + } + + try { + const token = uni.getStorageSync('accessToken') + if (!token) throw new Error('请先登录') + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/team/update-name`, + method: 'POST', + data: { + teamId: Number(teamId), + teamName: teamName.trim() + }, + header: { + 'Access-Token': `Bearer ${token}`, + 'Content-Type': 'application/json' + } + }) + + if (response.data && response.data.success) { + if (teamInfo.value) { + teamInfo.value.teamName = teamName.trim() + } + return true + } else { + throw new Error(response.data?.message || '更新失败') + } + } catch (error) { + console.error('更新团队名称失败:', error) + throw error + } + } + + // 保存团队名称(包装函数,用于兼容) + const saveTeamName = async (editingTeamName) => { + if (!editingTeamName?.trim()) { + uni.showToast({ title: '请输入团队名称', icon: 'none' }) + return false + } + + if (!teamInfo.value || !teamInfo.value.teamId) { + uni.showToast({ title: '团队信息不存在', icon: 'none' }) + return false + } + + try { + await updateTeamName(teamInfo.value.teamId, editingTeamName) + uni.showToast({ title: '团队名称更新成功', icon: 'success' }) + return true + } catch (error) { + uni.showToast({ title: error.message || '更新团队名称失败', icon: 'none' }) + return false + } + } + + // 移除团队成员 + const removeTeamMember = async (memberId) => { + if (!teamInfo.value || !teamInfo.value.teamId) { + uni.showToast({ title: '团队信息不存在', icon: 'none' }) + return false + } + + try { + const token = uni.getStorageSync('accessToken') + if (!token) { + uni.showToast({ title: '请先登录', icon: 'none' }) + return false + } + + let leaderId = null + if (currentUserId?.value) { + leaderId = currentUserId.value + } else { + const currentUser = uni.getStorageSync('userInfo') + if (currentUser && currentUser.uid) { + leaderId = currentUser.uid + } else if (parseJwtToken) { + try { + const tokenPayload = parseJwtToken(token) + leaderId = tokenPayload.uid || tokenPayload.sub + } catch (tokenError) { + console.error('解析token失败:', tokenError) + uni.showToast({ title: '用户信息获取失败,请重新登录', icon: 'none' }) + return false + } + } + } + + if (!leaderId) { + uni.showToast({ title: '用户信息获取失败,请重新登录', icon: 'none' }) + return false + } + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/team/remove-member`, + method: 'POST', + data: { + teamId: teamInfo.value.teamId, + leaderId: leaderId, + memberId: memberId + }, + header: { + 'Access-Token': `Bearer ${token}`, + 'Content-Type': 'application/json' + } + }) + + if (response.data && response.data.success) { + uni.showToast({ title: '队员移除成功', icon: 'success' }) + if (checkExistingTeamCallback) { + await checkExistingTeamCallback() + } + return true + } else { + throw new Error(response.data?.message || '移除失败') + } + } catch (error) { + console.error('踢出队员失败:', error) + uni.showToast({ title: error.message || '踢出队员失败', icon: 'none' }) + return false + } + } + + // 转让队长 + const transferLeadership = async (newLeaderId) => { + if (!teamInfo.value || !teamInfo.value.teamId) { + uni.showToast({ title: '团队信息不存在', icon: 'none' }) + return false + } + + try { + const confirmResult = await new Promise((resolve) => { + uni.showModal({ + title: '转让队长', + content: '确定要将队长职位转让给该队员吗?转让后您将失去队长权限。', + success: (res) => resolve(res.confirm) + }) + }) + + if (!confirmResult) return false + + const token = uni.getStorageSync('accessToken') + if (!token) { + uni.showToast({ title: '请先登录', icon: 'none' }) + return false + } + + let leaderId = null + if (currentUserId?.value) { + leaderId = currentUserId.value + } else { + const currentUser = uni.getStorageSync('userInfo') + if (currentUser && currentUser.uid) { + leaderId = currentUser.uid + } else if (parseJwtToken) { + try { + const tokenPayload = parseJwtToken(token) + leaderId = tokenPayload.uid || tokenPayload.sub + } catch (tokenError) { + console.error('解析token失败:', tokenError) + uni.showToast({ title: '用户信息获取失败,请重新登录', icon: 'none' }) + return false + } + } + } + + if (!leaderId) { + uni.showToast({ title: '用户信息获取失败,请重新登录', icon: 'none' }) + return false + } + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/team/transfer-leadership`, + method: 'POST', + data: { + teamId: teamInfo.value.teamId, + currentLeaderId: leaderId, + newLeaderId: newLeaderId + }, + header: { + 'Access-Token': `Bearer ${token}`, + 'Content-Type': 'application/json' + } + }) + + if (response.data && response.data.success) { + uni.showToast({ title: '队长转让成功', icon: 'success' }) + isTeamLeader.value = false + if (checkExistingTeamCallback) { + await checkExistingTeamCallback() + } + return true + } else { + throw new Error(response.data?.message || '转让失败') + } + } catch (error) { + console.error('转让队长失败:', error) + uni.showToast({ title: error.message || '转让失败', icon: 'none' }) + return false + } + } + + // 重新创建团队(从已解散状态) + const recreateTeamFromDissolved = async (taskId) => { + try { + await createTeam(taskId, '临时团队') + if (checkExistingTeamCallback) { + await checkExistingTeamCallback() + } + return true + } catch (error) { + console.error('重新创建团队失败:', error) + throw error + } + } + + // 获取团队状态文本 + const getTeamStatusText = (status) => { + if (status === null || status === undefined) { + return '未知状态' + } + switch (status) { + case 0: return '组建中' + case 1: return '已组建' + case 2: return '已解散' + default: return '未知状态' + } + } + return { // 响应式数据 teamInfo, @@ -270,6 +547,13 @@ export function useTeamManagement() { leaveTeam, dissolveTeam, openInvitationModal, - closeInvitationModal + closeInvitationModal, + loadTeamInfo, + updateTeamName, + saveTeamName, + removeTeamMember, + transferLeadership, + recreateTeamFromDissolved, + getTeamStatusText } } diff --git a/pages/task/detail/composables/useTeamOperations.js b/pages/task/detail/composables/useTeamOperations.js new file mode 100644 index 00000000..595c1ecb --- /dev/null +++ b/pages/task/detail/composables/useTeamOperations.js @@ -0,0 +1,296 @@ +/** + * 团队操作 Composable + * 整合团队相关的高级操作函数,包括UI交互和额外逻辑 + */ +import { NETWORK_CONFIG } from '@/config/network.js' + +export function useTeamOperations(dependencies = {}) { + const { + taskData, + task, + teamInfo, + teamMode, + editingTeamName, + teamName, + teamManagementComposable, + friendSearchComposable, + fetchUsersInfo, + loadTeamVotes, + loadVoteHistory + } = dependencies + + /** + * 检查现有团队(包含额外逻辑) + */ + let isCheckingTeam = false // 防止递归调用 + const checkExistingTeamWithExtra = async () => { + if (isCheckingTeam) { + if (NETWORK_CONFIG.DEBUG) { + console.warn('checkExistingTeamWithExtra 正在执行,跳过重复调用') + } + return + } + + try { + isCheckingTeam = true + const taskIdVal = taskData.value?.taskId || task.value?.taskId + if (!taskIdVal) { + isCheckingTeam = false + return + } + + await teamManagementComposable.checkExistingTeam(taskIdVal) + + // 额外的逻辑:更新 editingTeamName 和获取团队成员信息 + if (teamInfo.value) { + editingTeamName.value = teamInfo.value.teamName || '临时团队' + + // 获取团队成员的用户信息 + if (teamInfo.value.members && teamInfo.value.members.length > 0) { + const memberIds = teamInfo.value.members.map(member => member.userId) + await fetchUsersInfo(memberIds) + + // 初始化已邀请用户列表 - 将现有团队成员标记为已邀请 + if (friendSearchComposable && friendSearchComposable.initializeInvitedUsers) { + friendSearchComposable.initializeInvitedUsers(memberIds) + } + } + + // 检查团队状态,如果是已解散状态(status=2),显示解散提示 + if (teamInfo.value.status === 2) { + // 已解散的团队仍然显示,但UI会显示解散状态 + } + } + } catch (error) { + if (NETWORK_CONFIG.DEBUG) { + console.error('检查现有团队失败:', error) + } + // 出错时保持默认状态 + if (teamMode && teamMode.value !== undefined) { + teamMode.value = false + } + } finally { + isCheckingTeam = false + } + } + + /** + * 显示联系队长模态框 + */ + const showContactLeaderModal = () => { + uni.showModal({ + title: '联系队长', + content: '您可以通过以下方式联系队长:\n1. 在聊天室中发送消息\n2. 通过好友系统添加队长\n3. 查看队长的公开信息', + showCancel: true, + cancelText: '取消', + confirmText: '去聊天室', + success: (res) => { + if (res.confirm) { + // 聊天室是 tabbar 页面,使用 switchTab 而不是 navigateTo + uni.switchTab({ + url: '/pages/chat/index' + }) + } + } + }) + } + + /** + * 打开团队邀请模态框(包含创建团队逻辑) + */ + const openTeamInvitationModal = async () => { + try { + const taskIdVal = taskData.value?.taskId || task.value?.taskId + if (!taskIdVal) { + uni.showToast({ title: '任务ID不存在', icon: 'none' }) + return + } + + // 先创建团队 + const teamNameVal = teamName.value?.trim() || '临时团队' + const result = await teamManagementComposable.createTeam(taskIdVal, teamNameVal) + + if (result && result.teamInfo) { + // 根据是否已存在显示不同消息 + if (result.isExisting) { + uni.showToast({ title: '团队已存在', icon: 'success' }) + } else { + uni.showToast({ title: '已为您创建团队', icon: 'success' }) + } + + // 更新 editingTeamName + if (teamInfo.value && editingTeamName) { + editingTeamName.value = teamInfo.value.teamName || '临时团队' + } + + // 打开邀请模态框 + teamManagementComposable.openInvitationModal() + } + } catch (error) { + if (NETWORK_CONFIG.DEBUG) { + console.error('创建团队失败:', error) + } + uni.showToast({ title: error.message || '创建团队失败', icon: 'none' }) + } + } + + /** + * 处理团队邀请确认 + */ + const handleTeamInvitationConfirm = (teamId) => { + if (NETWORK_CONFIG.DEBUG) { + console.log('团队邀请创建成功,团队ID:', teamId) + } + if (teamId && teamManagementComposable.loadTeamInfo) { + teamManagementComposable.loadTeamInfo(teamId) + } + } + + /** + * 处理更新团队名称 + */ + const handleUpdateTeamName = (newTeamName) => { + if (teamInfo.value && newTeamName) { + teamInfo.value.teamName = newTeamName + } + } + + /** + * 加载团队信息(包含额外逻辑) + */ + const loadTeamInfoWithExtra = async (teamId = null) => { + const result = await teamManagementComposable.loadTeamInfo(teamId) + + // 加载团队信息后,获取投票数据 + if (teamInfo.value?.teamId) { + if (loadTeamVotes) { + await loadTeamVotes(teamInfo.value.teamId) + } + if (loadVoteHistory) { + await loadVoteHistory(teamInfo.value.teamId) + } + } + + return result + } + + /** + * 队员退出团队(包含额外逻辑) + */ + const leaveTeamWithExtra = async () => { + if (!teamInfo.value || !teamInfo.value.teamId) { + uni.showToast({ title: '团队信息不存在', icon: 'none' }) + return + } + + try { + await teamManagementComposable.leaveTeam(teamInfo.value.teamId) + uni.showToast({ title: '退出申请已提交,等待队长同意', icon: 'success' }) + + // 退出申请已提交,重新加载团队信息和投票信息 + await checkExistingTeamWithExtra() + if (teamInfo.value?.teamId && loadTeamVotes) { + await loadTeamVotes(teamInfo.value.teamId) + } + } catch (error) { + if (NETWORK_CONFIG.DEBUG) { + console.error('退出团队失败:', error) + } + uni.showToast({ title: error.message || '退出团队失败', icon: 'none' }) + } + } + + /** + * 队长解散团队(包含额外逻辑) + */ + const dissolveTeamWithExtra = async () => { + if (!teamInfo.value || !teamInfo.value.teamId) { + uni.showToast({ title: '团队信息不存在', icon: 'none' }) + return + } + + try { + // 确认解散 + const confirmResult = await new Promise((resolve) => { + uni.showModal({ + title: '解散团队', + content: '确定要解散当前团队吗?解散后所有成员将收到通知。', + confirmText: '确定解散', + cancelText: '取消', + success: (res) => resolve(res.confirm) + }) + }) + + if (!confirmResult) { + return + } + + await teamManagementComposable.dissolveTeam(teamInfo.value.teamId) + uni.showToast({ title: '团队解散成功', icon: 'success' }) + + // 解散团队后,更新团队状态为已解散,但保持团队信息 + if (teamInfo.value) { + teamInfo.value.status = 2 // 设置为已解散状态 + } + + // 重新检查团队状态以获取最新的团队信息 + await checkExistingTeamWithExtra() + } catch (error) { + if (NETWORK_CONFIG.DEBUG) { + console.error('解散团队失败:', error) + } + uni.showToast({ title: error.message || '解散团队失败', icon: 'none' }) + } + } + + /** + * 重新创建团队(用于已解散的团队) + */ + const recreateTeamFromDissolved = async () => { + try { + uni.showToast({ + title: '正在重新创建团队...', + icon: 'loading', + duration: 2000 + }) + + const taskIdVal = taskData.value?.taskId || task.value?.taskId + if (!taskIdVal) { + throw new Error('任务ID不存在') + } + + await teamManagementComposable.recreateTeamFromDissolved(taskIdVal) + + uni.showToast({ + title: '团队重新创建成功!', + icon: 'success', + duration: 2000 + }) + + // 重新检查团队状态 + await checkExistingTeamWithExtra() + } catch (error) { + if (NETWORK_CONFIG.DEBUG) { + console.error('重新创建团队失败:', error) + } + uni.showToast({ + title: '重新创建团队失败: ' + (error.message || '未知错误'), + icon: 'none', + duration: 3000 + }) + } + } + + return { + checkExistingTeamWithExtra, + showContactLeaderModal, + openTeamInvitationModal, + handleTeamInvitationConfirm, + handleUpdateTeamName, + loadTeamInfoWithExtra, + leaveTeamWithExtra, + dissolveTeamWithExtra, + recreateTeamFromDissolved + } +} + diff --git a/pages/task/detail/composables/useUserInfoCache.js b/pages/task/detail/composables/useUserInfoCache.js new file mode 100644 index 00000000..6c513706 --- /dev/null +++ b/pages/task/detail/composables/useUserInfoCache.js @@ -0,0 +1,118 @@ +/** + * 用户信息缓存 Composable + * 处理用户信息的获取和缓存,避免重复请求 + */ +import { ref } from 'vue' +import { NETWORK_CONFIG } from '@/config/network.js' +import { getAvatarDisplayUrl } from '@/utils/imageUtils.js' + +export function useUserInfoCache() { + // 响应式数据 + const userInfoCache = ref({}) + + // 获取用户信息 + const getUserInfo = async (userId) => { + if (userInfoCache.value[userId]) { + return userInfoCache.value[userId] + } + + try { + const token = uni.getStorageSync('accessToken') + if (!token) return null + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/user/info`, + method: 'POST', + data: { + uid: userId + }, + header: { + 'Access-Token': `Bearer ${token}`, + 'Content-Type': 'application/json' + } + }) + + if (response.statusCode === 200 && response.data) { + const userInfo = response.data + userInfoCache.value[userId] = userInfo + return userInfo + } + } catch (error) { + console.error('获取用户信息失败:', error) + } + + return null + } + + // 批量获取用户信息 + const fetchUsersInfo = async (userIds) => { + if (!Array.isArray(userIds) || userIds.length === 0) return + + // 过滤掉已经缓存的用户ID + const uncachedIds = userIds.filter(id => !userInfoCache.value[id]) + + if (uncachedIds.length === 0) return + + // 批量请求用户信息 + const promises = uncachedIds.map(userId => getUserInfo(userId)) + await Promise.all(promises) + } + + // 获取用户昵称 + const getUserNickname = (userId) => { + const userInfo = userInfoCache.value[userId] + return userInfo ? (userInfo.nickname || '未知用户') : '加载中...' + } + + // 获取用户头像 + const getUserAvatar = (userId) => { + const userInfo = userInfoCache.value[userId] + if (userInfo && userInfo.avatarUrl) { + return getAvatarDisplayUrl(userInfo.avatarUrl) + } + return '' + } + + // 获取安全的用户头像(带错误处理) + const getSafeUserAvatar = (uid) => { + const userInfo = userInfoCache.value[uid] + if (userInfo?.avatarUrl) { + return getAvatarDisplayUrl(userInfo.avatarUrl) + } + return '/static/images/default-avatar.png' + } + + // 获取用户名称(用于显示) + const getUserName = (uid) => { + const userInfo = userInfoCache.value[uid] + return userInfo?.nickname || `用户${uid}` + } + + // 清除缓存 + const clearCache = () => { + userInfoCache.value = {} + } + + // 清除指定用户的缓存 + const clearUserCache = (userId) => { + if (userInfoCache.value[userId]) { + delete userInfoCache.value[userId] + } + } + + return { + // 响应式数据 + userInfoCache, + + // 方法 + getUserInfo, + fetchUsersInfo, + getUserNickname, + getUserAvatar, + getSafeUserAvatar, + getUserName, + clearCache, + clearUserCache + } +} + diff --git a/pages/task/detail/composables/useVoteHelpers.js b/pages/task/detail/composables/useVoteHelpers.js new file mode 100644 index 00000000..9098c846 --- /dev/null +++ b/pages/task/detail/composables/useVoteHelpers.js @@ -0,0 +1,115 @@ +/** + * 投票辅助函数 Composable + * 提供投票相关的文本格式化、标题获取等功能 + */ +export function useVoteHelpers() { + /** + * 获取投票标题 + */ + const getVoteTitle = (vote) => { + if (vote.voteTitle) return vote.voteTitle + if (vote.voteType === 1) { + // 检查是否是退出投票 + if (vote.initiatorId && vote.targetUserId && vote.initiatorId === vote.targetUserId) { + return '退出团队投票' + } + return '踢人投票' + } else if (vote.voteType === 2) { + return '弹劾队长投票' + } else if (vote.voteType === 3) { + return '选举新队长投票' + } + return '投票' + } + + /** + * 获取投票规则文本(支持两种调用方式:对象参数或单独参数) + */ + const getVoteRuleText = (voteOrVoteType, requiredVotes, totalVoters) => { + // 判断是对象参数还是单独参数 + let voteType, reqVotes, totalVts + + if (typeof voteOrVoteType === 'object' && voteOrVoteType !== null) { + // 对象参数模式:getVoteRuleText(vote) + const vote = voteOrVoteType + voteType = vote.voteType + reqVotes = vote.requiredVotes + totalVts = vote.totalVoters + + // 对于踢人投票和退出投票,根据队长是否投同意显示不同的规则 + if (voteType === 1) { // REMOVE_MEMBER 类型(踢人投票或退出投票) + const isLeaveVote = vote.initiatorId && vote.targetUserId && vote.initiatorId === vote.targetUserId + + if (vote.leaderApproved === true) { + // 队长投同意:>=50%即可通过(等于50%也可以) + return `需要${reqVotes || 0}票通过(队长已投同意,≥50%即可通过)` + } else if (vote.leaderApproved === false) { + // 队长投反对或不投票:必须>50%才能通过(不能等于50%) + return `需要超过${reqVotes || 0}票通过(队长未同意,必须>50%)` + } else { + // 队长状态未知(队长还没投票),显示两种情况 + return `需要${reqVotes || 0}票通过(队长投同意≥50%即可,否则需>50%)` + } + } + } else { + // 单独参数模式:getVoteRuleText(voteType, requiredVotes, totalVoters) + voteType = voteOrVoteType + reqVotes = requiredVotes + totalVts = totalVoters + } + + // 通用规则文本 + if (voteType === 1) { + return `需要${reqVotes || 0}票同意(共${totalVts || 0}人,需≥50%)` + } else if (voteType === 2) { + return `需要${reqVotes || 0}票同意(共${totalVts || 0}人,需≥2/3)` + } else if (voteType === 3) { + return `需要${reqVotes || 0}人参与(共${totalVts || 0}人,需≥50%)` + } else if (voteType) { + // 其他投票类型 + return `需要${reqVotes || 0}票通过` + } + return '' + } + + /** + * 获取投票选择文本 + */ + const getVoteChoiceText = (userVote, voteType) => { + if (voteType === 3) { + // 选举投票:显示候选人 + return userVote ? '已选择候选人' : '未知' + } else { + // 普通投票:同意/反对 + if (userVote === true || userVote === 1) return '同意' + if (userVote === false || userVote === 2) return '反对' + return '未知' + } + } + + /** + * 获取投票选择详情文本(用于投票记录) + */ + const getVoteChoiceDetailText = (voteChoice, voteType) => { + if (voteType === 3) { + // 选举投票 + return voteChoice === 1 ? '已投票' : voteChoice === 2 ? '反对' : '弃权' + } else { + // 普通投票 + switch (voteChoice) { + case 1: return '同意' + case 2: return '反对' + case 3: return '弃权' + default: return '未知' + } + } + } + + return { + getVoteTitle, + getVoteRuleText, + getVoteChoiceText, + getVoteChoiceDetailText + } +} + diff --git a/pages/task/detail/composables/useVoteOperations.js b/pages/task/detail/composables/useVoteOperations.js new file mode 100644 index 00000000..26a41e1e --- /dev/null +++ b/pages/task/detail/composables/useVoteOperations.js @@ -0,0 +1,156 @@ +/** + * 投票操作 Composable + * 整合投票相关的高级操作函数,包括UI交互和额外逻辑 + */ +import { NETWORK_CONFIG } from '@/config/network.js' + +export function useVoteOperations(dependencies = {}) { + const { + teamInfo, + voteSystemComposable, + activeTeamVotes, + selectedCandidateId, + checkExistingTeam, + loadTeamVotes + } = dependencies + + /** + * 发起踢人投票(包含UI交互) + */ + const initiateRemoveMemberVote = async (memberId) => { + if (!teamInfo.value || !teamInfo.value.teamId) { + uni.showToast({ title: '团队信息不存在', icon: 'none' }) + return + } + + // 显示输入原因的弹窗 + uni.showModal({ + title: '发起踢人投票', + content: '请输入踢人原因', + editable: true, + placeholderText: '请输入踢人原因...', + success: async (res) => { + if (res.confirm && res.content) { + const success = await voteSystemComposable.initiateRemoveVote( + teamInfo.value.teamId, + memberId, + res.content + ) + if (success && checkExistingTeam) { + // 重新加载团队信息 + await checkExistingTeam() + } + } + } + }) + } + + /** + * 发起弹劾队长投票(包含UI交互) + */ + const initiateImpeachLeaderVote = async () => { + if (!teamInfo.value || !teamInfo.value.teamId) { + uni.showToast({ title: '团队信息不存在', icon: 'none' }) + return + } + + // 显示输入原因的弹窗 + uni.showModal({ + title: '发起弹劾队长投票', + content: '请输入弹劾原因', + editable: true, + placeholderText: '请输入弹劾原因...', + success: async (res) => { + if (res.confirm && res.content) { + const success = await voteSystemComposable.initiateImpeachVote( + teamInfo.value.teamId, + res.content + ) + if (success && checkExistingTeam) { + // 重新加载团队信息 + await checkExistingTeam() + } + } + } + }) + } + + /** + * 选择候选人(选举投票) + */ + const selectCandidate = (candidateId) => { + if (selectedCandidateId) { + if (typeof selectedCandidateId === 'object' && 'value' in selectedCandidateId) { + selectedCandidateId.value = candidateId === selectedCandidateId.value ? null : candidateId + } + } + } + + /** + * 投票提案(包含重新加载逻辑) + */ + const voteOnProposal = async (voteId, approve) => { + const success = await voteSystemComposable.voteOnProposal(voteId, approve, activeTeamVotes.value) + + // 重新加载投票数据 + if (success && teamInfo.value?.teamId && loadTeamVotes) { + await loadTeamVotes(teamInfo.value.teamId) + } + + return success + } + + /** + * 提交投票(通用投票) + */ + const submitVote = async (voteId, voteChoice) => { + await voteSystemComposable.submitVote(voteId, voteChoice, activeTeamVotes.value, teamInfo.value?.teamId) + } + + /** + * 提交候选人投票(选举投票) + */ + const submitCandidateVote = async (voteId, candidateId) => { + const success = await voteSystemComposable.submitCandidateVote( + voteId, + candidateId, + activeTeamVotes.value, + teamInfo.value?.teamId + ) + if (success && selectedCandidateId) { + if (typeof selectedCandidateId === 'object' && 'value' in selectedCandidateId) { + selectedCandidateId.value = null // 重置选择 + } + } + } + + /** + * 撤回投票(包含重新加载逻辑) + */ + const withdrawVote = async (voteId) => { + await voteSystemComposable.withdrawVote(voteId, activeTeamVotes.value, teamInfo.value?.teamId) + // 重新获取团队信息 + if (checkExistingTeam) { + await checkExistingTeam() + } + } + + /** + * 从任务撤回投票(包装函数) + */ + const withdrawVoteFromTask = async (voteId) => { + await withdrawVote(voteId) + } + + return { + initiateRemoveMemberVote, + initiateImpeachLeaderVote, + selectCandidate, + voteOnProposal, + submitVote, + submitCandidateVote, + withdrawVote, + withdrawVoteFromTask + } +} + diff --git a/pages/task/detail/composables/useVoteSystem.js b/pages/task/detail/composables/useVoteSystem.js index b1465f9f..4d2b009e 100644 --- a/pages/task/detail/composables/useVoteSystem.js +++ b/pages/task/detail/composables/useVoteSystem.js @@ -2,8 +2,10 @@ * 投票系统 Composable */ import { ref, computed } from 'vue' +import { NETWORK_CONFIG } from '@/config/network.js' -export function useVoteSystem() { +export function useVoteSystem(dependencies = {}) { + const { parseJwtToken, checkExistingTeam } = dependencies // 响应式数据 const activeVote = ref(null) const voteHistory = ref([]) @@ -24,6 +26,11 @@ export function useVoteSystem() { }) // 方法 + // 响应式数据 - 用于存储多个投票 + const activeTeamVotes = ref([]) + const voteLoadingLocal = ref(false) + const withdrawLoading = ref(false) + const fetchActiveVote = async (teamId) => { if (!teamId) return @@ -57,6 +64,31 @@ export function useVoteSystem() { } } + // 加载进行中的投票(多个) + const loadTeamVotes = async (teamId) => { + if (!teamId) return + + try { + const token = uni.getStorageSync('accessToken') + if (!token) { + console.warn('loadTeamVotes: 未找到 token') + return + } + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/team-vote/active-votes?teamId=${teamId}`, + method: 'GET', + header: { 'Access-Token': `Bearer ${token}` } + }) + + if (response.data && response.data.success) { + activeTeamVotes.value = response.data.data || [] + } + } catch (error) { + console.error('加载进行中的投票失败:', error) + } + } + const fetchVoteHistory = async (teamId) => { if (!teamId) return @@ -67,7 +99,7 @@ export function useVoteSystem() { } const response = await uni.request({ - url: `${NETWORK_CONFIG.API_BASE_URL}/team-vote/history/${teamId}`, + url: `${NETWORK_CONFIG.API_BASE_URL}/team-vote/history?teamId=${teamId}`, method: 'GET', header: { 'Access-Token': `Bearer ${token}` @@ -82,8 +114,220 @@ export function useVoteSystem() { } } - const submitVote = async (voteId, approve) => { - if (!voteId) return + // 加载投票历史(别名) + const loadVoteHistory = fetchVoteHistory + + // 通过 messageId 投票(用于任务详情页面) + const submitVoteByMessage = async (messageId, voteChoice, activeTeamVotesList = null) => { + if (!messageId) { + uni.showToast({ title: '未找到投票消息', icon: 'none' }) + return false + } + + voteLoadingLocal.value = true + try { + const token = uni.getStorageSync('accessToken') + if (!token) { + uni.showToast({ title: '请先登录', icon: 'none' }) + return false + } + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/message/vote`, + method: 'POST', + data: { + messageId: messageId, + voteChoice: voteChoice, // 1=同意, 2=反对 + voteReason: '' + }, + header: { + 'Access-Token': `Bearer ${token}`, + 'Content-Type': 'application/json' + } + }) + + // 解析响应数据 + let responseData + if (typeof response.data === 'string') { + try { + responseData = JSON.parse(response.data) + } catch (e) { + responseData = { success: false, message: '响应数据格式错误' } + } + } else { + responseData = response.data + } + + if (responseData && responseData.success) { + uni.showToast({ + title: voteChoice === 1 ? '已投票同意' : '已投票反对', + icon: 'success' + }) + return true + } else { + throw new Error(responseData?.message || '投票失败') + } + } catch (err) { + console.error('投票失败:', err) + uni.showToast({ + title: err.message || '投票失败', + icon: 'none' + }) + return false + } finally { + voteLoadingLocal.value = false + } + } + + // 通过 voteId 查找 messageId 并投票 + const findMessageIdByVoteId = async (voteId, activeTeamVotesList = null) => { + const votes = activeTeamVotesList || activeTeamVotes.value + let vote = votes.find(v => v.voteId === voteId || v.id === voteId || String(v.voteId) === String(voteId) || String(v.id) === String(voteId)) + + if (!vote) { + return null + } + + let messageId = vote.messageId + + // 如果没有 messageId,通过精准接口查询 + if (!messageId && vote.voteId) { + try { + const token = uni.getStorageSync('accessToken') + const messageResponse = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/message/get-by-vote`, + method: 'GET', + data: { voteId: vote.voteId }, + header: { 'Access-Token': `Bearer ${token}` } + }) + + if (messageResponse.statusCode === 200 && messageResponse.data?.success && messageResponse.data?.messageId) { + messageId = messageResponse.data.messageId + } + } catch (msgError) { + console.error('通过精准接口查询 messageId 失败:', msgError) + } + } + + return messageId + } + + // 投票(通过 voteId,自动查找 messageId) + const voteOnProposal = async (voteId, approve, activeTeamVotesList = null) => { + if (!voteId) { + uni.showToast({ title: '投票ID不存在', icon: 'none' }) + return false + } + + const messageId = await findMessageIdByVoteId(voteId, activeTeamVotesList) + if (!messageId) { + uni.showToast({ title: '未找到投票消息,请通过消息中心投票', icon: 'none' }) + return false + } + + const voteChoice = approve ? 1 : 2 // 1=同意, 2=反对 + return await submitVoteByMessage(messageId, voteChoice, activeTeamVotesList) + } + + // 提交投票(通过 voteId 和 voteChoice) + const submitVote = async (voteId, voteChoice, activeTeamVotesList = null, teamId = null) => { + if (!voteId) { + uni.showToast({ title: '投票ID不存在', icon: 'none' }) + return false + } + + voteLoadingLocal.value = true + try { + const messageId = await findMessageIdByVoteId(voteId, activeTeamVotesList) + if (!messageId) { + uni.showToast({ title: '未找到投票消息,请通过消息中心投票', icon: 'none' }) + return false + } + + const success = await submitVoteByMessage(messageId, voteChoice, activeTeamVotesList) + + // 重新加载投票数据 + if (success && teamId && loadTeamVotes) { + await loadTeamVotes(teamId) + } + + return success + } finally { + voteLoadingLocal.value = false + } + } + + // 提交候选人投票(选举投票) + const submitCandidateVote = async (voteId, candidateId, activeTeamVotesList = null, teamId = null) => { + if (!voteId || !candidateId) { + uni.showToast({ title: '投票ID或候选人ID不存在', icon: 'none' }) + return false + } + + voteLoadingLocal.value = true + try { + const messageId = await findMessageIdByVoteId(voteId, activeTeamVotesList) + if (!messageId) { + uni.showToast({ title: '未找到投票消息,请通过消息中心投票', icon: 'none' }) + return false + } + + const token = uni.getStorageSync('accessToken') + if (!token) { + uni.showToast({ title: '请先登录', icon: 'none' }) + return false + } + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/message/vote`, + method: 'POST', + data: { + messageId: messageId, + voteChoice: 1, // 同意 + voteReason: '', + candidateId: candidateId + }, + header: { + 'Access-Token': `Bearer ${token}`, + 'Content-Type': 'application/json' + } + }) + + // 解析响应数据 + let responseData + if (typeof response.data === 'string') { + try { + responseData = JSON.parse(response.data) + } catch (e) { + responseData = { success: false, message: '响应数据格式错误' } + } + } else { + responseData = response.data + } + + if (responseData && responseData.success) { + uni.showToast({ title: '投票成功', icon: 'success' }) + + // 重新加载投票数据 + if (teamId && loadTeamVotes) { + await loadTeamVotes(teamId) + } + return true + } else { + throw new Error(responseData?.message || '投票失败') + } + } catch (err) { + console.error('投票失败:', err) + uni.showToast({ title: err.message || '投票失败', icon: 'none' }) + return false + } finally { + voteLoadingLocal.value = false + } + } + + // 通过 team-vote API 投票(原方法,保留兼容) + const submitVoteDirect = async (voteId, approve) => { + if (!voteId) return false try { const token = uni.getStorageSync('accessToken') @@ -92,7 +336,7 @@ export function useVoteSystem() { } const response = await uni.request({ - url: '${NETWORK_CONFIG.API_BASE_URL}/team-vote/vote', + url: `${NETWORK_CONFIG.API_BASE_URL}/team-vote/vote`, method: 'POST', data: { voteId: voteId, @@ -135,7 +379,7 @@ export function useVoteSystem() { } const response = await uni.request({ - url: '${NETWORK_CONFIG.API_BASE_URL}/team-vote/initiate-remove', + url: `${NETWORK_CONFIG.API_BASE_URL}/team-vote/initiate-remove-member`, method: 'POST', data: { teamId: teamId, @@ -179,7 +423,7 @@ export function useVoteSystem() { } const response = await uni.request({ - url: '${NETWORK_CONFIG.API_BASE_URL}/team-vote/initiate-impeach', + url: `${NETWORK_CONFIG.API_BASE_URL}/team-vote/initiate-impeach-leader`, method: 'POST', data: { teamId: teamId, @@ -226,18 +470,87 @@ export function useVoteSystem() { 0: '进行中', 1: '已通过', 2: '已拒绝', - 3: '已超时' + 3: '已取消', + 5: '已结束' } return statusMap[status] || '未知状态' } + // 撤回投票(通过 messageId) + const withdrawVote = async (voteId, activeTeamVotesList = null, teamId = null) => { + if (!voteId) { + uni.showToast({ title: '投票ID不存在', icon: 'none' }) + return false + } + + withdrawLoading.value = true + + try { + const token = uni.getStorageSync('accessToken') + if (!token) { + uni.showToast({ title: '请先登录', icon: 'none' }) + return false + } + + const messageId = await findMessageIdByVoteId(voteId, activeTeamVotesList) + if (!messageId) { + uni.showToast({ title: '未找到投票消息,请通过消息中心撤回', icon: 'none' }) + return false + } + + const response = await uni.request({ + url: `${NETWORK_CONFIG.API_BASE_URL}/message/withdraw-vote`, + method: 'POST', + data: { messageId: messageId }, + header: { + 'Access-Token': `Bearer ${token}`, + 'Content-Type': 'application/json' + } + }) + + // 解析响应数据 + let responseData + if (typeof response.data === 'string') { + try { + responseData = JSON.parse(response.data) + } catch (e) { + responseData = { success: false, message: '响应数据格式错误' } + } + } else { + responseData = response.data + } + + if (responseData && responseData.success) { + uni.showToast({ title: '投票已撤回', icon: 'success' }) + + // 重新加载投票数据 + if (teamId && loadTeamVotes) { + await loadTeamVotes(teamId) + } + + return true + } else { + throw new Error(responseData?.message || '撤回失败') + } + } catch (err) { + console.error('撤回投票失败:', err) + uni.showToast({ title: err.message || '撤回失败,请重试', icon: 'none' }) + return false + } finally { + withdrawLoading.value = false + } + } + return { // 响应式数据 activeVote, + activeTeamVotes, voteHistory, hasVoted, userVote, voteLoading, + voteLoadingLocal, + withdrawLoading, voteError, // 计算属性 @@ -247,7 +560,15 @@ export function useVoteSystem() { // 方法 fetchActiveVote, fetchVoteHistory, + loadTeamVotes, + loadVoteHistory, submitVote, + submitVoteByMessage, + voteOnProposal, + submitCandidateVote, + submitVoteDirect, + findMessageIdByVoteId, + withdrawVote, initiateRemoveVote, initiateImpeachVote, getVoteTypeText, diff --git a/pages/task/detail/composables/useWebSocketHandlers.js b/pages/task/detail/composables/useWebSocketHandlers.js new file mode 100644 index 00000000..6eb6861b --- /dev/null +++ b/pages/task/detail/composables/useWebSocketHandlers.js @@ -0,0 +1,260 @@ +/** + * WebSocket 消息处理 Composable + * 处理来自 WebSocket 的团队相关消息 + */ +export function useWebSocketHandlers(dependencies = {}) { + const { taskId, checkExistingTeam, loadTeamVotes, loadVoteHistory } = dependencies + + /** + * 检查消息是否与当前任务相关 + */ + const isMessageRelated = (message) => { + const currentTaskId = typeof taskId === 'function' ? taskId() : taskId + return message.taskId && String(message.taskId) === String(currentTaskId) + } + + /** + * 处理团队成员变更消息 + */ + const handleTeamMemberChange = async (message) => { + if (!isMessageRelated(message)) return + + // 重新获取团队信息 + if (checkExistingTeam) { + await checkExistingTeam() + } + + // 显示通知 + if (message.action === 'join') { + uni.showToast({ + title: '有新成员加入团队', + icon: 'success', + duration: 2000 + }) + } else if (message.action === 'leave') { + uni.showToast({ + title: '有成员离开团队', + icon: 'none', + duration: 2000 + }) + } else if (message.action === 'remove') { + uni.showToast({ + title: '有成员被移除', + icon: 'none', + duration: 2000 + }) + } + } + + /** + * 处理团队邀请消息 + */ + const handleTeamInvitationMessage = async (message) => { + if (!isMessageRelated(message)) return + + // 重新获取团队信息以更新待处理邀请 + if (checkExistingTeam) { + await checkExistingTeam() + } + + uni.showToast({ + title: '收到新的团队邀请', + icon: 'success', + duration: 2000 + }) + } + + /** + * 处理团队成员加入消息 + */ + const handleTeamMemberJoined = async (message) => { + if (!isMessageRelated(message)) return + + // 重新获取团队信息 + if (checkExistingTeam) { + await checkExistingTeam() + } + + // 显示通知 + uni.showToast({ + title: `${message.newMemberName || '新成员'} 加入了团队`, + icon: 'success', + duration: 2000 + }) + } + + /** + * 处理团队成员退出消息 + */ + const handleTeamMemberLeft = async (message) => { + if (!isMessageRelated(message)) return + + // 重新获取团队信息 + if (checkExistingTeam) { + await checkExistingTeam() + } + + // 显示通知 + uni.showToast({ + title: `${message.leftMemberName || '成员'} 退出了团队`, + icon: 'none', + duration: 2000 + }) + } + + /** + * 处理团队成员被移除消息 + */ + const handleTeamMemberRemoved = async (message) => { + if (!isMessageRelated(message)) return + + // 重新获取团队信息 + if (checkExistingTeam) { + await checkExistingTeam() + } + + // 显示通知 + uni.showToast({ + title: `${message.removedMemberName || '成员'} 被移除了`, + icon: 'none', + duration: 2000 + }) + } + + /** + * 处理团队投票发起消息 + */ + const handleTeamVoteInitiated = async (message) => { + if (!isMessageRelated(message)) return + + // 重新获取团队信息和投票数据 + if (checkExistingTeam) { + await checkExistingTeam() + } + + // 如果有团队ID,重新加载投票数据 + const teamId = message.teamId + if (teamId) { + if (loadTeamVotes) { + await loadTeamVotes(teamId) + } + if (loadVoteHistory) { + await loadVoteHistory(teamId) + } + } + + // 显示通知 + uni.showToast({ + title: `有新的${message.voteTitle || '投票'}发起`, + icon: 'none', + duration: 2000 + }) + } + + /** + * 处理团队投票结果消息 + */ + const handleTeamVoteResult = async (message) => { + if (!isMessageRelated(message)) return + + // 重新获取团队信息和投票数据 + if (checkExistingTeam) { + await checkExistingTeam() + } + + // 如果有团队ID,重新加载投票数据 + const teamId = message.teamId + if (teamId) { + if (loadTeamVotes) { + await loadTeamVotes(teamId) + } + if (loadVoteHistory) { + await loadVoteHistory(teamId) + } + } + + // 显示通知 + let resultText = '' + if (message.resultType === 'member_removed') { + resultText = '投票通过,成员已被移除' + } else if (message.resultType === 'leader_impeached') { + resultText = '投票通过,队长已被弹劾' + } else { + resultText = '投票结果已出' + } + + uni.showToast({ + title: resultText, + icon: 'none', + duration: 2000 + }) + } + + /** + * 处理任务取消申请被同意的事件 + */ + const handleTaskCancelApproved = async (message, fetchTaskDetail, checkUserApplied, checkPendingMessages) => { + const currentTaskId = typeof taskId === 'function' ? taskId() : taskId + if (message.taskId && String(message.taskId) === String(currentTaskId)) { + // 刷新任务详情 + if (fetchTaskDetail) { + await fetchTaskDetail(currentTaskId) + } + // 重新检查用户申请状态 + if (checkUserApplied) { + await checkUserApplied() + } + // 重新检查待处理消息 + if (checkPendingMessages) { + await checkPendingMessages() + } + uni.showToast({ + title: '任务已取消,状态已更新', + icon: 'success' + }) + } + } + + /** + * 注册所有 WebSocket 事件监听器 + */ + const registerWebSocketListeners = () => { + uni.$on('team-member-change', handleTeamMemberChange) + uni.$on('team-invitation', handleTeamInvitationMessage) + uni.$on('team-member-joined', handleTeamMemberJoined) + uni.$on('team-member-left', handleTeamMemberLeft) + uni.$on('team-member-removed', handleTeamMemberRemoved) + uni.$on('team-vote-initiated', handleTeamVoteInitiated) + uni.$on('team-vote-result', handleTeamVoteResult) + } + + /** + * 取消注册所有 WebSocket 事件监听器 + */ + const unregisterWebSocketListeners = () => { + uni.$off('team-member-change', handleTeamMemberChange) + uni.$off('team-invitation', handleTeamInvitationMessage) + uni.$off('team-member-joined', handleTeamMemberJoined) + uni.$off('team-member-left', handleTeamMemberLeft) + uni.$off('team-member-removed', handleTeamMemberRemoved) + uni.$off('team-vote-initiated', handleTeamVoteInitiated) + uni.$off('team-vote-result', handleTeamVoteResult) + } + + return { + // 处理方法 + handleTeamMemberChange, + handleTeamInvitationMessage, + handleTeamMemberJoined, + handleTeamMemberLeft, + handleTeamMemberRemoved, + handleTeamVoteInitiated, + handleTeamVoteResult, + handleTaskCancelApproved, + + // 事件管理 + registerWebSocketListeners, + unregisterWebSocketListeners + } +} + diff --git a/pages/task/detail/composables/useWorkOperations.js b/pages/task/detail/composables/useWorkOperations.js new file mode 100644 index 00000000..4a4d7974 --- /dev/null +++ b/pages/task/detail/composables/useWorkOperations.js @@ -0,0 +1,69 @@ +/** + * 工作记录操作 Composable + * 整合工作记录相关的高级操作函数,包括加载状态管理 + */ +import { ref } from 'vue' + +export function useWorkOperations(dependencies = {}) { + const { + taskData, + task, + taskId, + workRecordsComposable + } = dependencies + + // 工作状态 + const startWorking = ref(false) + const endWorking = ref(false) + + /** + * 获取工作记录 + */ + const fetchWorkTimes = () => { + const taskIdVal = taskData.value?.taskId || task.value?.taskId || taskId + return workRecordsComposable.fetchWorkTimes(taskIdVal) + } + + /** + * 开始工作(包含加载状态管理) + */ + const startWork = async () => { + if (startWorking.value) return + startWorking.value = true + try { + const taskIdVal = taskData.value?.taskId || task.value?.taskId + const success = await workRecordsComposable.startWork(taskIdVal) + if (success) { + await fetchWorkTimes() + } + } finally { + startWorking.value = false + } + } + + /** + * 结束工作(包含加载状态管理) + */ + const endWork = async () => { + if (endWorking.value) return + endWorking.value = true + try { + const taskIdVal = taskData.value?.taskId || task.value?.taskId + const success = await workRecordsComposable.endWork(taskIdVal) + if (success) { + await fetchWorkTimes() + } + } finally { + endWorking.value = false + } + } + + return { + startWorking, + endWorking, + fetchWorkTimes, + startWork, + endWork + } +} + diff --git a/pages/task/detail/composables/useWorkRecords.js b/pages/task/detail/composables/useWorkRecords.js index 0fc2262d..33c4e5a1 100644 --- a/pages/task/detail/composables/useWorkRecords.js +++ b/pages/task/detail/composables/useWorkRecords.js @@ -2,8 +2,10 @@ * 工作记录 Composable */ import { ref, computed } from 'vue' +import { NETWORK_CONFIG } from '@/config/network.js' -export function useWorkRecords() { +export function useWorkRecords(dependencies = {}) { + const { taskData, taskId } = dependencies // 响应式数据 const workTimes = ref([]) const workLoading = ref(false) @@ -49,8 +51,9 @@ export function useWorkRecords() { } // 方法 - const fetchWorkTimes = async (taskId) => { - if (!taskId) return + const fetchWorkTimes = async (taskIdParam = null) => { + const taskIdVal = taskIdParam || taskId || (taskData?.value?.taskId) || taskData?.taskId + if (!taskIdVal) return workLoading.value = true workError.value = '' @@ -62,15 +65,23 @@ export function useWorkRecords() { } const response = await uni.request({ - url: `${NETWORK_CONFIG.API_BASE_URL}/work-time/task/${taskId}`, + url: `${NETWORK_CONFIG.API_BASE_URL}/work/times?taskId=${taskIdVal}`, method: 'GET', header: { 'Access-Token': `Bearer ${token}` } }) - if (response.data && response.data.success) { - workTimes.value = response.data.data || [] + if (response.statusCode === 200 && response.data !== undefined) { + // 处理不同的响应格式 + const normalizeArrayResponse = (resData) => { + if (Array.isArray(resData)) return resData + if (resData && Array.isArray(resData.data)) return resData.data + if (resData && Array.isArray(resData.result)) return resData.result + if (resData && Array.isArray(resData.payload)) return resData.payload + return [] + } + workTimes.value = normalizeArrayResponse(response.data) } } catch (err) { workError.value = err.message || '获取工作记录失败' @@ -80,8 +91,12 @@ export function useWorkRecords() { } } - const startWork = async (taskId) => { - if (!taskId) return + const startWork = async (taskIdParam = null) => { + const taskIdVal = taskIdParam || taskId || (taskData?.value?.taskId) || taskData?.taskId + if (!taskIdVal) { + uni.showToast({ title: '任务 ID 缺失', icon: 'none' }) + return false + } try { const token = uni.getStorageSync('accessToken') @@ -89,27 +104,26 @@ export function useWorkRecords() { throw new Error('请先登录') } + uni.showLoading({ title: '开始中...' }) const response = await uni.request({ - url: '${NETWORK_CONFIG.API_BASE_URL}/work-time/start', + url: `${NETWORK_CONFIG.API_BASE_URL}/work/start?taskId=${taskIdVal}`, method: 'POST', - data: { - taskId: taskId - }, header: { 'Access-Token': `Bearer ${token}`, 'Content-Type': 'application/json' } }) - if (response.data && response.data.success) { + uni.hideLoading() + if (response.statusCode === 200 && response.data) { isWorking.value = true currentWorkStart.value = new Date() uni.showToast({ - title: '开始工作', + title: '开始工作成功!', icon: 'success' }) // 刷新工作记录 - await fetchWorkTimes(taskId) + await fetchWorkTimes(taskIdVal) return true } else { throw new Error(response.data?.message || '开始工作失败') @@ -124,8 +138,12 @@ export function useWorkRecords() { } } - const endWork = async (taskId, description = '') => { - if (!taskId) return + const endWork = async (taskIdParam = null, description = '') => { + const taskIdVal = taskIdParam || taskId || (taskData?.value?.taskId) || taskData?.taskId + if (!taskIdVal) { + uni.showToast({ title: '任务 ID 缺失', icon: 'none' }) + return false + } try { const token = uni.getStorageSync('accessToken') @@ -133,28 +151,26 @@ export function useWorkRecords() { throw new Error('请先登录') } + uni.showLoading({ title: '结束中...' }) const response = await uni.request({ - url: '${NETWORK_CONFIG.API_BASE_URL}/work-time/end', + url: `${NETWORK_CONFIG.API_BASE_URL}/work/end?taskId=${taskIdVal}`, method: 'POST', - data: { - taskId: taskId, - description: description - }, header: { 'Access-Token': `Bearer ${token}`, 'Content-Type': 'application/json' } }) - if (response.data && response.data.success) { + uni.hideLoading() + if (response.statusCode === 200 && response.data) { isWorking.value = false currentWorkStart.value = null uni.showToast({ - title: '结束工作', + title: '结束工作成功!', icon: 'success' }) // 刷新工作记录 - await fetchWorkTimes(taskId) + await fetchWorkTimes(taskIdVal) return true } else { throw new Error(response.data?.message || '结束工作失败') diff --git a/pages/task/detail/index-backup.vue b/pages/task/detail/index-backup.vue deleted file mode 100644 index 8c970c06..00000000 --- a/pages/task/detail/index-backup.vue +++ /dev/null @@ -1,4712 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/pages/task/detail/index-refactored.vue b/pages/task/detail/index-refactored.vue deleted file mode 100644 index 32e363e0..00000000 --- a/pages/task/detail/index-refactored.vue +++ /dev/null @@ -1,577 +0,0 @@ - - - - - - diff --git a/pages/task/detail/index-simple.vue b/pages/task/detail/index-simple.vue deleted file mode 100644 index 823527ab..00000000 --- a/pages/task/detail/index-simple.vue +++ /dev/null @@ -1,352 +0,0 @@ - - - - - - diff --git a/pages/task/detail/index.vue b/pages/task/detail/index.vue index cc353b5b..df8f4109 100644 --- a/pages/task/detail/index.vue +++ b/pages/task/detail/index.vue @@ -4,1059 +4,257 @@ scroll-y="true" :refresher-enabled="true" :refresher-triggered="refreshing" - :scroll-into-view="scrollIntoView" + :scroll-into-view="scrollIntoView || ''" + :enhanced="true" + :enable-passive="true" + :show-scrollbar="false" @refresherrefresh="onRefresh" + @scroll="onScroll" class="scroll-container" > 加载中... {{ error }} - + - - - - - {{ taskData?.title }} - {{ getStatusText(taskData?.status) }} - - 发布者:{{ taskData?.userName || '未知用户' }} ({{ taskData?.orgName || '未知企业' }}) - 发布时间:{{ taskData?.publishTime }} - 截止日期:{{ taskData?.deadline }} - - - - - 任务描述: - {{ taskData?.description }} - - - 悬赏金额: - {{ formatNumber(taskData?.reward) }} 元 - - - 当前支付: - {{ formatNumber(taskData?.currentPaid) }} 元 - - - 任务状态: - {{ getStatusText(taskData?.status) }} - - - - 挑战者: - - 团队ID {{ formatNumber(taskData?.teamId) }} - - - - - - 任务类型: - 团队任务 - - + + + + + + + - - 团队成员 ({{ teamInfo.members.length }}) - - - - - {{ getUserNickname(member.userId) }} - {{ (member.role === 1 || member.role === '1') ? '队长' : '队员' }} - {{ member.statusText }} - - - - - - - - - - - - - - - 调试信息:
- isTeamLeader: {{ isTeamLeader }}
- taskStatus: {{ taskData?.status }}
- member.role: {{ member.role }}
- member.role原始值: {{ JSON.stringify(member.role) }}
- member.userId: {{ member.userId }}
- currentUserId: {{ currentUserId }}
- isTaskPublisher: {{ isTaskPublisher }}
- - 条件检查结果:
- 踢人条件: {{ isTeamLeader && (member.role !== 1 && member.role !== '1') && taskData?.status === '2' }}
- 转让队长条件: {{ isTeamLeader && (member.role !== 1 && member.role !== '1') && taskData?.status === '2' }}
- 弹劾队长条件: {{ !isTeamLeader && (member.role === 1 || member.role === '1') && taskData?.status === '2' }}
- 退出条件: {{ !isTeamLeader && member.userId == currentUserId }}
- 详细检查:
- - isTeamLeader值: {{ isTeamLeader }}
- - member.role !== 1: {{ member.role !== 1 }}
- - member.role !== '1': {{ member.role !== '1' }}
- - taskData?.status === '2': {{ taskData?.status === '2' }}
- - member.role === 1: {{ member.role === 1 }}
- - member.role === '1': {{ member.role === '1' }}
-
-
-
-
-
-
- - - - 团队任务 - - 团队信息加载中... - - + - - 进行中的投票 ({{ activeTeamVotes.length }}) - - - - {{ getVoteTitle(vote) }} - - {{ getVoteTypeText(vote.voteType) }} - - - - 原因: {{ vote.reason || '无' }} - 发起人: {{ getUserNickname(vote.initiatorId) }} - 目标: {{ getUserNickname(vote.targetUserId) }} - - 截止时间: {{ formatDateTime(vote.expiresAt) }} - - (剩余: {{ formatCountdown(vote.remainingSeconds) }}) - - - - - - - - 同意: - {{ vote.approveCount || 0 }}人 - - - 反对: - {{ vote.rejectCount || 0 }}人 - - - 未投: - {{ vote.pendingCount || 0 }}人 - - - - {{ vote.progressType === 'participation' ? - `需要${vote.requiredVotes || 0}人参与投票` : - getVoteRuleText(vote.voteType, vote.requiredVotes, vote.totalVoters) - }} - - - - - - - - 请选择新队长: - - - - {{ getUserNickname(member.userId) }} - - - - - - - - - - - - - - - 您已投票: {{ getVoteChoiceText(vote.userVote, vote.voteType) }} - - - - - - + - - 投票记录 - - - - {{ getVoteTitle(vote) }} - - {{ getVoteStatusText(vote.status || vote.voteStatus) }} - - - - 发起人: {{ getUserNickname(vote.initiatorId) }} - 目标: {{ getUserNickname(vote.targetUserId) }} - 原因: {{ vote.reason || '无' }} - - 发起时间: {{ formatDateTime(vote.createdAt) }} - - - 结束时间: {{ formatDateTime(vote.endedAt) }} - - - - - 投票详情: - - - {{ getUserNickname(detail.voterId) }} - - {{ getVoteChoiceDetailText(detail.voteChoice, vote.voteType) }} - - 理由: {{ detail.voteReason }} - - - - - - 结果: 同意{{ vote.approvalVotes || vote.approveCount || 0 }}票, - 反对{{ vote.rejectionVotes || vote.rejectCount || 0 }}票 - - - - - +
- - - - + - - - - - - - - - - - - - - - - 有待处理的消息 - - • 任务申请待处理 - • 取消申请待处理 - • 完成申请待处理 - - - - - - - - 我的工作记录 - 加载中... - {{ workError }} - - 暂无记录 - - - - 开始 - {{ formatDateTime(wt.startTime || wt.start_at || wt.start) }} - - - 结束 - {{ (wt.endTime || wt.end_at || wt.end) ? formatDateTime(wt.endTime || wt.end_at || wt.end) : '进行中' }} - - - - - - - - - - - - - - - - - - - - - - 完成任务可获得荣誉 - - - {{ getBadgeNameByAssociation(badge.association)}} Lv{{ formatNumber(badge.level) }} - 贡献者: - - - UID: {{ formatNumber(contributor.uid) }} - {{ contributor.role }} - {{ formatPercentage(contributor.percentage) }}% - - - 评价: {{ badge.evaluation }} - - - 暂无徽章 - - - - - - - - {{ formatCharacterCount(challengeContent.length) }}/1000 - - - - - - - - - - 选择您的角色 - - - - - 👑 - 我是队长 - 已选择 - - 创建团队,邀请队员,管理团队事务 - - • 创建和管理团队 - • 邀请和移除队员 - • 提交挑战申请 - • 分配团队任务 - - - - - - - 🤝 - 我是队员 - 已选择 - - 加入现有团队,参与团队协作 - - • 接受队长邀请 - • 参与团队讨论 - • 完成分配任务 - • 协助团队决策 - - - - - - - - - - 团队信息 - - 团队名称: - - - - - - {{ teamInfo.teamName || '临时团队' }} - (任务发布者,仅可查看) - (您不是队长,无法修改团队名称) - - - - 团队状态: - {{ getTeamStatusText(teamInfo.status) }} - - - - - - - - 进行中的投票 - - - - {{ vote.voteTitle || (vote.voteType === 1 ? '踢人投票' : (vote.voteType === 2 ? '弹劾投票' : '投票')) }} - {{ vote.voteTitle || (vote.voteType === 1 ? '踢人投票' : (vote.voteType === 2 ? '弹劾投票' : '投票')) }} - - - 原因: {{ vote.reason }} - 发起人: {{ getUserNickname(vote.initiatorId) }} - 目标: {{ getUserNickname(vote.targetUserId) }} - - - - 投票结果 - - - 同意: - {{ vote.approveCount || 0 }}人 - - - 反对: - {{ vote.rejectCount || 0 }}人 - - - 未投: - {{ vote.pendingCount || 0 }}人 - - - - {{ vote.progressType === 'participation' ? - `需要${vote.requiredVotes || 0}人参与投票(不管投给谁)` : - getVoteRuleText(vote) - }} - - - - - - - - 您已投票: {{ vote.userVote ? '同意' : '反对' }} - - - - - - - - - 团队成员 ({{ teamInfo.members.length }}) - - - - - {{ getUserNickname(member.userId) }} - {{ (member.role === 1 || member.role === '1') ? '队长' : '队员' }} - {{ member.statusText }} - - - - - - - - - - - - - - - - 调试信息:
- isTeamLeader: {{ isTeamLeader }}
- taskStatus: {{ taskData?.status }}
- member.role: {{ member.role }}
- member.role原始值: {{ JSON.stringify(member.role) }}
- member.userId: {{ member.userId }}
- currentUserId: {{ currentUserId }}
- isTaskPublisher: {{ isTaskPublisher }}
- - 条件检查结果:
- 踢人条件: {{ isTeamLeader && (member.role !== 1 && member.role !== '1') && taskData?.status === '2' }}
- 转让队长条件: {{ isTeamLeader && (member.role !== 1 && member.role !== '1') && taskData?.status === '2' }}
- 弹劾队长条件: {{ !isTeamLeader && (member.role === 1 || member.role === '1') && taskData?.status === '2' }}
- 退出条件: {{ !isTeamLeader && member.userId == currentUserId }}
- 详细检查:
- - isTeamLeader值: {{ isTeamLeader }}
- - member.role !== 1: {{ member.role !== 1 }}
- - member.role !== '1': {{ member.role !== '1' }}
- - taskData?.status === '2': {{ taskData?.status === '2' }}
- - member.role === 1: {{ member.role === 1 }}
- - member.role === '1': {{ member.role === '1' }}
-
-
-
-
-
-
- - - - - - - - - 待处理邀请 ({{ teamInfo.pendingInvitations.length }}) - - - - - {{ getUserNickname(invitation.userId) }} - {{ formatTime(invitation.sendTime) }} - - - - - - - - 团队名称 - - - - - - 邀请成员 - 可以邀请好友或搜索其他用户加入团队 - - - - - - - - - - - - 团队已解散,无法邀请新成员。请先重新创建团队。 - - - - 搜索中... - {{ searchError }} - - 没有找到相关好友 - - - - - - - {{ friend.friendNickname || friend.nickname || '未知用户' }} - - 好友 - 待确认 - 非好友 - - - UID: {{ friend.friendId || friend.uid || friend.id }} - - - - - 已邀请 - - - - - - 请输入好友昵称或UID开始搜索 - - - -
- - - - - - - - - - - 您选择了队员角色 - 请等待队长邀请您加入团队,或联系队长创建团队 - - - -
-
+ + + + + + + + + + + + + - - - - 申请取消任务 - - - - - 取消原因: - - - {{ formatCharacterCount(cancelReason.length) }}/200 - - - - - - - - - + - - - - 修改任务信息 - - - - - - 修改次数:{{ taskEditInfo?.editCount || 0 }}/3 - 剩余修改次数:{{ taskEditInfo?.remainingEdits || 3 }} - - - - 任务标题: - - - - - 任务描述: - - - {{ editTaskForm.description.length }}/1000 - - - - - 任务地址: - - - - - 悬赏金额: - - - - - - - - - + - - 申请完成详情 - - 完成证明: - - {{ completePreview?.proof || '—' }} - - - - 铭牌分配: - - - - {{ getBadgeNameByAssociation(b.association || b.assoc) || '徽章' }} Lv{{ formatNumber(b.level || 0) }} - - - 贡献者 - - - {{ getUserName(c.uid) }} - - 角色 - {{ c.role || '—' }} - 贡献比例(%) - {{ formatPercentage(c.percentage) }}% - - - - 暂无数据 - - - - - 申请完成任务 - - 完成证明: - - - - {{ formatCharacterCount(completeProof.length) }}/500 - - - - - 铭牌分配: - - - {{ getBadgeNameByAssociation(badge.association) }} Lv{{ formatNumber(badge.level) }} - - - 分配给队员 - - - - 当前用户 ({{ currentUserId }}) - - - 角色 - - 贡献比例(%) - - - - - 总百分比: {{ formatPercentage(calculateTotalPercentage(badge.id)) }}% - (必须等于100%) - - - - - - - - - - - - - - - - + + + +
- - - \ No newline at end of file diff --git a/src/manifest.json b/src/manifest.json index 8977f9e1..b6fd79f3 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -96,15 +96,12 @@ "lazyCodeLoading" : "requiredComponents" }, "usingComponents" : true, + "requiredPrivateInfos" : [ "getLocation", "chooseLocation" ], "permission" : { - "scope.camera" : { - "desc" : "需要使用您的相机进行人脸识别" - }, "scope.userLocation" : { - "desc" : "需要获取您的位置信息,用于推荐附近的任务" + "desc" : "你的位置信息将用于小程序位置接口的效果" } - }, - "requiredPrivateInfos" : [ "getLocation", "chooseLocation" ] + } }, "mp-alipay" : { "usingComponents" : true diff --git a/src/pages.json b/src/pages.json index 84828663..2a1f866c 100644 --- a/src/pages.json +++ b/src/pages.json @@ -508,7 +508,7 @@ }, "uniIdRouter": {}, "easycom": { - "autoscan": true, + "autoscan": false, "custom": { "^uni-(.*)": "@dcloudio/uni-ui/lib/uni-$1/uni-$1.vue" } diff --git a/store/user.ts b/store/user.ts index 02e93672..57a16407 100644 --- a/store/user.ts +++ b/store/user.ts @@ -111,6 +111,38 @@ export const useUserStore = defineStore('user', { data = raw } + // 检查用户是否被封禁 + // 检查多种可能的封禁字段名 + const isBanned = data.is_banned === true || + data.isBanned === true || + data.banned === true || + data.uidStatus === 'banned' || + (data.uidStatus && String(data.uidStatus).toLowerCase() === 'banned'); + + if (isBanned) { + console.error('用户已被封禁,无法登录:', data); + if (NETWORK_CONFIG.DEBUG) { + console.log('=== 封禁状态详细信息 ==='); + console.log('完整用户数据:', JSON.stringify(data, null, 2)); + console.log('封禁字段检查:', { + is_banned: data.is_banned, + isBanned: data.isBanned, + banned: data.banned, + uidStatus: data.uidStatus + }); + console.log('请求URL:', `${NETWORK_CONFIG.API_BASE_URL}/user/me`); + console.log('========================'); + } + this.clearUserState() + uni.showToast({ + title: '用户已被封禁,无法登录', + icon: 'none', + duration: 3000 + }); + this.gotoLogin() + throw new Error('用户已被封禁,无法登录') + } + // 判定无效数据或业务提示token异常,统一跳转登录 const msg = String(data?.message || '').toLowerCase() const tokenInvalid = msg.includes('token') && (msg.includes('无效') || msg.includes('过期')) diff --git a/tsconfig.json b/tsconfig.json index aac039fc..93f68453 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -30,12 +30,14 @@ "include": [ "**/*.ts", "**/*.tsx", + "**/*.d.ts", "**/*.vue", "pages/**/*.ts", "pages/**/*.vue", "store/**/*.ts", - "utils/**/*.ts" -, "pages/social/chat-detail.vue正常", "pages/social/chat-detail.vue正常", "pages/social/chat-detail.vue3453", "pages/social/chat-detail.vuetrttt", "pages/social/chat-detail.vueccc", "pages/chat/detail.vueee" ], + "utils/**/*.ts", + "config/**/*.d.ts" + ], "exclude": [ "node_modules", "dist", diff --git a/unpackage/dist/cache/.vite/deps/_metadata.json b/unpackage/dist/cache/.vite/deps/_metadata.json deleted file mode 100644 index 839e1859..00000000 --- a/unpackage/dist/cache/.vite/deps/_metadata.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "hash": "726ed39c", - "configHash": "d2d03779", - "lockfileHash": "d03e2e84", - "browserHash": "9bd05295", - "optimized": {}, - "chunks": {} -} \ No newline at end of file diff --git a/unpackage/dist/cache/.vite/deps/package.json b/unpackage/dist/cache/.vite/deps/package.json deleted file mode 100644 index 3dbc1ca5..00000000 --- a/unpackage/dist/cache/.vite/deps/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} diff --git a/vite.config.js b/vite.config.js index 2e4e009d..238c5c51 100644 --- a/vite.config.js +++ b/vite.config.js @@ -11,9 +11,15 @@ export default defineConfig({ } }) ], - server: { - port: 3000, - host: 'localhost', - open: true - } + build: { + rollupOptions: { + output: { + chunkFileNames: 'js/chunk-[hash].js', + entryFileNames: 'js/[name]-[hash].js', + assetFileNames: '[ext]/[name]-[hash].[ext]' + } + } + }, + ssr: false // 明确禁用 SSR }) + diff --git a/vite.config.js.backup b/vite.config.js.backup new file mode 100644 index 00000000..ee091b79 --- /dev/null +++ b/vite.config.js.backup @@ -0,0 +1,48 @@ +import { defineConfig } from 'vite' +import uni from '@dcloudio/vite-plugin-uni' + +// 创建 uni 插件并确保配置正确 +const uniPluginConfig = { + vueOptions: { + compilerOptions: { + isCustomElement: (tag) => tag.startsWith('uni-') + } + } +} + +const uniPlugins = uni(uniPluginConfig) +// 确保返回的是数组,并过滤掉 undefined +const plugins = Array.isArray(uniPlugins) + ? uniPlugins.filter(Boolean) + : [uniPlugins].filter(Boolean) + +// 确保所有插件都有 vueOptions +plugins.forEach(plugin => { + if (plugin && typeof plugin === 'object') { + if (!plugin.vueOptions) { + plugin.vueOptions = uniPluginConfig.vueOptions || {} + } + } +}) + +export default defineConfig({ + plugins: plugins, + build: { + rollupOptions: { + output: { + // 使用固定格式,避免相对路径问题 + chunkFileNames: 'js/chunk-[hash].js', + entryFileNames: 'js/[name]-[hash].js', + assetFileNames: '[ext]/[name]-[hash].[ext]' + } + } + }, + optimizeDeps: { + include: ['@dcloudio/uni-ui'] + }, + server: { + port: 3000, + host: 'localhost', + open: true + } +}) -- Gitee From 089aa91dac3f3381b448fa9a79f9379d374c6309 Mon Sep 17 00:00:00 2001 From: "xb.Q" <3099068075@qq.com> Date: Tue, 30 Dec 2025 16:50:46 +0800 Subject: [PATCH 2/2] no message --- .hbuilderx/launch.json | 24 +- Dockerfile | 13 + UNI_APP_BUILD_FIX.md | 44 - api/auth.js | 118 + api/exam.js | 72 + api/skill.js | 67 + api/task.js | 151 + api/user.js | 186 + check_modified_file.py | 11 + dist/build/h5/index.html | 82 + .../exam/composables/useSpeechRecognition.js | 902 ++++ pages/exam/index.vue | 4541 +++-------------- utils/date.js | 62 + utils/formate.js | 61 + "\350\247\243\346\236\204.md" | 585 +++ 15 files changed, 2894 insertions(+), 4025 deletions(-) create mode 100644 Dockerfile delete mode 100644 UNI_APP_BUILD_FIX.md create mode 100644 api/auth.js create mode 100644 api/exam.js create mode 100644 api/skill.js create mode 100644 api/task.js create mode 100644 api/user.js create mode 100644 check_modified_file.py create mode 100644 dist/build/h5/index.html create mode 100644 pages/exam/composables/useSpeechRecognition.js create mode 100644 utils/date.js create mode 100644 utils/formate.js create mode 100644 "\350\247\243\346\236\204.md" diff --git a/.hbuilderx/launch.json b/.hbuilderx/launch.json index 1e9d5dd8..de30655a 100644 --- a/.hbuilderx/launch.json +++ b/.hbuilderx/launch.json @@ -1,12 +1,16 @@ { - "version": "0.2.0", - "configurations": [ - { - "name": "运行到浏览器", - "type": "uni-app", - "request": "launch", - "platform": "h5", - "path": "${workspaceFolder}" - } - ] + "version" : "0.2.0", + "configurations" : [ + { + "name" : "运行到浏览器", + "path" : "${workspaceFolder}", + "platform" : "h5", + "request" : "launch", + "type" : "uni-app" + }, + { + "playground" : "standard", + "type" : "uni-app:app-android" + } + ] } diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..f3aecce4 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +# 构建阶段 +FROM node:16-alpine as build-stage +WORKDIR /app +COPY package*.json ./ +RUN npm install +COPY . . +RUN npm run build + +# 生产阶段 +FROM nginx:alpine +COPY --from=build-stage /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/conf.d/default.conf +EXPOSE 80 \ No newline at end of file diff --git a/UNI_APP_BUILD_FIX.md b/UNI_APP_BUILD_FIX.md deleted file mode 100644 index 808dbdc4..00000000 --- a/UNI_APP_BUILD_FIX.md +++ /dev/null @@ -1,44 +0,0 @@ -# uni-app 构建错误修复说明 - -## 问题描述 -在构建 uni-app 项目时遇到以下错误: -``` -[plugin:uni:mp-pages-json] The "fileName" or "name" properties of emitted chunks and assets must be strings that are neither absolute nor relative paths, received "../../node-modules/@dcloudio/uni-ui/lib/uni-nav-bar/uni-nav-bar.json". -``` - -## 原因分析 -这是 `@dcloudio/vite-plugin-uni` 插件的一个已知 bug。在处理 `easycom` 自动导入的 uni-ui 组件时,插件在生成小程序页面 JSON 配置文件时使用了相对路径作为文件名,违反了 Rollup 的规范。 - -## 解决方案 - -### 方案 1:更新插件版本(推荐) -```bash -npm update @dcloudio/vite-plugin-uni @dcloudio/uni-ui -``` - -### 方案 2:修改 easycom 配置 -如果更新插件无效,可以尝试在 `pages.json` 中调整 `easycom` 配置: - -```json -{ - "easycom": { - "autoscan": false, // 禁用自动扫描 - "custom": { - "^uni-(.*)": "@dcloudio/uni-ui/lib/uni-$1/uni-$1.vue" - } - } -} -``` - -然后手动导入需要的 uni-ui 组件。 - -### 方案 3:报告 Bug -如果问题持续存在,建议在以下地址报告: -- DCloud 官方论坛:https://ask.dcloud.net.cn/ -- GitHub Issues:https://github.com/dcloudio/uni-app/issues - -## 当前项目状态 -已添加了多层防护机制(vite.config.js 中的修复插件),但由于错误发生在插件内部验证阶段,无法完全拦截。 - -建议优先尝试更新插件版本。 - diff --git a/api/auth.js b/api/auth.js new file mode 100644 index 00000000..1f73bc94 --- /dev/null +++ b/api/auth.js @@ -0,0 +1,118 @@ +import { request } from '@/utils/request' + +/** + * 用户登录 + * @param {Object} loginData - 登录数据 + * @param {string} loginData.account - 账号(手机号/邮箱/UID) + * @param {string} loginData.password - 密码 + * @returns {Promise} 返回登录结果,包含token + */ +export function login(loginData) { + return request({ + url: '/auth/login', + method: 'POST', + data: loginData + }) +} + +/** + * 发送验证码 + * @param {string} identifier - 手机号或邮箱 + * @param {string} type - 验证码类型:login/register/reset + * @returns {Promise} 返回发送结果 + */ +export function sendVerificationCode(identifier, type = 'login') { + return request({ + url: '/auth/send-code', + method: 'POST', + data: { identifier, type } + }) +} + +/** + * 验证码登录 + * @param {Object} loginData - 验证码登录数据 + * @param {string} loginData.identifier - 手机号或邮箱 + * @param {string} loginData.code - 验证码 + * @returns {Promise} 返回登录结果,包含token + */ +export function loginWithCode(loginData) { + return request({ + url: '/auth/login-code', + method: 'POST', + data: loginData + }) +} + +/** + * 用户注册 + * @param {Object} registerData - 注册数据 + * @param {string} registerData.phone - 手机号 + * @param {string} registerData.email - 邮箱 + * @param {string} registerData.password - 密码 + * @param {string} registerData.nickname - 昵称 + * @param {string} registerData.code - 验证码 + * @returns {Promise} 返回注册结果 + */ +export function register(registerData) { + return request({ + url: '/auth/register', + method: 'POST', + data: registerData + }) +} + +/** + * 重置密码 + * @param {Object} resetData - 重置密码数据 + * @param {string} resetData.identifier - 手机号或邮箱 + * @param {string} resetData.code - 验证码 + * @param {string} resetData.newPassword - 新密码 + * @returns {Promise} 返回重置结果 + */ +export function resetPassword(resetData) { + return request({ + url: '/auth/reset-password', + method: 'POST', + data: resetData + }) +} + +/** + * 刷新token + * @param {string} refreshToken - 刷新令牌 + * @returns {Promise} 返回新的token + */ +export function refreshToken(refreshToken) { + return request({ + url: '/auth/refresh', + method: 'POST', + data: { refreshToken } + }) +} + +/** + * 人脸识别登录 + * @param {Object} faceData - 人脸识别数据 + * @param {string} faceData.faceImage - 人脸图片base64 + * @param {string} faceData.deviceId - 设备ID + * @returns {Promise} 返回登录结果 + */ +export function loginWithFace(faceData) { + return request({ + url: '/auth/face-login', + method: 'POST', + data: faceData + }) +} + +/** + * 验证token有效性 + * @returns {Promise} 返回验证结果 + */ +export function validateToken() { + return request({ + url: '/auth/validate', + method: 'POST' + }) +} diff --git a/api/exam.js b/api/exam.js new file mode 100644 index 00000000..be6e44ae --- /dev/null +++ b/api/exam.js @@ -0,0 +1,72 @@ +import { request } from '@/utils/request' + +/** + * 查询考试信息 + * @param {Object} params - 查询参数 + * @param {number} params.taskId - 任务ID + * @param {number} params.userId - 用户ID + * @returns {Promise} 返回考试信息 + */ +export function queryExam(params = {}) { + return request({ + url: '/exam/query', + method: 'GET', + data: params + }) +} + +/** + * 开始考试 + * @param {Object} examData - 考试数据 + * @param {number} examData.taskId - 任务ID + * @param {number} examData.userId - 用户ID + * @returns {Promise} 返回考试开始结果 + */ +export function startExam(examData) { + return request({ + url: '/exam/start', + method: 'POST', + data: examData + }) +} + +/** + * 提交考试答案 + * @param {Object} answerData - 答案数据 + * @param {number} answerData.examId - 考试ID + * @param {string} answerData.answers - 答案内容 + * @returns {Promise} 返回提交结果 + */ +export function submitExamAnswer(answerData) { + return request({ + url: '/exam/submit', + method: 'POST', + data: answerData + }) +} + +/** + * 获取考试结果 + * @param {number} examId - 考试ID + * @returns {Promise} 返回考试结果 + */ +export function getExamResult(examId) { + return request({ + url: `/exam/result/${examId}`, + method: 'GET' + }) +} + +/** + * 获取考试历史记录 + * @param {number} userId - 用户ID + * @param {Object} params - 分页参数 + * @returns {Promise} 返回考试历史列表 + */ +export function getExamHistory(userId, params = {}) { + return request({ + url: `/exam/history/${userId}`, + method: 'GET', + data: params + }) +} diff --git a/api/skill.js b/api/skill.js new file mode 100644 index 00000000..38a4e0ca --- /dev/null +++ b/api/skill.js @@ -0,0 +1,67 @@ +import { request } from '@/utils/request' + +/** + * 保存技能数据 + * @param {Object} skillData - 技能数据对象 + * @returns {Promise} 返回保存结果 + */ +export function saveSkillData(skillData) { + return request({ + url: '/skill/save', + method: 'POST', + data: skillData + }) +} + +/** + * 查询技能数据 + * @param {Object} params - 查询参数 + * @param {number} params.userId - 用户ID + * @param {string} params.skillType - 技能类型 + * @returns {Promise} 返回技能数据列表 + */ +export function querySkillData(params = {}) { + return request({ + url: '/skill/query', + method: 'GET', + data: params + }) +} + +/** + * 更新技能数据 + * @param {number} skillId - 技能ID + * @param {Object} skillData - 更新的技能数据 + * @returns {Promise} 返回更新结果 + */ +export function updateSkillData(skillId, skillData) { + return request({ + url: `/skill/update/${skillId}`, + method: 'PUT', + data: skillData + }) +} + +/** + * 删除技能数据 + * @param {number} skillId - 技能ID + * @returns {Promise} 返回删除结果 + */ +export function deleteSkillData(skillId) { + return request({ + url: `/skill/delete/${skillId}`, + method: 'DELETE' + }) +} + +/** + * 获取技能统计信息 + * @param {number} userId - 用户ID + * @returns {Promise} 返回技能统计数据 + */ +export function getSkillStats(userId) { + return request({ + url: `/skill/stats/${userId}`, + method: 'GET' + }) +} diff --git a/api/task.js b/api/task.js new file mode 100644 index 00000000..cfbbf3ff --- /dev/null +++ b/api/task.js @@ -0,0 +1,151 @@ +import { request } from '@/utils/request' + +/** + * 搜索任务 + * @param {Object} params - 搜索参数 + * @param {number} params.status - 任务状态 (1=进行中, 2=已完成, 3=已取消) + * @param {number} params.page - 页码 (从0开始) + * @param {number} params.size - 每页大小 + * @param {string} params.keyword - 搜索关键词 + * @param {number} params.categoryId - 分类ID + * @param {string} params.sortBy - 排序字段 + * @param {string} params.sortOrder - 排序顺序 (asc/desc) + * @returns {Promise} 返回任务列表 + */ +export function searchTasks(params = {}) { + return request({ + url: '/task/search', + method: 'GET', + data: params + }) +} + +/** + * 获取任务详情 + * @param {number} taskId - 任务ID + * @returns {Promise} 返回任务详细信息 + */ +export function getTaskDetail(taskId) { + return request({ + url: `/task/detail`, + method: 'GET', + data: { taskId } + }) +} + +/** + * 发布任务 + * @param {Object} taskData - 任务数据 + * @param {string} taskData.title - 任务标题 + * @param {string} taskData.description - 任务描述 + * @param {number} taskData.reward - 奖励金额 + * @param {string} taskData.deadline - 截止时间 + * @param {number} taskData.latitude - 纬度 + * @param {number} taskData.longitude - 经度 + * @param {string} taskData.address - 地址 + * @param {string} taskData.adCode - 地区代码 + * @returns {Promise} 返回发布结果 + */ +export function publishTask(taskData) { + return request({ + url: '/task/publish', + method: 'POST', + data: taskData + }) +} + +/** + * 申请任务 + * @param {number} taskId - 任务ID + * @param {string} applicationReason - 申请理由 + * @returns {Promise} 返回申请结果 + */ +export function applyForTask(taskId, applicationReason = '') { + return request({ + url: '/task/apply', + method: 'POST', + data: { taskId, applicationReason } + }) +} + +/** + * 获取我的任务 + * @param {Object} params - 查询参数 + * @param {string} params.type - 任务类型 (published/applied) + * @param {number} params.status - 任务状态 + * @param {number} params.page - 页码 + * @param {number} params.size - 每页大小 + * @returns {Promise} 返回我的任务列表 + */ +export function getMyTasks(params = {}) { + return request({ + url: '/task/my-tasks', + method: 'GET', + data: params + }) +} + +/** + * 更新任务状态 + * @param {number} taskId - 任务ID + * @param {number} status - 新状态 + * @param {string} reason - 状态变更原因 + * @returns {Promise} 返回更新结果 + */ +export function updateTaskStatus(taskId, status, reason = '') { + return request({ + url: '/task/update-status', + method: 'PUT', + data: { taskId, status, reason } + }) +} + +/** + * 删除任务 + * @param {number} taskId - 任务ID + * @returns {Promise} 返回删除结果 + */ +export function deleteTask(taskId) { + return request({ + url: `/task/delete/${taskId}`, + method: 'DELETE' + }) +} + +/** + * 获取任务统计信息 + * @param {number} userId - 用户ID + * @returns {Promise} 返回任务统计数据 + */ +export function getTaskStatistics(userId) { + return request({ + url: `/task/statistics/${userId}`, + method: 'GET' + }) +} + +/** + * 获取热门任务 + * @param {number} limit - 限制数量 + * @returns {Promise} 返回热门任务列表 + */ +export function getHotTasks(limit = 10) { + return request({ + url: '/task/hot', + method: 'GET', + data: { limit } + }) +} + +/** + * 获取推荐任务 + * @param {number} limit - 限制数量 + * @returns {Promise} 返回推荐任务列表 + */ +export function getRecommendedTasks(limit = 10) { + return request({ + url: '/task/recommended', + method: 'GET', + data: { limit } + }) +} diff --git a/api/user.js b/api/user.js new file mode 100644 index 00000000..de6b6bad --- /dev/null +++ b/api/user.js @@ -0,0 +1,186 @@ +import { request } from '@/utils/request' + +/** + * 获取当前用户信息 + * @returns {Promise} 返回用户信息 + */ +export function getCurrentUser() { + return request({ + url: '/user/me', + method: 'POST', + data: {} + }) +} + +/** + * 更新用户信息 + * @param {Object} userData - 用户数据 + * @param {string} userData.nickname - 昵称 + * @param {string} userData.signature - 个性签名 + * @param {string} userData.avatarUrl - 头像URL + * @returns {Promise} 返回更新结果 + */ +export function updateUserProfile(userData) { + return request({ + url: '/user/update-profile', + method: 'PUT', + data: userData + }) +} + +/** + * 更新用户头像 + * @param {File} avatarFile - 头像文件 + * @returns {Promise} 返回上传结果 + */ +export function updateUserAvatar(avatarFile) { + const formData = new FormData() + formData.append('avatar', avatarFile) + + return request({ + url: '/user/update-avatar', + method: 'POST', + data: formData, + header: { + 'Content-Type': 'multipart/form-data' + } + }) +} + +/** + * 修改密码 + * @param {Object} passwordData - 密码数据 + * @param {string} passwordData.oldPassword - 旧密码 + * @param {string} passwordData.newPassword - 新密码 + * @returns {Promise} 返回修改结果 + */ +export function changePassword(passwordData) { + return request({ + url: '/user/change-password', + method: 'PUT', + data: passwordData + }) +} + +/** + * 绑定手机号 + * @param {Object} phoneData - 手机号数据 + * @param {string} phoneData.phone - 手机号 + * @param {string} phoneData.code - 验证码 + * @returns {Promise} 返回绑定结果 + */ +export function bindPhone(phoneData) { + return request({ + url: '/user/bind-phone', + method: 'POST', + data: phoneData + }) +} + +/** + * 绑定邮箱 + * @param {Object} emailData - 邮箱数据 + * @param {string} emailData.email - 邮箱 + * @param {string} emailData.code - 验证码 + * @returns {Promise} 返回绑定结果 + */ +export function bindEmail(emailData) { + return request({ + url: '/user/bind-email', + method: 'POST', + data: emailData + }) +} + +/** + * 获取用户统计信息 + * @param {number} userId - 用户ID (可选,不传则获取当前用户) + * @returns {Promise} 返回用户统计数据 + */ +export function getUserStatistics(userId = null) { + const url = userId ? `/user/statistics/${userId}` : '/user/statistics' + return request({ + url: url, + method: 'GET' + }) +} + +/** + * 获取用户信誉积分历史 + * @param {Object} params - 查询参数 + * @param {number} params.page - 页码 + * @param {number} params.size - 每页大小 + * @returns {Promise} 返回信誉积分历史 + */ +export function getCreditHistory(params = {}) { + return request({ + url: '/user/credit-history', + method: 'GET', + data: params + }) +} + +/** + * 获取用户技能树 + * @param {number} userId - 用户ID (可选) + * @returns {Promise} 返回用户技能树数据 + */ +export function getUserSkillTree(userId = null) { + const url = userId ? `/user/skill-tree/${userId}` : '/user/skill-tree' + return request({ + url: url, + method: 'GET' + }) +} + +/** + * 更新用户技能 + * @param {Object} skillData - 技能数据 + * @param {number} skillData.skillId - 技能ID + * @param {number} skillData.proficiency - 熟练度 + * @returns {Promise} 返回更新结果 + */ +export function updateUserSkill(skillData) { + return request({ + url: '/user/update-skill', + method: 'PUT', + data: skillData + }) +} + +/** + * 获取用户偏好设置 + * @returns {Promise} 返回用户偏好设置 + */ +export function getUserPreferences() { + return request({ + url: '/user/preferences', + method: 'GET' + }) +} + +/** + * 更新用户偏好设置 + * @param {Object} preferences - 偏好设置数据 + * @returns {Promise} 返回更新结果 + */ +export function updateUserPreferences(preferences) { + return request({ + url: '/user/preferences', + method: 'PUT', + data: preferences + }) +} + +/** + * 注销账户 + * @param {string} reason - 注销原因 + * @returns {Promise} 返回注销结果 + */ +export function deactivateAccount(reason = '') { + return request({ + url: '/user/deactivate', + method: 'POST', + data: { reason } + }) +} diff --git a/check_modified_file.py b/check_modified_file.py new file mode 100644 index 00000000..ec6d5bd9 --- /dev/null +++ b/check_modified_file.py @@ -0,0 +1,11 @@ +with open(r'c:\Users\xb_Q\Documents\skillith\skillith-frontend\pages\exam\index.vue', 'r', encoding='utf-8') as f: + content = f.read() + +print('useSpeechRecognition found:', 'useSpeechRecognition' in content) +print('voice-controls found:', 'voice-controls' in content) + +# 查看导入部分 +print('\n--- Import Section ---') +for line in content.split('\n'): + if 'import' in line: + print(line) \ No newline at end of file diff --git a/dist/build/h5/index.html b/dist/build/h5/index.html new file mode 100644 index 00000000..ebd611ef --- /dev/null +++ b/dist/build/h5/index.html @@ -0,0 +1,82 @@ + + + + + + SKILLITH + + + + +
+ +
+
+
正在加载...
+
+
+ + + + diff --git a/pages/exam/composables/useSpeechRecognition.js b/pages/exam/composables/useSpeechRecognition.js new file mode 100644 index 00000000..a29d2d8b --- /dev/null +++ b/pages/exam/composables/useSpeechRecognition.js @@ -0,0 +1,902 @@ +/** + * 考试语音识别 Composable + * 负责 WebSocket 连接、音频采集、识别结果处理 + * + * 使用方法: + * import { useSpeechRecognition } from './composables/useSpeechRecognition.js' + * + * const { + * isConnected, + * isRecording, + * isPaused, + * recognizedText, + * connectionStatus, + * recordingStatus, + * connectWebSocket, + * startRecording, + * stopRecording, + * pauseRecording, + * resumeRecording, + * submitRecording, + * switchQuestion, + * disconnect, + * clearRecognizedText + * } = useSpeechRecognition({ + * examTaskId: examTaskId.value, + * questionId: currentQuestionId.value, + * onRecognitionResult: (text) => { + * console.log('识别结果:', text) + * }, + * onError: (error) => { + * console.error('错误:', error) + * } + * }) + */ + +import { ref, computed, readonly, onUnmounted } from 'vue' +import { NETWORK_CONFIG } from '@/config/network.js' + +export function useSpeechRecognition(options = {}) { + const { + examTaskId = null, + questionId = null, + onRecognitionResult = null, // 识别结果回调: (text) => {} + onError = null // 错误回调: (error) => {} + } = options + + // 状态 + const isConnected = ref(false) + const isRecording = ref(false) + const isPaused = ref(false) // 新增:暂停状态 + const recognizedText = ref('') // 当前题目的累积识别文本 + const connectionStatus = ref('未连接') + const recordingStatus = computed(() => { + if (!isRecording.value) return '未开始' + if (isPaused.value) return '已暂停' + return '录音中' + }) + + // 增强的状态管理 + const connectionAttempts = ref(0) // 连接尝试次数 + const maxConnectionAttempts = 3 // 最大连接尝试次数 + const lastError = ref(null) // 最后一次错误信息 + const isReconnecting = ref(false) // 是否正在重连 + const audioQualityScore = ref(0) // 音频质量评分 (0-100) + + // 用户体验增强 + const userFriendlyStatus = computed(() => { + if (lastError.value) return getUserFriendlyErrorMessage(lastError.value) + if (isReconnecting.value) return '正在重新连接语音服务...' + if (connectionStatus.value === '连接中...') return '正在连接语音服务...' + if (connectionStatus.value === '重连中...') return '正在重新连接语音服务...' + if (connectionStatus.value === '已连接') return '语音服务已就绪' + if (connectionStatus.value === '未连接') return '语音服务未连接' + if (recordingStatus.value === '录音中') { + const quality = getAudioQuality().level + if (quality === 'poor') return '正在录音(请靠近麦克风)' + if (quality === 'fair') return '正在录音(音质一般)' + if (quality === 'good') return '正在录音(音质良好)' + return '正在录音(音质优秀)' + } + return connectionStatus.value + }) + + // 语音质量提示 + const qualityTips = computed(() => { + const quality = getAudioQuality() + if (!isRecording.value) return null + + switch (quality.level) { + case 'excellent': + return { type: 'success', message: '音质优秀,请保持当前距离' } + case 'good': + return { type: 'info', message: '音质良好,可以开始答题' } + case 'fair': + return { type: 'warning', message: '音质一般,建议靠近麦克风' } + case 'poor': + return { type: 'error', message: '音质较差,请检查麦克风或靠近麦克风' } + default: + return null + } + }) + + // 连续低质量音频警告 + const lowQualityWarning = ref(null) + let lowQualityCount = 0 + const maxLowQualityCount = 3 // 连续3次低质量则显示警告 + + // WebSocket 和录音相关 + let wsSocketTask = null + let recorderManager = null + + // 配置 + const SAMPLE_RATE = 16000 // 16kHz + const CHANNELS = 1 // 单声道 + const CHUNK_SIZE = 32 * 1024 // 32KB 块大小(约2秒音频) + + // 构建 WebSocket URL + const getWebSocketUrl = (qid = null) => { + const token = uni.getStorageSync('accessToken') + if (!token) { + throw new Error('未找到访问令牌') + } + + // 获取 API 基础 URL + const apiBaseUrl = NETWORK_CONFIG.API_BASE_URL || 'http://127.0.0.1:8080' + + // 转换为 WebSocket URL + let wsBaseUrl = apiBaseUrl + .replace('https://', 'wss://') + .replace('http://', 'ws://') + + // 构建完整 URL + let wsUrl = `${wsBaseUrl}/ws-media?token=${encodeURIComponent(token)}` + if (examTaskId) { + wsUrl += `&examTaskId=${examTaskId}` + } + if (qid) { + wsUrl += `&questionId=${qid}` + } + + return wsUrl + } + + /** + * 建立 WebSocket 连接 + */ + const connectWebSocket = (isRetry = false) => { + return new Promise((resolve, reject) => { + try { + const wsUrl = getWebSocketUrl(questionId) + console.log(`[语音识别] ${isRetry ? '重连' : '连接'} WebSocket:`, wsUrl) + connectionStatus.value = isRetry ? '重连中...' : '连接中...' + + wsSocketTask = uni.connectSocket({ + url: wsUrl, + success: () => { + console.log('[语音识别] WebSocket 连接请求已发送') + }, + fail: (error) => { + console.error('[语音识别] WebSocket 连接请求失败:', error) + connectionStatus.value = '连接失败' + handleConnectionError(error, resolve, reject) + } + }) + + // 监听连接打开 + wsSocketTask.onOpen(() => { + console.log('[语音识别] WebSocket 连接成功') + isConnected.value = true + connectionStatus.value = '已连接' + connectionAttempts.value = 0 // 重置连接尝试次数 + lastError.value = null + isReconnecting.value = false + + // 发送 bind 消息(设置 examTaskId 和 questionId) + if (examTaskId || questionId) { + sendBindMessage(examTaskId, questionId) + } + + resolve(wsSocketTask) + }) + + // 监听消息(识别结果) + wsSocketTask.onMessage((event) => { + handleWebSocketMessage(event.data) + }) + + // 监听连接关闭 + wsSocketTask.onClose((event) => { + console.log('[语音识别] WebSocket 连接关闭:', event.code, event.reason) + isConnected.value = false + connectionStatus.value = '已断开' + + // 如果是非正常关闭且未在重连中,尝试重连 + if (event.code !== 1000 && !isReconnecting.value) { + handleUnexpectedDisconnect() + } + + // 如果是异常关闭,触发错误回调 + if (event.code !== 1000) { + const error = new Error(`连接异常关闭: ${event.reason || event.code}`) + onError?.(error) + } + }) + + // 监听连接错误 + wsSocketTask.onError((error) => { + console.error('[语音识别] WebSocket 连接错误:', error) + connectionStatus.value = '连接错误' + handleConnectionError(error, resolve, reject) + }) + + } catch (error) { + console.error('[语音识别] 创建 WebSocket 连接失败:', error) + connectionStatus.value = '连接失败' + handleConnectionError(error, resolve, reject) + } + }) + } + + /** + * 处理连接错误,支持重连机制 + */ + const handleConnectionError = (error, resolve, reject) => { + lastError.value = error + connectionAttempts.value++ + + if (connectionAttempts.value < maxConnectionAttempts) { + const delay = Math.min(1000 * Math.pow(2, connectionAttempts.value - 1), 5000) // 指数退避,最多5秒 + console.log(`[语音识别] ${delay}ms 后进行第 ${connectionAttempts.value} 次重连尝试...`) + + setTimeout(() => { + isReconnecting.value = true + connectWebSocket(true).then(resolve).catch(reject) + }, delay) + } else { + console.error(`[语音识别] 连接失败,已尝试 ${maxConnectionAttempts} 次`) + connectionStatus.value = '连接失败' + onError?.(new Error(`连接失败,已尝试 ${maxConnectionAttempts} 次: ${error.errMsg || JSON.stringify(error)}`)) + reject(error) + } + } + + /** + * 处理意外断开连接 + */ + const handleUnexpectedDisconnect = () => { + if (isRecording.value) { + console.warn('[语音识别] 录音过程中连接意外断开,停止录音') + stopRecording() + onError?.(new Error('网络连接中断,录音已停止')) + } + + // 如果连接次数未达到上限,尝试重连 + if (connectionAttempts.value < maxConnectionAttempts) { + console.log('[语音识别] 检测到意外断开,尝试重连...') + connectWebSocket(true).catch(error => { + console.error('[语音识别] 重连失败:', error) + }) + } + } + + /** + * 发送 bind 消息(设置 examTaskId 和 questionId) + */ + const sendBindMessage = (examTaskId, questionId) => { + if (!wsSocketTask || !isConnected.value) return + + const bindMessage = { + type: 'bind', + examTaskId: examTaskId, + questionId: questionId + } + + try { + wsSocketTask.send({ + data: JSON.stringify(bindMessage), + success: () => { + console.log('[语音识别] bind 消息发送成功:', bindMessage) + }, + fail: (error) => { + console.error('[语音识别] bind 消息发送失败:', error) + } + }) + } catch (error) { + console.error('[语音识别] 发送 bind 消息异常:', error) + } + } + + /** + * 处理 WebSocket 消息(识别结果) + */ + const handleWebSocketMessage = (data) => { + try { + // 验证数据有效性 + if (!data || typeof data !== 'string') { + console.warn('[语音识别] 收到无效消息数据:', data) + return + } + + const message = JSON.parse(data) + + // 识别结果消息格式: {"status":"success","text":"识别文本"} + if (message.status === 'success' && message.text) { + let text = message.text.trim() + + // 兼容嵌套 JSON 格式(如果后端返回的是 {"text":"{\"text\":\"xxx\"}"}) + if (text.startsWith('{') && text.includes('"text"')) { + try { + const nested = JSON.parse(text) + text = nested.text || text + } catch (e) { + console.warn('[语音识别] 解析嵌套JSON失败,使用原始文本:', e) + // 解析失败,使用原始文本 + } + } + + if (text && text.length > 0) { + // 过滤无效字符和过长的文本 + text = sanitizeRecognizedText(text) + + if (text) { + // 累积识别文本 + recognizedText.value += text + ' ' + + // 触发回调 + onRecognitionResult?.(text) + + console.log('[语音识别] 收到识别结果:', text) + } + } else { + console.warn('[语音识别] 收到空识别结果') + } + } + + // 连接状态消息 + else if (message.type === 'connection_status') { + console.log('[语音识别] 连接状态更新:', message) + if (message.status === 'ready') { + connectionStatus.value = '服务就绪' + } + } + + // 防作弊消息 + else if (message.type === 'anti_cheat_detected') { + console.warn('[语音识别] 检测到防作弊行为:', message) + stopRecording() + const error = new Error(message.message || '检测到异常行为,请规范作答') + onError?.(error) + } + + // 异常断开消息 + else if (message.type === 'abnormal_disconnect') { + console.warn('[语音识别] 服务器异常断开:', message) + stopRecording() + const error = new Error(message.message || '服务器连接异常断开,请重试') + onError?.(error) + } + + // 录音控制消息 + else if (message.type === 'recording_control') { + console.log('[语音识别] 收到录音控制消息:', message) + if (message.action === 'pause_required') { + pauseRecording() + } else if (message.action === 'resume_allowed') { + resumeRecording() + } + } + + // 未知消息类型 + else { + console.log('[语音识别] 收到未知消息类型:', message) + } + + } catch (error) { + console.error('[语音识别] 解析 WebSocket 消息失败:', error, '原始数据:', data) + + // 如果是JSON解析错误,尝试记录更多信息 + if (error instanceof SyntaxError) { + console.error('[语音识别] JSON解析错误,可能收到非JSON格式数据') + } + + // 不触发错误回调,避免因服务器异常消息影响用户体验 + } + } + + /** + * 清理和验证识别文本 + */ + const sanitizeRecognizedText = (text) => { + if (!text || typeof text !== 'string') return '' + + // 移除过长的文本(防止恶意或异常数据) + if (text.length > 1000) { + console.warn('[语音识别] 识别文本过长,已截断') + text = text.substring(0, 1000) + '...' + } + + // 移除不可见字符和控制字符,但保留中文标点 + text = text.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '') + + // 移除连续的空白字符 + text = text.replace(/\s+/g, ' ').trim() + + // 如果文本只包含标点或特殊字符,返回空字符串 + if (/^[\p{P}\p{S}\s]*$/u.test(text)) { + return '' + } + + return text + } + + /** + * 开始录音并发送音频 + */ + const startRecording = () => { + if (isRecording.value) { + console.warn('[语音识别] 录音已在进行中') + return Promise.reject(new Error('录音已在进行中')) + } + + if (!isConnected.value) { + const error = new Error('WebSocket 未连接,无法开始录音') + console.error('[语音识别]', error.message) + onError?.(error) + return Promise.reject(error) + } + + return new Promise((resolve, reject) => { + console.log('[语音识别] 开始录音...') + isRecording.value = true + isPaused.value = false + audioQualityScore.value = 0 // 重置音频质量评分 + lowQualityCount = 0 // 重置质量计数 + lowQualityWarning.value = null // 重置警告 + + try { + // UniApp 录音管理器 + recorderManager = uni.getRecorderManager() + + recorderManager.onStart(() => { + console.log('[语音识别] 录音已开始') + resolve() // 录音成功开始 + }) + + recorderManager.onError((error) => { + console.error('[语音识别] 录音错误:', error) + isRecording.value = false + isPaused.value = false + onError?.(error) + reject(error) + }) + + // 监听录音数据 + recorderManager.onFrameRecorded((res) => { + // 只有在录音中且未暂停时才发送音频数据 + if (isRecording.value && !isPaused.value) { + const quality = analyzeAudioQuality(res.frameBuffer) + audioQualityScore.value = quality + + // 检查连续低质量音频 + checkQualityTrend(quality) + + sendAudioChunk(res.frameBuffer) + } + }) + + // 开始录音(16kHz, 单声道, PCM16) + recorderManager.start({ + sampleRate: SAMPLE_RATE, + numberOfChannels: CHANNELS, + encodeBitRate: 96000, + format: 'PCM', // PCM 格式 + frameSize: 50 // 每 50ms 触发一次 onFrameRecorded + }) + + } catch (error) { + console.error('[语音识别] 启动录音失败:', error) + isRecording.value = false + isPaused.value = false + onError?.(error) + reject(error) + } + }) + } + + /** + * 分析音频质量并给出评分 (0-100) + */ + const analyzeAudioQuality = (audioBuffer) => { + try { + // 确保是 ArrayBuffer + let buffer = audioBuffer + if (!(buffer instanceof ArrayBuffer)) { + buffer = new Uint8Array(audioBuffer).buffer + } + + if (buffer.byteLength < 4) return 0 + + // 计算音频信号的RMS(均方根)作为质量指标 + const samples = new Int16Array(buffer) + let sum = 0 + let silenceCount = 0 + + for (let i = 0; i < samples.length; i++) { + const sample = samples[i] / 32768.0 // 转换为 -1 到 1 的范围 + sum += sample * sample + + // 统计静音样本(绝对值小于0.01) + if (Math.abs(sample) < 0.01) { + silenceCount++ + } + } + + const rms = Math.sqrt(sum / samples.length) + const silenceRatio = silenceCount / samples.length + + // 计算质量评分:RMS贡献70%,非静音比例贡献30% + const rmsScore = Math.min(rms * 1000, 100) // RMS放大1000倍后限制在100以内 + const voiceScore = (1 - silenceRatio) * 100 // 非静音比例转换为0-100分 + + return Math.round(rmsScore * 0.7 + voiceScore * 0.3) + + } catch (error) { + console.warn('[语音识别] 音频质量分析失败:', error) + return 0 + } + } + + /** + * 检查音频质量趋势并提供警告 + */ + const checkQualityTrend = (qualityScore) => { + if (qualityScore >= 60) { + // 质量良好,重置计数 + lowQualityCount = 0 + lowQualityWarning.value = null + } else { + // 质量较差,增加计数 + lowQualityCount++ + + if (lowQualityCount >= maxLowQualityCount) { + if (qualityScore >= 40) { + lowQualityWarning.value = { + type: 'warning', + message: '连续检测到音质不佳,建议调整麦克风位置或检查设备', + action: 'adjust_microphone' + } + } else { + lowQualityWarning.value = { + type: 'error', + message: '音频质量严重不足,可能影响识别效果,请检查麦克风设置', + action: 'check_microphone' + } + } + } + } + } + + /** + * 暂停录音 + */ + const pauseRecording = () => { + if (!isRecording.value || isPaused.value) { + console.warn('[语音识别] 当前不在录音状态或已暂停') + return + } + + console.log('[语音识别] 暂停录音...') + isPaused.value = true + + // 向服务器发送暂停消息 + sendControlMessage('pause') + } + + /** + * 恢复录音 + */ + const resumeRecording = () => { + if (!isRecording.value || !isPaused.value) { + console.warn('[语音识别] 当前不在录音状态或未暂停') + return + } + + console.log('[语音识别] 恢复录音...') + isPaused.value = false + + // 向服务器发送恢复消息 + sendControlMessage('resume') + } + + /** + * 停止录音 + */ + const stopRecording = () => { + if (!isRecording.value) return + + console.log('[语音识别] 停止录音...') + isRecording.value = false + isPaused.value = false + + // 向服务器发送停止消息 + sendControlMessage('stop') + + if (recorderManager) { + recorderManager.stop() + recorderManager = null + } + } + + /** + * 提交录音结果(结束并确认) + */ + const submitRecording = () => { + console.log('[语音识别] 提交录音...') + + // 停止录音 + stopRecording() + + // 向服务器发送提交消息 + sendControlMessage('submit') + + // 触发最终识别结果 + console.log('[语音识别] 提交完成,当前识别文本:', recognizedText.value) + } + + /** + * 发送控制消息到服务器 + */ + const sendControlMessage = (action) => { + if (!wsSocketTask || !isConnected.value) return + + const controlMessage = { + type: 'control', + action: action, + examTaskId: examTaskId, + questionId: questionId + } + + try { + wsSocketTask.send({ + data: JSON.stringify(controlMessage), + success: () => { + console.log('[语音识别] 控制消息发送成功:', controlMessage) + }, + fail: (error) => { + console.error('[语音识别] 控制消息发送失败:', error) + } + }) + } catch (error) { + console.error('[语音识别] 发送控制消息异常:', error) + } + } + + /** + * 发送音频块到 WebSocket + */ + const sendAudioChunk = (audioBuffer) => { + if (!wsSocketTask || !isConnected.value || !audioBuffer) return + + try { + // 确保是 ArrayBuffer + let buffer = audioBuffer + if (!(buffer instanceof ArrayBuffer)) { + buffer = new Uint8Array(audioBuffer).buffer + } + + // 检查大小 + if (buffer.byteLength === 0) return + + // 构建消息:首字节 0x02(音频类型)+ 音频数据 + const header = new Uint8Array([0x02]) + const audioData = new Uint8Array(buffer) + const merged = new Uint8Array(header.length + audioData.length) + merged.set(header, 0) + merged.set(audioData, header.length) + + // 发送二进制数据 + wsSocketTask.send({ + data: merged.buffer, + success: () => { + // 静默成功,避免日志过多 + }, + fail: (error) => { + console.error('[语音识别] 发送音频块失败:', error) + } + }) + + } catch (error) { + console.error('[语音识别] 处理音频块异常:', error) + } + } + + /** + * 切换题目(发送题目切换消息) + */ + const switchQuestion = (previousQuestionId, newQuestionId) => { + if (!wsSocketTask || !isConnected.value) return + + // 清空当前题目的识别文本 + recognizedText.value = '' + + // 发送题目切换消息 + const switchMessage = { + type: 'question_switch', + previousQuestionId: previousQuestionId, + newQuestionId: newQuestionId + } + + try { + wsSocketTask.send({ + data: JSON.stringify(switchMessage), + success: () => { + console.log('[语音识别] 题目切换消息发送成功:', switchMessage) + + // 更新 bind 消息中的 questionId + sendBindMessage(examTaskId, newQuestionId) + }, + fail: (error) => { + console.error('[语音识别] 题目切换消息发送失败:', error) + } + }) + } catch (error) { + console.error('[语音识别] 发送题目切换消息异常:', error) + } + } + + /** + * 断开 WebSocket 连接 + */ + const disconnect = () => { + stopRecording() + + if (wsSocketTask) { + wsSocketTask.close({ + code: 1000, + reason: '用户主动断开' + }) + wsSocketTask = null + } + + isConnected.value = false + connectionStatus.value = '已断开' + console.log('[语音识别] WebSocket 连接已断开') + } + + /** + * 清空识别文本 + */ + const clearRecognizedText = () => { + recognizedText.value = '' + } + + /** + * 重连(带重试机制) + */ + const reconnect = async (maxRetries = 3) => { + let retryCount = 0 + + const tryConnect = async () => { + try { + await connectWebSocket() + retryCount = 0 // 重置 + } catch (error) { + if (retryCount < maxRetries) { + retryCount++ + console.log(`[语音识别] 连接失败,2秒后重试 (${retryCount}/${maxRetries})`) + setTimeout(tryConnect, 2000) + } else { + console.error('[语音识别] 连接重试次数已达上限') + onError?.(new Error('WebSocket 连接失败,请检查网络')) + } + } + } + + await tryConnect() + } + + // 组件卸载时清理 + onUnmounted(() => { + disconnect() + }) + + return { + // 状态 + isConnected, + isRecording, + isPaused, + recognizedText, + connectionStatus, + recordingStatus, + userFriendlyStatus, + connectionAttempts: readonly(connectionAttempts), + lastError: readonly(lastError), + isReconnecting: readonly(isReconnecting), + audioQualityScore: readonly(audioQualityScore), + + // 方法 + connectWebSocket, + startRecording, + stopRecording, + pauseRecording, + resumeRecording, + submitRecording, + switchQuestion, + disconnect, + clearRecognizedText, + reconnect, + + // 工具方法 + getConnectionInfo: () => ({ + attempts: connectionAttempts.value, + lastError: lastError.value, + isReconnecting: isReconnecting.value + }), + + getAudioQuality: () => ({ + score: audioQualityScore.value, + level: audioQualityScore.value >= 80 ? 'excellent' : + audioQualityScore.value >= 60 ? 'good' : + audioQualityScore.value >= 40 ? 'fair' : 'poor' + }), + + getQualityTips: () => qualityTips.value, + + getQualityWarning: () => lowQualityWarning.value, + + resetErrorState: () => { + lastError.value = null + connectionAttempts.value = 0 + }, + + resetQualityState: () => { + audioQualityScore.value = 0 + lowQualityCount = 0 + lowQualityWarning.value = null + }, + + // 获取用户友好的错误消息 + getUserFriendlyErrorMessage: (error) => { + if (!error) return '' + + const errorMsg = error.message || error.errMsg || String(error) + + // 网络相关错误 + if (errorMsg.includes('timeout') || errorMsg.includes('超时')) { + return '网络连接超时,请检查网络后重试' + } + if (errorMsg.includes('network') || errorMsg.includes('网络')) { + return '网络连接异常,请检查网络连接' + } + if (errorMsg.includes('WebSocket') && errorMsg.includes('连接')) { + return '语音服务连接失败,请稍后重试' + } + + // 权限相关错误 + if (errorMsg.includes('permission') || errorMsg.includes('权限')) { + return '麦克风权限被拒绝,请允许应用访问麦克风' + } + if (errorMsg.includes('microphone') || errorMsg.includes('麦克风')) { + return '麦克风访问失败,请检查麦克风设置' + } + + // 录音相关错误 + if (errorMsg.includes('录音')) { + return '录音功能异常,请重启应用后重试' + } + + // 防作弊相关 + if (errorMsg.includes('异常行为') || errorMsg.includes('anti_cheat')) { + return '检测到异常操作,录音已停止' + } + + // 服务器错误 + if (errorMsg.includes('服务器') || errorMsg.includes('server')) { + return '语音服务暂时不可用,请稍后重试' + } + + // 默认错误消息 + return '语音功能出现异常,请重试或联系管理员' + }, + + // 获取状态图标(用于UI显示) + getStatusIcon: () => { + if (lastError.value) return 'error' + if (isReconnecting.value) return 'refresh' + if (connectionStatus.value === '已连接') return 'check_circle' + if (recordingStatus.value === '录音中') return 'mic' + if (connectionStatus.value.includes('连接')) return 'wifi' + return 'mic_off' + }, + + // 获取状态颜色(用于UI显示) + getStatusColor: () => { + if (lastError.value) return 'error' + if (isReconnecting.value) return 'warning' + if (connectionStatus.value === '已连接') return 'success' + if (recordingStatus.value === '录音中') return 'info' + return 'default' + } + } +} \ No newline at end of file diff --git a/pages/exam/index.vue b/pages/exam/index.vue index 819905c5..e9806613 100644 --- a/pages/exam/index.vue +++ b/pages/exam/index.vue @@ -1,4015 +1,614 @@ - - - - \ No newline at end of file +} + + + \ No newline at end of file diff --git a/utils/date.js b/utils/date.js new file mode 100644 index 00000000..06db1dc4 --- /dev/null +++ b/utils/date.js @@ -0,0 +1,62 @@ +/** + * 日期时间工具函数 + */ + +/** + * 获取今天的日期字符串 + * @returns {string} 格式为 YYYY-MM-DD 的日期字符串 + */ +export function getToday() { + const today = new Date() + const year = today.getFullYear() + const month = String(today.getMonth() + 1).padStart(2, '0') + const day = String(today.getDate()).padStart(2, '0') + return `${year}-${month}-${day}` +} + +/** + * 获取当前时间字符串 + * @returns {string} 格式为 HH:MM:SS 的时间字符串 + */ +export function getCurrentTime() { + const now = new Date() + const hours = String(now.getHours()).padStart(2, '0') + const minutes = String(now.getMinutes()).padStart(2, '0') + const seconds = String(now.getSeconds()).padStart(2, '0') + return `${hours}:${minutes}:${seconds}` +} + +/** + * 获取完整的日期时间字符串 + * @returns {string} 格式为 YYYY-MM-DD HH:MM:SS 的日期时间字符串 + */ +export function getCurrentDateTime() { + return `${getToday()} ${getCurrentTime()}` +} + +/** + * 格式化日期对象为字符串 + * @param {Date} date - 日期对象 + * @param {string} format - 格式字符串,默认 'YYYY-MM-DD' + * @returns {string} 格式化的日期字符串 + */ +export function formatDate(date, format = 'YYYY-MM-DD') { + if (!date || !(date instanceof Date)) { + return '' + } + + const year = date.getFullYear() + const month = String(date.getMonth() + 1).padStart(2, '0') + const day = String(date.getDate()).padStart(2, '0') + const hours = String(date.getHours()).padStart(2, '0') + const minutes = String(date.getMinutes()).padStart(2, '0') + const seconds = String(date.getSeconds()).padStart(2, '0') + + return format + .replace('YYYY', year) + .replace('MM', month) + .replace('DD', day) + .replace('HH', hours) + .replace('mm', minutes) + .replace('ss', seconds) +} diff --git a/utils/formate.js b/utils/formate.js new file mode 100644 index 00000000..7b8157ce --- /dev/null +++ b/utils/formate.js @@ -0,0 +1,61 @@ +/** + * 格式化工具函数 + */ + +/** + * 格式化当前时间为字符串 + * @param {Date} date - 可选的日期对象,默认为当前时间 + * @returns {string} 格式为 HH:MM:SS 的时间字符串 + */ +export function formatTime(date = new Date()) { + const hours = String(date.getHours()).padStart(2, '0') + const minutes = String(date.getMinutes()).padStart(2, '0') + const seconds = String(date.getSeconds()).padStart(2, '0') + return `${hours}:${minutes}:${seconds}` +} + +/** + * 格式化日期时间为字符串 + * @param {Date} date - 日期对象 + * @returns {string} 格式为 YYYY-MM-DD HH:MM:SS 的日期时间字符串 + */ +export function formatDateTime(date) { + if (!date || !(date instanceof Date)) { + return formatTime() + } + + const year = date.getFullYear() + const month = String(date.getMonth() + 1).padStart(2, '0') + const day = String(date.getDate()).padStart(2, '0') + const timeStr = formatTime(date) + + return `${year}-${month}-${day} ${timeStr}` +} + +/** + * 格式化数字,保留指定小数位数 + * @param {number} num - 要格式化的数字 + * @param {number} decimals - 小数位数,默认 2 + * @returns {string} 格式化后的数字字符串 + */ +export function formatNumber(num, decimals = 2) { + if (typeof num !== 'number' || isNaN(num)) { + return '0.00' + } + return num.toFixed(decimals) +} + +/** + * 格式化文件大小 + * @param {number} bytes - 字节数 + * @returns {string} 格式化的文件大小字符串 + */ +export function formatFileSize(bytes) { + if (bytes === 0) return '0 B' + + const k = 1024 + const sizes = ['B', 'KB', 'MB', 'GB', 'TB'] + const i = Math.floor(Math.log(bytes) / Math.log(k)) + + return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i] +} diff --git "a/\350\247\243\346\236\204.md" "b/\350\247\243\346\236\204.md" new file mode 100644 index 00000000..0d0b082a --- /dev/null +++ "b/\350\247\243\346\236\204.md" @@ -0,0 +1,585 @@ +# 项目重构文档 + +本文档记录了项目重构过程中的所有主要修改。 + +## 📋 目录 + +1. [消息中心 (pages/message) 重构](#1-消息中心-pagesmessage-重构) +2. [任务详情页 (pages/task/detail) 重构](#2-任务详情页-pagestaskdetail-重构) +3. [工具函数和配置优化](#3-工具函数和配置优化) +4. [调试机制优化](#4-调试机制优化) +5. [组件化改进](#5-组件化改进) +6. [样式分布优化](#6-样式分布优化) + +--- + +## 1. 消息中心 (pages/message) 重构 + +### 1.1 架构说明 + +消息中心页面已完全解构为 **Composables + Components** 架构: + +- **主页面** (`index.vue`): 仅负责组合各个 composables 和 components +- **Composables**: 所有业务逻辑已解构到独立的 composable 文件中 +- **Components**: 所有 UI 组件已解构到独立的组件文件中 +- **Utils**: 工具函数和辅助函数 + +### 1.2 Composables 列表 + +#### 核心数据管理 +- **`useMessageData.js`** - 消息列表、分页、倒计时管理 + - 消息列表获取 + - 分页参数管理 + - 倒计时功能 + - 未读计数管理 + +- **`useMessageFilters.js`** - 筛选逻辑(分类、类型、状态) + - 主选项卡管理 + - 子选项卡管理 + - 状态筛选 + - 筛选参数计算 + +- **`useUserInfo.js`** - 用户信息获取 + - 用户信息缓存 + - 头像和昵称获取 + +#### 消息操作 +- **`useMessageActions.js`** - 消息操作(同意/拒绝任务等) + - 消息同意/拒绝 + - 消息标记已读 + - 批量操作 + +- **`useMessageHandlers.js`** - 消息点击跳转处理 + - 消息点击处理 + - 页面跳转逻辑 + - 消息状态更新 + +#### 模态框相关 +- **`useVoteModal.js`** - 投票模态框 +- **`useWorkVerification.js`** - 工作核验 +- **`useExamSchedule.js`** - AI 远程提问预约 +- **`useTeamInvitation.js`** - 团队邀请 +- **`useTaskModification.js`** - 任务修改申请 +- **`useReasonDialog.js`** - 原因输入对话框 +- **`useMessageModalHandlers.js`** - 模态框包装函数 + +#### UI 相关 +- **`usePagination.js`** - 分页组件定位和样式 + +### 1.3 Components 列表 + +- **`MessageTabs.vue`** - 消息选项卡组件 +- **`MessageFilters.vue`** - 消息筛选组件 +- **`MessageCard.vue`** - 消息卡片组件 +- **`LoadingState.vue`** - 加载状态组件 +- **`ErrorState.vue`** - 错误状态组件 +- **`EmptyState.vue`** - 空状态组件 +- **`Pagination.vue`** - 分页组件 +- **`VoteModal.vue`** - 投票模态框 +- **`WorkVerifyDialog.vue`** - 工作核验对话框 +- **`ExamScheduleDialog.vue`** - AI 远程提问预约对话框 +- **`TeamInvitationModal.vue`** - 团队邀请模态框 +- **`TaskModificationModal.vue`** - 任务修改申请模态框 +- **`ReasonDialog.vue`** - 原因输入对话框 +- **`ActionMessage.vue`** - 操作消息组件 +- **`BottomDecoration.vue`** - 底部装饰组件 + +### 1.4 Utils 列表 + +- **`messageHelpers.js`** - 消息辅助函数 + - 消息类型解析 + - 消息状态判断 + - 时间格式化 + - 过期判断 + +- **`messageFormatters.js`** - 消息格式化函数 + - 时间格式化 + - 内容格式化 + +- **`apiHelpers.js`** - API 辅助函数 + - 响应解析 + - 错误处理 + - 消息刷新 + +### 1.5 重构优势 + +✅ **代码可维护性提升**: 每个 composable 职责单一,易于理解和修改 +✅ **代码复用性提升**: Composables 可以在其他页面复用 +✅ **测试友好**: 每个 composable 可以独立测试 +✅ **团队协作**: 不同开发者可以并行开发不同的 composable +✅ **性能优化**: 可以按需加载 composables + +--- + +## 2. 任务详情页 (pages/task/detail) 重构 + +### 2.1 架构说明 + +任务详情页已完全解构为 **Composables + Components** 架构: + +- **主页面** (`index.vue`): 使用 `useTaskDetailSetup` 和 `useTaskDetailExports` 整合所有 composables +- **Composables**: 所有业务逻辑已解构到独立的 composable 文件中 +- **Components**: 所有 UI 组件已解构到独立的组件文件中 + +### 2.2 核心 Composables + +#### Setup 和 Exports +- **`useTaskDetailSetup.js`** - 整合所有 composables 的初始化逻辑 + - 初始化所有相关的 composables + - 处理 composable 之间的依赖关系 + - 返回所有需要的状态和函数 + +- **`useTaskDetailExports.js`** - 整合所有需要导出到模板的状态和函数 + - 从所有 composables 中提取需要的状态和函数 + - 组织并返回所有需要在模板中使用的值 + - 处理一些包装函数和计算逻辑 + +#### 数据管理 +- **`useTaskData.js`** - 任务数据管理 +- **`useTaskDataTransform.js`** - 任务数据转换 +- **`useTaskLifecycle.js`** - 任务生命周期管理 +- **`useTaskStatus.js`** - 任务状态管理 + +#### 权限和操作 +- **`useTaskPermissions.js`** - 任务权限判断 + - 显示/隐藏按钮权限 + - 操作权限判断 + - 编辑权限判断 + +- **`useTaskActions.js`** - 任务操作(删除、取消申请等) +- **`useTaskApplication.js`** - 任务申请相关 +- **`useTaskCompletion.js`** - 任务完成相关 +- **`useTaskCompletionOperations.js`** - 任务完成操作 +- **`useTaskEdit.js`** - 任务编辑 + +#### 团队相关 +- **`useTeamManagement.js`** - 团队管理 +- **`useTeamCreation.js`** - 团队创建 +- **`useTeamOperations.js`** - 团队操作 + +#### 投票系统 +- **`useVoteSystem.js`** - 投票系统 +- **`useVoteOperations.js`** - 投票操作 +- **`useVoteHelpers.js`** - 投票辅助函数 + +#### 工作记录 +- **`useWorkRecords.js`** - 工作记录管理 +- **`useWorkOperations.js`** - 工作操作 + +#### 徽章系统 +- **`useBadgeContributors.js`** - 徽章贡献者管理 +- **`useBadgeInitialization.js`** - 徽章初始化 + +#### 其他功能 +- **`useTaskMap.js`** - 任务地图相关 +- **`useFriendSearch.js`** - 好友搜索 +- **`useWebSocket.js`** - WebSocket 连接 +- **`useWebSocketHandlers.js`** - WebSocket 消息处理 +- **`useUserInfoCache.js`** - 用户信息缓存 +- **`useTaskUtils.js`** - 任务工具函数 +- **`useTaskHelpers.js`** - 任务辅助函数 +- **`useFormatUtils.js`** - 格式化工具函数 + +### 2.3 Components 列表 + +#### 主要组件 +- **`TaskHeader.vue`** - 任务头部(标题、发布者、状态) +- **`TaskInfoSection.vue`** - 任务信息展示区域 +- **`TaskMapSection.vue`** - 任务地图展示 +- **`TaskBadgesSection.vue`** - 任务徽章展示 +- **`TaskActionsSection.vue`** - 任务操作按钮区域 +- **`QuickActionsBar.vue`** - 快速操作栏 + +#### 团队相关组件 +- **`TeamMembersSection.vue`** - 团队成员展示 +- **`TeamInvitationModal.vue`** - 团队邀请模态框 +- **`TeamApplicationForm.vue`** - 团队申请表单 +- **`TeamManagement.vue`** - 团队管理组件 + +#### 投票相关组件 +- **`ActiveVotesSection.vue`** - 活跃投票展示 +- **`VoteHistorySection.vue`** - 投票历史展示 +- **`VoteSystem.vue`** - 投票系统组件 + +#### 工作记录组件 +- **`WorkRecordsSection.vue`** - 工作记录展示 +- **`WorkRecords.vue`** - 工作记录组件 + +#### 申请相关组件 +- **`ChallengeApplicationForm.vue`** - 挑战申请表单 +- **`ApplyCompleteForm.vue`** - 申请完成表单 +- **`ApplyCompletePreview.vue`** - 申请完成预览 +- **`CancelRequestModal.vue`** - 取消申请模态框 + +#### 其他组件 +- **`EditTaskModal.vue`** - 编辑任务模态框 +- **`FriendSearchSection.vue`** - 好友搜索区域 + +### 2.4 重构优势 + +✅ **代码组织清晰**: 每个功能模块独立,易于定位和修改 +✅ **可维护性高**: 修改某个功能不影响其他功能 +✅ **可测试性强**: 每个 composable 可以独立测试 +✅ **代码复用**: Composables 可以在其他页面复用 +✅ **性能优化**: 可以按需加载 composables + +--- + +## 3. 工具函数和配置优化 + +### 3.1 消息类型定义 + +**文件**: `utils/messageTypes.ts` + +统一的消息类型常量定义,与后端保持一致: + +- **系统消息** (-128 到 -1): 由系统自动生成,用户只需查看 +- **用户事务** (0 到 63): 由用户主动发送,需要接收方处理 +- **投票事务** (64 到 95): 投票相关消息,需要用户投票 +- **远程核验** (96 到 127): 核验相关消息 + +### 3.2 网络配置 + +**文件**: `config/network.js` + +统一的网络配置管理: + +- **API 基础 URL**: 根据环境动态配置 +- **WebSocket URL**: 根据环境动态配置 +- **请求超时时间**: 可配置 +- **重试机制**: 可配置重试次数和间隔 +- **调试模式**: `DEBUG` 开关控制调试输出 + +### 3.3 环境配置 + +**文件**: `config/environment.js` + +环境配置管理: + +- **开发环境**: `development` +- **生产环境**: `production` +- **测试环境**: `test` +- **手动环境开关**: 可手动指定环境 + +--- + +## 4. 调试机制优化 + +### 4.1 统一调试工具 + +所有调试输出都通过 `NETWORK_CONFIG.DEBUG` 控制: + +```javascript +// 调试工具函数 +const DEBUG = NETWORK_CONFIG && NETWORK_CONFIG.DEBUG +const debugLog = (...args) => { + if (DEBUG) { + console.log(...args) + } +} +const debugWarn = (...args) => { + if (DEBUG) { + console.warn(...args) + } +} +``` + +### 4.2 调试输出清理 + +已清理所有多余的测试输出: + +- ✅ 移除了详细的样式检查输出(仅在 DEBUG 模式下输出简化版本) +- ✅ 移除了重复的宽度对比信息(仅在 DEBUG 模式下输出关键信息) +- ✅ 移除了不必要的提示信息 +- ✅ 保留了关键的错误和警告信息 + +### 4.3 调试输出控制 + +- **生产环境** (`DEBUG: false`): 不会输出调试信息 +- **开发环境** (`DEBUG: true`): 会输出详细的调试信息 +- **错误日志** (`console.error`): 始终输出,便于排查问题 + +### 4.4 应用范围 + +以下文件已应用统一的调试机制: + +- ✅ `pages/task/detail/components/TaskMapSection.vue` +- ✅ `pages/task/detail/index.vue` +- ✅ `pages/task/detail/composables/useTaskPermissions.js` +- ✅ `pages/task/detail/composables/useTaskStatus.js` +- ✅ `pages/task/detail/composables/useTeamOperations.js` +- ✅ 其他 composables 文件(已使用 `NETWORK_CONFIG.DEBUG` 控制) + +--- + +## 5. 组件化改进 + +### 5.1 地图组件优化 + +**文件**: `pages/task/detail/components/TaskMapSection.vue` + +#### 主要改进 +- ✅ 统一了地图组件的宽度设置(`calc(100vw - 64px)`) +- ✅ 修复了地图滚动问题 +- ✅ 修复了地图交互问题(拖动、缩放) +- ✅ 统一了微信小程序和安卓端的显示效果 +- ✅ 优化了地图定位功能 +- ✅ 添加了调试输出机制 + +#### 样式优化 +- 地图容器宽度: `calc(100vw - 64px)` +- 地图元素宽度: `100%` +- 统一的边距和圆角 +- 统一的边框和阴影 + +### 5.2 导航修复 + +修复了导航到 tabbar 页面的问题: + +- ✅ `pages/task/detail/composables/useTaskActions.js` - 修复消息中心导航 +- ✅ `pages/task/detail/composables/useTeamOperations.js` - 修复聊天室导航 + +**修复前**: 使用 `uni.navigateTo` 导航到 tabbar 页面会报错 +**修复后**: 使用 `uni.switchTab` 导航到 tabbar 页面 + +--- + +## 6. 样式分布优化 + +### 6.1 样式分布原则 + +**文件**: `pages/task/detail/STYLE_DISTRIBUTION.md` + +#### 应该在组件文件中的样式 +每个组件文件(`.vue`)应该在 `