├── .eslintrc.js ├── .gitignore ├── .prettierrc ├── CODE_OF_CONDUCT.md ├── LICENSE ├── README.md ├── assets └── animesub.png ├── package-lock.json ├── package.json ├── src ├── auth │ ├── config.js │ ├── credentials.js │ └── onedrive.js ├── config │ └── default.js ├── fileView.js ├── files │ └── load.js ├── folderView.js ├── index.js └── render │ ├── favicon.js │ ├── fileExtension.js │ ├── htmlWrapper.js │ ├── mdRenderer.js │ └── pathUtil.js ├── themes ├── batch-button.css ├── prism-github.css └── spencer.css ├── wrangler.toml └── yarn.lock /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | browser: true, 4 | es2020: true 5 | }, 6 | extends: ['standard'], 7 | parserOptions: { 8 | ecmaVersion: 11, 9 | sourceType: 'module' 10 | }, 11 | rules: { 12 | 'space-before-function-paren': ['error', 'never'] 13 | }, 14 | globals: { 15 | TransformStream: true, 16 | REFRESH_TOKEN: true, 17 | CLIENT_SECRET: true, 18 | BUCKET: true 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /dist 3 | **/*.rs.bk 4 | Cargo.lock 5 | bin/ 6 | pkg/ 7 | wasm-pack.log 8 | worker/ 9 | node_modules/ 10 | .cargo-ok 11 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "semi": false, 4 | "trailingComma": "none", 5 | "tabWidth": 2, 6 | "printWidth": 120 7 | } 8 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | - Using welcoming and inclusive language 18 | - Being respectful of differing viewpoints and experiences 19 | - Gracefully accepting constructive criticism 20 | - Focusing on what is best for the community 21 | - Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | - The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | - Trolling, insulting/derogatory comments, and personal or political attacks 28 | - Public or private harassment 29 | - Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | - Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at ag_dubs@cloudflare.com. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq 77 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2018 Ashley Williams 2 | 3 | Permission is hereby granted, free of charge, to any 4 | person obtaining a copy of this software and associated 5 | documentation files (the "Software"), to deal in the 6 | Software without restriction, including without 7 | limitation the rights to use, copy, modify, merge, 8 | publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software 10 | is furnished to do so, subject to the following 11 | conditions: 12 | 13 | The above copyright notice and this permission notice 14 | shall be included in all copies or substantial portions 15 | of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF 18 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 19 | TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 20 | PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 21 | SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 22 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 23 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 24 | IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 25 | DEALINGS IN THE SOFTWARE. 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

💎 BelieveInBunny

2 | As I encode anime and share them, I wanted to share OneDrive folder links to users. So I indexed my OneDrive to make the experience better (and to not receive DMCAs on my actual drive). 3 | 4 |

Issues:

5 | 6 |

#Users could easily access folders of other encodes or the complete indexed OneDrive.

7 |

#I choose .mkv as container for my videos, which wasn't supported.

8 |

#It supports H264 in-browser streaming but not for H265.

9 | 10 | 🎁My mods: 11 | 1. If the user visits the Public directory, they won't be able to access all the indexed files. 12 | (here, [Team Drive site](https://octavian.akeno.workers.dev), you can't see the files/folders indexed, but [Test folder](https://octavian.akeno.workers.dev/test), here you can) 13 | 2. Force-added support for .mkv files to detect as streamable file format. 14 | 15 | 🐱‍👤Failures: 16 | 1. Can't add support for H265 in-browser streaming as majority of the browsers don't support it (except, Safari). 17 | 2. Couldn't find an HTML5 player with multiple audio and/or subs support, so, stuck with default. 18 | 3. Idk anything about JS and was therefore unable to contribute much. 19 | 20 | [![Hosted on Cloudflare Workers](https://img.shields.io/badge/Hosted%20on-CF%20Workers-f38020?logo=cloudflare&logoColor=f38020&labelColor=282d33)](https://storage.spencerwoo.com/) 21 | [![Deploy](https://github.com/spencerwooo/onedrive-cf-index/workflows/Deploy/badge.svg)](https://github.com/spencerwooo/onedrive-cf-index/actions?query=workflow%3ADeploy) 22 | AnimeSub 23 | 24 |

onedrive-cf-index

25 | 26 | 🏵 **Yet Another OneDrive Index.** Powered by Cloudflare Workers. Inspired and originated greatly from [heymind/OneDrive-Index-Cloudflare-Worker](https://github.com/heymind/OneDrive-Index-Cloudflare-Worker). 27 | 28 |

Table of contents

29 | 30 | - [Demo](#demo) 31 | - [Features](#features) 32 | - [Improvements](#improvements) 33 | - [New features](#new-features) 34 | - [Under the hood](#under-the-hood) 35 | - [All other features](#all-other-features) 36 | - [Deployment](#deployment) 37 | - [Generating OneDrive API Tokens](#generating-onedrive-api-tokens) 38 | - [Preparations](#preparations) 39 | - [Building and deployment](#building-and-deployment) 40 | - [Customizations](#customizations) 41 | 42 | ## Demo 43 | 44 | Live demo: [📁 AnimeSub's OneDrive Index](https://storage.spencerwoo.com/). 45 | 46 | | Scenario | Screenshot | 47 | | :------: | :------------------------------------------------------------------: | 48 | | Home | ![](https://cdn.spencer.felinae98.cn/blog/2020/08/200806_153117.png) | 49 | | Folder | ![](https://cdn.spencer.felinae98.cn/blog/2020/08/200806_153124.png) | 50 | 51 | ## Features 52 | 53 | ### Improvements 54 | 55 | #### New features 56 | 57 | - **New design:** [`spencer.css`](themes/spencer.css). 58 | - File icon rendered according to file type. Emoji as folder icon when available (if the first character of the folder name is an emoji). 59 | - Use [Font Awesome icons](https://fontawesome.com/) instead of material design icons (For better design consistency). 60 | - Use [github-markdown-css](https://github.com/sindresorhus/github-markdown-css) for `README.md` rendering → [Demo](https://storage.spencerwoo.com/%F0%9F%A5%9F%20Some%20test%20files/README/). 61 | - **Add breadcrumbs for better directory navigation.** 62 | - **Support file previewing:** 63 | - Images: `.png`, `.jpg`, `.gif` → [Demo](https://storage.spencerwoo.com/%F0%9F%A5%9F%20Some%20test%20files/Previews/). 64 | - Plain text: `.txt` → [Demo](https://storage.spencerwoo.com/%F0%9F%A5%9F%20Some%20test%20files/Previews/iso_8859-1.txt). 65 | - Markdown: `.md`, `.mdown`, `.markdown` → [Demo](https://storage.spencerwoo.com/%F0%9F%A5%9F%20Some%20test%20files/Previews/i_m_a_md.md). 66 | - Code: `.js`, `.py`, `.c`, `.json`... → [Demo](https://storage.spencerwoo.com/%F0%9F%A5%9F%20Some%20test%20files/Code/pathUtil.js). 67 | - **PDF: Lazy loading, loading progress and built-in PDF viewer** → [Demo](). 68 | - **Music / Audio:** `.mp3`, `.aac`, `.wav`, `.oga` → [Demo](https://storage.spencerwoo.com/%F0%9F%A5%9F%20Some%20test%20files/Multimedia/Elysian%20Fields%20-%20Climbing%20My%20Dark%20Hair.mp3). 69 | - **Videos:** `.mp4`, `.flv`, `.webm`, `.m3u8` → [Demo](https://storage.spencerwoo.com/%F0%9F%A5%9F%20Some%20test%20files/Multimedia/%E8%BD%A6%E5%BA%93%E5%A5%B3%E7%8E%8B%20%E9%AB%98%E8%B7%9F%E8%B9%A6%E8%BF%AA%20%E4%B9%98%E9%A3%8E%E7%A0%B4%E6%B5%AA%E7%9A%84%E5%A7%90%E5%A7%90%E4%B8%BB%E9%A2%98%E6%9B%B2%E3%80%90%E9%86%8B%E9%86%8B%E3%80%91.mp4). 70 | - ... 71 | - Code syntax highlight in GitHub style. (With PrismJS.) 72 | - Image preview supports [Medium style zoom effect](https://github.com/francoischalifour/medium-zoom). 73 | - Token cached and refreshed with Cloudflare Workers KV storage. _(We got rid of external Firebase dependencies!)_ 74 | - Route lazy loading with the help of [Turbolinks®](https://github.com/turbolinks/turbolinks). 75 | - Supports OneDrive 21Vianet.(由世纪互联运营的 OneDrive。) 76 | - ... 77 | 78 | #### Under the hood 79 | 80 | - CSS animations all the way. 81 | - Package source code with wrangler and webpack. 82 | - Convert all CDN assets to load with jsDelivr. 83 | - **Almost all scripts are loaded with webpack!** (Other than some libraries for 84 | rendering file previews.) 85 | - ... 86 | 87 | ### All other features 88 | 89 | See: [New features | OneDrive-Index-Cloudflare-Worker](https://github.com/heymind/OneDrive-Index-Cloudflare-Worker#-%E6%96%B0%E7%89%B9%E6%80%A7-v11). 90 | 91 | ## Deployment 92 | 93 | > Online token generation tool taken from the generous: . 94 | 95 | ### Generating OneDrive API Tokens 96 | 97 | 1. Create a new blade app here [Microsoft Azure App registrations](https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade) (OneDrive normal version) or [Microsoft Azure.cn App registrations](https://portal.azure.cn/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade) (OneDrive 世纪互联版本) with: 98 | 1. `Supported account types` set to `Accounts in any organizational directory (Any Azure AD directory - Multitenant) and personal Microsoft accounts (e.g. Skype, Xbox)`. OneDrive 世纪互联用户设置为:`任何组织目录(任何 Azure AD 目录 - 多租户)中的帐户`. 99 | 2. `Redirect URI (optional)` set to "Web: https://heymind.github.io/tools/microsoft-graph-api-auth". 100 | 2. Get your Application (client) ID - `client_id` at `Overview` panel. 101 | 3. Open `Certificates & secrets` panel and create a new secret called `client_secret`. 102 | 4. Add permissions `offline_access, Files.Read, Files.Read.All` at `API permissions`. 103 | 5. Get your `refresh_token` using . 104 | 6. Create a dedicated folder for your public files inside OneDrive, for instance: `/Public`. Please don't share your root folder directly! 105 | 106 | _If you can't fetch the `access_token` and/or `refresh_token` on step 5, please resolve to the solution suggested in the pinned issue [#13](https://github.com/spencerwooo/onedrive-cf-index/issues/13#issuecomment-671027672)._ 107 | 108 | After all this hassle, you should have successfully acquired the following tokens and secrets: 109 | 110 | - `refresh_token` 111 | - `client_id` 112 | - `client_secret` 113 | - `redirect_uri`: Defaults to `https://heymind.github.io/tools/microsoft-graph-api-auth`. 114 | - `base`: Defaults to `/Public`. 115 | 116 | ### Preparations 117 | 118 | Fork the repository. Install dependencies. 119 | 120 | ```sh 121 | # Install cloudflare workers official packing and publishing tool 122 | yarn global add @cloudflare/wrangler 123 | 124 | # Install dependencies with yarn 125 | yarn install 126 | 127 | # Login to Cloudflare with wrangler 128 | wrangler config 129 | 130 | # Verify wrangler status with this command 131 | wrangler whoami 132 | ``` 133 | 134 | Create a **DRAFT** worker at Cloudflare Workers with a cool name. Get your own Cloudflare `account_id` and `zone_id`: [Docs - Account ID And Zone ID](https://developers.cloudflare.com/workers/quickstart#account-id-and-zone-id). 135 | 136 | 137 | Create Cloudflare Workers KV bucket named `BUCKET`: 138 | 139 | ```sh 140 | # Create KV bucket 141 | wrangler kv:namespace create "BUCKET" 142 | 143 | # ... or, create KV bucket with preview functions enabled 144 | wrangler kv:namespace create "BUCKET" --preview 145 | ``` 146 | 147 | Modify [`wrangler.toml`](wrangler.toml): 148 | 149 | - `name`: The draft worker's name, your worker will be published at `..workers.dev`. 150 | - `account_id`: Your Cloudflare Account ID. 151 | - `zone_id`: Your Cloudflare Zone ID. 152 | - `kv_namespaces`: Your Cloudflare KV namespace, you should substitute the `id` 153 | and `preview_id` values accordingly. _If you don't need preview functions, you 154 | can remove the `preview_id` field._ 155 | 156 | Modify [`src/config/default.js`](src/config/default.js): 157 | 158 | - `client_id`: Your `client_id` from above. 159 | - `base`: Your `base` path from above. 160 | 161 | _For Chinese 21Vianet OneDrive users. OneDrive 世纪互联用户:将 `useOneDriveCN` 设置(修改)为 `true`。_ 162 | 163 | Add secrets to Cloudflare Workers environment variables with `wrangler`: 164 | 165 | ```sh 166 | # Add your refresh_token and client_secret to Cloudflare 167 | wrangler secret put REFRESH_TOKEN 168 | # ... enter your refresh_token from above here 169 | 170 | wrangler secret put CLIENT_SECRET 171 | # ... enter your client_secret from above here 172 | ``` 173 | 174 | ### Building and deployment 175 | 176 | You can preview the worker with `wrangler`: 177 | 178 | ```sh 179 | wrangler preview 180 | ``` 181 | 182 | After making sure everything is ok, you can publish your worker with: 183 | 184 | ```sh 185 | wrangler publish 186 | ``` 187 | 188 | You can also create a GitHub Actions for auto publishing your worker on `push`. See [main.yml](.github/workflows/main.yml). 189 | 190 | ## Customizations 191 | 192 | - You can **(AND SHOULD)** change the `intro` on the default landing page here: [src/folderView.js](src/folderView.js#L51-L55). Write HTML directly. 193 | - You can **(AND ALSO SHOULD)** change the header of the site here: [src/render/htmlWrapper.js](src/render/htmlWrapper.js#L24). 194 | - Your custom styles are loaded from [themes/spencer.css](themes/spencer.css), change that according to your customizations. You may also need to change the commit HASH at [src/render/htmlWrapper.js](src/render/htmlWrapper.js#L3). 195 | - You can also customize Markdown CSS styles, PrismJS code highlight color schemes, etc. 196 | 197 | --- 198 | 199 | 🏵 **`onedrive-cf-index`** ©Spencer Woo. Released under the MIT License. 200 | 201 | Authored and maintained by Spencer Woo. 202 | 203 | [@Portfolio](https://animesub.in/) · [@Blog](https://blog.spencerwoo.com/) · [@GitHub](https://github.com/spencerwooo) 204 | -------------------------------------------------------------------------------- /assets/animesub.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BelieveInBunny/onedrive-index/42c725f9206a6a416eb09820e3c535e12d75c266/assets/animesub.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "name": "onedrive-cf-index", 4 | "version": "1.0.0", 5 | "description": "A template for kick starting a Cloudflare Workers project", 6 | "main": "./src/index.js", 7 | "scripts": { 8 | "test": "echo \"Error: no test specified\" && exit 1", 9 | "format": "prettier --write '**/*.{js,css,json,md}'", 10 | "lint": "eslint src/**/* *.js --color --fix", 11 | "dev": "wrangler preview --watch" 12 | }, 13 | "author": "spencerwooo ", 14 | "license": "MIT", 15 | "devDependencies": { 16 | "eslint": "^7.6.0", 17 | "eslint-config-prettier": "^6.11.0", 18 | "eslint-config-standard": "^14.1.1", 19 | "eslint-plugin-import": "^2.22.0", 20 | "eslint-plugin-node": "^11.1.0", 21 | "eslint-plugin-prettier": "^3.1.4", 22 | "eslint-plugin-promise": "^4.2.1", 23 | "eslint-plugin-standard": "^4.0.1", 24 | "prettier": "^1.18.2" 25 | }, 26 | "dependencies": { 27 | "emoji-regex": "^9.2.2", 28 | "font-awesome-filetypes": "^2.1.0", 29 | "marked": "^2.1.3" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/auth/config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Basic authentication. 3 | * Disabled by default (Issue #29) 4 | * 5 | * AUTH_ENABLED to enable auth set true 6 | * NAME user name 7 | * PASS password 8 | */ 9 | export const AUTH_ENABLED = false 10 | export const NAME = 'admin' 11 | export const PASS = 'password' 12 | 13 | /** 14 | * RegExp for basic auth credentials 15 | * 16 | * credentials = auth-scheme 1*SP token68 17 | * auth-scheme = "Basic" ; case insensitive 18 | * token68 = 1*( ALPHA / DIGIT / "-" / "." / "_" / "~" / "+" / "/" ) *"=" 19 | */ 20 | 21 | export const CREDENTIALS_REGEXP = /^ *(?:[Bb][Aa][Ss][Ii][Cc]) +([A-Za-z0-9._~+/-]+=*) *$/ 22 | 23 | /** 24 | * RegExp for basic auth user/pass 25 | * 26 | * user-pass = userid ":" password 27 | * userid = * 28 | * password = *TEXT 29 | */ 30 | 31 | export const USER_PASS_REGEXP = /^([^:]*):(.*)$/ 32 | -------------------------------------------------------------------------------- /src/auth/credentials.js: -------------------------------------------------------------------------------- 1 | import { CREDENTIALS_REGEXP, USER_PASS_REGEXP } from './config' 2 | 3 | /** 4 | * Object to represent user credentials. 5 | */ 6 | class Credentials { 7 | constructor(name, pass) { 8 | this.name = name 9 | this.pass = pass 10 | } 11 | } 12 | 13 | /** 14 | * Parse basic auth to object. 15 | */ 16 | export function parseAuthHeader(string) { 17 | if (typeof string !== 'string') { 18 | return undefined 19 | } 20 | 21 | // parse header 22 | const match = CREDENTIALS_REGEXP.exec(string) 23 | 24 | if (!match) { 25 | return undefined 26 | } 27 | 28 | // decode user pass 29 | const userPass = USER_PASS_REGEXP.exec(atob(match[1])) 30 | 31 | if (!userPass) { 32 | return undefined 33 | } 34 | 35 | // return credentials object 36 | return new Credentials(userPass[1], userPass[2]) 37 | } 38 | 39 | export function unauthorizedResponse(body) { 40 | return new Response(null, { 41 | status: 401, 42 | statusText: "'Authentication required.'", 43 | body: body, 44 | headers: { 45 | 'WWW-Authenticate': 'Basic realm="User Visible Realm"' 46 | } 47 | }) 48 | } 49 | -------------------------------------------------------------------------------- /src/auth/onedrive.js: -------------------------------------------------------------------------------- 1 | import config from '../config/default' 2 | 3 | /** 4 | * Get access token for microsoft graph API endpoints. Refresh token if needed. 5 | */ 6 | export async function getAccessToken() { 7 | const timestamp = () => { 8 | return Math.floor(Date.now() / 1000) 9 | } 10 | 11 | // Fetch access token 12 | const data = await BUCKET.get('onedrive', 'json') 13 | if (data && data.access_token && timestamp() < data.expire_at) { 14 | console.log('Fetched token from storage.') 15 | return data.access_token 16 | } 17 | 18 | // Token expired, refresh access token with Microsoft API. Both international and china-specific API are supported 19 | const oneDriveAuthEndpoint = config.useOneDriveCN 20 | ? 'https://login.chinacloudapi.cn/common/oauth2/v2.0/token' 21 | : 'https://login.microsoftonline.com/common/oauth2/v2.0/token' 22 | 23 | const resp = await fetch(oneDriveAuthEndpoint, { 24 | method: 'POST', 25 | body: `client_id=${config.client_id}&redirect_uri=${config.redirect_uri}&client_secret=${config.client_secret} 26 | &refresh_token=${config.refresh_token}&grant_type=refresh_token`, 27 | headers: { 28 | 'Content-Type': 'application/x-www-form-urlencoded' 29 | } 30 | }) 31 | if (resp.ok) { 32 | console.info('Successfully refreshed access_token.') 33 | const data = await resp.json() 34 | 35 | // Update expiration time on token refresh 36 | data.expire_at = timestamp() + data.expires_in 37 | 38 | await BUCKET.put('onedrive', JSON.stringify(data)) 39 | console.info('Successfully updated access_token.') 40 | 41 | // Finally, return access token 42 | return data.access_token 43 | } else { 44 | // eslint-disable-next-line no-throw-literal 45 | throw `getAccessToken error ${JSON.stringify(await resp.text())}` 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/config/default.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-irregular-whitespace */ 2 | const config = { 3 | /** 4 | * You can use this tool http://heymind.github.io/tools/microsoft-graph-api-auth 5 | * to get following params: client_id, client_secret, refresh_token & redirect_uri. 6 | */ 7 | refresh_token: "0.AX0AEqZW8rbs5ZQ9scj51G1pBPv20SzX36O6xzixwF4ThyZNNJ7JfMKSHKclGxHjtF-Wpi7jzEg1xL3sCOtR8VKpbpzHW3oTuRH6GrcDXsONMZB5els1KB7dxuSBN5QfgHq4ScDuXgkSxchFfeaR6KdFWoR83aHYfXqsvzdrmTeXr3t71kxZv5Gbc5fAignCyjo1dAFujrkkslHIc7M-1203ADNBHbL28M697DuDIdUm6s7Nk-h-l8TNZidxrKfVXxrzvENcs9P6gTqyvhCR_LXg7raScL-H_wFXyGwoXpZYpqocbLIiKzuCgHeKAvCP6qYLgeuixZ8_QkO0OHqv33JpwOx_PyFZ6LwKFrcUDYuqgd1L1PJlQOrEFsi0Jzouf-Gpp7JTqRkYkxIt2hHbUzmucHRp1NpE_SYVJ5ofo7Pf4647gre27b9SlBP25zgz9nT5mjO0JzzfF-b-k35ANyqe9ZrR80Cl9MT-71udW_SBaMwvr2HwbGUdzH8Pd6lDdrI5tU9q3Cu6zRUOGSqZqipAE4rm5LgIPHFjiPwCwakIB13BiX_C4qiJbZ4afj_OGDZ960bynikS4rjxJ6PDQp960gYdcUMUESS2-8zfeBZACFuX-QR4irZIYbk9gLyRhL4HN1oE41Uu9Q6fTAMjsqAnwhdS-P13lN0i07FIJIcxyzrc3NgTOT6ot7FCcKbABkeKEOF_ftdZ1fp10uvlzl20kPFKJ_sOUSBr5-jKCRchxcyuXaI1wAmOKEUsIdij3A5VqymD2FG2ldsSbVP2teiZRpUGY1WW6TH0SyzwZzCHM1bGkC9jKmOTRlCctTZvoWOuyleetqwySEqYnJulGVaPQ5n2GXbJqrWG8Bk4p-_Jwvl2qp-MScH4pNERJ0le0ujb5CsLeHf8C1_jYHlUSoPq70X_DWw6YMqOIJmhcy_jlY89rxyt4hxDChxW1sPiuReeNfzxPYGMScRm2PwRAm2dn4Sopq1DkYmzzwPyzK9JfQa39gBP1rCsxLQ6bw1BMARvKi-bz6k_GIikeTq_yliWnk", 8 | client_id: '0eb4befd-fa9e-4ff7-4ff7-1ba20d90a02a', 9 | client_secret: '-IKAj_R8K~I27-4m3i3kf32zT6DHOivi.', 10 | redirect_uri: 'https://heymind.github.io/tools/microsoft-graph-api-auth', 11 | 12 | /** 13 | * The base path for indexing, all files and subfolders are public by this tool. For example: `/Public`. 14 | */ 15 | base: '/Public', 16 | 17 | /** 18 | * Feature: add OneDriveCN (21Vianet) support 19 | * Usage: simply change `useOneDriveCN` to true 20 | */ 21 | useOneDriveCN: false, 22 | 23 | /** 24 | * Feature: Pagination when a folder has multiple(>${top}) files 25 | * - top: specify the page size limit of the result set, a big `top` value will slow down the fetching speed 26 | */ 27 | pagination: { 28 | enable: true, 29 | top: 100 // default: 200, accepts a minimum value of 1 and a maximum value of 999 (inclusive) 30 | }, 31 | 32 | /** 33 | * Feature Caching 34 | * Enable Cloudflare cache for path pattern listed below. 35 | * Cache rules: 36 | * - Entire File Cache 0 < file_size < entireFileCacheLimit 37 | * - Chunked Cache entireFileCacheLimit <= file_size < chunkedCacheLimit 38 | * - No Cache ( redirect to OneDrive Server ) others 39 | * 40 | * Difference between `Entire File Cache` and `Chunked Cache` 41 | * 42 | * `Entire File Cache` requires the entire file to be transferred to the Cloudflare server before 43 | * the first byte sent to a client. 44 | * 45 | * `Chunked Cache` would stream the file content to the client while caching it. 46 | * But there is no exact Content-Length in the response headers. ( Content-Length: chunked ) 47 | * 48 | */ 49 | cache: { 50 | enable: false, 51 | entireFileCacheLimit: 10000000, // 10MB 52 | chunkedCacheLimit: 100000000, // 100MB 53 | paths: ['/Images'] 54 | }, 55 | 56 | /** 57 | * Feature: Thumbnail 58 | * Show a thumbnail of image by ?thumbnail=small (small, medium, large) 59 | * More details: https://docs.microsoft.com/en-us/onedrive/developer/rest-api/api/driveitem_list_thumbnails?view=odsp-graph-online#size-options 60 | * Example: https://storage.spencerwoo.com/🥟%20Some%20test%20files/Previews/eb37c02438f.png?thumbnail=mediumSquare 61 | * You can embed this link (url encoded) directly inside Markdown or HTML. 62 | */ 63 | thumbnail: true, 64 | 65 | /** 66 | * Small File Upload (<= 4MB) 67 | * POST https:////?upload=&key= 68 | */ 69 | upload: { 70 | enable: false, 71 | key: 'your_secret_key_here' 72 | }, 73 | 74 | /** 75 | * Feature: Proxy Download 76 | * Use Cloudflare as a relay to speed up download. (Especially in Mainland China) 77 | * Example: https://storage.spencerwoo.com/🥟%20Some%20test%20files/Previews/eb37c02438f.png?raw=true&proxied 78 | * You can also embed this link (url encoded) directly inside Markdown or HTML. 79 | */ 80 | proxyDownload: true 81 | } 82 | 83 | export default config 84 | -------------------------------------------------------------------------------- /src/fileView.js: -------------------------------------------------------------------------------- 1 | import marked from 'marked' 2 | 3 | import { renderHTML } from './render/htmlWrapper' 4 | import { renderPath } from './render/pathUtil' 5 | import { renderMarkdown } from './render/mdRenderer' 6 | 7 | import { preview, extensions } from './render/fileExtension' 8 | 9 | /** 10 | * Render code blocks with the help of marked and Markdown grammar 11 | * 12 | * @param {Object} file Object representing the code file to preview 13 | * @param {string} lang The markdown code language string, usually just the file extension 14 | */ 15 | async function renderCodePreview(file, lang) { 16 | const resp = await fetch(file['@microsoft.graph.downloadUrl']) 17 | const content = await resp.text() 18 | const toMarkdown = `\`\`\`${lang}\n${content}\n\`\`\`` 19 | const renderedCode = marked(toMarkdown) 20 | return `
21 | ${renderedCode} 22 |
` 23 | } 24 | 25 | /** 26 | * Render PDF with built-in PDF viewer 27 | * 28 | * @param {Object} file Object representing the PDF to preview 29 | */ 30 | function renderPDFPreview(file) { 31 | return `
32 |
33 | 34 | Loading PDF... 35 |
36 | 37 | ` 106 | } 107 | 108 | /** 109 | * Render image (jpg, png or gif) 110 | * 111 | * @param {Object} file Object representing the image to preview 112 | */ 113 | function renderImage(file) { 114 | return `
115 | ${file.name} 116 |
` 117 | } 118 | 119 | /** 120 | * Render video (mp4, flv, m3u8, webm ...) 121 | * 122 | * @param {Object} file Object representing the video to preview 123 | */ 124 | function renderVideoPlayer(file) { 125 | return `
126 | 127 | ` 137 | } 138 | 139 | function renderMKVPlayer(file) { 140 | return ` 141 | 142 | ` 155 | } 156 | 157 | /** 158 | * Render audio (mp3, aac, wav, oga ...) 159 | * 160 | * @param {Object} file Object representing the audio to preview 161 | */ 162 | function renderAudioPlayer(file) { 163 | return ` 164 |
165 | 166 | ` 176 | } 177 | 178 | /** 179 | * File preview fallback 180 | * 181 | * @param {string} fileExt The file extension parsed 182 | */ 183 | function renderUnsupportedView(fileExt) { 184 | return `
185 |

Sorry, we don't support previewing .${fileExt} files as of today. You can download the file directly.

186 |
` 187 | } 188 | 189 | /** 190 | * Render preview of supported file format 191 | * 192 | * @param {Object} file Object representing the file to preview 193 | * @param {string} fileExt The file extension parsed 194 | */ 195 | async function renderPreview(file, fileExt) { 196 | switch (extensions[fileExt]) { 197 | case preview.markdown: 198 | return await renderMarkdown(file['@microsoft.graph.downloadUrl'], '', 'style="margin-top: 0;"') 199 | 200 | case preview.text: 201 | return await renderCodePreview(file, '') 202 | 203 | case preview.image: 204 | return renderImage(file) 205 | 206 | case preview.code: 207 | return await renderCodePreview(file, fileExt) 208 | 209 | case preview.pdf: 210 | return renderPDFPreview(file) 211 | 212 | case preview.video: 213 | return renderVideoPlayer(file) 214 | 215 | case preview.audio: 216 | return renderAudioPlayer(file) 217 | 218 | case preview.mkv: 219 | return renderMKVPlayer(file) 220 | 221 | default: 222 | return renderUnsupportedView(fileExt) 223 | } 224 | } 225 | 226 | export async function renderFilePreview(file, path, fileExt) { 227 | const el = (tag, attrs, content) => `<${tag} ${attrs.join(' ')}>${content}` 228 | const div = (className, content) => el('div', [`class=${className}`], content) 229 | 230 | const body = div( 231 | 'container', 232 | div('path', renderPath(path) + ` / ${file.name}`) + 233 | div('items', el('div', ['style="padding: 1rem 1rem;"'], await renderPreview(file, fileExt))) + 234 | div( 235 | 'download-button-container', 236 | el( 237 | 'a', ['class="download-button"', `href="${file['@microsoft.graph.downloadUrl']}"`], 238 | ' DOWNLOAD' 239 | ) 240 | ) 241 | ) 242 | return renderHTML(body) 243 | } 244 | -------------------------------------------------------------------------------- /src/files/load.js: -------------------------------------------------------------------------------- 1 | import config from '../config/default' 2 | import { getAccessToken } from '../auth/onedrive' 3 | 4 | /** 5 | * Cloudflare cache instance 6 | */ 7 | const cache = caches.default 8 | 9 | /** 10 | * Cache downloadUrl according to caching rules. 11 | * @param {Request} request client's request 12 | * @param {integer} fileSize 13 | * @param {string} downloadUrl 14 | * @param {function} fallback handle function if the rules is not satisfied 15 | */ 16 | async function setCache(request, fileSize, downloadUrl, fallback) { 17 | if (fileSize < config.cache.entireFileCacheLimit) { 18 | console.info(`Cache entire file ${request.url}`) 19 | const remoteResp = await fetch(downloadUrl) 20 | const resp = new Response(remoteResp.body, { 21 | headers: { 22 | 'Content-Type': remoteResp.headers.get('Content-Type'), 23 | ETag: remoteResp.headers.get('ETag') 24 | }, 25 | status: remoteResp.status, 26 | statusText: remoteResp.statusText 27 | }) 28 | await cache.put(request, resp.clone()) 29 | return resp 30 | } else if (fileSize < config.cache.chunkedCacheLimit) { 31 | console.info(`Chunk cache file ${request.url}`) 32 | const remoteResp = await fetch(downloadUrl) 33 | const { readable, writable } = new TransformStream() 34 | remoteResp.body.pipeTo(writable) 35 | const resp = new Response(readable, { 36 | headers: { 37 | 'Content-Type': remoteResp.headers.get('Content-Type'), 38 | ETag: remoteResp.headers.get('ETag') 39 | }, 40 | status: remoteResp.status, 41 | statusText: remoteResp.statusText 42 | }) 43 | await cache.put(request, resp.clone()) 44 | return resp 45 | } else { 46 | console.info(`No cache ${request.url} because file_size(${fileSize}) > limit(${config.cache.chunkedCacheLimit})`) 47 | return await fallback(downloadUrl) 48 | } 49 | } 50 | 51 | /** 52 | * Redirect to the download url. 53 | * @param {string} downloadUrl 54 | */ 55 | async function directDownload(downloadUrl) { 56 | console.info(`DirectDownload -> ${downloadUrl}`) 57 | return new Response(null, { 58 | status: 302, 59 | headers: { 60 | Location: downloadUrl.slice(6) 61 | } 62 | }) 63 | } 64 | 65 | /** 66 | * Download a file using Cloudflare as a relay. 67 | * @param {string} downloadUrl 68 | */ 69 | async function proxiedDownload(downloadUrl) { 70 | console.info(`ProxyDownload -> ${downloadUrl}`) 71 | const remoteResp = await fetch(downloadUrl) 72 | const { readable, writable } = new TransformStream() 73 | remoteResp.body.pipeTo(writable) 74 | return new Response(readable, remoteResp) 75 | } 76 | 77 | export async function handleFile(request, pathname, downloadUrl, { proxied = false, fileSize = 0 }) { 78 | if (config.cache && config.cache.enable && config.cache.paths.filter(p => pathname.startsWith(p)).length > 0) { 79 | return setCache(request, fileSize, downloadUrl, proxied ? proxiedDownload : directDownload) 80 | } 81 | return (proxied ? proxiedDownload : directDownload)(downloadUrl) 82 | } 83 | 84 | export async function handleUpload(request, pathname, filename) { 85 | const url = `https://graph.microsoft.com/v1.0/me/drive/root:${encodeURI(config.base) + 86 | (pathname.slice(-1) === '/' ? pathname : pathname + '/')}${filename}:/content` 87 | return await fetch(url, { 88 | method: 'PUT', 89 | headers: { 90 | Authorization: `bearer ${await getAccessToken()}`, 91 | ...request.headers 92 | }, 93 | body: request.body 94 | }) 95 | } 96 | -------------------------------------------------------------------------------- /src/folderView.js: -------------------------------------------------------------------------------- 1 | import emojiRegex from 'emoji-regex/RGI_Emoji' 2 | import { getClassNameForMimeType, getClassNameForFilename } from 'font-awesome-filetypes' 3 | 4 | import { renderHTML } from './render/htmlWrapper' 5 | import { renderPath } from './render/pathUtil' 6 | import { renderMarkdown } from './render/mdRenderer' 7 | 8 | /** 9 | * Convert bytes to human readable file size 10 | * 11 | * @param {Number} bytes File size in bytes 12 | * @param {Boolean} si 1000 - true; 1024 - false 13 | */ 14 | function readableFileSize(bytes, si) { 15 | bytes = parseInt(bytes, 10) 16 | var thresh = si ? 1000 : 1024 17 | if (Math.abs(bytes) < thresh) { 18 | return bytes + ' B' 19 | } 20 | var units = si 21 | ? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] 22 | : ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'] 23 | var u = -1 24 | do { 25 | bytes /= thresh 26 | ++u 27 | } while (Math.abs(bytes) >= thresh && u < units.length - 1) 28 | return bytes.toFixed(1) + ' ' + units[u] 29 | } 30 | 31 | /** 32 | * Render Folder Index 33 | * 34 | * @param {*} items 35 | * @param {*} isIndex don't show ".." on index page. 36 | */ 37 | export async function renderFolderView(items, path, request) { 38 | const isIndex = path === '/' 39 | //const str='null' 40 | const el = (tag, attrs, content) => `<${tag} ${attrs.join(' ')}>${content}` 41 | const div = (className, content) => el('div', [`class=${className}`], content) 42 | const item = (icon, fileName, fileAbsoluteUrl, size, emojiIcon) => 43 | el( 44 | 'a', 45 | [`href="${fileAbsoluteUrl}"`, 'class="item"', size ? `size="${size}"` : ''], 46 | (emojiIcon ? el('i', ['style="font-style: normal"'], emojiIcon) : el('i', [`class="${icon}"`], '')) + 47 | fileName + 48 | el('div', ['style="flex-grow: 1;"'], '') + 49 | (fileName === '..' ? '' : el('span', ['class="size"'], readableFileSize(size))) 50 | ) 51 | 52 | const intro = `
53 |

AnimeKuro

54 |

This is AnimeKuro Drive.... for more info visit our website

55 |

Download Anime's · Watch Anime Online · Watch Drama Online

56 |
` 57 | 58 | // Check if current directory contains README.md, if true, then render spinner 59 | let readmeExists = false 60 | let readmeFetchUrl = '' 61 | 62 | const body = div( 63 | 'container', 64 | div('path', renderPath(path)) + 65 | div( 66 | 'items', 67 | el( 68 | 'div', 69 | ['style="min-width: 600px"'], 70 | (!isIndex ? item('far fa-folder', '..', `${path}..`) : '') + 71 | items 72 | .map(i => { 73 | // Check if the current item is a folder or a file 74 | if ('folder' in i && !isIndex) { 75 | let emoji = emojiRegex().exec(i.name) 76 | if (emoji && !emoji.index) { 77 | return item('', i.name.replace(emoji, '').trim(), `${path}${i.name}/`, i.size, emoji[0]) 78 | } else { 79 | return item('far fa-folder', i.name, `${path}${i.name}/`, i.size) 80 | } 81 | } else if ('file' in i && !isIndex) { 82 | // Check if README.md exists 83 | if (!readmeExists) { 84 | readmeExists = i.name.toLowerCase() === 'readme.md' 85 | readmeFetchUrl = i['@microsoft.graph.downloadUrl'] 86 | } 87 | 88 | // Render file icons 89 | let fileIcon = getClassNameForMimeType(i.file.mimeType) 90 | if (fileIcon === 'fa-file') { 91 | // Check for files that haven't been rendered as expected 92 | const extension = i.name.split('.').pop() 93 | if (extension === 'md') { 94 | fileIcon = 'fab fa-markdown' 95 | } else if (['7z', 'rar', 'bz2', 'xz', 'tar', 'wim'].includes(extension)) { 96 | fileIcon = 'far fa-file-archive' 97 | } else if (['flac', 'oga', 'opus'].includes(extension)) { 98 | fileIcon = 'far fa-file-audio' 99 | } else { 100 | fileIcon = `far ${getClassNameForFilename(i.name)}` 101 | } 102 | } else { 103 | fileIcon = `far ${fileIcon}` 104 | } 105 | return item(fileIcon, i.name, `${path}${i.name}`, i.size) 106 | } else { 107 | console.log(`unknown item type ${i}`) 108 | } 109 | }) 110 | .join('') 111 | ) 112 | ) + 113 | (readmeExists && !isIndex ? await renderMarkdown(readmeFetchUrl, 'fade-in-fwd', '') : '') + 114 | (isIndex ? intro : '') 115 | ) 116 | return renderHTML(body, ...[request.pLink, request.pIdx]) 117 | } 118 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import config from './config/default' 2 | import { AUTH_ENABLED, NAME, PASS } from './auth/config' 3 | import { parseAuthHeader, unauthorizedResponse } from './auth/credentials' 4 | import { getAccessToken } from './auth/onedrive' 5 | import { handleFile, handleUpload } from './files/load' 6 | import { extensions } from './render/fileExtension' 7 | import { renderFolderView } from './folderView' 8 | import { renderFilePreview } from './fileView' 9 | 10 | addEventListener('fetch', event => { 11 | event.respondWith(handle(event.request)) 12 | }) 13 | 14 | async function handle(request) { 15 | if (AUTH_ENABLED === false) { 16 | return handleRequest(request) 17 | } else if (AUTH_ENABLED === true) { 18 | const credentials = parseAuthHeader(request.headers.get('Authorization')) 19 | if (!credentials || credentials.name !== NAME || credentials.pass !== PASS) { 20 | return unauthorizedResponse('Unauthorized') 21 | } else { 22 | return handleRequest(request) 23 | } 24 | } else { 25 | console.info('Auth error unexpected.') 26 | } 27 | } 28 | 29 | // Cloudflare cache instance 30 | const cache = caches.default 31 | const base = encodeURI(config.base).replace(/\/$/, '') 32 | 33 | /** 34 | * Format and regularize directory path for OneDrive API 35 | * 36 | * @param {string} pathname The absolute path to file 37 | * @param {boolean} isRequestFolder is indexing folder or not 38 | */ 39 | function wrapPathName(pathname, isRequestFolder) { 40 | pathname = base + pathname 41 | const isIndexingRoot = pathname === '/' 42 | // using different api to handle folder or file: children or driveItem 43 | if (isRequestFolder) { 44 | if (isIndexingRoot) return '/children' 45 | return `:${pathname.replace(/\/$/, '')}:/children` 46 | } 47 | return `:${pathname}` 48 | } 49 | 50 | async function handleRequest(request) { 51 | if (config.cache && config.cache.enable) { 52 | const maybeResponse = await cache.match(request) 53 | if (maybeResponse) return maybeResponse 54 | } 55 | 56 | const accessToken = await getAccessToken() 57 | 58 | const { pathname, searchParams } = new URL(request.url) 59 | const neoPathname = pathname.replace(/pagination$/, '') 60 | 61 | const rawImage = searchParams.get('raw') 62 | const thumbnail = config.thumbnail ? searchParams.get('thumbnail') : false 63 | const proxied = config.proxyDownload ? searchParams.get('proxied') !== null : false 64 | 65 | const oneDriveApiEndpoint = config.useOneDriveCN ? 'microsoftgraph.chinacloudapi.cn' : 'graph.microsoft.com' 66 | 67 | if (thumbnail) { 68 | const url = `https://${oneDriveApiEndpoint}/v1.0/me/drive/root:${ 69 | base ? base : '/' + (neoPathname === '/' ? '' : neoPathname) 70 | }:/thumbnails/0/${thumbnail}/content` 71 | const resp = await fetch(url, { 72 | headers: { 73 | Authorization: `bearer ${accessToken}` 74 | } 75 | }) 76 | 77 | return await handleFile(request, pathname, resp.url, { 78 | proxied 79 | }) 80 | } 81 | 82 | const isRequestFolder = pathname.endsWith('/') || searchParams.get('page') 83 | let url = 84 | `https://${oneDriveApiEndpoint}/v1.0/me/drive/root${wrapPathName(neoPathname, isRequestFolder)}` + 85 | (isRequestFolder && config.pagination.enable && config.pagination.top ? `?$top=${config.pagination.top}` : ``) 86 | 87 | // get & set {pLink ,pIdx} for fetching and paging 88 | const paginationLink = request.headers.get('pLink') 89 | const paginationIdx = request.headers.get('pIdx') - 0 90 | 91 | if (paginationLink && paginationLink !== 'undefined') url = `${childrenApi}&$skiptoken=${paginationLink}` 92 | 93 | const resp = await fetch(url, { 94 | headers: { 95 | Authorization: `bearer ${accessToken}` 96 | } 97 | }) 98 | 99 | let error = null 100 | if (resp.ok) { 101 | const data = await resp.json() 102 | if (data['@odata.nextLink']) { 103 | request.pIdx = paginationIdx ? paginationIdx : 1 104 | request.pLink = data['@odata.nextLink'].match(/&\$skiptoken=(.+)/)[1] 105 | } else if (paginationIdx) { 106 | request.pIdx = -paginationIdx 107 | } 108 | if ('file' in data) { 109 | // Render file preview view or download file directly 110 | const fileExt = data.name 111 | .split('.') 112 | .pop() 113 | .toLowerCase() 114 | 115 | // Render image directly if ?raw=true parameters are given 116 | if (rawImage || !(fileExt in extensions)) { 117 | return await handleFile(request, pathname, data['@microsoft.graph.downloadUrl'], { 118 | proxied, 119 | fileSize: data.size 120 | }) 121 | } 122 | 123 | return new Response(await renderFilePreview(data, pathname, fileExt), { 124 | headers: { 125 | 'Access-Control-Allow-Origin': '*', 126 | 'content-type': 'text/html' 127 | } 128 | }) 129 | } else { 130 | // Render folder view, list all children files 131 | if (config.upload && request.method === 'POST') { 132 | const filename = searchParams.get('upload') 133 | const key = searchParams.get('key') 134 | if (filename && key && config.upload.key === key) { 135 | return await handleUpload(request, neoPathname, filename) 136 | } else { 137 | return new Response('', { 138 | status: 400 139 | }) 140 | } 141 | } 142 | 143 | // 302 all folder requests that doesn't end with / 144 | if (!isRequestFolder) { 145 | return Response.redirect(request.url + '/', 302) 146 | } 147 | 148 | return new Response(await renderFolderView(data.value, neoPathname, request), { 149 | headers: { 150 | 'Access-Control-Allow-Origin': '*', 151 | 'content-type': 'text/html' 152 | } 153 | }) 154 | } 155 | } else { 156 | error = (await resp.json()).error 157 | } 158 | 159 | if (error) { 160 | const body = JSON.stringify(error) 161 | switch (error.code) { 162 | case 'ItemNotFound': 163 | return new Response(body, { 164 | status: 404, 165 | headers: { 166 | 'content-type': 'application/json' 167 | } 168 | }) 169 | default: 170 | return new Response(body, { 171 | status: 500, 172 | headers: { 173 | 'content-type': 'application/json' 174 | } 175 | }) 176 | } 177 | } 178 | } 179 | -------------------------------------------------------------------------------- /src/render/fileExtension.js: -------------------------------------------------------------------------------- 1 | const preview = { 2 | markdown: 'markdown', 3 | image: 'image', 4 | text: 'text', 5 | pdf: 'pdf', 6 | code: 'code', 7 | video: 'video', 8 | audio: 'audio', 9 | mkv: 'mkv' 10 | } 11 | 12 | const extensions = { 13 | gif: preview.image, 14 | jpeg: preview.image, 15 | jpg: preview.image, 16 | png: preview.image, 17 | 18 | md: preview.markdown, 19 | markdown: preview.markdown, 20 | mdown: preview.markdown, 21 | 22 | pdf: preview.pdf, 23 | 24 | c: preview.code, 25 | cpp: preview.code, 26 | js: preview.code, 27 | java: preview.code, 28 | sh: preview.code, 29 | cs: preview.code, 30 | py: preview.code, 31 | css: preview.code, 32 | html: preview.code, 33 | ts: preview.code, 34 | vue: preview.code, 35 | json: preview.code, 36 | yaml: preview.code, 37 | toml: preview.code, 38 | 39 | txt: preview.text, 40 | 41 | mp4: preview.video, 42 | flv: preview.video, 43 | webm: preview.video, 44 | m3u8: preview.video, 45 | 46 | mkv: preview.mkv, 47 | 48 | mp3: preview.audio, 49 | m4a: preview.audio, 50 | aac: preview.audio, 51 | wav: preview.audio, 52 | ogg: preview.audio, 53 | oga: preview.audio, 54 | opus: preview.audio, 55 | flac: preview.audio 56 | } 57 | 58 | export { extensions, preview } 59 | -------------------------------------------------------------------------------- /src/render/htmlWrapper.js: -------------------------------------------------------------------------------- 1 | import { favicon } from './favicon' 2 | 3 | const COMMIT_HASH = '5d7579fcfb4729fcb855110c5f0ed5488d1d0d44' 4 | 5 | const pagination = (pIdx, attrs) => { 6 | const getAttrs = (c, h, isNext) => 7 | `class="${c}" ${h ? `href="pagination?page=${h}"` : ''} ${ 8 | isNext === undefined ? '' : `onclick="handlePagination(${isNext})"` 9 | }` 10 | if (pIdx) { 11 | switch (pIdx) { 12 | case pIdx < 0 ? pIdx : null: 13 | attrs = [getAttrs('pre', -pIdx - 1, 0), getAttrs('next off', null)] 14 | break 15 | case 1: 16 | attrs = [getAttrs('pre off', null), getAttrs('next', pIdx + 1, 1)] 17 | break 18 | default: 19 | attrs = [getAttrs('pre', pIdx - 1, 0), getAttrs('next', pIdx + 1, 1)] 20 | } 21 | return `${` PREV`}Page ${pIdx} ${`NEXT `}` 22 | } 23 | return '' 24 | } 25 | 26 | export function renderHTML(body, pLink, pIdx) { 27 | pLink = pLink || '' 28 | const p = 'window[pLinkId]' 29 | 30 | return ` 31 | 32 | 33 | 34 | 35 | 36 | AnimeSub's Server 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | ${body} 56 |
${pagination(pIdx)}
57 |
58 | 59 | 60 | 89 | 90 | ` 91 | } 92 | -------------------------------------------------------------------------------- /src/render/mdRenderer.js: -------------------------------------------------------------------------------- 1 | import marked from 'marked' 2 | import { cleanUrl } from 'marked/src/helpers' 3 | 4 | // Rewrite renderer, see original at: https://github.com/markedjs/marked/blob/master/src/Renderer.js 5 | const renderer = new marked.Renderer() 6 | renderer.image = (href, title, text) => { 7 | href = cleanUrl(false, null, href) 8 | if (href === null) { 9 | return text 10 | } 11 | let url 12 | try { 13 | // Check if href is relative 14 | url = new URL(href).href 15 | } catch (TypeError) { 16 | // Add param raw=true 17 | if (href.includes('?')) { 18 | const urlSplitParams = href.split('?') 19 | const param = new URLSearchParams(urlSplitParams[1]) 20 | param.append('raw', true) 21 | url = urlSplitParams[0] + '?' + param.toString() 22 | } else { 23 | url = href + '?raw=true' 24 | } 25 | } 26 | let out = '' + text + ' 47 | ${renderedMd} 48 | ` 49 | } 50 | -------------------------------------------------------------------------------- /src/render/pathUtil.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Return absolute path of current working directory 3 | * 4 | * @param {array} pathItems List of current directory items 5 | * @param {number} idx Current depth inside home 6 | */ 7 | function getPathLink(pathItems, idx) { 8 | const pathList = pathItems.slice(0, idx + 1) 9 | 10 | if (pathList.length === 1) { 11 | return '/' 12 | } 13 | 14 | pathList[0] = '' 15 | return pathList.join('/') + '/' 16 | } 17 | 18 | /** 19 | * Render directory breadcrumb 20 | * 21 | * @param {string} path current working directory, for instance: /🥑 Course PPT for CS (BIT)/2018 - 大三上 - 操作系统/ 22 | */ 23 | export function renderPath(path) { 24 | const pathItems = path.split('/') 25 | pathItems[0] = '/' 26 | pathItems.pop() 27 | 28 | const link = (href, content) => `${content}` 29 | const breadcrumb = [] 30 | pathItems.forEach((item, idx) => { 31 | breadcrumb.push(link(getPathLink(pathItems, idx), idx === 0 ? '🚩 Home' : decodeURIComponent(item))) 32 | }) 33 | 34 | return breadcrumb.join(' / ') 35 | } 36 | -------------------------------------------------------------------------------- /themes/batch-button.css: -------------------------------------------------------------------------------- 1 | .senpai_button { 2 | width: 220px; 3 | height: 50px; 4 | border: none; 5 | outline: none; 6 | color: #fff; 7 | background: #111; 8 | cursor: pointer; 9 | position: relative; 10 | z-index: 0; 11 | border-radius: 10px; 12 | } 13 | 14 | .senpai_button:before { 15 | content: ''; 16 | background: linear-gradient(45deg, #ff0000, #ff7300, #fffb00, #48ff00, #00ffd5, #002bff, #7a00ff, #ff00c8, #ff0000); 17 | position: absolute; 18 | top: -2px; 19 | left:-2px; 20 | background-size: 400%; 21 | z-index: -1; 22 | filter: blur(5px); 23 | width: calc(100% + 4px); 24 | height: calc(100% + 4px); 25 | animation: glowing 20s linear infinite; 26 | opacity: 0; 27 | transition: opacity .3s ease-in-out; 28 | border-radius: 10px; 29 | } 30 | 31 | .senpai_button:active { 32 | color: #000 33 | } 34 | 35 | .senpai_button:active:after { 36 | background: transparent; 37 | } 38 | 39 | .senpai_button:hover:before { 40 | opacity: 1; 41 | } 42 | 43 | .senpai_button:after { 44 | z-index: -1; 45 | content: ''; 46 | position: absolute; 47 | width: 100%; 48 | height: 100%; 49 | background: #111; 50 | left: 0; 51 | top: 0; 52 | border-radius: 10px; 53 | } 54 | 55 | @keyframes glowing { 56 | 0% { background-position: 0 0; } 57 | 50% { background-position: 400% 0; } 58 | 100% { background-position: 0 0; } 59 | } -------------------------------------------------------------------------------- /themes/prism-github.css: -------------------------------------------------------------------------------- 1 | code, 2 | code[class*='language-'], 3 | pre[class*='language-'] { 4 | color: #24292e; 5 | text-align: left; 6 | white-space: pre; 7 | word-spacing: normal; 8 | tab-size: 4; 9 | hyphens: none; 10 | font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; 11 | line-height: 1.4; 12 | direction: ltr; 13 | cursor: text; 14 | } 15 | 16 | pre[class*='language-'] { 17 | overflow: auto; 18 | margin: 1em 0; 19 | padding: 1.2em; 20 | border-radius: 3px; 21 | font-size: 85%; 22 | } 23 | 24 | p code, 25 | li code, 26 | table code { 27 | margin: 0; 28 | border-radius: 3px; 29 | padding: 0.2em 0; 30 | font-size: 85%; 31 | } 32 | p code:before, 33 | p code:after, 34 | li code:before, 35 | li code:after, 36 | table code:before, 37 | table code:after { 38 | letter-spacing: -0.2em; 39 | content: '\00a0'; 40 | } 41 | 42 | :not(pre) > code[class*='language-'] { 43 | padding: 0.1em; 44 | border-radius: 0.3em; 45 | } 46 | 47 | .token.comment, 48 | .token.prolog, 49 | .token.doctype, 50 | .token.cdata { 51 | color: #6a737d; 52 | } 53 | .token.punctuation, 54 | .token.string, 55 | .token.atrule, 56 | .token.attr-value { 57 | color: #032f62; 58 | } 59 | .token.property, 60 | .token.tag { 61 | color: #22863a; 62 | } 63 | .token.boolean, 64 | .token.number { 65 | color: #005cc5; 66 | } 67 | .token.selector, 68 | .token.attr-name, 69 | .token.attr-value .punctuation:first-child, 70 | .token.keyword, 71 | .token.regex, 72 | .token.important { 73 | color: #d73a49; 74 | } 75 | .token.operator, 76 | .token.entity, 77 | .token.url, 78 | .language-css .token.string { 79 | color: #005cc5; 80 | } 81 | .token.entity { 82 | cursor: help; 83 | } 84 | 85 | .namespace { 86 | opacity: 0.7; 87 | } 88 | -------------------------------------------------------------------------------- /themes/spencer.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Lato:wght@400;700&display=swap'); 2 | 3 | :root { 4 | --base-font-family: Lato, -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, pingfang sc, 5 | source han sans sc, noto sans cjk sc, sarasa gothic sc, microsoft yahei, sans-serif, Apple Color Emoji, 6 | Segoe UI Emoji; 7 | } 8 | 9 | html, 10 | body { 11 | margin: 0; 12 | padding: 0; 13 | } 14 | 15 | body { 16 | font-family: var(--base-font-family); 17 | -webkit-font-smoothing: antialiased; 18 | background: #fafafa; 19 | display: flex; 20 | align-items: center; 21 | justify-content: space-between; 22 | flex-flow: column nowrap; 23 | height: 100vh; 24 | } 25 | 26 | nav { 27 | display: flex; 28 | justify-content: center; 29 | align-items: center; 30 | width: 100%; 31 | min-height: 2rem; 32 | padding: 0.8rem 0rem; 33 | background: #ffffff; 34 | color: #000000; 35 | font-size: 1.4rem; 36 | box-shadow: inset 0 -1px #eaeaea; 37 | margin-bottom: 1.5rem; 38 | } 39 | 40 | a { 41 | transition: 0.2s all ease-in-out; 42 | color: #0070f3; 43 | } 44 | 45 | .brand { 46 | font-weight: bold; 47 | } 48 | 49 | .container, 50 | .paginate-container { 51 | width: calc(100% - 40px); 52 | max-width: 800px; 53 | margin: 0 auto; 54 | } 55 | 56 | .path { 57 | margin-bottom: 1.5rem; 58 | font-size: 0.88rem; 59 | color: #999; 60 | } 61 | 62 | .path a { 63 | text-decoration: none; 64 | color: #333; 65 | } 66 | 67 | .items { 68 | overflow-x: auto; 69 | display: flex; 70 | flex-flow: column nowrap; 71 | background: white; 72 | box-shadow: 0 5px 10px rgba(0, 0, 0, 0.12); 73 | border-radius: 8px; 74 | } 75 | 76 | a.item { 77 | display: flex; 78 | align-items: center; 79 | text-decoration: none; 80 | color: #000000; 81 | padding: 0.8rem 1rem; 82 | transition: 0.2s all ease-in-out; 83 | } 84 | 85 | a.item i { 86 | margin-right: 0.5rem; 87 | } 88 | 89 | a.item .size { 90 | opacity: 0.6; 91 | } 92 | 93 | footer { 94 | font-size: 0.8rem; 95 | color: #666; 96 | width: calc(100% - 40px); 97 | padding: 1.6rem 0rem; 98 | text-align: center; 99 | } 100 | 101 | footer a { 102 | text-decoration: none; 103 | } 104 | 105 | a:hover, 106 | a.item:hover { 107 | opacity: 0.6; 108 | } 109 | 110 | .download-button-container { 111 | width: 100%; 112 | text-align: center; 113 | box-sizing: border-box; 114 | } 115 | 116 | .download-button { 117 | display: block; 118 | background-color: #000; 119 | color: #ffffff; 120 | cursor: pointer; 121 | font-weight: bold; 122 | text-decoration: none; 123 | padding: 0.5rem 1rem; 124 | margin: 1.5rem auto; 125 | max-width: 180px; 126 | user-select: none; 127 | border-radius: 2px; 128 | box-shadow: 0 5px 10px rgba(0, 0, 0, 0.12); 129 | } 130 | 131 | .markdown-body { 132 | font-family: var(--base-font-family) !important; 133 | margin-top: 1.5rem; 134 | } 135 | 136 | .loading-label { 137 | font-family: var(--base-font-family) !important; 138 | text-align: center; 139 | margin: 3rem 0rem; 140 | opacity: 0.6; 141 | } 142 | 143 | .paginate-container { 144 | margin-top: 1.5rem; 145 | display: flex; 146 | justify-content: space-between; 147 | } 148 | 149 | .paginate-container a { 150 | text-decoration: none; 151 | } 152 | 153 | .paginate-container a.off { 154 | pointer-events: none; 155 | opacity: 0.5; 156 | } 157 | 158 | .fade-in-bottom { 159 | -webkit-animation: fade-in-bottom 0.3s cubic-bezier(0.39, 0.575, 0.565, 1) both; 160 | animation: fade-in-bottom 0.3s cubic-bezier(0.39, 0.575, 0.565, 1) both; 161 | } 162 | 163 | .fade-in-fwd { 164 | -webkit-animation: fade-in-fwd 0.6s cubic-bezier(0.39, 0.575, 0.565, 1) both; 165 | animation: fade-in-fwd 0.6s cubic-bezier(0.39, 0.575, 0.565, 1) both; 166 | } 167 | 168 | .fade-out-bck { 169 | -webkit-animation: fade-out-bck 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94) both; 170 | animation: fade-out-bck 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94) both; 171 | } 172 | 173 | @-webkit-keyframes fade-in-bottom { 174 | 0% { 175 | -webkit-transform: translateY(50px); 176 | transform: translateY(50px); 177 | opacity: 0; 178 | } 179 | 100% { 180 | -webkit-transform: translateY(0); 181 | transform: translateY(0); 182 | opacity: 1; 183 | } 184 | } 185 | 186 | @keyframes fade-in-bottom { 187 | 0% { 188 | -webkit-transform: translateY(50px); 189 | transform: translateY(50px); 190 | opacity: 0; 191 | } 192 | 100% { 193 | -webkit-transform: translateY(0); 194 | transform: translateY(0); 195 | opacity: 1; 196 | } 197 | } 198 | 199 | @-webkit-keyframes fade-in-fwd { 200 | 0% { 201 | -webkit-transform: translateZ(-80px); 202 | transform: translateZ(-80px); 203 | opacity: 0; 204 | } 205 | 100% { 206 | -webkit-transform: translateZ(0); 207 | transform: translateZ(0); 208 | opacity: 1; 209 | } 210 | } 211 | 212 | @keyframes fade-in-fwd { 213 | 0% { 214 | -webkit-transform: translateZ(-80px); 215 | transform: translateZ(-80px); 216 | opacity: 0; 217 | } 218 | 100% { 219 | -webkit-transform: translateZ(0); 220 | transform: translateZ(0); 221 | opacity: 1; 222 | } 223 | } 224 | 225 | @-webkit-keyframes fade-out-bck { 226 | 0% { 227 | -webkit-transform: translateZ(0); 228 | transform: translateZ(0); 229 | opacity: 1; 230 | } 231 | 100% { 232 | -webkit-transform: translateZ(-80px); 233 | transform: translateZ(-80px); 234 | opacity: 0; 235 | } 236 | } 237 | 238 | @keyframes fade-out-bck { 239 | 0% { 240 | -webkit-transform: translateZ(0); 241 | transform: translateZ(0); 242 | opacity: 1; 243 | } 244 | 100% { 245 | -webkit-transform: translateZ(-80px); 246 | transform: translateZ(-80px); 247 | opacity: 0; 248 | } 249 | } 250 | -------------------------------------------------------------------------------- /wrangler.toml: -------------------------------------------------------------------------------- 1 | name = "drive" 2 | type = "webpack" 3 | workers_dev = "true" 4 | account_id = "" 5 | zone_id = "" 6 | kv_namespaces = [ 7 | { binding = "BUCKET", preview_id = "", id = "" } 8 | ] 9 | 10 | [env.staging] 11 | name = "drive-staging" 12 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | "integrity" "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==" 7 | "resolved" "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz" 8 | "version" "7.10.4" 9 | dependencies: 10 | "@babel/highlight" "^7.10.4" 11 | 12 | "@babel/helper-validator-identifier@^7.10.4": 13 | "integrity" "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" 14 | "resolved" "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz" 15 | "version" "7.10.4" 16 | 17 | "@babel/highlight@^7.10.4": 18 | "integrity" "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==" 19 | "resolved" "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz" 20 | "version" "7.10.4" 21 | dependencies: 22 | "@babel/helper-validator-identifier" "^7.10.4" 23 | "chalk" "^2.0.0" 24 | "js-tokens" "^4.0.0" 25 | 26 | "@types/color-name@^1.1.1": 27 | "integrity" "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" 28 | "resolved" "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz" 29 | "version" "1.1.1" 30 | 31 | "@types/json5@^0.0.29": 32 | "integrity" "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" 33 | "resolved" "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" 34 | "version" "0.0.29" 35 | 36 | "acorn-jsx@^5.2.0": 37 | "integrity" "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==" 38 | "resolved" "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz" 39 | "version" "5.2.0" 40 | 41 | "acorn@^6.0.0 || ^7.0.0", "acorn@^7.3.1": 42 | "integrity" "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==" 43 | "resolved" "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz" 44 | "version" "7.4.0" 45 | 46 | "ajv@^6.10.0", "ajv@^6.10.2": 47 | "integrity" "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==" 48 | "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz" 49 | "version" "6.12.3" 50 | dependencies: 51 | "fast-deep-equal" "^3.1.1" 52 | "fast-json-stable-stringify" "^2.0.0" 53 | "json-schema-traverse" "^0.4.1" 54 | "uri-js" "^4.2.2" 55 | 56 | "ansi-colors@^4.1.1": 57 | "integrity" "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" 58 | "resolved" "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" 59 | "version" "4.1.1" 60 | 61 | "ansi-regex@^4.1.0": 62 | "integrity" "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" 63 | "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz" 64 | "version" "4.1.0" 65 | 66 | "ansi-regex@^5.0.0": 67 | "integrity" "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" 68 | "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz" 69 | "version" "5.0.0" 70 | 71 | "ansi-styles@^3.2.0": 72 | "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" 73 | "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" 74 | "version" "3.2.1" 75 | dependencies: 76 | "color-convert" "^1.9.0" 77 | 78 | "ansi-styles@^3.2.1": 79 | "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" 80 | "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" 81 | "version" "3.2.1" 82 | dependencies: 83 | "color-convert" "^1.9.0" 84 | 85 | "ansi-styles@^4.1.0": 86 | "integrity" "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==" 87 | "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz" 88 | "version" "4.2.1" 89 | dependencies: 90 | "@types/color-name" "^1.1.1" 91 | "color-convert" "^2.0.1" 92 | 93 | "argparse@^1.0.7": 94 | "integrity" "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==" 95 | "resolved" "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" 96 | "version" "1.0.10" 97 | dependencies: 98 | "sprintf-js" "~1.0.2" 99 | 100 | "array-includes@^3.1.1": 101 | "integrity" "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==" 102 | "resolved" "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz" 103 | "version" "3.1.1" 104 | dependencies: 105 | "define-properties" "^1.1.3" 106 | "es-abstract" "^1.17.0" 107 | "is-string" "^1.0.5" 108 | 109 | "array.prototype.flat@^1.2.3": 110 | "integrity" "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==" 111 | "resolved" "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz" 112 | "version" "1.2.3" 113 | dependencies: 114 | "define-properties" "^1.1.3" 115 | "es-abstract" "^1.17.0-next.1" 116 | 117 | "astral-regex@^1.0.0": 118 | "integrity" "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" 119 | "resolved" "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz" 120 | "version" "1.0.0" 121 | 122 | "balanced-match@^1.0.0": 123 | "integrity" "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 124 | "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" 125 | "version" "1.0.0" 126 | 127 | "brace-expansion@^1.1.7": 128 | "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" 129 | "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" 130 | "version" "1.1.11" 131 | dependencies: 132 | "balanced-match" "^1.0.0" 133 | "concat-map" "0.0.1" 134 | 135 | "callsites@^3.0.0": 136 | "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" 137 | "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" 138 | "version" "3.1.0" 139 | 140 | "chalk@^2.0.0": 141 | "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" 142 | "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" 143 | "version" "2.4.2" 144 | dependencies: 145 | "ansi-styles" "^3.2.1" 146 | "escape-string-regexp" "^1.0.5" 147 | "supports-color" "^5.3.0" 148 | 149 | "chalk@^4.0.0": 150 | "integrity" "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==" 151 | "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz" 152 | "version" "4.1.0" 153 | dependencies: 154 | "ansi-styles" "^4.1.0" 155 | "supports-color" "^7.1.0" 156 | 157 | "color-convert@^1.9.0": 158 | "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" 159 | "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" 160 | "version" "1.9.3" 161 | dependencies: 162 | "color-name" "1.1.3" 163 | 164 | "color-convert@^2.0.1": 165 | "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" 166 | "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" 167 | "version" "2.0.1" 168 | dependencies: 169 | "color-name" "~1.1.4" 170 | 171 | "color-name@~1.1.4": 172 | "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 173 | "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" 174 | "version" "1.1.4" 175 | 176 | "color-name@1.1.3": 177 | "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 178 | "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" 179 | "version" "1.1.3" 180 | 181 | "concat-map@0.0.1": 182 | "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 183 | "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" 184 | "version" "0.0.1" 185 | 186 | "contains-path@^0.1.0": 187 | "integrity" "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" 188 | "resolved" "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz" 189 | "version" "0.1.0" 190 | 191 | "cross-spawn@^7.0.2": 192 | "integrity" "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==" 193 | "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" 194 | "version" "7.0.3" 195 | dependencies: 196 | "path-key" "^3.1.0" 197 | "shebang-command" "^2.0.0" 198 | "which" "^2.0.1" 199 | 200 | "debug@^2.6.9": 201 | "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" 202 | "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" 203 | "version" "2.6.9" 204 | dependencies: 205 | "ms" "2.0.0" 206 | 207 | "debug@^4.0.1": 208 | "integrity" "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==" 209 | "resolved" "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz" 210 | "version" "4.1.1" 211 | dependencies: 212 | "ms" "^2.1.1" 213 | 214 | "deep-is@^0.1.3": 215 | "integrity" "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" 216 | "resolved" "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz" 217 | "version" "0.1.3" 218 | 219 | "define-properties@^1.1.2", "define-properties@^1.1.3": 220 | "integrity" "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==" 221 | "resolved" "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz" 222 | "version" "1.1.3" 223 | dependencies: 224 | "object-keys" "^1.0.12" 225 | 226 | "doctrine@^3.0.0": 227 | "integrity" "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==" 228 | "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" 229 | "version" "3.0.0" 230 | dependencies: 231 | "esutils" "^2.0.2" 232 | 233 | "doctrine@1.5.0": 234 | "integrity" "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=" 235 | "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz" 236 | "version" "1.5.0" 237 | dependencies: 238 | "esutils" "^2.0.2" 239 | "isarray" "^1.0.0" 240 | 241 | "emoji-regex@^7.0.1": 242 | "integrity" "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" 243 | "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz" 244 | "version" "7.0.3" 245 | 246 | "emoji-regex@^9.2.0": 247 | "integrity" "sha512-DNc3KFPK18bPdElMJnf/Pkv5TXhxFU3YFDEuGLDRtPmV4rkmCjBkCSEp22u6rBHdSN9Vlp/GK7k98prmE1Jgug==" 248 | "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.0.tgz" 249 | "version" "9.2.0" 250 | 251 | "enquirer@^2.3.5": 252 | "integrity" "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==" 253 | "resolved" "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" 254 | "version" "2.3.6" 255 | dependencies: 256 | "ansi-colors" "^4.1.1" 257 | 258 | "error-ex@^1.2.0": 259 | "integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==" 260 | "resolved" "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" 261 | "version" "1.3.2" 262 | dependencies: 263 | "is-arrayish" "^0.2.1" 264 | 265 | "es-abstract@^1.17.0", "es-abstract@^1.17.0-next.1", "es-abstract@^1.17.5": 266 | "integrity" "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==" 267 | "resolved" "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz" 268 | "version" "1.17.6" 269 | dependencies: 270 | "es-to-primitive" "^1.2.1" 271 | "function-bind" "^1.1.1" 272 | "has" "^1.0.3" 273 | "has-symbols" "^1.0.1" 274 | "is-callable" "^1.2.0" 275 | "is-regex" "^1.1.0" 276 | "object-inspect" "^1.7.0" 277 | "object-keys" "^1.1.1" 278 | "object.assign" "^4.1.0" 279 | "string.prototype.trimend" "^1.0.1" 280 | "string.prototype.trimstart" "^1.0.1" 281 | 282 | "es-to-primitive@^1.2.1": 283 | "integrity" "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==" 284 | "resolved" "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" 285 | "version" "1.2.1" 286 | dependencies: 287 | "is-callable" "^1.1.4" 288 | "is-date-object" "^1.0.1" 289 | "is-symbol" "^1.0.2" 290 | 291 | "escape-string-regexp@^1.0.5": 292 | "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 293 | "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" 294 | "version" "1.0.5" 295 | 296 | "eslint-config-prettier@^6.11.0": 297 | "integrity" "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==" 298 | "resolved" "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz" 299 | "version" "6.11.0" 300 | dependencies: 301 | "get-stdin" "^6.0.0" 302 | 303 | "eslint-config-standard@^14.1.1": 304 | "integrity" "sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg==" 305 | "resolved" "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz" 306 | "version" "14.1.1" 307 | 308 | "eslint-import-resolver-node@^0.3.3": 309 | "integrity" "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==" 310 | "resolved" "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz" 311 | "version" "0.3.4" 312 | dependencies: 313 | "debug" "^2.6.9" 314 | "resolve" "^1.13.1" 315 | 316 | "eslint-module-utils@^2.6.0": 317 | "integrity" "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==" 318 | "resolved" "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz" 319 | "version" "2.6.0" 320 | dependencies: 321 | "debug" "^2.6.9" 322 | "pkg-dir" "^2.0.0" 323 | 324 | "eslint-plugin-es@^3.0.0": 325 | "integrity" "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==" 326 | "resolved" "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz" 327 | "version" "3.0.1" 328 | dependencies: 329 | "eslint-utils" "^2.0.0" 330 | "regexpp" "^3.0.0" 331 | 332 | "eslint-plugin-import@^2.22.0", "eslint-plugin-import@>=2.18.0": 333 | "integrity" "sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==" 334 | "resolved" "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz" 335 | "version" "2.22.0" 336 | dependencies: 337 | "array-includes" "^3.1.1" 338 | "array.prototype.flat" "^1.2.3" 339 | "contains-path" "^0.1.0" 340 | "debug" "^2.6.9" 341 | "doctrine" "1.5.0" 342 | "eslint-import-resolver-node" "^0.3.3" 343 | "eslint-module-utils" "^2.6.0" 344 | "has" "^1.0.3" 345 | "minimatch" "^3.0.4" 346 | "object.values" "^1.1.1" 347 | "read-pkg-up" "^2.0.0" 348 | "resolve" "^1.17.0" 349 | "tsconfig-paths" "^3.9.0" 350 | 351 | "eslint-plugin-node@^11.1.0", "eslint-plugin-node@>=9.1.0": 352 | "integrity" "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==" 353 | "resolved" "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz" 354 | "version" "11.1.0" 355 | dependencies: 356 | "eslint-plugin-es" "^3.0.0" 357 | "eslint-utils" "^2.0.0" 358 | "ignore" "^5.1.1" 359 | "minimatch" "^3.0.4" 360 | "resolve" "^1.10.1" 361 | "semver" "^6.1.0" 362 | 363 | "eslint-plugin-prettier@^3.1.4": 364 | "integrity" "sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==" 365 | "resolved" "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz" 366 | "version" "3.1.4" 367 | dependencies: 368 | "prettier-linter-helpers" "^1.0.0" 369 | 370 | "eslint-plugin-promise@^4.2.1", "eslint-plugin-promise@>=4.2.1": 371 | "integrity" "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==" 372 | "resolved" "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz" 373 | "version" "4.2.1" 374 | 375 | "eslint-plugin-standard@^4.0.1", "eslint-plugin-standard@>=4.0.0": 376 | "integrity" "sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==" 377 | "resolved" "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz" 378 | "version" "4.0.1" 379 | 380 | "eslint-scope@^5.1.0": 381 | "integrity" "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==" 382 | "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz" 383 | "version" "5.1.0" 384 | dependencies: 385 | "esrecurse" "^4.1.0" 386 | "estraverse" "^4.1.1" 387 | 388 | "eslint-utils@^2.0.0", "eslint-utils@^2.1.0": 389 | "integrity" "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==" 390 | "resolved" "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" 391 | "version" "2.1.0" 392 | dependencies: 393 | "eslint-visitor-keys" "^1.1.0" 394 | 395 | "eslint-visitor-keys@^1.1.0", "eslint-visitor-keys@^1.3.0": 396 | "integrity" "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" 397 | "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" 398 | "version" "1.3.0" 399 | 400 | "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0", "eslint@^7.6.0", "eslint@>=3.14.1", "eslint@>=4.19.1", "eslint@>=5.0.0", "eslint@>=5.16.0", "eslint@>=6.2.2": 401 | "integrity" "sha512-QlAManNtqr7sozWm5TF4wIH9gmUm2hE3vNRUvyoYAa4y1l5/jxD/PQStEjBMQtCqZmSep8UxrcecI60hOpe61w==" 402 | "resolved" "https://registry.npmjs.org/eslint/-/eslint-7.6.0.tgz" 403 | "version" "7.6.0" 404 | dependencies: 405 | "@babel/code-frame" "^7.0.0" 406 | "ajv" "^6.10.0" 407 | "chalk" "^4.0.0" 408 | "cross-spawn" "^7.0.2" 409 | "debug" "^4.0.1" 410 | "doctrine" "^3.0.0" 411 | "enquirer" "^2.3.5" 412 | "eslint-scope" "^5.1.0" 413 | "eslint-utils" "^2.1.0" 414 | "eslint-visitor-keys" "^1.3.0" 415 | "espree" "^7.2.0" 416 | "esquery" "^1.2.0" 417 | "esutils" "^2.0.2" 418 | "file-entry-cache" "^5.0.1" 419 | "functional-red-black-tree" "^1.0.1" 420 | "glob-parent" "^5.0.0" 421 | "globals" "^12.1.0" 422 | "ignore" "^4.0.6" 423 | "import-fresh" "^3.0.0" 424 | "imurmurhash" "^0.1.4" 425 | "is-glob" "^4.0.0" 426 | "js-yaml" "^3.13.1" 427 | "json-stable-stringify-without-jsonify" "^1.0.1" 428 | "levn" "^0.4.1" 429 | "lodash" "^4.17.19" 430 | "minimatch" "^3.0.4" 431 | "natural-compare" "^1.4.0" 432 | "optionator" "^0.9.1" 433 | "progress" "^2.0.0" 434 | "regexpp" "^3.1.0" 435 | "semver" "^7.2.1" 436 | "strip-ansi" "^6.0.0" 437 | "strip-json-comments" "^3.1.0" 438 | "table" "^5.2.3" 439 | "text-table" "^0.2.0" 440 | "v8-compile-cache" "^2.0.3" 441 | 442 | "espree@^7.2.0": 443 | "integrity" "sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g==" 444 | "resolved" "https://registry.npmjs.org/espree/-/espree-7.2.0.tgz" 445 | "version" "7.2.0" 446 | dependencies: 447 | "acorn" "^7.3.1" 448 | "acorn-jsx" "^5.2.0" 449 | "eslint-visitor-keys" "^1.3.0" 450 | 451 | "esprima@^4.0.0": 452 | "integrity" "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" 453 | "resolved" "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" 454 | "version" "4.0.1" 455 | 456 | "esquery@^1.2.0": 457 | "integrity" "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==" 458 | "resolved" "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz" 459 | "version" "1.3.1" 460 | dependencies: 461 | "estraverse" "^5.1.0" 462 | 463 | "esrecurse@^4.1.0": 464 | "integrity" "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==" 465 | "resolved" "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz" 466 | "version" "4.2.1" 467 | dependencies: 468 | "estraverse" "^4.1.0" 469 | 470 | "estraverse@^4.1.0", "estraverse@^4.1.1": 471 | "integrity" "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" 472 | "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" 473 | "version" "4.3.0" 474 | 475 | "estraverse@^5.1.0": 476 | "integrity" "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" 477 | "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz" 478 | "version" "5.2.0" 479 | 480 | "esutils@^2.0.2": 481 | "integrity" "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" 482 | "resolved" "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" 483 | "version" "2.0.3" 484 | 485 | "fast-deep-equal@^3.1.1": 486 | "integrity" "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 487 | "resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" 488 | "version" "3.1.3" 489 | 490 | "fast-diff@^1.1.2": 491 | "integrity" "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" 492 | "resolved" "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" 493 | "version" "1.2.0" 494 | 495 | "fast-json-stable-stringify@^2.0.0": 496 | "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 497 | "resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" 498 | "version" "2.1.0" 499 | 500 | "fast-levenshtein@^2.0.6": 501 | "integrity" "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" 502 | "resolved" "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" 503 | "version" "2.0.6" 504 | 505 | "file-entry-cache@^5.0.1": 506 | "integrity" "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==" 507 | "resolved" "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz" 508 | "version" "5.0.1" 509 | dependencies: 510 | "flat-cache" "^2.0.1" 511 | 512 | "find-up@^2.0.0", "find-up@^2.1.0": 513 | "integrity" "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=" 514 | "resolved" "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz" 515 | "version" "2.1.0" 516 | dependencies: 517 | "locate-path" "^2.0.0" 518 | 519 | "flat-cache@^2.0.1": 520 | "integrity" "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==" 521 | "resolved" "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz" 522 | "version" "2.0.1" 523 | dependencies: 524 | "flatted" "^2.0.0" 525 | "rimraf" "2.6.3" 526 | "write" "1.0.3" 527 | 528 | "flatted@^2.0.0": 529 | "integrity" "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==" 530 | "resolved" "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz" 531 | "version" "2.0.2" 532 | 533 | "font-awesome-filetypes@^2.1.0": 534 | "integrity" "sha512-U6hi14GRjfZFIWsTNyVmCBuHyPhiizWEKVbaQqHipKQv3rA1l1PNvmKulzpqxonFnQMToty5ZhfWbc/0IjLDGA==" 535 | "resolved" "https://registry.npmjs.org/font-awesome-filetypes/-/font-awesome-filetypes-2.1.0.tgz" 536 | "version" "2.1.0" 537 | 538 | "fs.realpath@^1.0.0": 539 | "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 540 | "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" 541 | "version" "1.0.0" 542 | 543 | "function-bind@^1.1.1": 544 | "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 545 | "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" 546 | "version" "1.1.1" 547 | 548 | "functional-red-black-tree@^1.0.1": 549 | "integrity" "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" 550 | "resolved" "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" 551 | "version" "1.0.1" 552 | 553 | "get-stdin@^6.0.0": 554 | "integrity" "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==" 555 | "resolved" "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz" 556 | "version" "6.0.0" 557 | 558 | "glob-parent@^5.0.0": 559 | "integrity" "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==" 560 | "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz" 561 | "version" "5.1.1" 562 | dependencies: 563 | "is-glob" "^4.0.1" 564 | 565 | "glob@^7.1.3": 566 | "integrity" "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==" 567 | "resolved" "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" 568 | "version" "7.1.6" 569 | dependencies: 570 | "fs.realpath" "^1.0.0" 571 | "inflight" "^1.0.4" 572 | "inherits" "2" 573 | "minimatch" "^3.0.4" 574 | "once" "^1.3.0" 575 | "path-is-absolute" "^1.0.0" 576 | 577 | "globals@^12.1.0": 578 | "integrity" "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==" 579 | "resolved" "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz" 580 | "version" "12.4.0" 581 | dependencies: 582 | "type-fest" "^0.8.1" 583 | 584 | "graceful-fs@^4.1.2": 585 | "integrity" "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" 586 | "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz" 587 | "version" "4.2.4" 588 | 589 | "has-flag@^3.0.0": 590 | "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 591 | "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" 592 | "version" "3.0.0" 593 | 594 | "has-flag@^4.0.0": 595 | "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 596 | "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" 597 | "version" "4.0.0" 598 | 599 | "has-symbols@^1.0.0", "has-symbols@^1.0.1": 600 | "integrity" "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" 601 | "resolved" "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz" 602 | "version" "1.0.1" 603 | 604 | "has@^1.0.3": 605 | "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==" 606 | "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz" 607 | "version" "1.0.3" 608 | dependencies: 609 | "function-bind" "^1.1.1" 610 | 611 | "hosted-git-info@^2.1.4": 612 | "integrity" "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" 613 | "resolved" "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz" 614 | "version" "2.8.8" 615 | 616 | "ignore@^4.0.6": 617 | "integrity" "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" 618 | "resolved" "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" 619 | "version" "4.0.6" 620 | 621 | "ignore@^5.1.1": 622 | "integrity" "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" 623 | "resolved" "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz" 624 | "version" "5.1.8" 625 | 626 | "import-fresh@^3.0.0": 627 | "integrity" "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==" 628 | "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz" 629 | "version" "3.2.1" 630 | dependencies: 631 | "parent-module" "^1.0.0" 632 | "resolve-from" "^4.0.0" 633 | 634 | "imurmurhash@^0.1.4": 635 | "integrity" "sha1-khi5srkoojixPcT7a21XbyMUU+o=" 636 | "resolved" "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" 637 | "version" "0.1.4" 638 | 639 | "inflight@^1.0.4": 640 | "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=" 641 | "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" 642 | "version" "1.0.6" 643 | dependencies: 644 | "once" "^1.3.0" 645 | "wrappy" "1" 646 | 647 | "inherits@2": 648 | "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 649 | "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" 650 | "version" "2.0.4" 651 | 652 | "is-arrayish@^0.2.1": 653 | "integrity" "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" 654 | "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" 655 | "version" "0.2.1" 656 | 657 | "is-callable@^1.1.4", "is-callable@^1.2.0": 658 | "integrity" "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==" 659 | "resolved" "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz" 660 | "version" "1.2.0" 661 | 662 | "is-date-object@^1.0.1": 663 | "integrity" "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" 664 | "resolved" "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz" 665 | "version" "1.0.2" 666 | 667 | "is-extglob@^2.1.1": 668 | "integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 669 | "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" 670 | "version" "2.1.1" 671 | 672 | "is-fullwidth-code-point@^2.0.0": 673 | "integrity" "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 674 | "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" 675 | "version" "2.0.0" 676 | 677 | "is-glob@^4.0.0", "is-glob@^4.0.1": 678 | "integrity" "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==" 679 | "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz" 680 | "version" "4.0.1" 681 | dependencies: 682 | "is-extglob" "^2.1.1" 683 | 684 | "is-regex@^1.1.0": 685 | "integrity" "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==" 686 | "resolved" "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz" 687 | "version" "1.1.1" 688 | dependencies: 689 | "has-symbols" "^1.0.1" 690 | 691 | "is-string@^1.0.5": 692 | "integrity" "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" 693 | "resolved" "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz" 694 | "version" "1.0.5" 695 | 696 | "is-symbol@^1.0.2": 697 | "integrity" "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==" 698 | "resolved" "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz" 699 | "version" "1.0.3" 700 | dependencies: 701 | "has-symbols" "^1.0.1" 702 | 703 | "isarray@^1.0.0": 704 | "integrity" "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 705 | "resolved" "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" 706 | "version" "1.0.0" 707 | 708 | "isexe@^2.0.0": 709 | "integrity" "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 710 | "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" 711 | "version" "2.0.0" 712 | 713 | "js-tokens@^4.0.0": 714 | "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 715 | "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" 716 | "version" "4.0.0" 717 | 718 | "js-yaml@^3.13.1": 719 | "integrity" "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==" 720 | "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz" 721 | "version" "3.14.0" 722 | dependencies: 723 | "argparse" "^1.0.7" 724 | "esprima" "^4.0.0" 725 | 726 | "json-schema-traverse@^0.4.1": 727 | "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 728 | "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" 729 | "version" "0.4.1" 730 | 731 | "json-stable-stringify-without-jsonify@^1.0.1": 732 | "integrity" "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" 733 | "resolved" "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" 734 | "version" "1.0.1" 735 | 736 | "json5@^1.0.1": 737 | "integrity" "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==" 738 | "resolved" "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz" 739 | "version" "1.0.1" 740 | dependencies: 741 | "minimist" "^1.2.0" 742 | 743 | "levn@^0.4.1": 744 | "integrity" "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==" 745 | "resolved" "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" 746 | "version" "0.4.1" 747 | dependencies: 748 | "prelude-ls" "^1.2.1" 749 | "type-check" "~0.4.0" 750 | 751 | "load-json-file@^2.0.0": 752 | "integrity" "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=" 753 | "resolved" "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz" 754 | "version" "2.0.0" 755 | dependencies: 756 | "graceful-fs" "^4.1.2" 757 | "parse-json" "^2.2.0" 758 | "pify" "^2.0.0" 759 | "strip-bom" "^3.0.0" 760 | 761 | "locate-path@^2.0.0": 762 | "integrity" "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=" 763 | "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" 764 | "version" "2.0.0" 765 | dependencies: 766 | "p-locate" "^2.0.0" 767 | "path-exists" "^3.0.0" 768 | 769 | "lodash@^4.17.14", "lodash@^4.17.19": 770 | "integrity" "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" 771 | "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz" 772 | "version" "4.17.19" 773 | 774 | "marked@^1.1.1": 775 | "integrity" "sha512-mJzT8D2yPxoPh7h0UXkB+dBj4FykPJ2OIfxAWeIHrvoHDkFxukV/29QxoFQoPM6RLEwhIFdJpmKBlqVM3s2ZIw==" 776 | "resolved" "https://registry.npmjs.org/marked/-/marked-1.1.1.tgz" 777 | "version" "1.1.1" 778 | 779 | "minimatch@^3.0.4": 780 | "integrity" "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==" 781 | "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" 782 | "version" "3.0.4" 783 | dependencies: 784 | "brace-expansion" "^1.1.7" 785 | 786 | "minimist@^1.2.0", "minimist@^1.2.5": 787 | "integrity" "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 788 | "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" 789 | "version" "1.2.5" 790 | 791 | "mkdirp@^0.5.1": 792 | "integrity" "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==" 793 | "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" 794 | "version" "0.5.5" 795 | dependencies: 796 | "minimist" "^1.2.5" 797 | 798 | "ms@^2.1.1": 799 | "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 800 | "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" 801 | "version" "2.1.2" 802 | 803 | "ms@2.0.0": 804 | "integrity" "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 805 | "resolved" "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" 806 | "version" "2.0.0" 807 | 808 | "natural-compare@^1.4.0": 809 | "integrity" "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" 810 | "resolved" "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" 811 | "version" "1.4.0" 812 | 813 | "normalize-package-data@^2.3.2": 814 | "integrity" "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==" 815 | "resolved" "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" 816 | "version" "2.5.0" 817 | dependencies: 818 | "hosted-git-info" "^2.1.4" 819 | "resolve" "^1.10.0" 820 | "semver" "2 || 3 || 4 || 5" 821 | "validate-npm-package-license" "^3.0.1" 822 | 823 | "object-inspect@^1.7.0": 824 | "integrity" "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==" 825 | "resolved" "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz" 826 | "version" "1.8.0" 827 | 828 | "object-keys@^1.0.11", "object-keys@^1.0.12", "object-keys@^1.1.1": 829 | "integrity" "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" 830 | "resolved" "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" 831 | "version" "1.1.1" 832 | 833 | "object.assign@^4.1.0": 834 | "integrity" "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==" 835 | "resolved" "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz" 836 | "version" "4.1.0" 837 | dependencies: 838 | "define-properties" "^1.1.2" 839 | "function-bind" "^1.1.1" 840 | "has-symbols" "^1.0.0" 841 | "object-keys" "^1.0.11" 842 | 843 | "object.values@^1.1.1": 844 | "integrity" "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==" 845 | "resolved" "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz" 846 | "version" "1.1.1" 847 | dependencies: 848 | "define-properties" "^1.1.3" 849 | "es-abstract" "^1.17.0-next.1" 850 | "function-bind" "^1.1.1" 851 | "has" "^1.0.3" 852 | 853 | "once@^1.3.0": 854 | "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" 855 | "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" 856 | "version" "1.4.0" 857 | dependencies: 858 | "wrappy" "1" 859 | 860 | "optionator@^0.9.1": 861 | "integrity" "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==" 862 | "resolved" "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" 863 | "version" "0.9.1" 864 | dependencies: 865 | "deep-is" "^0.1.3" 866 | "fast-levenshtein" "^2.0.6" 867 | "levn" "^0.4.1" 868 | "prelude-ls" "^1.2.1" 869 | "type-check" "^0.4.0" 870 | "word-wrap" "^1.2.3" 871 | 872 | "p-limit@^1.1.0": 873 | "integrity" "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==" 874 | "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz" 875 | "version" "1.3.0" 876 | dependencies: 877 | "p-try" "^1.0.0" 878 | 879 | "p-locate@^2.0.0": 880 | "integrity" "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=" 881 | "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz" 882 | "version" "2.0.0" 883 | dependencies: 884 | "p-limit" "^1.1.0" 885 | 886 | "p-try@^1.0.0": 887 | "integrity" "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" 888 | "resolved" "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz" 889 | "version" "1.0.0" 890 | 891 | "parent-module@^1.0.0": 892 | "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==" 893 | "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" 894 | "version" "1.0.1" 895 | dependencies: 896 | "callsites" "^3.0.0" 897 | 898 | "parse-json@^2.2.0": 899 | "integrity" "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=" 900 | "resolved" "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz" 901 | "version" "2.2.0" 902 | dependencies: 903 | "error-ex" "^1.2.0" 904 | 905 | "path-exists@^3.0.0": 906 | "integrity" "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 907 | "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" 908 | "version" "3.0.0" 909 | 910 | "path-is-absolute@^1.0.0": 911 | "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 912 | "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" 913 | "version" "1.0.1" 914 | 915 | "path-key@^3.1.0": 916 | "integrity" "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" 917 | "resolved" "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" 918 | "version" "3.1.1" 919 | 920 | "path-parse@^1.0.6": 921 | "integrity" "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" 922 | "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz" 923 | "version" "1.0.6" 924 | 925 | "path-type@^2.0.0": 926 | "integrity" "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=" 927 | "resolved" "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz" 928 | "version" "2.0.0" 929 | dependencies: 930 | "pify" "^2.0.0" 931 | 932 | "pify@^2.0.0": 933 | "integrity" "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" 934 | "resolved" "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" 935 | "version" "2.3.0" 936 | 937 | "pkg-dir@^2.0.0": 938 | "integrity" "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=" 939 | "resolved" "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz" 940 | "version" "2.0.0" 941 | dependencies: 942 | "find-up" "^2.1.0" 943 | 944 | "prelude-ls@^1.2.1": 945 | "integrity" "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" 946 | "resolved" "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" 947 | "version" "1.2.1" 948 | 949 | "prettier-linter-helpers@^1.0.0": 950 | "integrity" "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==" 951 | "resolved" "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" 952 | "version" "1.0.0" 953 | dependencies: 954 | "fast-diff" "^1.1.2" 955 | 956 | "prettier@^1.18.2", "prettier@>=1.13.0": 957 | "integrity" "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==" 958 | "resolved" "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz" 959 | "version" "1.19.1" 960 | 961 | "progress@^2.0.0": 962 | "integrity" "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" 963 | "resolved" "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" 964 | "version" "2.0.3" 965 | 966 | "punycode@^2.1.0": 967 | "integrity" "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 968 | "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" 969 | "version" "2.1.1" 970 | 971 | "read-pkg-up@^2.0.0": 972 | "integrity" "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=" 973 | "resolved" "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz" 974 | "version" "2.0.0" 975 | dependencies: 976 | "find-up" "^2.0.0" 977 | "read-pkg" "^2.0.0" 978 | 979 | "read-pkg@^2.0.0": 980 | "integrity" "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=" 981 | "resolved" "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz" 982 | "version" "2.0.0" 983 | dependencies: 984 | "load-json-file" "^2.0.0" 985 | "normalize-package-data" "^2.3.2" 986 | "path-type" "^2.0.0" 987 | 988 | "regexpp@^3.0.0", "regexpp@^3.1.0": 989 | "integrity" "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==" 990 | "resolved" "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz" 991 | "version" "3.1.0" 992 | 993 | "resolve-from@^4.0.0": 994 | "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" 995 | "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" 996 | "version" "4.0.0" 997 | 998 | "resolve@^1.10.0", "resolve@^1.10.1", "resolve@^1.13.1", "resolve@^1.17.0": 999 | "integrity" "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==" 1000 | "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz" 1001 | "version" "1.17.0" 1002 | dependencies: 1003 | "path-parse" "^1.0.6" 1004 | 1005 | "rimraf@2.6.3": 1006 | "integrity" "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==" 1007 | "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz" 1008 | "version" "2.6.3" 1009 | dependencies: 1010 | "glob" "^7.1.3" 1011 | 1012 | "semver@^6.1.0": 1013 | "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 1014 | "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" 1015 | "version" "6.3.0" 1016 | 1017 | "semver@^7.2.1": 1018 | "integrity" "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" 1019 | "resolved" "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz" 1020 | "version" "7.3.2" 1021 | 1022 | "semver@2 || 3 || 4 || 5": 1023 | "integrity" "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 1024 | "resolved" "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" 1025 | "version" "5.7.1" 1026 | 1027 | "shebang-command@^2.0.0": 1028 | "integrity" "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==" 1029 | "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" 1030 | "version" "2.0.0" 1031 | dependencies: 1032 | "shebang-regex" "^3.0.0" 1033 | 1034 | "shebang-regex@^3.0.0": 1035 | "integrity" "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" 1036 | "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" 1037 | "version" "3.0.0" 1038 | 1039 | "slice-ansi@^2.1.0": 1040 | "integrity" "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==" 1041 | "resolved" "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz" 1042 | "version" "2.1.0" 1043 | dependencies: 1044 | "ansi-styles" "^3.2.0" 1045 | "astral-regex" "^1.0.0" 1046 | "is-fullwidth-code-point" "^2.0.0" 1047 | 1048 | "spdx-correct@^3.0.0": 1049 | "integrity" "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==" 1050 | "resolved" "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz" 1051 | "version" "3.1.1" 1052 | dependencies: 1053 | "spdx-expression-parse" "^3.0.0" 1054 | "spdx-license-ids" "^3.0.0" 1055 | 1056 | "spdx-exceptions@^2.1.0": 1057 | "integrity" "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" 1058 | "resolved" "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" 1059 | "version" "2.3.0" 1060 | 1061 | "spdx-expression-parse@^3.0.0": 1062 | "integrity" "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==" 1063 | "resolved" "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" 1064 | "version" "3.0.1" 1065 | dependencies: 1066 | "spdx-exceptions" "^2.1.0" 1067 | "spdx-license-ids" "^3.0.0" 1068 | 1069 | "spdx-license-ids@^3.0.0": 1070 | "integrity" "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" 1071 | "resolved" "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz" 1072 | "version" "3.0.5" 1073 | 1074 | "sprintf-js@~1.0.2": 1075 | "integrity" "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" 1076 | "resolved" "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" 1077 | "version" "1.0.3" 1078 | 1079 | "string-width@^3.0.0": 1080 | "integrity" "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==" 1081 | "resolved" "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" 1082 | "version" "3.1.0" 1083 | dependencies: 1084 | "emoji-regex" "^7.0.1" 1085 | "is-fullwidth-code-point" "^2.0.0" 1086 | "strip-ansi" "^5.1.0" 1087 | 1088 | "string.prototype.trimend@^1.0.1": 1089 | "integrity" "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==" 1090 | "resolved" "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz" 1091 | "version" "1.0.1" 1092 | dependencies: 1093 | "define-properties" "^1.1.3" 1094 | "es-abstract" "^1.17.5" 1095 | 1096 | "string.prototype.trimstart@^1.0.1": 1097 | "integrity" "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==" 1098 | "resolved" "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz" 1099 | "version" "1.0.1" 1100 | dependencies: 1101 | "define-properties" "^1.1.3" 1102 | "es-abstract" "^1.17.5" 1103 | 1104 | "strip-ansi@^5.1.0": 1105 | "integrity" "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==" 1106 | "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" 1107 | "version" "5.2.0" 1108 | dependencies: 1109 | "ansi-regex" "^4.1.0" 1110 | 1111 | "strip-ansi@^6.0.0": 1112 | "integrity" "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==" 1113 | "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz" 1114 | "version" "6.0.0" 1115 | dependencies: 1116 | "ansi-regex" "^5.0.0" 1117 | 1118 | "strip-bom@^3.0.0": 1119 | "integrity" "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" 1120 | "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" 1121 | "version" "3.0.0" 1122 | 1123 | "strip-json-comments@^3.1.0": 1124 | "integrity" "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" 1125 | "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" 1126 | "version" "3.1.1" 1127 | 1128 | "supports-color@^5.3.0": 1129 | "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" 1130 | "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" 1131 | "version" "5.5.0" 1132 | dependencies: 1133 | "has-flag" "^3.0.0" 1134 | 1135 | "supports-color@^7.1.0": 1136 | "integrity" "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==" 1137 | "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz" 1138 | "version" "7.1.0" 1139 | dependencies: 1140 | "has-flag" "^4.0.0" 1141 | 1142 | "table@^5.2.3": 1143 | "integrity" "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==" 1144 | "resolved" "https://registry.npmjs.org/table/-/table-5.4.6.tgz" 1145 | "version" "5.4.6" 1146 | dependencies: 1147 | "ajv" "^6.10.2" 1148 | "lodash" "^4.17.14" 1149 | "slice-ansi" "^2.1.0" 1150 | "string-width" "^3.0.0" 1151 | 1152 | "text-table@^0.2.0": 1153 | "integrity" "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" 1154 | "resolved" "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" 1155 | "version" "0.2.0" 1156 | 1157 | "tsconfig-paths@^3.9.0": 1158 | "integrity" "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==" 1159 | "resolved" "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz" 1160 | "version" "3.9.0" 1161 | dependencies: 1162 | "@types/json5" "^0.0.29" 1163 | "json5" "^1.0.1" 1164 | "minimist" "^1.2.0" 1165 | "strip-bom" "^3.0.0" 1166 | 1167 | "type-check@^0.4.0", "type-check@~0.4.0": 1168 | "integrity" "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==" 1169 | "resolved" "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" 1170 | "version" "0.4.0" 1171 | dependencies: 1172 | "prelude-ls" "^1.2.1" 1173 | 1174 | "type-fest@^0.8.1": 1175 | "integrity" "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" 1176 | "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" 1177 | "version" "0.8.1" 1178 | 1179 | "uri-js@^4.2.2": 1180 | "integrity" "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==" 1181 | "resolved" "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz" 1182 | "version" "4.2.2" 1183 | dependencies: 1184 | "punycode" "^2.1.0" 1185 | 1186 | "v8-compile-cache@^2.0.3": 1187 | "integrity" "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==" 1188 | "resolved" "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz" 1189 | "version" "2.1.1" 1190 | 1191 | "validate-npm-package-license@^3.0.1": 1192 | "integrity" "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==" 1193 | "resolved" "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" 1194 | "version" "3.0.4" 1195 | dependencies: 1196 | "spdx-correct" "^3.0.0" 1197 | "spdx-expression-parse" "^3.0.0" 1198 | 1199 | "which@^2.0.1": 1200 | "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" 1201 | "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz" 1202 | "version" "2.0.2" 1203 | dependencies: 1204 | "isexe" "^2.0.0" 1205 | 1206 | "word-wrap@^1.2.3": 1207 | "integrity" "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" 1208 | "resolved" "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" 1209 | "version" "1.2.3" 1210 | 1211 | "wrappy@1": 1212 | "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1213 | "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" 1214 | "version" "1.0.2" 1215 | 1216 | "write@1.0.3": 1217 | "integrity" "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==" 1218 | "resolved" "https://registry.npmjs.org/write/-/write-1.0.3.tgz" 1219 | "version" "1.0.3" 1220 | dependencies: 1221 | "mkdirp" "^0.5.1" 1222 | --------------------------------------------------------------------------------