Add comment component

* add in browser view hook
This commit is contained in:
DefectingCat
2022-01-20 13:55:27 +08:00
parent 5636cc167f
commit 754c166015
11 changed files with 361 additions and 15 deletions

View File

@ -0,0 +1,7 @@
import React from 'react';
const PostCommentLoading = () => {
return <div>loading...</div>;
};
export default PostCommentLoading;

View File

@ -0,0 +1,56 @@
import { FC, useCallback, useEffect, useState } from 'react';
import { Giscus } from '@giscus/react';
import dynamic from 'next/dynamic';
import cn from 'classnames';
import useDarkMode from '../../lib/hooks/useDarkMode';
const PostCommentLoading = dynamic(
() => import('components/loading/PostCommentLoading')
);
const ready = /\[iFrameSizer\]\iFrameResizer.*?\:init/;
const PostComment: FC = () => {
const [commentLoaded, setCommentLoaded] = useState(false);
const { isDark } = useDarkMode();
/**
* Listen the window.parent.postMessage() from Giscus componenet.
* When get the message, its mean Giscus component loading completed.
*/
const handleMessage = useCallback((event: MessageEvent) => {
if (event.origin === 'https://giscus.app' && ready.test(event.data)) {
setCommentLoaded(true);
}
// if (!(typeof event.data === 'object' && event.data.giscus)) return;
// const giscusData = event.data.giscus;
}, []);
useEffect(() => {
window.addEventListener('message', handleMessage);
return () => {
window.removeEventListener('message', handleMessage);
};
}, [handleMessage]);
return (
<>
<div className={cn('mt-8', { hidden: !commentLoaded })}>
<Giscus
repo="DefectingCat/DefectingCat.github.io"
repoId={process.env.REPO_ID ?? ''}
categoryId={process.env.CATEGORY_ID ?? ''}
category="Announcements"
mapping="title"
reactionsEnabled="1"
emitMetadata="0"
theme={isDark ? 'dark_dimmed' : 'light'}
/>
</div>
{commentLoaded || <PostCommentLoading />}
</>
);
};
export default PostComment;

View File

@ -8,16 +8,13 @@ interface Props {
}
const PostIframe: FC<Props> = ({ src }) => {
const { initSrc, blur, targetRef } = useLazyLoad(src);
const { initSrc, targetRef } = useLazyLoad(src);
const isLargerThan640 = useMediaQuery('(min-width: 640px)');
return (
<div
className={cn(
'rounded-md overflow-hidden',
{
blur: blur,
},
{ 'aspect-video': isLargerThan640 },
{ 'aspect-square': !isLargerThan640 }
)}

25
lib/hooks/useInView.ts Normal file
View File

@ -0,0 +1,25 @@
import { useEffect, useRef, useState } from 'react';
const useInView = () => {
const targetRef = useRef(null);
const [inView, setInView] = useState(false);
useEffect(() => {
const observer = new IntersectionObserver((entries, observer) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
if (targetRef.current) {
setInView(true);
observer.unobserve(targetRef.current);
}
}
});
});
targetRef.current && observer.observe(targetRef.current);
}, []);
return { targetRef, inView };
};
export default useInView;

View File

