This is an automated email from the ASF dual-hosted git repository.
kamilbregula pushed a commit to branch aip-11
in repository https://gitbox.apache.org/repos/asf/airflow-site.git
The following commit(s) were added to refs/heads/aip-11 by this push:
new 3a5a835 Add search blog posts (#95)
3a5a835 is described below
commit 3a5a8355ad12f65363416ec50f729d8e8506481a
Author: Kamil BreguĊa <[email protected]>
AuthorDate: Wed Oct 30 09:52:36 2019 +0100
Add search blog posts (#95)
---
landing-pages/.eslintrc.yml | 1 +
landing-pages/.gitignore | 1 +
landing-pages/create-index.js | 110 +++++++++++++++++++++
landing-pages/package.json | 4 +-
landing-pages/site/assets/icons/search-icon.svg | 6 ++
landing-pages/site/assets/scss/_blog-page.scss | 3 +-
.../index.js => site/assets/scss/_search.scss} | 47 ++++++---
landing-pages/site/assets/scss/main-custom.scss | 1 +
landing-pages/site/layouts/blog/list.html | 8 ++
.../site/layouts/partials/boxes/blogpost.html | 2 +-
landing-pages/site/layouts/taxonomy/tag.html | 8 ++
landing-pages/site/static/indexes/.keep | 16 +++
landing-pages/src/index.js | 4 +
landing-pages/src/js/searchBlogPosts.js | 90 +++++++++++++++++
landing-pages/webpack.prod.js | 2 +-
landing-pages/yarn.lock | 78 ++++++++++++++-
16 files changed, 363 insertions(+), 18 deletions(-)
diff --git a/landing-pages/.eslintrc.yml b/landing-pages/.eslintrc.yml
index 5327f85..48d5402 100644
--- a/landing-pages/.eslintrc.yml
+++ b/landing-pages/.eslintrc.yml
@@ -17,6 +17,7 @@
env:
browser: true
+ es6: true
parser: babel-eslint
diff --git a/landing-pages/.gitignore b/landing-pages/.gitignore
index b4ee109..c8b191f 100644
--- a/landing-pages/.gitignore
+++ b/landing-pages/.gitignore
@@ -2,3 +2,4 @@ node_modules/
dist/
site/data/webpack.json
resources/
+site/static/indexes/
diff --git a/landing-pages/create-index.js b/landing-pages/create-index.js
new file mode 100644
index 0000000..4231697
--- /dev/null
+++ b/landing-pages/create-index.js
@@ -0,0 +1,110 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+const fs = require('fs').promises;
+const path = require('path');
+const { promisify } = require('util');
+const frontMatterParser = require('parser-front-matter');
+const parse = promisify(frontMatterParser.parse.bind(frontMatterParser));
+const lunrjs = require('lunr');
+
+const contentDirectory = `${__dirname}/site/content`;
+const outputtDirectory = `${__dirname}/site/static/indexes`;
+
+
+async function isDirectoryExists(dirPath) {
+ try {
+ if ((await fs.stat(dirPath)).isDirectory()) {
+ return true;
+ }
+ }catch (err) {
+ return false
+ }
+ return false
+}
+
+async function loadPostsWithFrontMatter(postsDirectoryPath) {
+ const fileNames = await fs.readdir(postsDirectoryPath);
+ const posts = await Promise.all(
+ fileNames.map(async fileName => {
+ const fileContent = await fs.readFile(
+ `${postsDirectoryPath}/${fileName}`,
+ 'utf8'
+ );
+ const {content, data} = await parse(fileContent);
+ return {
+ content: content.slice(0, 3000),
+ url: path.parse(fileName).name,
+ ...data
+ };
+ })
+ );
+ return posts;
+}
+
+function makeIndex(posts) {
+ return lunrjs(function() {
+ this.ref('title');
+ this.field('title');
+ this.field("description");
+ this.field("author");
+ this.field('content');
+ this.field('tags');
+ this.field('url');
+ posts.forEach(p => {
+ this.add(p);
+ });
+ });
+}
+
+async function writeJson(filePath, index) {
+ await fs.writeFile(filePath, JSON.stringify(index));
+ console.log(`Saved ${path.parse(filePath).base} file.`)
+}
+
+async function processLanguage(language) {
+ console.log(`Proccessing "${language}" language.`)
+ const currentDirectory = `${contentDirectory}/${language}/blog`;
+ if (!await isDirectoryExists(currentDirectory)) {
+ console.log("No blog posts. Skipping.")
+ return
+ }
+ const posts = await loadPostsWithFrontMatter(currentDirectory);
+ const index = makeIndex(posts);
+ const currentOutputDirectory = `${outputtDirectory}/${language}`;
+ if (!await isDirectoryExists(currentOutputDirectory)) {
+ await fs.mkdir(currentOutputDirectory)
+ }
+ await writeJson(`${currentOutputDirectory}/blog-index.json`, index);
+ await writeJson(`${currentOutputDirectory}/blog-posts.json`, posts)
+}
+
+async function run() {
+ const directoryNames = await fs.readdir(contentDirectory);
+ for (const directoryName of directoryNames){
+ await processLanguage(directoryName)
+ }
+}
+
+run()
+ .then(() => process.exit(0))
+ .catch(error => {
+ console.error(error.stack);
+ process.exit(1);
+ });
diff --git a/landing-pages/package.json b/landing-pages/package.json
index b1f2c72..99d8810 100644
--- a/landing-pages/package.json
+++ b/landing-pages/package.json
@@ -24,7 +24,9 @@
"start:webpack": "webpack-dev-server --config webpack.dev.js --hot"
},
"dependencies": {
- "p5": "^0.10.2"
+ "lunr": "^2.3.8",
+ "p5": "^0.10.2",
+ "parser-front-matter": "^1.6.4"
},
"devDependencies": {
"@babel/core": "^7.5.4",
diff --git a/landing-pages/site/assets/icons/search-icon.svg
b/landing-pages/site/assets/icons/search-icon.svg
new file mode 100644
index 0000000..1b89d2c
--- /dev/null
+++ b/landing-pages/site/assets/icons/search-icon.svg
@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20
20">
+ <g id="Group_1579" data-name="Group 1579" transform="translate(-41.001
-41)">
+ <path id="Path_169" d="M71.415 64.687a7.215 7.215 0 1 0-6.729 6.728
7.222 7.222 0 0 0 6.729-6.728z" fill="none" data-name="Path 169"
transform="translate(-14.277 -14.276)"/>
+ <path id="Path_170" d="M60.863 59.8l-6.093-6.09a7.78 7.78 0 1 0-1.06
1.06l6.09 6.093a.468.468 0 0 0 .662 0l.4-.4a.468.468 0 0 0 .001-.663zM42.512
49.183a6.274 6.274 0 1 1 5.851 5.85 6.28 6.28 0 0 1-5.851-5.85z" fill="#51504f"
data-name="Path 170"/>
+ </g>
+</svg>
diff --git a/landing-pages/site/assets/scss/_blog-page.scss
b/landing-pages/site/assets/scss/_blog-page.scss
index 626ef6e..b1aaaac 100644
--- a/landing-pages/site/assets/scss/_blog-page.scss
+++ b/landing-pages/site/assets/scss/_blog-page.scss
@@ -40,10 +40,11 @@
justify-content: center;
flex-wrap: wrap;
width: fit-content;
- margin-top: -14px;
+ margin: -7px;
@media (max-width: $mobile) {
justify-content: center;
+ margin-bottom: 7px;
}
}
diff --git a/landing-pages/src/index.js
b/landing-pages/site/assets/scss/_search.scss
similarity index 55%
copy from landing-pages/src/index.js
copy to landing-pages/site/assets/scss/_search.scss
index 4ce87db..9b439cd 100644
--- a/landing-pages/src/index.js
+++ b/landing-pages/site/assets/scss/_search.scss
@@ -16,19 +16,42 @@
* specific language governing permissions and limitations
* under the License.
*/
+@import "media";
+@import "fonts";
+@import "colors";
-import {showMore} from "./js/showAllCommiters";
-import {handleActiveVideo} from "./js/handleActiveVideo";
-import "./js/navbarScroll";
-import "./js/drawer";
+.search-form {
+ display: flex;
+ width: 344px;
+ padding: 8px 20px;
+ border: solid 1px #cbcbcb;
+ border-radius: 5px;
+ margin: 60px auto 0;
-showMore("#commiters-container", "#show-more-commiters");
-showMore("#pmc-container", "#show-more-pmcs");
-showMore("#case-studies-container", "#show-more-case-studies");
-handleActiveVideo();
+ &__input {
+ font-family: $primary-font;
+ font-size: 16px;
+ color: map-get($colors, brownish-grey);
+ line-height: 1.63;
+ flex-grow: 1;
+ padding-right: 10px;
+ border: none;
+ background: none;
+ outline: none;
+ float: left;
+ }
-if (document.querySelector("#header")) {
- import(/* webpackChunkName: "header" */
"./js/headerAnimation").then((module) => {
- module.initHeaderAnimation();
- });
+ &__button {
+ border: none;
+ background-color: transparent;
+ padding: 0;
+ }
+}
+
+@media (max-width: $mobile) {
+ .search-form {
+ width: 270px;
+ padding: 3px 20px;
+ margin-top: 20px;
+ }
}
diff --git a/landing-pages/site/assets/scss/main-custom.scss
b/landing-pages/site/assets/scss/main-custom.scss
index 7425907..dc5d2e4 100644
--- a/landing-pages/site/assets/scss/main-custom.scss
+++ b/landing-pages/site/assets/scss/main-custom.scss
@@ -43,3 +43,4 @@
@import "footer";
@import "navbar";
@import "header";
+@import "search";
diff --git a/landing-pages/site/layouts/blog/list.html
b/landing-pages/site/layouts/blog/list.html
index 855ce0f..6ce38d2 100644
--- a/landing-pages/site/layouts/blog/list.html
+++ b/landing-pages/site/layouts/blog/list.html
@@ -20,6 +20,14 @@
{{ define "main" }}
<div class="no-width-restriction">
<h2 class="page-header">Blog</h2>
+ <form class="search-form" method="get" action="/blog">
+ <input class="search-form__input" placeholder="Search" name="q"
type="search" id="search">
+ <button class="search-form__button" type="submit">
+ {{ with resources.Get "icons/search-icon.svg" }}
+ {{ .Content | safeHTML }}
+ {{ end }}
+ </button>
+ </form>
<div class="all-tags-container">
<div class="tags-container mx-auto">
<a class="tag active" href="/blog/">All</a>
diff --git a/landing-pages/site/layouts/partials/boxes/blogpost.html
b/landing-pages/site/layouts/partials/boxes/blogpost.html
index 598cfd0..c3e93f4 100644
--- a/landing-pages/site/layouts/partials/boxes/blogpost.html
+++ b/landing-pages/site/layouts/partials/boxes/blogpost.html
@@ -27,7 +27,7 @@
{{ end }}
{{ end }}
</div>
- <span class="bodytext__medium--brownish-grey">{{ .Date.Format
"Mon, Jan 2, 2006" }}</span>
+ <span class="bodytext__medium--brownish-grey
box-event__blogpost--date">{{ .Date.Format "Mon, Jan 2, 2006" }}</span>
</div>
<p class="box-event__blogpost--header">{{ .Params.title }}</p>
<p class="box-event__blogpost--author">{{ .Params.author }}</p>
diff --git a/landing-pages/site/layouts/taxonomy/tag.html
b/landing-pages/site/layouts/taxonomy/tag.html
index 03d12ab..e9e406a 100644
--- a/landing-pages/site/layouts/taxonomy/tag.html
+++ b/landing-pages/site/layouts/taxonomy/tag.html
@@ -21,6 +21,14 @@
{{ $pageUrl := .Permalink }}
<div>
<h2 class="page-header">Blog</h2>
+ <form class="search-form" method="get" action="/blog">
+ <input class="search-form__input" placeholder="Search" name="q"
type="search" id="search">
+ <button class="search-form__button" type="submit">
+ {{ with resources.Get "icons/search-icon.svg" }}
+ {{ .Content | safeHTML }}
+ {{ end }}
+ </button>
+ </form>
<div class="all-tags-container">
<div class="tags-container mx-auto">
<a class="tag" href="/blog/">All</a>
diff --git a/landing-pages/site/static/indexes/.keep
b/landing-pages/site/static/indexes/.keep
new file mode 100644
index 0000000..a6301e0
--- /dev/null
+++ b/landing-pages/site/static/indexes/.keep
@@ -0,0 +1,16 @@
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
diff --git a/landing-pages/src/index.js b/landing-pages/src/index.js
index 4ce87db..f0ce0fb 100644
--- a/landing-pages/src/index.js
+++ b/landing-pages/src/index.js
@@ -22,6 +22,10 @@ import {handleActiveVideo} from "./js/handleActiveVideo";
import "./js/navbarScroll";
import "./js/drawer";
+if (document.querySelector("#search")) {
+ import(/* webpackChunkName: "search" */ "./js/searchBlogPosts");
+}
+
showMore("#commiters-container", "#show-more-commiters");
showMore("#pmc-container", "#show-more-pmcs");
showMore("#case-studies-container", "#show-more-case-studies");
diff --git a/landing-pages/src/js/searchBlogPosts.js
b/landing-pages/src/js/searchBlogPosts.js
new file mode 100644
index 0000000..85fe443
--- /dev/null
+++ b/landing-pages/src/js/searchBlogPosts.js
@@ -0,0 +1,90 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import lunr from "lunr";
+
+const query = new URLSearchParams(window.location.search);
+const searchString = query.get("q");
+document.querySelector("#search").value = searchString;
+
+const $target = document.querySelector(".list-items");
+
+const $itemTemplate = $target.firstElementChild.cloneNode(true);
+
+
+const formatDate = (date) => {
+ const dateOptions = {weekday: "short", year: "numeric", month: "short", day:
"numeric"};
+ return new Date(date).toLocaleDateString("en-US", dateOptions);
+};
+
+const setTags = (tagsContainer, tags) => {
+ while (tagsContainer.firstChild) {
+ tagsContainer.removeChild(tagsContainer.firstChild);
+ }
+ tags.forEach((tag) => {
+ const tagElement = document.createElement("a");
+ tagsContainer.appendChild(tagElement);
+ tagElement.setAttribute("class", "tag");
+ tagElement.setAttribute("href", `/blog/tags/${tag}/`);
+ tagElement.innerText = tag;
+ });
+};
+
+Promise.all([
+ fetch("/indexes/en/blog-index.json"),
+ fetch("/indexes/en/blog-posts.json")
+]).then(function([indexResp, postsResp]) {
+ return Promise.all([
+ indexResp.json(),
+ postsResp.json()
+ ]);
+}).then(function([index, posts]) {
+ const lunrIndex = lunr.Index.load(index);
+ const matches = lunrIndex.search(searchString);
+ const results = [];
+ matches.forEach(function(match) {
+ posts.filter((post) => post.title === match.ref)
+ .forEach((post) => {
+ results.push({post, match});
+ });
+ });
+ results.sort((a, b) => a.match.score - b.match.score);
+
+ if (results.length > 10) {
+ results.splice(10, results.length - 10);
+ }
+
+ if (results.length > 0) {
+ while ($target.firstChild) {
+ $target.removeChild($target.firstChild);
+ }
+ results.forEach((result) => {
+ const $newResultItem = $itemTemplate.cloneNode(true);
+ $newResultItem.querySelector(".box-event__blogpost--header").innerText =
result.post.title;
+ $newResultItem.querySelector(".box-event__blogpost--author").innerText =
result.post.author;
+
$newResultItem.querySelector(".box-event__blogpost--description").innerText =
result.post.description;
+ $newResultItem.querySelector(".box-event__blogpost--date").innerText =
formatDate(result.post.date);
+ setTags($newResultItem.querySelector(".box-event__blogpost--metadata >
.tags-container"), result.post.tags);
+ $newResultItem.querySelector(".box-event__blogpost > a").href =
`/blog/${result.post.url}/`;
+ $target.append($newResultItem);
+ });
+ } else {
+ $target.innerHTML = "<div>No search results found</div>";
+ }
+});
diff --git a/landing-pages/webpack.prod.js b/landing-pages/webpack.prod.js
index 52c4f1e..08c3ac8 100644
--- a/landing-pages/webpack.prod.js
+++ b/landing-pages/webpack.prod.js
@@ -29,7 +29,7 @@ module.exports = merge(common, {
output: {
filename: "[name].[hash:5].js",
- chunkFilename: "[id].[hash:5].js"
+ chunkFilename: "chunk-[id].[hash:5].js",
},
optimization: {
diff --git a/landing-pages/yarn.lock b/landing-pages/yarn.lock
index 26ebd32..edecce0 100644
--- a/landing-pages/yarn.lock
+++ b/landing-pages/yarn.lock
@@ -3148,6 +3148,14 @@ file-entry-cache@^5.0.1:
dependencies:
flat-cache "^2.0.1"
+file-is-binary@^1.0.0:
+ version "1.0.0"
+ resolved
"https://registry.yarnpkg.com/file-is-binary/-/file-is-binary-1.0.0.tgz#5e41806d1bcae458c8fec32fe3ce122dbbbc4356"
+ integrity sha1-XkGAbRvK5FjI/sMv484SLbu8Q1Y=
+ dependencies:
+ is-binary-buffer "^1.0.0"
+ isobject "^3.0.0"
+
file-loader@^4.1.0:
version "4.2.0"
resolved
"https://registry.yarnpkg.com/file-loader/-/file-loader-4.2.0.tgz#5fb124d2369d7075d70a9a5abecd12e60a95215e"
@@ -3565,6 +3573,16 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15,
graceful-fs@^4.1.2, graceful-fs@^4.1.6
resolved
"https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02"
integrity
sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==
+gray-matter@^3.0.2:
+ version "3.1.1"
+ resolved
"https://registry.yarnpkg.com/gray-matter/-/gray-matter-3.1.1.tgz#101f80d9e69eeca6765cdce437705b18f40876ac"
+ integrity
sha512-nZ1qjLmayEv0/wt3sHig7I0s3/sJO0dkAaKYQ5YAOApUtYEOonXSFdWvL1khvnZMTvov4UufkqlFsilPnejEXA==
+ dependencies:
+ extend-shallow "^2.0.1"
+ js-yaml "^3.10.0"
+ kind-of "^5.0.2"
+ strip-bom-string "^1.0.0"
+
handle-thing@^2.0.0:
version "2.0.0"
resolved
"https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754"
@@ -4090,6 +4108,13 @@ is-arrayish@^0.3.1:
resolved
"https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
integrity
sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
+is-binary-buffer@^1.0.0:
+ version "1.0.0"
+ resolved
"https://registry.yarnpkg.com/is-binary-buffer/-/is-binary-buffer-1.0.0.tgz#bc6031290b65cbf799b9d9502b50fd5375524007"
+ integrity sha1-vGAxKQtly/eZudlQK1D9U3VSQAc=
+ dependencies:
+ is-buffer "^1.1.5"
+
is-binary-path@^1.0.0:
version "1.0.1"
resolved
"https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
@@ -4335,6 +4360,11 @@ is-whitespace-character@^1.0.0:
resolved
"https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.3.tgz#b3ad9546d916d7d3ffa78204bca0c26b56257fac"
integrity
sha512-SNPgMLz9JzPccD3nPctcj8sZlX9DAMJSKH8bP7Z6bohCwuNgX8xbWr1eTAYXX9Vpi/aSn8Y1akL9WgM3t43YNQ==
+is-whitespace@^0.3.0:
+ version "0.3.0"
+ resolved
"https://registry.yarnpkg.com/is-whitespace/-/is-whitespace-0.3.0.tgz#1639ecb1be036aec69a54cbb401cfbed7114ab7f"
+ integrity sha1-Fjnssb4DauxppUy7QBz77XEUq38=
+
is-windows@^1.0.1, is-windows@^1.0.2:
version "1.0.2"
resolved
"https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
@@ -4392,7 +4422,7 @@ js-levenshtein@^1.1.3:
resolved
"https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity
sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
-js-yaml@^3.13.1:
+js-yaml@^3.10.0, js-yaml@^3.13.1:
version "3.13.1"
resolved
"https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
integrity
sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
@@ -4495,7 +4525,7 @@ kind-of@^4.0.0:
dependencies:
is-buffer "^1.1.5"
-kind-of@^5.0.0:
+kind-of@^5.0.0, kind-of@^5.0.2:
version "5.1.0"
resolved
"https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
integrity
sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
@@ -4518,6 +4548,13 @@ last-call-webpack-plugin@^3.0.0:
lodash "^4.17.5"
webpack-sources "^1.1.0"
+lazy-cache@^2.0.2:
+ version "2.0.2"
+ resolved
"https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264"
+ integrity sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=
+ dependencies:
+ set-getter "^0.1.0"
+
lcid@^1.0.0:
version "1.0.0"
resolved
"https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
@@ -4695,6 +4732,11 @@ lru-cache@^5.1.1:
dependencies:
yallist "^3.0.2"
+lunr@^2.3.8:
+ version "2.3.8"
+ resolved
"https://registry.yarnpkg.com/lunr/-/lunr-2.3.8.tgz#a8b89c31f30b5a044b97d2d28e2da191b6ba2072"
+ integrity
sha512-oxMeX/Y35PNFuZoHp+jUj5OSEmLCaIH4KTFJh7a93cHBoFmpw2IoPs22VIz7vyO2YUnx2Tn9dzIwO2P/4quIRg==
+
make-dir@^2.0.0:
version "2.1.0"
resolved
"https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
@@ -5667,6 +5709,19 @@ parse-passwd@^1.0.0:
resolved
"https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=
+parser-front-matter@^1.6.4:
+ version "1.6.4"
+ resolved
"https://registry.yarnpkg.com/parser-front-matter/-/parser-front-matter-1.6.4.tgz#71fe3288a51c7b8734163f3793f3fdc24b0a8a90"
+ integrity
sha512-eqtUnI5+COkf1CQOYo8FmykN5Zs+5Yr60f/7GcPgQDZEEjdE/VZ4WMaMo9g37foof8h64t/TH2Uvk2Sq0fDy/g==
+ dependencies:
+ extend-shallow "^2.0.1"
+ file-is-binary "^1.0.0"
+ gray-matter "^3.0.2"
+ isobject "^3.0.1"
+ lazy-cache "^2.0.2"
+ mixin-deep "^1.2.0"
+ trim-leading-lines "^0.1.1"
+
parseurl@~1.3.2, parseurl@~1.3.3:
version "1.3.3"
resolved
"https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
@@ -7331,6 +7386,13 @@ set-blocking@^2.0.0, set-blocking@~2.0.0:
resolved
"https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+set-getter@^0.1.0:
+ version "0.1.0"
+ resolved
"https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376"
+ integrity sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=
+ dependencies:
+ to-object-path "^0.3.0"
+
set-value@^2.0.0, set-value@^2.0.1:
version "2.0.1"
resolved
"https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
@@ -7792,6 +7854,11 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
dependencies:
ansi-regex "^4.1.0"
+strip-bom-string@^1.0.0:
+ version "1.0.0"
+ resolved
"https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92"
+ integrity sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=
+
strip-bom@^2.0.0:
version "2.0.0"
resolved
"https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
@@ -8136,6 +8203,13 @@ tough-cookie@~2.4.3:
psl "^1.1.24"
punycode "^1.4.1"
+trim-leading-lines@^0.1.1:
+ version "0.1.1"
+ resolved
"https://registry.yarnpkg.com/trim-leading-lines/-/trim-leading-lines-0.1.1.tgz#0e7cac3e83042dcf95a74ed36966f17744d5c169"
+ integrity sha1-DnysPoMELc+Vp07TaWbxd0TVwWk=
+ dependencies:
+ is-whitespace "^0.3.0"
+
trim-newlines@^1.0.0:
version "1.0.0"
resolved
"https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"