├── .gitignore
├── dist
├── css
│ ├── link.css
│ ├── page.css
│ ├── initDataPage.css
│ ├── rgb.css
│ ├── tonConnectPage.css
│ ├── homePage.css
│ ├── displayData.css
│ ├── walletProvider.css
│ └── index.css
├── tonconnect-manifest.json
├── js
│ ├── utils.js
│ ├── initTonConnect.js
│ ├── components
│ │ ├── PageComponent.js
│ │ ├── TonConnectButton.js
│ │ ├── RGB.js
│ │ ├── Page.js
│ │ ├── Link.js
│ │ ├── DisplayData.js
│ │ └── WalletProvider.js
│ ├── initNavigrator.js
│ ├── initComponents.js
│ ├── pages
│ │ ├── HomePage.js
│ │ ├── LaunchParamsPage.js
│ │ ├── ThemeParamsPage.js
│ │ ├── TonConnectPage.js
│ │ └── InitDataPage.js
│ ├── mockEnv.js
│ └── index.js
├── ton.svg
└── index.html
├── .github
├── deployment-branches.png
└── workflows
│ └── github-pages-deploy.yml
├── package.json
├── README.md
└── pnpm-lock.yaml
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
2 | node_modules
3 |
--------------------------------------------------------------------------------
/dist/css/link.css:
--------------------------------------------------------------------------------
1 | .link {
2 | text-decoration: none;
3 | color: var(--tg-theme-link-color);
4 | }
--------------------------------------------------------------------------------
/.github/deployment-branches.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Telegram-Mini-Apps/vanillajs-template/HEAD/.github/deployment-branches.png
--------------------------------------------------------------------------------
/dist/tonconnect-manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "url": "https://ton.vote",
3 | "name": "TON Vote",
4 | "iconUrl": "https://ton.vote/logo.png"
5 | }
--------------------------------------------------------------------------------
/dist/css/page.css:
--------------------------------------------------------------------------------
1 | .page {
2 | padding: 0 10px;
3 | box-sizing: border-box;
4 | }
5 |
6 | .page__disclaimer {
7 | margin-bottom: 16px;
8 | }
--------------------------------------------------------------------------------
/dist/css/initDataPage.css:
--------------------------------------------------------------------------------
1 | .init-data-page__section + .init-data-page__section {
2 | margin-top: 12px;
3 | }
4 |
5 | .init-data-page__section-title {
6 | margin-bottom: 4px;
7 | }
--------------------------------------------------------------------------------
/dist/css/rgb.css:
--------------------------------------------------------------------------------
1 | .rgb {
2 | display: inline-flex;
3 | align-items: center;
4 | gap: 5px;
5 | }
6 |
7 | .rgb__icon {
8 | width: 18px;
9 | aspect-ratio: 1;
10 | border: 1px solid #555;
11 | border-radius: 50%;
12 | }
--------------------------------------------------------------------------------
/dist/css/tonConnectPage.css:
--------------------------------------------------------------------------------
1 | .ton-connect-page__button-container {
2 | display: flex;
3 | align-items: center;
4 | justify-content: flex-end;
5 | }
6 |
7 | .ton-connect-page__provider {
8 | margin-bottom: 16px;
9 | }
10 |
--------------------------------------------------------------------------------
/dist/js/utils.js:
--------------------------------------------------------------------------------
1 | function filterChildren(children) {
2 | return children.filter(function(c) {
3 | return c !== undefined && c !== null && typeof c !== 'boolean';
4 | });
5 | }
6 |
7 | function toArray(elem) {
8 | return Array.isArray(elem) ? elem : [elem];
9 | }
--------------------------------------------------------------------------------
/dist/js/initTonConnect.js:
--------------------------------------------------------------------------------
1 | function initTonConnectUI() {
2 | const tonConnectUI = new window.TON_CONNECT_UI.TonConnectUI({
3 | manifestUrl: new URL('/vanillajs-template/tonconnect-manifest.json', window.location.href).toString(),
4 | });
5 |
6 | return tonConnectUI;
7 | }
--------------------------------------------------------------------------------
/dist/js/components/PageComponent.js:
--------------------------------------------------------------------------------
1 | function PageComponent(page) {
2 | this.page = page;
3 | }
4 |
5 | /**
6 | * @param {HTMLElement} root
7 | * @returns {void}
8 | */
9 | PageComponent.prototype.render = function(root) {
10 | $(root).empty().append(this.page.element());
11 | };
--------------------------------------------------------------------------------
/dist/js/initNavigrator.js:
--------------------------------------------------------------------------------
1 | function initNavigator() {
2 | return new Promise(function(resolve) {
3 | var navigator = window.telegramApps.sdk.initNavigator('app-navigator-state');
4 |
5 | // Attach the navigator to the browser history, so it could modify the history and listen to
6 | // its changes.
7 | navigator.attach().then(function() {
8 | resolve(navigator);
9 | });
10 | });
11 | }
--------------------------------------------------------------------------------
/dist/css/homePage.css:
--------------------------------------------------------------------------------
1 | .index-page__links {
2 | list-style: none;
3 | padding-left: 0;
4 | }
5 |
6 | .index-page__link {
7 | font-weight: bold;
8 | display: inline-flex;
9 | gap: 5px;
10 | }
11 |
12 | .index-page__link-item + .index-page__link-item {
13 | margin-top: 10px;
14 | }
15 |
16 | .index-page__link-icon {
17 | width: 20px;
18 | display: block;
19 | }
20 |
21 | .index-page__link-icon svg {
22 | display: block;
23 | }
--------------------------------------------------------------------------------
/dist/css/displayData.css:
--------------------------------------------------------------------------------
1 | .display-data__line {
2 | display: flex;
3 | align-items: center;
4 | margin-bottom: 8px;
5 | gap: 10px;
6 | flex-flow: wrap;
7 | }
8 |
9 | .display-data__line-title {
10 | border: 1px solid var(--tg-theme-accent-text-color);
11 | background-color: var(--tg-theme-bg-color);
12 | border-radius: 5px;
13 | padding: 2px 8px 4px;
14 | box-sizing: border-box;
15 | }
16 |
17 | .display-data__line-value {
18 | word-break: break-word;
19 | }
--------------------------------------------------------------------------------
/dist/js/components/TonConnectButton.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @param {{ id: string, class?: string }} options
3 | */
4 | function TonConnectButton(options) {
5 | var id = options.id;
6 | var className = options.class;
7 |
8 | this.el = $('
')
9 | .addClass(className || '')
10 | .append($('').attr('id', id));
11 | }
12 |
13 | /**
14 | * @returns {HTMLDivElement}
15 | */
16 | TonConnectButton.prototype.element = function() {
17 | return this.el[0];
18 | };
--------------------------------------------------------------------------------
/dist/css/walletProvider.css:
--------------------------------------------------------------------------------
1 | .wallet-provider {
2 | display: flex;
3 | align-items: center;
4 | gap: 15px;
5 | }
6 |
7 | .wallet-provider__image {
8 | border-radius: 5px;
9 | }
10 |
11 | .wallet-provider__meta {
12 | display: flex;
13 | flex-direction: column;
14 | }
15 |
16 | .wallet-provider__wallet-name {
17 | font-weight: bold;
18 | font-size: 20px;
19 | margin: 0;
20 | }
21 |
22 | .wallet-provider__app-name {
23 | opacity: .4;
24 | font-weight: 400;
25 | font-size: 14px;
26 | vertical-align: top;
27 | }
--------------------------------------------------------------------------------
/dist/js/components/RGB.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @param {{ color: string; class?: string }} options
3 | */
4 | function RGB(options) {
5 | var color = options.color;
6 | var className = options.class;
7 |
8 | this.el = $('')
9 | .attr('class', 'rgb')
10 | .addClass(className || '')
11 | .append(
12 | $('').css('background-color', color),
13 | color
14 | );
15 | }
16 |
17 | /**
18 | * @returns {HTMLSpanElement}
19 | */
20 | RGB.prototype.element = function() {
21 | return this.el[0];
22 | };
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vanillajs-template",
3 | "description": "Telegram Mini Apps application template using JavaScript.",
4 | "private": true,
5 | "version": "0.0.1",
6 | "main": "index.html",
7 | "homepage": "https://telegram-mini-apps.github.io/vanillajs-template",
8 | "scripts": {
9 | "deploy": "gh-pages -d dist",
10 | "serve": "serve ./dist",
11 | "tunnel": "lt --port 3000"
12 | },
13 | "keywords": [],
14 | "author": "Vladislav Kibenko",
15 | "license": "MIT",
16 | "devDependencies": {
17 | "gh-pages": "^6.1.1",
18 | "localtunnel": "^2.0.2",
19 | "serve": "^14.2.1"
20 | }
21 | }
--------------------------------------------------------------------------------
/dist/css/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | font-family: -apple-system, BlinkMacSystemFont, 'Roboto', 'Oxygen',
3 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
4 | sans-serif;
5 | -webkit-font-smoothing: antialiased;
6 | -moz-osx-font-smoothing: grayscale;
7 | line-height: 1.5;
8 |
9 | background: var(--tg-theme-secondary-bg-color, white);
10 | color: var(--tg-theme-text-color, black);
11 | }
12 |
13 | blockquote {
14 | margin: 0;
15 | }
16 |
17 | blockquote p {
18 | padding: 15px;
19 | background: #eee;
20 | border-radius: 5px;
21 | }
22 |
23 | pre {
24 | overflow: auto;
25 | }
26 |
27 | h1 {
28 | margin-top: 0.67em;
29 | }
--------------------------------------------------------------------------------
/dist/ton.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/dist/js/components/Page.js:
--------------------------------------------------------------------------------
1 | function Page(options) {
2 | var title = options.title;
3 | this.el = $('').append($('').text(title));
4 | }
5 |
6 | Page.prototype.appendChild = function() {
7 | var children = Array.prototype.slice.call(arguments);
8 | this.el.append.apply(this.el, filterChildren(children));
9 | return this;
10 | };
11 |
12 | /**
13 | * @returns {HTMLDivElement}
14 | */
15 | Page.prototype.element = function() {
16 | return this.el[0];
17 | };
18 |
19 | Page.prototype.setDisclaimer = function(disclaimer) {
20 | if (this.disclaimer) {
21 | this.disclaimer.empty().append.apply(this.disclaimer, toArray(disclaimer));
22 | } else {
23 | var disclaimerEl = $('');
24 | this.disclaimer = disclaimerEl
25 | .append.apply(disclaimerEl, toArray(disclaimer))
26 | .insertAfter(this.el.children('h1'));
27 | }
28 | return this;
29 | };
--------------------------------------------------------------------------------
/dist/js/initComponents.js:
--------------------------------------------------------------------------------
1 | function initComponents() {
2 | return new Promise(function(resolve, reject) {
3 | var miniApp = window.telegramApps.sdk.initMiniApp()[0];
4 | var themeParams = window.telegramApps.sdk.initThemeParams()[0];
5 | var utils = window.telegramApps.sdk.initUtils();
6 | var initData = window.telegramApps.sdk.initInitData();
7 | var viewportPromise = window.telegramApps.sdk.initViewport()[0];
8 |
9 | viewportPromise.then(function(viewport) {
10 | // Generate Mini Apps related CSS-variables and track their changes.
11 | window.telegramApps.sdk.bindMiniAppCSSVars(miniApp, themeParams);
12 | window.telegramApps.sdk.bindThemeParamsCSSVars(themeParams);
13 | window.telegramApps.sdk.bindViewportCSSVars(viewport);
14 |
15 | resolve({
16 | initData: initData,
17 | miniApp: miniApp,
18 | themeParams: themeParams,
19 | utils: utils,
20 | viewport: viewport,
21 | });
22 | }).catch(reject);
23 | });
24 | }
--------------------------------------------------------------------------------
/dist/js/components/Link.js:
--------------------------------------------------------------------------------
1 | function Link(options, context) {
2 | var href = options.href;
3 | var className = options.class;
4 |
5 | var targetUrl = new URL(href, window.location.toString());
6 | var currentUrl = new URL(window.location.toString());
7 | var isExternal = targetUrl.protocol !== currentUrl.protocol || targetUrl.host !== currentUrl.host;
8 |
9 | this.el = $('')
10 | .attr('class', 'link')
11 | .addClass(className || '')
12 | .attr('href', isExternal ? href : context.navigator.renderPath(href));
13 |
14 | if (isExternal) {
15 | this.el.on('click', function(e) {
16 | e.preventDefault();
17 | context.utils.openLink(targetUrl.toString());
18 | });
19 | }
20 | }
21 |
22 | Link.prototype.appendChild = function() {
23 | var children = Array.prototype.slice.call(arguments);
24 | this.el.append.apply(this.el, filterChildren(children));
25 | return this;
26 | };
27 |
28 | /**
29 | * @returns {HTMLAnchorElement}
30 | */
31 | Link.prototype.element = function() {
32 | return this.el[0];
33 | };
--------------------------------------------------------------------------------
/dist/js/pages/HomePage.js:
--------------------------------------------------------------------------------
1 | function HomePage(context) {
2 | var routes = context.routes;
3 |
4 | this.page = new Page({ title: 'Home Page' }).appendChild(
5 | $('').text(
6 | 'This page is a home page in this boilerplate. You can use the links below to visit other pages with their own functionality.'
7 | ),
8 | $('').append.apply(
9 | $(''),
10 | routes.reduce(function(acc, r) {
11 | if (r.title) {
12 | acc.push(
13 | $('').append(
14 | new Link({ class: 'index-page__link', href: r.pathname }, context)
15 | .appendChild(
16 | r.icon && $('').append(
17 | $('
').attr('src', r.icon)
18 | ),
19 | r.title
20 | )
21 | .element()
22 | )
23 | );
24 | }
25 | return acc;
26 | }, [])
27 | )
28 | );
29 | }
30 |
31 | /**
32 | * @param {HTMLElement} root
33 | */
34 | HomePage.prototype.render = function(root) {
35 | $(root).empty().append(this.page.element());
36 | };
--------------------------------------------------------------------------------
/.github/workflows/github-pages-deploy.yml:
--------------------------------------------------------------------------------
1 | # Simple workflow for deploying static content to GitHub Pages
2 | name: Deploy static content to Pages
3 |
4 | on:
5 | # Runs on pushes targeting the default branch
6 | push:
7 | branches: ['master']
8 |
9 | # Allows you to run this workflow manually from the Actions tab
10 | workflow_dispatch:
11 |
12 | # Sets the GITHUB_TOKEN permissions to allow deployment to GitHub Pages
13 | permissions:
14 | contents: read
15 | pages: write
16 | id-token: write
17 |
18 | # Allow one concurrent deployment
19 | concurrency:
20 | group: 'pages'
21 | cancel-in-progress: true
22 |
23 | jobs:
24 | # Single deploy job since we're just deploying
25 | deploy:
26 | environment:
27 | name: github-pages
28 | url: ${{ steps.deployment.outputs.page_url }}
29 | runs-on: ubuntu-latest
30 | steps:
31 | - name: Checkout
32 | uses: actions/checkout@v4
33 |
34 | - name: Setup Pages
35 | uses: actions/configure-pages@v3
36 |
37 | - name: Upload artifact
38 | uses: actions/upload-pages-artifact@v2
39 | with:
40 | # Upload dist repository
41 | path: './dist'
42 |
43 | - name: Deploy to GitHub Pages
44 | id: deployment
45 | uses: actions/deploy-pages@v2
--------------------------------------------------------------------------------
/dist/js/components/DisplayData.js:
--------------------------------------------------------------------------------
1 | function isRGB(value) {
2 | return /^#[a-f0-9]{3,6}$/i.test(value);
3 | }
4 |
5 | function DisplayData(options) {
6 | var rows = options.rows;
7 | this.el = $('');
8 | this.setRows(rows);
9 | }
10 |
11 | /**
12 | * @returns {HTMLDivElement}
13 | */
14 | DisplayData.prototype.element = function() {
15 | return this.el[0];
16 | };
17 |
18 | DisplayData.prototype.setRows = function(rows) {
19 | this.el.empty().append.apply(this.el, rows.map(function(row) {
20 | var lineValue = $('');
21 | if (typeof row.value === 'string' && isRGB(row.value)) {
22 | lineValue.append(new RGB({ color: row.value }).element());
23 | } else if (row.value === false) {
24 | lineValue.text('❌');
25 | } else if (row.value === true) {
26 | lineValue.text('✔️');
27 | } else if (row.value === undefined) {
28 | lineValue.html('empty');
29 | } else if (row.value instanceof HTMLElement) {
30 | lineValue.append(row.value);
31 | } else {
32 | lineValue.append(row.value.toString());
33 | }
34 |
35 | return $('').append(
36 | $('').text(row.title),
37 | lineValue
38 | );
39 | }));
40 | return this;
41 | };
--------------------------------------------------------------------------------
/dist/js/components/WalletProvider.js:
--------------------------------------------------------------------------------
1 | function WalletProvider(options) {
2 | var context = options.context;
3 | var className = options.class;
4 |
5 | this.context = context;
6 | this.img = $('
')
7 | .attr('alt', 'Provider logo');
8 | this.el = $('')
9 | .attr('class', 'wallet-provider')
10 | .addClass(className || '')
11 | .attr('style', 'display: none;');
12 | }
13 |
14 | WalletProvider.prototype.setWallet = function(wallet) {
15 | if (!wallet) {
16 | this.el.attr('style', 'display: none;');
17 | this.el.empty();
18 | return;
19 | } else {
20 | this.el.attr('style', '');
21 | this.el.append([
22 | this.img.attr('src', wallet.imageUrl),
23 | $('').append([
24 | $('')
25 | .append(wallet.name + ' ')
26 | .append($('').append('(' + wallet.appName + ')')),
27 | new Link({ href: wallet.aboutUrl }, this.context)
28 | .appendChild('About connected wallet')
29 | .element()
30 | ])
31 | ]);
32 | }
33 | };
34 |
35 | /**
36 | * @returns {HTMLDivElement}
37 | */
38 | WalletProvider.prototype.element = function() {
39 | return this.el[0];
40 | };
--------------------------------------------------------------------------------
/dist/js/pages/LaunchParamsPage.js:
--------------------------------------------------------------------------------
1 | function LaunchParamsPage(context) {
2 | PageComponent.call(this, new Page({ title: 'Launch Params' }));
3 |
4 | var lp = context.launchParams;
5 |
6 | this.page
7 | .setDisclaimer([
8 | 'This page displays application ',
9 | new Link({
10 | href: 'https://docs.telegram-mini-apps.com/platform/launch-parameters',
11 | }, context)
12 | .appendChild('launch parameters')
13 | .element(),
14 | '.',
15 | ])
16 | .appendChild(
17 | new DisplayData({
18 | rows: [
19 | { title: 'tgWebAppPlatform', value: lp.platform },
20 | { title: 'tgWebAppShowSettings', value: lp.showSettings },
21 | { title: 'tgWebAppVersion', value: lp.version },
22 | { title: 'tgWebAppBotInline', value: lp.botInline },
23 | { title: 'tgWebAppStartParam', value: lp.startParam },
24 | {
25 | title: 'tgWebAppData',
26 | value: new Link({ href: '/init-data' }, context)
27 | .appendChild('View')
28 | .element(),
29 | },
30 | {
31 | title: 'tgWebAppThemeParams',
32 | value: new Link({ href: '/theme-params' }, context)
33 | .appendChild('View')
34 | .element(),
35 | }
36 | ],
37 | }).element()
38 | );
39 | }
40 |
41 | LaunchParamsPage.prototype = Object.create(PageComponent.prototype);
42 | LaunchParamsPage.prototype.constructor = LaunchParamsPage;
--------------------------------------------------------------------------------
/dist/js/pages/ThemeParamsPage.js:
--------------------------------------------------------------------------------
1 | function ThemeParamsPage(context) {
2 | PageComponent.call(this, new Page({ title: 'Theme Params' }));
3 | this.context = context;
4 | this.dd = new DisplayData({ rows: this.computeRows() });
5 | this.page
6 | .setDisclaimer([
7 | 'This page displays current ',
8 | new Link({ href: 'https://docs.telegram-mini-apps.com/platform/theming' }, this.context)
9 | .appendChild('theme parameters')
10 | .element(),
11 | '. It is reactive, so, changing theme externally will lead to this page updates.',
12 | ])
13 | .appendChild(this.dd.element());
14 |
15 | // Bind the onThemeChange method to the current context
16 | this.onThemeChange = this.onThemeChange.bind(this);
17 | }
18 |
19 | ThemeParamsPage.prototype = Object.create(PageComponent.prototype);
20 | ThemeParamsPage.prototype.constructor = ThemeParamsPage;
21 |
22 | ThemeParamsPage.prototype.computeRows = function() {
23 | var themeParams = this.context.themeParams.getState();
24 | return Object.keys(themeParams).map(function(title) {
25 | var value = themeParams[title];
26 | return {
27 | title: title
28 | .replace(/[A-Z]/g, function(m) { return `_${m.toLowerCase()}`; })
29 | .replace(/background/, 'bg'),
30 | value: value,
31 | };
32 | });
33 | };
34 |
35 | ThemeParamsPage.prototype.onThemeChange = function() {
36 | this.dd.setRows(this.computeRows());
37 | };
38 |
39 | ThemeParamsPage.prototype.init = function() {
40 | this.context.themeParams.on('change', this.onThemeChange);
41 | };
42 |
43 | ThemeParamsPage.prototype.destroy = function() {
44 | this.context.themeParams.off('change', this.onThemeChange);
45 | };
--------------------------------------------------------------------------------
/dist/js/mockEnv.js:
--------------------------------------------------------------------------------
1 | function mockEnv() {
2 | var shouldMock;
3 |
4 | // Try to extract launch parameters to check if the current environment is Telegram-based.
5 | try {
6 | // If we are able to extract launch parameters, it means that we are already in the
7 | // Telegram environment. So, there is no need to mock it.
8 | window.telegramApps.sdk.retrieveLaunchParams();
9 |
10 | // We could previously mock the environment. In case we did, we should do it again. The reason
11 | // is the page could be reloaded, and we should apply mock again, because mocking also
12 | // enables modifying the window object.
13 | shouldMock = !!sessionStorage.getItem('____mocked');
14 | } catch (e) {
15 | shouldMock = true;
16 | }
17 |
18 | if (shouldMock) {
19 | var initDataRaw = new URLSearchParams([
20 | ['user', JSON.stringify({
21 | id: 99281932,
22 | first_name: 'Andrew',
23 | last_name: 'Rogue',
24 | username: 'rogue',
25 | language_code: 'en',
26 | is_premium: true,
27 | allows_write_to_pm: true,
28 | })],
29 | ['hash', '89d6079ad6762351f38c6dbbc41bb53048019256a9443988af7a48bcad16ba31'],
30 | ['auth_date', '1716922846'],
31 | ['start_param', 'debug'],
32 | ['chat_type', 'sender'],
33 | ['chat_instance', '8428209589180549439'],
34 | ]).toString();
35 |
36 | window.telegramApps.sdk.mockTelegramEnv({
37 | themeParams: {
38 | accentTextColor: '#6ab2f2',
39 | bgColor: '#17212b',
40 | buttonColor: '#5288c1',
41 | buttonTextColor: '#ffffff',
42 | destructiveTextColor: '#ec3942',
43 | headerBgColor: '#17212b',
44 | hintColor: '#708499',
45 | linkColor: '#6ab3f3',
46 | secondaryBgColor: '#232e3c',
47 | sectionBgColor: '#17212b',
48 | sectionHeaderTextColor: '#6ab3f3',
49 | subtitleTextColor: '#708499',
50 | textColor: '#f5f5f5',
51 | },
52 | initData: window.telegramApps.sdk.parseInitData(initDataRaw),
53 | initData: initDataRaw,
54 | version: '7.2',
55 | platform: 'tdesktop',
56 | });
57 | sessionStorage.setItem('____mocked', '1');
58 |
59 | console.info(
60 | 'As long as the current environment was not considered as the Telegram-based one, it was mocked. Take a note, that you should not do it in production and current behavior is only specific to the development process. Environment mocking is also applied only in development mode. So, after building the application, you will not see this behavior and related warning, leading to crashing the application outside Telegram.'
61 | );
62 | }
63 | }
--------------------------------------------------------------------------------
/dist/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
8 |
9 | Telegram Mini Apps example
10 |
11 |
12 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
--------------------------------------------------------------------------------
/dist/js/index.js:
--------------------------------------------------------------------------------
1 | (function() {
2 | // Uncomment next line for local development outside Telegram Mini App
3 | mockEnv();
4 |
5 | var launchParams = window.telegramApps.sdk.retrieveLaunchParams();
6 |
7 | // Launch eruda and enable SDK debug mode, if debug mode was requested outside.
8 | var debug = launchParams.startParam === 'debug';
9 | if (debug) {
10 | window.telegramApps.sdk.setDebug(debug);
11 | }
12 |
13 | // The web version of Telegram is capable of sending some specific CSS styles we would
14 | // like to catch.
15 | if (window.telegramApps.sdk.isIframe()) {
16 | window.telegramApps.sdk.initWeb(true);
17 | }
18 |
19 | initComponents().then(function(components) {
20 | var miniApp = components.miniApp;
21 | var viewport = components.viewport;
22 | var utils = components.utils;
23 | var themeParams = components.themeParams;
24 | var initData = components.initData;
25 |
26 | initNavigator().then(function(navigator) {
27 | var tonConnectUI = initTonConnectUI();
28 |
29 | var routes = [
30 | { pathname: '/', Page: HomePage },
31 | { pathname: '/init-data', Page: InitDataPage, title: 'Init Data' },
32 | { pathname: '/theme-params', Page: ThemeParamsPage, title: 'Theme Params' },
33 | { pathname: '/launch-params', Page: LaunchParamsPage, title: 'Launch Params' },
34 | {
35 | pathname: '/ton-connect',
36 | Page: TonConnectPage,
37 | title: 'TON Connect',
38 | icon: window.location.origin + window.location.pathname + 'ton.svg'
39 | },
40 | ];
41 |
42 | var root = document.getElementById('root');
43 | var appContext = {
44 | initData: initData,
45 | launchParams: launchParams,
46 | miniApp: miniApp,
47 | navigator: navigator,
48 | themeParams: themeParams,
49 | utils: utils,
50 | viewport: viewport,
51 | tonConnectUI: tonConnectUI,
52 | routes: routes
53 | };
54 | var prevPage;
55 |
56 | function renderCurrentRoute() {
57 | var route = routes.find(function(r) {
58 | return r.pathname === navigator.pathname;
59 | });
60 | if (!route) {
61 | navigator.replace('/');
62 | return;
63 | }
64 | if (prevPage && typeof prevPage.destroy === 'function') {
65 | prevPage.destroy();
66 | }
67 | prevPage = new route.Page(appContext);
68 | if (typeof prevPage.init === 'function') {
69 | prevPage.init();
70 | }
71 | prevPage.render(root);
72 | }
73 |
74 | navigator.on('change', renderCurrentRoute);
75 | renderCurrentRoute();
76 | });
77 | });
78 | })();
--------------------------------------------------------------------------------
/dist/js/pages/TonConnectPage.js:
--------------------------------------------------------------------------------
1 | var DISCLAIMER_TEXT = 'To display the data related to the TON Connect, it is required to connect your wallet.';
2 |
3 | function TonConnectPage(context) {
4 | PageComponent.call(this, new Page({ title: 'TON Connect' }));
5 |
6 | this.context = context;
7 | this.connectedWallet = null;
8 | this.tonConnectButtonId = 'ton-connect-button';
9 | this.dd = new DisplayData({ rows: this.computeRows() });
10 | this.walletProvider = new WalletProvider({ context: context, "class": 'ton-connect-page__provider' });
11 | this.tonConnectButton = new TonConnectButton({ id: this.tonConnectButtonId, "class": 'ton-connect-page__button-container' });
12 |
13 | this.page
14 | .setDisclaimer([DISCLAIMER_TEXT])
15 | .appendChild(this.walletProvider.element())
16 | .appendChild(this.dd.element())
17 | .appendChild(this.tonConnectButton.element());
18 |
19 | // Bind the onWalletChange method to the current context
20 | this.onWalletChange = this.onWalletChange.bind(this);
21 | }
22 |
23 | TonConnectPage.prototype = Object.create(PageComponent.prototype);
24 | TonConnectPage.prototype.constructor = TonConnectPage;
25 |
26 | TonConnectPage.prototype.init = function() {
27 | var self = this;
28 | // Have to wait until TON Connect button root is mounted in DOM
29 | setTimeout(function() {
30 | self.context.tonConnectUI.uiOptions = {
31 | buttonRootId: self.tonConnectButtonId,
32 | };
33 | self.unsubscribe = self.context.tonConnectUI.onStatusChange(self.onWalletChange);
34 | if (self.context.tonConnectUI.wallet) {
35 | self.onWalletChange(self.context.tonConnectUI.wallet);
36 | }
37 | }, 0);
38 | };
39 |
40 | TonConnectPage.prototype.destroy = function() {
41 | if (this.unsubscribe) {
42 | this.unsubscribe();
43 | }
44 | this.context.tonConnectUI.uiOptions = {
45 | buttonRootId: null,
46 | };
47 | };
48 |
49 | TonConnectPage.prototype.computeRows = function() {
50 | if (this.connectedWallet === null) {
51 | return [];
52 | }
53 |
54 | return [
55 | { title: 'Address', value: this.connectedWallet.account.address },
56 | { title: 'Chain', value: this.connectedWallet.account.chain },
57 | { title: 'Public Key', value: this.connectedWallet.account.publicKey },
58 | ];
59 | };
60 |
61 | TonConnectPage.prototype.onWalletChange = function(walletInfo) {
62 | this.connectedWallet = walletInfo;
63 | this.dd.setRows(this.computeRows());
64 |
65 | if (!walletInfo) {
66 | this.page.setDisclaimer([DISCLAIMER_TEXT]);
67 | this.walletProvider.setWallet(walletInfo);
68 | return;
69 | }
70 |
71 | this.page.setDisclaimer([]);
72 |
73 | if ('imageUrl' in walletInfo) {
74 | this.walletProvider.setWallet(walletInfo);
75 | }
76 | };
--------------------------------------------------------------------------------
/dist/js/pages/InitDataPage.js:
--------------------------------------------------------------------------------
1 | function getUserRows(user) {
2 | return [
3 | { title: 'id', value: user.id.toString() },
4 | { title: 'username', value: user.username },
5 | { title: 'photo_url', value: user.photoUrl },
6 | { title: 'last_name', value: user.lastName },
7 | { title: 'first_name', value: user.firstName },
8 | { title: 'is_bot', value: user.isBot },
9 | { title: 'is_premium', value: user.isPremium },
10 | { title: 'language_code', value: user.languageCode },
11 | { title: 'allows_to_write_to_pm', value: user.allowsWriteToPm },
12 | { title: 'added_to_attachment_menu', value: user.addedToAttachmentMenu },
13 | ];
14 | }
15 |
16 | function InitDataPage(context) {
17 | PageComponent.call(this, new Page({ title: 'Init Data' }));
18 |
19 | var initDataRaw = context.launchParams.initDataRaw;
20 | var initData = context.initData;
21 |
22 | var initDataRows = (initData && initDataRaw) ? [
23 | { title: 'raw', value: initDataRaw },
24 | { title: 'auth_date', value: initData.authDate.toLocaleString() },
25 | { title: 'auth_date (raw)', value: initData.authDate.getTime() / 1000 },
26 | { title: 'hash', value: initData.hash },
27 | { title: 'can_send_after', value: initData.canSendAfterDate ? initData.canSendAfterDate.toISOString() : undefined },
28 | { title: 'can_send_after (raw)', value: initData.canSendAfter },
29 | { title: 'query_id', value: initData.queryId },
30 | { title: 'start_param', value: initData.startParam },
31 | { title: 'chat_type', value: initData.chatType },
32 | { title: 'chat_instance', value: initData.chatInstance },
33 | ] : undefined;
34 |
35 | var userRows = (initData && initData.user) ? getUserRows(initData.user) : undefined;
36 | var receiverRows = (initData && initData.receiver) ? getUserRows(initData.receiver) : undefined;
37 | var chatRows = (initData && initData.chat) ? [
38 | { title: 'id', value: initData.chat.id.toString() },
39 | { title: 'title', value: initData.chat.title },
40 | { title: 'type', value: initData.chat.type },
41 | { title: 'username', value: initData.chat.username },
42 | { title: 'photo_url', value: initData.chat.photoUrl },
43 | ] : undefined;
44 |
45 | this.page
46 | .setDisclaimer([
47 | 'This page displays application ',
48 | new Link({
49 | href: 'https://docs.telegram-mini-apps.com/platform/init-data',
50 | }, context)
51 | .appendChild('init data')
52 | .element(),
53 | '.',
54 | ]).appendChild(
55 | initDataRows ? [
56 | $('').append(
57 | 'Init data
',
58 | new DisplayData({ rows: initDataRows }).element()
59 | ),
60 | $('').append(
61 | 'User
',
62 | userRows ? new DisplayData({ rows: userRows }).element() : 'User information missing'
63 | ),
64 | $('').append(
65 | 'Receiver
',
66 | receiverRows ? new DisplayData({ rows: receiverRows }).element() : 'Receiver information missing'
67 | ),
68 | $('').append(
69 | 'Chat
',
70 | chatRows ? new DisplayData({ rows: chatRows }).element() : 'Chat information missing'
71 | ),
72 | ] : $('Application was launched with missing init data')
73 | );
74 | }
75 |
76 | InitDataPage.prototype = Object.create(PageComponent.prototype);
77 | InitDataPage.prototype.constructor = InitDataPage;
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Vanilla JS example
2 |
3 | > [!WARNING]
4 | > This template is archived and is more likely to be out of date.
5 |
6 | > ⚠️ Please, avoid using vanilla JavaScript if possible on Telegram Mini Apps
7 | > platform. It is better to use ES modules at least. [Learn more](#about-iife).
8 |
9 | This example shows how developer could use Vanilla JavaScript to start developing at
10 | Telegram Mini Apps platform.
11 |
12 | This template demonstrates how developers can implement an application on the Telegram
13 | Mini Apps platform using the following technologies and libraries
14 |
15 | - [TON Connect](https://docs.ton.org/develop/dapps/ton-connect/overview)
16 | - [@telegram-apps SDK](https://docs.telegram-mini-apps.com/packages/telegram-apps-sdk)
17 |
18 | > This boilerplate was created using [pnpm](https://pnpm.io/). Therefore, it is required to use
19 | > it for this project as well.
20 |
21 | ## Install Dependencies
22 |
23 | If you have just cloned this template, you should install the project dependencies using the
24 | command:
25 |
26 | ```Bash
27 | pnpm install
28 | ```
29 |
30 | ## Scripts
31 |
32 | This project contains the following scripts:
33 |
34 | - `serve`. Runs the HTTP server to serve `./dist/index.html`.
35 | - `tunnel`. Runs tunnel to locally launched HTTP server.
36 |
37 | `tunnel` command will return a URL which has to be used by [@BotFather](https://t.me/botfather). Bind
38 | it to your Mini App and open the application.
39 |
40 | To run a script, use the `pnpm run` command:
41 |
42 | ```Bash
43 | pnpm run {script}
44 | # Example: pnpm run serve
45 | ```
46 |
47 | ## Create Bot and Mini App
48 |
49 | Before you start, make sure you have already created a Telegram Bot. Here is
50 | a [comprehensive guide](https://docs.telegram-mini-apps.com/platform/creating-new-app) on how to
51 | do it.
52 |
53 | ## Run
54 |
55 | Although Mini Apps are designed to be opened
56 | within [Telegram applications](https://docs.telegram-mini-apps.com/platform/about#supported-applications),
57 | you can still develop and test them outside of Telegram during the development process.
58 |
59 | To serve `./dist/index.html`, use the `serve` script:
60 |
61 | ```bash
62 | pnpm run serve
63 | ```
64 |
65 | After this, you will see a similar message in your terminal:
66 |
67 | ```bash
68 | Serving!
69 | - Local: http://localhost:3000
70 | - Network: http://192.168.0.117:3000
71 | ```
72 |
73 | Here, you can see the `Local` link, available locally, and `Network` links accessible to all
74 | devices in the same network with the current device.
75 |
76 | To view the application, you need to open the `Local`
77 | link (`http://localhost:3000` in this example) in your browser.
78 |
79 | It is important to note that some libraries in this template, such as `@telegram-apps/sdk`, are not
80 | intended for use outside of Telegram.
81 |
82 | Nevertheless, they appear to function properly. This is because the `dist/js/mockEnv.ts` file, which is
83 | imported in the application's entry point (`dist/index.html`), employs the `mockTelegramEnv` function
84 | to simulate the Telegram environment. This trick convinces the application that it is running in a
85 | Telegram-based environment. Therefore, be cautious not to use this function in production mode
86 | unless you fully understand its implications.
87 |
88 | ### Run Inside Telegram
89 |
90 | Although it is possible to run the application outside of Telegram, it is recommended to develop it
91 | within Telegram for the most accurate representation of its real-world functionality.
92 |
93 | To run the application inside Telegram, [@BotFather](https://t.me/botfather) requires an HTTPS link.
94 |
95 | This template already provides a solution.
96 |
97 | Run next script:
98 |
99 | ```bash
100 | pnpm run tunnel
101 | ```
102 |
103 | After this, you will see a similar message in your terminal:
104 |
105 | ```bash
106 | your url is: https://odd-yaks-smash.loca.lt
107 | ```
108 |
109 | Once the application is displayed correctly, submit one of the `Network` links as the Mini App link
110 | to [@BotFather](https://t.me/botfather). Then, navigate
111 | to [https://web.telegram.org/k/](https://web.telegram.org/k/), find your bot, and launch the
112 | Telegram Mini App. This approach provides the full development experience.
113 |
114 | ## About IIFE
115 |
116 | ### Dependencies
117 |
118 | Some of the packages use other `@tma.js` packages as dependencies. In this case there are 2
119 | ways of importing them:
120 |
121 | 1. **By inserting another `script` tag which loads the dependency**.
122 | This way makes usage of package with a lot of dependencies almost unreal.
123 | 2. **By inlining these packages**.
124 | This way leads to code duplication between several packages using the same package as dependency.
125 |
126 | As you can see, there is no optimal solution between both of them. As the additional problem
127 | developer gets here, is bundler is unable to
128 | use [tree shaking](https://stackoverflow.com/questions/45884414/what-is-tree-shaking-and-why-would-i-need-it),
129 | making browser to load the code not used in the application. Imagine using the only 1 function from
130 | some library like `lodash`, but fully load it.
131 |
132 | ### Unknown target
133 |
134 | The other problem developer can face is IIFE packages are built for the specific browser of specific
135 | version. So, the package author does not know which target he should choose as long as he doesn't
136 | know it when creating such package. That's why the the package target should be lowered to support
137 | most part of browsers, but this also make final bunlde bigger.
138 |
139 | ### Conclusion
140 |
141 | Unfortunately, developer is unable to avoid these problems when using IIFE format. This is the
142 | reason why it is recommended to use modern technologies along with ESM format.
143 |
144 | ### When there is no other choice
145 |
146 | First of all, it is required to load the package. Developer could use [JSDelivr](https://www.jsdelivr.com/)
147 | to do it:
148 |
149 | ```html
150 |
151 |
152 |
153 |
154 | ```
155 |
156 | Loaded packages of `@telegram-apps` in IIFE format are accessible by path `window.telegramApps.*`:
157 |
158 | ```html
159 |
160 |
161 |
162 |
163 |
164 |
168 |
169 | ```
170 |
171 | > ⚠️ In this example we did not specify the exact version of required package. In this case,
172 | > JSDelivr CDN will return the latest version of the package which in some cases may lead to
173 | > unexpected behavior. To prevent such case, specify the exact version.
174 |
175 |
176 |
177 | ## Deploy
178 |
179 | This boilerplate uses GitHub Pages as the way to host the application externally. GitHub Pages
180 | provides a CDN which will let your users receive the application rapidly. Alternatively, you could
181 | use such services as [Heroku](https://www.heroku.com/) or [Vercel](https://vercel.com).
182 |
183 | ### Manual Deployment
184 |
185 | This boilerplate uses the [gh-pages](https://www.npmjs.com/package/gh-pages) tool, which allows
186 | deploying your application right from your PC.
187 |
188 | #### Configuring
189 |
190 | Before running the deployment process, ensure that you have done the following:
191 |
192 | 1. Replaced the `homepage` value in `package.json`. The GitHub Pages deploy tool uses this value to
193 | determine the related GitHub project.
194 |
195 | For instance, if your GitHub username is `telegram-mini-apps` and the repository name
196 | is `is-awesome`, the value in the `homepage` field should be the following:
197 |
198 | ```json
199 | {
200 | "homepage": "https://telegram-mini-apps.github.io/is-awesome"
201 | }
202 | ```
203 |
204 | You can find more information on configuring the deployment in the `gh-pages`
205 | [docs](https://github.com/tschaub/gh-pages?tab=readme-ov-file#github-pages-project-sites).
206 |
207 | #### Before Deploying
208 |
209 | Then, run the deployment process, using the `deploy` script:
210 |
211 | ```Bash
212 | pnpm run deploy
213 | ```
214 |
215 | After the deployment completed successfully, visit the page with data according to your
216 | username and repository name. Here is the page link example using the data mentioned above:
217 | https://telegram-mini-apps.github.io/is-awesome
218 |
219 | ### GitHub Workflow
220 |
221 | To simplify the deployment process, this template includes a
222 | pre-configured [GitHub workflow](.github/workflows/github-pages-deploy.yml) that automatically
223 | deploys the project when changes are pushed to the `master` branch.
224 |
225 | To enable this workflow, create a new environment (or edit the existing one) in the GitHub
226 | repository settings and name it `github-pages`. Then, add the `master` branch to the list of
227 | deployment branches.
228 |
229 | You can find the environment settings using this
230 | URL: `https://github.com/{username}/{repository}/settings/environments`.
231 |
232 | 
233 |
234 | In case, you don't want to do it automatically, or you don't use GitHub as the project codebase,
235 | remove the `.github` directory.
236 |
237 | ### GitHub Web Interface
238 |
239 | Alternatively, developers can configure automatic deployment using the GitHub web interface. To do
240 | this, follow the link: `https://github.com/{username}/{repository}/settings/pages`.
241 |
242 | ## TON Connect
243 |
244 | This boilerplate utilizes the [TON Connect](https://docs.ton.org/develop/dapps/ton-connect/overview)
245 | project to demonstrate how developers can integrate functionality related to TON cryptocurrency.
246 |
247 | The TON Connect manifest used in this boilerplate is stored in the `dist` folder, where all
248 | publicly accessible static files are located. Remember
249 | to [configure](https://docs.ton.org/develop/dapps/ton-connect/manifest) this file according to your
250 | project's information.
251 |
252 | ## Useful Links
253 |
254 | - [Platform documentation](https://docs.telegram-mini-apps.com/)
255 | - [Telegram developers community chat](https://t.me/devs)
256 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '9.0'
2 |
3 | settings:
4 | autoInstallPeers: true
5 | excludeLinksFromLockfile: false
6 |
7 | importers:
8 |
9 | .:
10 | devDependencies:
11 | gh-pages:
12 | specifier: ^6.1.1
13 | version: 6.1.1
14 | localtunnel:
15 | specifier: ^2.0.2
16 | version: 2.0.2
17 | serve:
18 | specifier: ^14.2.1
19 | version: 14.2.1
20 |
21 | packages:
22 |
23 | '@zeit/schemas@2.29.0':
24 | resolution: {integrity: sha512-g5QiLIfbg3pLuYUJPlisNKY+epQJTcMDsOnVNkscrDP1oi7vmJnzOANYJI/1pZcVJ6umUkBv3aFtlg1UvUHGzA==}
25 |
26 | accepts@1.3.8:
27 | resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
28 | engines: {node: '>= 0.6'}
29 |
30 | ajv@8.11.0:
31 | resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==}
32 |
33 | ansi-align@3.0.1:
34 | resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==}
35 |
36 | ansi-regex@5.0.1:
37 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
38 | engines: {node: '>=8'}
39 |
40 | ansi-regex@6.0.1:
41 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
42 | engines: {node: '>=12'}
43 |
44 | ansi-styles@4.3.0:
45 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
46 | engines: {node: '>=8'}
47 |
48 | ansi-styles@6.2.1:
49 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
50 | engines: {node: '>=12'}
51 |
52 | arch@2.2.0:
53 | resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==}
54 |
55 | arg@5.0.2:
56 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
57 |
58 | array-union@1.0.2:
59 | resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==}
60 | engines: {node: '>=0.10.0'}
61 |
62 | array-uniq@1.0.3:
63 | resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==}
64 | engines: {node: '>=0.10.0'}
65 |
66 | async@3.2.5:
67 | resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==}
68 |
69 | axios@0.21.4:
70 | resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==}
71 |
72 | balanced-match@1.0.2:
73 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
74 |
75 | boxen@7.0.0:
76 | resolution: {integrity: sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==}
77 | engines: {node: '>=14.16'}
78 |
79 | brace-expansion@1.1.11:
80 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
81 |
82 | bytes@3.0.0:
83 | resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==}
84 | engines: {node: '>= 0.8'}
85 |
86 | camelcase@7.0.1:
87 | resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==}
88 | engines: {node: '>=14.16'}
89 |
90 | chalk-template@0.4.0:
91 | resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==}
92 | engines: {node: '>=12'}
93 |
94 | chalk@4.1.2:
95 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
96 | engines: {node: '>=10'}
97 |
98 | chalk@5.0.1:
99 | resolution: {integrity: sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==}
100 | engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
101 |
102 | cli-boxes@3.0.0:
103 | resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==}
104 | engines: {node: '>=10'}
105 |
106 | clipboardy@3.0.0:
107 | resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==}
108 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
109 |
110 | cliui@7.0.4:
111 | resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
112 |
113 | color-convert@2.0.1:
114 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
115 | engines: {node: '>=7.0.0'}
116 |
117 | color-name@1.1.4:
118 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
119 |
120 | commander@11.1.0:
121 | resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==}
122 | engines: {node: '>=16'}
123 |
124 | commondir@1.0.1:
125 | resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==}
126 |
127 | compressible@2.0.18:
128 | resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==}
129 | engines: {node: '>= 0.6'}
130 |
131 | compression@1.7.4:
132 | resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==}
133 | engines: {node: '>= 0.8.0'}
134 |
135 | concat-map@0.0.1:
136 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
137 |
138 | content-disposition@0.5.2:
139 | resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==}
140 | engines: {node: '>= 0.6'}
141 |
142 | cross-spawn@7.0.3:
143 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
144 | engines: {node: '>= 8'}
145 |
146 | debug@2.6.9:
147 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
148 | peerDependencies:
149 | supports-color: '*'
150 | peerDependenciesMeta:
151 | supports-color:
152 | optional: true
153 |
154 | debug@4.3.2:
155 | resolution: {integrity: sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==}
156 | engines: {node: '>=6.0'}
157 | peerDependencies:
158 | supports-color: '*'
159 | peerDependenciesMeta:
160 | supports-color:
161 | optional: true
162 |
163 | deep-extend@0.6.0:
164 | resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
165 | engines: {node: '>=4.0.0'}
166 |
167 | eastasianwidth@0.2.0:
168 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
169 |
170 | email-addresses@5.0.0:
171 | resolution: {integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==}
172 |
173 | emoji-regex@8.0.0:
174 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
175 |
176 | emoji-regex@9.2.2:
177 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
178 |
179 | escalade@3.1.1:
180 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
181 | engines: {node: '>=6'}
182 |
183 | escape-string-regexp@1.0.5:
184 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
185 | engines: {node: '>=0.8.0'}
186 |
187 | execa@5.1.1:
188 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
189 | engines: {node: '>=10'}
190 |
191 | fast-deep-equal@3.1.3:
192 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
193 |
194 | fast-url-parser@1.1.3:
195 | resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==}
196 |
197 | filename-reserved-regex@2.0.0:
198 | resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==}
199 | engines: {node: '>=4'}
200 |
201 | filenamify@4.3.0:
202 | resolution: {integrity: sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==}
203 | engines: {node: '>=8'}
204 |
205 | find-cache-dir@3.3.2:
206 | resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==}
207 | engines: {node: '>=8'}
208 |
209 | find-up@4.1.0:
210 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
211 | engines: {node: '>=8'}
212 |
213 | follow-redirects@1.15.3:
214 | resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==}
215 | engines: {node: '>=4.0'}
216 | peerDependencies:
217 | debug: '*'
218 | peerDependenciesMeta:
219 | debug:
220 | optional: true
221 |
222 | fs-extra@11.2.0:
223 | resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==}
224 | engines: {node: '>=14.14'}
225 |
226 | fs.realpath@1.0.0:
227 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
228 |
229 | get-caller-file@2.0.5:
230 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
231 | engines: {node: 6.* || 8.* || >= 10.*}
232 |
233 | get-stream@6.0.1:
234 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
235 | engines: {node: '>=10'}
236 |
237 | gh-pages@6.1.1:
238 | resolution: {integrity: sha512-upnohfjBwN5hBP9w2dPE7HO5JJTHzSGMV1JrLrHvNuqmjoYHg6TBrCcnEoorjG/e0ejbuvnwyKMdTyM40PEByw==}
239 | engines: {node: '>=10'}
240 | hasBin: true
241 |
242 | glob@7.2.3:
243 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
244 | deprecated: Glob versions prior to v9 are no longer supported
245 |
246 | globby@6.1.0:
247 | resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==}
248 | engines: {node: '>=0.10.0'}
249 |
250 | graceful-fs@4.2.11:
251 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
252 |
253 | has-flag@4.0.0:
254 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
255 | engines: {node: '>=8'}
256 |
257 | human-signals@2.1.0:
258 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
259 | engines: {node: '>=10.17.0'}
260 |
261 | inflight@1.0.6:
262 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
263 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
264 |
265 | inherits@2.0.4:
266 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
267 |
268 | ini@1.3.8:
269 | resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
270 |
271 | is-docker@2.2.1:
272 | resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
273 | engines: {node: '>=8'}
274 | hasBin: true
275 |
276 | is-fullwidth-code-point@3.0.0:
277 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
278 | engines: {node: '>=8'}
279 |
280 | is-port-reachable@4.0.0:
281 | resolution: {integrity: sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==}
282 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
283 |
284 | is-stream@2.0.1:
285 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
286 | engines: {node: '>=8'}
287 |
288 | is-wsl@2.2.0:
289 | resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
290 | engines: {node: '>=8'}
291 |
292 | isexe@2.0.0:
293 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
294 |
295 | json-schema-traverse@1.0.0:
296 | resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
297 |
298 | jsonfile@6.1.0:
299 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
300 |
301 | localtunnel@2.0.2:
302 | resolution: {integrity: sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==}
303 | engines: {node: '>=8.3.0'}
304 | hasBin: true
305 |
306 | locate-path@5.0.0:
307 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
308 | engines: {node: '>=8'}
309 |
310 | make-dir@3.1.0:
311 | resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
312 | engines: {node: '>=8'}
313 |
314 | merge-stream@2.0.0:
315 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
316 |
317 | mime-db@1.33.0:
318 | resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==}
319 | engines: {node: '>= 0.6'}
320 |
321 | mime-db@1.52.0:
322 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
323 | engines: {node: '>= 0.6'}
324 |
325 | mime-types@2.1.18:
326 | resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==}
327 | engines: {node: '>= 0.6'}
328 |
329 | mime-types@2.1.35:
330 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
331 | engines: {node: '>= 0.6'}
332 |
333 | mimic-fn@2.1.0:
334 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
335 | engines: {node: '>=6'}
336 |
337 | minimatch@3.1.2:
338 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
339 |
340 | minimist@1.2.8:
341 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
342 |
343 | ms@2.0.0:
344 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
345 |
346 | ms@2.1.2:
347 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
348 |
349 | negotiator@0.6.3:
350 | resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
351 | engines: {node: '>= 0.6'}
352 |
353 | npm-run-path@4.0.1:
354 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
355 | engines: {node: '>=8'}
356 |
357 | object-assign@4.1.1:
358 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
359 | engines: {node: '>=0.10.0'}
360 |
361 | on-headers@1.0.2:
362 | resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==}
363 | engines: {node: '>= 0.8'}
364 |
365 | once@1.4.0:
366 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
367 |
368 | onetime@5.1.2:
369 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
370 | engines: {node: '>=6'}
371 |
372 | openurl@1.1.1:
373 | resolution: {integrity: sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==}
374 |
375 | p-limit@2.3.0:
376 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
377 | engines: {node: '>=6'}
378 |
379 | p-locate@4.1.0:
380 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
381 | engines: {node: '>=8'}
382 |
383 | p-try@2.2.0:
384 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
385 | engines: {node: '>=6'}
386 |
387 | path-exists@4.0.0:
388 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
389 | engines: {node: '>=8'}
390 |
391 | path-is-absolute@1.0.1:
392 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
393 | engines: {node: '>=0.10.0'}
394 |
395 | path-is-inside@1.0.2:
396 | resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==}
397 |
398 | path-key@3.1.1:
399 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
400 | engines: {node: '>=8'}
401 |
402 | path-to-regexp@2.2.1:
403 | resolution: {integrity: sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==}
404 |
405 | pify@2.3.0:
406 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
407 | engines: {node: '>=0.10.0'}
408 |
409 | pinkie-promise@2.0.1:
410 | resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==}
411 | engines: {node: '>=0.10.0'}
412 |
413 | pinkie@2.0.4:
414 | resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==}
415 | engines: {node: '>=0.10.0'}
416 |
417 | pkg-dir@4.2.0:
418 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
419 | engines: {node: '>=8'}
420 |
421 | punycode@1.4.1:
422 | resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
423 |
424 | punycode@2.3.1:
425 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
426 | engines: {node: '>=6'}
427 |
428 | range-parser@1.2.0:
429 | resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==}
430 | engines: {node: '>= 0.6'}
431 |
432 | rc@1.2.8:
433 | resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
434 | hasBin: true
435 |
436 | registry-auth-token@3.3.2:
437 | resolution: {integrity: sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==}
438 |
439 | registry-url@3.1.0:
440 | resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==}
441 | engines: {node: '>=0.10.0'}
442 |
443 | require-directory@2.1.1:
444 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
445 | engines: {node: '>=0.10.0'}
446 |
447 | require-from-string@2.0.2:
448 | resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
449 | engines: {node: '>=0.10.0'}
450 |
451 | safe-buffer@5.1.2:
452 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
453 |
454 | safe-buffer@5.2.1:
455 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
456 |
457 | semver@6.3.1:
458 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
459 | hasBin: true
460 |
461 | serve-handler@6.1.5:
462 | resolution: {integrity: sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==}
463 |
464 | serve@14.2.1:
465 | resolution: {integrity: sha512-48er5fzHh7GCShLnNyPBRPEjs2I6QBozeGr02gaacROiyS/8ARADlj595j39iZXAqBbJHH/ivJJyPRWY9sQWZA==}
466 | engines: {node: '>= 14'}
467 | hasBin: true
468 |
469 | shebang-command@2.0.0:
470 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
471 | engines: {node: '>=8'}
472 |
473 | shebang-regex@3.0.0:
474 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
475 | engines: {node: '>=8'}
476 |
477 | signal-exit@3.0.7:
478 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
479 |
480 | string-width@4.2.3:
481 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
482 | engines: {node: '>=8'}
483 |
484 | string-width@5.1.2:
485 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
486 | engines: {node: '>=12'}
487 |
488 | strip-ansi@6.0.1:
489 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
490 | engines: {node: '>=8'}
491 |
492 | strip-ansi@7.1.0:
493 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
494 | engines: {node: '>=12'}
495 |
496 | strip-final-newline@2.0.0:
497 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
498 | engines: {node: '>=6'}
499 |
500 | strip-json-comments@2.0.1:
501 | resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
502 | engines: {node: '>=0.10.0'}
503 |
504 | strip-outer@1.0.1:
505 | resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==}
506 | engines: {node: '>=0.10.0'}
507 |
508 | supports-color@7.2.0:
509 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
510 | engines: {node: '>=8'}
511 |
512 | trim-repeated@1.0.0:
513 | resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==}
514 | engines: {node: '>=0.10.0'}
515 |
516 | type-fest@2.19.0:
517 | resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
518 | engines: {node: '>=12.20'}
519 |
520 | universalify@2.0.1:
521 | resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
522 | engines: {node: '>= 10.0.0'}
523 |
524 | update-check@1.5.4:
525 | resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==}
526 |
527 | uri-js@4.4.1:
528 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
529 |
530 | vary@1.1.2:
531 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
532 | engines: {node: '>= 0.8'}
533 |
534 | which@2.0.2:
535 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
536 | engines: {node: '>= 8'}
537 | hasBin: true
538 |
539 | widest-line@4.0.1:
540 | resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==}
541 | engines: {node: '>=12'}
542 |
543 | wrap-ansi@7.0.0:
544 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
545 | engines: {node: '>=10'}
546 |
547 | wrap-ansi@8.1.0:
548 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
549 | engines: {node: '>=12'}
550 |
551 | wrappy@1.0.2:
552 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
553 |
554 | y18n@5.0.8:
555 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
556 | engines: {node: '>=10'}
557 |
558 | yargs-parser@20.2.9:
559 | resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
560 | engines: {node: '>=10'}
561 |
562 | yargs@17.1.1:
563 | resolution: {integrity: sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==}
564 | engines: {node: '>=12'}
565 |
566 | snapshots:
567 |
568 | '@zeit/schemas@2.29.0': {}
569 |
570 | accepts@1.3.8:
571 | dependencies:
572 | mime-types: 2.1.35
573 | negotiator: 0.6.3
574 |
575 | ajv@8.11.0:
576 | dependencies:
577 | fast-deep-equal: 3.1.3
578 | json-schema-traverse: 1.0.0
579 | require-from-string: 2.0.2
580 | uri-js: 4.4.1
581 |
582 | ansi-align@3.0.1:
583 | dependencies:
584 | string-width: 4.2.3
585 |
586 | ansi-regex@5.0.1: {}
587 |
588 | ansi-regex@6.0.1: {}
589 |
590 | ansi-styles@4.3.0:
591 | dependencies:
592 | color-convert: 2.0.1
593 |
594 | ansi-styles@6.2.1: {}
595 |
596 | arch@2.2.0: {}
597 |
598 | arg@5.0.2: {}
599 |
600 | array-union@1.0.2:
601 | dependencies:
602 | array-uniq: 1.0.3
603 |
604 | array-uniq@1.0.3: {}
605 |
606 | async@3.2.5: {}
607 |
608 | axios@0.21.4(debug@4.3.2):
609 | dependencies:
610 | follow-redirects: 1.15.3(debug@4.3.2)
611 | transitivePeerDependencies:
612 | - debug
613 |
614 | balanced-match@1.0.2: {}
615 |
616 | boxen@7.0.0:
617 | dependencies:
618 | ansi-align: 3.0.1
619 | camelcase: 7.0.1
620 | chalk: 5.0.1
621 | cli-boxes: 3.0.0
622 | string-width: 5.1.2
623 | type-fest: 2.19.0
624 | widest-line: 4.0.1
625 | wrap-ansi: 8.1.0
626 |
627 | brace-expansion@1.1.11:
628 | dependencies:
629 | balanced-match: 1.0.2
630 | concat-map: 0.0.1
631 |
632 | bytes@3.0.0: {}
633 |
634 | camelcase@7.0.1: {}
635 |
636 | chalk-template@0.4.0:
637 | dependencies:
638 | chalk: 4.1.2
639 |
640 | chalk@4.1.2:
641 | dependencies:
642 | ansi-styles: 4.3.0
643 | supports-color: 7.2.0
644 |
645 | chalk@5.0.1: {}
646 |
647 | cli-boxes@3.0.0: {}
648 |
649 | clipboardy@3.0.0:
650 | dependencies:
651 | arch: 2.2.0
652 | execa: 5.1.1
653 | is-wsl: 2.2.0
654 |
655 | cliui@7.0.4:
656 | dependencies:
657 | string-width: 4.2.3
658 | strip-ansi: 6.0.1
659 | wrap-ansi: 7.0.0
660 |
661 | color-convert@2.0.1:
662 | dependencies:
663 | color-name: 1.1.4
664 |
665 | color-name@1.1.4: {}
666 |
667 | commander@11.1.0: {}
668 |
669 | commondir@1.0.1: {}
670 |
671 | compressible@2.0.18:
672 | dependencies:
673 | mime-db: 1.52.0
674 |
675 | compression@1.7.4:
676 | dependencies:
677 | accepts: 1.3.8
678 | bytes: 3.0.0
679 | compressible: 2.0.18
680 | debug: 2.6.9
681 | on-headers: 1.0.2
682 | safe-buffer: 5.1.2
683 | vary: 1.1.2
684 | transitivePeerDependencies:
685 | - supports-color
686 |
687 | concat-map@0.0.1: {}
688 |
689 | content-disposition@0.5.2: {}
690 |
691 | cross-spawn@7.0.3:
692 | dependencies:
693 | path-key: 3.1.1
694 | shebang-command: 2.0.0
695 | which: 2.0.2
696 |
697 | debug@2.6.9:
698 | dependencies:
699 | ms: 2.0.0
700 |
701 | debug@4.3.2:
702 | dependencies:
703 | ms: 2.1.2
704 |
705 | deep-extend@0.6.0: {}
706 |
707 | eastasianwidth@0.2.0: {}
708 |
709 | email-addresses@5.0.0: {}
710 |
711 | emoji-regex@8.0.0: {}
712 |
713 | emoji-regex@9.2.2: {}
714 |
715 | escalade@3.1.1: {}
716 |
717 | escape-string-regexp@1.0.5: {}
718 |
719 | execa@5.1.1:
720 | dependencies:
721 | cross-spawn: 7.0.3
722 | get-stream: 6.0.1
723 | human-signals: 2.1.0
724 | is-stream: 2.0.1
725 | merge-stream: 2.0.0
726 | npm-run-path: 4.0.1
727 | onetime: 5.1.2
728 | signal-exit: 3.0.7
729 | strip-final-newline: 2.0.0
730 |
731 | fast-deep-equal@3.1.3: {}
732 |
733 | fast-url-parser@1.1.3:
734 | dependencies:
735 | punycode: 1.4.1
736 |
737 | filename-reserved-regex@2.0.0: {}
738 |
739 | filenamify@4.3.0:
740 | dependencies:
741 | filename-reserved-regex: 2.0.0
742 | strip-outer: 1.0.1
743 | trim-repeated: 1.0.0
744 |
745 | find-cache-dir@3.3.2:
746 | dependencies:
747 | commondir: 1.0.1
748 | make-dir: 3.1.0
749 | pkg-dir: 4.2.0
750 |
751 | find-up@4.1.0:
752 | dependencies:
753 | locate-path: 5.0.0
754 | path-exists: 4.0.0
755 |
756 | follow-redirects@1.15.3(debug@4.3.2):
757 | optionalDependencies:
758 | debug: 4.3.2
759 |
760 | fs-extra@11.2.0:
761 | dependencies:
762 | graceful-fs: 4.2.11
763 | jsonfile: 6.1.0
764 | universalify: 2.0.1
765 |
766 | fs.realpath@1.0.0: {}
767 |
768 | get-caller-file@2.0.5: {}
769 |
770 | get-stream@6.0.1: {}
771 |
772 | gh-pages@6.1.1:
773 | dependencies:
774 | async: 3.2.5
775 | commander: 11.1.0
776 | email-addresses: 5.0.0
777 | filenamify: 4.3.0
778 | find-cache-dir: 3.3.2
779 | fs-extra: 11.2.0
780 | globby: 6.1.0
781 |
782 | glob@7.2.3:
783 | dependencies:
784 | fs.realpath: 1.0.0
785 | inflight: 1.0.6
786 | inherits: 2.0.4
787 | minimatch: 3.1.2
788 | once: 1.4.0
789 | path-is-absolute: 1.0.1
790 |
791 | globby@6.1.0:
792 | dependencies:
793 | array-union: 1.0.2
794 | glob: 7.2.3
795 | object-assign: 4.1.1
796 | pify: 2.3.0
797 | pinkie-promise: 2.0.1
798 |
799 | graceful-fs@4.2.11: {}
800 |
801 | has-flag@4.0.0: {}
802 |
803 | human-signals@2.1.0: {}
804 |
805 | inflight@1.0.6:
806 | dependencies:
807 | once: 1.4.0
808 | wrappy: 1.0.2
809 |
810 | inherits@2.0.4: {}
811 |
812 | ini@1.3.8: {}
813 |
814 | is-docker@2.2.1: {}
815 |
816 | is-fullwidth-code-point@3.0.0: {}
817 |
818 | is-port-reachable@4.0.0: {}
819 |
820 | is-stream@2.0.1: {}
821 |
822 | is-wsl@2.2.0:
823 | dependencies:
824 | is-docker: 2.2.1
825 |
826 | isexe@2.0.0: {}
827 |
828 | json-schema-traverse@1.0.0: {}
829 |
830 | jsonfile@6.1.0:
831 | dependencies:
832 | universalify: 2.0.1
833 | optionalDependencies:
834 | graceful-fs: 4.2.11
835 |
836 | localtunnel@2.0.2:
837 | dependencies:
838 | axios: 0.21.4(debug@4.3.2)
839 | debug: 4.3.2
840 | openurl: 1.1.1
841 | yargs: 17.1.1
842 | transitivePeerDependencies:
843 | - supports-color
844 |
845 | locate-path@5.0.0:
846 | dependencies:
847 | p-locate: 4.1.0
848 |
849 | make-dir@3.1.0:
850 | dependencies:
851 | semver: 6.3.1
852 |
853 | merge-stream@2.0.0: {}
854 |
855 | mime-db@1.33.0: {}
856 |
857 | mime-db@1.52.0: {}
858 |
859 | mime-types@2.1.18:
860 | dependencies:
861 | mime-db: 1.33.0
862 |
863 | mime-types@2.1.35:
864 | dependencies:
865 | mime-db: 1.52.0
866 |
867 | mimic-fn@2.1.0: {}
868 |
869 | minimatch@3.1.2:
870 | dependencies:
871 | brace-expansion: 1.1.11
872 |
873 | minimist@1.2.8: {}
874 |
875 | ms@2.0.0: {}
876 |
877 | ms@2.1.2: {}
878 |
879 | negotiator@0.6.3: {}
880 |
881 | npm-run-path@4.0.1:
882 | dependencies:
883 | path-key: 3.1.1
884 |
885 | object-assign@4.1.1: {}
886 |
887 | on-headers@1.0.2: {}
888 |
889 | once@1.4.0:
890 | dependencies:
891 | wrappy: 1.0.2
892 |
893 | onetime@5.1.2:
894 | dependencies:
895 | mimic-fn: 2.1.0
896 |
897 | openurl@1.1.1: {}
898 |
899 | p-limit@2.3.0:
900 | dependencies:
901 | p-try: 2.2.0
902 |
903 | p-locate@4.1.0:
904 | dependencies:
905 | p-limit: 2.3.0
906 |
907 | p-try@2.2.0: {}
908 |
909 | path-exists@4.0.0: {}
910 |
911 | path-is-absolute@1.0.1: {}
912 |
913 | path-is-inside@1.0.2: {}
914 |
915 | path-key@3.1.1: {}
916 |
917 | path-to-regexp@2.2.1: {}
918 |
919 | pify@2.3.0: {}
920 |
921 | pinkie-promise@2.0.1:
922 | dependencies:
923 | pinkie: 2.0.4
924 |
925 | pinkie@2.0.4: {}
926 |
927 | pkg-dir@4.2.0:
928 | dependencies:
929 | find-up: 4.1.0
930 |
931 | punycode@1.4.1: {}
932 |
933 | punycode@2.3.1: {}
934 |
935 | range-parser@1.2.0: {}
936 |
937 | rc@1.2.8:
938 | dependencies:
939 | deep-extend: 0.6.0
940 | ini: 1.3.8
941 | minimist: 1.2.8
942 | strip-json-comments: 2.0.1
943 |
944 | registry-auth-token@3.3.2:
945 | dependencies:
946 | rc: 1.2.8
947 | safe-buffer: 5.2.1
948 |
949 | registry-url@3.1.0:
950 | dependencies:
951 | rc: 1.2.8
952 |
953 | require-directory@2.1.1: {}
954 |
955 | require-from-string@2.0.2: {}
956 |
957 | safe-buffer@5.1.2: {}
958 |
959 | safe-buffer@5.2.1: {}
960 |
961 | semver@6.3.1: {}
962 |
963 | serve-handler@6.1.5:
964 | dependencies:
965 | bytes: 3.0.0
966 | content-disposition: 0.5.2
967 | fast-url-parser: 1.1.3
968 | mime-types: 2.1.18
969 | minimatch: 3.1.2
970 | path-is-inside: 1.0.2
971 | path-to-regexp: 2.2.1
972 | range-parser: 1.2.0
973 |
974 | serve@14.2.1:
975 | dependencies:
976 | '@zeit/schemas': 2.29.0
977 | ajv: 8.11.0
978 | arg: 5.0.2
979 | boxen: 7.0.0
980 | chalk: 5.0.1
981 | chalk-template: 0.4.0
982 | clipboardy: 3.0.0
983 | compression: 1.7.4
984 | is-port-reachable: 4.0.0
985 | serve-handler: 6.1.5
986 | update-check: 1.5.4
987 | transitivePeerDependencies:
988 | - supports-color
989 |
990 | shebang-command@2.0.0:
991 | dependencies:
992 | shebang-regex: 3.0.0
993 |
994 | shebang-regex@3.0.0: {}
995 |
996 | signal-exit@3.0.7: {}
997 |
998 | string-width@4.2.3:
999 | dependencies:
1000 | emoji-regex: 8.0.0
1001 | is-fullwidth-code-point: 3.0.0
1002 | strip-ansi: 6.0.1
1003 |
1004 | string-width@5.1.2:
1005 | dependencies:
1006 | eastasianwidth: 0.2.0
1007 | emoji-regex: 9.2.2
1008 | strip-ansi: 7.1.0
1009 |
1010 | strip-ansi@6.0.1:
1011 | dependencies:
1012 | ansi-regex: 5.0.1
1013 |
1014 | strip-ansi@7.1.0:
1015 | dependencies:
1016 | ansi-regex: 6.0.1
1017 |
1018 | strip-final-newline@2.0.0: {}
1019 |
1020 | strip-json-comments@2.0.1: {}
1021 |
1022 | strip-outer@1.0.1:
1023 | dependencies:
1024 | escape-string-regexp: 1.0.5
1025 |
1026 | supports-color@7.2.0:
1027 | dependencies:
1028 | has-flag: 4.0.0
1029 |
1030 | trim-repeated@1.0.0:
1031 | dependencies:
1032 | escape-string-regexp: 1.0.5
1033 |
1034 | type-fest@2.19.0: {}
1035 |
1036 | universalify@2.0.1: {}
1037 |
1038 | update-check@1.5.4:
1039 | dependencies:
1040 | registry-auth-token: 3.3.2
1041 | registry-url: 3.1.0
1042 |
1043 | uri-js@4.4.1:
1044 | dependencies:
1045 | punycode: 2.3.1
1046 |
1047 | vary@1.1.2: {}
1048 |
1049 | which@2.0.2:
1050 | dependencies:
1051 | isexe: 2.0.0
1052 |
1053 | widest-line@4.0.1:
1054 | dependencies:
1055 | string-width: 5.1.2
1056 |
1057 | wrap-ansi@7.0.0:
1058 | dependencies:
1059 | ansi-styles: 4.3.0
1060 | string-width: 4.2.3
1061 | strip-ansi: 6.0.1
1062 |
1063 | wrap-ansi@8.1.0:
1064 | dependencies:
1065 | ansi-styles: 6.2.1
1066 | string-width: 5.1.2
1067 | strip-ansi: 7.1.0
1068 |
1069 | wrappy@1.0.2: {}
1070 |
1071 | y18n@5.0.8: {}
1072 |
1073 | yargs-parser@20.2.9: {}
1074 |
1075 | yargs@17.1.1:
1076 | dependencies:
1077 | cliui: 7.0.4
1078 | escalade: 3.1.1
1079 | get-caller-file: 2.0.5
1080 | require-directory: 2.1.1
1081 | string-width: 4.2.3
1082 | y18n: 5.0.8
1083 | yargs-parser: 20.2.9
1084 |
--------------------------------------------------------------------------------