diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..629a251 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,239 @@ +{ + "parser": "babel-eslint", + "env": { + "browser": true, + "commonjs": true, + "es6": true, + "jest": true, + "node": true + }, + "globals": { + "__PUBLIC_URL__": false, + "__OVIDE_VERSION__": false, + "__SOURCE_REPOSITORY__": false, + "FONIO_CONFIG": false, + "db": false + }, + "plugins": [ + "mocha", + "react" + ], + "settings": { + "react": { + "version": "16.0.2" + } + }, + "extends": [ + "@robindemourat/eslint-config/es7", + "@robindemourat/eslint-config/react" + ], + "rules": { + "require-jsdoc": 2, + "react/jsx-no-bind": 0, + + + "react/jsx-handler-names": [2, { + "eventHandlerPrefix": "handle", + "eventHandlerPropPrefix": "on" + }], + + "no-case-declarations": 0, + "no-useless-escape": 0, + "arrow-parens": [ + 2, + "always" + ], + "arrow-spacing": [ + 2, + { + "before": true, + "after": true + } + ], + "constructor-super": 0, + "generator-star-spacing": 0, + "no-class-assign": 0, + "no-confusing-arrow": 2, + "no-const-assign": 2, + "no-this-before-super": 0, + "no-var": 2, + "object-shorthand": [ + 2, + "always" + ], + "prefer-arrow-callback": 0, + "prefer-const": 2, + "prefer-spread": 0, + "prefer-reflect": 0, + "require-yield": 0, + "react/jsx-uses-react": 2, + "react/no-multi-comp": 0, + "react/prop-types": 0, + "react/display-name": 0, + "react/jsx-wrap-multilines": 2, + "react/self-closing-comp": 2, + "react/jsx-no-comment-textnodes": 2, + "react/no-danger": 2, + "react/no-is-mounted": 2, + "react/no-deprecated": 2, + "react/no-did-mount-set-state": 2, + "react/no-did-update-set-state": 2, + "react/no-render-return-value": 2, + "react/react-in-jsx-scope": 2, + "react/jsx-uses-vars": 2, + "react/jsx-pascal-case": 2, + "react/jsx-no-undef": 2, + "react/no-unknown-property": 2, + + "react/jsx-curly-spacing": [ + 2, + "always", + { + "allowMultiline": true, + "spacing": + { + "objectLiterals": "always" + } + } + ], + "react/jsx-equals-spacing": [ + 2, + "never" + ], + + "react/sort-prop-types": 2, + "react/jsx-boolean-value": 2, + "react/sort-comp": 2, + "react/jsx-no-duplicate-props": 2, + "react/jsx-max-props-per-line": [ + 2, + { + "maximum": 1, + "when": "always" + } + ], + "react/jsx-no-literals": 0, + "react/jsx-indent-props": [2, 2], + "react/jsx-indent": [2, 2], + "react/jsx-closing-bracket-location": [ + 2, + "tag-aligned" + ], + + "react/jsx-tag-spacing": 2, + "react/no-direct-mutation-state": 2, + "react/forbid-prop-types": 0, + "react/prefer-es6-class": 2, + "react/jsx-key": 2, + "react/no-string-refs": 2, + "react/no-set-state": 0, + "react/prefer-stateless-function": 2, + "react/require-render-return": 2, + "react/jsx-first-prop-new-line": 2, + "react/jsx-no-target-blank": 2, + "react/jsx-filename-extension": [ + 2, + { + "extensions": [ + ".js", + ".jsx" + ] + } + ], + "react/require-optimization": 2, + "react/no-find-dom-node": 2, + + "object-curly-spacing": [ + 2, + "always" + ], + "brace-style": [ + 2, + "stroustrup", + { + "allowSingleLine": false + } + ], + "block-spacing": [ + 2, + "always" + ], + "array-bracket-spacing": [ + 2, + "always" + ], + "rest-spread-spacing": [ + 2, + "never" + ], + "array-bracket-newline": [ + 2, + "consistent" + ], + "space-in-parens": [ + 2, + "always" + ], + + "no-multiple-empty-lines": [2, + { + "max": 1 + }], + "key-spacing": [ + 2, + { + "beforeColon": false + } + ], + "no-mixed-spaces-and-tabs": 2, + "multiline-comment-style": [ + 2, + "starred-block" + ], + "lines-around-comment": [ + 2, + { + "beforeBlockComment": true + } + ], + "computed-property-spacing": [ + 2, + "never" + ], + + "keyword-spacing": [ + "error", + { + "before": true, + "after": true + } + ], + "linebreak-style": [ + "error", + "unix" + ], + "switch-colon-spacing": [ + 2, + { + "after": true, + "before": false + } + ], + + "prefer-template": 2, + "react/boolean-prop-naming": 2, + "react/no-typos": 2, + "react/no-unescaped-entities": 2, + "react/no-will-update-set-state": 2, + "react/void-dom-elements-no-children": 2, + "react/jsx-child-element-spacing": 2, + "react/jsx-closing-tag-location": 2, + "react/jsx-curly-brace-presence": [ + 2, + { + "props": "always", + "children": "never" + } + ] + } +} \ No newline at end of file diff --git a/.gitignore b/.gitignore index ad46b30..12bdd4f 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ logs npm-debug.log* yarn-debug.log* yarn-error.log* +.DS_Store # Runtime data pids diff --git a/dist/components/Authors.js b/dist/components/Authors.js new file mode 100644 index 0000000..202ac35 --- /dev/null +++ b/dist/components/Authors.js @@ -0,0 +1,27 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const Authors = ({ + authors, + displayRole = false +}) => authors.map((author, index) => _react.default.createElement("span", { + className: "author'", + key: index +}, author.given.trim(), " ", author.family.trim(), displayRole && author.role ? ` (${author.role})` : '')).reduce((prev, curr, index) => { + if (index > 0) { + return [prev, ', ', curr]; + } + + return [curr]; +}, []); + +var _default = Authors; +exports.default = _default; \ No newline at end of file diff --git a/dist/components/BackCover.js b/dist/components/BackCover.js new file mode 100644 index 0000000..af2d2e8 --- /dev/null +++ b/dist/components/BackCover.js @@ -0,0 +1,64 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +var _MarkdownPlayer = _interopRequireDefault(require("./MarkdownPlayer")); + +var _Authors = _interopRequireDefault(require("./Authors")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var _default = ({ + production: { + metadata + }, + edition, + data: { + backgroundColor, + useAbstract = true, + customMarkdownContents, + animatedBackground, + customCoverFooter + } = {}, + id +}) => { + const { + data: editionData = {} + } = edition; + const finalTitle = editionData.publicationTitle || metadata.title; + const finalSubtitle = editionData.publicationSubtitle || metadata.subtitle; + return _react.default.createElement("section", { + className: `composition-block back-cover ${animatedBackground && animatedBackground !== 'none' ? `with-animated-background-${animatedBackground}` : ''}`, + style: { + backgroundColor + } + }, _react.default.createElement("div", { + className: 'back-cover-content' + }, _react.default.createElement("h2", { + id: id, + className: 'back-cover-title' + }, finalTitle), finalSubtitle && _react.default.createElement("h3", { + className: 'back-cover-subtitle' + }, finalSubtitle), metadata.authors && _react.default.createElement("h3", { + className: 'back-cover-authors' + }, _react.default.createElement(_Authors.default, { + authors: metadata.authors + })), _react.default.createElement("div", { + className: 'back-cover-text' + }, useAbstract && _react.default.createElement(_MarkdownPlayer.default, { + src: metadata.abstract + }), customMarkdownContents && customMarkdownContents.trim().length ? _react.default.createElement(_MarkdownPlayer.default, { + src: customMarkdownContents + }) : null), customCoverFooter && customCoverFooter.length > 0 && _react.default.createElement("div", { + className: 'back-cover-footer' + }, _react.default.createElement(_MarkdownPlayer.default, { + src: customCoverFooter + })))); +}; + +exports.default = _default; \ No newline at end of file diff --git a/dist/components/BlockAssetWrapper.js b/dist/components/BlockAssetWrapper.js new file mode 100644 index 0000000..844fc3e --- /dev/null +++ b/dist/components/BlockAssetWrapper.js @@ -0,0 +1,124 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +var _propTypes = _interopRequireDefault(require("prop-types")); + +var _MarkdownPlayer = _interopRequireDefault(require("./MarkdownPlayer")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * This module exports a stateless reusable block asset wrapper component + * It handles the connection to context's data and builds proper data to render the asset + * ============ + */ +const BlockAssetWrapper = ({ + data +}, context) => { + const assetId = data.asset.id; + const contextualization = context.production && context.production.contextualizations && context.production.contextualizations[assetId]; + + if (!contextualization) { + return null; + } + + const { + visibility = { + screened: true, + paged: true + } + } = contextualization; + const production = context.production || {}; + const containerId = context.containerId; + const assets = context.productionAssets || {}; + const contextualizer = production.contextualizers[contextualization.contextualizerId]; + const resource = production.resources[contextualization.resourceId]; + const dimensions = context.dimensions || {}; + const fixedPresentationId = context.fixedPresentationId; // const onPresentationExit = context.onPresentationExit; + + const inNote = context.inNote; + const contextualizers = context.contextualizers; + const contextualizerModule = contextualizers[contextualizer.type]; + const Component = contextualizerModule && contextualizerModule.Block; + + if (contextualization && Component) { + const hide = !visibility.paged; + return hide ? null : _react.default.createElement("figure", { + className: `block-contextualization-container ${contextualizer.type}`, + style: { + position: 'relative', + minHeight: contextualizer.type === 'data-presentation' ? dimensions.height : '20px' + }, + id: `contextualization-${containerId}-${assetId}` + }, _react.default.createElement(Component, { + resource: resource, + contextualizer: contextualizer, + contextualization: contextualization, + renderingMode: 'paged', + assets: assets, + fixed: fixedPresentationId === assetId, + allowInteractions: inNote || fixedPresentationId === assetId + }), _react.default.createElement("figcaption", { + className: 'figure-caption' + }, _react.default.createElement("h4", { + className: 'figure-title' + }, _react.default.createElement("span", null, contextualization.title || resource.metadata.title)), contextualization.legend && _react.default.createElement("div", { + className: 'figure-legend' + }, _react.default.createElement(_MarkdownPlayer.default, { + src: contextualization.legend + })))); + } else { + return null; + } +}; +/** + * Component's properties types + */ + + +BlockAssetWrapper.propTypes = { + /** + * Corresponds to the data initially embedded in a draft-js entity + */ + data: _propTypes.default.shape({ + asset: _propTypes.default.shape({ + id: _propTypes.default.string + }) + }) +}; +/** + * Component's context used properties + */ + +BlockAssetWrapper.contextTypes = { + /** + * The active production data + */ + production: _propTypes.default.object, + + /** + * Dimensions of the wrapping element + */ + dimensions: _propTypes.default.object, + + /** + * Id of the presentation being displayed full screen if any + */ + fixedPresentationId: _propTypes.default.string, + + /** + * Whether the block asset is displayed in a note (and not in main content) + */ + inNote: _propTypes.default.bool, + contextualizers: _propTypes.default.object, + productionAssets: _propTypes.default.object, + containerId: _propTypes.default.string +}; +var _default = BlockAssetWrapper; +exports.default = _default; \ No newline at end of file diff --git a/dist/components/Colophon.js b/dist/components/Colophon.js new file mode 100644 index 0000000..ceadd15 --- /dev/null +++ b/dist/components/Colophon.js @@ -0,0 +1,43 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +var _MarkdownPlayer = _interopRequireDefault(require("./MarkdownPlayer")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var _default = ({ + data: { + customText, + copyright, + issn, + isbn + } = {}, + id +}) => { + return _react.default.createElement("section", { + id: id, + className: 'composition-block colophon' + }, _react.default.createElement("div", { + className: 'colophon-content' + }, customText && customText.length > 0 && _react.default.createElement("div", { + className: 'colophon-custom-text' + }, _react.default.createElement(_MarkdownPlayer.default, { + src: customText + })), copyright && copyright.length > 0 && _react.default.createElement("div", { + className: 'colophon-copyright' + }, _react.default.createElement(_MarkdownPlayer.default, { + src: copyright + })), isbn && isbn.length > 0 && _react.default.createElement("div", { + className: 'colophon-isbn' + }, "ISBN ", isbn), issn && issn.length > 0 && _react.default.createElement("div", { + className: 'colophon-issn' + }, "ISSN ", issn))); +}; + +exports.default = _default; \ No newline at end of file diff --git a/dist/components/DefaultLinkComponent.js b/dist/components/DefaultLinkComponent.js new file mode 100644 index 0000000..00fa779 --- /dev/null +++ b/dist/components/DefaultLinkComponent.js @@ -0,0 +1,27 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var _default = ({ + href, + target, + children, + className, + id, + style +}) => _react.default.createElement("a", { + href: href, + target: target, + className: className, + id: id, + style: style +}, children); + +exports.default = _default; \ No newline at end of file diff --git a/dist/components/DefaultMentionComponent.js b/dist/components/DefaultMentionComponent.js new file mode 100644 index 0000000..749b8cb --- /dev/null +++ b/dist/components/DefaultMentionComponent.js @@ -0,0 +1,27 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var _default = ({ + href, + target, + // children, + className, + id, + style +}) => _react.default.createElement("a", { + href: href, + target: target, + className: `page-link ${className || ''}`, + id: id, + style: style +}, "p."); + +exports.default = _default; \ No newline at end of file diff --git a/dist/components/DefaultSectionLinkComponent.js b/dist/components/DefaultSectionLinkComponent.js new file mode 100644 index 0000000..a9a0978 --- /dev/null +++ b/dist/components/DefaultSectionLinkComponent.js @@ -0,0 +1,30 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var _default = ({ + sectionId, + target, + children, + className, + id, + style +}) => _react.default.createElement("a", { + href: `#section-${sectionId}`, + target: target, + className: `page-link ${className}`, + id: id, + style: style +}, children, "( p. ", _react.default.createElement("span", { + className: 'page-link', + href: `#section-${sectionId}` +}), ")"); + +exports.default = _default; \ No newline at end of file diff --git a/dist/components/EndNotes.js b/dist/components/EndNotes.js new file mode 100644 index 0000000..7daa9f5 --- /dev/null +++ b/dist/components/EndNotes.js @@ -0,0 +1,53 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +var _Renderer = _interopRequireDefault(require("./Renderer")); + +var _reactCiteproc = require("react-citeproc"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var _default = ({ + production: { + sections + }, + sectionsIds: sectionsOrder, + translate, + title, + citations, + citationStyle, + citationLocale, + id +}) => _react.default.createElement("section", { + className: 'end-notes', + title: title, + id: id +}, _react.default.createElement(_reactCiteproc.ReferencesManager, { + style: citationStyle, + locale: citationLocale, + items: citations.citationItems, + citations: citations.citationData, + componentClass: 'references-manager' +}, _react.default.createElement("h1", { + className: 'section-title' +}, title || translate('Notes')), _react.default.createElement("ol", { + className: 'end-notes' +}, sectionsOrder.reduce((results, sectionId) => results.concat(Object.keys(sections[sectionId].notes).map(thatId => sections[sectionId].notes[thatId])), []).map((note, index) => { + return _react.default.createElement("li", { + id: `note-content-${note.id}`, + key: index + }, _react.default.createElement("a", { + href: `#note-pointer-${note.id}`, + className: 'note-number' + }, index + 1), _react.default.createElement(_Renderer.default, { + raw: note.contents + })); +})))); + +exports.default = _default; \ No newline at end of file diff --git a/dist/components/Footnote.js b/dist/components/Footnote.js new file mode 100644 index 0000000..8969dce --- /dev/null +++ b/dist/components/Footnote.js @@ -0,0 +1,84 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +var _propTypes = _interopRequireDefault(require("prop-types")); + +var _FootnoteRenderer = _interopRequireDefault(require("./FootnoteRenderer")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * This module exports a stateless reusable note pointer component + * ============ + * @module quinoa-production-player/components/NotePointer + */ + +/** + * Renders a not pointer as a pure component + * @param {object} props + * @param {array} props.children - children elements of the component + * @param {array} props.noteId - the id of the note to point to + * @param {object} context - the context data of the component + * @return {ReactElement} component - the component + */ +const Footnote = ({ + // children, + noteId = '', + notesPosition +}, context) => { + const notes = context.notes; + + if (notes) { + const note = notes[noteId]; + + if (note) { + return _react.default.createElement("sup", { + className: notesPosition === 'sidenotes' ? 'sidenote' : 'footnote', + id: `note-pointer-${noteId}`, + "data-notenumber": note.order + }, _react.default.createElement("span", { + className: 'footnote-content' + }, _react.default.createElement(_FootnoteRenderer.default, { + raw: note.contents + }))); + } + + return null; + } + + return null; +}; +/** + * Component's properties types + */ + + +Footnote.propTypes = { + /** + * Children react components + */ + children: _propTypes.default.array, + + /** + * id of the note to render + */ + noteId: _propTypes.default.string +}; +/** + * Component's context used properties + */ + +Footnote.contextTypes = { + /** + * Map of available notes to look into + */ + notes: _propTypes.default.object +}; +var _default = Footnote; +exports.default = _default; \ No newline at end of file diff --git a/dist/components/FootnoteRenderer.js b/dist/components/FootnoteRenderer.js new file mode 100644 index 0000000..466b0a8 --- /dev/null +++ b/dist/components/FootnoteRenderer.js @@ -0,0 +1,278 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireWildcard(require("react")); + +var _propTypes = _interopRequireDefault(require("prop-types")); + +var _redraft = _interopRequireDefault(require("redraft")); + +var _peritextSchemas = require("peritext-schemas"); + +var _Link = _interopRequireDefault(require("./Link")); + +var _BlockAssetWrapper = _interopRequireDefault(require("./BlockAssetWrapper")); + +var _InlineAssetWrapper = _interopRequireDefault(require("./InlineAssetWrapper")); + +var _InternalLink = _interopRequireDefault(require("./InternalLink")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + +/** + * This module exports a statefull reusable draft-js raw-to-react renderer component + * It wrapps around the redraft engine that converts draft-s raw to a react representation, + * providing it specific settings and callbacks. + */ + +/* + * import NotePointer from './NotePointer'; + * import Footnote from './Footnote'; + */ +const { + LINK, + BLOCK_ASSET, + INLINE_ASSET, + SECTION_POINTER +} = _peritextSchemas.constants.draftEntitiesNames; // just a helper to add a
after each block + +const addBreaklines = children => children.map((child, index) => [child, _react.default.createElement("br", { + key: index + 1 +})]); +/** + * Define the renderers + */ + + +const renderers = { + /** + * Those callbacks will be called recursively to render a nested structure + */ + inline: { + // The key passed here is just an index based on rendering order inside a block + BOLD: (children, { + key + }) => _react.default.createElement("strong", { + key: key + }, children), + ITALIC: (children, { + key + }) => _react.default.createElement("em", { + key: key + }, children), + UNDERLINE: (children, { + key + }) => _react.default.createElement("u", { + key: key + }, children), + CODE: (children, { + key + }) => _react.default.createElement("span", { + key: key + }, children) + }, + + /** + * Blocks receive children and depth + * Note that children are an array of blocks with same styling, + */ + blocks: { + 'unstyled': children => children.map((child, index) => _react.default.createElement("span", { + key: index, + className: 'footnote-p' + }, child)), + 'blockquote': children => _react.default.createElement("span", { + className: 'footnote-blockquote' + }, addBreaklines(children)), + 'header-one': (children, { + keys + }) => children.map((child, index) => _react.default.createElement("span", { + className: 'footnote-h1', + key: index, + id: keys[index] + }, child)), + 'header-two': (children, { + keys + }) => children.map((child, index) => _react.default.createElement("span", { + className: 'footnote-h2', + key: index, + id: keys[index] + }, child)), + 'header-three': (children, { + keys + }) => children.map((child, index) => _react.default.createElement("span", { + className: 'footnote-h3', + key: index, + id: keys[index] + }, child)), + 'header-four': (children, { + keys + }) => children.map((child, index) => _react.default.createElement("span", { + className: 'footnote-h4', + key: index, + id: keys[index] + }, child)), + 'header-five': (children, { + keys + }) => children.map((child, index) => _react.default.createElement("span", { + className: 'footnote-h5', + key: index, + id: keys[index] + }, child)), + 'header-six': (children, { + keys + }) => children.map((child, index) => _react.default.createElement("span", { + className: 'footnote-h6', + key: index, + id: keys[index] + }, child)), + // You can also access the original keys of the blocks + 'code-block': (children, { + keys + }) => _react.default.createElement("span", { + className: 'footnote-pre', + key: keys[0] + }, addBreaklines(children)), + // or depth for nested lists + 'unordered-list-item': (children, { + depth, + keys + }) => _react.default.createElement("span", { + // className={ 'footnote-ul' } + key: keys[keys.length - 1], + className: `ul-level-${depth}` + }, children.map((child, index) => _react.default.createElement("span", { + className: 'footnote-li', + key: index + }, child))), + 'ordered-list-item': (children, { + depth, + keys + }) => _react.default.createElement("span", { + // className={ 'footnote-ol' } + key: keys.join('|'), + className: `ol-level-${depth}` + }, children.map((child, index) => _react.default.createElement("span", { + className: 'footnote-li', + key: keys[index] + }, child))) + /* + * If your blocks use meta data it can also be accessed like keys + * atomic: (children, { keys, data }) => children.map((child, i) => {child}), + */ + + }, + + /** + * Entities receive children and the entity data + */ + entities: { + // // key is the entity key value from raw + [LINK]: (children, data, { + key + }) => _react.default.createElement(_Link.default, { + key: key, + to: data.url + }, children), + [BLOCK_ASSET]: (children, data, { + key + }) => { + return _react.default.createElement(_BlockAssetWrapper.default, { + key: key, + data: data + }); + }, + [INLINE_ASSET]: (children, data, { + key + }) => { + return _react.default.createElement(_InlineAssetWrapper.default, { + data: data, + key: key + }, children); + }, + [SECTION_POINTER]: (children, data, { + key + }) => { + return _react.default.createElement(_InternalLink.default, { + key: key, + sectionId: data.sectionId + }, children); + } + } +}; +/** + * Renderer class for building raw-to-react rendering react component instances + */ + +class Renderer extends _react.Component { + /** + * constructor + * @param {object} props - properties given to instance at instanciation + */ + constructor(props) { + super(props); + } + /** + * Determines whether to update the component or not + * @param {object} nextProps - the future properties of the component + * @return {boolean} shouldUpdate - yes or no + */ + + + shouldComponentUpdate() { + return true; // return this.props.raw !== nextProps.raw; + } + /** + * Displays something when no suitable content state is provided to the renderer + * @return {ReactElement} default message + */ + + + renderWarning() { + return _react.default.createElement("div", null); + } + /** + * Renders the component + * @return {ReactElement} component - the component + */ + + + render() { + const { + raw + } = this.props; + + if (!raw) { + return this.renderWarning(); + } + + const rendered = (0, _redraft.default)(raw, renderers); // redraft can return a null if there's nothing to render + + if (!rendered) { + return this.renderWarning(); + } + + return _react.default.createElement("span", null, rendered); + } + +} +/** + * Component's properties types + */ + + +Renderer.propTypes = { + /** + * Draft-js raw representation of some contents + * see https://draftjs.org/docs/api-reference-data-conversion.html + */ + raw: _propTypes.default.object +}; +var _default = Renderer; +exports.default = _default; \ No newline at end of file diff --git a/dist/components/FrontCover.js b/dist/components/FrontCover.js new file mode 100644 index 0000000..fc2d624 --- /dev/null +++ b/dist/components/FrontCover.js @@ -0,0 +1,57 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +var _MarkdownPlayer = _interopRequireDefault(require("./MarkdownPlayer")); + +var _Authors = _interopRequireDefault(require("./Authors")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var _default = ({ + production: { + metadata + }, + edition, + data: { + backgroundColor, + customCoverFooter, + animatedBackground + } = {}, + id +}) => { + const { + data: editionData = {} + } = edition; + const finalTitle = editionData.publicationTitle || metadata.title; + const finalSubtitle = editionData.publicationSubtitle || metadata.subtitle; + return _react.default.createElement("section", { + id: 'front-cover', + className: `composition-block front-cover ${animatedBackground && animatedBackground !== 'none' ? `with-animated-background-${animatedBackground}` : ''}`, + style: { + backgroundColor + } + }, _react.default.createElement("div", { + className: 'front-cover-content' + }, _react.default.createElement("h1", { + id: id, + className: 'front-cover-title' + }, finalTitle), finalSubtitle && _react.default.createElement("h2", { + className: 'front-cover-subtitle' + }, finalSubtitle), _react.default.createElement("h3", { + className: 'front-cover-authors' + }, metadata.authors && _react.default.createElement(_Authors.default, { + authors: metadata.authors + }))), customCoverFooter && customCoverFooter.length > 0 && _react.default.createElement("div", { + className: 'front-cover-footer' + }, _react.default.createElement(_MarkdownPlayer.default, { + src: customCoverFooter + }))); +}; + +exports.default = _default; \ No newline at end of file diff --git a/dist/components/Glossary.js b/dist/components/Glossary.js new file mode 100644 index 0000000..4722967 --- /dev/null +++ b/dist/components/Glossary.js @@ -0,0 +1,174 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +var _propTypes = _interopRequireDefault(require("prop-types")); + +var _reactCiteproc = require("react-citeproc"); + +var _MarkdownPlayer = _interopRequireDefault(require("./MarkdownPlayer")); + +var _peritextUtils = require("peritext-utils"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +const buildGlossary = ({ + production, + edition, + options +}) => { + const { + contextualizers, + resources + } = production; + const { + showUncited = false, + glossaryTypes = ['person', 'place', 'event', 'notion', 'other'] + } = options; + let items; + const usedContextualizations = (0, _peritextUtils.getContextualizationsFromEdition)(production, edition); + + if (showUncited) { + items = Object.keys(production.resources).filter(resourceId => production.resources[resourceId].metadata.type === 'glossary').map(resourceId => production.resources[resourceId]).map(resource => { + return { + resource, + mentions: usedContextualizations.filter(c => c.contextualization.resourceId === resource.id) + }; + }); + } else { + items = usedContextualizations.filter(element => { + const contextualization = element.contextualization; + const contextualizerId = contextualization.contextualizerId; + const contextualizer = contextualizers[contextualizerId]; + return contextualizer && contextualizer.type === 'glossary'; + }).map(element => { + const contextualization = element.contextualization; + return _objectSpread({}, contextualization, { + contextualizer: contextualizers[contextualization.contextualizerId], + resource: resources[contextualization.resourceId], + contextContent: (0, _peritextUtils.buildContextContent)(production, contextualization.id), + containerId: element.containerId + }); + }).reduce((entries, contextualization) => { + return _objectSpread({}, entries, { + [contextualization.resourceId]: { + resource: contextualization.resource, + mentions: entries[contextualization.resourceId] ? entries[contextualization.resourceId].mentions.concat(contextualization) : [contextualization] + } + }); + }, {}); + items = Object.keys(items).map(resourceId => ({ + resource: items[resourceId].resource, + mentions: items[resourceId].mentions + })); + } + + const glossaryMentions = items.filter(item => { + return glossaryTypes.includes(item.resource.data.entryType); + }).sort((a, b) => { + if (a.resource.data.name.toLowerCase() > b.resource.data.name.toLowerCase()) { + return 1; + } else { + return -1; + } + }); + return glossaryMentions; +}; + +const Glossary = ({ + production, + edition, + translate, + citations, + citationStyle, + citationLocale, + id, + data = { + showMentions: true, + showDescriptions: true + }, + // LinkComponent: propLinkComponent, + MentionComponent: propMentionComponent +}, { + // LinkComponent: contextLinkComponent, + MentionComponent: contextMentionComponent +}) => { + // const LinkComponent = propLinkComponent || contextLinkComponent; + const MentionComponent = propMentionComponent || contextMentionComponent; + const { + showMentions, + customTitle, + showDescriptions + } = data; + const glossary = buildGlossary({ + options: data, + production, + edition + }); + return _react.default.createElement("section", { + className: 'composition-block glossary', + title: customTitle || translate('Glossary list') + }, _react.default.createElement(_reactCiteproc.ReferencesManager, { + style: citationStyle, + locale: citationLocale, + items: citations.citationItems, + citations: citations.citationData, + componentClass: 'references-manager' + }, _react.default.createElement("h2", { + className: 'composition-block-title peritext-block-title', + id: `glossary-block-${id}` + }, customTitle || translate('Glossary list')), _react.default.createElement("ul", { + className: 'mentions-container' + }, glossary.map((entry, index) => { + // const entryName = entry.title; + return _react.default.createElement("li", { + key: index, + id: entry.resource.metadata.id, + className: 'mention-item' + }, _react.default.createElement("div", { + className: 'title' + }, entry.resource.data.name), showDescriptions && _react.default.createElement("div", { + className: 'description' + }, _react.default.createElement(_MarkdownPlayer.default, { + src: entry.resource.data.description + })), showMentions && entry.mentions.length > 0 && _react.default.createElement("div", { + className: 'mentions-list' + }, entry.mentions.filter(mention => mention !== undefined && mention.contextContent).map((mention, count) => { + const { + contextContent: { + /* + * targetContents, + * contents, + * sectionTitle, + */ + sectionId + }, + id: thatId, + containerId + } = mention; + return _react.default.createElement(MentionComponent, { + key: count, + href: `#contextualization-${containerId}-${thatId}`, + sectionId: sectionId + }); + }).reduce((prev, curr, thatIndex) => { + return thatIndex > 0 ? [prev, ', ', curr] : [curr]; + }, []))); + })))); +}; + +Glossary.contextTypes = { + LinkComponent: _propTypes.default.func, + MentionComponent: _propTypes.default.func +}; +var _default = Glossary; +exports.default = _default; \ No newline at end of file diff --git a/dist/components/Head.js b/dist/components/Head.js new file mode 100644 index 0000000..bfc5d76 --- /dev/null +++ b/dist/components/Head.js @@ -0,0 +1,78 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +var _reactHelmet = require("react-helmet"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var _default = ({ + pageTitle, + authors = [], + tags = [], + description = '', + url = '' +}) => { + const authorsStr = authors.map(author => `${author.given} ${author.family}`).join(', '); + return _react.default.createElement(_reactHelmet.Helmet, null, _react.default.createElement("title", null, pageTitle), _react.default.createElement("meta", { + name: 'generator', + content: 'peritext' + }), _react.default.createElement("meta", { + name: 'DC.Title', + lang: 'fr', + content: pageTitle + }), _react.default.createElement("meta", { + name: 'DC.Date.created', + schema: 'W3CDTF', + content: new Date().toISOString() + }), _react.default.createElement("meta", { + name: 'author', + content: authorsStr + }), _react.default.createElement("meta", { + name: 'keywords', + content: tags.join(',') + }), _react.default.createElement("meta", { + name: 'description', + content: description + }), _react.default.createElement("meta", { + name: 'viewport', + content: 'user-scalable=no,width=device-width' + }), _react.default.createElement("meta", { + name: 'twitter:card', + value: 'summary' + }), _react.default.createElement("meta", { + name: 'twitter:site', + content: url + }), _react.default.createElement("meta", { + name: 'twitter:title', + content: pageTitle + }), _react.default.createElement("meta", { + name: 'twitter:description', + content: description + }), _react.default.createElement("meta", { + itemProp: 'name', + content: pageTitle + }), _react.default.createElement("meta", { + itemProp: 'description', + content: description + }), _react.default.createElement("meta", { + property: 'og:title', + content: pageTitle + }), _react.default.createElement("meta", { + property: 'og:type', + content: 'website' + }), _react.default.createElement("meta", { + property: 'og:url', + content: url + }), _react.default.createElement("meta", { + property: 'og:description', + content: description + })); +}; + +exports.default = _default; \ No newline at end of file diff --git a/dist/components/InlineAssetWrapper.js b/dist/components/InlineAssetWrapper.js new file mode 100644 index 0000000..8a19a54 --- /dev/null +++ b/dist/components/InlineAssetWrapper.js @@ -0,0 +1,86 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +var _propTypes = _interopRequireDefault(require("prop-types")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const InlineAssetWrapper = ({ + data, + children +}, context) => { + const { + production, + containerId + } = context; + const assetId = data.asset && data.asset.id; + + if (!assetId || !production) { + return null; + } + + const contextualization = production.contextualizations[assetId]; + + if (!contextualization) { + return null; + } + + const contextualizer = production.contextualizers[contextualization.contextualizerId]; + const resource = production.resources[contextualization.resourceId]; + const contextualizers = context.contextualizers; + const contextualizerModule = contextualizers[contextualizer.type]; + const Component = contextualizerModule && contextualizerModule.Inline; + + if (contextualizer && Component) { + /** + * @todo this is a fix for a rendering bug + */ + if (contextualizer.type === 'glossary') { + return children; + } + + return _react.default.createElement("span", { + className: `inline-contextualization-container ${contextualizer.type}`, + id: `contextualization-${containerId}-${assetId}` + }, _react.default.createElement(Component, { + contextualization: contextualization, + contextualizer: contextualizer, + resource: resource, + renderingMode: 'paged' + }, children)); + } + + return null; +}; +/** + * Component's properties types + */ + + +InlineAssetWrapper.propTypes = { + /** + * Corresponds to the data initially embedded in a draft-js entity + */ + data: _propTypes.default.shape({ + asset: _propTypes.default.shape({ + id: _propTypes.default.string + }) + }) +}; +/** + * Component's context used properties + */ + +InlineAssetWrapper.contextTypes = { + production: _propTypes.default.object, + contextualizers: _propTypes.default.object, + containerId: _propTypes.default.string +}; +var _default = InlineAssetWrapper; +exports.default = _default; \ No newline at end of file diff --git a/dist/components/InternalLink.js b/dist/components/InternalLink.js new file mode 100644 index 0000000..c7fae16 --- /dev/null +++ b/dist/components/InternalLink.js @@ -0,0 +1,31 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +var _propTypes = _interopRequireDefault(require("prop-types")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const InternalLink = ({ + sectionId, + children +}, { + containerId +}) => _react.default.createElement("a", { + href: `#section-${containerId}-${sectionId}`, + className: 'internal-link' +}, children, '(', _react.default.createElement("span", { + href: `#section-${containerId}-${sectionId}`, + className: ' page-link' +}, 'p'), ')'); + +InternalLink.contextTypes = { + containerId: _propTypes.default.string +}; +var _default = InternalLink; +exports.default = _default; \ No newline at end of file diff --git a/dist/components/Link.js b/dist/components/Link.js new file mode 100644 index 0000000..b50d8dd --- /dev/null +++ b/dist/components/Link.js @@ -0,0 +1,52 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +var _propTypes = _interopRequireDefault(require("prop-types")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * This module exports a stateless reusable external link component + * ============ + * @module perinext/components/Link + */ + +/** + * Renders a link as a pure component + * @param {object} props + * @param {string} props.to - the url to point to + * @param {array} props.children - children elements of the component + * @return {ReactElement} component - the component + */ +const Link = ({ + to, + children +}) => _react.default.createElement("a", { + href: to, + target: 'blank', + rel: 'noopener' +}, children); +/** + * Component's properties types + */ + + +Link.propTypes = { + /** + * url to point to + */ + children: _propTypes.default.array, + + /** + * children react elements + */ + to: _propTypes.default.string +}; +var _default = Link; +exports.default = _default; \ No newline at end of file diff --git a/dist/components/MarkdownPlayer.js b/dist/components/MarkdownPlayer.js new file mode 100644 index 0000000..b3d7c99 --- /dev/null +++ b/dist/components/MarkdownPlayer.js @@ -0,0 +1,20 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +var _reactMarkdown = _interopRequireDefault(require("react-markdown")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var _default = ({ + src = '' +}) => _react.default.createElement(_reactMarkdown.default, { + source: src +}); + +exports.default = _default; \ No newline at end of file diff --git a/dist/components/NotePointer.js b/dist/components/NotePointer.js new file mode 100644 index 0000000..6fa8628 --- /dev/null +++ b/dist/components/NotePointer.js @@ -0,0 +1,87 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +var _propTypes = _interopRequireDefault(require("prop-types")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * This module exports a stateless reusable note pointer component + * ============ + * @module quinoa-production-player/components/NotePointer + */ + +/** + * Renders a note pointer as a pure component + * @param {object} props + * @param {array} props.children - children elements of the component + * @param {array} props.noteId - the id of the note to point to + * @param {object} context - the context data of the component + * @return {ReactElement} component - the component + */ +const NotePointer = ({ + children, + noteId = '' +}, context) => { + const notes = context.notes; + const NoteLinkComponent = context.NoteLinkComponent; + + if (notes) { + const note = notes[noteId]; + + if (note) { + return _react.default.createElement("sup", { + className: 'note-pointer', + id: `note-pointer-${noteId}` + }, NoteLinkComponent ? _react.default.createElement(NoteLinkComponent, { + href: `#note-content-${noteId}` + }, note.order, children) : _react.default.createElement("a", { + href: `#note-content-${noteId}` + }, note.order, children)); + } + + return null; + } + + return null; +}; +/** + * Component's properties types + */ + + +NotePointer.propTypes = { + /** + * Children react components + */ + children: _propTypes.default.array, + + /** + * id of the note to render + */ + noteId: _propTypes.default.string +}; +/** + * Component's context used properties + */ + +NotePointer.contextTypes = { + /** + * Map of available notes to look into + */ + notes: _propTypes.default.object, + + /** + * Triggers a callback upstream when the pointer is clicked + */ + onNoteContentPointerClick: _propTypes.default.func, + NoteLinkComponent: _propTypes.default.func +}; +var _default = NotePointer; +exports.default = _default; \ No newline at end of file diff --git a/dist/components/References.js b/dist/components/References.js new file mode 100644 index 0000000..26b5213 --- /dev/null +++ b/dist/components/References.js @@ -0,0 +1,271 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +var _propTypes = _interopRequireDefault(require("prop-types")); + +var _uniq = _interopRequireDefault(require("lodash/uniq")); + +var _reactCiteproc = require("react-citeproc"); + +var _peritextUtils = require("peritext-utils"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +/** + * Builds an interactive bibliography for a given edition + * @returns {ReactMarkup} + */ +function buildBibliography({ + production, + edition, + citations, + contextualizations, + showUncitedReferences, + resourceTypes, + sortingKey, + sortingAscending +}) { + const { + /* + * contextualizations, + * contextualizers, + */ + resources + } = production; + /** + * Select relevant resources + */ + // filter cited references only + + let citedResourcesIds = showUncitedReferences ? Object.keys(resources) : (0, _uniq.default)(contextualizations.map(element => { + const contextualization = element.contextualization; + return contextualization.resourceId; + })); // filter by type of resource + + citedResourcesIds = citedResourcesIds.filter(resourceId => { + const type = resources[resourceId].metadata.type; + return resourceTypes.includes(type); + }); + let items = citedResourcesIds.map(resourceId => { + const cit = (0, _peritextUtils.resourceToCslJSON)(resources[resourceId]); + const citationKey = cit && cit[0] && cit[0].id; + const mentions = contextualizations.map(element => { + if (element.contextualization.resourceId === resourceId) { + return _objectSpread({}, element, { + id: element.contextualization.id + }); + } + }).filter(s => s); + let biblio; + + if (citations.citationItems[citationKey]) { + biblio = (0, _reactCiteproc.makeBibliography)(citations.citationItems, edition.data.citationStyle.data, edition.data.citationLocale.data, { + select: [{ + field: 'id', + value: citationKey + }] + }); + } else { + biblio = (0, _reactCiteproc.makeBibliography)({ + [resourceId]: _objectSpread({}, cit[0], { + id: resourceId + }) + }, edition.data.citationStyle.data, edition.data.citationLocale.data, { + select: [{ + field: 'id', + value: resourceId + }] + }); + } + + const title = biblio && biblio[1] && biblio[1][0]; + return { + citationKey, + title, + item: citations.citationItems[citationKey] || cit[0], + mentions: mentions.map(mention => _objectSpread({}, mention, { + contextContent: (0, _peritextUtils.buildContextContent)(production, mention.id) + })) + }; + }); + items = items.sort((a, b) => { + switch (sortingKey) { + case 'date': + const datePartsA = a.item.issued && a.item.issued['date-parts']; + const datePartsB = b.item.issued && b.item.issued['date-parts']; + + if (datePartsA && datePartsB && datePartsA.length && datePartsB.length) { + if (datePartsA[0] > datePartsB[0]) { + return 1; + } else if (datePartsA[0] < datePartsB[0]) { + return -1; + } else if (datePartsA.length > 1 && datePartsB.length > 1) { + if (datePartsA[1] > datePartsB[1]) { + return 1; + } else if (datePartsA[1] < datePartsB[1]) { + return -1; + } else return 0; + } else { + return 0; + } + } else if (!datePartsB || datePartsB && !datePartsB.length) { + return -1; + } else if (!datePartsA || datePartsA && !datePartsA.length) { + return 1; + } else { + return 0; + } + + case 'authors': + if (a.item.author && b.item.author) { + const authorsA = a.item.author && a.item.author.map(author => `${author.family}-${author.given}`.toLowerCase()).join(''); + const authorsB = b.item.author && b.item.author.map(author => `${author.family}-${author.given}`.toLowerCase()).join(''); + + if (authorsA > authorsB) { + return 1; + } else return -1; + } else if (!b.item.author) { + return -1; + } else if (!a.item.author) { + return 1; + } else return 0; + + case 'title': + if (a.item.title.toLowerCase() > b.item.title.toLowerCase()) { + return 1; + } + + return -1; + + default: + break; + } + }); + + if (!sortingAscending) { + items = items.reverse(); + } + + return items; +} + +const References = ({ + production, + edition, + translate, + data = { + showMentions: true, + showUncitedReferences: false, + resourceTypes: ['bib'], + sortingKey: 'authors', + sortingAscending: true + }, + citations, + citationStyle, + citationLocale, + id, + // LinkComponent: propLinkComponent, + MentionComponent: propMentionComponent +}, { + // LinkComponent: contextLinkComponent, + MentionComponent: contextMentionComponent +}) => { + const { + showMentions, + showUncitedReferences, + resourceTypes, + sortingKey, + sortingAscending, + customTitle + } = data; // const LinkComponent = propLinkComponent || contextLinkComponent; + + const MentionComponent = propMentionComponent || contextMentionComponent; + /** + * @todo compute citations based on edition + */ + + const contextualizations = (0, _peritextUtils.getContextualizationsFromEdition)(production, edition); + const references = buildBibliography({ + production, + edition, + citations, + contextualizations, + showUncitedReferences, + resourceTypes, + sortingKey, + sortingAscending + }); + return _react.default.createElement("section", { + className: 'composition-block references', + title: customTitle || translate('References') + }, _react.default.createElement(_reactCiteproc.ReferencesManager, { + style: citationStyle, + locale: citationLocale, + items: citations.citationItems, + citations: citations.citationData, + componentClass: 'references-manager' + }, _react.default.createElement("h2", { + id: `reference-block-${id}`, + className: 'composition-block-title peritext-block-title' + }, customTitle || translate('References')), _react.default.createElement("ul", { + className: 'mentions-container' + }, references.map((entry, index) => { + const entryName = entry.title; + return _react.default.createElement("li", { + key: index, + id: entry.citationKey, + className: 'mention-item' + }, _react.default.createElement("div", { + className: 'title' + }, _react.default.createElement("div", { + dangerouslySetInnerHTML: { + __html: entryName + /* eslint react/no-danger: 0 */ + + } + })), showMentions && entry.mentions.find(mention => mention && mention.contextContent) && _react.default.createElement("div", { + className: 'mentions-list' + }, entry.mentions.filter(mention => mention !== undefined && mention.contextContent).map((mention, count) => { + const { + contextContent: { + /* + * targetContents, + * contents, + * sectionTitle, + */ + sectionId + }, + id: thatId, + containerId + } = mention; + return _react.default.createElement(MentionComponent, { + key: count, + href: `#contextualization-${containerId}-${thatId}`, + sectionId: sectionId + }); + }).reduce((prev, curr, thatIndex) => { + if (thatIndex === 0) { + return [curr]; + } + + return [prev, ', ', curr]; + }, []))); + })))); +}; + +References.contextTypes = { + LinkComponent: _propTypes.default.func, + MentionComponent: _propTypes.default.func +}; +var _default = References; +exports.default = _default; \ No newline at end of file diff --git a/dist/components/Renderer.js b/dist/components/Renderer.js new file mode 100644 index 0000000..31f70eb --- /dev/null +++ b/dist/components/Renderer.js @@ -0,0 +1,295 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireWildcard(require("react")); + +var _propTypes = _interopRequireDefault(require("prop-types")); + +var _redraft = _interopRequireDefault(require("redraft")); + +var _peritextSchemas = require("peritext-schemas"); + +var _Link = _interopRequireDefault(require("./Link")); + +var _BlockAssetWrapper = _interopRequireDefault(require("./BlockAssetWrapper")); + +var _InlineAssetWrapper = _interopRequireDefault(require("./InlineAssetWrapper")); + +var _NotePointer = _interopRequireDefault(require("./NotePointer")); + +var _Footnote = _interopRequireDefault(require("./Footnote")); + +var _InternalLink = _interopRequireDefault(require("./InternalLink")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +const { + LINK, + BLOCK_ASSET, + INLINE_ASSET, + SECTION_POINTER, + NOTE_POINTER +} = _peritextSchemas.constants.draftEntitiesNames; // just a helper to add a
after each block + +const addBreaklines = children => children.map((child, index) => [child, _react.default.createElement("br", { + key: index +})]); +/** + * Define the renderers + */ + + +const renderers = { + /** + * Those callbacks will be called recursively to render a nested structure + */ + inline: { + // The key passed here is just an index based on rendering order inside a block + BOLD: (children, { + key + }) => _react.default.createElement("strong", { + key: key + }, children), + ITALIC: (children, { + key + }) => _react.default.createElement("em", { + key: key + }, children), + UNDERLINE: (children, { + key + }) => _react.default.createElement("u", { + key: key + }, children), + CODE: (children, { + key + }) => _react.default.createElement("span", { + key: key + }, children) + }, + + /** + * Blocks receive children and depth + * Note that children are an array of blocks with same styling, + */ + blocks: { + 'unstyled': children => children.map((child, index) => _react.default.createElement("div", { + className: 'unstyled', + key: index + }, child)), + 'blockquote': (children, index) => _react.default.createElement("blockquote", { + key: index + }, addBreaklines(children)), + 'header-one': (children, { + keys + }) => children.map((child, index) => _react.default.createElement("h1", { + key: index, + id: keys[index] + }, child)), + 'header-two': (children, { + keys + }) => children.map((child, index) => _react.default.createElement("h2", { + key: index, + id: keys[index] + }, child)), + 'header-three': (children, { + keys + }) => children.map((child, index) => _react.default.createElement("h3", { + key: index, + id: keys[index] + }, child)), + 'header-four': (children, { + keys + }) => children.map((child, index) => _react.default.createElement("h4", { + key: index, + id: keys[index] + }, child)), + 'header-five': (children, { + keys + }) => children.map((child, index) => _react.default.createElement("h5", { + key: index, + id: keys[index] + }, child)), + 'header-six': (children, { + keys + }) => children.map((child, index) => _react.default.createElement("h6", { + key: index, + id: keys[index] + }, child)), + // You can also access the original keys of the blocks + 'code-block': (children, { + keys + }) => _react.default.createElement("pre", { + key: keys[0] + }, addBreaklines(children)), + // or depth for nested lists + 'unordered-list-item': (children, { + depth, + keys + }) => _react.default.createElement("ul", { + key: keys[keys.length - 1], + className: `ul-level-${depth}` + }, children.map((child, index) => _react.default.createElement("li", { + key: index + }, child))), + 'ordered-list-item': (children, { + depth, + keys + }) => _react.default.createElement("ol", { + key: keys.join('|'), + className: `ol-level-${depth}` + }, children.map((child, index) => _react.default.createElement("li", { + key: keys[index] + }, child))) + /* + * If your blocks use meta data it can also be accessed like keys + * atomic: (children, { keys, data }) => children.map((child, i) => {child}), + */ + + }, + + /** + * Entities receive children and the entity data + */ + entities: { + // // key is the entity key value from raw + [LINK]: (children, data, { + key + }) => _react.default.createElement(_Link.default, { + key: key, + to: data.url + }, children), + [BLOCK_ASSET]: (children, data, { + key + }) => { + return _react.default.createElement(_BlockAssetWrapper.default, { + key: key, + data: data + }); + }, + [INLINE_ASSET]: (children, data, { + key + }) => { + return _react.default.createElement(_InlineAssetWrapper.default, { + data: data, + key: key + }, children); + }, + [SECTION_POINTER]: (children, data, { + key + }) => { + return _react.default.createElement(_InternalLink.default, { + key: key, + sectionId: data.sectionId + }, children); + }, + [NOTE_POINTER]: (children, data, { + key + }) => { + return _react.default.createElement(_NotePointer.default, { + key: key, + children: children, + noteId: data.noteId + }); + } + } +}; +/** + * Renderer class for building raw-to-react rendering react component instances + */ + +class Renderer extends _react.Component { + /** + * constructor + * @param {object} props - properties given to instance at instanciation + */ + constructor(props) { + super(props); + + _defineProperty(this, "getChildContext", () => ({ + containerId: this.props.containerId + })); + } + + /** + * Determines whether to update the component or not + * @param {object} nextProps - the future properties of the component + * @return {boolean} shouldUpdate - yes or no + */ + shouldComponentUpdate() { + return true; + } + /** + * Displays something when no suitable content state is provided to the renderer + * @return {ReactElement} default message + */ + + + renderWarning() { + return _react.default.createElement("div", null); + } + /** + * Renders the component + * @return {ReactElement} component - the component + */ + + + render() { + const { + raw, + notesPosition + } = this.props; + + if (!raw) { + return this.renderWarning(); + } + + if (notesPosition === 'footnotes' || notesPosition === 'sidenotes') { + renderers.entities.NOTE_POINTER = (children, data, { + key + }) => { + return _react.default.createElement(_Footnote.default, { + key: key, + children: children, + noteId: data.noteId, + notesPosition: notesPosition + }); + }; + } + + const rendered = (0, _redraft.default)(raw, renderers); // redraft can return a null if there's nothing to render + + if (!rendered) { + return this.renderWarning(); + } + + return _react.default.createElement("div", { + className: 'rendered-content' + }, rendered); + } + +} +/** + * Component's properties types + */ + + +Renderer.propTypes = { + /** + * Draft-js raw representation of some contents + * see https://draftjs.org/docs/api-reference-data-conversion.html + */ + raw: _propTypes.default.object +}; +Renderer.childContextTypes = { + containerId: _propTypes.default.string +}; +var _default = Renderer; +exports.default = _default; \ No newline at end of file diff --git a/dist/components/Section.js b/dist/components/Section.js new file mode 100644 index 0000000..d6c89d6 --- /dev/null +++ b/dist/components/Section.js @@ -0,0 +1,100 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireWildcard(require("react")); + +var _propTypes = _interopRequireDefault(require("prop-types")); + +var _reactCiteproc = require("react-citeproc"); + +var _Renderer = _interopRequireDefault(require("./Renderer")); + +var _EndNotes = _interopRequireDefault(require("./EndNotes")); + +var _Authors = _interopRequireDefault(require("./Authors")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +class Section extends _react.Component { + constructor(props) { + super(props); + + _defineProperty(this, "getChildContext", () => ({ + notes: this.props.section.notes + })); + + _defineProperty(this, "render", () => { + const { + citations, + citationStyle, + citationLocale, + section: { + id, + metadata: { + title, + subtitle, + authors = [] + }, + contents + }, + containerId, + notesPosition, + production, + translate, + publicationTitle, + publicationSubtitle + } = this.props; + return _react.default.createElement("section", { + className: `section has-notes-position-${notesPosition}`, + title: title, + id: `section-${containerId}-${id}` + }, _react.default.createElement(_reactCiteproc.ReferencesManager, { + style: citationStyle, + locale: citationLocale, + items: citations.citationItems, + citations: citations.citationData, + componentClass: 'references-manager' + }, _react.default.createElement("h2", { + className: 'composition-block-title section-title' + }, title), _react.default.createElement("em", { + className: 'section-title-running' + }, title), _react.default.createElement("em", { + className: 'publication-title-running' + }, publicationTitle), subtitle && _react.default.createElement("h2", { + className: 'section-subtitle' + }, subtitle), authors.length > 0 && _react.default.createElement("h3", { + className: 'section-authors' + }, _react.default.createElement(_Authors.default, { + authors: authors + })), _react.default.createElement(_Renderer.default, { + raw: contents, + notesPosition: notesPosition, + containerId: containerId + }), notesPosition === 'endOfSections' && _react.default.createElement(_EndNotes.default, { + sectionsIds: [id], + production: production, + translate: translate, + citations: citations, + citationStyle: citationStyle, + citationLocale: citationLocale, + publicationTitle: publicationTitle, + publicationSubtitle: publicationSubtitle + }))); + }); + } + +} + +var _default = Section; +exports.default = _default; +Section.childContextTypes = { + notes: _propTypes.default.object +}; \ No newline at end of file diff --git a/dist/components/TableOfContents.js b/dist/components/TableOfContents.js new file mode 100644 index 0000000..52850b1 --- /dev/null +++ b/dist/components/TableOfContents.js @@ -0,0 +1,49 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const TocElement = ({ + title, + href, + level = 0 +}) => _react.default.createElement("li", { + className: `table-of-contents-element level-${level}` +}, _react.default.createElement("span", { + className: 'element-title' +}, title), _react.default.createElement("span", { + className: 'element-leading' +}), _react.default.createElement("a", { + className: 'page-link', + href: `#${href}` +}, "p.")); + +var _default = ({ + tableOfContents, + data: { + customTitle, + displayPageNumber + } = {}, + translate +}) => _react.default.createElement("section", { + className: `composition-block table-of-contents ${displayPageNumber ? 'has-page-number' : ''}` +}, _react.default.createElement("h2", { + className: 'composition-block-title peritext-block-title' +}, customTitle && customTitle.trim().length ? customTitle : translate('Table of contents')), _react.default.createElement("ul", { + className: 'table-of-contents-elements-container' +}, tableOfContents.map((item, index) => { + return _react.default.createElement(TocElement, { + key: index, + title: item.title, + href: item.href, + level: item.level + }); +}))); + +exports.default = _default; \ No newline at end of file diff --git a/dist/components/TitlePage.js b/dist/components/TitlePage.js new file mode 100644 index 0000000..c570c7c --- /dev/null +++ b/dist/components/TitlePage.js @@ -0,0 +1,51 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +var _MarkdownPlayer = _interopRequireDefault(require("./MarkdownPlayer")); + +var _Authors = _interopRequireDefault(require("./Authors")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var _default = ({ + production: { + metadata + }, + edition, + data: { + customCoverFooter + } = {}, + id +}) => { + const { + data: editionData = {} + } = edition; + const finalTitle = editionData.publicationTitle || metadata.title; + const finalSubtitle = editionData.publicationSubtitle || metadata.subtitle; + return _react.default.createElement("section", { + className: 'composition-block title-page' + }, _react.default.createElement("div", { + className: 'title-page-content' + }, _react.default.createElement("h1", { + id: id, + className: 'title-page-title' + }, finalTitle), finalSubtitle && _react.default.createElement("h2", { + className: 'title-page-subtitle' + }, finalSubtitle), _react.default.createElement("h3", { + className: 'title-page-authors' + }, metadata.authors && _react.default.createElement(_Authors.default, { + authors: metadata.authors + }))), customCoverFooter && customCoverFooter.length > 0 && _react.default.createElement("div", { + className: 'title-page-footer' + }, _react.default.createElement(_MarkdownPlayer.default, { + src: customCoverFooter + }))); +}; + +exports.default = _default; \ No newline at end of file diff --git a/dist/components/Wrapper.js b/dist/components/Wrapper.js new file mode 100644 index 0000000..2c9e9b9 --- /dev/null +++ b/dist/components/Wrapper.js @@ -0,0 +1,428 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireWildcard(require("react")); + +var _propTypes = _interopRequireDefault(require("prop-types")); + +var _peritextUtils = require("peritext-utils"); + +var _FrontCover = _interopRequireDefault(require("./FrontCover")); + +var _TitlePage = _interopRequireDefault(require("./TitlePage")); + +var _BackCover = _interopRequireDefault(require("./BackCover")); + +var _Colophon = _interopRequireDefault(require("./Colophon")); + +var _References = _interopRequireDefault(require("./References")); + +var _Glossary = _interopRequireDefault(require("./Glossary")); + +var _EndNotes = _interopRequireDefault(require("./EndNotes")); + +var _DefaultLinkComponent = _interopRequireDefault(require("./DefaultLinkComponent")); + +var _DefaultMentionComponent = _interopRequireDefault(require("./DefaultMentionComponent")); + +var _DefaultSectionLinkComponent = _interopRequireDefault(require("./DefaultSectionLinkComponent")); + +var _MarkdownPlayer = _interopRequireDefault(require("./MarkdownPlayer")); + +var _TableOfContents = _interopRequireDefault(require("./TableOfContents")); + +var _Section = _interopRequireDefault(require("./Section")); + +var _defaultStyle = _interopRequireDefault(require("../defaultStyle")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } + +const EmptyPage = () => _react.default.createElement("div", { + className: 'composition-block empty-page' +}); + +const updateStyles = props => { + const { + edition: { + data = {} + }, + contextualizers = {} + } = props; + const { + style: { + css = '', + mode = 'merge' + } = { + css: '' + } + } = data; + const contextualizersStyles = Object.keys(contextualizers).map(type => contextualizers[type] && contextualizers[type].defaultCss || '').join('\n'); + + if (mode === 'merge') { + return [_defaultStyle.default, // templateStylesheet, + contextualizersStyles, css].join('\n'); + } else { + // styleMode === 'replace' + return [// templateStylesheet, + contextualizersStyles, css].join('\n'); + } +}; +/** + * @todo externalize + */ + + +const buildToc = (production, edition, translate) => { + const summary = edition.data.plan.summary; // returns [{level, title, href}] + + return summary.reduce((res, element) => { + const { + data = {} + } = element; + + switch (element.type) { + case 'customPage': + const { + title, + displayInTableOfContents + } = data; + + if (displayInTableOfContents) { + return [...res, { + title, + level: 0, + href: `custom-block-${element.id}` + }]; + } + + return res; + + case 'sections': + const { + id + } = element; + const { + customSummary = { + active: false + } + } = data; + + if (customSummary.active) { + const { + summary: thatCustomSummary + } = customSummary; + return [...res, ...thatCustomSummary.map(el => { + const thatSection = production.sections[el.id]; + return { + title: thatSection && thatSection.metadata.title, + level: el.level, + href: `section-${id}-${el.id}` + }; + }).filter(s => s)]; + } + + return [...res, ...production.sectionsOrder.map(sectionId => { + const thatSection = production.sections[sectionId]; + return { + title: thatSection && thatSection.metadata.title, + level: thatSection && thatSection.metadata.level || 0, + href: `section-${id}-${sectionId}` + }; + })]; + + case 'glossary': + return [...res, { + title: data.customTitle || translate('Glossary list'), + level: 0, + href: `glossary-block-${element.id}` + }]; + + case 'references': + return [...res, { + level: 0, + title: data.customTitle || translate('References'), + href: `reference-block-${element.id}` + }]; + + default: + return res; + } + }, []); +}; + +const buildSectionBlockSummary = (sectionBlock, production) => { + if (sectionBlock.customSummary && sectionBlock.customSummary.active) { + return sectionBlock.customSummary.summary.map(el => el.id); + } + + return production.sectionsOrder; +}; + +const Sections = ({ + production, + edition, + translate, + data = {}, + citations, + citationStyle, + citationLocale, + publicationTitle, + publicationSubtitle, + id +}) => { + const summary = edition.data.plan.summary; + const notesPosition = data.notesPosition || 'footnotes'; + const sectionsBlocks = summary.filter(s => s.type === 'sections'); + const sectionsIds = sectionsBlocks.reduce((res, sectionBlock) => { + // @todo handle custom sections order + return [...res, ...buildSectionBlockSummary(sectionBlock, production)]; + }, []); + return [...sectionsIds.map((sectionId, index) => { + const section = production.sections[sectionId]; + return _react.default.createElement(_Section.default, { + section: section, + notesPosition: notesPosition, + key: `${index}-${sectionId}`, + production: production, + containerId: id, + translate: translate, + citations: citations, + citationStyle: citationStyle, + citationLocale: citationLocale, + publicationTitle: publicationTitle, + publicationSubtitle: publicationSubtitle + }); + }), // @todo endnotes relative to sections and not to production sectionsOrder + notesPosition === 'endOfContents' ? _react.default.createElement(_EndNotes.default, { + key: 'endnotes', + sectionsIds: sectionsIds, + production: production, + translate: translate, + citations: citations, + citationStyle: citationStyle, + citationLocale: citationLocale, + publicationTitle: publicationTitle, + publicationSubtitle: publicationSubtitle + }) : null]; +}; + +const renderSummary = ({ + production, + edition, + translate, + citations +}) => { + const summary = edition.data.plan.summary; + const citationStyle = edition.data.citationStyle.data; + const citationLocale = edition.data.citationLocale.data; + const { + data: editionData = {} + } = edition; + const { + metadata + } = production; + const finalTitle = editionData.publicationTitle || metadata.title; + const finalSubtitle = editionData.publicationSubtitle || metadata.subtitle; + return summary.map((element, index) => { + switch (element.type) { + case 'frontCover': + return _react.default.createElement(_FrontCover.default, _extends({ + key: index, + production: production, + edition: edition, + translate: translate + }, element)); + + case 'titlePage': + return _react.default.createElement(_TitlePage.default, _extends({ + key: index, + production: production, + edition: edition, + translate: translate + }, element)); + + case 'colophon': + return _react.default.createElement(_Colophon.default, _extends({ + key: index, + production: production, + edition: edition, + translate: translate + }, element)); + + case 'backCover': + return _react.default.createElement(_BackCover.default, _extends({ + key: index, + production: production, + edition: edition, + translate: translate + }, element)); + + case 'emptyPage': + return _react.default.createElement(EmptyPage, { + key: index + }); + + case 'tableOfContents': + const toc = buildToc(production, edition, translate); + return _react.default.createElement(_TableOfContents.default, { + key: index, + data: element.data, + tableOfContents: toc, + translate: translate, + id: element.id + }); + + case 'customPage': + return _react.default.createElement("div", { + id: element.data.customCssId || element.id, + key: index, + className: `composition-block custom-page ${element.data.displayPageNumber ? 'has-page-number' : ''}` + }, element.data.title && _react.default.createElement("h1", { + id: `custom-block-${element.id}`, + className: 'composition-block-title peritext-block-title' + }, element.data.title), element.data.markdownContents && _react.default.createElement(_MarkdownPlayer.default, { + src: element.data.markdownContents + })); + + case 'sections': + return _react.default.createElement(Sections, _extends({ + key: index, + production: production, + edition: edition, + translate: translate, + citations: citations, + citationStyle: citationStyle, + citationLocale: citationLocale, + publicationTitle: finalTitle, + publicationSubtitle: finalSubtitle + }, element)); + + case 'glossary': + return _react.default.createElement(_Glossary.default, _extends({ + key: index, + production: production, + edition: edition, + translate: translate, + citations: citations, + citationStyle: citationStyle, + citationLocale: citationLocale + }, element)); + + case 'references': + return _react.default.createElement(_References.default, _extends({ + key: index, + production: production, + edition: edition, + translate: translate, + citations: citations, + citationStyle: citationStyle, + citationLocale: citationLocale + }, element)); + + default: + return _react.default.createElement("div", { + id: element.id, + className: 'composition-block', + key: index + }, element.type); + } + }); +}; + +class Template extends _react.Component { + constructor(props) { + super(props); + + _defineProperty(this, "shouldComponentUpdate", () => true); + + _defineProperty(this, "translate", key => { + const { + locale = {} + } = this.props; + return locale[key] || key; + }); + } + + getChildContext() { + return { + LinkComponent: this.props.LinkComponent || _DefaultLinkComponent.default, + MentionComponent: this.props.MentionComponent || _DefaultMentionComponent.default, + SectionLinkComponent: this.props.SectionLinkComponent || _DefaultSectionLinkComponent.default, + production: this.props.production, + productionAssets: this.props.production.assets, + contextualizers: this.props.contextualizers, + translate: this.translate + }; + } + + render() { + const { + props: { + production, + edition, + contextualizers, + renderAdditionalHTML = false + }, + translate + } = this; + const { + data = {} + } = edition; + const { + additionalHTML = '' + } = data; + const citations = (0, _peritextUtils.buildCitations)(production); + const finalStyles = updateStyles({ + edition, + contextualizers + }); + /** + * We render an array + * to have our sections as a flat collection + * which facilitates @paged rules about pages breaks + */ + + return [...renderSummary({ + production, + edition, + translate, + citations + }), _react.default.createElement("style", { + key: 'styles', + dangerouslySetInnerHTML: { + __html: finalStyles + /* eslint react/no-danger : 0 */ + + } + }), renderAdditionalHTML ? _react.default.createElement("div", { + id: 'additional-html', + key: 'additional-html', + dangerouslySetInnerHTML: { + /* eslint react/no-danger : 0 */ + __html: `${additionalHTML} ` + } + }) : null].filter(s => s); + } + +} + +exports.default = Template; +Template.childContextTypes = { + LinkComponent: _propTypes.default.func, + MentionComponent: _propTypes.default.func, + SectionLinkComponent: _propTypes.default.func, + translate: _propTypes.default.func, + production: _propTypes.default.object, + productionAssets: _propTypes.default.object, + contextualizers: _propTypes.default.object +}; \ No newline at end of file diff --git a/dist/defaultStyle.js b/dist/defaultStyle.js new file mode 100644 index 0000000..f1cf261 --- /dev/null +++ b/dist/defaultStyle.js @@ -0,0 +1,666 @@ +"use strict"; + +const style = ` + +/* variable used for the template */ +:root { + --color-link-default: #99B6BD;/* bleu délavé */ + --color-link-active:#D4613E;/* rouille */ + --color-text: #4d4c4c; + + font-family:'Source serif pro', serif; + --gutter-medium: .5cm; +} + +/** + * + * PAGES LAYOUTS + * + */ +@page{ + format: A4 portrait; +} + +/* front cover */ + +@page front-cover { + margin: 0e-6cm; +} +@page back-cover { + margin: 0e-6cm; +} +@page front-cover{ +} +@page colophon:left { + margin-top: 33mm; + margin-bottom: 64.8mm; + margin-left: 45.8mm; + margin-right: 23.3mm; + + @top-left{ + } + @top-left-corner { + + } +} + +@page colophon:right { + margin-top: 33mm; + margin-bottom: 64.8mm; + margin-right: 45.8mm; + margin-left: 23.3mm; + @top-right-corner { + } + @top-right { + } +} +@page empty-page { +} +@page table-of-contents { +} +@page table-of-contents-wpnumber:left { + @top-left-corner { + content: counter(page); + text-align: center; + } +} +@page table-of-contents-wpnumber:right { + @top-right-corner { + content: counter(page); + text-align: center; + } +} +@page custom-page { +} +@page custom-page-wpnumber:left { + @top-left-corner { + content: counter(page); + text-align: center; + } +} +@page custom-page-wpnumber:right { + @top-right-corner { + content: counter(page); + text-align: center; + } +} + +@page section{ + +} + +@page section:left { + margin-top: 33mm; + margin-bottom: 64.8mm; + margin-left: 45.8mm; + margin-right: 23.3mm; + @top-left{ + content: element(publicationTitle); + } + @top-left-corner { + content: counter(page); + text-align: center; + } +} + +@page section:right { + margin-top: 33mm; + margin-bottom: 64.8mm; + margin-right: 45.8mm; + margin-left: 23.3mm; + @top-right-corner { + content: counter(page); + text-align: center; + } + @top-right { + content: element(sectionTitle); + } +} + +@page peritext{ + +} + +@page peritext:left { + margin-top: 33mm; + margin-bottom: 64.8mm; + margin-left: 45.8mm; + margin-right: 23.3mm; + @top-left{ + content: element(publicationTitle); + } + @top-left-corner { + content: counter(page); + text-align: center; + } +} + +@page peritext:right { + margin-top: 33mm; + margin-bottom: 64.8mm; + margin-right: 45.8mm; + margin-left: 23.3mm; + @top-right-corner { + content: counter(page); + text-align: center; + } + @top-right { + } +} +@page section:first{ + @top-right { + content: none; + } +} + + +.front-cover{ + page: front-cover; + page-break-before: right; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} + +.title-page{ + page: title-page; + page-break-before: right; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} + + +.colophon{ + page: colophon; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} + +.back-cover{ + page: back-cover; + page-break-before: left; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +.empty-page{ + page: empty-page; +} + +.table-of-contents{ + page: table-of-contents; + page-break-before: right; +} +.table-of-contents.has-page-number{ + page: table-of-contents-wpnumber; + page-break-before: right; +} + +.custom-page{ + page: custom-page; +} +.section{ + page: section; + page-break-before: right; +} + +.glossary{ + page: peritext; +} +.reference{ + page: peritext; +} + +.custom-page.has-page-number{ + page: custom-page-wpnumber; +} + +/** + * + * ================= + * ================= + * ================= + * ================= + * ================= + * REUSED COMPONENTS + * ================= + * ================= + * ================= + * ================= + * ================= + * + */ +body{ + text-rendering: optimizeLebility; + color: var(--color-text); +} +a, +.page-link{ + text-decoration: none; + color: var(--color-link-default); +} +.page-link::after{ + content: target-counter(attr(href), page); +} +.publication-title-running{ + position: running(publicationTitle); +} +.section-title-running{ + position: running(sectionTitle); +} + +.composition-block-title{ + font-weight: 800; + font-size: 50px; +} + +/** + * Prevent overflow bugs + */ +.csl-entry, +a{ + word-break: break-all; +} + +/* lists */ +.mentions-container{ + padding: 0; +} +.mention-item{ + list-style-type: none; + padding: 0; + margin-bottom: var(--gutter-medium); +} +.mention-item .title{ + +} +.glossary .mention-item .title{ + font-weight: 800; +} +.mention-item .description { + +} +.mention-item .mentions-list{ + opacity: .8; + font-size: 80%; +} + +.mention-item .mentions-list::before{ + content: "◉"; + font-style: normal; + padding-right: calc(.5 * var(--gutter-medium)); +} + +/* rendered content */ +.rendered-content .unstyled{ + text-indent: var(--gutter-medium); + margin-bottom: calc(.4 * var(--gutter-medium)); +} +.rendered-content > .unstyled { + text-indent: none; +} + +ul + .unstyled, +blockquote + .unstyled, +figure + .unstyled, +.csl-entry{ + text-indent: none; +} + +.rendered-content sup{ + line-height: 0; + vertical-align: super; + position: relative; + top: .2em; +} +.footnote-area .footnote{ +} +.footnote-area .footnote sup{ + vertical-align: baseline; + font-size: 100%; +} +.footnote-area .footnote sup::after{ + content: "."; + padding-right: .5em; +} + +/** + * Figures (general) + */ +.block-contextualization-container, +.block-contextualization-container figure +{ + padding: 0; + margin: 0; +} +.block-contextualization-container .figure-caption{ + padding-top: calc(.5 * var(--gutter-medium)); + font-style: italic; +} +.block-contextualization-container .figure-title{ + margin: 0; +} +.block-contextualization-container .figure-title .mention-context-pointer{ + font-size: 1.2rem; + padding: 0; +} +.block-contextualization-container .figure-legend{ + font-size: 1em; + margin-top: 0; +} +.block-contextualization-container .figure-legend p{ + margin-top: 0; +} +.block-contextualization-container figure{ + display: flex; + flex-flow: column nowrap; + align-items: center; + justify-content: center; + position: relative; +} +.block-contextualization-container img +{ + max-width: 100%; + max-height: 4cm; +} +.block-contextualization-container iframe +{ + min-height: 30%; + outline: none; + border: none; + width: 100%; + max-height: 4cm; + min-height: 3cm; +} +/** + * Figures (specific) + */ +/* tables */ +.block-contextualization-container.table{ + page-break-before: always; + max-width: 100%; + overflow: hidden; +} + +.block-contextualization-container.table table th, +.block-contextualization-container.table table tr + { + border-right: 1px solid black; + border-bottom: 1px solid black; + font-size: 8px; +} + +.block-contextualization-container.bib .figure-caption{ + display: none; +} +/* images */ +.block-contextualization-container.image .static-images-container{ + display: flex; + flex-flow: row wrap; + justify-content: flex-start; +} +.block-contextualization-container.image .static-images-container img{ + display: block; +} +.block-contextualization-container.image .image-specific-caption { + font-style: italic; + font-size: 70%; + opacity: .8; + padding: calc(.5 * var(--gutter-medium)); + padding-left: 0; +} +/* vegaLite visualizations */ +.block-contextualization-container.vegaLite .vegaLite > div { + display: flex; + flex-flow: row nowrap; + align-items: center; + justify-content: center; + padding: var(--gutter-medium); + page-break-inside: avoid; +} +/** + * + * ================= + * ================= + * ================= + * ================= + * ================= + * VIEW SPECIFIC COMPONENTS + * ================= + * ================= + * ================= + * ================= + * ================= + * + */ +/* front cover components */ +.front-cover .front-cover-title { + font-size: 50px; + margin-bottom: 0; +} +.front-cover .front-cover-subtitle { + font-size: 30px; + margin-top: 10px; + margin-bottom: 10px; +} +.front-cover .front-cover-authors{ + color: var(--color-link-active); + font-size: 20px; +} +.front-cover .front-cover-footer{ + font-style: italic; +} +/* title-page */ +.title-page{ + text-align: center; +} +.title-page .title-page-title { + font-size: 50px; + margin-bottom: 0; +} +.title-page .title-page-subtitle { + font-size: 30px; + margin-top: 15px; + margin-bottom: 15px; +} +.title-page .title-page-authors{ + font-size: 22px; +} +.title-page .title-page-footer{ + font-style: italic; +} +/* colophon components */ +.colophon-content{ + position: absolute; + bottom: 0; +} + +/* back cover components */ +.back-cover .back-cover-title { + font-size: 30px; + margin-bottom: 0; +} +.back-cover .back-cover-subtitle { + font-size: 20px; + margin-top: 5px; + margin-bottom: 15px; +} +.back-cover .back-cover-authors{ + color: var(--color-link-active); + font-size: 16px; +} +.back-cover .back-cover-text{ + max-height: 60%; +} +.back-cover .back-cover-footer{ + font-style: italic; +} + +/* toc views components */ +.table-of-contents .table-of-contents-elements-container{ + padding: 0; +} +.table-of-contents .table-of-contents-element{ + list-style-type: none; + margin: 0; + font-size: 20px; +} +.table-of-contents .table-of-contents-element { + display: flex; + flex-flow: row nowrap; + justify-content: stretch; + +} +.table-of-contents .table-of-contents-element .element-leading{ + flex: 1; + content: " "; + border-bottom: 1px dashed var(--color-text); +} +.table-of-contents .table-of-contents-element .element-title, +.table-of-contents .table-of-contents-element .page-link +{ + position: relative; + top: .25em; + min-width: 20px; +} +.table-of-contents .table-of-contents-element.level-0{ +} +.table-of-contents .table-of-contents-element.level-1{ + margin-left: calc(.3 * var(--gutter-medium)); +} +.table-of-contents .table-of-contents-element.level-2{ + margin-left: calc(.6 * var(--gutter-medium)); + +} +.table-of-contents .table-of-contents-element.level-3{ + margin-left: calc(.9 * var(--gutter-medium)); +} +.table-of-contents .table-of-contents-element.level-4{ + margin-left: calc(1.2 * var(--gutter-medium)); + +} +.table-of-contents .table-of-contents-element.level-5{ + margin-left: calc(1.5 * var(--gutter-medium)); + +} +.table-of-contents .table-of-contents-element.level-6{ + margin-left: calc(1.8 * var(--gutter-medium)); + +} +/* sections views */ +.section.has-notes-position-sidenotes .sidenote { + color: var(--color-link-default); + border-left: 3px solid var(--color-link-default); + margin-left: .5em; + padding-left: .5em; + font-size: .8em; + vertical-align: baseline; +} + +.footnote{ + font-size: 80%; + vertical-align: baseline; + opacity: .8; +} + + +.section-title{ + margin-top: 50%; +} + +/* front cover and back cover */ +.front-cover{ + display: flex; + flex-flow: column nowrap; + justify-content: center; +} +.title-page{ + display: flex; + flex-flow: column nowrap; + justify-content: center; +} +.back-cover{ + display: flex; + flex-flow: column nowrap; + justify-content: center; + align-items: center; +} +.front-cover .front-cover-footer, +.back-cover .back-cover-footer, +.title-page .title-page-footer +{ + position : absolute; + bottom: 0; + left: 0; + width: 100%; + text-align: center; +} + +.front-cover .front-cover-content, +.back-cover .back-cover-content +{ + background: white; + color: var(--color-text); + padding: 2cm; +} +.back-cover-content { + margin: 2cm; +} +.front-cover.with-animated-background-gradient, +.back-cover.with-animated-background-gradient +{ + background: linear-gradient(-45deg, #EE7752, #E73C7E, #23A6D5, #23D5AB); + background-size: 400% 400%; + -webkit-animation: Gradient 15s ease infinite; + -moz-animation: Gradient 15s ease infinite; + animation: Gradient 15s ease infinite; +} + +@-webkit-keyframes Gradient { + 0% { + background-position: 0% 50% + } + 50% { + background-position: 100% 50% + } + 100% { + background-position: 0% 50% + } +} + +@-moz-keyframes Gradient { + 0% { + background-position: 0% 50% + } + 50% { + background-position: 100% 50% + } + 100% { + background-position: 0% 50% + } +} + +@keyframes Gradient { + 0% { + background-position: 0% 50% + } + 50% { + background-position: 100% 50% + } + 100% { + background-position: 0% 50% + } +} + +`; +module.exports = style; \ No newline at end of file diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..5942fcf --- /dev/null +++ b/dist/index.js @@ -0,0 +1,33 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Wrapper = _interopRequireDefault(require("./components/Wrapper")); + +var _References = _interopRequireDefault(require("./components/References")); + +var _Glossary = _interopRequireDefault(require("./components/Glossary")); + +var _EndNotes = _interopRequireDefault(require("./components/EndNotes")); + +var _defaultStyle = _interopRequireDefault(require("./defaultStyle")); + +var _meta = _interopRequireDefault(require("./meta")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const components = { + Edition: _Wrapper.default, + EndNotes: _EndNotes.default, + References: _References.default, + Glossary: _Glossary.default +}; +var _default = { + meta: _meta.default, + components, + css: _defaultStyle.default +}; +exports.default = _default; \ No newline at end of file diff --git a/dist/meta.js b/dist/meta.js new file mode 100644 index 0000000..09b9caa --- /dev/null +++ b/dist/meta.js @@ -0,0 +1,289 @@ +"use strict"; + +module.exports = { + id: 'pyrrah', + type: 'peritext-template', + name: 'Pyrrah template', + renderingTypes: ['paged'], + generatorsTypes: ['pdf', 'epub'], + summaryType: 'linear', + options: { + referencesScope: { + type: 'string', + enum: ['sections', 'edition'], + default: 'edition' + } + }, + defaultBibType: 'book', + defaultAdditionalHTML: '', + defaultPlan: { + type: 'linear', + summary: [{ + type: 'frontCover', + data: { + animatedBackground: 'none', + backgroundColor: '#466CA6' + } + }, { + type: 'titlePage' + }, { + type: 'tableOfContents', + data: { + displayPageNumber: true + } + }, { + type: 'sections', + data: { + notesPosition: 'footnotes' + } + }, { + type: 'backCover', + data: { + backgroundColor: '#D6CFC4', + useAbstract: true + } + }] + }, + summaryBlockDataTypes: { + frontCover: { + type: 'object', + default: { + animatedBackground: 'none', + backgroundColor: '#466CA6' + }, + properties: { + backgroundColor: { + type: 'string', + uiType: 'color' + }, + customCoverFooter: { + type: 'string', + longString: true + }, + animatedBackground: { + type: 'string', + description: 'animated background to use', + enum: ['gradient', 'none'] + } + } + }, + titlePage: { + type: 'object', + default: {}, + properties: { + customCoverFooter: { + type: 'string', + longString: true + } + } + }, + colophon: { + type: 'object', + default: {}, + properties: { + customText: { + type: 'string', + longString: true + }, + copyright: { + type: 'string' + }, + issn: { + type: 'string' + }, + isbn: { + type: 'string' + } + } + }, + backCover: { + type: 'object', + default: { + backgroundColor: '#D6CFC4', + useAbstract: true + }, + properties: { + backgroundColor: { + type: 'string' + }, + useAbstract: { + type: 'boolean' + }, + customMarkdownContents: { + type: 'string', + description: 'custom content to put on this page', + longString: true + }, + animatedBackground: { + type: 'string', + description: 'animated background to use', + enum: ['gradient', 'none'] + }, + customCoverFooter: { + type: 'string', + longString: true + } + } + }, + tableOfContents: { + type: 'object', + properties: { + customTitle: { + type: 'string', + description: 'Custom title of the table of contents section' + }, + displayPageNumber: { + type: 'boolean', + description: 'whether to display page number' + } + }, + default: { + displayPageNumber: true + } + }, + sections: { + type: 'object', + properties: { + customSummary: { + type: 'object', + uiType: 'customSummary', + properties: { + active: { + type: 'boolean' + }, + summary: { + type: 'array', + items: { + type: 'object', + properties: { + sectionId: { + type: 'string' + }, + sectionLevel: { + type: 'number' + } + } + } + } + } + }, + notesPosition: { + type: 'string', + enum: ['footnotes', 'sidenotes', 'endOfSections', 'endOfContents'] + } + }, + default: { + customSummary: { + active: false, + summary: [] + }, + notesPosition: 'footnotes' + } + }, + customPage: { + type: 'object', + default: { + displayInTableOfContents: true, + displayPageNumber: true + }, + properties: { + title: { + type: 'string' + }, + markdownContents: { + type: 'string', + longString: true + }, + customCssId: { + type: 'string', + description: 'custom id for this page' + }, + displayInTableOfContents: { + type: 'boolean', + description: 'whether to display this content in table of contents' + }, + displayPageNumber: { + type: 'boolean', + description: 'whether to display page number' + } + } + }, + emptyPage: { + type: 'object', + properties: {} + }, + references: { + type: 'object', + default: { + showUncitedReferences: false, + showMentions: false, + resourceTypes: ['bib'], + sortingKey: 'date', + sortingAscending: true + }, + properties: { + resourceTypes: { + type: 'array', + items: { + type: 'string', + enum: ['bib', 'image', 'table', 'video', 'embed', 'webpage'] + }, + uiType: 'select', + description: 'which types of resources to show as references' + }, + showUncitedReferences: { + type: 'boolean', + description: 'whether to show references which are not cited in the contents of the edition' + }, + showMentions: { + type: 'boolean', + description: 'whether to show active mentions in the text for each reference' + }, + sortingKey: { + type: 'string', + description: 'key to use for sorting references', + enum: ['authors', 'title', 'date'] + }, + sortingAscending: { + type: 'boolean', + description: 'whether to sort references in ascending order' + } + } + }, + glossary: { + type: 'object', + default: { + showDescription: true, + showMentions: true, + showUncited: false, + glossaryTypes: ['person', 'place', 'event', 'notion', 'other'] + }, + properties: { + customTitle: { + type: 'string' + }, + showDescriptions: { + type: 'boolean', + description: 'whether to show elements descriptions in the glossary' + }, + showMentions: { + type: 'boolean', + description: 'whether to show active mentions in the text for each glossary element' + }, + glossaryTypes: { + type: 'array', + items: { + type: 'string', + enum: ['person', 'place', 'event', 'notion', 'other'] + }, + uiType: 'select', + description: 'which types of glossary items to show' + }, + showUncited: { + type: 'boolean', + description: 'whether to show uncited glossary items' + } + } + } + } +}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..735ad93 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5136 @@ +{ + "name": "peritext-template-pyrrah", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/cli": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.2.3.tgz", + "integrity": "sha512-bfna97nmJV6nDJhXNPeEfxyMjWnt6+IjUAaDPiYRTBlm8L41n8nvw6UAqUCbvpFfU246gHPxW7sfWwqtF4FcYA==", + "dev": true, + "requires": { + "chokidar": "^2.0.3", + "commander": "^2.8.1", + "convert-source-map": "^1.1.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.0.0", + "lodash": "^4.17.10", + "mkdirp": "^0.5.1", + "output-file-sync": "^2.0.0", + "slash": "^2.0.0", + "source-map": "^0.5.0" + } + }, + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/core": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.2.2.tgz", + "integrity": "sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.2.2", + "@babel/helpers": "^7.2.0", + "@babel/parser": "^7.2.2", + "@babel/template": "^7.2.2", + "@babel/traverse": "^7.2.2", + "@babel/types": "^7.2.2", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.10", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@babel/generator": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.2.tgz", + "integrity": "sha512-I4o675J/iS8k+P38dvJ3IBGqObLXyQLTxtrR4u9cSUJOURvafeEWb/pFMOTwtNrmq73mJzyF6ueTbO1BtN0Zeg==", + "dev": true, + "requires": { + "@babel/types": "^7.2.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.10", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", + "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", + "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-builder-react-jsx": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.0.0.tgz", + "integrity": "sha512-ebJ2JM6NAKW0fQEqN8hOLxK84RbRz9OkUhGS/Xd5u56ejMfVbayJ4+LykERZCOUM6faa6Fp3SZNX3fcT16MKHw==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "esutils": "^2.0.0" + } + }, + "@babel/helper-call-delegate": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz", + "integrity": "sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.0.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.2.3.tgz", + "integrity": "sha512-xO/3Gn+2C7/eOUeb0VRnSP1+yvWHNxlpAot1eMhtoKDCN7POsyQP5excuT5UsV5daHxMWBeIIOeI5cmB8vMRgQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.2.3" + } + }, + "@babel/helper-define-map": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz", + "integrity": "sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.0.0", + "lodash": "^4.17.10" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", + "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz", + "integrity": "sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz", + "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", + "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.2.2.tgz", + "integrity": "sha512-YRD7I6Wsv+IHuTPkAmAS4HhY0dkPobgLftHp0cRGZSdrRvmZY8rFvae/GVu3bD00qscuvK3WPHB3YdNpBXUqrA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/template": "^7.2.2", + "@babel/types": "^7.2.2", + "lodash": "^4.17.10" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", + "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0.tgz", + "integrity": "sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", + "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-wrap-function": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.2.3.tgz", + "integrity": "sha512-GyieIznGUfPXPWu0yLS6U55Mz67AZD9cUk0BfirOWlPrXlBcan9Gz+vHGz+cPfuoweZSnPzPIm67VtQM0OWZbA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.2.3", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", + "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "dev": true, + "requires": { + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", + "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-wrap-function": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", + "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.2.0" + } + }, + "@babel/helpers": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.2.0.tgz", + "integrity": "sha512-Fr07N+ea0dMcMN8nFpuK6dUIT7/ivt9yKQdEEnjVS83tG2pHwPi03gYmk/tyuwONnZ+sY+GFFPlWGgCtW1hF9A==", + "dev": true, + "requires": { + "@babel/template": "^7.1.2", + "@babel/traverse": "^7.1.5", + "@babel/types": "^7.2.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.3.tgz", + "integrity": "sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", + "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0", + "@babel/plugin-syntax-async-generators": "^7.2.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.2.3.tgz", + "integrity": "sha512-FVuQngLoN2iDrpW7LmhPZ2sO4DJxf35FOcwidwB9Ru9tMvI5URthnkVHuG14IStV+TzkMTyLMoOUlSTtrdVwqw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.2.3", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.2.3.tgz", + "integrity": "sha512-jhCFm7ftmue02EWIYqbhzP0iConEPsgVQeDriOs/Qc2lgr6MDtHTTrv3hE2GOOQDFjQ9tjP7nWQq0ad0JhIsQg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.2.3", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-decorators": "^7.2.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", + "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.2.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.2.0.tgz", + "integrity": "sha512-1L5mWLSvR76XYUQJXkd/EEQgjq8HHRP6lQuZTTg0VA4tTGPpGemmCdAfQIz1rzEuWAm+ecP8PyyEm30jC1eQCg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz", + "integrity": "sha512-LvRVYb7kikuOtIoUeWTkOxQEV1kYvL5B6U3iWEGCzPNRus1MzJweFqORTj+0jkxozkTSYNJozPOddxmqdqsRpw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.2.0" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", + "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz", + "integrity": "sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", + "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz", + "integrity": "sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", + "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", + "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.2.0.tgz", + "integrity": "sha512-CEHzg4g5UraReozI9D4fblBYABs7IM6UerAVG7EJVrTLC5keh00aEuLUT+O40+mJCEzaXkYfTCUKIyeDfMOFFQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", + "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.2.0.tgz", + "integrity": "sha512-vDTgf19ZEV6mx35yiPJe4fS02mPQUUcBNwWQSZFXSzTSbsJFQvHt7DqyS3LK8oOWALFOsJ+8bbqBgkirZteD5Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.10" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz", + "integrity": "sha512-gEZvgTy1VtcDOaQty1l10T3jQmJKlNVxLDCs+3rCVPr6nMkODLELxViq5X9l+rfxbie3XrfrMCYYY6eX3aOcOQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.1.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", + "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.2.0.tgz", + "integrity": "sha512-coVO2Ayv7g0qdDbrNiadE4bU7lvCd9H539m2gMknyVjjMdwF/iCOM7R+E8PkntoqLkltO0rk+3axhpp/0v68VQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz", + "integrity": "sha512-sKxnyHfizweTgKZf7XsXu/CNupKhzijptfTM+bozonIuyVrLWVUvYjE2bhuSBML8VQeMxq4Mm63Q9qvcvUcciQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.1.3" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz", + "integrity": "sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", + "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz", + "integrity": "sha512-Kz7Mt0SsV2tQk6jG5bBv5phVbkd0gd27SgYD4hH1aLMJRchM0dzHaXvrWhVZ+WxAlDoAKZ7Uy3jVTW2mKXQ1WQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz", + "integrity": "sha512-kWgksow9lHdvBC2Z4mxTsvc7YdY7w/V6B2vy9cTIPtLEE9NhwoWivaxdNM/S37elu5bqlLP/qOY906LukO9lkQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", + "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz", + "integrity": "sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz", + "integrity": "sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.2.0.tgz", + "integrity": "sha512-aYJwpAhoK9a+1+O625WIjvMY11wkB/ok0WClVwmeo3mCjcNRjt+/8gHWrB5i+00mUju0gWsBkQnPpdvQ7PImmQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", + "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz", + "integrity": "sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz", + "integrity": "sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.2.0.tgz", + "integrity": "sha512-kB9+hhUidIgUoBQ0MsxMewhzr8i60nMa2KgeJKQWYrqQpqcBYtnpR+JgkadZVZoaEZ/eKu9mclFaVwhRpLNSzA==", + "dev": true, + "requires": { + "@babel/helper-call-delegate": "^7.1.0", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz", + "integrity": "sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.2.0.tgz", + "integrity": "sha512-h/fZRel5wAfCqcKgq3OhbmYaReo7KkoJBpt8XnvpS7wqaNMqtw5xhxutzcm35iMUWucfAdT/nvGTsWln0JTg2Q==", + "dev": true, + "requires": { + "@babel/helper-builder-react-jsx": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz", + "integrity": "sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.2.0.tgz", + "integrity": "sha512-A32OkKTp4i5U6aE88GwwcuV4HAprUgHcTq0sSafLxjr6AW0QahrCRCjxogkbbcdtpbXkuTOlgpjophCxb6sh5g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz", + "integrity": "sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw==", + "dev": true, + "requires": { + "regenerator-transform": "^0.13.3" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", + "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz", + "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", + "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz", + "integrity": "sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", + "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz", + "integrity": "sha512-m48Y0lMhrbXEJnVUaYly29jRXbQ3ksxPrS1Tg8t+MHqzXhtBYAvI51euOBaoAlZLPHsieY9XPVMf80a5x0cPcA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.1.3" + } + }, + "@babel/preset-env": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.2.3.tgz", + "integrity": "sha512-AuHzW7a9rbv5WXmvGaPX7wADxFkZIqKlbBh1dmZUQp4iwiPpkE/Qnrji6SC4UQCQzvWY/cpHET29eUhXS9cLPw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.2.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.2.0", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.2.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.2.0", + "@babel/plugin-transform-classes": "^7.2.0", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.2.0", + "@babel/plugin-transform-dotall-regex": "^7.2.0", + "@babel/plugin-transform-duplicate-keys": "^7.2.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.2.0", + "@babel/plugin-transform-function-name": "^7.2.0", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.2.0", + "@babel/plugin-transform-modules-commonjs": "^7.2.0", + "@babel/plugin-transform-modules-systemjs": "^7.2.0", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-new-target": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.2.0", + "@babel/plugin-transform-parameters": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.2.0", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.2.0", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.2.0", + "browserslist": "^4.3.4", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.3.0" + } + }, + "@babel/preset-react": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0.tgz", + "integrity": "sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0" + } + }, + "@babel/template": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", + "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.2.2", + "@babel/types": "^7.2.2" + } + }, + "@babel/traverse": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz", + "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.2.2", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/parser": "^7.2.3", + "@babel/types": "^7.2.2", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.10" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@babel/types": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz", + "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "@robindemourat/eslint-config": { + "version": "git+https://github.com/robindemourat/eslint-config.git#7749111822597b7ec1a66e1630ee4d7c616590e1", + "from": "git+https://github.com/robindemourat/eslint-config.git", + "dev": true + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "^3.0.4" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-eslint": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.6.tgz", + "integrity": "sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/traverse": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "^1.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", + "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", + "dev": true, + "requires": { + "@babel/highlight": "7.0.0-beta.44" + } + }, + "@babel/generator": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz", + "integrity": "sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44", + "jsesc": "^2.5.1", + "lodash": "^4.2.0", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz", + "integrity": "sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "7.0.0-beta.44", + "@babel/template": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz", + "integrity": "sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz", + "integrity": "sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/highlight": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", + "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^3.0.0" + } + }, + "@babel/template": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz", + "integrity": "sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "lodash": "^4.2.0" + } + }, + "@babel/traverse": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz", + "integrity": "sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/generator": "7.0.0-beta.44", + "@babel/helper-function-name": "7.0.0-beta.44", + "@babel/helper-split-export-declaration": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "debug": "^3.1.0", + "globals": "^11.1.0", + "invariant": "^2.2.0", + "lodash": "^4.2.0" + } + }, + "@babel/types": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz", + "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.2.0", + "to-fast-properties": "^2.0.0" + } + }, + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + } + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", + "dev": true + }, + "babel-plugin-transform-decorators-legacy": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.5.tgz", + "integrity": "sha512-jYHwjzRXRelYQ1uGm353zNzf3QmtdCfvJbuYTZ4gKveK7M9H1fs3a5AKdY1JUDl0z97E30ukORW1dzhWvsabtA==", + "dev": true, + "requires": { + "babel-plugin-syntax-decorators": "^6.1.18", + "babel-runtime": "^6.2.0", + "babel-template": "^6.3.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.2.tgz", + "integrity": "sha512-NdBPF/RVwPW6jr0NCILuyN9RiqLo2b1mddWHkUL+VnvcB7dzlnBJ1bXYntjpTGOgkZiiLWj2JxmOr7eGE3qK6g==", + "dev": true + } + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "bail": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.3.tgz", + "integrity": "sha512-1X8CnjFVQ+a+KW36uBNMTU5s8+v5FzeqrP7hTG5aTb4aPreSbZJlhwPon9VKMuEVgV++JM+SQrALY3kr7eswdg==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "binary-extensions": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", + "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==", + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "browserslist": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.4.0.tgz", + "integrity": "sha512-tQkHS8VVxWbrjnNDXgt7/+SuPJ7qDvD0Y2e6bLtoQluR2SPvlmPUcfcU75L1KAalhqULlIFJlJ6BDfnYyJxJsw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000928", + "electron-to-chromium": "^1.3.100", + "node-releases": "^1.1.3" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "^0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30000928", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000928.tgz", + "integrity": "sha512-aSpMWRXL6ZXNnzm8hgE4QDLibG5pVJ2Ujzsuj3icazlIkxXkPXtL+BWnMx6FBkWmkZgBHGUxPZQvrbRw2ZTxhg==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "character-entities": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.2.tgz", + "integrity": "sha512-sMoHX6/nBiy3KKfC78dnEalnpn0Az0oSNvqUWYTtYrhRI5iUIYsROU48G+E+kMFQzqXaJ8kHJZ85n7y6/PHgwQ==" + }, + "character-entities-legacy": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.2.tgz", + "integrity": "sha512-9NB2VbXtXYWdXzqrvAHykE/f0QJxzaKIpZ5QzNZrrgQ7Iyxr2vnfS8fCBNVW9nUEZE0lo57nxKRqnzY/dKrwlA==" + }, + "character-reference-invalid": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.2.tgz", + "integrity": "sha512-7I/xceXfKyUJmSAn/jw8ve/9DyOP7XxufNYLI9Px7CmsKgEUaZLUTax6nZxGQtaoiZCjpu6cHPj20xC/vqRReQ==" + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + } + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "citeproc": { + "version": "2.1.210", + "resolved": "https://registry.npmjs.org/citeproc/-/citeproc-2.1.210.tgz", + "integrity": "sha512-6hBVPAee7lVv8iCXs+GYoKiX+AjH7BqYsoe7hFeoIQV1ZqnXEJIR1Ehdv9iQPAalfMyhHkHJDXRyd/UFaMTh6A==" + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "collapse-white-space": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.4.tgz", + "integrity": "sha512-YfQ1tAUZm561vpYD+5eyWN8+UsceQbSrqqlc/6zDY2gtAE+uZLSdkkovhnGpmCThsvKBFakq4EdY/FF93E8XIw==" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-react-class": { + "version": "15.6.3", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz", + "integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==", + "requires": { + "fbjs": "^0.8.9", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "requires": { + "domelementtype": "~1.1.1", + "entities": "~1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "electron-to-chromium": { + "version": "1.3.102", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.102.tgz", + "integrity": "sha512-2nzZuXw/KBPnI3QX3UOCSRvJiVy7o9+VHRDQ3D/EHCvVc89X6aj/GlNmEgiR2GBIhmSWXIi4W1M5okA5ScSlNg==", + "dev": true + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "eslint": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "dev": true, + "requires": { + "ajv": "^5.3.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^3.7.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^3.5.4", + "esquery": "^1.0.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.0.1", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^1.0.1", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "~2.0.1", + "table": "4.0.2", + "text-table": "~0.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "eslint-plugin-mocha": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-5.2.1.tgz", + "integrity": "sha512-v95cxwpPiyt2Gb/Moog8KQtaT+KlGGMbqpOkcP/eIkvaovPEcTprOYywAOo1On+KDsfEbJ4mByfcfUEwrxH9Gw==", + "dev": true, + "requires": { + "ramda": "^0.26.1" + } + }, + "eslint-plugin-react": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.12.3.tgz", + "integrity": "sha512-WTIA3cS8OzkPeCi4KWuPmjR33lgG9r9Y/7RmnLTRw08MZKgAfnK/n3BO4X0S67MPkVLazdfCNT/XWqcDu4BLTA==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.0.1", + "object.fromentries": "^2.0.0", + "prop-types": "^15.6.2", + "resolve": "^1.9.0" + } + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "dev": true, + "requires": { + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "exenv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=" + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fbjs": { + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", + "requires": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "flat-cache": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "dev": true, + "requires": { + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "formidable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", + "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globals": { + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", + "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", + "dev": true + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "html-to-react": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/html-to-react/-/html-to-react-1.3.4.tgz", + "integrity": "sha512-/tWDdb/8Koi/QEP5YUY1653PcDpBnnMblXRhotnTuhFDjI1Fc6Wzox5d4sw73Xk5rM2OdM5np4AYjT/US/Wj7Q==", + "requires": { + "domhandler": "^2.4.2", + "escape-string-regexp": "^1.0.5", + "htmlparser2": "^3.10.0", + "lodash.camelcase": "^4.3.0", + "ramda": "^0.26" + } + }, + "htmlparser2": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.0.tgz", + "integrity": "sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ==", + "requires": { + "domelementtype": "^1.3.0", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.0.6" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-alphabetical": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.2.tgz", + "integrity": "sha512-V0xN4BYezDHcBSKb1QHUFMlR4as/XEuCZBzMJUU4n7+Cbt33SmUnSol+pnXFvLxSHNq2CemUXNdaXV6Flg7+xg==" + }, + "is-alphanumerical": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.2.tgz", + "integrity": "sha512-pyfU/0kHdISIgslFfZN9nfY1Gk3MquQgUm1mJTjdkEPpkAKNWuBTSqFwewOpR7N351VkErCiyV71zX7mlQQqsg==", + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-decimal": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.2.tgz", + "integrity": "sha512-TRzl7mOCchnhchN+f3ICUCzYvL9ul7R+TYOsZ8xia++knyZAJfv/uA1FvQXsAnYIl1T3B2X5E/J7Wb1QXiIBXg==" + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-hexadecimal": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.2.tgz", + "integrity": "sha512-but/G3sapV3MNyqiDBLrOi4x8uCIw0RY3o/Vb5GT0sMFHrVV7731wFSVy41T5FO1og7G0gXLJh0MkgPRouko/A==" + }, + "is-integer": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.7.tgz", + "integrity": "sha1-a96Bqs3feLZZtmKdYpytxRqIbVw=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-whitespace-character": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.2.tgz", + "integrity": "sha512-SzM+T5GKUCtLhlHFKt2SDAX2RFzfS6joT91F2/WSi9LxgFdsnhfPK/UIA+JhRR2xuyLdrCys2PiFDrtn1fU5hQ==" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-word-character": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.2.tgz", + "integrity": "sha512-T3FlsX8rCHAH8e7RE7PfOPZVFQlcV3XRF9eOOBQ1uf70OxO7CjjSOjeImMPCADBdYWcStAbVbYvJ1m2D3tb+EA==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", + "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "jsx-ast-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", + "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", + "dev": true, + "requires": { + "array-includes": "^3.0.3" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true, + "optional": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "markdown-escapes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.2.tgz", + "integrity": "sha512-lbRZ2mE3Q9RtLjxZBZ9+IMl68DKIXaVAhwvwn9pmjnPLS0h/6kyBMgNhqi1xFJ/2yv6cSyv0jbiZavZv93JkkA==" + }, + "mdast-add-list-metadata": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdast-add-list-metadata/-/mdast-add-list-metadata-1.0.1.tgz", + "integrity": "sha512-fB/VP4MJ0LaRsog7hGPxgOrSL3gE/2uEdZyDuSEnKCv/8IkYHiDkIQSbChiJoHyxZZXZ9bzckyRk+vNxFzh8rA==", + "requires": { + "unist-util-visit-parents": "1.1.2" + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" + }, + "mime-types": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "requires": { + "mime-db": "~1.37.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", + "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "node-releases": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.3.tgz", + "integrity": "sha512-6VrvH7z6jqqNFY200kdB6HdzkgM96Oaj9v3dqGfgp6mF+cHmU4wyQKZ2/WPDRVoR0Jz9KqbamaBN0ZhdUaysUQ==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.fromentries": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.0.tgz", + "integrity": "sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.11.0", + "function-bind": "^1.1.1", + "has": "^1.0.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "os-shim": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", + "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "output-file-sync": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-2.0.1.tgz", + "integrity": "sha512-mDho4qm7WgIXIGf4eYU1RHN2UU5tPfVYVSRwDJw0uTmj35DQUt/eNp19N7v6T3SrR0ESTEf2up2CGO73qI35zQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "is-plain-obj": "^1.1.0", + "mkdirp": "^0.5.1" + } + }, + "parse-entities": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.0.tgz", + "integrity": "sha512-XXtDdOPLSB0sHecbEapQi6/58U/ODj/KWfIXmmMCJF/eRn8laX6LZbOyioMoETOOJoWRW8/qTSl5VQkUIfKM5g==", + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true, + "optional": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "peritext-schemas": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/peritext-schemas/-/peritext-schemas-0.1.1.tgz", + "integrity": "sha512-8Q8fuwdTKecNsLKj7ilxih3jAQlqEU13qRa52yk+AgnMn4hI5bX/Ia0EYEXidQ5y1Ez7qDx0hEJ7SycaKcW5Ww==" + }, + "peritext-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/peritext-utils/-/peritext-utils-0.1.0.tgz", + "integrity": "sha512-tyUnNTIe1abbJ/xBAVA/iKkc1cmbjPZhS0syR8kJQplPnft6je4bYc0mxTIWsGZpxER/uNhygU2OsUcNme+9xA==", + "requires": { + "react-citeproc": "^0.1.10", + "slugify": "^1.3.4", + "unicode-byte-truncate": "^1.0.0" + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "pre-commit": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/pre-commit/-/pre-commit-1.2.2.tgz", + "integrity": "sha1-287g7p3nI15X95xW186UZBpp7sY=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "spawn-sync": "^1.0.15", + "which": "1.2.x" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, + "prop-types": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "requires": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.6.0.tgz", + "integrity": "sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA==" + }, + "ramda": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz", + "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==" + }, + "react": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.7.0.tgz", + "integrity": "sha512-StCz3QY8lxTb5cl2HJxjwLFOXPIFQp+p+hxQfc8WE0QiLfCtIlKj8/+5tjjKm8uSTlAW+fCPaavGFS06V9Ar3A==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.12.0" + } + }, + "react-citeproc": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/react-citeproc/-/react-citeproc-0.1.10.tgz", + "integrity": "sha512-BVauwAXOaIT3Us6G3M0ZcyizrjUks2zcZpzuL5fkvbHJRk0T5YONcym0VbIh3C+6Qz33AmrkegSza39I3kOKYg==", + "requires": { + "citeproc": "^2.1.204", + "html-to-react": "^1.2.8", + "lodash": "^4.17.10", + "react": "^15.3.2", + "storybook": "0.0.0", + "superagent": "^3.2.1", + "uuid": "^2.0.3" + }, + "dependencies": { + "react": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/react/-/react-15.6.2.tgz", + "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=", + "requires": { + "create-react-class": "^15.6.0", + "fbjs": "^0.8.9", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.0", + "prop-types": "^15.5.10" + } + } + } + }, + "react-dom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.7.0.tgz", + "integrity": "sha512-D0Ufv1ExCAmF38P2Uh1lwpminZFRXEINJe53zRAbm4KPwSyd6DY/uDoS0Blj9jvPpn1+wivKpZYc8aAAN/nAkg==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.12.0" + } + }, + "react-helmet": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-5.2.0.tgz", + "integrity": "sha1-qBgR3yExOm1VxfBYxK66XW89l6c=", + "requires": { + "deep-equal": "^1.0.1", + "object-assign": "^4.1.1", + "prop-types": "^15.5.4", + "react-side-effect": "^1.1.0" + } + }, + "react-markdown": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-4.0.6.tgz", + "integrity": "sha512-E1d/q+OBk5eumId42oYqVrJRB/+whrZdk+YHqUBCCNeWxqeV+Qzt+yLTsft9+4HRDj89Od7eAbUPQBYq8ZwShQ==", + "requires": { + "html-to-react": "^1.3.4", + "mdast-add-list-metadata": "1.0.1", + "prop-types": "^15.6.1", + "remark-parse": "^5.0.0", + "unified": "^6.1.5", + "unist-util-visit": "^1.3.0", + "xtend": "^4.0.1" + } + }, + "react-side-effect": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-1.1.5.tgz", + "integrity": "sha512-Z2ZJE4p/jIfvUpiUMRydEVpQRf2f8GMHczT6qLcARmX7QRb28JDBTpnM2g/i5y/p7ZDEXYGHWg0RbhikE+hJRw==", + "requires": { + "exenv": "^1.2.1", + "shallowequal": "^1.0.1" + } + }, + "readable-stream": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz", + "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "redraft": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/redraft/-/redraft-0.10.2.tgz", + "integrity": "sha512-yy5EcJogY+2MlfBu6uwxQ0r5KzWra9lZRfHpG9czGoxOw8k8woHlVD1LlT1hp/n0zLNLvaIJ9EKE1NgcYgfI+A==", + "requires": { + "punycode": "^2.1.0" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz", + "integrity": "sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regenerator-transform": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.3.tgz", + "integrity": "sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA==", + "dev": true, + "requires": { + "private": "^0.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "dev": true + }, + "regexpu-core": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.4.0.tgz", + "integrity": "sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^7.0.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.0.2" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remark-parse": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-5.0.0.tgz", + "integrity": "sha512-b3iXszZLH1TLoyUzrATcTQUZrwNl1rE70rVdSruJFlDaJ9z5aMkhrG43Pp68OgfHndL/ADz6V69Zow8cTQu+JA==", + "requires": { + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^1.1.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^1.0.0", + "vfile-location": "^2.0.0", + "xtend": "^4.0.1" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + } + }, + "resolve": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", + "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "*" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "scheduler": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.12.0.tgz", + "integrity": "sha512-t7MBR28Akcp4Jm+QoR63XgAi9YgCUmgvDHqf5otgAj4QvdoBE4ImCX0ffehefePPG+aitiYHp0g/mW6s4Tp+dw==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0" + } + }, + "slugify": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.3.4.tgz", + "integrity": "sha512-KP0ZYk5hJNBS8/eIjGkFDCzGQIoZ1mnfQRYS5WM3273z+fxGWXeN0fkwf2ebEweydv9tioZIHGZKoF21U07/nw==" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spawn-sync": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", + "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=", + "dev": true, + "requires": { + "concat-stream": "^1.4.7", + "os-shim": "^0.1.2" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "state-toggle": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.1.tgz", + "integrity": "sha512-Qe8QntFrrpWTnHwvwj2FZTgv+PKIsp0B9VxLzLLbSpPXWOgRgc5LVj/aTiSfK1RqIeF9jeC1UeOH8Q8y60A7og==" + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "storybook": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-0.0.0.tgz", + "integrity": "sha1-s7lQj7mf2DYVZ0kXWDz+nhUykx0=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string_decoder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", + "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "superagent": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", + "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "requires": { + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.2.0", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.3.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "dev": true, + "requires": { + "ajv": "^5.2.3", + "ajv-keywords": "^2.1.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "trim-trailing-lines": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.1.tgz", + "integrity": "sha512-bWLv9BbWbbd7mlqqs2oQYnLD/U/ZqeJeJwbO0FG2zA1aTq+HTvxfHNKFa/HGCVyJpDiioUYaBhfiT6rgk+l4mg==" + }, + "trough": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.3.tgz", + "integrity": "sha512-fwkLWH+DimvA4YCy+/nvJd61nWQQ2liO/nF/RjkTpiOGi+zxZzVkhb1mvbHIIW4b/8nDsYI8uTmAlc0nNkRMOw==" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.19", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.19.tgz", + "integrity": "sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ==" + }, + "unherit": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.1.tgz", + "integrity": "sha512-+XZuV691Cn4zHsK0vkKYwBEwB74T3IZIcxrgn2E4rKwTfFyI1zCh7X7grwh9Re08fdPlarIdyWgI8aVB3F5A5g==", + "requires": { + "inherits": "^2.0.1", + "xtend": "^4.0.1" + } + }, + "unicode-byte-truncate": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-byte-truncate/-/unicode-byte-truncate-1.0.0.tgz", + "integrity": "sha1-qm8PNHUZP+IMMgrJIT425i6HZKc=", + "requires": { + "is-integer": "^1.0.6", + "unicode-substring": "^0.1.0" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz", + "integrity": "sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz", + "integrity": "sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==", + "dev": true + }, + "unicode-substring": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicode-substring/-/unicode-substring-0.1.0.tgz", + "integrity": "sha1-YSDOPDkDhdvND2DDK5BlxBgdSzY=" + }, + "unified": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz", + "integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^1.1.0", + "trough": "^1.0.0", + "vfile": "^2.0.0", + "x-is-string": "^0.1.0" + } + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unist-util-is": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.2.tgz", + "integrity": "sha512-YkXBK/H9raAmG7KXck+UUpnKiNmUdB+aBGrknfQ4EreE1banuzrKABx3jP6Z5Z3fMSPMQQmeXBlKpCbMwBkxVw==" + }, + "unist-util-remove-position": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.2.tgz", + "integrity": "sha512-XxoNOBvq1WXRKXxgnSYbtCF76TJrRoe5++pD4cCBsssSiWSnPEktyFrFLE8LTk3JW5mt9hB0Sk5zn4x/JeWY7Q==", + "requires": { + "unist-util-visit": "^1.1.0" + } + }, + "unist-util-stringify-position": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", + "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" + }, + "unist-util-visit": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.0.tgz", + "integrity": "sha512-FiGu34ziNsZA3ZUteZxSFaczIjGmksfSgdKqBfOejrrfzyUy5b7YrlzT1Bcvi+djkYDituJDy2XB7tGTeBieKw==", + "requires": { + "unist-util-visit-parents": "^2.0.0" + }, + "dependencies": { + "unist-util-visit-parents": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.0.1.tgz", + "integrity": "sha512-6B0UTiMfdWql4cQ03gDTCSns+64Zkfo2OCbK31Ov0uMizEz+CJeAp0cgZVb5Fhmcd7Bct2iRNywejT0orpbqUA==", + "requires": { + "unist-util-is": "^2.1.2" + } + } + } + }, + "unist-util-visit-parents": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz", + "integrity": "sha512-yvo+MMLjEwdc3RhhPYSximset7rwjMrdt9E41Smmvg25UQIenzrN83cRnF1JMzoMi9zZOQeYXHSDf7p+IQkW3Q==" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "dev": true, + "optional": true + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" + }, + "vfile": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz", + "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==", + "requires": { + "is-buffer": "^1.1.4", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "^1.0.0", + "vfile-message": "^1.0.0" + } + }, + "vfile-location": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.4.tgz", + "integrity": "sha512-KRL5uXQPoUKu+NGvQVL4XLORw45W62v4U4gxJ3vRlDfI9QsT4ZN1PNXn/zQpKUulqGDpYuT0XDfp5q9O87/y/w==" + }, + "vfile-message": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", + "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", + "requires": { + "unist-util-stringify-position": "^1.1.1" + } + }, + "whatwg-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" + }, + "which": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "x-is-string": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", + "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..bfd7364 --- /dev/null +++ b/package.json @@ -0,0 +1,71 @@ +{ + "name": "peritext-template-pyrrah", + "version": "0.1.0", + "description": " a web template designed dedicated to long reading experiences and context explorations, for the peritext ecosystem", + "main": "dist/index.js", + "scripts": { + "build": "rm -rf dist; mkdir dist; babel src -d dist", + "addbuild": "git add dist", + "lint": "eslint src", + "lint:fix": "eslint src --fix" + }, + "pre-commit": [ + "lint", + "build", + "addbuild" + ], + "author": "Robin de Mourat", + "license": "AGPL-3.0-or-later", + "bugs": { + "url": "https://github.com/peritext/peritext-template-pyrrah/issues" + }, + "homepage": "https://github.com/peritext/peritext-template-pyrrah#readme", + "peerDependencies": { + "react": "^16.7.0-alpha", + "react-dom": "^16.7.0-alpha", + "lodash": "^4.17" + }, + "dependencies": { + "peritext-schemas": "^0.1.1", + "peritext-utils": "^0.1.0", + "react-citeproc": "^0.1.10", + "react-helmet": "^5.2.0", + "react-markdown": "^4.0.6", + "redraft": "^0.10.2" + }, + "devDependencies": { + "@babel/cli": "^7.2.3", + "@babel/core": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.2.3", + "@babel/plugin-proposal-decorators": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/preset-env": "^7.2.3", + "@babel/preset-react": "^7.0.0", + "babel-eslint": "^8.2.2", + "@robindemourat/eslint-config": "git+https://github.com/robindemourat/eslint-config.git", + "babel-plugin-transform-decorators-legacy": "^1.3.5", + "pre-commit": "^1.2.2", + "eslint": "^4.19.1", + "eslint-plugin-mocha": "^5.2.0", + "eslint-plugin-react": "^7.5.1", + "react": "^16.7.0-alpha", + "react-dom": "^16.7.0-alpha" + }, + "babel": { + "plugins": [ + "@babel/plugin-proposal-object-rest-spread", + "@babel/plugin-proposal-class-properties" + ], + "presets": [ + [ + "@babel/preset-env", + { + "targets": { + "node": "current" + } + } + ], + "@babel/preset-react" + ] + } +} diff --git a/src/components/Authors.js b/src/components/Authors.js new file mode 100644 index 0000000..49997ca --- /dev/null +++ b/src/components/Authors.js @@ -0,0 +1,29 @@ +import React from 'react'; + +const Authors = ( { + authors, + displayRole = false, +} ) => + authors + .map( ( author, index ) => + ( + + {author.given.trim()} {author.family.trim()}{ + displayRole && author.role ? + ` (${author.role})` + : '' + } + + ) + ) + .reduce( ( prev, curr, index ) => { + if ( index > 0 ) { + return [ prev, ', ', curr ]; + } + return [ curr ]; + }, [] ); + +export default Authors; diff --git a/src/components/BackCover.js b/src/components/BackCover.js new file mode 100644 index 0000000..1b332e0 --- /dev/null +++ b/src/components/BackCover.js @@ -0,0 +1,65 @@ +import React from 'react'; +import MarkdownPlayer from './MarkdownPlayer'; +import Authors from './Authors'; + +export default ( { + production: { + metadata + }, + edition, + data: { + backgroundColor, + useAbstract = true, + customMarkdownContents, + animatedBackground, + customCoverFooter, + } = {}, + id +} ) => { + const { + data: editionData = {} + } = edition; + const finalTitle = editionData.publicationTitle || metadata.title; + const finalSubtitle = editionData.publicationSubtitle || metadata.subtitle; + return ( +
+
+

{finalTitle} +

+ { + finalSubtitle && +

+ {finalSubtitle} +

+ } + {metadata.authors && +

+ +

+ } +
+ {useAbstract && } + {customMarkdownContents && customMarkdownContents.trim().length ? + + : null + } +
+ + { + customCoverFooter && customCoverFooter.length > 0 && +
+ +
+ } +
+
+); +}; diff --git a/src/components/BlockAssetWrapper.js b/src/components/BlockAssetWrapper.js new file mode 100644 index 0000000..5075288 --- /dev/null +++ b/src/components/BlockAssetWrapper.js @@ -0,0 +1,127 @@ +/** + * This module exports a stateless reusable block asset wrapper component + * It handles the connection to context's data and builds proper data to render the asset + * ============ + */ +import React from 'react'; +import PropTypes from 'prop-types'; +import MarkdownPlayer from './MarkdownPlayer'; + +const BlockAssetWrapper = ( { + data +}, context ) => { + const assetId = data.asset.id; + const contextualization = context.production && context.production.contextualizations && context.production.contextualizations[assetId]; + if ( !contextualization ) { + return null; + } + const { + visibility = { + screened: true, + paged: true + } + } = contextualization; + const production = context.production || {}; + const containerId = context.containerId; + const assets = context.productionAssets || {}; + const contextualizer = production.contextualizers[contextualization.contextualizerId]; + const resource = production.resources[contextualization.resourceId]; + const dimensions = context.dimensions || {}; + const fixedPresentationId = context.fixedPresentationId; + // const onPresentationExit = context.onPresentationExit; + const inNote = context.inNote; + const contextualizers = context.contextualizers; + const contextualizerModule = contextualizers[contextualizer.type]; + + const Component = contextualizerModule && contextualizerModule.Block; + + if ( contextualization && Component ) { + const hide = !visibility.paged; + return hide ? null : ( +
+ +
+ { +

+ {contextualization.title || resource.metadata.title} +

+ } + {contextualization.legend && +
+ +
+ } + +
+
+ ); + } + else { + return null; + } +}; + +/** + * Component's properties types + */ +BlockAssetWrapper.propTypes = { + + /** + * Corresponds to the data initially embedded in a draft-js entity + */ + data: PropTypes.shape( { + asset: PropTypes.shape( { + id: PropTypes.string + } ) + } ) +}; + +/** + * Component's context used properties + */ +BlockAssetWrapper.contextTypes = { + + /** + * The active production data + */ + production: PropTypes.object, + + /** + * Dimensions of the wrapping element + */ + dimensions: PropTypes.object, + + /** + * Id of the presentation being displayed full screen if any + */ + fixedPresentationId: PropTypes.string, + + /** + * Whether the block asset is displayed in a note (and not in main content) + */ + inNote: PropTypes.bool, + + contextualizers: PropTypes.object, + + productionAssets: PropTypes.object, + + containerId: PropTypes.string, +}; + +export default BlockAssetWrapper; diff --git a/src/components/Colophon.js b/src/components/Colophon.js new file mode 100644 index 0000000..98b4061 --- /dev/null +++ b/src/components/Colophon.js @@ -0,0 +1,50 @@ +import React from 'react'; +import MarkdownPlayer from './MarkdownPlayer'; + +export default ( { + data: { + customText, + copyright, + issn, + isbn + } = { + }, + id +} ) => { + + return ( +
+
+ { + customText && customText.length > 0 && +
+ +
+ } + { + copyright && copyright.length > 0 && +
+ +
+ } + { + isbn && isbn.length > 0 && +
+ ISBN {isbn} +
+ } + { + issn && issn.length > 0 && +
+ ISSN {issn} +
+ } + +
+ +
+ ); +}; diff --git a/src/components/DefaultLinkComponent.js b/src/components/DefaultLinkComponent.js new file mode 100644 index 0000000..0a773c3 --- /dev/null +++ b/src/components/DefaultLinkComponent.js @@ -0,0 +1,20 @@ +import React from 'react'; + +export default ( { + href, + target, + children, + className, + id, + style, +} ) => ( + + {children} + +); diff --git a/src/components/DefaultMentionComponent.js b/src/components/DefaultMentionComponent.js new file mode 100644 index 0000000..34640be --- /dev/null +++ b/src/components/DefaultMentionComponent.js @@ -0,0 +1,20 @@ +import React from 'react'; + +export default ( { + href, + target, + // children, + className, + id, + style, +} ) => ( + + p. + +); diff --git a/src/components/DefaultSectionLinkComponent.js b/src/components/DefaultSectionLinkComponent.js new file mode 100644 index 0000000..1e73e85 --- /dev/null +++ b/src/components/DefaultSectionLinkComponent.js @@ -0,0 +1,28 @@ +import React from 'react'; + +export default ( { + sectionId, + target, + children, + className, + id, + style, +} ) => ( + + {children} + ( + p. { + + } + ) + +); diff --git a/src/components/EndNotes.js b/src/components/EndNotes.js new file mode 100644 index 0000000..26bc69f --- /dev/null +++ b/src/components/EndNotes.js @@ -0,0 +1,59 @@ +import React from 'react'; + +import Renderer from './Renderer'; +import { ReferencesManager } from 'react-citeproc'; + +export default ( { + production: { + sections + }, + sectionsIds: sectionsOrder, + translate, + title, + citations, + citationStyle, + citationLocale, + id, +} ) => ( +
+ +

{title || translate( 'Notes' )}

+
    + { + sectionsOrder.reduce( ( results, sectionId ) => + results.concat( + Object.keys( sections[sectionId].notes ) + .map( ( thatId ) => sections[sectionId].notes[thatId] ) + ) + , [] ) + .map( ( note, index ) => { + return ( +
  1. + + {index + 1} + + +
  2. + ); + } ) + } +
+
+
+); diff --git a/src/components/Footnote.js b/src/components/Footnote.js new file mode 100644 index 0000000..f598ac7 --- /dev/null +++ b/src/components/Footnote.js @@ -0,0 +1,72 @@ +/** + * This module exports a stateless reusable note pointer component + * ============ + * @module quinoa-production-player/components/NotePointer + */ +import React from 'react'; +import PropTypes from 'prop-types'; + +import Renderer from './FootnoteRenderer'; + +/** + * Renders a not pointer as a pure component + * @param {object} props + * @param {array} props.children - children elements of the component + * @param {array} props.noteId - the id of the note to point to + * @param {object} context - the context data of the component + * @return {ReactElement} component - the component + */ +const Footnote = ( { + // children, + noteId = '', + notesPosition +}, context ) => { + const notes = context.notes; + if ( notes ) { + const note = notes[noteId]; + if ( note ) { + return ( + + + + + + ); + } + return null; + } + return null; +}; + +/** + * Component's properties types + */ +Footnote.propTypes = { + + /** + * Children react components + */ + children: PropTypes.array, + + /** + * id of the note to render + */ + noteId: PropTypes.string, +}; + +/** + * Component's context used properties + */ +Footnote.contextTypes = { + + /** + * Map of available notes to look into + */ + notes: PropTypes.object, +}; + +export default Footnote; diff --git a/src/components/FootnoteRenderer.js b/src/components/FootnoteRenderer.js new file mode 100644 index 0000000..ef651fa --- /dev/null +++ b/src/components/FootnoteRenderer.js @@ -0,0 +1,279 @@ +/** + * This module exports a statefull reusable draft-js raw-to-react renderer component + * It wrapps around the redraft engine that converts draft-s raw to a react representation, + * providing it specific settings and callbacks. + */ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import redraft from 'redraft'; +import { constants } from 'peritext-schemas'; + +import Link from './Link'; +import BlockAssetWrapper from './BlockAssetWrapper'; +import InlineAssetWrapper from './InlineAssetWrapper'; +import InternalLink from './InternalLink'; + +/* + * import NotePointer from './NotePointer'; + * import Footnote from './Footnote'; + */ +const { + LINK, + BLOCK_ASSET, + INLINE_ASSET, + SECTION_POINTER, +} = constants.draftEntitiesNames; + +// just a helper to add a
after each block +const addBreaklines = ( children ) => children.map( ( child, index ) => [ child,
] ); + +/** + * Define the renderers + */ +const renderers = { + + /** + * Those callbacks will be called recursively to render a nested structure + */ + inline: { + // The key passed here is just an index based on rendering order inside a block + BOLD: ( children, { key } ) => {children}, + ITALIC: ( children, { key } ) => {children}, + UNDERLINE: ( children, { key } ) => {children}, + CODE: ( children, { key } ) => {children}, + }, + + /** + * Blocks receive children and depth + * Note that children are an array of blocks with same styling, + */ + blocks: { + 'unstyled': ( children ) => children.map( ( child, index ) => ( + + {child} + + ) ), + 'blockquote': ( children ) => {addBreaklines( children )}, + 'header-one': ( children, { keys } ) => children.map( ( child, index ) => ( + + {child} + + ) ), + 'header-two': ( children, { keys } ) => children.map( ( child, index ) => ( + + {child} + + ) ), + 'header-three': ( children, { keys } ) => children.map( ( child, index ) => ( + + {child} + + ) ), + 'header-four': ( children, { keys } ) => children.map( ( child, index ) => ( + + {child} + + ) ), + 'header-five': ( children, { keys } ) => children.map( ( child, index ) => ( + + {child} + + ) ), + 'header-six': ( children, { keys } ) => children.map( ( child, index ) => ( + + {child} + + ) ), + + // You can also access the original keys of the blocks + 'code-block': ( children, { keys } ) => ( + + {addBreaklines( children )} + + ), + // or depth for nested lists + 'unordered-list-item': ( children, { depth, keys } ) => ( + + { + children.map( ( child, index ) => ( + + {child} + + ) ) + } + ), + 'ordered-list-item': ( children, { depth, keys } ) => ( + + { + children.map( ( child, index ) => ( + + {child} + + ) ) + } + + ), + + /* + * If your blocks use meta data it can also be accessed like keys + * atomic: (children, { keys, data }) => children.map((child, i) => {child}), + */ + }, + + /** + * Entities receive children and the entity data + */ + entities: { + // // key is the entity key value from raw + [LINK]: ( children, data, { key } ) => + ( + + {children} + + ), + [BLOCK_ASSET]: ( children, data, { key } ) => { + return ( + + ); + }, + [INLINE_ASSET]: ( children, data, { key } ) => { + return ( + + {children} + + ); + }, + [SECTION_POINTER]: ( children, data, { key } ) => { + return ( + + {children} + + ); + }, + }, +}; + +/** + * Renderer class for building raw-to-react rendering react component instances + */ +class Renderer extends Component { + + /** + * constructor + * @param {object} props - properties given to instance at instanciation + */ + constructor ( props ) { + super( props ); + } + + /** + * Determines whether to update the component or not + * @param {object} nextProps - the future properties of the component + * @return {boolean} shouldUpdate - yes or no + */ + shouldComponentUpdate( ) { + return true; + // return this.props.raw !== nextProps.raw; + } + + /** + * Displays something when no suitable content state is provided to the renderer + * @return {ReactElement} default message + */ + renderWarning() { + return
; + } + + /** + * Renders the component + * @return {ReactElement} component - the component + */ + render() { + const { + raw, + } = this.props; + if ( !raw ) { + return this.renderWarning(); + } + const rendered = redraft( raw, renderers ); + // redraft can return a null if there's nothing to render + if ( !rendered ) { + return this.renderWarning(); + } + return ( + + {rendered} + + ); + } +} + +/** + * Component's properties types + */ +Renderer.propTypes = { + + /** + * Draft-js raw representation of some contents + * see https://draftjs.org/docs/api-reference-data-conversion.html + */ + raw: PropTypes.object +}; + +export default Renderer; diff --git a/src/components/FrontCover.js b/src/components/FrontCover.js new file mode 100644 index 0000000..ea86c36 --- /dev/null +++ b/src/components/FrontCover.js @@ -0,0 +1,56 @@ +import React from 'react'; +import MarkdownPlayer from './MarkdownPlayer'; +import Authors from './Authors'; + +export default ( { + production: { + metadata + }, + edition, + data: { + backgroundColor, + customCoverFooter, + animatedBackground, + } = {}, + id +} ) => { + const { + data: editionData = {} + } = edition; + const finalTitle = editionData.publicationTitle || metadata.title; + const finalSubtitle = editionData.publicationSubtitle || metadata.subtitle; + return ( +
+
+

+ {finalTitle} +

+ { + finalSubtitle && +

{finalSubtitle}

+ } +

+ { + metadata.authors && + + } +

+
+ { + customCoverFooter && customCoverFooter.length > 0 && +
+ +
+ } +
+ ); +}; diff --git a/src/components/Glossary.js b/src/components/Glossary.js new file mode 100644 index 0000000..9ae9443 --- /dev/null +++ b/src/components/Glossary.js @@ -0,0 +1,205 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { ReferencesManager } from 'react-citeproc'; + +import MarkdownPlayer from './MarkdownPlayer'; + +import { + buildContextContent, + getContextualizationsFromEdition +} from 'peritext-utils'; + +const buildGlossary = ( { + production, + edition, + options +} ) => { + const { + contextualizers, + resources + } = production; + + const { + showUncited = false, + glossaryTypes = [ 'person', 'place', 'event', 'notion', 'other' ] + } = options; + + let items; + const usedContextualizations = getContextualizationsFromEdition( production, edition ); + if ( showUncited ) { + items = Object.keys( production.resources ) + .filter( ( resourceId ) => production.resources[resourceId].metadata.type === 'glossary' ) + .map( ( resourceId ) => production.resources[resourceId] ) + .map( ( resource ) => { + return { + resource, + mentions: usedContextualizations.filter( ( c ) => c.contextualization.resourceId === resource.id ) + }; + } ); + } + else { + items = usedContextualizations + .filter( ( element ) => { + const contextualization = element.contextualization; + const contextualizerId = contextualization.contextualizerId; + const contextualizer = contextualizers[contextualizerId]; + return contextualizer && contextualizer.type === 'glossary'; + } ) + .map( ( element ) => { + const contextualization = element.contextualization; + return { + ...contextualization, + contextualizer: contextualizers[contextualization.contextualizerId], + resource: resources[contextualization.resourceId], + contextContent: buildContextContent( production, contextualization.id ), + containerId: element.containerId, + }; + } ) + .reduce( ( entries, contextualization ) => { + return { + ...entries, + [contextualization.resourceId]: { + resource: contextualization.resource, + mentions: entries[contextualization.resourceId] ? + entries[contextualization.resourceId].mentions.concat( contextualization ) + : [ contextualization ] + } + }; + }, {} ); + items = Object.keys( items ).map( ( resourceId ) => ( { + resource: items[resourceId].resource, + mentions: items[resourceId].mentions + } ) ); + } + + const glossaryMentions = items + .filter( ( item ) => { + return glossaryTypes.includes( item.resource.data.entryType ); + } ) + .sort( ( a, b ) => { + if ( a.resource.data.name.toLowerCase() > b.resource.data.name.toLowerCase() ) { + return 1; + } + else { + return -1; + } + } ); + + return glossaryMentions; +}; + +const Glossary = ( { + production, + edition, + translate, + citations, + citationStyle, + citationLocale, + id, + data = { + showMentions: true, + showDescriptions: true, + }, + // LinkComponent: propLinkComponent, + MentionComponent: propMentionComponent, +}, { + // LinkComponent: contextLinkComponent, + MentionComponent: contextMentionComponent, +} ) => { + // const LinkComponent = propLinkComponent || contextLinkComponent; + const MentionComponent = propMentionComponent || contextMentionComponent; + const { + showMentions, + customTitle, + showDescriptions, + } = data; + const glossary = buildGlossary( { options: data, production, edition } ); + return ( +
+ +

{customTitle || translate( 'Glossary list' )} +

+
    + { + glossary.map( ( entry, index ) => { + // const entryName = entry.title; + return ( +
  • +
    + {entry.resource.data.name} +
    + {showDescriptions && +
    + +
    + } + {showMentions && entry.mentions.length > 0 && +
    + { + entry.mentions + .filter( ( mention ) => mention !== undefined && mention.contextContent ) + .map( ( mention, count ) => { + const { + contextContent: { + + /* + * targetContents, + * contents, + * sectionTitle, + */ + sectionId, + }, + id: thatId, + containerId, + } = mention; + + return ( + + ); + } ) + .reduce( ( prev, curr, thatIndex ) => { + return thatIndex > 0 ? [ prev, ', ', curr ] : [ curr ]; + }, [] ) + } +
    + } +
  • + ); + } ) + } +
+
+
+ ); +}; + +Glossary.contextTypes = { + LinkComponent: PropTypes.func, + MentionComponent: PropTypes.func, +}; + +export default Glossary; diff --git a/src/components/Head.js b/src/components/Head.js new file mode 100644 index 0000000..5ed630e --- /dev/null +++ b/src/components/Head.js @@ -0,0 +1,111 @@ +import React from 'react'; +import { Helmet } from 'react-helmet'; + +export default ( { + pageTitle, + authors = [], + tags = [], + description = '', + url = '' +} ) => { + const authorsStr = authors.map( ( author ) => `${author.given } ${ author.family}` ).join( ', ' ); + return ( + + {pageTitle} + + {/**/} + + + { + // tags.map((thatTag, index) => ) + } + {/**/} + + {/**/} + + + + + {/**/} + + {/**/} + + + + + {/**/} + {/**/} + {/**/} + + {/**/} + + + {/**/} + {/**/} + + {/**/} + + + + + + {/* + + */} + {/**/} + + ); +}; diff --git a/src/components/InlineAssetWrapper.js b/src/components/InlineAssetWrapper.js new file mode 100644 index 0000000..27752cd --- /dev/null +++ b/src/components/InlineAssetWrapper.js @@ -0,0 +1,77 @@ + +import React from 'react'; +import PropTypes from 'prop-types'; + +const InlineAssetWrapper = ( { + data, + children +}, context ) => { + const { production, containerId } = context; + const assetId = data.asset && data.asset.id; + if ( !assetId || !production ) { + return null; + } + const contextualization = production.contextualizations[assetId]; + if ( !contextualization ) { + return null; + } + + const contextualizer = production.contextualizers[contextualization.contextualizerId]; + const resource = production.resources[contextualization.resourceId]; + + const contextualizers = context.contextualizers; + const contextualizerModule = contextualizers[contextualizer.type]; + + const Component = contextualizerModule && contextualizerModule.Inline; + if ( contextualizer && Component ) { + + /** + * @todo this is a fix for a rendering bug + */ + if ( contextualizer.type === 'glossary' ) { + return children; + } + return ( + + + {children} + + + ); + } + return null; +}; + +/** + * Component's properties types + */ +InlineAssetWrapper.propTypes = { + + /** + * Corresponds to the data initially embedded in a draft-js entity + */ + data: PropTypes.shape( { + asset: PropTypes.shape( { + id: PropTypes.string + } ) + } ) +}; + +/** + * Component's context used properties + */ +InlineAssetWrapper.contextTypes = { + production: PropTypes.object, + contextualizers: PropTypes.object, + containerId: PropTypes.string, +}; + +export default InlineAssetWrapper; diff --git a/src/components/InternalLink.js b/src/components/InternalLink.js new file mode 100644 index 0000000..9fc2d73 --- /dev/null +++ b/src/components/InternalLink.js @@ -0,0 +1,25 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +const InternalLink = ( { sectionId, children }, { containerId } ) => ( + + {children} + {'('} + + {'p'} + + {')'} + +); + +InternalLink.contextTypes = { + containerId: PropTypes.string +}; + +export default InternalLink; diff --git a/src/components/Link.js b/src/components/Link.js new file mode 100644 index 0000000..c9542fa --- /dev/null +++ b/src/components/Link.js @@ -0,0 +1,45 @@ +/** + * This module exports a stateless reusable external link component + * ============ + * @module perinext/components/Link + */ +import React from 'react'; +import PropTypes from 'prop-types'; + +/** + * Renders a link as a pure component + * @param {object} props + * @param {string} props.to - the url to point to + * @param {array} props.children - children elements of the component + * @return {ReactElement} component - the component + */ +const Link = ( { + to, + children +} ) => ( + + {children} + +); + +/** + * Component's properties types + */ +Link.propTypes = { + + /** + * url to point to + */ + children: PropTypes.array, + + /** + * children react elements + */ + to: PropTypes.string +}; + +export default Link; diff --git a/src/components/MarkdownPlayer.js b/src/components/MarkdownPlayer.js new file mode 100644 index 0000000..08c7095 --- /dev/null +++ b/src/components/MarkdownPlayer.js @@ -0,0 +1,4 @@ +import React from 'react'; +import Player from 'react-markdown'; + +export default ( { src = '' } ) => ; diff --git a/src/components/NotePointer.js b/src/components/NotePointer.js new file mode 100644 index 0000000..0866bf2 --- /dev/null +++ b/src/components/NotePointer.js @@ -0,0 +1,84 @@ +/** + * This module exports a stateless reusable note pointer component + * ============ + * @module quinoa-production-player/components/NotePointer + */ +import React from 'react'; +import PropTypes from 'prop-types'; + +/** + * Renders a note pointer as a pure component + * @param {object} props + * @param {array} props.children - children elements of the component + * @param {array} props.noteId - the id of the note to point to + * @param {object} context - the context data of the component + * @return {ReactElement} component - the component + */ +const NotePointer = ( { + children, + noteId = '' +}, context ) => { + const notes = context.notes; + const NoteLinkComponent = context.NoteLinkComponent; + if ( notes ) { + const note = notes[noteId]; + if ( note ) { + return ( + + {NoteLinkComponent ? + + {note.order} + {children} + + : + + {note.order} + {children} + + } + + ); + } + return null; + } + return null; +}; + +/** + * Component's properties types + */ +NotePointer.propTypes = { + + /** + * Children react components + */ + children: PropTypes.array, + + /** + * id of the note to render + */ + noteId: PropTypes.string, +}; + +/** + * Component's context used properties + */ +NotePointer.contextTypes = { + + /** + * Map of available notes to look into + */ + notes: PropTypes.object, + + /** + * Triggers a callback upstream when the pointer is clicked + */ + onNoteContentPointerClick: PropTypes.func, + + NoteLinkComponent: PropTypes.func, +}; + +export default NotePointer; diff --git a/src/components/References.js b/src/components/References.js new file mode 100644 index 0000000..4ad3899 --- /dev/null +++ b/src/components/References.js @@ -0,0 +1,314 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import uniq from 'lodash/uniq'; +import { ReferencesManager, makeBibliography } from 'react-citeproc'; + +import { + buildContextContent, + getContextualizationsFromEdition, + resourceToCslJSON +} from 'peritext-utils'; + +/** + * Builds an interactive bibliography for a given edition + * @returns {ReactMarkup} + */ +function buildBibliography ( { + production, + edition, + citations, + contextualizations, + showUncitedReferences, + resourceTypes, + sortingKey, + sortingAscending, +} ) { + + const { + + /* + * contextualizations, + * contextualizers, + */ + resources + } = production; + + /** + * Select relevant resources + */ + // filter cited references only + let citedResourcesIds = showUncitedReferences ? + Object.keys( resources ) + : + uniq( + contextualizations.map( ( element ) => { + const contextualization = element.contextualization; + return contextualization.resourceId; + } ) + ); + // filter by type of resource + citedResourcesIds = citedResourcesIds.filter( ( resourceId ) => { + const type = resources[resourceId].metadata.type; + return resourceTypes.includes( type ); + } ); + + let items = citedResourcesIds.map( ( resourceId ) => { + const cit = resourceToCslJSON( resources[resourceId] ); + const citationKey = cit && cit[0] && cit[0].id; + const mentions = contextualizations.map( ( element ) => { + if ( element.contextualization.resourceId === resourceId ) { + return { + ...element, + id: element.contextualization.id + }; + } + } ).filter( ( s ) => s ); + + let biblio; + if ( citations.citationItems[citationKey] ) { + biblio = makeBibliography( + citations.citationItems, + edition.data.citationStyle.data, + edition.data.citationLocale.data, + { + select: [ { + field: 'id', + value: citationKey + } ] + } + ); + } + else { + biblio = makeBibliography( + { [resourceId]: { ...cit[0], id: resourceId } }, + edition.data.citationStyle.data, + edition.data.citationLocale.data, + { + select: [ { + field: 'id', + value: resourceId + } ] + } + ); + } + const title = biblio && biblio[1] && biblio[1][0]; + return { + citationKey, + title, + item: citations.citationItems[citationKey] || cit[0], + mentions: mentions.map( ( mention ) => ( { + ...mention, + contextContent: buildContextContent( production, mention.id ) + } ) ) + }; + } ); + + items = items.sort( ( a, b ) => { + switch ( sortingKey ) { + case 'date': + const datePartsA = a.item.issued && a.item.issued['date-parts']; + const datePartsB = b.item.issued && b.item.issued['date-parts']; + if ( datePartsA && datePartsB && datePartsA.length && datePartsB.length ) { + + if ( datePartsA[0] > datePartsB[0] ) { + return 1; + } + else if ( datePartsA[0] < datePartsB[0] ) { + return -1; + } + else if ( datePartsA.length > 1 && datePartsB.length > 1 ) { + if ( datePartsA[1] > datePartsB[1] ) { + return 1; + } + else if ( datePartsA[1] < datePartsB[1] ) { + return -1; + } + else return 0; + } + else { + return 0; + } + + } + else if ( !datePartsB || ( datePartsB && !datePartsB.length ) ) { + return -1; + } + else if ( !datePartsA || ( datePartsA && !datePartsA.length ) ) { + return 1; + } + else { + return 0; + } + case 'authors': + if ( a.item.author && b.item.author ) { + const authorsA = a.item.author && a.item.author.map( ( author ) => `${author.family}-${author.given}`.toLowerCase() ).join( '' ); + const authorsB = b.item.author && b.item.author.map( ( author ) => `${author.family}-${author.given}`.toLowerCase() ).join( '' ); + if ( authorsA > authorsB ) { + return 1; + } + else return -1; + } + else if ( !b.item.author ) { + return -1; + } + else if ( !a.item.author ) { + return 1; + } + else return 0; + case 'title': + if ( a.item.title.toLowerCase() > b.item.title.toLowerCase() ) { + return 1; + } + return -1; + default: + break; + } + } ); + if ( !sortingAscending ) { + items = items.reverse(); + } + + return items; +} + +const References = ( { + production, + edition, + translate, + data = { + showMentions: true, + showUncitedReferences: false, + resourceTypes: [ 'bib' ], + sortingKey: 'authors', + sortingAscending: true, + }, + + citations, + citationStyle, + citationLocale, + + id, + // LinkComponent: propLinkComponent, + MentionComponent: propMentionComponent, +}, { + // LinkComponent: contextLinkComponent, + MentionComponent: contextMentionComponent, +} ) => { + const { + showMentions, + showUncitedReferences, + resourceTypes, + sortingKey, + sortingAscending, + customTitle, + } = data; + // const LinkComponent = propLinkComponent || contextLinkComponent; + const MentionComponent = propMentionComponent || contextMentionComponent; + + /** + * @todo compute citations based on edition + */ + const contextualizations = getContextualizationsFromEdition( production, edition ); + const references = buildBibliography( { + production, + edition, + citations, + contextualizations, + showUncitedReferences, + resourceTypes, + sortingKey, + sortingAscending, + } ); + return ( +
+ +

+ {customTitle || translate( 'References' )} +

+
    + { + references.map( ( entry, index ) => { + const entryName = entry.title; + return ( +
  • +
    +
    +
    + { + showMentions && + entry.mentions + .find( ( mention ) => mention && mention.contextContent ) + && + +
    + { + entry.mentions + .filter( ( mention ) => mention !== undefined && mention.contextContent ) + .map( ( mention, count ) => { + const { + contextContent: { + + /* + * targetContents, + * contents, + * sectionTitle, + */ + sectionId, + }, + id: thatId, + containerId, + } = mention; + return ( + + ); + } ) + .reduce( ( prev, curr, thatIndex ) => { + if ( thatIndex === 0 ) { + return [ curr ]; + } + return [ prev, ', ', curr ]; + }, [] ) + } +
    + } +
  • + ); + } ) + } +
+
+
+ ); +}; + +References.contextTypes = { + LinkComponent: PropTypes.func, + MentionComponent: PropTypes.func, +}; + +export default References; diff --git a/src/components/Renderer.js b/src/components/Renderer.js new file mode 100644 index 0000000..7194e21 --- /dev/null +++ b/src/components/Renderer.js @@ -0,0 +1,286 @@ +/** + * This module exports a statefull reusable draft-js raw-to-react renderer component + * It wrapps around the redraft engine that converts draft-s raw to a react representation, + * providing it specific settings and callbacks. + */ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import redraft from 'redraft'; +import { constants } from 'peritext-schemas'; + +import Link from './Link'; +import BlockAssetWrapper from './BlockAssetWrapper'; +import InlineAssetWrapper from './InlineAssetWrapper'; +import NotePointer from './NotePointer'; +import Footnote from './Footnote'; +import InternalLink from './InternalLink'; +const { + LINK, + BLOCK_ASSET, + INLINE_ASSET, + SECTION_POINTER, + NOTE_POINTER, +} = constants.draftEntitiesNames; + +// just a helper to add a
after each block +const addBreaklines = ( children ) => children.map( ( child, index ) => [ child,
] ); + +/** + * Define the renderers + */ +const renderers = { + + /** + * Those callbacks will be called recursively to render a nested structure + */ + inline: { + // The key passed here is just an index based on rendering order inside a block + BOLD: ( children, { key } ) => {children}, + ITALIC: ( children, { key } ) => {children}, + UNDERLINE: ( children, { key } ) => {children}, + CODE: ( children, { key } ) => {children}, + }, + + /** + * Blocks receive children and depth + * Note that children are an array of blocks with same styling, + */ + blocks: { + 'unstyled': ( children ) => children.map( ( child, index ) => + ( +
+ {child} +
+ ) ), + 'blockquote': ( children, index ) =>
{addBreaklines( children )}
, + 'header-one': ( children, { keys } ) => children.map( ( child, index ) => ( +

+ {child} +

+ ) ), + 'header-two': ( children, { keys } ) => children.map( ( child, index ) => ( +

+ {child} +

+ ) ), + 'header-three': ( children, { keys } ) => children.map( ( child, index ) => ( +

+ {child} +

+ ) ), + 'header-four': ( children, { keys } ) => children.map( ( child, index ) => ( +

+ {child} +

+ ) ), + 'header-five': ( children, { keys } ) => children.map( ( child, index ) => ( +
+ {child} +
+ ) ), + 'header-six': ( children, { keys } ) => children.map( ( child, index ) => ( +
+ {child} +
+ ) ), + + // You can also access the original keys of the blocks + 'code-block': ( children, { keys } ) => +
{addBreaklines( children )}
, + // or depth for nested lists + 'unordered-list-item': ( children, { depth, keys } ) => ( +
    + { + children.map( + ( child, index ) => +
  • {child}
  • + ) + } +
+ ), + 'ordered-list-item': ( children, { depth, keys } ) => ( +
    + { + children.map( + ( child, index ) => +
  1. {child}
  2. + ) + } +
+ ), + + /* + * If your blocks use meta data it can also be accessed like keys + * atomic: (children, { keys, data }) => children.map((child, i) => {child}), + */ + }, + + /** + * Entities receive children and the entity data + */ + entities: { + // // key is the entity key value from raw + [LINK]: ( children, data, { key } ) => + ( + + {children} + + ), + [BLOCK_ASSET]: ( children, data, { key } ) => { + return ( + + ); + }, + [INLINE_ASSET]: ( children, data, { key } ) => { + return ( + + {children} + + ); + }, + [SECTION_POINTER]: ( children, data, { key } ) => { + return ( + + {children} + + ); + }, + [NOTE_POINTER]: ( children, data, { key } ) => { + return ( + + ); + } + }, +}; + +/** + * Renderer class for building raw-to-react rendering react component instances + */ +class Renderer extends Component { + + /** + * constructor + * @param {object} props - properties given to instance at instanciation + */ + constructor ( props ) { + super( props ); + } + + getChildContext = () => ( { + containerId: this.props.containerId, + } ) + + /** + * Determines whether to update the component or not + * @param {object} nextProps - the future properties of the component + * @return {boolean} shouldUpdate - yes or no + */ + shouldComponentUpdate( ) { + return true; + } + + /** + * Displays something when no suitable content state is provided to the renderer + * @return {ReactElement} default message + */ + renderWarning() { + return
; + } + + /** + * Renders the component + * @return {ReactElement} component - the component + */ + render() { + const { + raw, + notesPosition, + } = this.props; + if ( !raw ) { + return this.renderWarning(); + } + if ( notesPosition === 'footnotes' || notesPosition === 'sidenotes' ) { + renderers.entities.NOTE_POINTER = ( children, data, { key } ) => { + return ( + + ); + }; + } + const rendered = redraft( raw, renderers ); + // redraft can return a null if there's nothing to render + if ( !rendered ) { + return this.renderWarning(); + } + return ( +
+ {rendered} +
+ ); + } +} + +/** + * Component's properties types + */ +Renderer.propTypes = { + + /** + * Draft-js raw representation of some contents + * see https://draftjs.org/docs/api-reference-data-conversion.html + */ + raw: PropTypes.object +}; + +Renderer.childContextTypes = { + containerId: PropTypes.string, +}; + +export default Renderer; diff --git a/src/components/Section.js b/src/components/Section.js new file mode 100644 index 0000000..4d23c1b --- /dev/null +++ b/src/components/Section.js @@ -0,0 +1,93 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { ReferencesManager } from 'react-citeproc'; + +import Renderer from './Renderer'; +import EndNotes from './EndNotes'; +import Authors from './Authors'; + +class Section extends Component { + constructor( props ) { + super( props ); + + } + + getChildContext = () => ( { + notes: this.props.section.notes + } ) + + render = () => { + const { + citations, + citationStyle, + citationLocale, + section: { + id, + metadata: { + title, + subtitle, + authors = [], + }, + contents, + }, + containerId, + notesPosition, + production, + translate, + publicationTitle, + publicationSubtitle, + } = this.props; + return ( +
+ +

{title}

+ {title} + {publicationTitle} + + {subtitle &&

{subtitle}

} + { + authors.length > 0 && +

+ +

+ } + + { + notesPosition === 'endOfSections' && + + } +
+
+ ); + } +} + +export default Section; + +Section.childContextTypes = { + notes: PropTypes.object, +}; diff --git a/src/components/TableOfContents.js b/src/components/TableOfContents.js new file mode 100644 index 0000000..58cfeb6 --- /dev/null +++ b/src/components/TableOfContents.js @@ -0,0 +1,56 @@ +import React from 'react'; + +const TocElement = ( { + title, + href, + level = 0, +} ) => ( +
  • + + {title} + + + p. + +
  • +); + +export default ( { + tableOfContents, + data: { + customTitle, + displayPageNumber + } = {}, + translate +} ) => ( +
    +

    { + customTitle && customTitle.trim().length ? + customTitle + : + translate( 'Table of contents' ) + } +

    +
      + { + tableOfContents.map( ( item, index ) => { + return ( + + ); + } ) + } +
    +
    +); diff --git a/src/components/TitlePage.js b/src/components/TitlePage.js new file mode 100644 index 0000000..2dd592a --- /dev/null +++ b/src/components/TitlePage.js @@ -0,0 +1,52 @@ +import React from 'react'; +import MarkdownPlayer from './MarkdownPlayer'; +import Authors from './Authors'; + +export default ( { + production: { + metadata + }, + edition, + data: { + customCoverFooter + } = { + }, + id +} ) => { + const { + data: editionData = {} + } = edition; + + const finalTitle = editionData.publicationTitle || metadata.title; + const finalSubtitle = editionData.publicationSubtitle || metadata.subtitle; + return ( +
    +
    +

    + {finalTitle} +

    + { + finalSubtitle && +

    {finalSubtitle}

    + } +

    + { + metadata.authors && + + } +

    +
    + { + customCoverFooter && customCoverFooter.length > 0 && +
    + +
    + } +
    + ); +}; diff --git a/src/components/Wrapper.js b/src/components/Wrapper.js new file mode 100644 index 0000000..b4bbe16 --- /dev/null +++ b/src/components/Wrapper.js @@ -0,0 +1,447 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; + +import { buildCitations } from 'peritext-utils'; + +import FrontCover from './FrontCover'; +import TitlePage from './TitlePage'; +import BackCover from './BackCover'; +import Colophon from './Colophon'; +import References from './References'; +import Glossary from './Glossary'; +import EndNotes from './EndNotes'; +import DefaultLinkComponent from './DefaultLinkComponent'; +import DefaultMentionComponent from './DefaultMentionComponent'; +import DefaultSectionLinkComponent from './DefaultSectionLinkComponent'; +import MarkdownPlayer from './MarkdownPlayer'; +import TableOfContents from './TableOfContents'; + +import Section from './Section'; + +import templateStyle from '../defaultStyle'; + +const EmptyPage = () => ( +
    +); + +const updateStyles = ( props ) => { + const { + edition: { + data = {} + }, + contextualizers = {}, + } = props; + + const { + style: { + css = '', + mode = 'merge', + } = { css: '' } + } = data; + + const contextualizersStyles = Object.keys( contextualizers ) + .map( ( type ) => contextualizers[type] && contextualizers[type].defaultCss || '' ) + .join( '\n' ); + if ( mode === 'merge' ) { + + return [ + templateStyle, + // templateStylesheet, + contextualizersStyles, + css + ] + .join( '\n' ); + } + else { // styleMode === 'replace' + return [ + // templateStylesheet, + contextualizersStyles, + css + ] + .join( '\n' ); + } + + }; + +/** + * @todo externalize + */ +const buildToc = ( production, edition, translate ) => { + const summary = edition.data.plan.summary; + // returns [{level, title, href}] + return summary.reduce( ( res, element ) => { + const { + data = {} + } = element; + switch ( element.type ) { + case 'customPage': + const { title, displayInTableOfContents } = data; + if ( displayInTableOfContents ) { + return [ + ...res, + { + title, + level: 0, + href: `custom-block-${element.id}` + } + ]; + } + return res; + case 'sections': + const { id } = element; + const { customSummary = { active: false } } = data; + if ( customSummary.active ) { + const { summary: thatCustomSummary } = customSummary; + return [ + ...res, + ...thatCustomSummary.map( ( el ) => { + const thatSection = production.sections[el.id]; + return { + title: thatSection && thatSection.metadata.title, + level: el.level, + href: `section-${id}-${el.id}` + }; + } ) + .filter( ( s ) => s ) + ]; + } + return [ + ...res, + ...production.sectionsOrder.map( ( sectionId ) => { + const thatSection = production.sections[sectionId]; + return { + title: thatSection && thatSection.metadata.title, + level: thatSection && thatSection.metadata.level || 0, + href: `section-${id}-${sectionId}` + }; + } ) + ]; + case 'glossary': + return [ + ...res, + { + title: data.customTitle || translate( 'Glossary list' ), + level: 0, + href: `glossary-block-${element.id}` + } + ]; + case 'references': + return [ + ...res, + { + level: 0, + title: data.customTitle || translate( 'References' ), + href: `reference-block-${element.id}` + } + ]; + default: + return res; + } + }, [] ); +}; + +const buildSectionBlockSummary = ( sectionBlock, production ) => { + if ( sectionBlock.customSummary && sectionBlock.customSummary.active ) { + return sectionBlock.customSummary.summary.map( ( el ) => el.id ); + } + return production.sectionsOrder; +}; + +const Sections = ( { + production, + edition, + translate, + data = {}, + citations, + citationStyle, + citationLocale, + publicationTitle, + publicationSubtitle, + id, +} ) => { + const summary = edition.data.plan.summary; + const notesPosition = data.notesPosition || 'footnotes'; + + const sectionsBlocks = summary.filter( ( s ) => s.type === 'sections' ); + + const sectionsIds = sectionsBlocks.reduce( ( res, sectionBlock ) => { + // @todo handle custom sections order + return [ + ...res, + ...buildSectionBlockSummary( sectionBlock, production ) + ]; + }, [] ); + + return [ + ...sectionsIds.map( ( sectionId, index ) => { + const section = production.sections[sectionId]; + return ( +
    + ); + } ), + // @todo endnotes relative to sections and not to production sectionsOrder + notesPosition === 'endOfContents' ? + : null + ]; +}; + +const renderSummary = ( { + production, + edition, + translate, + citations, +} ) => { + const summary = edition.data.plan.summary; + const citationStyle = edition.data.citationStyle.data; + const citationLocale = edition.data.citationLocale.data; + + const { + data: editionData = {} + } = edition; + const { + metadata + } = production; + + const finalTitle = editionData.publicationTitle || metadata.title; + const finalSubtitle = editionData.publicationSubtitle || metadata.subtitle; + + return summary.map( ( element, index ) => { + switch ( element.type ) { + case 'frontCover': + return ( + + ); + case 'titlePage': + return ( + + ); + case 'colophon': + return ( + + ); + case 'backCover': + return ( + + ); + case 'emptyPage': + return ; + case 'tableOfContents': + const toc = buildToc( production, edition, translate ); + return ( + + ); + + case 'customPage': + return ( +
    + {element.data.title && +

    + {element.data.title} +

    + } + {element.data.markdownContents && + + } +
    + ); + case 'sections': + return ( + + ); + case 'glossary': + return ( + + ); + case 'references': + return ( + + ); + + default: + return ( +
    + {element.type} +
    + ); + } + } ); +}; + +export default class Template extends Component { + constructor( props ) { + super( props ); + } + + getChildContext() { + return { + LinkComponent: this.props.LinkComponent || DefaultLinkComponent, + MentionComponent: this.props.MentionComponent || DefaultMentionComponent, + SectionLinkComponent: this.props.SectionLinkComponent || DefaultSectionLinkComponent, + production: this.props.production, + productionAssets: this.props.production.assets, + + contextualizers: this.props.contextualizers, + translate: this.translate, + }; + } + + shouldComponentUpdate = () => true; + + translate = ( key ) => { + const { locale = {} } = this.props; + return locale[key] || key; + } + + render () { + const { + props: { + production, + edition, + contextualizers, + renderAdditionalHTML = false, + }, + translate, + } = this; + + const { + data = {}, + } = edition; + const { + additionalHTML = '', + } = data; + + const citations = buildCitations( production ); + const finalStyles = updateStyles( { edition, contextualizers } ); + + /** + * We render an array + * to have our sections as a flat collection + * which facilitates @paged rules about pages breaks + */ + return [ + ...renderSummary( { + production, + edition, + translate, + citations, + } ), +