Browse Source

refactor: final liquid templating stuff gone

fix/enable-imgix
Thomas Osmonson 4 years ago
parent
commit
fca6ccad22
  1. 1
      package.json
  2. 1
      src/common/_includes/keyphrase.md
  3. 32
      src/common/glossary.ts
  4. 46
      src/components/glossary.tsx
  5. 13
      src/components/layouts/docs-layout.tsx
  6. 3
      src/components/mdx/mdx-components.tsx
  7. 1
      src/components/toc.tsx
  8. 21
      src/pages/core/faq_developer.md
  9. 39
      src/pages/core/faq_technical.md
  10. 2
      src/pages/core/smart/tutorial.md
  11. 90
      src/pages/develop/radiks-intro.md
  12. 21
      src/pages/org/faq.md
  13. 5
      src/pages/org/terms.md
  14. 7
      src/pages/org/token.md
  15. 17
      src/pages/org/wallet-troubleshoot.md
  16. 2
      src/pages/org/wallet-use.md
  17. 4
      src/pages/storage/amazon-s3-deploy.md
  18. 4
      src/pages/storage/gaia-admin.md
  19. 25
      yarn.lock

1
package.json

@ -21,6 +21,7 @@
"algoliasearch": "^4.3.0",
"babel-plugin-macros": "^2.8.0",
"babel-plugin-prismjs": "^2.0.1",
"csvtojson": "^2.0.10",
"docsearch.js": "^2.6.3",
"eslint": "^7.4.0",
"fathom-client": "^3.0.0",

1
src/common/_includes/keyphrase.md

@ -1,4 +1,3 @@
| Phrase/Key/Value | Security | Description |
| ------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Secret Recovery Key | PROTECT | Used to access an identity on the Blockstack blockchain. A 24-word sequence of words for example: <br /> `applied binge crisp pictorial fiery dancing agreeable frogs light finish ping apple` <br />The early Blockstack recovery keys were 12-word sequences. |

32
src/common/glossary.ts

@ -0,0 +1,32 @@
const csv = require('csvtojson');
import TurndownService from 'turndown';
import { convertRemoteDataToMDX } from '@common/mdx';
export const convertGlossaryToJson = async () => {
const turndownService = new TurndownService();
const data = await csv().fromFile('./src/common/_data/glossary.csv');
const formatted = data
.filter(entry => entry.Term !== '')
.map(entry => ({
term: entry['Term'],
definition: entry['Definition'],
}));
// we convert html to markdown so we can process it with remark,
// eg external links open in new window
const md = formatted.map(entry => ({
...entry,
definition: turndownService.turndown(entry.definition),
}));
const definitions = await convertRemoteDataToMDX(md, 'definition');
const final = md.map((entry, index) => ({
...entry,
definition: definitions[index],
}));
return {
props: {
glossary: final,
},
};
};

46
src/components/glossary.tsx

@ -0,0 +1,46 @@
import React from 'react';
import { Box, space } from '@blockstack/ui';
import hydrate from 'next-mdx-remote/hydrate';
import { MDXComponents } from '@components/mdx/mdx-components';
import { slugify } from '@common/utils';
import { css } from '@styled-system/css';
import { TableOfContents } from '@components/toc';
export const Glossary = ({ data }) => {
return (
<>
<TableOfContents
columns={[2, 2, 3, 3]}
headings={data.map(entry => ({
content: entry.term,
level: 2,
}))}
/>
{data.map(entry => (
<>
<MDXComponents.h3 pl={space('extra-loose')} id={slugify(entry.term)}>
{entry.term}
</MDXComponents.h3>
<Box
css={css({
width: '100%',
maxWidth: '48ch',
pl: space(['none', 'none', 'base-loose']),
'& p': {
display: 'block',
wordBreak: 'break-word',
hyphens: 'auto',
},
code: {
wordBreak: 'break-all',
},
})}
>
{hydrate(entry.definition, MDXComponents)}
</Box>
</>
))}
</>
);
};

13
src/components/layouts/docs-layout.tsx