@ -10,10 +10,14 @@
"test:coverage": "CI=true yarn test --env=jsdom --coverage"
},
"dependencies": {
"@giscus/react": "^1.0.1",
"@mdx-js/loader": "^1.6.22",
"@mdx-js/react": "^1.6.22",
"@next/mdx": "^12.0.8",
"algoliasearch": "^4.12.0",
"classnames": "^2.3.1",
"date-fns": "^2.28.0",
"gray-matter": "^4.0.3",
"highlight.js": "^11.3.1",
"next": "12.0.8",
"react": "^17.0.2",
@ -33,10 +37,8 @@
"remark-rehype": "^10.0.1",
"remark-toc": "^8.0.1",
"sharp": "^0.29.3",
"unified": "^10.1.0",
"strip-markdown": "^5.0.0",
"classnames": "^2.3.1",
"gray-matter": "^4.0.3"
"unified": "^10.1.0"
},
"devDependencies": {
"@testing-library/jest-dom": "^5.16.1",
@ -47,6 +49,7 @@
"@types/react": "17.0.38",
"@types/react-stickynode": "^4.0.0",
"autoprefixer": "^10.4.2",
"dotenv": "^14.2.0",
"eslint": "8.6.0",
"eslint-config-next": "12.0.8",
"jest": "^27.4.7",

View File

@ -3,11 +3,10 @@ import 'styles/rua.css';
import type { AppProps } from 'next/app';
import { NextPage } from 'next';
import { ReactElement, ReactNode } from 'react';
import useRouterLoading from 'lib/hooks/useRouteLoading';
import Head from 'next/head';
import { MDXProvider } from '@mdx-js/react';
import dynamic from 'next/dynamic';
import RUAStore from '../lib/store';
import RUAStore from 'lib/store';
const H2 = dynamic(() => import('components/MDX/MDXH2'));
@ -26,7 +25,6 @@ type AppPropsWithLayout = AppProps & {
function MyApp({ Component, pageProps }: AppPropsWithLayout) {
const getLayout = Component.getLayout ?? ((page) => page);
const [loading] = useRouterLoading();
return (
<>

View File

@ -22,6 +22,7 @@ import Sticky from 'react-stickynode';
import useMediaQuery from 'lib/hooks/useMediaQuery';
import { useRUAContext } from 'lib/store';
import Link from 'next/link';
import useInView from 'lib/hooks/useInView';
const Button = dynamic(() => import('components/RUA/RUAButton'));
const RUALink = dynamic(() => import('components/RUA/RUALink'));
@ -30,6 +31,12 @@ const PostHeader = dynamic(() => import('components/post/PostHeader'));
const PostImage = dynamic(() => import('components/post/PostImage'));
const PostIframe = dynamic(() => import('components/post/PostIframe'));
const Footer = dynamic(() => import('components/Footer'));
const PostCommentLoading = dynamic(
() => import('components/loading/PostCommentLoading')
);
const PostComment = dynamic(() => import('components/post/PostComment'), {
loading: () => <PostCommentLoading />,
});
const processedContent = unified()
.use(remarkParse)
@ -57,6 +64,8 @@ const processedContent = unified()
});
const Post = ({ postData }: InferGetStaticPropsType<typeof getStaticProps>) => {
const { targetRef, inView } = useInView();
const matched = useMediaQuery('(max-width: 640px)');
const { state } = useRUAContext();
const { backPath } = state;
@ -125,6 +134,7 @@ const Post = ({ postData }: InferGetStaticPropsType<typeof getStaticProps>) => {
</article>
</div>
<div ref={targetRef}>{inView && <PostComment />}</div>
<Footer />
</main>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

View File

@ -1,4 +0,0 @@
<svg width="283" height="64" viewBox="0 0 283 64" fill="none"
xmlns="http://www.w3.org/2000/svg">
<path d="M141.04 16c-11.04 0-19 7.2-19 18s8.96 18 20 18c6.67 0 12.55-2.64 16.19-7.09l-7.65-4.42c-2.02 2.21-5.09 3.5-8.54 3.5-4.79 0-8.86-2.5-10.37-6.5h28.02c.22-1.12.35-2.28.35-3.5 0-10.79-7.96-17.99-19-17.99zm-9.46 14.5c1.25-3.99 4.67-6.5 9.45-6.5 4.79 0 8.21 2.51 9.45 6.5h-18.9zM248.72 16c-11.04 0-19 7.2-19 18s8.96 18 20 18c6.67 0 12.55-2.64 16.19-7.09l-7.65-4.42c-2.02 2.21-5.09 3.5-8.54 3.5-4.79 0-8.86-2.5-10.37-6.5h28.02c.22-1.12.35-2.28.35-3.5 0-10.79-7.96-17.99-19-17.99zm-9.45 14.5c1.25-3.99 4.67-6.5 9.45-6.5 4.79 0 8.21 2.51 9.45 6.5h-18.9zM200.24 34c0 6 3.92 10 10 10 4.12 0 7.21-1.87 8.8-4.92l7.68 4.43c-3.18 5.3-9.14 8.49-16.48 8.49-11.05 0-19-7.2-19-18s7.96-18 19-18c7.34 0 13.29 3.19 16.48 8.49l-7.68 4.43c-1.59-3.05-4.68-4.92-8.8-4.92-6.07 0-10 4-10 10zm82.48-29v46h-9V5h9zM36.95 0L73.9 64H0L36.95 0zm92.38 5l-27.71 48L73.91 5H84.3l17.32 30 17.32-30h10.39zm58.91 12v9.69c-1-.29-2.06-.49-3.2-.49-5.81 0-10 4-10 10V51h-9V17h9v9.2c0-5.08 5.91-9.2 13.2-9.2z" fill="#000"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

98
scripts/build-search.mjs Normal file
View File

@ -0,0 +1,98 @@
import { config } from 'dotenv';
import algoliasearch from 'algoliasearch/lite.js';
import { readdir, readFile } from 'fs/promises';
import { join } from 'path';
import matter from 'gray-matter';
import { remark } from 'remark';
import strip from 'strip-markdown';
const postsDirectory = join(process.cwd(), 'public/posts');
/**
* Get all sorted posts
* @returns
*/
async function getSortedPostsData() {
// Get file names under /posts
const fileNames = await readdir(postsDirectory);
const allPostsData = await Promise.all(
fileNames.map(async (fileName) => {
// Remove ".md" from file name to get id
const id = fileName.replace(/\.md$/, '');
// Read markdown file as string
const fullPath = join(postsDirectory, fileName);
const fileContents = await readFile(fullPath, 'utf8');
// Use gray-matter to parse the post metadata section
const matterResult = matter(fileContents);
// Process markdown to plain text
const contentText = await remark()
.use(strip)
.process(matterResult.content);
// Combine the data with the id
return {
objectID: id,
id,
// Add post description
desc: `${contentText.toString().slice(0, 100)}...`,
...{
...matterResult.data,
date: matterResult.data.date.toISOString(),
},
};
})
);
// Sort posts by date
return allPostsData.sort(({ date: a }, { date: b }) => {
if (a < b) {
return 1;
} else if (a > b) {
return -1;
} else {
return 0;
}
});
}
(async function () {
// initialize environment variables
config();
if (
!process.env.NEXT_PUBLIC_ALGOLIA_APP_ID &&
!process.env.ALGOLIA_SEARCH_ADMIN_KEY
) {
return console.log('API key not found!');
}
try {
const posts = await getSortedPostsData();
// initialize the client with your environment variables
const client = algoliasearch(
process.env.NEXT_PUBLIC_ALGOLIA_APP_ID,
process.env.ALGOLIA_SEARCH_ADMIN_KEY
);
// initialize the index with your index name
const index = client.initIndex('rua');
// save the objects!
const algoliaResponse = await index.replaceAllObjects(posts);
// check the output of the response in the console
console.log(
`🎉 Sucessfully added ${
algoliaResponse.objectIDs.length
} records to Algolia search. Object IDs:\n${algoliaResponse.objectIDs.join(
'\n'
)}`
);
} catch (e) {
console.log(e);
}
})();

158
yarn.lock
View File

@ -2,6 +2,110 @@
# yarn lockfile v1
"@algolia/cache-browser-local-storage@4.12.0":
version "4.12.0"
resolved "https://registry.npmmirror.com/@algolia/cache-browser-local-storage/download/@algolia/cache-browser-local-storage-4.12.0.tgz#1f873e4f28a39d25b0a589ebe8f826509458e1fb"
integrity sha512-l+G560B6N1k0rIcOjTO1yCzFUbg2Zy2HCii9s03e13jGgqduVQmk79UUCYszjsJ5GPJpUEKcVEtAIpP7tjsXVA==
dependencies:
"@algolia/cache-common" "4.12.0"
"@algolia/cache-common@4.12.0":
version "4.12.0"
resolved "https://registry.npmmirror.com/@algolia/cache-common/download/@algolia/cache-common-4.12.0.tgz#c1111a4d3e9ba2d52cadb4523152580db0887293"
integrity sha512-2Z8BV+NX7oN7RmmQbLqmW8lfN9aAjOexX1FJjzB0YfKC9ifpi9Jl4nSxlnbU+iLR6QhHo0IfuyQ7wcnucCGCGQ==
"@algolia/cache-in-memory@4.12.0":
version "4.12.0"
resolved "https://registry.npmmirror.com/@algolia/cache-in-memory/download/@algolia/cache-in-memory-4.12.0.tgz#f4bdcbf8a6419f0166cfc7ef5594af871741e29e"
integrity sha512-b6ANkZF6vGAo+sYv6g25W5a0u3o6F549gEAgtTDTVA1aHcdWwe/HG/dTJ7NsnHbuR+A831tIwnNYQjRp3/V/Jw==
dependencies:
"@algolia/cache-common" "4.12.0"
"@algolia/client-account@4.12.0":
version "4.12.0"
resolved "https://registry.npmmirror.com/@algolia/client-account/download/@algolia/client-account-4.12.0.tgz#b28445b47e2abf81dc76982d16ba8458f5c99521"
integrity sha512-gzXN75ZydNheNXUN3epS+aLsKnB/PHFVlGUUjXL8WHs4lJP3B5FtHvaA/NCN5DsM3aamhuY5p0ff1XIA+Lbcrw==
dependencies:
"@algolia/client-common" "4.12.0"
"@algolia/client-search" "4.12.0"
"@algolia/transporter" "4.12.0"
"@algolia/client-analytics@4.12.0":
version "4.12.0"
resolved "https://registry.npmmirror.com/@algolia/client-analytics/download/@algolia/client-analytics-4.12.0.tgz#470f115517256c92a5605ae95762531c7906ec74"
integrity sha512-rO2cZCt00Opk66QBZb7IBGfCq4ZE3EiuGkXssf2Monb5urujy0r8CknK2i7bzaKtPbd2vlvhmLP4CEHQqF6SLQ==
dependencies:
"@algolia/client-common" "4.12.0"
"@algolia/client-search" "4.12.0"
"@algolia/requester-common" "4.12.0"
"@algolia/transporter" "4.12.0"
"@algolia/client-common@4.12.0":
version "4.12.0"
resolved "https://registry.npmmirror.com/@algolia/client-common/download/@algolia/client-common-4.12.0.tgz#402395e2cffad89188d76b83615acffb3e45e658"
integrity sha512-fcrFN7FBmxiSyjeu3sF4OnPkC1l7/8oyQ8RMM8CHpVY8cad6/ay35MrfRfgfqdzdFA8LzcBYO7fykuJv0eOqxw==
dependencies:
"@algolia/requester-common" "4.12.0"
"@algolia/transporter" "4.12.0"
"@algolia/client-personalization@4.12.0":
version "4.12.0"
resolved "https://registry.npmmirror.com/@algolia/client-personalization/download/@algolia/client-personalization-4.12.0.tgz#09c89c1558a91db3bfa60d17f7258ae63861352b"
integrity sha512-wCJfSQEmX6ZOuJBJGjy+sbXiW0iy7tMNAhsVMV9RRaJE4727e5WAqwFWZssD877WQ74+/nF/VyTaB1+wejo33Q==
dependencies:
"@algolia/client-common" "4.12.0"
"@algolia/requester-common" "4.12.0"
"@algolia/transporter" "4.12.0"
"@algolia/client-search@4.12.0":
version "4.12.0"
resolved "https://registry.npmmirror.com/@algolia/client-search/download/@algolia/client-search-4.12.0.tgz#ac099ee9f8de85ec204d840bcac734224c7d150c"
integrity sha512-ik6dswcTQtOdZN+8aKntI9X2E6Qpqjtyda/+VANiHThY9GD2PBXuNuuC2HvlF26AbBYp5xaSE/EKxn1DIiIJ4Q==
dependencies:
"@algolia/client-common" "4.12.0"
"@algolia/requester-common" "4.12.0"
"@algolia/transporter" "4.12.0"
"@algolia/logger-common@4.12.0":
version "4.12.0"
resolved "https://registry.npmmirror.com/@algolia/logger-common/download/@algolia/logger-common-4.12.0.tgz#0f9dbe7ace88194b395a2cb958490eb47ac91f8e"
integrity sha512-V//9rzLdJujA3iZ/tPhmKR/m2kjSZrymxOfUiF3024u2/7UyOpH92OOCrHUf023uMGYHRzyhBz5ESfL1oCdh7g==
"@algolia/logger-console@4.12.0":
version "4.12.0"
resolved "https://registry.npmmirror.com/@algolia/logger-console/download/@algolia/logger-console-4.12.0.tgz#a40edeb989bf0d7ff79d989171dad64cd0f01225"
integrity sha512-pHvoGv53KXRIJHLk9uxBwKirwEo12G9+uo0sJLWESThAN3v5M+ycliU1AkUXQN8+9rds2KxfULAb+vfyfBKf8A==
dependencies:
"@algolia/logger-common" "4.12.0"
"@algolia/requester-browser-xhr@4.12.0":
version "4.12.0"
resolved "https://registry.npmmirror.com/@algolia/requester-browser-xhr/download/@algolia/requester-browser-xhr-4.12.0.tgz#64e8e4d4f0724e477421454215195400351cfe61"
integrity sha512-rGlHNMM3jIZBwSpz33CVkeXHilzuzHuFXEEW1icP/k3KW7kwBrKFJwBy42RzAJa5BYlLsTCFTS3xkPhYwTQKLg==
dependencies:
"@algolia/requester-common" "4.12.0"
"@algolia/requester-common@4.12.0":
version "4.12.0"
resolved "https://registry.npmmirror.com/@algolia/requester-common/download/@algolia/requester-common-4.12.0.tgz#b4d96f3cbd73206b6042e523d414a34cc005c2e2"
integrity sha512-qgfdc73nXqpVyOMr6CMTx3nXvud9dP6GcMGDqPct+fnxogGcJsp24cY2nMqUrAfgmTJe9Nmy7Lddv0FyHjONMg==
"@algolia/requester-node-http@4.12.0":
version "4.12.0"
resolved "https://registry.npmmirror.com/@algolia/requester-node-http/download/@algolia/requester-node-http-4.12.0.tgz#8d8e1b67edbaec8e8e8b8c7c606945b969667267"
integrity sha512-mOTRGf/v/dXshBoZKNhMG00ZGxoUH9QdSpuMKYnuWwIgstN24uj3DQx+Ho3c+uq0TYfq7n2v71uoJWuiW32NMQ==
dependencies:
"@algolia/requester-common" "4.12.0"
"@algolia/transporter@4.12.0":
version "4.12.0"
resolved "https://registry.npmmirror.com/@algolia/transporter/download/@algolia/transporter-4.12.0.tgz#e375e10731df95f1be3593b32e86b5c6452cc213"
integrity sha512-MOQVHZ4BcBpf3LtOY/3fqXHAcvI8MahrXDHk9QrBE/iGensQhDiZby5Dn3o2JN/zd9FMnVbdPQ8gnkiMwZiakQ==
dependencies:
"@algolia/cache-common" "4.12.0"
"@algolia/logger-common" "4.12.0"
"@algolia/requester-common" "4.12.0"
"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7":
version "7.16.7"
resolved "https://registry.npmmirror.com/@babel/code-frame/download/@babel/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789"
@ -381,6 +485,13 @@
minimatch "^3.0.4"
strip-json-comments "^3.1.1"
"@giscus/react@^1.0.1":
version "1.0.1"
resolved "https://registry.npmmirror.com/@giscus/react/download/@giscus/react-1.0.1.tgz#3fae2b5e00912a76cb136679f6229d3d6ea28898"
integrity sha512-vViRGjfmDy9xvRIx+6+hocL3iAipbKx4gxtSpQBzOksDwnZS0QbB+r19bYQ08vw8CfHRwE6ws8AOO9yEUrzUyQ==
dependencies:
iframe-resizer-react "^1.1.0"
"@humanwhocodes/config-array@^0.9.2":
version "0.9.2"
resolved "https://registry.npmmirror.com/@humanwhocodes/config-array/download/@humanwhocodes/config-array-0.9.2.tgz#68be55c737023009dfc5fe245d51181bb6476914"
@ -1108,6 +1219,26 @@ ajv@^6.10.0, ajv@^6.12.4:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
algoliasearch@^4.12.0:
version "4.12.0"
resolved "https://registry.npmmirror.com/algoliasearch/download/algoliasearch-4.12.0.tgz#30f2619b6e3a5b79b6aa0f18ab66fbce88240aba"
integrity sha512-fZOMMm+F3Bi5M/MoFIz7hiuyCitJza0Hu+r8Wzz4LIQClC6YGMRq7kT6NNU1fSSoFDSeJIwMfedbbi5G9dJoVQ==
dependencies:
"@algolia/cache-browser-local-storage" "4.12.0"
"@algolia/cache-common" "4.12.0"
"@algolia/cache-in-memory" "4.12.0"
"@algolia/client-account" "4.12.0"
"@algolia/client-analytics" "4.12.0"
"@algolia/client-common" "4.12.0"
"@algolia/client-personalization" "4.12.0"
"@algolia/client-search" "4.12.0"
"@algolia/logger-common" "4.12.0"
"@algolia/logger-console" "4.12.0"
"@algolia/requester-browser-xhr" "4.12.0"
"@algolia/requester-common" "4.12.0"
"@algolia/requester-node-http" "4.12.0"
"@algolia/transporter" "4.12.0"
ansi-colors@^4.1.1:
version "4.1.1"
resolved "https://registry.nlark.com/ansi-colors/download/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
@ -1979,6 +2110,11 @@ domexception@^2.0.1:
dependencies:
webidl-conversions "^5.0.0"
dotenv@^14.2.0:
version "14.2.0"
resolved "https://registry.npmmirror.com/dotenv/download/dotenv-14.2.0.tgz#7e77fd5dd6cff5942c4496e1acf2d0f37a9e67aa"
integrity sha512-05POuPJyPpO6jqzTNweQFfAyMSD4qa4lvsMOWyTRTdpHKy6nnnN+IYWaXF+lHivhBH/ufDKlR4IWCAN3oPnHuw==
electron-to-chromium@^1.4.17:
version "1.4.45"
resolved "https://registry.npmmirror.com/electron-to-chromium/download/electron-to-chromium-1.4.45.tgz#cf1144091d6683cbd45a231954a745f02fb24598"
@ -2969,6 +3105,19 @@ ieee754@^1.1.13:
resolved "https://registry.npm.taobao.org/ieee754/download/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
integrity sha1-jrehCmP/8l0VpXsAFYbRd9Gw01I=
iframe-resizer-react@^1.1.0:
version "1.1.0"
resolved "https://registry.nlark.com/iframe-resizer-react/download/iframe-resizer-react-1.1.0.tgz#5009e019b7a5c7f1c009bff5bcdf0dbf33557465"
integrity sha1-UAngGbelx/HACb/1vN8NvzNVdGU=
dependencies:
iframe-resizer "^4.3.0"
warning "^4.0.3"
iframe-resizer@^4.3.0:
version "4.3.2"
resolved "https://registry.nlark.com/iframe-resizer/download/iframe-resizer-4.3.2.tgz#42dd88345d18b9e377b6044dddb98c664ab0ce6b"
integrity sha1-Qt2INF0YueN3tgRN3bmMZkqwzms=
ignore@^4.0.6:
version "4.0.6"
resolved "https://registry.npmmirror.com/ignore/download/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
@ -3924,7 +4073,7 @@ longest-streak@^3.0.0:
resolved "https://registry.npmmirror.com/longest-streak/download/longest-streak-3.0.1.tgz?cache=0&sync_timestamp=1636446222992&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Flongest-streak%2Fdownload%2Flongest-streak-3.0.1.tgz#c97315b7afa0e7d9525db9a5a2953651432bdc5d"
integrity sha512-cHlYSUpL2s7Fb3394mYxwTYj8niTaNHUCLr0qdiCXQfSjfuA7CKofpX2uSwEfFDQ0EB7JcnMnm+GjbqqoinYYg==
loose-envify@^1.1.0, loose-envify@^1.4.0:
loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0:
version "1.4.0"
resolved "https://registry.nlark.com/loose-envify/download/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
integrity sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=
@ -6449,6 +6598,13 @@ walker@^1.0.7:
dependencies:
makeerror "1.0.12"
warning@^4.0.3:
version "4.0.3"
resolved "https://registry.nlark.com/warning/download/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3"
integrity sha1-Fungd+uKhtavfWSqHgX9hbRnjKM=
dependencies:
loose-envify "^1.0.0"
web-namespaces@^1.0.0:
version "1.1.4"
resolved "https://registry.npmmirror.com/web-namespaces/download/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec"