├── .eslintrc ├── .gitignore ├── README.md ├── alias.ts ├── package.json ├── packages ├── playground │ ├── .gitignore │ ├── .vscode │ │ └── extensions.json │ ├── @types │ │ ├── api │ │ │ ├── GET_Banner.d.ts │ │ │ ├── GET_PlaylistDetail.d.ts │ │ │ ├── GET_Search.d.ts │ │ │ ├── GET_TopPlaylistHighquality.d.ts │ │ │ └── GET_UserPlaylist.d.ts │ │ └── music │ │ │ └── GET_CommentMusic.d.ts │ ├── README.md │ ├── env.d.ts │ ├── index.html │ ├── package.json │ ├── public │ │ └── favicon.ico │ ├── src │ │ ├── App.vue │ │ ├── assets │ │ │ ├── base.css │ │ │ ├── logo.svg │ │ │ └── main.css │ │ └── main.ts │ └── vite.config.ts ├── shared │ ├── README.md │ ├── build.config.ts │ ├── package.json │ └── src │ │ ├── index.ts │ │ └── utils.ts └── vite │ ├── README.md │ ├── build.config.ts │ ├── package.json │ └── src │ ├── index.ts │ ├── logic.ts │ └── types.ts ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── tests └── base.test.ts ├── tsconfig.json └── vitest.config.ts /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["@antfu"], 3 | "overrides": [{ 4 | "files": "*", 5 | "rules": { 6 | "react/displayname": ["off"] 7 | } 8 | }] 9 | } 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | .idea 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ohmyts 2 | 3 | An automated tool help you to transform backend json data to TypeScript type. 4 | 5 | 6 | # Quick Start 7 | 8 | ## Vite 9 | 10 | ### install 11 | ```bash 12 | npm i @ohmyts/vite -D 13 | ``` 14 | 15 | ### 🤽playground 16 | [playground](https://stackblitz.com/edit/vitejs-vite-e1juy2?file=vite.config.ts&terminal=dev) 17 | 18 | ### usage 19 | 20 | #### `vite.config.ts` 21 | ```ts 22 | import { ohmytsVite } from '@ohmyts/vite' 23 | 24 | const r = (p: string) => resolve(__dirname, p) 25 | 26 | export default defineConfig({ 27 | plugins: [ 28 | ohmytsVite({ 29 | target: '/api', 30 | rootDir: r('@types'), 31 | proxyOptions: { 32 | target: 'https://autumnfish.cn', 33 | }, 34 | }), 35 | ] 36 | }) 37 | ``` 38 | 39 | #### `app.tsx` for more detail, please go [playground](https://stackblitz.com/edit/vitejs-vite-e1juy2?file=vite.config.ts&terminal=dev) to check 40 | ```tsx 41 | import axios from 'axios' 42 | import { defineComponent } from 'vue' 43 | 44 | const App = defineComponent(() => { 45 | const { data } = useQuery(() => axios.get('/api/search?keywords=MELANCHOLY')) 46 | 47 | return () => ( 48 | // ... 49 | ) 50 | }) 51 | ``` 52 | for example, if the backend return as below 53 | 54 | ```json 55 | { 56 | "data": 1 57 | } 58 | ``` 59 | 60 | it will create `@types/GET_Search.d.ts` as below 61 | ```ts 62 | declare interface IGETSearchResponseType { 63 | data: number 64 | } 65 | ``` 66 | 67 | #### File naming rule 68 | `${options.rootDir}/${req.Method}_${pathname(req.url)}` 69 | 70 | what is `pathname` function? for example 71 | 72 | ```ts 73 | pathname('/api/search?keywords=hello') === 'ApiSearch' 74 | ``` 75 | #### Type naming rule 76 | 77 | the rule of type name is `I${req.Method}${pathname(req.url)}${options.suffix}` 78 | 79 | 80 | #### Type 81 | ```ts 82 | import type { Plugin } from 'vite' 83 | 84 | declare function ohmytsVite(options: OhmytsOptions | OhmytsOptions[]): Plugin 85 | ``` 86 | 87 | #### Options 88 | ```ts 89 | import type { ServerOptions } from 'http-proxy' 90 | 91 | export interface OhmytsOptions { 92 | /* 93 | * rewrite url 94 | */ 95 | target: string 96 | /* 97 | * proxy server options 98 | * 99 | */ 100 | proxyOptions: ServerOptions 101 | /* 102 | * the root dir path generate type file 103 | * 104 | * @default '@types/' 105 | */ 106 | rootDir?: string 107 | /* 108 | * encoding 109 | * 110 | * @default 'utf-8' 111 | */ 112 | encoding?: BufferEncoding 113 | /* 114 | * the suffix of generated root type 115 | * 116 | * @default 'ResponseType' 117 | */ 118 | suffix?: string 119 | /* 120 | * should overwrite in next time 121 | * 122 | * @default true 123 | */ 124 | overwrite?: boolean 125 | /* 126 | * use `declare` to decorate type or it will be `export` 127 | * 128 | * @default true 129 | */ 130 | declare?: boolean 131 | } 132 | ``` 133 | -------------------------------------------------------------------------------- /alias.ts: -------------------------------------------------------------------------------- 1 | import { resolve } from 'path' 2 | 3 | const r = (p: string) => resolve(__dirname, p) 4 | 5 | export const alias: Record = { 6 | '@ohmyts/vite': r('./packages/vite'), 7 | '@ohmyts/shared': r('./packages/shared'), 8 | } 9 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ohmyts", 3 | "version": "0.0.8", 4 | "private": true, 5 | "author": "snowingfox", 6 | "license": "MIT", 7 | "scripts": { 8 | "typecheck": "tsc --noEmit", 9 | "test": "vitest", 10 | "test:update": "vitest -u", 11 | "build": "pnpm -r build" 12 | }, 13 | "dependencies": { 14 | "@ohmyts/shared": "workspace:*", 15 | "@ohmyts/vite": "workspace:*", 16 | "http-proxy": "^1.18.1", 17 | "json-to-ts": "^1.7.0", 18 | "magic-string": "^0.26.2", 19 | "unconfig": "^0.3.4", 20 | "url-parse": "^1.5.10" 21 | }, 22 | "devDependencies": { 23 | "@antfu/eslint-config": "^0.26.1", 24 | "@antfu/ni": "^0.17.2", 25 | "@ohmyts/vite": "workspace:*", 26 | "@types/http-proxy": "^1.17.9", 27 | "@types/node": "^18.7.9", 28 | "@types/url-parse": "^1.4.8", 29 | "eslint": "8.0.1", 30 | "fast-glob": "^3.2.11", 31 | "fs-extra": "^10.1.0", 32 | "gzip-size": "^6.0.0", 33 | "lint-staged": "^13.0.3", 34 | "prettier": "^2.7.1", 35 | "rollup": "^2.78.1", 36 | "terser": "^5.14.2", 37 | "tsup": "^6.2.2", 38 | "typescript": "^4.7.4", 39 | "unbuild": "^0.8.9", 40 | "unconfig": "^0.3.4", 41 | "vite": "3.0.9", 42 | "vitest": "^0.22.1" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /packages/playground/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | .DS_Store 12 | dist 13 | dist-ssr 14 | coverage 15 | *.local 16 | 17 | /cypress/videos/ 18 | /cypress/screenshots/ 19 | 20 | # Editor directories and files 21 | .vscode/* 22 | !.vscode/extensions.json 23 | .idea 24 | *.suo 25 | *.ntvs* 26 | *.njsproj 27 | *.sln 28 | *.sw? 29 | -------------------------------------------------------------------------------- /packages/playground/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"] 3 | } 4 | -------------------------------------------------------------------------------- /packages/playground/@types/api/GET_Banner.d.ts: -------------------------------------------------------------------------------- 1 | declare interface IGETBannerResponseType { 2 | isMusician: boolean; 3 | cnum: number; 4 | userId: number; 5 | topComments: any[]; 6 | moreHot: boolean; 7 | hotComments: HotComment[]; 8 | commentBanner?: any; 9 | code: number; 10 | comments: Comment[]; 11 | total: number; 12 | more: boolean; 13 | } 14 | interface Comment { 15 | user: User3; 16 | beReplied: BeReplied2[]; 17 | pendantData?: any; 18 | showFloorComment?: any; 19 | status: number; 20 | commentId: number; 21 | content: string; 22 | richContent?: any; 23 | contentResource?: any; 24 | time: number; 25 | timeStr: string; 26 | needDisplayTime: boolean; 27 | likedCount: number; 28 | expressionUrl?: any; 29 | commentLocationType: number; 30 | parentCommentId: number; 31 | decoration: Decoration; 32 | repliedMark?: any; 33 | grade?: any; 34 | userBizLevels?: any; 35 | liked: boolean; 36 | } 37 | interface Decoration { 38 | } 39 | interface BeReplied2 { 40 | user: User4; 41 | beRepliedCommentId: number; 42 | content: string; 43 | richContent?: any; 44 | status: number; 45 | expressionUrl?: any; 46 | } 47 | interface User4 { 48 | locationInfo?: any; 49 | liveInfo?: any; 50 | anonym: number; 51 | commonIdentity?: any; 52 | userId: number; 53 | avatarDetail?: any; 54 | userType: number; 55 | avatarUrl: string; 56 | followed: boolean; 57 | mutual: boolean; 58 | remarkName?: any; 59 | vipRights?: any; 60 | nickname: string; 61 | authStatus: number; 62 | expertTags?: any; 63 | experts?: any; 64 | vipType: number; 65 | } 66 | interface User3 { 67 | locationInfo?: any; 68 | liveInfo?: any; 69 | anonym: number; 70 | commonIdentity?: any; 71 | userId: number; 72 | avatarDetail?: any; 73 | userType: number; 74 | avatarUrl: string; 75 | followed: boolean; 76 | mutual: boolean; 77 | remarkName?: any; 78 | vipRights: VipRights; 79 | nickname: string; 80 | authStatus: number; 81 | expertTags?: any; 82 | experts?: any; 83 | vipType: number; 84 | } 85 | interface VipRights { 86 | associator: Associator; 87 | musicPackage: Associator; 88 | redplus?: any; 89 | redVipAnnualCount: number; 90 | redVipLevel: number; 91 | } 92 | interface HotComment { 93 | user: User; 94 | beReplied: BeReplied[]; 95 | pendantData?: PendantDatum; 96 | showFloorComment?: any; 97 | status: number; 98 | commentId: number; 99 | content: string; 100 | richContent?: any; 101 | contentResource?: any; 102 | time: number; 103 | timeStr: string; 104 | needDisplayTime: boolean; 105 | likedCount: number; 106 | expressionUrl?: any; 107 | commentLocationType: number; 108 | parentCommentId: number; 109 | decoration?: any; 110 | repliedMark?: any; 111 | grade?: any; 112 | userBizLevels?: any; 113 | liked: boolean; 114 | } 115 | interface PendantDatum { 116 | id: number; 117 | imageUrl: string; 118 | } 119 | interface BeReplied { 120 | user: User2; 121 | beRepliedCommentId: number; 122 | content: string; 123 | richContent?: any; 124 | status: number; 125 | expressionUrl?: any; 126 | } 127 | interface User2 { 128 | locationInfo?: any; 129 | liveInfo?: any; 130 | anonym: number; 131 | commonIdentity?: any; 132 | userId: number; 133 | avatarDetail: AvatarDetail; 134 | userType: number; 135 | avatarUrl: string; 136 | followed: boolean; 137 | mutual: boolean; 138 | remarkName?: any; 139 | vipRights?: any; 140 | nickname: string; 141 | authStatus: number; 142 | expertTags?: any; 143 | experts?: any; 144 | vipType: number; 145 | } 146 | interface User { 147 | locationInfo?: any; 148 | liveInfo?: any; 149 | anonym: number; 150 | commonIdentity?: any; 151 | userId: number; 152 | avatarDetail?: AvatarDetail; 153 | userType: number; 154 | avatarUrl: string; 155 | followed: boolean; 156 | mutual: boolean; 157 | remarkName?: any; 158 | vipRights?: VipRight; 159 | nickname: string; 160 | authStatus: number; 161 | expertTags?: any; 162 | experts?: any; 163 | vipType: number; 164 | } 165 | interface VipRight { 166 | associator?: Associator; 167 | musicPackage?: Associator; 168 | redplus?: any; 169 | redVipAnnualCount: number; 170 | redVipLevel: number; 171 | } 172 | interface Associator { 173 | vipCode: number; 174 | rights: boolean; 175 | iconUrl: string; 176 | } 177 | interface AvatarDetail { 178 | userType: number; 179 | identityLevel: number; 180 | identityIconUrl: string; 181 | } -------------------------------------------------------------------------------- /packages/playground/@types/api/GET_PlaylistDetail.d.ts: -------------------------------------------------------------------------------- 1 | declare interface IGETPlaylistDetailResponseType { 2 | banners: Banner[]; 3 | code: number; 4 | } 5 | interface Banner { 6 | imageUrl: string; 7 | targetId: number; 8 | adid?: any; 9 | targetType: number; 10 | titleColor: string; 11 | typeTitle: string; 12 | url?: string; 13 | exclusive: boolean; 14 | monitorImpress?: any; 15 | monitorClick?: any; 16 | monitorType?: any; 17 | monitorImpressList?: any; 18 | monitorClickList?: any; 19 | monitorBlackList?: any; 20 | extMonitor?: any; 21 | extMonitorInfo?: any; 22 | adSource?: any; 23 | adLocation?: any; 24 | adDispatchJson?: any; 25 | encodeId: string; 26 | program?: any; 27 | event?: any; 28 | video?: any; 29 | song?: any; 30 | scm: string; 31 | } -------------------------------------------------------------------------------- /packages/playground/@types/api/GET_Search.d.ts: -------------------------------------------------------------------------------- 1 | declare interface IGETSearchResponseType { 2 | code: number; 3 | relatedVideos?: any; 4 | playlist: Playlist; 5 | urls?: any; 6 | privileges: Privilege[]; 7 | sharedPrivilege?: any; 8 | resEntrance?: any; 9 | } 10 | interface Privilege { 11 | id: number; 12 | fee: number; 13 | payed: number; 14 | realPayed: number; 15 | st: number; 16 | pl: number; 17 | dl: number; 18 | sp: number; 19 | cp: number; 20 | subp: number; 21 | cs: boolean; 22 | maxbr: number; 23 | fl: number; 24 | pc?: any; 25 | toast: boolean; 26 | flag: number; 27 | paidBigBang: boolean; 28 | preSell: boolean; 29 | playMaxbr: number; 30 | downloadMaxbr: number; 31 | maxBrLevel: string; 32 | playMaxBrLevel: string; 33 | downloadMaxBrLevel: string; 34 | plLevel: string; 35 | dlLevel: string; 36 | flLevel: string; 37 | rscl?: any; 38 | freeTrialPrivilege: FreeTrialPrivilege; 39 | chargeInfoList: ChargeInfoList[]; 40 | } 41 | interface ChargeInfoList { 42 | rate: number; 43 | chargeUrl?: any; 44 | chargeMessage?: any; 45 | chargeType: number; 46 | } 47 | interface FreeTrialPrivilege { 48 | resConsumable: boolean; 49 | userConsumable: boolean; 50 | listenType?: any; 51 | } 52 | interface Playlist { 53 | id: number; 54 | name: string; 55 | coverImgId: number; 56 | coverImgUrl: string; 57 | coverImgId_str?: any; 58 | adType: number; 59 | userId: number; 60 | createTime: number; 61 | status: number; 62 | opRecommend: boolean; 63 | highQuality: boolean; 64 | newImported: boolean; 65 | updateTime: number; 66 | trackCount: number; 67 | specialType: number; 68 | privacy: number; 69 | trackUpdateTime: number; 70 | commentThreadId: string; 71 | playCount: number; 72 | trackNumberUpdateTime: number; 73 | subscribedCount: number; 74 | cloudTrackCount: number; 75 | ordered: boolean; 76 | description?: any; 77 | tags: any[]; 78 | updateFrequency?: any; 79 | backgroundCoverId: number; 80 | backgroundCoverUrl?: any; 81 | titleImage: number; 82 | titleImageUrl?: any; 83 | englishTitle?: any; 84 | officialPlaylistType?: any; 85 | copied: boolean; 86 | subscribers: Subscriber[]; 87 | subscribed: boolean; 88 | creator: Creator; 89 | tracks: Track[]; 90 | videoIds?: any; 91 | videos?: any; 92 | trackIds: TrackId[]; 93 | bannedTrackIds?: any; 94 | shareCount: number; 95 | commentCount: number; 96 | remixVideo?: any; 97 | sharedUsers?: any; 98 | historySharedUsers?: any; 99 | gradeStatus: string; 100 | score?: any; 101 | algTags?: any; 102 | } 103 | interface TrackId { 104 | id: number; 105 | v: number; 106 | t: number; 107 | at: number; 108 | alg?: any; 109 | uid: number; 110 | rcmdReason: string; 111 | sc?: any; 112 | } 113 | interface Track { 114 | name: string; 115 | id: number; 116 | pst: number; 117 | t: number; 118 | ar: Ar[]; 119 | alia: any[]; 120 | pop: number; 121 | st: number; 122 | rt: string; 123 | fee: number; 124 | v: number; 125 | crbt?: any; 126 | cf: string; 127 | al: Al; 128 | dt: number; 129 | h: H; 130 | m: H; 131 | l: H; 132 | sq?: H; 133 | hr?: any; 134 | a?: any; 135 | cd: string; 136 | no: number; 137 | rtUrl?: any; 138 | ftype: number; 139 | rtUrls: any[]; 140 | djId: number; 141 | copyright: number; 142 | s_id: number; 143 | mark: number; 144 | originCoverType: number; 145 | originSongSimpleData?: any; 146 | tagPicList?: any; 147 | resourceState: boolean; 148 | version: number; 149 | songJumpInfo?: any; 150 | entertainmentTags?: any; 151 | single: number; 152 | noCopyrightRcmd?: any; 153 | rurl?: any; 154 | rtype: number; 155 | mv: number; 156 | mst: number; 157 | cp: number; 158 | publishTime: number; 159 | } 160 | interface H { 161 | br: number; 162 | fid: number; 163 | size: number; 164 | vd: number; 165 | sr: number; 166 | } 167 | interface Al { 168 | id: number; 169 | name: string; 170 | picUrl: string; 171 | tns: any[]; 172 | pic: number; 173 | } 174 | interface Ar { 175 | id: number; 176 | name: string; 177 | tns: any[]; 178 | alias: any[]; 179 | } 180 | interface Creator { 181 | defaultAvatar: boolean; 182 | province: number; 183 | authStatus: number; 184 | followed: boolean; 185 | avatarUrl: string; 186 | accountStatus: number; 187 | gender: number; 188 | city: number; 189 | birthday: number; 190 | userId: number; 191 | userType: number; 192 | nickname: string; 193 | signature: string; 194 | description: string; 195 | detailDescription: string; 196 | avatarImgId: number; 197 | backgroundImgId: number; 198 | backgroundUrl: string; 199 | authority: number; 200 | mutual: boolean; 201 | expertTags?: any; 202 | experts?: any; 203 | djStatus: number; 204 | vipType: number; 205 | remarkName?: any; 206 | authenticationTypes: number; 207 | avatarDetail?: any; 208 | backgroundImgIdStr: string; 209 | anchor: boolean; 210 | avatarImgIdStr: string; 211 | } 212 | interface Subscriber { 213 | defaultAvatar: boolean; 214 | province: number; 215 | authStatus: number; 216 | followed: boolean; 217 | avatarUrl: string; 218 | accountStatus: number; 219 | gender: number; 220 | city: number; 221 | birthday: number; 222 | userId: number; 223 | userType: number; 224 | nickname: string; 225 | signature: string; 226 | description: string; 227 | detailDescription: string; 228 | avatarImgId: number; 229 | backgroundImgId: number; 230 | backgroundUrl: string; 231 | authority: number; 232 | mutual: boolean; 233 | expertTags?: any; 234 | experts?: any; 235 | djStatus: number; 236 | vipType: number; 237 | remarkName?: any; 238 | authenticationTypes: number; 239 | avatarDetail?: any; 240 | backgroundImgIdStr: string; 241 | anchor: boolean; 242 | avatarImgIdStr: string; 243 | avatarImgId_str: string; 244 | } -------------------------------------------------------------------------------- /packages/playground/@types/api/GET_TopPlaylistHighquality.d.ts: -------------------------------------------------------------------------------- 1 | declare interface IGETTopPlaylistHighqualityResponseType { 2 | code: number; 3 | relatedVideos?: any; 4 | playlist: Playlist; 5 | urls?: any; 6 | privileges: Privilege[]; 7 | sharedPrivilege?: any; 8 | resEntrance?: any; 9 | } 10 | interface Privilege { 11 | id: number; 12 | fee: number; 13 | payed: number; 14 | realPayed: number; 15 | st: number; 16 | pl: number; 17 | dl: number; 18 | sp: number; 19 | cp: number; 20 | subp: number; 21 | cs: boolean; 22 | maxbr: number; 23 | fl: number; 24 | pc?: any; 25 | toast: boolean; 26 | flag: number; 27 | paidBigBang: boolean; 28 | preSell: boolean; 29 | playMaxbr: number; 30 | downloadMaxbr: number; 31 | maxBrLevel: string; 32 | playMaxBrLevel: string; 33 | downloadMaxBrLevel: string; 34 | plLevel: string; 35 | dlLevel: string; 36 | flLevel: string; 37 | rscl?: any; 38 | freeTrialPrivilege: FreeTrialPrivilege; 39 | chargeInfoList: ChargeInfoList[]; 40 | } 41 | interface ChargeInfoList { 42 | rate: number; 43 | chargeUrl?: any; 44 | chargeMessage?: any; 45 | chargeType: number; 46 | } 47 | interface FreeTrialPrivilege { 48 | resConsumable: boolean; 49 | userConsumable: boolean; 50 | listenType?: any; 51 | } 52 | interface Playlist { 53 | id: number; 54 | name: string; 55 | coverImgId: number; 56 | coverImgUrl: string; 57 | coverImgId_str?: any; 58 | adType: number; 59 | userId: number; 60 | createTime: number; 61 | status: number; 62 | opRecommend: boolean; 63 | highQuality: boolean; 64 | newImported: boolean; 65 | updateTime: number; 66 | trackCount: number; 67 | specialType: number; 68 | privacy: number; 69 | trackUpdateTime: number; 70 | commentThreadId: string; 71 | playCount: number; 72 | trackNumberUpdateTime: number; 73 | subscribedCount: number; 74 | cloudTrackCount: number; 75 | ordered: boolean; 76 | description?: any; 77 | tags: any[]; 78 | updateFrequency?: any; 79 | backgroundCoverId: number; 80 | backgroundCoverUrl?: any; 81 | titleImage: number; 82 | titleImageUrl?: any; 83 | englishTitle?: any; 84 | officialPlaylistType?: any; 85 | copied: boolean; 86 | subscribers: Subscriber[]; 87 | subscribed: boolean; 88 | creator: Creator; 89 | tracks: Track[]; 90 | videoIds?: any; 91 | videos?: any; 92 | trackIds: TrackId[]; 93 | bannedTrackIds?: any; 94 | shareCount: number; 95 | commentCount: number; 96 | remixVideo?: any; 97 | sharedUsers?: any; 98 | historySharedUsers?: any; 99 | gradeStatus: string; 100 | score?: any; 101 | algTags?: any; 102 | } 103 | interface TrackId { 104 | id: number; 105 | v: number; 106 | t: number; 107 | at: number; 108 | alg?: any; 109 | uid: number; 110 | rcmdReason: string; 111 | sc?: any; 112 | } 113 | interface Track { 114 | name: string; 115 | id: number; 116 | pst: number; 117 | t: number; 118 | ar: Ar[]; 119 | alia: any[]; 120 | pop: number; 121 | st: number; 122 | rt: string; 123 | fee: number; 124 | v: number; 125 | crbt?: any; 126 | cf: string; 127 | al: Al; 128 | dt: number; 129 | h: H; 130 | m: H; 131 | l: H; 132 | sq?: H; 133 | hr?: any; 134 | a?: any; 135 | cd: string; 136 | no: number; 137 | rtUrl?: any; 138 | ftype: number; 139 | rtUrls: any[]; 140 | djId: number; 141 | copyright: number; 142 | s_id: number; 143 | mark: number; 144 | originCoverType: number; 145 | originSongSimpleData?: any; 146 | tagPicList?: any; 147 | resourceState: boolean; 148 | version: number; 149 | songJumpInfo?: any; 150 | entertainmentTags?: any; 151 | single: number; 152 | noCopyrightRcmd?: any; 153 | rurl?: any; 154 | rtype: number; 155 | mv: number; 156 | mst: number; 157 | cp: number; 158 | publishTime: number; 159 | } 160 | interface H { 161 | br: number; 162 | fid: number; 163 | size: number; 164 | vd: number; 165 | sr: number; 166 | } 167 | interface Al { 168 | id: number; 169 | name: string; 170 | picUrl: string; 171 | tns: any[]; 172 | pic: number; 173 | } 174 | interface Ar { 175 | id: number; 176 | name: string; 177 | tns: any[]; 178 | alias: any[]; 179 | } 180 | interface Creator { 181 | defaultAvatar: boolean; 182 | province: number; 183 | authStatus: number; 184 | followed: boolean; 185 | avatarUrl: string; 186 | accountStatus: number; 187 | gender: number; 188 | city: number; 189 | birthday: number; 190 | userId: number; 191 | userType: number; 192 | nickname: string; 193 | signature: string; 194 | description: string; 195 | detailDescription: string; 196 | avatarImgId: number; 197 | backgroundImgId: number; 198 | backgroundUrl: string; 199 | authority: number; 200 | mutual: boolean; 201 | expertTags?: any; 202 | experts?: any; 203 | djStatus: number; 204 | vipType: number; 205 | remarkName?: any; 206 | authenticationTypes: number; 207 | avatarDetail?: any; 208 | backgroundImgIdStr: string; 209 | anchor: boolean; 210 | avatarImgIdStr: string; 211 | } 212 | interface Subscriber { 213 | defaultAvatar: boolean; 214 | province: number; 215 | authStatus: number; 216 | followed: boolean; 217 | avatarUrl: string; 218 | accountStatus: number; 219 | gender: number; 220 | city: number; 221 | birthday: number; 222 | userId: number; 223 | userType: number; 224 | nickname: string; 225 | signature: string; 226 | description: string; 227 | detailDescription: string; 228 | avatarImgId: number; 229 | backgroundImgId: number; 230 | backgroundUrl: string; 231 | authority: number; 232 | mutual: boolean; 233 | expertTags?: any; 234 | experts?: any; 235 | djStatus: number; 236 | vipType: number; 237 | remarkName?: any; 238 | authenticationTypes: number; 239 | avatarDetail?: any; 240 | backgroundImgIdStr: string; 241 | anchor: boolean; 242 | avatarImgIdStr: string; 243 | avatarImgId_str: string; 244 | } -------------------------------------------------------------------------------- /packages/playground/@types/api/GET_UserPlaylist.d.ts: -------------------------------------------------------------------------------- 1 | declare interface IGETUserPlaylistResponseType { 2 | code: number; 3 | relatedVideos?: any; 4 | playlist: Playlist; 5 | urls?: any; 6 | privileges: Privilege[]; 7 | sharedPrivilege?: any; 8 | resEntrance?: any; 9 | } 10 | interface Privilege { 11 | id: number; 12 | fee: number; 13 | payed: number; 14 | realPayed: number; 15 | st: number; 16 | pl: number; 17 | dl: number; 18 | sp: number; 19 | cp: number; 20 | subp: number; 21 | cs: boolean; 22 | maxbr: number; 23 | fl: number; 24 | pc?: any; 25 | toast: boolean; 26 | flag: number; 27 | paidBigBang: boolean; 28 | preSell: boolean; 29 | playMaxbr: number; 30 | downloadMaxbr: number; 31 | maxBrLevel: string; 32 | playMaxBrLevel: string; 33 | downloadMaxBrLevel: string; 34 | plLevel: string; 35 | dlLevel: string; 36 | flLevel: string; 37 | rscl?: any; 38 | freeTrialPrivilege: FreeTrialPrivilege; 39 | chargeInfoList: ChargeInfoList[]; 40 | } 41 | interface ChargeInfoList { 42 | rate: number; 43 | chargeUrl?: any; 44 | chargeMessage?: any; 45 | chargeType: number; 46 | } 47 | interface FreeTrialPrivilege { 48 | resConsumable: boolean; 49 | userConsumable: boolean; 50 | listenType?: any; 51 | } 52 | interface Playlist { 53 | id: number; 54 | name: string; 55 | coverImgId: number; 56 | coverImgUrl: string; 57 | coverImgId_str?: any; 58 | adType: number; 59 | userId: number; 60 | createTime: number; 61 | status: number; 62 | opRecommend: boolean; 63 | highQuality: boolean; 64 | newImported: boolean; 65 | updateTime: number; 66 | trackCount: number; 67 | specialType: number; 68 | privacy: number; 69 | trackUpdateTime: number; 70 | commentThreadId: string; 71 | playCount: number; 72 | trackNumberUpdateTime: number; 73 | subscribedCount: number; 74 | cloudTrackCount: number; 75 | ordered: boolean; 76 | description?: any; 77 | tags: any[]; 78 | updateFrequency?: any; 79 | backgroundCoverId: number; 80 | backgroundCoverUrl?: any; 81 | titleImage: number; 82 | titleImageUrl?: any; 83 | englishTitle?: any; 84 | officialPlaylistType?: any; 85 | copied: boolean; 86 | subscribers: Subscriber[]; 87 | subscribed: boolean; 88 | creator: Creator; 89 | tracks: Track[]; 90 | videoIds?: any; 91 | videos?: any; 92 | trackIds: TrackId[]; 93 | bannedTrackIds?: any; 94 | shareCount: number; 95 | commentCount: number; 96 | remixVideo?: any; 97 | sharedUsers?: any; 98 | historySharedUsers?: any; 99 | gradeStatus: string; 100 | score?: any; 101 | algTags?: any; 102 | } 103 | interface TrackId { 104 | id: number; 105 | v: number; 106 | t: number; 107 | at: number; 108 | alg?: any; 109 | uid: number; 110 | rcmdReason: string; 111 | sc?: any; 112 | } 113 | interface Track { 114 | name: string; 115 | id: number; 116 | pst: number; 117 | t: number; 118 | ar: Ar[]; 119 | alia: any[]; 120 | pop: number; 121 | st: number; 122 | rt: string; 123 | fee: number; 124 | v: number; 125 | crbt?: any; 126 | cf: string; 127 | al: Al; 128 | dt: number; 129 | h: H; 130 | m: H; 131 | l: H; 132 | sq?: H; 133 | hr?: any; 134 | a?: any; 135 | cd: string; 136 | no: number; 137 | rtUrl?: any; 138 | ftype: number; 139 | rtUrls: any[]; 140 | djId: number; 141 | copyright: number; 142 | s_id: number; 143 | mark: number; 144 | originCoverType: number; 145 | originSongSimpleData?: any; 146 | tagPicList?: any; 147 | resourceState: boolean; 148 | version: number; 149 | songJumpInfo?: any; 150 | entertainmentTags?: any; 151 | single: number; 152 | noCopyrightRcmd?: any; 153 | rurl?: any; 154 | rtype: number; 155 | mv: number; 156 | mst: number; 157 | cp: number; 158 | publishTime: number; 159 | } 160 | interface H { 161 | br: number; 162 | fid: number; 163 | size: number; 164 | vd: number; 165 | sr: number; 166 | } 167 | interface Al { 168 | id: number; 169 | name: string; 170 | picUrl: string; 171 | tns: any[]; 172 | pic: number; 173 | } 174 | interface Ar { 175 | id: number; 176 | name: string; 177 | tns: any[]; 178 | alias: any[]; 179 | } 180 | interface Creator { 181 | defaultAvatar: boolean; 182 | province: number; 183 | authStatus: number; 184 | followed: boolean; 185 | avatarUrl: string; 186 | accountStatus: number; 187 | gender: number; 188 | city: number; 189 | birthday: number; 190 | userId: number; 191 | userType: number; 192 | nickname: string; 193 | signature: string; 194 | description: string; 195 | detailDescription: string; 196 | avatarImgId: number; 197 | backgroundImgId: number; 198 | backgroundUrl: string; 199 | authority: number; 200 | mutual: boolean; 201 | expertTags?: any; 202 | experts?: any; 203 | djStatus: number; 204 | vipType: number; 205 | remarkName?: any; 206 | authenticationTypes: number; 207 | avatarDetail?: any; 208 | backgroundImgIdStr: string; 209 | anchor: boolean; 210 | avatarImgIdStr: string; 211 | } 212 | interface Subscriber { 213 | defaultAvatar: boolean; 214 | province: number; 215 | authStatus: number; 216 | followed: boolean; 217 | avatarUrl: string; 218 | accountStatus: number; 219 | gender: number; 220 | city: number; 221 | birthday: number; 222 | userId: number; 223 | userType: number; 224 | nickname: string; 225 | signature: string; 226 | description: string; 227 | detailDescription: string; 228 | avatarImgId: number; 229 | backgroundImgId: number; 230 | backgroundUrl: string; 231 | authority: number; 232 | mutual: boolean; 233 | expertTags?: any; 234 | experts?: any; 235 | djStatus: number; 236 | vipType: number; 237 | remarkName?: any; 238 | authenticationTypes: number; 239 | avatarDetail?: any; 240 | backgroundImgIdStr: string; 241 | anchor: boolean; 242 | avatarImgIdStr: string; 243 | avatarImgId_str: string; 244 | } -------------------------------------------------------------------------------- /packages/playground/@types/music/GET_CommentMusic.d.ts: -------------------------------------------------------------------------------- 1 | declare interface IGETCommentMusicResponseType { 2 | isMusician: boolean; 3 | cnum: number; 4 | userId: number; 5 | topComments: any[]; 6 | moreHot: boolean; 7 | hotComments: HotComment[]; 8 | commentBanner?: any; 9 | code: number; 10 | comments: Comment[]; 11 | total: number; 12 | more: boolean; 13 | } 14 | interface Comment { 15 | user: User3; 16 | beReplied: BeReplied2[]; 17 | pendantData?: any; 18 | showFloorComment?: any; 19 | status: number; 20 | commentId: number; 21 | content: string; 22 | richContent?: any; 23 | contentResource?: any; 24 | time: number; 25 | timeStr: string; 26 | needDisplayTime: boolean; 27 | likedCount: number; 28 | expressionUrl?: any; 29 | commentLocationType: number; 30 | parentCommentId: number; 31 | decoration: Decoration; 32 | repliedMark?: any; 33 | grade?: any; 34 | userBizLevels?: any; 35 | liked: boolean; 36 | } 37 | interface Decoration { 38 | } 39 | interface BeReplied2 { 40 | user: User4; 41 | beRepliedCommentId: number; 42 | content: string; 43 | richContent?: any; 44 | status: number; 45 | expressionUrl?: any; 46 | } 47 | interface User4 { 48 | locationInfo?: any; 49 | liveInfo?: any; 50 | anonym: number; 51 | commonIdentity?: any; 52 | userId: number; 53 | avatarDetail?: any; 54 | userType: number; 55 | avatarUrl: string; 56 | followed: boolean; 57 | mutual: boolean; 58 | remarkName?: any; 59 | vipRights?: any; 60 | nickname: string; 61 | authStatus: number; 62 | expertTags?: any; 63 | experts?: any; 64 | vipType: number; 65 | } 66 | interface User3 { 67 | locationInfo?: any; 68 | liveInfo?: any; 69 | anonym: number; 70 | commonIdentity?: any; 71 | userId: number; 72 | avatarDetail?: any; 73 | userType: number; 74 | avatarUrl: string; 75 | followed: boolean; 76 | mutual: boolean; 77 | remarkName?: any; 78 | vipRights: VipRights; 79 | nickname: string; 80 | authStatus: number; 81 | expertTags?: any; 82 | experts?: any; 83 | vipType: number; 84 | } 85 | interface VipRights { 86 | associator: Associator; 87 | musicPackage: Associator; 88 | redplus?: any; 89 | redVipAnnualCount: number; 90 | redVipLevel: number; 91 | } 92 | interface HotComment { 93 | user: User; 94 | beReplied: BeReplied[]; 95 | pendantData?: PendantDatum; 96 | showFloorComment?: any; 97 | status: number; 98 | commentId: number; 99 | content: string; 100 | richContent?: any; 101 | contentResource?: any; 102 | time: number; 103 | timeStr: string; 104 | needDisplayTime: boolean; 105 | likedCount: number; 106 | expressionUrl?: any; 107 | commentLocationType: number; 108 | parentCommentId: number; 109 | decoration?: any; 110 | repliedMark?: any; 111 | grade?: any; 112 | userBizLevels?: any; 113 | liked: boolean; 114 | } 115 | interface PendantDatum { 116 | id: number; 117 | imageUrl: string; 118 | } 119 | interface BeReplied { 120 | user: User2; 121 | beRepliedCommentId: number; 122 | content: string; 123 | richContent?: any; 124 | status: number; 125 | expressionUrl?: any; 126 | } 127 | interface User2 { 128 | locationInfo?: any; 129 | liveInfo?: any; 130 | anonym: number; 131 | commonIdentity?: any; 132 | userId: number; 133 | avatarDetail: AvatarDetail; 134 | userType: number; 135 | avatarUrl: string; 136 | followed: boolean; 137 | mutual: boolean; 138 | remarkName?: any; 139 | vipRights?: any; 140 | nickname: string; 141 | authStatus: number; 142 | expertTags?: any; 143 | experts?: any; 144 | vipType: number; 145 | } 146 | interface User { 147 | locationInfo?: any; 148 | liveInfo?: any; 149 | anonym: number; 150 | commonIdentity?: any; 151 | userId: number; 152 | avatarDetail?: AvatarDetail; 153 | userType: number; 154 | avatarUrl: string; 155 | followed: boolean; 156 | mutual: boolean; 157 | remarkName?: any; 158 | vipRights?: VipRight; 159 | nickname: string; 160 | authStatus: number; 161 | expertTags?: any; 162 | experts?: any; 163 | vipType: number; 164 | } 165 | interface VipRight { 166 | associator?: Associator; 167 | musicPackage?: Associator; 168 | redplus?: any; 169 | redVipAnnualCount: number; 170 | redVipLevel: number; 171 | } 172 | interface Associator { 173 | vipCode: number; 174 | rights: boolean; 175 | iconUrl: string; 176 | } 177 | interface AvatarDetail { 178 | userType: number; 179 | identityLevel: number; 180 | identityIconUrl: string; 181 | } -------------------------------------------------------------------------------- /packages/playground/README.md: -------------------------------------------------------------------------------- 1 | # vite-project 2 | 3 | This template should help get you started developing with Vue 3 in Vite. 4 | 5 | ## Recommended IDE Setup 6 | 7 | [VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin). 8 | 9 | ## Type Support for `.vue` Imports in TS 10 | 11 | TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin) to make the TypeScript language service aware of `.vue` types. 12 | 13 | If the standalone TypeScript plugin doesn't feel fast enough to you, Volar has also implemented a [Take Over Mode](https://github.com/johnsoncodehk/volar/discussions/471#discussioncomment-1361669) that is more performant. You can enable it by the following steps: 14 | 15 | 1. Disable the built-in TypeScript Extension 16 | 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette 17 | 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)` 18 | 2. Reload the VSCode window by running `Developer: Reload Window` from the command palette. 19 | 20 | ## Customize configuration 21 | 22 | See [Vite Configuration Reference](https://vitejs.dev/config/). 23 | 24 | ## Project Setup 25 | 26 | ```sh 27 | pnpm install 28 | ``` 29 | 30 | ### Compile and Hot-Reload for Development 31 | 32 | ```sh 33 | pnpm dev 34 | ``` 35 | 36 | ### Type-Check, Compile and Minify for Production 37 | 38 | ```sh 39 | pnpm build 40 | ``` 41 | -------------------------------------------------------------------------------- /packages/playground/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /packages/playground/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite App 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /packages/playground/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@ohmyts/playground", 3 | "version": "0.0.8", 4 | "scripts": { 5 | "dev": "vite", 6 | "build": "run-p type-check build-only", 7 | "preview": "vite preview --port 4173", 8 | "build-only": "vite build", 9 | "type-check": "vue-tsc --noEmit" 10 | }, 11 | "dependencies": { 12 | "@vueuse/core": "^9.2.0", 13 | "axios": "^0.27.2", 14 | "pinia": "^2.0.21", 15 | "vue": "^3.2.38", 16 | "vue-router": "^4.1.5" 17 | }, 18 | "devDependencies": { 19 | "@vitejs/plugin-vue": "^3.0.3", 20 | "@vitejs/plugin-vue-jsx": "^2.0.1", 21 | "@vue/tsconfig": "^0.1.3", 22 | "npm-run-all": "^4.1.5", 23 | "vue-tsc": "^0.40.7" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /packages/playground/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SnowingFox/ohmyts/494863bfaf85818a0a4755f4938eb154bc684aa1/packages/playground/public/favicon.ico -------------------------------------------------------------------------------- /packages/playground/src/App.vue: -------------------------------------------------------------------------------- 1 | 28 | 29 | 35 | 36 | 42 | -------------------------------------------------------------------------------- /packages/playground/src/assets/base.css: -------------------------------------------------------------------------------- 1 | /* color palette from */ 2 | :root { 3 | --vt-c-white: #ffffff; 4 | --vt-c-white-soft: #f8f8f8; 5 | --vt-c-white-mute: #f2f2f2; 6 | 7 | --vt-c-black: #181818; 8 | --vt-c-black-soft: #222222; 9 | --vt-c-black-mute: #282828; 10 | 11 | --vt-c-indigo: #2c3e50; 12 | 13 | --vt-c-divider-light-1: rgba(60, 60, 60, 0.29); 14 | --vt-c-divider-light-2: rgba(60, 60, 60, 0.12); 15 | --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65); 16 | --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48); 17 | 18 | --vt-c-text-light-1: var(--vt-c-indigo); 19 | --vt-c-text-light-2: rgba(60, 60, 60, 0.66); 20 | --vt-c-text-dark-1: var(--vt-c-white); 21 | --vt-c-text-dark-2: rgba(235, 235, 235, 0.64); 22 | } 23 | 24 | /* semantic color variables for this project */ 25 | :root { 26 | --color-background: var(--vt-c-white); 27 | --color-background-soft: var(--vt-c-white-soft); 28 | --color-background-mute: var(--vt-c-white-mute); 29 | 30 | --color-border: var(--vt-c-divider-light-2); 31 | --color-border-hover: var(--vt-c-divider-light-1); 32 | 33 | --color-heading: var(--vt-c-text-light-1); 34 | --color-text: var(--vt-c-text-light-1); 35 | 36 | --section-gap: 160px; 37 | } 38 | 39 | @media (prefers-color-scheme: dark) { 40 | :root { 41 | --color-background: var(--vt-c-black); 42 | --color-background-soft: var(--vt-c-black-soft); 43 | --color-background-mute: var(--vt-c-black-mute); 44 | 45 | --color-border: var(--vt-c-divider-dark-2); 46 | --color-border-hover: var(--vt-c-divider-dark-1); 47 | 48 | --color-heading: var(--vt-c-text-dark-1); 49 | --color-text: var(--vt-c-text-dark-2); 50 | } 51 | } 52 | 53 | *, 54 | *::before, 55 | *::after { 56 | box-sizing: border-box; 57 | margin: 0; 58 | position: relative; 59 | font-weight: normal; 60 | } 61 | 62 | body { 63 | min-height: 100vh; 64 | color: var(--color-text); 65 | background: var(--color-background); 66 | transition: color 0.5s, background-color 0.5s; 67 | line-height: 1.6; 68 | font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, 69 | Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; 70 | font-size: 15px; 71 | text-rendering: optimizeLegibility; 72 | -webkit-font-smoothing: antialiased; 73 | -moz-osx-font-smoothing: grayscale; 74 | } 75 | -------------------------------------------------------------------------------- /packages/playground/src/assets/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/playground/src/assets/main.css: -------------------------------------------------------------------------------- 1 | @import "./base.css"; 2 | 3 | #app { 4 | max-width: 1280px; 5 | margin: 0 auto; 6 | padding: 2rem; 7 | 8 | font-weight: normal; 9 | } 10 | 11 | a, 12 | .green { 13 | text-decoration: none; 14 | color: hsla(160, 100%, 37%, 1); 15 | transition: 0.4s; 16 | } 17 | 18 | @media (hover: hover) { 19 | a:hover { 20 | background-color: hsla(160, 100%, 37%, 0.2); 21 | } 22 | } 23 | 24 | @media (min-width: 1024px) { 25 | body { 26 | display: flex; 27 | place-items: center; 28 | } 29 | 30 | #app { 31 | display: grid; 32 | grid-template-columns: 1fr 1fr; 33 | padding: 0 2rem; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /packages/playground/src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import './assets/main.css' 3 | 4 | import App from './App.vue' 5 | 6 | const app = createApp(App) 7 | 8 | app.mount('#app') 9 | -------------------------------------------------------------------------------- /packages/playground/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { URL, fileURLToPath } from 'node:url' 2 | import { resolve } from 'path' 3 | import { ohmytsVite } from '@ohmyts/vite' 4 | 5 | import { defineConfig } from 'vite' 6 | import vue from '@vitejs/plugin-vue' 7 | import vueJsx from '@vitejs/plugin-vue-jsx' 8 | 9 | const r = (p: string) => resolve(__dirname, p) 10 | 11 | // https://vitejs.dev/config/ 12 | export default defineConfig({ 13 | plugins: [ 14 | ohmytsVite([ 15 | { 16 | target: '/api', 17 | rootDir: r('@types/api'), 18 | proxyOptions: { 19 | target: 'https://autumnfish.cn', 20 | }, 21 | }, 22 | { 23 | target: '/music', 24 | rootDir: r('@types/music'), 25 | proxyOptions: { 26 | target: 'https://autumnfish.cn', 27 | }, 28 | }, 29 | ]), 30 | vue({ 31 | reactivityTransform: true, 32 | })], 33 | resolve: { 34 | alias: { 35 | '@': fileURLToPath(new URL('./src', import.meta.url)), 36 | }, 37 | }, 38 | }) 39 | -------------------------------------------------------------------------------- /packages/shared/README.md: -------------------------------------------------------------------------------- 1 | # @ohmyts/shared 2 | -------------------------------------------------------------------------------- /packages/shared/build.config.ts: -------------------------------------------------------------------------------- 1 | import { defineBuildConfig } from 'unbuild' 2 | 3 | export default defineBuildConfig({ 4 | entries: [ 5 | 'src/index', 6 | ], 7 | clean: true, 8 | declaration: true, 9 | externals: [ 10 | 'url-parse', 11 | ], 12 | rollup: { 13 | emitCJS: true, 14 | inlineDependencies: true, 15 | }, 16 | }) 17 | -------------------------------------------------------------------------------- /packages/shared/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@ohmyts/shared", 3 | "version": "0.0.8", 4 | "description": "Proxy request to get response data and transform to TypeScript code.", 5 | "author": "snowingfox", 6 | "license": "MIT", 7 | "homepage": "https://github.com/snowingfox/ohmyts/tree/main/packages/core#readme", 8 | "repository": { 9 | "type": "git", 10 | "url": "git+https://github.com/snowingfox/onmyts.git", 11 | "directory": "packages/core" 12 | }, 13 | "bugs": { 14 | "url": "https://github.com/snowingfox/ohmyts/issues" 15 | }, 16 | "keywords": [ 17 | "ts", 18 | "typescript", 19 | "json-to-typescript", 20 | "json-to-ts" 21 | ], 22 | "sideEffects": false, 23 | "exports": { 24 | ".": { 25 | "types": "./dist/index.d.ts", 26 | "require": "./dist/index.cjs", 27 | "import": "./dist/index.mjs" 28 | } 29 | }, 30 | "main": "dist/index.cjs", 31 | "module": "dist/index.mjs", 32 | "types": "dist/index.d.ts", 33 | "files": [ 34 | "dist" 35 | ], 36 | "scripts": { 37 | "build": "unbuild", 38 | "stub": "unbuild --stub" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /packages/shared/src/index.ts: -------------------------------------------------------------------------------- 1 | import type { IncomingMessage } from 'http' 2 | import parse from 'url-parse' 3 | 4 | export * from './utils' 5 | 6 | export const parseUrl = (req: IncomingMessage) => { 7 | const parsedUrl = parse(req.url!).pathname.split('/').map(name => `${(name[0] || '').toUpperCase()}${name.slice(1)}`).join('') 8 | return `${req.method!.toString().toUpperCase()}_${parsedUrl}.d.ts` 9 | } 10 | -------------------------------------------------------------------------------- /packages/shared/src/utils.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs' 2 | 3 | export function writeFileSyncRecursive( 4 | filename: string, 5 | content: string, 6 | charset: BufferEncoding = 'utf-8', 7 | ) { 8 | // -- normalize path separator to '/' instead of path.sep, 9 | // -- as / works in node for Windows as well, and mixed \\ and / can appear in the path 10 | let filepath = filename.replace(/\\/g, '/') 11 | 12 | // -- preparation to allow absolute paths as well 13 | let root = '' 14 | if (filepath[0] === '/') { 15 | root = '/' 16 | filepath = filepath.slice(1) 17 | } 18 | else if (filepath[1] === ':') { 19 | root = filepath.slice(0, 3) // c:\ 20 | filepath = filepath.slice(3) 21 | } 22 | 23 | // -- create folders all the way down 24 | const folders = filepath.split('/').slice(0, -1) // remove last item, file 25 | folders.reduce( 26 | (acc, folder) => { 27 | const folderPath = `${acc + folder}/` 28 | if (!fs.existsSync(folderPath)) 29 | fs.mkdirSync(folderPath) 30 | 31 | return folderPath 32 | }, 33 | root, // first 'acc', important 34 | ) 35 | 36 | // -- write file 37 | fs.writeFileSync(root + filepath, content, charset) 38 | } 39 | -------------------------------------------------------------------------------- /packages/vite/README.md: -------------------------------------------------------------------------------- 1 | # ohmyts/vite 2 | -------------------------------------------------------------------------------- /packages/vite/build.config.ts: -------------------------------------------------------------------------------- 1 | import { defineBuildConfig } from 'unbuild' 2 | 3 | export default defineBuildConfig({ 4 | entries: [ 5 | 'src/index', 6 | ], 7 | clean: true, 8 | declaration: true, 9 | externals: [ 10 | 'unconfig', 11 | 'magic-string', 12 | 'http-proxy', 13 | 'json-to-ts', 14 | 'url-parse', 15 | 'vite', 16 | ], 17 | rollup: { 18 | emitCJS: true, 19 | inlineDependencies: true, 20 | }, 21 | }) 22 | -------------------------------------------------------------------------------- /packages/vite/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@ohmyts/vite", 3 | "version": "0.0.8", 4 | "description": "Proxy request to get response data and transform to TypeScript code.", 5 | "author": "snowingfox", 6 | "license": "MIT", 7 | "homepage": "https://github.com/snowingfox/ohmyts/tree/main/packages/core#readme", 8 | "repository": { 9 | "type": "git", 10 | "url": "git+https://github.com/snowingfox/onmyts.git", 11 | "directory": "packages/core" 12 | }, 13 | "bugs": { 14 | "url": "https://github.com/snowingfox/ohmyts/issues" 15 | }, 16 | "keywords": [ 17 | "ts", 18 | "typescript", 19 | "json-to-typescript", 20 | "json-to-ts" 21 | ], 22 | "sideEffects": false, 23 | "exports": { 24 | ".": { 25 | "types": "./dist/index.d.ts", 26 | "require": "./dist/index.cjs", 27 | "import": "./dist/index.mjs" 28 | } 29 | }, 30 | "main": "dist/index.cjs", 31 | "module": "dist/index.mjs", 32 | "types": "dist/index.d.ts", 33 | "files": [ 34 | "dist" 35 | ], 36 | "scripts": { 37 | "build": "unbuild", 38 | "stub": "unbuild --stub" 39 | }, 40 | "dependencies": { 41 | "http-proxy": "^1.18.1", 42 | "json-to-ts": "^1.7.0", 43 | "magic-string": "^0.26.2", 44 | "url-parse": "^1.5.10" 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /packages/vite/src/index.ts: -------------------------------------------------------------------------------- 1 | import type { IncomingMessage } from 'http' 2 | import type http from 'http' 3 | import events from 'events' 4 | import type { Plugin } from 'vite' 5 | import httpProxy from 'http-proxy' 6 | import parse from 'url-parse' 7 | import { transformJSONToTs } from './logic' 8 | import type { OhmytsOptions } from './types' 9 | 10 | const ee = events.EventEmitter 11 | 12 | export function ohmytsVite( 13 | options: OhmytsOptions | OhmytsOptions[], 14 | ): Plugin { 15 | return { 16 | name: 'ohmyts', 17 | configureServer(server) { 18 | const proxy = httpProxy.createProxyServer() 19 | 20 | const proxyWeb = (req: IncomingMessage, res: http.ServerResponse, pathname: string, option: any) => { 21 | proxy.web(req, res, { 22 | changeOrigin: true, 23 | ...option.proxyOptions, 24 | }) 25 | } 26 | 27 | ee.setMaxListeners(0) 28 | 29 | return () => { 30 | if (!Array.isArray(options)) 31 | options = [options] 32 | 33 | for (const option of options) { 34 | server.middlewares.use(option.target, (req, res) => { 35 | const pathname = parse(req.url!).pathname 36 | 37 | proxyWeb(req, res, pathname, option) 38 | 39 | proxy.on('proxyRes', (proxyRes) => { 40 | const chunks: Uint8Array[] = [] 41 | proxyRes.on('data', (chunk) => { 42 | chunks.push(chunk) 43 | }) 44 | 45 | proxyRes.on('end', () => { 46 | transformJSONToTs(req, chunks, option) 47 | }) 48 | }) 49 | }) 50 | } 51 | } 52 | }, 53 | } 54 | } 55 | 56 | export * from './types' 57 | -------------------------------------------------------------------------------- /packages/vite/src/logic.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs' 2 | import type { IncomingMessage, ServerResponse } from 'http' 3 | import { parseUrl, writeFileSyncRecursive } from '@ohmyts/shared' 4 | import JsonToTS from 'json-to-ts' 5 | import MagicString from 'magic-string' 6 | import type { OhmytsOptions } from './types' 7 | 8 | export const transformJSONToTs = ( 9 | req: IncomingMessage, 10 | chunks: Uint8Array[], 11 | options: OhmytsOptions, 12 | ) => { 13 | const { 14 | suffix = 'ResponseType', 15 | encoding = 'utf-8', 16 | rootDir = '@types', 17 | overwrite = true, 18 | declare = true, 19 | } = options 20 | const name = parseUrl(req) 21 | let dir = rootDir 22 | 23 | if (rootDir.endsWith('/')) { 24 | const splitDir = rootDir.split('/') 25 | dir = splitDir.slice(0, splitDir.length - 1).join('') 26 | } 27 | 28 | dir = `${dir}/${name}` 29 | 30 | const isFileExist = fs.existsSync(dir) 31 | 32 | if (overwrite || !isFileExist) { 33 | try { 34 | const json = JSON.parse(Buffer.concat(chunks).toString(encoding)) 35 | const code = new MagicString(JsonToTS(json).toLocaleString().replaceAll('},interface', '}\ninterface')) 36 | const typename = name.split('_') 37 | 38 | code.replace('interface RootObject', `${declare ? 'declare' : 'export'} interface I${typename[0]}${typename[1].replace('.d.ts', '')}${suffix}`) 39 | 40 | writeFileSyncRecursive(dir, code.toString()) 41 | } 42 | catch (err) { 43 | // eslint-disable-next-line no-console 44 | console.log(`[ohmyts Error] ${(err as Error)}`) 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /packages/vite/src/types.ts: -------------------------------------------------------------------------------- 1 | import type { ServerOptions } from 'http-proxy' 2 | 3 | export interface OhmytsOptions { 4 | /* 5 | * rewrite url 6 | */ 7 | target: string 8 | /* 9 | * proxy server options 10 | * 11 | * @default 12 | */ 13 | proxyOptions: ServerOptions 14 | /* 15 | * the root dir path generate type file 16 | * 17 | * @default '@types/' 18 | */ 19 | rootDir?: string 20 | /* 21 | * encoding 22 | * 23 | * @default 'utf-8' 24 | */ 25 | encoding?: BufferEncoding 26 | /* 27 | * the suffix of generated root type 28 | * 29 | * @default 'ResponseType' 30 | */ 31 | suffix?: string 32 | /* 33 | * should overwrite in next time 34 | * 35 | * @default true 36 | */ 37 | overwrite?: boolean 38 | /* 39 | * use `declare` to decorate type or it will be `export` 40 | * 41 | * @default true 42 | */ 43 | declare?: boolean 44 | } 45 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | importers: 4 | 5 | packages/playground: 6 | specifiers: 7 | '@vitejs/plugin-vue': ^3.0.3 8 | '@vitejs/plugin-vue-jsx': ^2.0.1 9 | '@vue/tsconfig': ^0.1.3 10 | '@vueuse/core': ^9.2.0 11 | axios: ^0.27.2 12 | npm-run-all: ^4.1.5 13 | pinia: ^2.0.21 14 | vue: ^3.2.38 15 | vue-router: ^4.1.5 16 | vue-tsc: ^0.40.7 17 | dependencies: 18 | '@vueuse/core': 9.2.0_vue@3.2.39 19 | axios: 0.27.2 20 | pinia: 2.0.22_vue@3.2.39 21 | vue: 3.2.39 22 | vue-router: 4.1.5_vue@3.2.39 23 | devDependencies: 24 | '@vitejs/plugin-vue': 3.1.0_vue@3.2.39 25 | '@vitejs/plugin-vue-jsx': 2.0.1_vue@3.2.39 26 | '@vue/tsconfig': 0.1.3 27 | npm-run-all: 4.1.5 28 | vue-tsc: 0.40.13 29 | 30 | packages: 31 | 32 | /@ampproject/remapping/2.2.0: 33 | resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} 34 | engines: {node: '>=6.0.0'} 35 | dependencies: 36 | '@jridgewell/gen-mapping': 0.1.1 37 | '@jridgewell/trace-mapping': 0.3.15 38 | dev: true 39 | 40 | /@babel/code-frame/7.18.6: 41 | resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} 42 | engines: {node: '>=6.9.0'} 43 | dependencies: 44 | '@babel/highlight': 7.18.6 45 | dev: true 46 | 47 | /@babel/compat-data/7.18.13: 48 | resolution: {integrity: sha512-5yUzC5LqyTFp2HLmDoxGQelcdYgSpP9xsnMWBphAscOdFrHSAVbLNzWiy32sVNDqJRDiJK6klfDnAgu6PAGSHw==} 49 | engines: {node: '>=6.9.0'} 50 | dev: true 51 | 52 | /@babel/core/7.18.13: 53 | resolution: {integrity: sha512-ZisbOvRRusFktksHSG6pjj1CSvkPkcZq/KHD45LAkVP/oiHJkNBZWfpvlLmX8OtHDG8IuzsFlVRWo08w7Qxn0A==} 54 | engines: {node: '>=6.9.0'} 55 | dependencies: 56 | '@ampproject/remapping': 2.2.0 57 | '@babel/code-frame': 7.18.6 58 | '@babel/generator': 7.18.13 59 | '@babel/helper-compilation-targets': 7.18.9_@babel+core@7.18.13 60 | '@babel/helper-module-transforms': 7.18.9 61 | '@babel/helpers': 7.18.9 62 | '@babel/parser': 7.18.13 63 | '@babel/template': 7.18.10 64 | '@babel/traverse': 7.18.13 65 | '@babel/types': 7.18.13 66 | convert-source-map: 1.8.0 67 | debug: 4.3.4 68 | gensync: 1.0.0-beta.2 69 | json5: 2.2.1 70 | semver: 6.3.0 71 | transitivePeerDependencies: 72 | - supports-color 73 | dev: true 74 | 75 | /@babel/generator/7.18.13: 76 | resolution: {integrity: sha512-CkPg8ySSPuHTYPJYo7IRALdqyjM9HCbt/3uOBEFbzyGVP6Mn8bwFPB0jX6982JVNBlYzM1nnPkfjuXSOPtQeEQ==} 77 | engines: {node: '>=6.9.0'} 78 | dependencies: 79 | '@babel/types': 7.18.13 80 | '@jridgewell/gen-mapping': 0.3.2 81 | jsesc: 2.5.2 82 | dev: true 83 | 84 | /@babel/generator/7.19.0: 85 | resolution: {integrity: sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==} 86 | engines: {node: '>=6.9.0'} 87 | dependencies: 88 | '@babel/types': 7.19.0 89 | '@jridgewell/gen-mapping': 0.3.2 90 | jsesc: 2.5.2 91 | dev: true 92 | 93 | /@babel/helper-annotate-as-pure/7.18.6: 94 | resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} 95 | engines: {node: '>=6.9.0'} 96 | dependencies: 97 | '@babel/types': 7.19.0 98 | dev: true 99 | 100 | /@babel/helper-compilation-targets/7.18.9_@babel+core@7.18.13: 101 | resolution: {integrity: sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==} 102 | engines: {node: '>=6.9.0'} 103 | peerDependencies: 104 | '@babel/core': ^7.0.0 105 | dependencies: 106 | '@babel/compat-data': 7.18.13 107 | '@babel/core': 7.18.13 108 | '@babel/helper-validator-option': 7.18.6 109 | browserslist: 4.21.3 110 | semver: 6.3.0 111 | dev: true 112 | 113 | /@babel/helper-create-class-features-plugin/7.19.0_@babel+core@7.18.13: 114 | resolution: {integrity: sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==} 115 | engines: {node: '>=6.9.0'} 116 | peerDependencies: 117 | '@babel/core': ^7.0.0 118 | dependencies: 119 | '@babel/core': 7.18.13 120 | '@babel/helper-annotate-as-pure': 7.18.6 121 | '@babel/helper-environment-visitor': 7.18.9 122 | '@babel/helper-function-name': 7.19.0 123 | '@babel/helper-member-expression-to-functions': 7.18.9 124 | '@babel/helper-optimise-call-expression': 7.18.6 125 | '@babel/helper-replace-supers': 7.19.1 126 | '@babel/helper-split-export-declaration': 7.18.6 127 | transitivePeerDependencies: 128 | - supports-color 129 | dev: true 130 | 131 | /@babel/helper-environment-visitor/7.18.9: 132 | resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} 133 | engines: {node: '>=6.9.0'} 134 | dev: true 135 | 136 | /@babel/helper-function-name/7.18.9: 137 | resolution: {integrity: sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==} 138 | engines: {node: '>=6.9.0'} 139 | dependencies: 140 | '@babel/template': 7.18.10 141 | '@babel/types': 7.18.13 142 | dev: true 143 | 144 | /@babel/helper-function-name/7.19.0: 145 | resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} 146 | engines: {node: '>=6.9.0'} 147 | dependencies: 148 | '@babel/template': 7.18.10 149 | '@babel/types': 7.19.0 150 | dev: true 151 | 152 | /@babel/helper-hoist-variables/7.18.6: 153 | resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} 154 | engines: {node: '>=6.9.0'} 155 | dependencies: 156 | '@babel/types': 7.18.13 157 | dev: true 158 | 159 | /@babel/helper-member-expression-to-functions/7.18.9: 160 | resolution: {integrity: sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==} 161 | engines: {node: '>=6.9.0'} 162 | dependencies: 163 | '@babel/types': 7.18.13 164 | dev: true 165 | 166 | /@babel/helper-module-imports/7.18.6: 167 | resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} 168 | engines: {node: '>=6.9.0'} 169 | dependencies: 170 | '@babel/types': 7.18.13 171 | dev: true 172 | 173 | /@babel/helper-module-transforms/7.18.9: 174 | resolution: {integrity: sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==} 175 | engines: {node: '>=6.9.0'} 176 | dependencies: 177 | '@babel/helper-environment-visitor': 7.18.9 178 | '@babel/helper-module-imports': 7.18.6 179 | '@babel/helper-simple-access': 7.18.6 180 | '@babel/helper-split-export-declaration': 7.18.6 181 | '@babel/helper-validator-identifier': 7.18.6 182 | '@babel/template': 7.18.10 183 | '@babel/traverse': 7.18.13 184 | '@babel/types': 7.18.13 185 | transitivePeerDependencies: 186 | - supports-color 187 | dev: true 188 | 189 | /@babel/helper-optimise-call-expression/7.18.6: 190 | resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} 191 | engines: {node: '>=6.9.0'} 192 | dependencies: 193 | '@babel/types': 7.19.0 194 | dev: true 195 | 196 | /@babel/helper-plugin-utils/7.19.0: 197 | resolution: {integrity: sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==} 198 | engines: {node: '>=6.9.0'} 199 | dev: true 200 | 201 | /@babel/helper-replace-supers/7.19.1: 202 | resolution: {integrity: sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==} 203 | engines: {node: '>=6.9.0'} 204 | dependencies: 205 | '@babel/helper-environment-visitor': 7.18.9 206 | '@babel/helper-member-expression-to-functions': 7.18.9 207 | '@babel/helper-optimise-call-expression': 7.18.6 208 | '@babel/traverse': 7.19.1 209 | '@babel/types': 7.19.0 210 | transitivePeerDependencies: 211 | - supports-color 212 | dev: true 213 | 214 | /@babel/helper-simple-access/7.18.6: 215 | resolution: {integrity: sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==} 216 | engines: {node: '>=6.9.0'} 217 | dependencies: 218 | '@babel/types': 7.18.13 219 | dev: true 220 | 221 | /@babel/helper-split-export-declaration/7.18.6: 222 | resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} 223 | engines: {node: '>=6.9.0'} 224 | dependencies: 225 | '@babel/types': 7.18.13 226 | dev: true 227 | 228 | /@babel/helper-string-parser/7.18.10: 229 | resolution: {integrity: sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==} 230 | engines: {node: '>=6.9.0'} 231 | 232 | /@babel/helper-validator-identifier/7.18.6: 233 | resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==} 234 | engines: {node: '>=6.9.0'} 235 | 236 | /@babel/helper-validator-option/7.18.6: 237 | resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} 238 | engines: {node: '>=6.9.0'} 239 | dev: true 240 | 241 | /@babel/helpers/7.18.9: 242 | resolution: {integrity: sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==} 243 | engines: {node: '>=6.9.0'} 244 | dependencies: 245 | '@babel/template': 7.18.10 246 | '@babel/traverse': 7.18.13 247 | '@babel/types': 7.18.13 248 | transitivePeerDependencies: 249 | - supports-color 250 | dev: true 251 | 252 | /@babel/highlight/7.18.6: 253 | resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} 254 | engines: {node: '>=6.9.0'} 255 | dependencies: 256 | '@babel/helper-validator-identifier': 7.18.6 257 | chalk: 2.4.2 258 | js-tokens: 4.0.0 259 | dev: true 260 | 261 | /@babel/parser/7.18.13: 262 | resolution: {integrity: sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==} 263 | engines: {node: '>=6.0.0'} 264 | hasBin: true 265 | dependencies: 266 | '@babel/types': 7.18.13 267 | 268 | /@babel/parser/7.19.1: 269 | resolution: {integrity: sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==} 270 | engines: {node: '>=6.0.0'} 271 | hasBin: true 272 | dependencies: 273 | '@babel/types': 7.19.0 274 | dev: true 275 | 276 | /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.18.13: 277 | resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} 278 | peerDependencies: 279 | '@babel/core': ^7.0.0-0 280 | dependencies: 281 | '@babel/core': 7.18.13 282 | '@babel/helper-plugin-utils': 7.19.0 283 | dev: true 284 | 285 | /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.18.13: 286 | resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} 287 | engines: {node: '>=6.9.0'} 288 | peerDependencies: 289 | '@babel/core': ^7.0.0-0 290 | dependencies: 291 | '@babel/core': 7.18.13 292 | '@babel/helper-plugin-utils': 7.19.0 293 | dev: true 294 | 295 | /@babel/plugin-syntax-typescript/7.18.6_@babel+core@7.18.13: 296 | resolution: {integrity: sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==} 297 | engines: {node: '>=6.9.0'} 298 | peerDependencies: 299 | '@babel/core': ^7.0.0-0 300 | dependencies: 301 | '@babel/core': 7.18.13 302 | '@babel/helper-plugin-utils': 7.19.0 303 | dev: true 304 | 305 | /@babel/plugin-transform-typescript/7.19.1_@babel+core@7.18.13: 306 | resolution: {integrity: sha512-+ILcOU+6mWLlvCwnL920m2Ow3wWx3Wo8n2t5aROQmV55GZt+hOiLvBaa3DNzRjSEHa1aauRs4/YLmkCfFkhhRQ==} 307 | engines: {node: '>=6.9.0'} 308 | peerDependencies: 309 | '@babel/core': ^7.0.0-0 310 | dependencies: 311 | '@babel/core': 7.18.13 312 | '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.18.13 313 | '@babel/helper-plugin-utils': 7.19.0 314 | '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.18.13 315 | transitivePeerDependencies: 316 | - supports-color 317 | dev: true 318 | 319 | /@babel/template/7.18.10: 320 | resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==} 321 | engines: {node: '>=6.9.0'} 322 | dependencies: 323 | '@babel/code-frame': 7.18.6 324 | '@babel/parser': 7.18.13 325 | '@babel/types': 7.18.13 326 | dev: true 327 | 328 | /@babel/traverse/7.18.13: 329 | resolution: {integrity: sha512-N6kt9X1jRMLPxxxPYWi7tgvJRH/rtoU+dbKAPDM44RFHiMH8igdsaSBgFeskhSl/kLWLDUvIh1RXCrTmg0/zvA==} 330 | engines: {node: '>=6.9.0'} 331 | dependencies: 332 | '@babel/code-frame': 7.18.6 333 | '@babel/generator': 7.18.13 334 | '@babel/helper-environment-visitor': 7.18.9 335 | '@babel/helper-function-name': 7.18.9 336 | '@babel/helper-hoist-variables': 7.18.6 337 | '@babel/helper-split-export-declaration': 7.18.6 338 | '@babel/parser': 7.18.13 339 | '@babel/types': 7.18.13 340 | debug: 4.3.4 341 | globals: 11.12.0 342 | transitivePeerDependencies: 343 | - supports-color 344 | dev: true 345 | 346 | /@babel/traverse/7.19.1: 347 | resolution: {integrity: sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==} 348 | engines: {node: '>=6.9.0'} 349 | dependencies: 350 | '@babel/code-frame': 7.18.6 351 | '@babel/generator': 7.19.0 352 | '@babel/helper-environment-visitor': 7.18.9 353 | '@babel/helper-function-name': 7.19.0 354 | '@babel/helper-hoist-variables': 7.18.6 355 | '@babel/helper-split-export-declaration': 7.18.6 356 | '@babel/parser': 7.19.1 357 | '@babel/types': 7.19.0 358 | debug: 4.3.4 359 | globals: 11.12.0 360 | transitivePeerDependencies: 361 | - supports-color 362 | dev: true 363 | 364 | /@babel/types/7.18.13: 365 | resolution: {integrity: sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==} 366 | engines: {node: '>=6.9.0'} 367 | dependencies: 368 | '@babel/helper-string-parser': 7.18.10 369 | '@babel/helper-validator-identifier': 7.18.6 370 | to-fast-properties: 2.0.0 371 | 372 | /@babel/types/7.19.0: 373 | resolution: {integrity: sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==} 374 | engines: {node: '>=6.9.0'} 375 | dependencies: 376 | '@babel/helper-string-parser': 7.18.10 377 | '@babel/helper-validator-identifier': 7.18.6 378 | to-fast-properties: 2.0.0 379 | dev: true 380 | 381 | /@jridgewell/gen-mapping/0.1.1: 382 | resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} 383 | engines: {node: '>=6.0.0'} 384 | dependencies: 385 | '@jridgewell/set-array': 1.1.2 386 | '@jridgewell/sourcemap-codec': 1.4.14 387 | dev: true 388 | 389 | /@jridgewell/gen-mapping/0.3.2: 390 | resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} 391 | engines: {node: '>=6.0.0'} 392 | dependencies: 393 | '@jridgewell/set-array': 1.1.2 394 | '@jridgewell/sourcemap-codec': 1.4.14 395 | '@jridgewell/trace-mapping': 0.3.15 396 | dev: true 397 | 398 | /@jridgewell/resolve-uri/3.1.0: 399 | resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} 400 | engines: {node: '>=6.0.0'} 401 | dev: true 402 | 403 | /@jridgewell/set-array/1.1.2: 404 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 405 | engines: {node: '>=6.0.0'} 406 | dev: true 407 | 408 | /@jridgewell/sourcemap-codec/1.4.14: 409 | resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} 410 | dev: true 411 | 412 | /@jridgewell/trace-mapping/0.3.15: 413 | resolution: {integrity: sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==} 414 | dependencies: 415 | '@jridgewell/resolve-uri': 3.1.0 416 | '@jridgewell/sourcemap-codec': 1.4.14 417 | dev: true 418 | 419 | /@types/web-bluetooth/0.0.15: 420 | resolution: {integrity: sha512-w7hEHXnPMEZ+4nGKl/KDRVpxkwYxYExuHOYXyzIzCDzEZ9ZCGMAewulr9IqJu2LR4N37fcnb1XVeuZ09qgOxhA==} 421 | dev: false 422 | 423 | /@vitejs/plugin-vue-jsx/2.0.1_vue@3.2.39: 424 | resolution: {integrity: sha512-lmiR1k9+lrF7LMczO0pxtQ8mOn6XeppJDHxnpxkJQpT5SiKz4SKhKdeNstXaTNuR8qZhUo5X0pJlcocn72Y4Jg==} 425 | engines: {node: ^14.18.0 || >=16.0.0} 426 | peerDependencies: 427 | vite: ^3.0.0 428 | vue: ^3.0.0 429 | dependencies: 430 | '@babel/core': 7.18.13 431 | '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.18.13 432 | '@babel/plugin-transform-typescript': 7.19.1_@babel+core@7.18.13 433 | '@vue/babel-plugin-jsx': 1.1.1_@babel+core@7.18.13 434 | vue: 3.2.39 435 | transitivePeerDependencies: 436 | - supports-color 437 | dev: true 438 | 439 | /@vitejs/plugin-vue/3.1.0_vue@3.2.39: 440 | resolution: {integrity: sha512-fmxtHPjSOEIRg6vHYDaem+97iwCUg/uSIaTzp98lhELt2ISOQuDo2hbkBdXod0g15IhfPMQmAxh4heUks2zvDA==} 441 | engines: {node: ^14.18.0 || >=16.0.0} 442 | peerDependencies: 443 | vite: ^3.0.0 444 | vue: ^3.2.25 445 | dependencies: 446 | vue: 3.2.39 447 | dev: true 448 | 449 | /@volar/code-gen/0.40.13: 450 | resolution: {integrity: sha512-4gShBWuMce868OVvgyA1cU5WxHbjfEme18Tw6uVMfweZCF5fB2KECG0iPrA9D54vHk3FeHarODNwgIaaFfUBlA==} 451 | dependencies: 452 | '@volar/source-map': 0.40.13 453 | dev: true 454 | 455 | /@volar/source-map/0.40.13: 456 | resolution: {integrity: sha512-dbdkAB2Nxb0wLjAY5O64o3ywVWlAGONnBIoKAkXSf6qkGZM+nJxcizsoiI66K+RHQG0XqlyvjDizfnTxr+6PWg==} 457 | dependencies: 458 | '@vue/reactivity': 3.2.38 459 | dev: true 460 | 461 | /@volar/typescript-faster/0.40.13: 462 | resolution: {integrity: sha512-uy+TlcFkKoNlKEnxA4x5acxdxLyVDIXGSc8cYDNXpPKjBKXrQaetzCzlO3kVBqu1VLMxKNGJMTKn35mo+ILQmw==} 463 | dependencies: 464 | semver: 7.3.7 465 | dev: true 466 | 467 | /@volar/vue-language-core/0.40.13: 468 | resolution: {integrity: sha512-QkCb8msi2KUitTdM6Y4kAb7/ZlEvuLcbBFOC2PLBlFuoZwyxvSP7c/dBGmKGtJlEvMX0LdCyrg5V2aBYxD38/Q==} 469 | dependencies: 470 | '@volar/code-gen': 0.40.13 471 | '@volar/source-map': 0.40.13 472 | '@vue/compiler-core': 3.2.39 473 | '@vue/compiler-dom': 3.2.39 474 | '@vue/compiler-sfc': 3.2.39 475 | '@vue/reactivity': 3.2.39 476 | '@vue/shared': 3.2.39 477 | dev: true 478 | 479 | /@volar/vue-typescript/0.40.13: 480 | resolution: {integrity: sha512-o7bNztwjs8JmbQjVkrnbZUOfm7q4B8ZYssETISN1tRaBdun6cfNqgpkvDYd+VUBh1O4CdksvN+5BUNnwAz4oCQ==} 481 | dependencies: 482 | '@volar/code-gen': 0.40.13 483 | '@volar/typescript-faster': 0.40.13 484 | '@volar/vue-language-core': 0.40.13 485 | dev: true 486 | 487 | /@vue/babel-helper-vue-transform-on/1.0.2: 488 | resolution: {integrity: sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==} 489 | dev: true 490 | 491 | /@vue/babel-plugin-jsx/1.1.1_@babel+core@7.18.13: 492 | resolution: {integrity: sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==} 493 | dependencies: 494 | '@babel/helper-module-imports': 7.18.6 495 | '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.18.13 496 | '@babel/template': 7.18.10 497 | '@babel/traverse': 7.18.13 498 | '@babel/types': 7.18.13 499 | '@vue/babel-helper-vue-transform-on': 1.0.2 500 | camelcase: 6.3.0 501 | html-tags: 3.2.0 502 | svg-tags: 1.0.0 503 | transitivePeerDependencies: 504 | - '@babel/core' 505 | - supports-color 506 | dev: true 507 | 508 | /@vue/compiler-core/3.2.39: 509 | resolution: {integrity: sha512-mf/36OWXqWn0wsC40nwRRGheR/qoID+lZXbIuLnr4/AngM0ov8Xvv8GHunC0rKRIkh60bTqydlqTeBo49rlbqw==} 510 | dependencies: 511 | '@babel/parser': 7.18.13 512 | '@vue/shared': 3.2.39 513 | estree-walker: 2.0.2 514 | source-map: 0.6.1 515 | 516 | /@vue/compiler-dom/3.2.39: 517 | resolution: {integrity: sha512-HMFI25Be1C8vLEEv1hgEO1dWwG9QQ8LTTPmCkblVJY/O3OvWx6r1+zsox5mKPMGvqYEZa6l8j+xgOfUspgo7hw==} 518 | dependencies: 519 | '@vue/compiler-core': 3.2.39 520 | '@vue/shared': 3.2.39 521 | 522 | /@vue/compiler-sfc/3.2.39: 523 | resolution: {integrity: sha512-fqAQgFs1/BxTUZkd0Vakn3teKUt//J3c420BgnYgEOoVdTwYpBTSXCMJ88GOBCylmUBbtquGPli9tVs7LzsWIA==} 524 | dependencies: 525 | '@babel/parser': 7.18.13 526 | '@vue/compiler-core': 3.2.39 527 | '@vue/compiler-dom': 3.2.39 528 | '@vue/compiler-ssr': 3.2.39 529 | '@vue/reactivity-transform': 3.2.39 530 | '@vue/shared': 3.2.39 531 | estree-walker: 2.0.2 532 | magic-string: 0.25.9 533 | postcss: 8.4.16 534 | source-map: 0.6.1 535 | 536 | /@vue/compiler-ssr/3.2.39: 537 | resolution: {integrity: sha512-EoGCJ6lincKOZGW+0Ky4WOKsSmqL7hp1ZYgen8M7u/mlvvEQUaO9tKKOy7K43M9U2aA3tPv0TuYYQFrEbK2eFQ==} 538 | dependencies: 539 | '@vue/compiler-dom': 3.2.39 540 | '@vue/shared': 3.2.39 541 | 542 | /@vue/devtools-api/6.2.1: 543 | resolution: {integrity: sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ==} 544 | dev: false 545 | 546 | /@vue/reactivity-transform/3.2.39: 547 | resolution: {integrity: sha512-HGuWu864zStiWs9wBC6JYOP1E00UjMdDWIG5W+FpUx28hV3uz9ODOKVNm/vdOy/Pvzg8+OcANxAVC85WFBbl3A==} 548 | dependencies: 549 | '@babel/parser': 7.18.13 550 | '@vue/compiler-core': 3.2.39 551 | '@vue/shared': 3.2.39 552 | estree-walker: 2.0.2 553 | magic-string: 0.25.9 554 | 555 | /@vue/reactivity/3.2.38: 556 | resolution: {integrity: sha512-6L4myYcH9HG2M25co7/BSo0skKFHpAN8PhkNPM4xRVkyGl1K5M3Jx4rp5bsYhvYze2K4+l+pioN4e6ZwFLUVtw==} 557 | dependencies: 558 | '@vue/shared': 3.2.38 559 | dev: true 560 | 561 | /@vue/reactivity/3.2.39: 562 | resolution: {integrity: sha512-vlaYX2a3qMhIZfrw3Mtfd+BuU+TZmvDrPMa+6lpfzS9k/LnGxkSuf0fhkP0rMGfiOHPtyKoU9OJJJFGm92beVQ==} 563 | dependencies: 564 | '@vue/shared': 3.2.39 565 | 566 | /@vue/runtime-core/3.2.39: 567 | resolution: {integrity: sha512-xKH5XP57JW5JW+8ZG1khBbuLakINTgPuINKL01hStWLTTGFOrM49UfCFXBcFvWmSbci3gmJyLl2EAzCaZWsx8g==} 568 | dependencies: 569 | '@vue/reactivity': 3.2.39 570 | '@vue/shared': 3.2.39 571 | 572 | /@vue/runtime-dom/3.2.39: 573 | resolution: {integrity: sha512-4G9AEJP+sLhsqf5wXcyKVWQKUhI+iWfy0hWQgea+CpaTD7BR0KdQzvoQdZhwCY6B3oleSyNLkLAQwm0ya/wNoA==} 574 | dependencies: 575 | '@vue/runtime-core': 3.2.39 576 | '@vue/shared': 3.2.39 577 | csstype: 2.6.21 578 | 579 | /@vue/server-renderer/3.2.39_vue@3.2.39: 580 | resolution: {integrity: sha512-1yn9u2YBQWIgytFMjz4f/t0j43awKytTGVptfd3FtBk76t1pd8mxbek0G/DrnjJhd2V7mSTb5qgnxMYt8Z5iSQ==} 581 | peerDependencies: 582 | vue: 3.2.39 583 | dependencies: 584 | '@vue/compiler-ssr': 3.2.39 585 | '@vue/shared': 3.2.39 586 | vue: 3.2.39 587 | 588 | /@vue/shared/3.2.38: 589 | resolution: {integrity: sha512-dTyhTIRmGXBjxJE+skC8tTWCGLCVc4wQgRRLt8+O9p5ewBAjoBwtCAkLPrtToSr1xltoe3st21Pv953aOZ7alg==} 590 | dev: true 591 | 592 | /@vue/shared/3.2.39: 593 | resolution: {integrity: sha512-D3dl2ZB9qE6mTuWPk9RlhDeP1dgNRUKC3NJxji74A4yL8M2MwlhLKUC/49WHjrNzSPug58fWx/yFbaTzGAQSBw==} 594 | 595 | /@vue/tsconfig/0.1.3: 596 | resolution: {integrity: sha512-kQVsh8yyWPvHpb8gIc9l/HIDiiVUy1amynLNpCy8p+FoCiZXCo6fQos5/097MmnNZc9AtseDsCrfkhqCrJ8Olg==} 597 | peerDependencies: 598 | '@types/node': '*' 599 | peerDependenciesMeta: 600 | '@types/node': 601 | optional: true 602 | dev: true 603 | 604 | /@vueuse/core/9.2.0_vue@3.2.39: 605 | resolution: {integrity: sha512-/MZ6qpz6uSyaXrtoeBWQzAKRG3N7CvfVWvQxiM3ei3Xe5ydOjjtVbo7lGl9p8dECV93j7W8s63A8H0kFLpLyxg==} 606 | dependencies: 607 | '@types/web-bluetooth': 0.0.15 608 | '@vueuse/metadata': 9.2.0 609 | '@vueuse/shared': 9.2.0_vue@3.2.39 610 | vue-demi: 0.13.11_vue@3.2.39 611 | transitivePeerDependencies: 612 | - '@vue/composition-api' 613 | - vue 614 | dev: false 615 | 616 | /@vueuse/metadata/9.2.0: 617 | resolution: {integrity: sha512-exN4KE6iquxDCdt72BgEhb3tlOpECtD61AUdXnUqBTIUCl70x1Ar/QXo3bYcvxmdMS2/peQyfeTzBjRTpvL5xw==} 618 | dev: false 619 | 620 | /@vueuse/shared/9.2.0_vue@3.2.39: 621 | resolution: {integrity: sha512-NnRp/noSWuXW0dKhZK5D0YLrDi0nmZ18UeEgwXQq7Ul5TTP93lcNnKjrHtd68j2xFB/l59yPGFlCryL692bnrA==} 622 | dependencies: 623 | vue-demi: 0.13.11_vue@3.2.39 624 | transitivePeerDependencies: 625 | - '@vue/composition-api' 626 | - vue 627 | dev: false 628 | 629 | /ansi-styles/3.2.1: 630 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 631 | engines: {node: '>=4'} 632 | dependencies: 633 | color-convert: 1.9.3 634 | dev: true 635 | 636 | /asynckit/0.4.0: 637 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 638 | dev: false 639 | 640 | /axios/0.27.2: 641 | resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} 642 | dependencies: 643 | follow-redirects: 1.15.2 644 | form-data: 4.0.0 645 | transitivePeerDependencies: 646 | - debug 647 | dev: false 648 | 649 | /balanced-match/1.0.2: 650 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 651 | dev: true 652 | 653 | /brace-expansion/1.1.11: 654 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 655 | dependencies: 656 | balanced-match: 1.0.2 657 | concat-map: 0.0.1 658 | dev: true 659 | 660 | /browserslist/4.21.3: 661 | resolution: {integrity: sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==} 662 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 663 | hasBin: true 664 | dependencies: 665 | caniuse-lite: 1.0.30001384 666 | electron-to-chromium: 1.4.233 667 | node-releases: 2.0.6 668 | update-browserslist-db: 1.0.5_browserslist@4.21.3 669 | dev: true 670 | 671 | /call-bind/1.0.2: 672 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 673 | dependencies: 674 | function-bind: 1.1.1 675 | get-intrinsic: 1.1.2 676 | dev: true 677 | 678 | /camelcase/6.3.0: 679 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 680 | engines: {node: '>=10'} 681 | dev: true 682 | 683 | /caniuse-lite/1.0.30001384: 684 | resolution: {integrity: sha512-BBWt57kqWbc0GYZXb47wTXpmAgqr5LSibPzNjk/AWMdmJMQhLqOl3c/Kd4OAU/tu4NLfYkMx8Tlq3RVBkOBolQ==} 685 | dev: true 686 | 687 | /chalk/2.4.2: 688 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 689 | engines: {node: '>=4'} 690 | dependencies: 691 | ansi-styles: 3.2.1 692 | escape-string-regexp: 1.0.5 693 | supports-color: 5.5.0 694 | dev: true 695 | 696 | /color-convert/1.9.3: 697 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 698 | dependencies: 699 | color-name: 1.1.3 700 | dev: true 701 | 702 | /color-name/1.1.3: 703 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 704 | dev: true 705 | 706 | /combined-stream/1.0.8: 707 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 708 | engines: {node: '>= 0.8'} 709 | dependencies: 710 | delayed-stream: 1.0.0 711 | dev: false 712 | 713 | /concat-map/0.0.1: 714 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} 715 | dev: true 716 | 717 | /convert-source-map/1.8.0: 718 | resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} 719 | dependencies: 720 | safe-buffer: 5.1.2 721 | dev: true 722 | 723 | /cross-spawn/6.0.5: 724 | resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} 725 | engines: {node: '>=4.8'} 726 | dependencies: 727 | nice-try: 1.0.5 728 | path-key: 2.0.1 729 | semver: 5.7.1 730 | shebang-command: 1.2.0 731 | which: 1.3.1 732 | dev: true 733 | 734 | /csstype/2.6.21: 735 | resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==} 736 | 737 | /debug/4.3.4: 738 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 739 | engines: {node: '>=6.0'} 740 | peerDependencies: 741 | supports-color: '*' 742 | peerDependenciesMeta: 743 | supports-color: 744 | optional: true 745 | dependencies: 746 | ms: 2.1.2 747 | dev: true 748 | 749 | /define-properties/1.1.4: 750 | resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} 751 | engines: {node: '>= 0.4'} 752 | dependencies: 753 | has-property-descriptors: 1.0.0 754 | object-keys: 1.1.1 755 | dev: true 756 | 757 | /delayed-stream/1.0.0: 758 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 759 | engines: {node: '>=0.4.0'} 760 | dev: false 761 | 762 | /electron-to-chromium/1.4.233: 763 | resolution: {integrity: sha512-ejwIKXTg1wqbmkcRJh9Ur3hFGHFDZDw1POzdsVrB2WZjgRuRMHIQQKNpe64N/qh3ZtH2otEoRoS+s6arAAuAAw==} 764 | dev: true 765 | 766 | /error-ex/1.3.2: 767 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 768 | dependencies: 769 | is-arrayish: 0.2.1 770 | dev: true 771 | 772 | /es-abstract/1.20.1: 773 | resolution: {integrity: sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==} 774 | engines: {node: '>= 0.4'} 775 | dependencies: 776 | call-bind: 1.0.2 777 | es-to-primitive: 1.2.1 778 | function-bind: 1.1.1 779 | function.prototype.name: 1.1.5 780 | get-intrinsic: 1.1.2 781 | get-symbol-description: 1.0.0 782 | has: 1.0.3 783 | has-property-descriptors: 1.0.0 784 | has-symbols: 1.0.3 785 | internal-slot: 1.0.3 786 | is-callable: 1.2.4 787 | is-negative-zero: 2.0.2 788 | is-regex: 1.1.4 789 | is-shared-array-buffer: 1.0.2 790 | is-string: 1.0.7 791 | is-weakref: 1.0.2 792 | object-inspect: 1.12.2 793 | object-keys: 1.1.1 794 | object.assign: 4.1.4 795 | regexp.prototype.flags: 1.4.3 796 | string.prototype.trimend: 1.0.5 797 | string.prototype.trimstart: 1.0.5 798 | unbox-primitive: 1.0.2 799 | dev: true 800 | 801 | /es-to-primitive/1.2.1: 802 | resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} 803 | engines: {node: '>= 0.4'} 804 | dependencies: 805 | is-callable: 1.2.4 806 | is-date-object: 1.0.5 807 | is-symbol: 1.0.4 808 | dev: true 809 | 810 | /escalade/3.1.1: 811 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 812 | engines: {node: '>=6'} 813 | dev: true 814 | 815 | /escape-string-regexp/1.0.5: 816 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 817 | engines: {node: '>=0.8.0'} 818 | dev: true 819 | 820 | /estree-walker/2.0.2: 821 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 822 | 823 | /follow-redirects/1.15.2: 824 | resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} 825 | engines: {node: '>=4.0'} 826 | peerDependencies: 827 | debug: '*' 828 | peerDependenciesMeta: 829 | debug: 830 | optional: true 831 | dev: false 832 | 833 | /form-data/4.0.0: 834 | resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} 835 | engines: {node: '>= 6'} 836 | dependencies: 837 | asynckit: 0.4.0 838 | combined-stream: 1.0.8 839 | mime-types: 2.1.35 840 | dev: false 841 | 842 | /function-bind/1.1.1: 843 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 844 | dev: true 845 | 846 | /function.prototype.name/1.1.5: 847 | resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} 848 | engines: {node: '>= 0.4'} 849 | dependencies: 850 | call-bind: 1.0.2 851 | define-properties: 1.1.4 852 | es-abstract: 1.20.1 853 | functions-have-names: 1.2.3 854 | dev: true 855 | 856 | /functions-have-names/1.2.3: 857 | resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 858 | dev: true 859 | 860 | /gensync/1.0.0-beta.2: 861 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 862 | engines: {node: '>=6.9.0'} 863 | dev: true 864 | 865 | /get-intrinsic/1.1.2: 866 | resolution: {integrity: sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==} 867 | dependencies: 868 | function-bind: 1.1.1 869 | has: 1.0.3 870 | has-symbols: 1.0.3 871 | dev: true 872 | 873 | /get-symbol-description/1.0.0: 874 | resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} 875 | engines: {node: '>= 0.4'} 876 | dependencies: 877 | call-bind: 1.0.2 878 | get-intrinsic: 1.1.2 879 | dev: true 880 | 881 | /globals/11.12.0: 882 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 883 | engines: {node: '>=4'} 884 | dev: true 885 | 886 | /graceful-fs/4.2.10: 887 | resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} 888 | dev: true 889 | 890 | /has-bigints/1.0.2: 891 | resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} 892 | dev: true 893 | 894 | /has-flag/3.0.0: 895 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 896 | engines: {node: '>=4'} 897 | dev: true 898 | 899 | /has-property-descriptors/1.0.0: 900 | resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} 901 | dependencies: 902 | get-intrinsic: 1.1.2 903 | dev: true 904 | 905 | /has-symbols/1.0.3: 906 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 907 | engines: {node: '>= 0.4'} 908 | dev: true 909 | 910 | /has-tostringtag/1.0.0: 911 | resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} 912 | engines: {node: '>= 0.4'} 913 | dependencies: 914 | has-symbols: 1.0.3 915 | dev: true 916 | 917 | /has/1.0.3: 918 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 919 | engines: {node: '>= 0.4.0'} 920 | dependencies: 921 | function-bind: 1.1.1 922 | dev: true 923 | 924 | /hosted-git-info/2.8.9: 925 | resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} 926 | dev: true 927 | 928 | /html-tags/3.2.0: 929 | resolution: {integrity: sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==} 930 | engines: {node: '>=8'} 931 | dev: true 932 | 933 | /internal-slot/1.0.3: 934 | resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} 935 | engines: {node: '>= 0.4'} 936 | dependencies: 937 | get-intrinsic: 1.1.2 938 | has: 1.0.3 939 | side-channel: 1.0.4 940 | dev: true 941 | 942 | /is-arrayish/0.2.1: 943 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 944 | dev: true 945 | 946 | /is-bigint/1.0.4: 947 | resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} 948 | dependencies: 949 | has-bigints: 1.0.2 950 | dev: true 951 | 952 | /is-boolean-object/1.1.2: 953 | resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} 954 | engines: {node: '>= 0.4'} 955 | dependencies: 956 | call-bind: 1.0.2 957 | has-tostringtag: 1.0.0 958 | dev: true 959 | 960 | /is-callable/1.2.4: 961 | resolution: {integrity: sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==} 962 | engines: {node: '>= 0.4'} 963 | dev: true 964 | 965 | /is-core-module/2.10.0: 966 | resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==} 967 | dependencies: 968 | has: 1.0.3 969 | dev: true 970 | 971 | /is-date-object/1.0.5: 972 | resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} 973 | engines: {node: '>= 0.4'} 974 | dependencies: 975 | has-tostringtag: 1.0.0 976 | dev: true 977 | 978 | /is-negative-zero/2.0.2: 979 | resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} 980 | engines: {node: '>= 0.4'} 981 | dev: true 982 | 983 | /is-number-object/1.0.7: 984 | resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} 985 | engines: {node: '>= 0.4'} 986 | dependencies: 987 | has-tostringtag: 1.0.0 988 | dev: true 989 | 990 | /is-regex/1.1.4: 991 | resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} 992 | engines: {node: '>= 0.4'} 993 | dependencies: 994 | call-bind: 1.0.2 995 | has-tostringtag: 1.0.0 996 | dev: true 997 | 998 | /is-shared-array-buffer/1.0.2: 999 | resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} 1000 | dependencies: 1001 | call-bind: 1.0.2 1002 | dev: true 1003 | 1004 | /is-string/1.0.7: 1005 | resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} 1006 | engines: {node: '>= 0.4'} 1007 | dependencies: 1008 | has-tostringtag: 1.0.0 1009 | dev: true 1010 | 1011 | /is-symbol/1.0.4: 1012 | resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} 1013 | engines: {node: '>= 0.4'} 1014 | dependencies: 1015 | has-symbols: 1.0.3 1016 | dev: true 1017 | 1018 | /is-weakref/1.0.2: 1019 | resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} 1020 | dependencies: 1021 | call-bind: 1.0.2 1022 | dev: true 1023 | 1024 | /isexe/2.0.0: 1025 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1026 | dev: true 1027 | 1028 | /js-tokens/4.0.0: 1029 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1030 | dev: true 1031 | 1032 | /jsesc/2.5.2: 1033 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 1034 | engines: {node: '>=4'} 1035 | hasBin: true 1036 | dev: true 1037 | 1038 | /json-parse-better-errors/1.0.2: 1039 | resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} 1040 | dev: true 1041 | 1042 | /json5/2.2.1: 1043 | resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} 1044 | engines: {node: '>=6'} 1045 | hasBin: true 1046 | dev: true 1047 | 1048 | /load-json-file/4.0.0: 1049 | resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} 1050 | engines: {node: '>=4'} 1051 | dependencies: 1052 | graceful-fs: 4.2.10 1053 | parse-json: 4.0.0 1054 | pify: 3.0.0 1055 | strip-bom: 3.0.0 1056 | dev: true 1057 | 1058 | /lru-cache/6.0.0: 1059 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1060 | engines: {node: '>=10'} 1061 | dependencies: 1062 | yallist: 4.0.0 1063 | dev: true 1064 | 1065 | /magic-string/0.25.9: 1066 | resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} 1067 | dependencies: 1068 | sourcemap-codec: 1.4.8 1069 | 1070 | /memorystream/0.3.1: 1071 | resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} 1072 | engines: {node: '>= 0.10.0'} 1073 | dev: true 1074 | 1075 | /mime-db/1.52.0: 1076 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 1077 | engines: {node: '>= 0.6'} 1078 | dev: false 1079 | 1080 | /mime-types/2.1.35: 1081 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 1082 | engines: {node: '>= 0.6'} 1083 | dependencies: 1084 | mime-db: 1.52.0 1085 | dev: false 1086 | 1087 | /minimatch/3.1.2: 1088 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1089 | dependencies: 1090 | brace-expansion: 1.1.11 1091 | dev: true 1092 | 1093 | /ms/2.1.2: 1094 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1095 | dev: true 1096 | 1097 | /nanoid/3.3.4: 1098 | resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} 1099 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1100 | hasBin: true 1101 | 1102 | /nice-try/1.0.5: 1103 | resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} 1104 | dev: true 1105 | 1106 | /node-releases/2.0.6: 1107 | resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} 1108 | dev: true 1109 | 1110 | /normalize-package-data/2.5.0: 1111 | resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} 1112 | dependencies: 1113 | hosted-git-info: 2.8.9 1114 | resolve: 1.22.1 1115 | semver: 5.7.1 1116 | validate-npm-package-license: 3.0.4 1117 | dev: true 1118 | 1119 | /npm-run-all/4.1.5: 1120 | resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} 1121 | engines: {node: '>= 4'} 1122 | hasBin: true 1123 | dependencies: 1124 | ansi-styles: 3.2.1 1125 | chalk: 2.4.2 1126 | cross-spawn: 6.0.5 1127 | memorystream: 0.3.1 1128 | minimatch: 3.1.2 1129 | pidtree: 0.3.1 1130 | read-pkg: 3.0.0 1131 | shell-quote: 1.7.3 1132 | string.prototype.padend: 3.1.3 1133 | dev: true 1134 | 1135 | /object-inspect/1.12.2: 1136 | resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} 1137 | dev: true 1138 | 1139 | /object-keys/1.1.1: 1140 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 1141 | engines: {node: '>= 0.4'} 1142 | dev: true 1143 | 1144 | /object.assign/4.1.4: 1145 | resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} 1146 | engines: {node: '>= 0.4'} 1147 | dependencies: 1148 | call-bind: 1.0.2 1149 | define-properties: 1.1.4 1150 | has-symbols: 1.0.3 1151 | object-keys: 1.1.1 1152 | dev: true 1153 | 1154 | /parse-json/4.0.0: 1155 | resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} 1156 | engines: {node: '>=4'} 1157 | dependencies: 1158 | error-ex: 1.3.2 1159 | json-parse-better-errors: 1.0.2 1160 | dev: true 1161 | 1162 | /path-key/2.0.1: 1163 | resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} 1164 | engines: {node: '>=4'} 1165 | dev: true 1166 | 1167 | /path-parse/1.0.7: 1168 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1169 | dev: true 1170 | 1171 | /path-type/3.0.0: 1172 | resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} 1173 | engines: {node: '>=4'} 1174 | dependencies: 1175 | pify: 3.0.0 1176 | dev: true 1177 | 1178 | /picocolors/1.0.0: 1179 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1180 | 1181 | /pidtree/0.3.1: 1182 | resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} 1183 | engines: {node: '>=0.10'} 1184 | hasBin: true 1185 | dev: true 1186 | 1187 | /pify/3.0.0: 1188 | resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} 1189 | engines: {node: '>=4'} 1190 | dev: true 1191 | 1192 | /pinia/2.0.22_vue@3.2.39: 1193 | resolution: {integrity: sha512-u+b8/BC+tmvo3ACbYO2w5NfxHWFOjvvw9DQnyT0dW8aUMCPRQT5QnfZ5R5W2MzZBMTeZRMQI7V/QFbafmM9QHw==} 1194 | peerDependencies: 1195 | '@vue/composition-api': ^1.4.0 1196 | typescript: '>=4.4.4' 1197 | vue: ^2.6.14 || ^3.2.0 1198 | peerDependenciesMeta: 1199 | '@vue/composition-api': 1200 | optional: true 1201 | typescript: 1202 | optional: true 1203 | dependencies: 1204 | '@vue/devtools-api': 6.2.1 1205 | vue: 3.2.39 1206 | vue-demi: 0.13.11_vue@3.2.39 1207 | dev: false 1208 | 1209 | /postcss/8.4.16: 1210 | resolution: {integrity: sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==} 1211 | engines: {node: ^10 || ^12 || >=14} 1212 | dependencies: 1213 | nanoid: 3.3.4 1214 | picocolors: 1.0.0 1215 | source-map-js: 1.0.2 1216 | 1217 | /read-pkg/3.0.0: 1218 | resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} 1219 | engines: {node: '>=4'} 1220 | dependencies: 1221 | load-json-file: 4.0.0 1222 | normalize-package-data: 2.5.0 1223 | path-type: 3.0.0 1224 | dev: true 1225 | 1226 | /regexp.prototype.flags/1.4.3: 1227 | resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} 1228 | engines: {node: '>= 0.4'} 1229 | dependencies: 1230 | call-bind: 1.0.2 1231 | define-properties: 1.1.4 1232 | functions-have-names: 1.2.3 1233 | dev: true 1234 | 1235 | /resolve/1.22.1: 1236 | resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} 1237 | hasBin: true 1238 | dependencies: 1239 | is-core-module: 2.10.0 1240 | path-parse: 1.0.7 1241 | supports-preserve-symlinks-flag: 1.0.0 1242 | dev: true 1243 | 1244 | /safe-buffer/5.1.2: 1245 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 1246 | dev: true 1247 | 1248 | /semver/5.7.1: 1249 | resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} 1250 | hasBin: true 1251 | dev: true 1252 | 1253 | /semver/6.3.0: 1254 | resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} 1255 | hasBin: true 1256 | dev: true 1257 | 1258 | /semver/7.3.7: 1259 | resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} 1260 | engines: {node: '>=10'} 1261 | hasBin: true 1262 | dependencies: 1263 | lru-cache: 6.0.0 1264 | dev: true 1265 | 1266 | /shebang-command/1.2.0: 1267 | resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} 1268 | engines: {node: '>=0.10.0'} 1269 | dependencies: 1270 | shebang-regex: 1.0.0 1271 | dev: true 1272 | 1273 | /shebang-regex/1.0.0: 1274 | resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} 1275 | engines: {node: '>=0.10.0'} 1276 | dev: true 1277 | 1278 | /shell-quote/1.7.3: 1279 | resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==} 1280 | dev: true 1281 | 1282 | /side-channel/1.0.4: 1283 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 1284 | dependencies: 1285 | call-bind: 1.0.2 1286 | get-intrinsic: 1.1.2 1287 | object-inspect: 1.12.2 1288 | dev: true 1289 | 1290 | /source-map-js/1.0.2: 1291 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 1292 | engines: {node: '>=0.10.0'} 1293 | 1294 | /source-map/0.6.1: 1295 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1296 | engines: {node: '>=0.10.0'} 1297 | 1298 | /sourcemap-codec/1.4.8: 1299 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 1300 | 1301 | /spdx-correct/3.1.1: 1302 | resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} 1303 | dependencies: 1304 | spdx-expression-parse: 3.0.1 1305 | spdx-license-ids: 3.0.12 1306 | dev: true 1307 | 1308 | /spdx-exceptions/2.3.0: 1309 | resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} 1310 | dev: true 1311 | 1312 | /spdx-expression-parse/3.0.1: 1313 | resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} 1314 | dependencies: 1315 | spdx-exceptions: 2.3.0 1316 | spdx-license-ids: 3.0.12 1317 | dev: true 1318 | 1319 | /spdx-license-ids/3.0.12: 1320 | resolution: {integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==} 1321 | dev: true 1322 | 1323 | /string.prototype.padend/3.1.3: 1324 | resolution: {integrity: sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==} 1325 | engines: {node: '>= 0.4'} 1326 | dependencies: 1327 | call-bind: 1.0.2 1328 | define-properties: 1.1.4 1329 | es-abstract: 1.20.1 1330 | dev: true 1331 | 1332 | /string.prototype.trimend/1.0.5: 1333 | resolution: {integrity: sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==} 1334 | dependencies: 1335 | call-bind: 1.0.2 1336 | define-properties: 1.1.4 1337 | es-abstract: 1.20.1 1338 | dev: true 1339 | 1340 | /string.prototype.trimstart/1.0.5: 1341 | resolution: {integrity: sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==} 1342 | dependencies: 1343 | call-bind: 1.0.2 1344 | define-properties: 1.1.4 1345 | es-abstract: 1.20.1 1346 | dev: true 1347 | 1348 | /strip-bom/3.0.0: 1349 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 1350 | engines: {node: '>=4'} 1351 | dev: true 1352 | 1353 | /supports-color/5.5.0: 1354 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1355 | engines: {node: '>=4'} 1356 | dependencies: 1357 | has-flag: 3.0.0 1358 | dev: true 1359 | 1360 | /supports-preserve-symlinks-flag/1.0.0: 1361 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1362 | engines: {node: '>= 0.4'} 1363 | dev: true 1364 | 1365 | /svg-tags/1.0.0: 1366 | resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} 1367 | dev: true 1368 | 1369 | /to-fast-properties/2.0.0: 1370 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 1371 | engines: {node: '>=4'} 1372 | 1373 | /unbox-primitive/1.0.2: 1374 | resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} 1375 | dependencies: 1376 | call-bind: 1.0.2 1377 | has-bigints: 1.0.2 1378 | has-symbols: 1.0.3 1379 | which-boxed-primitive: 1.0.2 1380 | dev: true 1381 | 1382 | /update-browserslist-db/1.0.5_browserslist@4.21.3: 1383 | resolution: {integrity: sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==} 1384 | hasBin: true 1385 | peerDependencies: 1386 | browserslist: '>= 4.21.0' 1387 | dependencies: 1388 | browserslist: 4.21.3 1389 | escalade: 3.1.1 1390 | picocolors: 1.0.0 1391 | dev: true 1392 | 1393 | /validate-npm-package-license/3.0.4: 1394 | resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} 1395 | dependencies: 1396 | spdx-correct: 3.1.1 1397 | spdx-expression-parse: 3.0.1 1398 | dev: true 1399 | 1400 | /vue-demi/0.13.11_vue@3.2.39: 1401 | resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==} 1402 | engines: {node: '>=12'} 1403 | hasBin: true 1404 | requiresBuild: true 1405 | peerDependencies: 1406 | '@vue/composition-api': ^1.0.0-rc.1 1407 | vue: ^3.0.0-0 || ^2.6.0 1408 | peerDependenciesMeta: 1409 | '@vue/composition-api': 1410 | optional: true 1411 | dependencies: 1412 | vue: 3.2.39 1413 | dev: false 1414 | 1415 | /vue-router/4.1.5_vue@3.2.39: 1416 | resolution: {integrity: sha512-IsvoF5D2GQ/EGTs/Th4NQms9gd2NSqV+yylxIyp/OYp8xOwxmU8Kj/74E9DTSYAyH5LX7idVUngN3JSj1X4xcQ==} 1417 | peerDependencies: 1418 | vue: ^3.2.0 1419 | dependencies: 1420 | '@vue/devtools-api': 6.2.1 1421 | vue: 3.2.39 1422 | dev: false 1423 | 1424 | /vue-tsc/0.40.13: 1425 | resolution: {integrity: sha512-xzuN3g5PnKfJcNrLv4+mAjteMd5wLm5fRhW0034OfNJZY4WhB07vhngea/XeGn7wNYt16r7syonzvW/54dcNiA==} 1426 | hasBin: true 1427 | peerDependencies: 1428 | typescript: '*' 1429 | dependencies: 1430 | '@volar/vue-language-core': 0.40.13 1431 | '@volar/vue-typescript': 0.40.13 1432 | dev: true 1433 | 1434 | /vue/3.2.39: 1435 | resolution: {integrity: sha512-tRkguhRTw9NmIPXhzk21YFBqXHT2t+6C6wPOgQ50fcFVWnPdetmRqbmySRHznrYjX2E47u0cGlKGcxKZJ38R/g==} 1436 | dependencies: 1437 | '@vue/compiler-dom': 3.2.39 1438 | '@vue/compiler-sfc': 3.2.39 1439 | '@vue/runtime-dom': 3.2.39 1440 | '@vue/server-renderer': 3.2.39_vue@3.2.39 1441 | '@vue/shared': 3.2.39 1442 | 1443 | /which-boxed-primitive/1.0.2: 1444 | resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} 1445 | dependencies: 1446 | is-bigint: 1.0.4 1447 | is-boolean-object: 1.1.2 1448 | is-number-object: 1.0.7 1449 | is-string: 1.0.7 1450 | is-symbol: 1.0.4 1451 | dev: true 1452 | 1453 | /which/1.3.1: 1454 | resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} 1455 | hasBin: true 1456 | dependencies: 1457 | isexe: 2.0.0 1458 | dev: true 1459 | 1460 | /yallist/4.0.0: 1461 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1462 | dev: true 1463 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - 'packages/*' 3 | -------------------------------------------------------------------------------- /tests/base.test.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs' 2 | import MagicString from 'magic-string' 3 | import parse from 'url-parse' 4 | import { expect, test } from 'vitest' 5 | 6 | const originalTypes = ` 7 | interface RootObject { 8 | result: Result; 9 | code: number; 10 | } 11 | 12 | 13 | interface RootObject { 14 | result: Result; 15 | code: number; 16 | } 17 | interface Result { 18 | songs: Song[]; 19 | hasMore: boolean; 20 | songCount: number; 21 | } 22 | interface Song { 23 | id: number; 24 | name: string; 25 | artists: Artist[]; 26 | album: Album; 27 | duration: number; 28 | copyrightId: number; 29 | status: number; 30 | alias: any[]; 31 | rtype: number; 32 | ftype: number; 33 | mvid: number; 34 | fee: number; 35 | rUrl?: any; 36 | mark: number; 37 | } 38 | interface Album { 39 | id: number; 40 | name: string; 41 | artist: Artist; 42 | publishTime: number; 43 | size: number; 44 | copyrightId: number; 45 | status: number; 46 | picId: number; 47 | mark: number; 48 | } 49 | interface Artist { 50 | id: number; 51 | name: string; 52 | picUrl?: any; 53 | alias: any[]; 54 | albumSize: number; 55 | picId: number; 56 | fansGroup?: any; 57 | img1v1Url: string; 58 | img1v1: number; 59 | trans?: any; 60 | }` 61 | 62 | test('url-parse', () => { 63 | const res = parse('/api/song?id=1') 64 | 65 | expect(res).toMatchInlineSnapshot(` 66 | { 67 | "auth": "", 68 | "hash": "", 69 | "host": "", 70 | "hostname": "", 71 | "href": "/api/song?id=1", 72 | "origin": "null", 73 | "password": "", 74 | "pathname": "/api/song", 75 | "port": "", 76 | "protocol": "", 77 | "query": "?id=1", 78 | "slashes": false, 79 | "username": "", 80 | } 81 | `) 82 | }) 83 | 84 | test('transform', () => { 85 | const code = new MagicString(originalTypes) 86 | 87 | expect(code.prepend('declare ').toString()).toMatchInlineSnapshot(` 88 | "declare 89 | interface RootObject { 90 | result: Result; 91 | code: number; 92 | } 93 | 94 | 95 | interface RootObject { 96 | result: Result; 97 | code: number; 98 | } 99 | interface Result { 100 | songs: Song[]; 101 | hasMore: boolean; 102 | songCount: number; 103 | } 104 | interface Song { 105 | id: number; 106 | name: string; 107 | artists: Artist[]; 108 | album: Album; 109 | duration: number; 110 | copyrightId: number; 111 | status: number; 112 | alias: any[]; 113 | rtype: number; 114 | ftype: number; 115 | mvid: number; 116 | fee: number; 117 | rUrl?: any; 118 | mark: number; 119 | } 120 | interface Album { 121 | id: number; 122 | name: string; 123 | artist: Artist; 124 | publishTime: number; 125 | size: number; 126 | copyrightId: number; 127 | status: number; 128 | picId: number; 129 | mark: number; 130 | } 131 | interface Artist { 132 | id: number; 133 | name: string; 134 | picUrl?: any; 135 | alias: any[]; 136 | albumSize: number; 137 | picId: number; 138 | fansGroup?: any; 139 | img1v1Url: string; 140 | img1v1: number; 141 | trans?: any; 142 | }" 143 | `) 144 | 145 | expect(fs.existsSync('alias.ts')).toMatchInlineSnapshot('true') 146 | }) 147 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2017", 4 | "module": "esnext", 5 | "lib": ["esnext"], 6 | "moduleResolution": "node", 7 | "esModuleInterop": true, 8 | "strict": true, 9 | "strictNullChecks": true, 10 | "resolveJsonModule": true, 11 | "skipDefaultLibCheck": true, 12 | "skipLibCheck": true, 13 | "jsx": "preserve", 14 | "types": [ 15 | "node", 16 | "vite/client" 17 | ], 18 | "paths": { 19 | "@ohmyts/vite": ["./packages/vite/src/index.ts"], 20 | "@ohmyts/shared": ["./packages/shared/src/index.ts"] 21 | } 22 | }, 23 | "exclude": [ 24 | "**/dist/**", 25 | "**/node_modules/**", 26 | "**/client/**", 27 | "**/playground/**", 28 | "**/examples/**", 29 | "**/interactive/**", 30 | "**/test/dts/**" 31 | ] 32 | } 33 | -------------------------------------------------------------------------------- /vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import { alias } from './alias' 3 | 4 | export default defineConfig({ 5 | optimizeDeps: { 6 | entries: [], 7 | }, 8 | resolve: { 9 | alias, 10 | }, 11 | test: { 12 | isolate: false, 13 | testTimeout: 1000000, 14 | }, 15 | }) 16 | --------------------------------------------------------------------------------