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";

Reply via email to