@ -241,13 +241,24 @@ const styleOverwrites = {
boxShadow: 'none',
my: space('extra-loose'),
},
'& > img': {
mx: 'auto',
},
table: {
'& code': {
maxWidth: '100%',
overflowX: 'auto',
overflowY: 'hidden',
whiteSpace: 'pre',
},
},
};
export const Contents = ({ headings, children }) => (
<>
<ContentWrapper
width={
headings?.length
headings?.length && headings.length > 1
? ['100%', '100%', `calc(100% - ${TOC_WIDTH}px)`, `calc(100% - ${TOC_WIDTH}px)`]
: '100%'
}

3
src/components/mdx/mdx-components.tsx

@ -90,6 +90,9 @@ export const BlockQuote: React.FC<BoxProps> = ({ children, className, ...rest })
>
<Box
css={css({
display: 'flex',
flexDirection: 'column',
justifyContent: 'center',
marginTop: 0,
py: space('base-tight'),
borderLeft: '2px solid',

1
src/components/toc.tsx

@ -75,6 +75,7 @@ export const TableOfContents = ({
</Box>
)}
<Grid
gridColumnGap={space('base-loose')}
gridTemplateColumns={
Array.isArray(columns)
? columns.map(value => `repeat(${value}, 1fr)`)

21
src/pages/core/faq_developer.md

@ -2,6 +2,9 @@
description: Blockstack DApp technical FAQs
---
export { convertFaqAnswersToMDX as getStaticProps } from '@common/mdx'
import { FAQs } from '@components/faq'
# DApp Developer FAQs
This document lists frequently-asked questions developers about Blockstack application development. If you are new to Blockstack, you should read the [general questions](/faqs/allFAQs) first.
@ -12,20 +15,6 @@ If you have a technical question that gets frequently asked on the
[forum](https://forum.blockstack.org) or [Slack](https://blockstack.slack.com),
feel free to send a pull-request with the question and answer.
{% for faq in site.data.theFAQs.faqs %}
{% if faq.category == 'dappdevs' %}
### {{ faq.question }}
{{ faq.answer }}
{% endif %}
{% endfor %}
{% for faq in site.data.theFAQs.faqs %}
{% if faq.category == 'opensource' %}
### {{ faq.question }}
<FAQs category="appdevs" data={props.mdx} />
{{ faq.answer }}
{% endif %}
{% endfor %}
<FAQs category="opensource" data={props.mdx} />

39
src/pages/core/faq_technical.md

@ -1,3 +1,6 @@
export { convertFaqAnswersToMDX as getStaticProps } from '@common/mdx'
import { FAQs } from '@components/faq'
# Technical FAQ
This document lists frequently-asked questions by developers interested in working with Blockstack application and core components. If you are new to Blockstack, you should read the [general questions](/faqs/allFAQs) first.
@ -8,44 +11,16 @@ feel free to send a pull-request with the question and answer.
## DApp developers
{% for faq in site.data.theFAQs.faqs %}
{% if faq.category == 'dappdevs' %}
### {{ faq.question }}
{{ faq.answer }}
{% endif %}
{% endfor %}
<FAQs category="appdevs" data={props.mdx} />
## Core developers
{% for faq in site.data.theFAQs.faqs %}
{% if faq.category == 'coredevs' %}
### {{ faq.question }}
{{ faq.answer }}
{% endif %}
{% endfor %}
<FAQs category="coredevs" data={props.mdx} />
## Open source developers
{% for faq in site.data.theFAQs.faqs %}
{% if faq.category == 'opensource' %}
### {{ faq.question }}
{{ faq.answer }}
{% endif %}
{% endfor %}
<FAQs category="opensource" data={props.mdx} />
## Miscellaneous questions
{% for faq in site.data.theFAQs.faqs %}
{% if faq.category == 'miscquest' %}
### {{ faq.question }}
{{ faq.answer }}
{% endif %}
{% endfor %}
<FAQs category="miscquest" data={props.mdx} />

2
src/pages/core/smart/tutorial.md

@ -73,7 +73,7 @@ You will see that the program and each statement is enclosed in `()` (parenthese
On the first line, a new public function `say-hi` is declared. Public functions are callable from other smart contracts, enabling developers to break complex tasks into smaller, simpler smart contracts (an exercise in [separating concerns](https://en.wikipedia.org/wiki/Separation_of_concerns)).
-> To create private functions, you would use the `define-private` keyword. Private functions can only be executed by the current smart contract. Only public functions can be called from other contracts." %}
-> To create private functions, you would use the `define-private` keyword. Private functions can only be executed by the current smart contract. Only public functions can be called from other contracts.
The function doesn't take any parameters and simply returns "hello world" using the [`ok`](clarityRef.html#ok) response constructor.

90
src/pages/develop/radiks-intro.md

@ -3,7 +3,9 @@
# Radiks the data indexer
The Blockstack Radiks feature enables Blockstack decentralized applications (DApps) to index and store across data belonging to multiple users. Radiks works with Blockstack's Gaia Storage System. Using Radiks, you can build multi-player DApps that:
The Blockstack Radiks feature enables Blockstack decentralized applications (DApps) to index and store across data
belonging to multiple users. Radiks works with Blockstack's Gaia Storage System. Using Radiks, you can build
multi-player DApps that:
- index, store, and query application data
- query a user's publicly saved data
@ -12,55 +14,73 @@ The Blockstack Radiks feature enables Blockstack decentralized applications (DAp
## Why use Radiks?
Many applications serve data that users create to share publicly with others. Facebook, Twitter, and Instagram are examples of such applications. Decentralized applications that want to create comparable multi-user experiences must ensure that anything a user creates for public sharing is still under control of the creator in the user's Gaia storage.
Many applications serve data that users create to share publicly with others. Facebook, Twitter, and Instagram are
examples of such applications. Decentralized applications that want to create comparable multi-user experiences must
ensure that anything a user creates for public sharing is still under control of the creator in the user's Gaia storage.
For example, if Twitter wanted to be a decentralized application while still having many different users creating their own tweets, those tweets would be stored in each user's own Gaia storage. In such a situation, Twitter still needs a way to keep track of everyone's tweets, display those tweets in user timelines, and perform searches across the platform. Radiks exists to support these kinds of scenarios. It allows applications to query across multiple user data using complicated queries like text search, joins, and filters.
For example, if Twitter wanted to be a decentralized application while still having many different users creating their
own tweets, those tweets would be stored in each user's own Gaia storage. In such a situation, Twitter still needs a way
to keep track of everyone's tweets, display those tweets in user timelines, and perform searches across the platform.
Radiks exists to support these kinds of scenarios. It allows applications to query across multiple user data using
complicated queries like text search, joins, and filters.
Radiks allows applications to query data in a performant and flexible way. Each application that wishes to index and query in this way requires its own Radiks server.
Radiks allows applications to query data in a performant and flexible way. Each application that wishes to index and
query in this way requires its own Radiks server.
## How Radiks works with application data
Radiks consists of a database, a pre-built server, and a client. A developer adds the Radiks library to their application. With this library, developers model their application data. The model defines an application data schema for the Radiks server. Then, you can use calls to write and query data that use that schema. Whenever an application saves or updates data on behalf of a user, Radiks follows this flow:
Radiks consists of a database, a pre-built server, and a client. A developer adds the Radiks library to their application.
With this library, developers model their application data. The model defines an application data schema for the Radiks
server. Then, you can use calls to write and query data that use that schema. Whenever an application saves or updates
data on behalf of a user, Radiks follows this flow:
1. Encrypts private user data on the client-side.
2. Saves a raw JSON of this encrypted data in the user's Gaia storage.
3. Stores the encrypted data on the Radiks server.
Radiks can store both public and sensitive, non-public data since all data is encrypted by default before it leaves the client. Your application can query Radiks for public data and then decrypt the sensitive information on the client. Radiks servers can only return queries for unencrypted data.
Radiks can store both public and sensitive, non-public data since all data is encrypted by default before it leaves the
client. Your application can query Radiks for public data and then decrypt the sensitive information on the client.
Radiks servers can only return queries for unencrypted data.
## How Radiks authorizes writes
Radiks must ensure that the user is writing to their own data. To ensure this, Radiks creates and manages _signing keys_. These keys sign all writes that a user performs. Radiks server-validates all signatures before performing a write. This guarantees that a user is not able to overwrite another user's data.
Radiks must ensure that the user is writing to their own data. To ensure this, Radiks creates and manages _signing keys_.
These keys sign all writes that a user performs. Radiks server-validates all signatures before performing a write. This
guarantees that a user is not able to overwrite another user's data.
A Radiks server is also built to support writes in a collaborative but private situation. For example, consider a collaborative document editing application, where users can create organizations and invite users to that organization. All users in that organization should have read and write privileges to the organization data. Thus, these organizations will have a single shared key that is used to sign and encrypt data.
A Radiks server is also built to support writes in a collaborative but private situation. For example, consider a
collaborative document editing application, where users can create organizations and invite users to that organization.
All users in that organization should have read and write privileges to the organization data. Thus, these organizations
will have a single shared key that is used to sign and encrypt data.
When an organization administrator needs to remove a user from the group, they are expected to revoke the previous key and create a new one. Radiks is aware of these relationships, and will only support writes that are signed with the currently active key related to an organization.
When an organization administrator needs to remove a user from the group, they are expected to revoke the previous key
and create a new one. Radiks is aware of these relationships, and will only support writes that are signed with the
currently active key related to an organization.
## Is Radiks decentralized
Although Radiks applications rely on a centrally-hosted database, an application using Radiks remains fundamentally decentralized. A DApp that uses Radiks has these characteristics.
<table class="uk-table">
<tr>
<td>Built on decentralized authentication</td>
<td>Radiks is deeply tied to Blockstack authentication, which uses a blockchain and Gaia to give you full control over your user data. </td>
</tr>
<tr>
<td>No data lock-in</td>
<td><p>All user data is first stored in Gaia before encrypted with the user's keys and stored in Radiks. This process means the user still controls their data for as long as they need to. If the application's Radiks server shuts down, the user can still access their data. And, without the user's signing keys, an application cannot decrypt the user's data. Users may also backup or migrate their application data from Gaia.
</p></td>
</tr>
<tr>
<td>Censorship resistance</td>
<td><p>All data is also stored in Gaia; no third-party can revoke access to this data.
</p></td>
</tr>
<tr>
<td>Maximum privacy</td>
<td><p>All data is encrypted on the client-side before being stored anywhere using Blockstack authorization. The application host cannot inspect, sell, or use user data in any way that a user doesn't explicitly authorize.
</p></td>
</tr>
</table>
If you are not familiar with Gaia, see
[read the Gaia documentation]((/storage/overview).
Although Radiks applications rely on a centrally-hosted database, an application using Radiks remains fundamentally
decentralized. A DApp that uses Radiks has these characteristics.
### Built on decentralized authentication
Radiks is deeply tied to Blockstack authentication, which uses a blockchain and Gaia to give you full control over
your user data.
### No data lock-in
All user data is first stored in Gaia before encrypted with the user's keys and stored in Radiks. This process means
the user still controls their data for as long as they need to. If the application's Radiks server shuts down, the
user can still access their data. And, without the user's signing keys, an application cannot decrypt the user's data.
Users may also backup or migrate their application data from Gaia.
### Censorship resistance
All data is also stored in Gaia; no third-party can revoke access to this data.
### Maximum privacy
All data is encrypted on the client-side before being stored anywhere using Blockstack authorization. The application
host cannot inspect, sell, or use user data in any way that a user doesn't explicitly authorize.
If you are not familiar with Gaia, see [read the Gaia documentation](/storage/overview).

21
src/pages/org/faq.md

@ -2,26 +2,15 @@
description: 'Blockstack Network documentation'
---
export { convertFaqAnswersToMDX as getStaticProps } from '@common/mdx'
import { FAQs } from '@components/faq'
# FAQs about Stacks tokens and wallet
## Stacks tokens
{% for faq in site.data.theFAQs.faqs %}
{% if faq.category == 'tokens' %}
### {{ faq.question }}
{{ faq.answer }}
{% endif %}
{% endfor %}
<FAQs category="tokens" data={props.mdx} />
## Stacks Wallet
{% for faq in site.data.theFAQs.faqs %}
{% if faq.category == 'wallet' %}
### {{ faq.question }}
{{ faq.answer }}
{% endif %}
{% endfor %}
<FAQs category="wallet" data={props.mdx} />

5
src/pages/org/terms.md

@ -2,8 +2,13 @@
description: 'Blockstack Network documentation'
---
export { convertGlossaryToJson as getStaticProps } from '@common/glossary'
import { Glossary } from '@components/glossary'
# Glossary
<Glossary data={props.glossary} />
<!-- <table class="uk-table uk-table-large uk-table-striped"> -->
<!-- {% for member in site.data.glossary %} -->
<!-- <tr> -->

7
src/pages/org/token.md

@ -10,7 +10,7 @@ the Stacks token and deployment on the Blockstack network as well as the current
role of the Stacks token.
If you are a developer interested in the specific technical changes related to
the 2018 launch, see the <a href="https://forum.blockstack.org/t/blockstack-annual-hard-fork-2018/6518" target="\blank" >announcment in the Blockstack forum</a>.
the 2018 launch, see the [announcement in the Blockstack forum](https://forum.blockstack.org/t/blockstack-annual-hard-fork-2018/6518).
## A brief history of the Stacks token
@ -36,10 +36,7 @@ holders under a predetermined unlocking schedule. The events on the unlocking
schedule are the same for each investor, **the dates of these events** depend on the
holder's purchase date.
<div class="uk-alert-success" uk-alert><b>Note:</b> If you are a token holder
and would like to review your unlocking schedule, visit the <a
href="tokenholders.html">For current token holders</a> page in this
documentation.</div>
-> **Note:** If you are a token holder and would like to review your unlocking schedule, visit the [For current token holders](/org/tokenholders) page in this documentation.
The genesis block launch makes possible the following interactions:

17
src/pages/org/wallet-troubleshoot.md

@ -2,20 +2,18 @@
description: 'How to use the Blockstack Software'
---
export { convertFaqAnswersToMDX as getStaticProps } from '@common/mdx'
import { FAQs } from '@components/faq'
<!-- TODO: very out of date, update content -->
# Wallet FAQs and Troubleshooting
This page contains frequently asked questions and troubleshooting related to the wallet.
## Frequently asked questions
{% for faq in site.data.theFAQs.faqs %}
{% if faq.category == 'wallet' %}
### {{ faq.question }}
{{ faq.answer }}
{% endif %}
{% endfor %}
<FAQs category="wallet" data={props.mdx} />
## Change from a software-only wallet to a hardware wallet
@ -51,8 +49,6 @@ To view or change your Stacks address on Coinlist, do the following:
https://sale.stackstoken.com/stacks-token-sale/YOUR_COINLIST_USERNAME/wallet_address
```
```
3. Change your address if necessary.
## I tried to login to CoinList with my AngelList account. Now, I can’t sign in. How do I access my account?
@ -67,4 +63,3 @@ If you previously set up your CoinList account by logging in with your AngelList
6. Use the instructions in the recovery email to create a unique password for your CoinList account.
Going forward, you can access your CoinList account by logging in with your email and new password.
```

2
src/pages/org/wallet-use.md

@ -33,7 +33,7 @@ You can use any of these hardware wallets with the Stacks Wallet:
- Ledger Nano S
- Ledger Blue
{% include note.html content="Blockstack only supports the hardware wallets listed above. Other wallets, for example, the Trezor Model T, <strong>are not supported</strong>. If you have questions about wallet support, please <a href='emailto:support@blockstack.org' target='_blank'>contact Blockstack support</a>." %}
-> Blockstack only supports the hardware wallets listed above. Other wallets, for example, the Trezor Model T, <strong>are not supported</strong>. If you have questions about wallet support, please <a href='emailto:support@blockstack.org' target='_blank'>contact Blockstack support</a>.
The private key on your hardware wallet is used by the Stacks Wallet software to sign send transactions. Receive transactions don't require a signature. Please consult the device's manufacturer for support in setting up and configuring your hardware device.

4
src/pages/storage/amazon-s3-deploy.md

@ -371,8 +371,6 @@ ssh -t -i <your keyfile.pem> core@<public ip address>
Your EC2 instance is running several `docker` services that support the Gaia hub. You can list these services using the `docker ps` command.
{% raw %}
```bash
$ docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Command}}\t{{.Names}}"
CONTAINER ID IMAGE COMMAND NAMES
@ -382,8 +380,6 @@ CONTAINER ID IMAGE COMMAND
89739e338573 quay.io/blockstack/gaia-admin:v2.5.3 "docker-entrypoint.s…" gaia-admin
```
{% endraw %}
Each service plays a particular role in running your Gaia hub.
<table class="uk-table uk-table-small uk-table-divider">

4
src/pages/storage/gaia-admin.md

@ -293,16 +293,12 @@ $ curl -H "Authorization: bearer $API_KEY" http://localhost:8009/v1/admin/config
To set the whitelist, you must set the _entire_ whitelist. To set the list, pass a command such as the following:
{% raw %}
```bash
$ export API_KEY="hello"
$ curl -H "Authorization: bearer $API_KEY" -H 'Content-Type: application/json' -X POST --data-raw '{"whitelist": ["1KDcaHsYJqD7pwHtpDn6sujCVQCY2e1ktw", "15hUKXg1URbQsmaEHKFV2vP9kCeCsT8gUu"]}' http://localhost:8009/v1/admin/config
{"message":"Config updated -- you should reload your Gaia hub now."}
```
{% endraw %}
## View logs for the hub or admin service
The logs for each Gaia service are maintained by their respective Docker containers. To view the log for a particular service, use the `docker logs` command. For example, to get the logs for the hub:

25
yarn.lock

@ -2728,7 +2728,7 @@ bindings@^1.5.0:
dependencies:
file-uri-to-path "1.0.0"
bluebird@^3.5.5:
bluebird@^3.5.1, bluebird@^3.5.5:
version "3.7.2"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
@ -3771,6 +3771,15 @@ csstype@^2.2.0, csstype@^2.6.6, csstype@^2.6.7, csstype@^2.6.9:
resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.11.tgz#452f4d024149ecf260a852b025e36562a253ffc5"
integrity sha512-l8YyEC9NBkSm783PFTvh0FmJy7s5pFKrDp49ZL7zBGX3fWkO+N4EEyan1qqp8cwPLDcD0OSdyY6hAMoxp34JFw==
csvtojson@^2.0.10:
version "2.0.10"
resolved "https://registry.yarnpkg.com/csvtojson/-/csvtojson-2.0.10.tgz#11e7242cc630da54efce7958a45f443210357574"
integrity sha512-lUWFxGKyhraKCW8Qghz6Z0f2l/PqB1W3AO0HKJzGIQ5JRSlR651ekJDiGJbBT4sRNNv5ddnSGVEnsxP9XRCVpQ==
dependencies:
bluebird "^3.5.1"
lodash "^4.17.3"
strip-bom "^2.0.0"
cyclist@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
@ -5876,6 +5885,11 @@ is-url@^1.2.2:
resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52"
integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==
is-utf8@^0.2.0:
version "0.2.1"
resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
is-whitespace-character@^1.0.0:
version "1.0.4"
resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7"
@ -6239,7 +6253,7 @@ lodash.uniq@4.5.0, lodash.uniq@^4.5.0:
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19:
lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.3:
version "4.17.19"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b"
integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==
@ -9268,6 +9282,13 @@ strip-bom-string@^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"
integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=
dependencies:
is-utf8 "^0.2.0"
strip-bom@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"

Loading…
Cancel
Save