From f31db4c397ea035259a21666551a381ef747ba1d Mon Sep 17 00:00:00 2001 From: kevalbhatt Date: Tue, 17 Sep 2019 17:32:31 +0530 Subject: [PATCH] ATLAS-3386 : Atlas documentation website with new template Signed-off-by: nixonrodrigues --- docs/.gitignore | 24 + docs/docz-lib/config/aliases.js | 3 + docs/docz-lib/config/menu.js | 103 + docs/docz-lib/config/versions.js | 39 + .../docz-core/dist/bundler/build.d.ts | 2 + .../docz-core/dist/bundler/config.d.ts | 4 + .../docz-core/dist/bundler/devserver.d.ts | 25 + .../docz-core/dist/bundler/index.d.ts | 4 + .../docz-core/dist/bundler/loaders.d.ts | 17 + .../docz-core/dist/bundler/minifier.d.ts | 3 + .../docz-core/dist/bundler/plugins.d.ts | 11 + .../docz-core/dist/bundler/server.d.ts | 6 + docs/docz-lib/docz-core/dist/cli.d.ts | 5 + .../docz-core/dist/commands/build.d.ts | 1 + .../docz-lib/docz-core/dist/commands/dev.d.ts | 1 + .../docz-core/dist/commands/index.d.ts | 3 + .../docz-core/dist/commands/serve.d.ts | 1 + docs/docz-lib/docz-core/dist/config/argv.d.ts | 128 + .../docz-lib/docz-core/dist/config/babel.d.ts | 8 + docs/docz-lib/docz-core/dist/config/docz.d.ts | 22 + docs/docz-lib/docz-core/dist/config/env.d.ts | 10 + .../docz-lib/docz-core/dist/config/paths.d.ts | 43 + docs/docz-lib/docz-core/dist/index.d.ts | 14 + docs/docz-lib/docz-core/dist/index.esm.js | 2008 +++ docs/docz-lib/docz-core/dist/index.js | 2024 +++ docs/docz-lib/docz-core/dist/lib/Bundler.d.ts | 35 + .../docz-core/dist/lib/DataServer.d.ts | 28 + docs/docz-lib/docz-core/dist/lib/Entries.d.ts | 13 + docs/docz-lib/docz-core/dist/lib/Entry.d.ts | 33 + docs/docz-lib/docz-core/dist/lib/Plugin.d.ts | 49 + docs/docz-lib/docz-core/dist/lib/Socket.d.ts | 8 + .../docz-core/dist/states/config.d.ts | 3 + .../docz-core/dist/states/entries.d.ts | 4 + .../docz-lib/docz-core/dist/states/index.d.ts | 3 + .../docz-lib/docz-core/dist/states/props.d.ts | 3 + .../docz-core/dist/templates/imports.tpl.js | 4 + .../docz-core/dist/templates/index.tpl.html | 15 + .../docz-core/dist/templates/index.tpl.js | 17 + .../docz-core/dist/templates/root.tpl.js | 24 + .../docz-core/dist/utils/docgen/index.d.ts | 2 + .../dist/utils/docgen/javascript.d.ts | 5 + .../dist/utils/docgen/typescript.d.ts | 6 + .../docz-core/dist/utils/on-signal.d.ts | 1 + .../docz-core/dist/utils/open-browser.d.ts | 11 + .../docz-core/dist/utils/parse-html.d.ts | 11 + .../docz-core/dist/utils/repo-info.d.ts | 3 + docs/docz-lib/docz/bin/index.js | 2 + docs/docz-lib/docz/dist/Playground.esm.js | 42 + docs/docz-lib/docz/dist/Playground.js | 44 + docs/docz-lib/docz/dist/chunk.esm.js | 311 + docs/docz-lib/docz/dist/chunk.js | 324 + .../docz/dist/components/AsyncComponent.d.ts | 7 + .../docz/dist/components/AsyncPlayground.d.ts | 2 + .../docz/dist/components/AsyncRoute.d.ts | 13 + docs/docz-lib/docz/dist/components/Link.d.ts | 4 + .../docz/dist/components/Playground.d.ts | 13 + docs/docz-lib/docz/dist/components/Props.d.ts | 65 + .../docz-lib/docz/dist/components/Routes.d.ts | 8 + docs/docz-lib/docz/dist/hooks/index.d.ts | 7 + .../docz/dist/hooks/useComponents.d.ts | 44 + docs/docz-lib/docz/dist/hooks/useConfig.d.ts | 7 + .../docz/dist/hooks/useDataServer.d.ts | 1 + docs/docz-lib/docz/dist/hooks/useDocs.d.ts | 2 + docs/docz-lib/docz/dist/hooks/useMenus.d.ts | 8 + .../docz-lib/docz/dist/hooks/usePrevious.d.ts | 1 + .../docz/dist/hooks/useWindowSize.d.ts | 6 + docs/docz-lib/docz/dist/index.d.ts | 8 + docs/docz-lib/docz/dist/index.esm.js | 302 + docs/docz-lib/docz/dist/index.js | 321 + docs/docz-lib/docz/dist/state.d.ts | 59 + docs/docz-lib/docz/dist/theme.d.ts | 10 + .../docz-lib/docz/dist/utils/createState.d.ts | 13 + docs/docz-lib/docz/dist/utils/helpers.d.ts | 3 + .../docz/dist/utils/humanize-prop.d.ts | 2 + docs/doczrc.js | 51 + docs/package-lock.json | 11891 ++++++++++++++++ docs/package.json | 39 + docs/pom.xml | 104 +- docs/src/documents/Asf/asfinfo.md | 17 + .../documents/ClassificationPropagation.md | 94 + docs/src/documents/Downloads/Downloads.md | 187 + .../{site/markdown => documents}/Glossary.md | 154 +- .../HighAvailability.md} | 167 +- .../HighLevelArchitecture.md} | 55 +- .../Hook/Hook-Falcon.md} | 48 +- .../Hook/Hook-HBase.md} | 72 +- .../Hook/Hook-Hive.md} | 114 +- docs/src/documents/Hook/Hook-Kafka.md | 50 + .../Hook/Hook-Sqoop.md} | 60 +- .../Hook/Hook-Storm.md} | 53 +- .../Import-Export/Export-API.md} | 98 +- .../Import-Export/Export-HDFS-API.md | 52 + .../Import-Export}/ExportImportAudits.md | 38 +- .../Import-Export/Import-API-Options.md} | 102 +- .../Import-Export/Import-API.md} | 94 +- .../Import-Export/Import-Export-API.md | 56 + .../Import-Export}/ImportEntityTransforms.md | 67 +- .../Import-Export}/Incremental-Export.md | 19 +- .../index.twiki => documents/Introduction.md} | 71 +- .../Migration/Migration-0.8-to-1.0.md} | 99 +- .../Misc}/AtlasServer.md | 70 +- .../Misc/ReplicatedAttributes.md} | 7 +- docs/src/documents/Misc/SoftReference.md | 40 + docs/src/documents/Notifications.md | 87 + .../documents/Project-Info/Mailing-Lists.md | 18 + .../documents/Project-Info/issue-tracking.md | 23 + .../documents/Project-Info/project-info.md | 22 + .../documents/Project-Info/project-license.md | 279 + .../Project-Info/source-repository.md | 33 + docs/src/documents/Project-Info/team-list.md | 19 + docs/src/documents/RestAPI.md | 13 + .../Search/Search-Advanced.md} | 334 +- .../Search/Search-Basic.md} | 98 +- .../Security/AtlasRangerAuthorizer.md | 83 + .../Security/AtlasSimpleAuthorizer.md} | 63 +- docs/src/documents/Security/Authentication.md | 155 + .../Security/AuthorizationModel.md} | 73 +- docs/src/documents/Security/security.md | 278 + docs/src/documents/Setup/BuildInstruction.md | 81 + .../Setup/Configuration.md} | 187 +- .../Setup/EclipseSetup.md} | 63 +- .../Setup/InstallationInstruction.md | 327 + .../Setup/QuickStart.md} | 26 +- docs/src/documents/Tools/AtlasRepairIndex.md | 78 + .../TypeSystem.md} | 122 +- .../Whats-New}/WhatsNew-1.0.md | 33 +- .../Whats-New}/WhatsNew-2.0.md | 49 +- .../images/accessories-text-editor.png | Bin .../images/application-certificate.png | Bin docs/src/resources/images/atlas-logo-grey.png | Bin 0 -> 4935 bytes .../resources/images/atlas-logo.png | Bin .../resources/images/column_lineage_ex1.png | Bin .../resources/images/contact-new.png | Bin .../resources/images/document-properties.png | Bin .../resources/images/drive-harddisk.png | Bin .../resources/images/image-x-generic.png | Bin .../resources/images/internet-web-browser.png | Bin .../resources/images/logos/maven-feather.png | Bin .../markdown/atlas-server-exp-imp-audits.png | Bin .../markdown/atlas-server-properties.png | Bin .../images/markdown/category_add_term.png | Bin .../images/markdown/category_add_term_1.png | Bin .../images/markdown/category_add_term_2.png | Bin .../markdown/category_details_with_terms.png | Bin .../images/markdown/category_view_1.png | Bin .../images/markdown/category_view_2.png | Bin .../category_view_category_context.png | Bin .../category_view_category_context_1.png | Bin .../category_view_glossary_context.png | Bin .../images/markdown/entity_add_term_modal.png | Bin .../entity_assigned_term_with_tag.png | Bin .../markdown/entity_details_add_term.png | Bin .../markdown/entity_search_add_term.png | Bin .../images/markdown/term_add_category.png | Bin .../markdown/term_add_classification_1.png | Bin .../markdown/term_add_classification_2.png | Bin .../images/markdown/term_delete_context.png | Bin .../images/markdown/term_details.png | Bin .../term_details_with_classification.png | Bin .../images/markdown/term_related_term_1.png | Bin .../resources/images/markdown/term_search.png | Bin .../images/markdown/term_view_context.png | Bin .../markdown/term_with_classification.png | Bin .../images/markdown/terms_related_terms.png | Bin .../resources/images/markdown/terms_view.png | Bin .../resources/images/network-server.png | Bin .../resources/images/package-x-generic.png | Bin .../resources/images/twiki/architecture.png | Bin .../twiki/classification-propagation-1.png | Bin .../twiki/classification-propagation-2.png | Bin .../twiki/classification-propagation-3.png | Bin .../twiki/classification-propagation-4.png | Bin .../twiki/classification-propagation-5.png | Bin .../twiki/classification-propagation-6.png | Bin .../twiki/classification-propagation-7.png | Bin .../twiki/classification-propagation-8.png | Bin ...sification-propagation-entity-delete-1.png | Bin ...sification-propagation-entity-delete-2.png | Bin ...sification-propagation-entity-delete-3.png | Bin ...sification-propagation-entity-delete-4.png | Bin .../images/twiki/guide-class-diagram.png | Bin .../images/twiki/guide-instance-graph.png | Bin .../resources/images/twiki/ranger-audit.png | Bin .../images/twiki/ranger-policy-admin.png | Bin .../images/twiki/ranger-policy-entities.png | Bin .../images/twiki/ranger-policy-types.png | Bin .../twiki/search-basic-hive_column-PII.png | Bin ...basic-hive_table-customers-or-provider.png | Bin ...sic-hive_table-customers-owner_is_hive.png | Bin .../search-basic-hive_table-customers.png | Bin .../resources/images/window-new.png | Bin docs/src/site/markdown/AtlasRepairIndex.md | 59 - docs/src/site/markdown/SoftReference.md | 31 - docs/src/site/site.xml | 119 - .../src/site/twiki/Atlas-Authentication.twiki | 141 - ...tlas-Authorization-Ranger-Authorizer.twiki | 63 - docs/src/site/twiki/Bridge-Kafka.twiki | 37 - .../twiki/ClassificationPropagation.twiki | 108 - docs/src/site/twiki/Downloads.twiki | 226 - docs/src/site/twiki/Export-HDFS-API.twiki | 81 - docs/src/site/twiki/Import-Export-API.twiki | 43 - docs/src/site/twiki/InstallationSteps.twiki | 348 - docs/src/site/twiki/LICENSE.txt | 3 - docs/src/site/twiki/Notifications.twiki | 73 - docs/src/site/twiki/security.twiki | 263 - .../shared/Header/GithubLink/index.js | 64 + .../shared/Header/HeaderDropDown/Basic.js | 69 + .../shared/Header/HeaderDropDown/index.js | 46 + docs/theme/components/shared/Header/index.js | 46 + docs/theme/components/shared/Img/index.js | 37 + .../components/shared/LegalFooter/index.js | 89 + docs/theme/components/shared/Logo/index.js | 96 + docs/theme/components/shared/Main/index.js | 23 + docs/theme/components/shared/Search/index.js | 71 + docs/theme/components/shared/Sidebar/Docz.js | 27 + .../components/shared/Sidebar/Hamburger.js | 135 + docs/theme/components/shared/Sidebar/Menu.js | 127 + .../components/shared/Sidebar/MenuHeadings.js | 51 + .../components/shared/Sidebar/MenuLink.js | 191 + .../components/shared/Sidebar/SmallLink.js | 90 + .../components/shared/Sidebar/SubMenu.js | 137 + docs/theme/components/shared/Sidebar/index.js | 478 + .../theme/components/shared/TeamList/index.js | 140 + .../components/shared/common/CustomLink.js | 30 + docs/theme/components/shared/index.js | 21 + docs/theme/components/ui/Blockquote.js | 32 + docs/theme/components/ui/Button.js | 31 + docs/theme/components/ui/CodeMirror/index.js | 150 + .../components/ui/CodeMirror/ps-scrollbar.js | 115 + .../components/ui/CodeMirror/themes/dark.js | 151 + .../components/ui/CodeMirror/themes/index.js | 20 + .../components/ui/CodeMirror/themes/light.js | 125 + docs/theme/components/ui/InlineCode.js | 26 + docs/theme/components/ui/Link.js | 70 + docs/theme/components/ui/Loading.js | 108 + docs/theme/components/ui/NotFound.js | 58 + docs/theme/components/ui/OrderedList.js | 39 + docs/theme/components/ui/Page.js | 106 + docs/theme/components/ui/Paragraph.js | 25 + docs/theme/components/ui/Pre.js | 25 + docs/theme/components/ui/Props/PropsRaw.js | 116 + docs/theme/components/ui/Props/PropsTable.js | 157 + docs/theme/components/ui/Props/index.js | 90 + docs/theme/components/ui/Table.js | 111 + docs/theme/components/ui/UnorderedList.js | 38 + docs/theme/components/ui/index.js | 45 + docs/theme/config.js | 31 + docs/theme/index.js | 55 + docs/theme/styles/colors.js | 34 + docs/theme/styles/fonts.js | 32 + docs/theme/styles/global.js | 47 + docs/theme/styles/index.js | 105 + docs/theme/styles/modes.js | 73 + docs/theme/styles/responsive.js | 32 + docs/theme/styles/styled-colors.js | 23 + docs/theme/utils/hotkeys.js | 30 + docs/theme/utils/storage.js | 80 + docs/theme/utils/theme.js | 35 + docs/theme/utils/utils.js | 33 + pom.xml | 5 + 260 files changed, 26042 insertions(+), 2703 deletions(-) create mode 100644 docs/.gitignore create mode 100644 docs/docz-lib/config/aliases.js create mode 100644 docs/docz-lib/config/menu.js create mode 100644 docs/docz-lib/config/versions.js create mode 100644 docs/docz-lib/docz-core/dist/bundler/build.d.ts create mode 100644 docs/docz-lib/docz-core/dist/bundler/config.d.ts create mode 100644 docs/docz-lib/docz-core/dist/bundler/devserver.d.ts create mode 100644 docs/docz-lib/docz-core/dist/bundler/index.d.ts create mode 100644 docs/docz-lib/docz-core/dist/bundler/loaders.d.ts create mode 100644 docs/docz-lib/docz-core/dist/bundler/minifier.d.ts create mode 100644 docs/docz-lib/docz-core/dist/bundler/plugins.d.ts create mode 100644 docs/docz-lib/docz-core/dist/bundler/server.d.ts create mode 100644 docs/docz-lib/docz-core/dist/cli.d.ts create mode 100644 docs/docz-lib/docz-core/dist/commands/build.d.ts create mode 100644 docs/docz-lib/docz-core/dist/commands/dev.d.ts create mode 100644 docs/docz-lib/docz-core/dist/commands/index.d.ts create mode 100644 docs/docz-lib/docz-core/dist/commands/serve.d.ts create mode 100644 docs/docz-lib/docz-core/dist/config/argv.d.ts create mode 100644 docs/docz-lib/docz-core/dist/config/babel.d.ts create mode 100644 docs/docz-lib/docz-core/dist/config/docz.d.ts create mode 100644 docs/docz-lib/docz-core/dist/config/env.d.ts create mode 100644 docs/docz-lib/docz-core/dist/config/paths.d.ts create mode 100644 docs/docz-lib/docz-core/dist/index.d.ts create mode 100644 docs/docz-lib/docz-core/dist/index.esm.js create mode 100644 docs/docz-lib/docz-core/dist/index.js create mode 100644 docs/docz-lib/docz-core/dist/lib/Bundler.d.ts create mode 100644 docs/docz-lib/docz-core/dist/lib/DataServer.d.ts create mode 100644 docs/docz-lib/docz-core/dist/lib/Entries.d.ts create mode 100644 docs/docz-lib/docz-core/dist/lib/Entry.d.ts create mode 100644 docs/docz-lib/docz-core/dist/lib/Plugin.d.ts create mode 100644 docs/docz-lib/docz-core/dist/lib/Socket.d.ts create mode 100644 docs/docz-lib/docz-core/dist/states/config.d.ts create mode 100644 docs/docz-lib/docz-core/dist/states/entries.d.ts create mode 100644 docs/docz-lib/docz-core/dist/states/index.d.ts create mode 100644 docs/docz-lib/docz-core/dist/states/props.d.ts create mode 100644 docs/docz-lib/docz-core/dist/templates/imports.tpl.js create mode 100644 docs/docz-lib/docz-core/dist/templates/index.tpl.html create mode 100644 docs/docz-lib/docz-core/dist/templates/index.tpl.js create mode 100644 docs/docz-lib/docz-core/dist/templates/root.tpl.js create mode 100644 docs/docz-lib/docz-core/dist/utils/docgen/index.d.ts create mode 100644 docs/docz-lib/docz-core/dist/utils/docgen/javascript.d.ts create mode 100644 docs/docz-lib/docz-core/dist/utils/docgen/typescript.d.ts create mode 100644 docs/docz-lib/docz-core/dist/utils/on-signal.d.ts create mode 100644 docs/docz-lib/docz-core/dist/utils/open-browser.d.ts create mode 100644 docs/docz-lib/docz-core/dist/utils/parse-html.d.ts create mode 100644 docs/docz-lib/docz-core/dist/utils/repo-info.d.ts create mode 100755 docs/docz-lib/docz/bin/index.js create mode 100644 docs/docz-lib/docz/dist/Playground.esm.js create mode 100644 docs/docz-lib/docz/dist/Playground.js create mode 100644 docs/docz-lib/docz/dist/chunk.esm.js create mode 100644 docs/docz-lib/docz/dist/chunk.js create mode 100644 docs/docz-lib/docz/dist/components/AsyncComponent.d.ts create mode 100644 docs/docz-lib/docz/dist/components/AsyncPlayground.d.ts create mode 100644 docs/docz-lib/docz/dist/components/AsyncRoute.d.ts create mode 100644 docs/docz-lib/docz/dist/components/Link.d.ts create mode 100644 docs/docz-lib/docz/dist/components/Playground.d.ts create mode 100644 docs/docz-lib/docz/dist/components/Props.d.ts create mode 100644 docs/docz-lib/docz/dist/components/Routes.d.ts create mode 100644 docs/docz-lib/docz/dist/hooks/index.d.ts create mode 100644 docs/docz-lib/docz/dist/hooks/useComponents.d.ts create mode 100644 docs/docz-lib/docz/dist/hooks/useConfig.d.ts create mode 100644 docs/docz-lib/docz/dist/hooks/useDataServer.d.ts create mode 100644 docs/docz-lib/docz/dist/hooks/useDocs.d.ts create mode 100644 docs/docz-lib/docz/dist/hooks/useMenus.d.ts create mode 100644 docs/docz-lib/docz/dist/hooks/usePrevious.d.ts create mode 100644 docs/docz-lib/docz/dist/hooks/useWindowSize.d.ts create mode 100644 docs/docz-lib/docz/dist/index.d.ts create mode 100644 docs/docz-lib/docz/dist/index.esm.js create mode 100644 docs/docz-lib/docz/dist/index.js create mode 100644 docs/docz-lib/docz/dist/state.d.ts create mode 100644 docs/docz-lib/docz/dist/theme.d.ts create mode 100644 docs/docz-lib/docz/dist/utils/createState.d.ts create mode 100644 docs/docz-lib/docz/dist/utils/helpers.d.ts create mode 100644 docs/docz-lib/docz/dist/utils/humanize-prop.d.ts create mode 100644 docs/doczrc.js create mode 100644 docs/package-lock.json create mode 100644 docs/package.json create mode 100644 docs/src/documents/Asf/asfinfo.md create mode 100644 docs/src/documents/ClassificationPropagation.md create mode 100644 docs/src/documents/Downloads/Downloads.md rename docs/src/{site/markdown => documents}/Glossary.md (74%) rename docs/src/{site/twiki/HighAvailability.twiki => documents/HighAvailability.md} (64%) rename docs/src/{site/twiki/Architecture.twiki => documents/HighLevelArchitecture.md} (71%) mode change 100755 => 100644 rename docs/src/{site/twiki/Hook-Falcon.twiki => documents/Hook/Hook-Falcon.md} (60%) rename docs/src/{site/twiki/Hook-HBase.twiki => documents/Hook/Hook-HBase.md} (66%) rename docs/src/{site/twiki/Hook-Hive.twiki => documents/Hook/Hook-Hive.md} (67%) create mode 100644 docs/src/documents/Hook/Hook-Kafka.md rename docs/src/{site/twiki/Hook-Sqoop.twiki => documents/Hook/Hook-Sqoop.md} (59%) rename docs/src/{site/twiki/Hook-Storm.twiki => documents/Hook/Hook-Storm.md} (79%) rename docs/src/{site/twiki/Export-API.twiki => documents/Import-Export/Export-API.md} (77%) create mode 100644 docs/src/documents/Import-Export/Export-HDFS-API.md rename docs/src/{site/markdown => documents/Import-Export}/ExportImportAudits.md (76%) rename docs/src/{site/twiki/Import-API-Options.twiki => documents/Import-Export/Import-API-Options.md} (72%) rename docs/src/{site/twiki/Import-API.twiki => documents/Import-Export/Import-API.md} (62%) create mode 100644 docs/src/documents/Import-Export/Import-Export-API.md rename docs/src/{site/markdown => documents/Import-Export}/ImportEntityTransforms.md (80%) rename docs/src/{site/markdown => documents/Import-Export}/Incremental-Export.md (77%) rename docs/src/{site/twiki/index.twiki => documents/Introduction.md} (57%) mode change 100755 => 100644 rename docs/src/{site/twiki/Migration-0.8-to-1.0.twiki => documents/Migration/Migration-0.8-to-1.0.md} (67%) rename docs/src/{site/markdown => documents/Misc}/AtlasServer.md (72%) rename docs/src/{site/markdown/ReplicatedToFromAttributes.md => documents/Misc/ReplicatedAttributes.md} (77%) create mode 100644 docs/src/documents/Misc/SoftReference.md create mode 100644 docs/src/documents/Notifications.md create mode 100644 docs/src/documents/Project-Info/Mailing-Lists.md create mode 100644 docs/src/documents/Project-Info/issue-tracking.md create mode 100644 docs/src/documents/Project-Info/project-info.md create mode 100644 docs/src/documents/Project-Info/project-license.md create mode 100644 docs/src/documents/Project-Info/source-repository.md create mode 100644 docs/src/documents/Project-Info/team-list.md create mode 100644 docs/src/documents/RestAPI.md rename docs/src/{site/twiki/Search-Advanced.twiki => documents/Search/Search-Advanced.md} (62%) rename docs/src/{site/twiki/Search-Basic.twiki => documents/Search/Search-Basic.md} (62%) create mode 100644 docs/src/documents/Security/AtlasRangerAuthorizer.md rename docs/src/{site/twiki/Atlas-Authorization-Simple-Authorizer.twiki => documents/Security/AtlasSimpleAuthorizer.md} (75%) create mode 100644 docs/src/documents/Security/Authentication.md rename docs/src/{site/twiki/Atlas-Authorization-Model.twiki => documents/Security/AuthorizationModel.md} (65%) create mode 100644 docs/src/documents/Security/security.md create mode 100644 docs/src/documents/Setup/BuildInstruction.md rename docs/src/{site/twiki/Configuration.twiki => documents/Setup/Configuration.md} (62%) rename docs/src/{site/twiki/EclipseSetup.twiki => documents/Setup/EclipseSetup.md} (73%) create mode 100644 docs/src/documents/Setup/InstallationInstruction.md rename docs/src/{site/twiki/QuickStart.twiki => documents/Setup/QuickStart.md} (52%) create mode 100644 docs/src/documents/Tools/AtlasRepairIndex.md rename docs/src/{site/twiki/TypeSystem.twiki => documents/TypeSystem.md} (72%) mode change 100755 => 100644 rename docs/src/{site/markdown => documents/Whats-New}/WhatsNew-1.0.md (73%) rename docs/src/{site/markdown => documents/Whats-New}/WhatsNew-2.0.md (51%) rename docs/src/{site => }/resources/images/accessories-text-editor.png (100%) rename docs/src/{site => }/resources/images/application-certificate.png (100%) create mode 100644 docs/src/resources/images/atlas-logo-grey.png rename docs/src/{site => }/resources/images/atlas-logo.png (100%) rename docs/src/{site => }/resources/images/column_lineage_ex1.png (100%) rename docs/src/{site => }/resources/images/contact-new.png (100%) rename docs/src/{site => }/resources/images/document-properties.png (100%) rename docs/src/{site => }/resources/images/drive-harddisk.png (100%) rename docs/src/{site => }/resources/images/image-x-generic.png (100%) rename docs/src/{site => }/resources/images/internet-web-browser.png (100%) rename docs/src/{site => }/resources/images/logos/maven-feather.png (100%) rename docs/src/{site => }/resources/images/markdown/atlas-server-exp-imp-audits.png (100%) rename docs/src/{site => }/resources/images/markdown/atlas-server-properties.png (100%) rename docs/src/{site => }/resources/images/markdown/category_add_term.png (100%) rename docs/src/{site => }/resources/images/markdown/category_add_term_1.png (100%) rename docs/src/{site => }/resources/images/markdown/category_add_term_2.png (100%) rename docs/src/{site => }/resources/images/markdown/category_details_with_terms.png (100%) rename docs/src/{site => }/resources/images/markdown/category_view_1.png (100%) rename docs/src/{site => }/resources/images/markdown/category_view_2.png (100%) rename docs/src/{site => }/resources/images/markdown/category_view_category_context.png (100%) rename docs/src/{site => }/resources/images/markdown/category_view_category_context_1.png (100%) rename docs/src/{site => }/resources/images/markdown/category_view_glossary_context.png (100%) rename docs/src/{site => }/resources/images/markdown/entity_add_term_modal.png (100%) rename docs/src/{site => }/resources/images/markdown/entity_assigned_term_with_tag.png (100%) rename docs/src/{site => }/resources/images/markdown/entity_details_add_term.png (100%) rename docs/src/{site => }/resources/images/markdown/entity_search_add_term.png (100%) rename docs/src/{site => }/resources/images/markdown/term_add_category.png (100%) rename docs/src/{site => }/resources/images/markdown/term_add_classification_1.png (100%) rename docs/src/{site => }/resources/images/markdown/term_add_classification_2.png (100%) rename docs/src/{site => }/resources/images/markdown/term_delete_context.png (100%) rename docs/src/{site => }/resources/images/markdown/term_details.png (100%) rename docs/src/{site => }/resources/images/markdown/term_details_with_classification.png (100%) rename docs/src/{site => }/resources/images/markdown/term_related_term_1.png (100%) rename docs/src/{site => }/resources/images/markdown/term_search.png (100%) rename docs/src/{site => }/resources/images/markdown/term_view_context.png (100%) rename docs/src/{site => }/resources/images/markdown/term_with_classification.png (100%) rename docs/src/{site => }/resources/images/markdown/terms_related_terms.png (100%) rename docs/src/{site => }/resources/images/markdown/terms_view.png (100%) rename docs/src/{site => }/resources/images/network-server.png (100%) rename docs/src/{site => }/resources/images/package-x-generic.png (100%) rename docs/src/{site => }/resources/images/twiki/architecture.png (100%) rename docs/src/{site => }/resources/images/twiki/classification-propagation-1.png (100%) rename docs/src/{site => }/resources/images/twiki/classification-propagation-2.png (100%) rename docs/src/{site => }/resources/images/twiki/classification-propagation-3.png (100%) rename docs/src/{site => }/resources/images/twiki/classification-propagation-4.png (100%) rename docs/src/{site => }/resources/images/twiki/classification-propagation-5.png (100%) rename docs/src/{site => }/resources/images/twiki/classification-propagation-6.png (100%) rename docs/src/{site => }/resources/images/twiki/classification-propagation-7.png (100%) rename docs/src/{site => }/resources/images/twiki/classification-propagation-8.png (100%) rename docs/src/{site => }/resources/images/twiki/classification-propagation-entity-delete-1.png (100%) rename docs/src/{site => }/resources/images/twiki/classification-propagation-entity-delete-2.png (100%) rename docs/src/{site => }/resources/images/twiki/classification-propagation-entity-delete-3.png (100%) rename docs/src/{site => }/resources/images/twiki/classification-propagation-entity-delete-4.png (100%) rename docs/src/{site => }/resources/images/twiki/guide-class-diagram.png (100%) rename docs/src/{site => }/resources/images/twiki/guide-instance-graph.png (100%) rename docs/src/{site => }/resources/images/twiki/ranger-audit.png (100%) rename docs/src/{site => }/resources/images/twiki/ranger-policy-admin.png (100%) rename docs/src/{site => }/resources/images/twiki/ranger-policy-entities.png (100%) rename docs/src/{site => }/resources/images/twiki/ranger-policy-types.png (100%) rename docs/src/{site => }/resources/images/twiki/search-basic-hive_column-PII.png (100%) rename docs/src/{site => }/resources/images/twiki/search-basic-hive_table-customers-or-provider.png (100%) rename docs/src/{site => }/resources/images/twiki/search-basic-hive_table-customers-owner_is_hive.png (100%) rename docs/src/{site => }/resources/images/twiki/search-basic-hive_table-customers.png (100%) rename docs/src/{site => }/resources/images/window-new.png (100%) delete mode 100644 docs/src/site/markdown/AtlasRepairIndex.md delete mode 100644 docs/src/site/markdown/SoftReference.md delete mode 100755 docs/src/site/site.xml delete mode 100644 docs/src/site/twiki/Atlas-Authentication.twiki delete mode 100644 docs/src/site/twiki/Atlas-Authorization-Ranger-Authorizer.twiki delete mode 100644 docs/src/site/twiki/Bridge-Kafka.twiki delete mode 100755 docs/src/site/twiki/ClassificationPropagation.twiki delete mode 100755 docs/src/site/twiki/Downloads.twiki delete mode 100644 docs/src/site/twiki/Export-HDFS-API.twiki delete mode 100644 docs/src/site/twiki/Import-Export-API.twiki delete mode 100644 docs/src/site/twiki/InstallationSteps.twiki delete mode 100755 docs/src/site/twiki/LICENSE.txt delete mode 100644 docs/src/site/twiki/Notifications.twiki delete mode 100755 docs/src/site/twiki/security.twiki create mode 100644 docs/theme/components/shared/Header/GithubLink/index.js create mode 100644 docs/theme/components/shared/Header/HeaderDropDown/Basic.js create mode 100644 docs/theme/components/shared/Header/HeaderDropDown/index.js create mode 100644 docs/theme/components/shared/Header/index.js create mode 100644 docs/theme/components/shared/Img/index.js create mode 100644 docs/theme/components/shared/LegalFooter/index.js create mode 100644 docs/theme/components/shared/Logo/index.js create mode 100644 docs/theme/components/shared/Main/index.js create mode 100644 docs/theme/components/shared/Search/index.js create mode 100644 docs/theme/components/shared/Sidebar/Docz.js create mode 100644 docs/theme/components/shared/Sidebar/Hamburger.js create mode 100644 docs/theme/components/shared/Sidebar/Menu.js create mode 100644 docs/theme/components/shared/Sidebar/MenuHeadings.js create mode 100644 docs/theme/components/shared/Sidebar/MenuLink.js create mode 100644 docs/theme/components/shared/Sidebar/SmallLink.js create mode 100644 docs/theme/components/shared/Sidebar/SubMenu.js create mode 100644 docs/theme/components/shared/Sidebar/index.js create mode 100644 docs/theme/components/shared/TeamList/index.js create mode 100644 docs/theme/components/shared/common/CustomLink.js create mode 100644 docs/theme/components/shared/index.js create mode 100644 docs/theme/components/ui/Blockquote.js create mode 100644 docs/theme/components/ui/Button.js create mode 100644 docs/theme/components/ui/CodeMirror/index.js create mode 100644 docs/theme/components/ui/CodeMirror/ps-scrollbar.js create mode 100755 docs/theme/components/ui/CodeMirror/themes/dark.js create mode 100755 docs/theme/components/ui/CodeMirror/themes/index.js create mode 100755 docs/theme/components/ui/CodeMirror/themes/light.js create mode 100644 docs/theme/components/ui/InlineCode.js create mode 100644 docs/theme/components/ui/Link.js create mode 100644 docs/theme/components/ui/Loading.js create mode 100644 docs/theme/components/ui/NotFound.js create mode 100644 docs/theme/components/ui/OrderedList.js create mode 100644 docs/theme/components/ui/Page.js create mode 100644 docs/theme/components/ui/Paragraph.js create mode 100644 docs/theme/components/ui/Pre.js create mode 100644 docs/theme/components/ui/Props/PropsRaw.js create mode 100644 docs/theme/components/ui/Props/PropsTable.js create mode 100644 docs/theme/components/ui/Props/index.js create mode 100644 docs/theme/components/ui/Table.js create mode 100644 docs/theme/components/ui/UnorderedList.js create mode 100644 docs/theme/components/ui/index.js create mode 100644 docs/theme/config.js create mode 100644 docs/theme/index.js create mode 100644 docs/theme/styles/colors.js create mode 100644 docs/theme/styles/fonts.js create mode 100644 docs/theme/styles/global.js create mode 100644 docs/theme/styles/index.js create mode 100644 docs/theme/styles/modes.js create mode 100644 docs/theme/styles/responsive.js create mode 100644 docs/theme/styles/styled-colors.js create mode 100644 docs/theme/utils/hotkeys.js create mode 100644 docs/theme/utils/storage.js create mode 100644 docs/theme/utils/theme.js create mode 100644 docs/theme/utils/utils.js diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 000000000..9cd933fbf --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,24 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +.DS_Store +.bower-*/ +.idea/ +node_modules/ +.docz +target/ +*.log +*.tgz diff --git a/docs/docz-lib/config/aliases.js b/docs/docz-lib/config/aliases.js new file mode 100644 index 000000000..e7e49eb75 --- /dev/null +++ b/docs/docz-lib/config/aliases.js @@ -0,0 +1,3 @@ +export default { + '~docz-theme-component': '../node_modules/theme/dist/components/ui/index.ts' +} \ No newline at end of file diff --git a/docs/docz-lib/config/menu.js b/docs/docz-lib/config/menu.js new file mode 100644 index 000000000..13fe4a021 --- /dev/null +++ b/docs/docz-lib/config/menu.js @@ -0,0 +1,103 @@ +export default [ + "Introduction", + { + name: "Documentation", + menu: [ + { + name: "Features", + menu: [ + "High Level Architecture", + "Type System", + "Glossary", + "Classification Propagation", + "Notifications", + "High Availability" + ] + }, + { + name: "Search", + menu: [ + "Basic Search", + "Advance Search" + ] + }, + { + name: "Hooks", + menu: [ + "HBase", + "Hive", + "Sqoop", + "Storm", + "Kafka", + "Falcon" + ] + }, + { + name: "Import/Export", + menu: [ + "Import API", + "Import API Options", + "Import Entity Transforms", + "Import Export API", + "Export API", + "Export HDFS API", + "Export Import Audits", + "Incremental Export" + ] + }, + { + name: "Security", + menu: [ + "Security Details", + "Authentication", + "Authorization Model", + "Atlas Simple Authorizer", + "Atlas Ranger Authorizer" + ] + }, + { + name: "Setup", + menu: [ + "Quick Start", + "Configuration", + "Build Instruction", + "Installation Instruction" + ] + }, + "REST API", + { + name: "Tools", + menu: [ + "Atlas Repair Index" + ] + }, + { + name: "Misc", + menu: [ + "Atlas Server", + "Replicated Attributes", + "Soft Reference" + ] + } + ] + }, { + name: "Downloads", + menu: [ + "Download", + { + name: "Whats New", + menu: ["WhatsNew-2.0", "WhatsNew-1.0"] + }, + "Migration" + ] + } ,"For Developers", + { + name: "Project Info", menu: [ + "Project Information", + "Mailing Lists", + "Team List", + "Issue Tracking", + "License", + "Source Repository" + ] + }, "ASF" ]; diff --git a/docs/docz-lib/config/versions.js b/docs/docz-lib/config/versions.js new file mode 100644 index 000000000..6c8628320 --- /dev/null +++ b/docs/docz-lib/config/versions.js @@ -0,0 +1,39 @@ +export default [ + { id: 1, href: "/Doc-test/", title: "Latest", label: "Latest" }, + { id: 2, href: "/2.0.0/index.html", title: "2.0.0", label: "2.0.0" }, + { id: 4, href: "/1.1.0/index.html", title: "1.1.0", label: "1.1.0" }, + { id: 5, href: "/1.0.0/index.html", title: "1.0.0", label: "1.0.0" }, + { id: 7, href: "/0.8.3/index.html", title: "0.8.3", label: "0.8.3" }, + { id: 8, href: "/0.8.2/index.html", title: "0.8.2", label: "0.8.2" }, + { id: 9, href: "/0.8.1/index.html", title: "0.8.1", label: "0.8.1" }, + { + id: 10, + href: "/0.8.0-incubating/index.html", + title: "0.8-incubating", + label: "0.8-incubating" + }, + { + id: 11, + href: "/0.7.1-incubating/index.html", + title: "0.7.1-incubating", + label: "0.7.1-incubating" + }, + { + id: 12, + href: "/0.7.0-incubating/index.html", + title: "0.7-incubating", + label: "0.7-incubating" + }, + { + id: 13, + href: "/0.6.0-incubating/index.html", + title: "0.6-incubating", + label: "0.6-incubating" + }, + { + id: 14, + href: "/0.5.0-incubating/index.html", + title: "0.5-incubating", + label: "0.5-incubating" + } +]; diff --git a/docs/docz-lib/docz-core/dist/bundler/build.d.ts b/docs/docz-lib/docz-core/dist/bundler/build.d.ts new file mode 100644 index 000000000..2d42a3b0b --- /dev/null +++ b/docs/docz-lib/docz-core/dist/bundler/build.d.ts @@ -0,0 +1,2 @@ +import webpack from 'webpack'; +export declare const build: (config: webpack.Configuration, dist: string, publicDir: string) => Promise; diff --git a/docs/docz-lib/docz-core/dist/bundler/config.d.ts b/docs/docz-lib/docz-core/dist/bundler/config.d.ts new file mode 100644 index 000000000..d5f23072c --- /dev/null +++ b/docs/docz-lib/docz-core/dist/bundler/config.d.ts @@ -0,0 +1,4 @@ +import { Configuration } from 'webpack'; +import { ServerHooks as Hooks } from '../lib/Bundler'; +import { Config as Args, Env } from '../config/argv'; +export declare const createConfig: (args: Args, env: Env) => (hooks: Hooks) => Promise; diff --git a/docs/docz-lib/docz-core/dist/bundler/devserver.d.ts b/docs/docz-lib/docz-core/dist/bundler/devserver.d.ts new file mode 100644 index 000000000..eccf7944f --- /dev/null +++ b/docs/docz-lib/docz-core/dist/bundler/devserver.d.ts @@ -0,0 +1,25 @@ +import { Config as Args } from '../config/argv'; +import { ServerHooks } from '../lib/Bundler'; +export declare const devServerConfig: (hooks: ServerHooks, args: Args) => { + publicPath: string; + compress: boolean; + logLevel: string; + clientLogLevel: string; + contentBase: string[]; + watchContentBase: boolean; + hot: boolean; + quiet: boolean; + open: boolean; + watchOptions: { + ignored: any; + }; + overlay: boolean; + host: string; + port: number; + historyApiFallback: { + disableDotRule: boolean; + }; + disableHostCheck: boolean; + before(app: any, server: any): void; + after(app: any): void; +}; diff --git a/docs/docz-lib/docz-core/dist/bundler/index.d.ts b/docs/docz-lib/docz-core/dist/bundler/index.d.ts new file mode 100644 index 000000000..243ebecfd --- /dev/null +++ b/docs/docz-lib/docz-core/dist/bundler/index.d.ts @@ -0,0 +1,4 @@ +import { Configuration as CFG } from 'webpack'; +import { Bundler } from '../lib/Bundler'; +import { Config as Args, Env } from '../config/argv'; +export declare const bundler: (args: Args, env: Env) => Bundler; diff --git a/docs/docz-lib/docz-core/dist/bundler/loaders.d.ts b/docs/docz-lib/docz-core/dist/bundler/loaders.d.ts new file mode 100644 index 000000000..d8c5bce32 --- /dev/null +++ b/docs/docz-lib/docz-core/dist/bundler/loaders.d.ts @@ -0,0 +1,17 @@ +import Config from 'webpack-chain'; +import { Config as Args } from '../config/argv'; +import { BabelRC } from '../config/babel'; +export declare const sourceMaps: (config: Config, args: Args) => void; +export interface AddScriptLoaderOpts { + threadLoader?: boolean; + rule: Config.Rule; + babelrc: BabelRC; + args: Args; +} +export declare const js: (config: Config, args: Args, babelrc: BabelRC) => void; +export declare const ts: (config: Config, args: Args, babelrc: BabelRC) => void; +export declare const mdx: (config: Config, args: Args, babelrc: BabelRC) => void; +export declare const images: (config: Config) => void; +export declare const svg: (config: Config) => void; +export declare const media: (config: Config) => void; +export declare const fonts: (config: Config) => void; diff --git a/docs/docz-lib/docz-core/dist/bundler/minifier.d.ts b/docs/docz-lib/docz-core/dist/bundler/minifier.d.ts new file mode 100644 index 000000000..3cbf01004 --- /dev/null +++ b/docs/docz-lib/docz-core/dist/bundler/minifier.d.ts @@ -0,0 +1,3 @@ +import Config from 'webpack-chain'; +import { Config as Args } from '../config/argv'; +export declare const minifier: (config: Config, args: Args) => void; diff --git a/docs/docz-lib/docz-core/dist/bundler/plugins.d.ts b/docs/docz-lib/docz-core/dist/bundler/plugins.d.ts new file mode 100644 index 000000000..f931cb8a7 --- /dev/null +++ b/docs/docz-lib/docz-core/dist/bundler/plugins.d.ts @@ -0,0 +1,11 @@ +import Config from 'webpack-chain'; +import { Config as Args, Env } from '../config/argv'; +export declare const assets: (config: Config, args: Args, env: Env) => void; +export declare const analyzer: (config: Config) => void; +export declare const injections: (config: Config, args: Args, env: Env) => void; +export declare const ignore: (config: Config) => void; +export declare const hot: (config: Config) => void; +export declare const html: (config: Config, args: Args, env: Env) => Promise; +export declare const webpackBar: (config: Config, args: Args) => void; +export declare const watchNodeModulesPlugin: (config: Config) => void; +export declare const notFoundPlugin: (config: Config) => void; diff --git a/docs/docz-lib/docz-core/dist/bundler/server.d.ts b/docs/docz-lib/docz-core/dist/bundler/server.d.ts new file mode 100644 index 000000000..3642ce2af --- /dev/null +++ b/docs/docz-lib/docz-core/dist/bundler/server.d.ts @@ -0,0 +1,6 @@ +import webpack from 'webpack'; +import { Config as Args } from '../config/argv'; +import { ServerHooks as Hooks } from '../lib/Bundler'; +export declare const server: (args: Args) => (config: webpack.Configuration, hooks: Hooks) => Promise<{ + start: () => Promise; +}>; diff --git a/docs/docz-lib/docz-core/dist/cli.d.ts b/docs/docz-lib/docz-core/dist/cli.d.ts new file mode 100644 index 000000000..2da5a6cbd --- /dev/null +++ b/docs/docz-lib/docz-core/dist/cli.d.ts @@ -0,0 +1,5 @@ +export declare const cli: () => { + [x: string]: unknown; + _: string[]; + $0: string; +}; diff --git a/docs/docz-lib/docz-core/dist/commands/build.d.ts b/docs/docz-lib/docz-core/dist/commands/build.d.ts new file mode 100644 index 000000000..60ed76bc3 --- /dev/null +++ b/docs/docz-lib/docz-core/dist/commands/build.d.ts @@ -0,0 +1 @@ +export declare const build: (args: any) => Promise; diff --git a/docs/docz-lib/docz-core/dist/commands/dev.d.ts b/docs/docz-lib/docz-core/dist/commands/dev.d.ts new file mode 100644 index 000000000..83c9fc62e --- /dev/null +++ b/docs/docz-lib/docz-core/dist/commands/dev.d.ts @@ -0,0 +1 @@ +export declare const dev: (args: any) => Promise; diff --git a/docs/docz-lib/docz-core/dist/commands/index.d.ts b/docs/docz-lib/docz-core/dist/commands/index.d.ts new file mode 100644 index 000000000..ed3e4e48c --- /dev/null +++ b/docs/docz-lib/docz-core/dist/commands/index.d.ts @@ -0,0 +1,3 @@ +export { dev } from './dev'; +export { build } from './build'; +export { serve } from './serve'; diff --git a/docs/docz-lib/docz-core/dist/commands/serve.d.ts b/docs/docz-lib/docz-core/dist/commands/serve.d.ts new file mode 100644 index 000000000..a5888713a --- /dev/null +++ b/docs/docz-lib/docz-core/dist/commands/serve.d.ts @@ -0,0 +1 @@ +export declare const serve: (args: any) => Promise; diff --git a/docs/docz-lib/docz-core/dist/config/argv.d.ts b/docs/docz-lib/docz-core/dist/config/argv.d.ts new file mode 100644 index 000000000..5cce01288 --- /dev/null +++ b/docs/docz-lib/docz-core/dist/config/argv.d.ts @@ -0,0 +1,128 @@ +import { Argv as Yargs } from 'yargs'; +import { Plugin } from '../lib/Plugin'; +import { BabelRC } from '../config/babel'; +export declare type Env = 'production' | 'development'; +export declare type ThemeConfig = Record; +export interface DocgenConfig { + handlers?: any[]; + resolver?: (ast: any, recast: any) => any; + propFilter?: (prop: any) => boolean; + searchPath: string; +} +export interface Menu { + name: string; + route?: string; + href?: string; + menu?: Menu[]; +} +export interface HtmlContext { + lang: string; + favicon?: string; + head?: { + meta: any[]; + links: any[]; + raw: string; + scripts: any[]; + }; + body?: { + raw: string; + scripts: any[]; + }; +} +export interface Argv { + base: string; + src: string; + files: string | string[]; + ignore: string[]; + watchIgnore: string; + public: string; + dest: string; + editBranch: string; + config: string; + debug: boolean; + clearConsole: boolean; + typescript: boolean; + propsParser: boolean; + host: string; + port: number; + websocketPort: number; + websocketHost: string; + native: boolean; + codeSandbox: boolean; + sourcemaps: boolean; + notUseSpecifiers: boolean; + title: string; + description: string; + theme: string; + wrapper?: string; + indexHtml?: string; + /** slugify separator */ + separator: string; +} +export interface Config extends Argv { + paths: Record; + plugins: Plugin[]; + mdPlugins: any[]; + hastPlugins: any[]; + menu: Menu[]; + htmlContext: HtmlContext; + themeConfig: ThemeConfig; + docgenConfig: DocgenConfig; + filterComponents: (files: string[]) => string[]; + modifyBundlerConfig(config: C, dev: boolean, args: Config): C; + modifyBabelRc(babelrc: BabelRC, args: Config): BabelRC; + onCreateWebpackChain(c: C, dev: boolean, args: Config): void; +} +export declare const setArgs: (yargs: Yargs<{}>) => Yargs<{ + base: any; +} & { + source: any; +} & { + files: any; +} & { + ignore: any; +} & { + public: any; +} & { + dest: any; +} & { + editBranch: any; +} & { + config: any; +} & { + title: any; +} & { + description: any; +} & { + theme: any; +} & { + typescript: any; +} & { + propsParser: any; +} & { + wrapper: any; +} & { + indexHtml: any; +} & { + debug: any; +} & { + clearConsole: any; +} & { + host: any; +} & { + port: any; +} & { + websocketHost: any; +} & { + websocketPort: any; +} & { + native: any; +} & { + codeSandbox: any; +} & { + sourcemaps: any; +} & { + separator: any; +} & { + open: boolean; +}>; diff --git a/docs/docz-lib/docz-core/dist/config/babel.d.ts b/docs/docz-lib/docz-core/dist/config/babel.d.ts new file mode 100644 index 000000000..09f2ba2f1 --- /dev/null +++ b/docs/docz-lib/docz-core/dist/config/babel.d.ts @@ -0,0 +1,8 @@ +import { Config, Env } from '../config/argv'; +export interface BabelRC { + presets: any[]; + plugins: any[]; + cacheDirectory?: boolean; + babelrc?: boolean; +} +export declare const getBabelConfig: (args: Config, env: Env, typescript?: boolean | undefined) => Promise; diff --git a/docs/docz-lib/docz-core/dist/config/docz.d.ts b/docs/docz-lib/docz-core/dist/config/docz.d.ts new file mode 100644 index 000000000..5ea09e018 --- /dev/null +++ b/docs/docz-lib/docz-core/dist/config/docz.d.ts @@ -0,0 +1,22 @@ +import { Arguments } from 'yargs'; +import { BabelRC } from '../config/babel'; +import { Config, Argv } from '../config/argv'; +export declare const doczRcBaseConfig: { + htmlContext: { + lang: string; + favicon: string; + }; + themeConfig: {}; + docgenConfig: {}; + filterComponents: (files: string[]) => string[]; + modifyBundlerConfig: (config: any) => any; + modifyBabelRc: (babelrc: BabelRC) => BabelRC; + onCreateWebpackChain: () => null; + menu: never[]; + plugins: never[]; + mdPlugins: never[]; + hastPlugins: never[]; + ignore: string[]; +}; +export declare const getBaseConfig: (argv: Arguments, custom?: Partial | undefined) => Config; +export declare const parseConfig: (argv: Arguments, custom?: Partial | undefined) => Promise; diff --git a/docs/docz-lib/docz-core/dist/config/env.d.ts b/docs/docz-lib/docz-core/dist/config/env.d.ts new file mode 100644 index 000000000..fe5afd0ca --- /dev/null +++ b/docs/docz-lib/docz-core/dist/config/env.d.ts @@ -0,0 +1,10 @@ +export declare const setEnv: (env: string) => void; +export interface RT { + [key: string]: any; +} +export declare const getClientEnvironment: (publicUrl: string) => { + raw: RT; + stringified: { + 'process.env': {}; + }; +}; diff --git a/docs/docz-lib/docz-core/dist/config/paths.d.ts b/docs/docz-lib/docz-core/dist/config/paths.d.ts new file mode 100644 index 000000000..f393eec5a --- /dev/null +++ b/docs/docz-lib/docz-core/dist/config/paths.d.ts @@ -0,0 +1,43 @@ +export declare const ensureSlash: (filepath: any, needsSlash: boolean) => any; +export declare const root: string; +export declare const resolveApp: (to: string) => string; +export declare const resolveOwn: (to: string) => string; +export interface Paths { + root: string; + templates: string; + packageJson: string; + servedPath: (base: string) => string; + docz: string; + app: string; + cache: string; + appPublic: string; + appNodeModules: string; + appPackageJson: string; + appYarnLock: string; + ownNodeModules: string; + getDist: (dest: string) => string; + distPublic: (dest: string) => string; + importsJs: string; + rootJs: string; + indexJs: string; + indexHtml: string; + db: string; +} +export declare const templates: string; +export declare const packageJson: string; +export declare const servedPath: (base: string) => any; +export declare const docz: string; +export declare const app: string; +export declare const cache: string; +export declare const appPublic: string; +export declare const appNodeModules: string; +export declare const appPackageJson: string; +export declare const appYarnLock: string; +export declare const ownNodeModules: string; +export declare const getDist: (dest: string) => string; +export declare const distPublic: (dest: string) => string; +export declare const importsJs: string; +export declare const rootJs: string; +export declare const indexJs: string; +export declare const indexHtml: string; +export declare const db: string; diff --git a/docs/docz-lib/docz-core/dist/index.d.ts b/docs/docz-lib/docz-core/dist/index.d.ts new file mode 100644 index 000000000..61609dc07 --- /dev/null +++ b/docs/docz-lib/docz-core/dist/index.d.ts @@ -0,0 +1,14 @@ +/** cli exports */ +export { cli } from './cli'; +/** config exports */ +export { parseConfig, getBaseConfig } from './config/docz'; +export { Config, setArgs } from './config/argv'; +export { BabelRC } from './config/babel'; +/** states */ +import * as states from './states'; +export { states }; +/** lib exports */ +export { Plugin, createPlugin } from './lib/Plugin'; +export { DataServer } from './lib/DataServer'; +export { Entries } from './lib/Entries'; +export { Entry } from './lib/Entry'; diff --git a/docs/docz-lib/docz-core/dist/index.esm.js b/docs/docz-lib/docz-core/dist/index.esm.js new file mode 100644 index 000000000..1df333937 --- /dev/null +++ b/docs/docz-lib/docz-core/dist/index.esm.js @@ -0,0 +1,2008 @@ +import { command } from 'yargs'; +import _get from 'lodash/fp/get'; +import { readJsonSync, ensureDir, remove as remove$1, outputJSONSync, emptyDir, pathExists, copy, readFileSync, readJSONSync, pathExistsSync, existsSync as existsSync$1 } from 'fs-extra'; +import { get, set } from 'env-dot-prop'; +import humanize from 'humanize-string'; +import titleize from 'titleize'; +import { realpathSync, existsSync } from 'fs'; +import { join, resolve, delimiter, isAbsolute, relative, parse, extname, normalize, dirname } from 'path'; +import { sync } from 'resolve'; +import logger__default, { error, Signale, warn, fatal, log } from 'signale'; +import { __rest } from 'tslib'; +import { getParsedData, headingsFromAst, parseMdx } from 'docz-utils/lib/mdast'; +import { compiled, touch } from 'docz-utils/lib/fs'; +import glob from 'fast-glob'; +import { createHash } from 'crypto'; +import slugify from '@sindresorhus/slugify'; +import _isFunction from 'lodash/fp/isFunction'; +import pReduce from 'p-reduce'; +import getPkgRepo from 'get-pkg-repo'; +import findup from 'find-up'; +import WS from 'ws'; +import _merge from 'lodash/fp/merge'; +import _omit from 'lodash/fp/omit'; +import { loadFrom, load, finds } from 'load-cfg'; +import detectPort from 'detect-port'; +import Config from 'webpack-chain'; +import frontmatter from 'remark-frontmatter'; +import remarkDocz from 'remark-docz'; +import rehypeDocz from 'rehype-docz'; +import slug from 'rehype-slug'; +import webpack, { IgnorePlugin, HotModuleReplacementPlugin } from 'webpack'; +import webpackBarPlugin from 'webpackbar'; +import { minify } from 'html-minifier'; +import miniHtmlWebpack, { generateCSSReferences, generateJSReferences } from 'mini-html-webpack-plugin'; +import manifestPlugin from 'webpack-manifest-plugin'; +import watchMissingNodeModules from 'react-dev-utils/WatchMissingNodeModulesPlugin'; +import 'react-dev-utils/ModuleNotFoundPlugin'; +import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; +import { TemplateTag, replaceResultTransformer, trimResultTransformer, oneLineTrim, html as html$1 } from 'common-tags'; +import * as TerserPlugin from 'terser-webpack-plugin'; +import getCacheIdentifier from 'react-dev-utils/getCacheIdentifier'; +import WebpackDevServer from 'webpack-dev-server'; +import { prepareUrls, createCompiler } from 'react-dev-utils/WebpackDevServerUtils'; +import { static as static$1 } from 'express'; +import errorOverlayMiddleware from 'react-dev-utils/errorOverlayMiddleware'; +import evalSourceMapMiddleware from 'react-dev-utils/evalSourceMapMiddleware'; +import ignoredFiles from 'react-dev-utils/ignoredFiles'; +import chalk$1 from 'chalk'; +import chokidar from 'chokidar'; +import equal from 'fast-deep-equal'; +import get$1 from 'lodash/get'; +import _propEq from 'lodash/fp/propEq'; +import externalProptypesHandler from 'react-docgen-external-proptypes-handler'; +import actualNameHandler from 'react-docgen-actual-name-handler'; +import reactDocgen from 'react-docgen'; +import _entries from 'lodash/fp/entries'; +import _contains from 'lodash/fp/contains'; +import _prop from 'lodash/fp/prop'; +import _isEmpty from 'lodash/fp/isEmpty'; +import reactDocgenTs from 'react-docgen-typescript'; +import ts$1 from 'typescript'; +import spawn$1 from 'cross-spawn'; + +const ensureSlash = (filepath, needsSlash) => { + const hasSlash = filepath.endsWith('/'); + + if (hasSlash && !needsSlash) { + return filepath.substr(filepath, filepath.length - 1); + } else if (!hasSlash && needsSlash) { + return `${filepath}/`; + } else { + return filepath; + } +}; +const root = realpathSync(process.cwd()); +const resolveApp = to => resolve(root, to); +const resolveOwn = to => resolve(__dirname, '../', to); +const templates = join(sync('docz-core'), '../templates'); +const packageJson = resolveApp('package.json'); +const servedPath = base => ensureSlash(base, true); +const docz = resolveApp('.docz'); +const app = resolve(docz, 'app/'); +const cache = resolve(docz, 'cache/'); +const appPublic = resolve(docz, 'public/'); +const appNodeModules = resolveApp('node_modules'); +const appPackageJson = resolveApp('package.json'); +const appYarnLock = resolveOwn('yarn.lock'); +const ownNodeModules = resolveOwn('node_modules'); +const getDist = dest => join(root, dest); +const distPublic = dest => join(dest, 'public/'); +const importsJs = resolve(app, 'imports.js'); +const rootJs = resolve(app, 'root.jsx'); +const indexJs = resolve(app, 'index.jsx'); +const indexHtml = resolve(app, 'index.html'); +const db = resolve(app, 'db.json'); + +var paths = /*#__PURE__*/Object.freeze({ + ensureSlash: ensureSlash, + root: root, + resolveApp: resolveApp, + resolveOwn: resolveOwn, + templates: templates, + packageJson: packageJson, + servedPath: servedPath, + docz: docz, + app: app, + cache: cache, + appPublic: appPublic, + appNodeModules: appNodeModules, + appPackageJson: appPackageJson, + appYarnLock: appYarnLock, + ownNodeModules: ownNodeModules, + getDist: getDist, + distPublic: distPublic, + importsJs: importsJs, + rootJs: rootJs, + indexJs: indexJs, + indexHtml: indexHtml, + db: db +}); + +const getEnv = (val, defaultValue = null) => get(val, defaultValue, { + parse: true +}); + +const getInitialTitle = pkg => { + const name = _get('name', pkg) || 'MyDoc'; + return titleize(humanize(name.replace(/^@.*\//, ''))); +}; + +const getInitialDescription = pkg => _get('description', pkg) || 'My awesome app using docz'; + +const setArgs = yargs => { + const pkg = readJsonSync(appPackageJson, { + throws: false + }); + return yargs.option('base', { + type: 'string', + default: getEnv('docz.base', '/') + }).option('source', { + alias: 'src', + type: 'string', + default: getEnv('docz.source', './') + }).option('files', { + type: 'string', + default: getEnv('docz.files', '**/*.{md,markdown,mdx}') + }).option('ignore', { + type: 'array', + default: getEnv('docz.ignore', []) + }).option('public', { + type: 'string', + default: getEnv('docz.public', '/public') + }).option('dest', { + alias: 'd', + type: 'string', + default: getEnv('docz.dest', '.docz/dist') + }).option('editBranch', { + alias: 'eb', + type: 'string', + default: getEnv('docz.edit.branch', 'master') + }).option('config', { + type: 'string', + default: getEnv('docz.config', '') + }).option('title', { + type: 'string', + default: getEnv('docz.title', getInitialTitle(pkg)) + }).option('description', { + type: 'string', + default: getEnv('docz.description', getInitialDescription(pkg)) + }).option('theme', { + type: 'string', + default: getEnv('docz.theme', 'theme') + }).option('typescript', { + alias: 'ts', + type: 'boolean', + default: getEnv('docz.typescript', false) + }).option('propsParser', { + type: 'boolean', + default: getEnv('docz.props.parser', true) + }).option('wrapper', { + type: 'string', + default: getEnv('docz.wrapper', null) + }).option('indexHtml', { + type: 'string', + default: getEnv('docz.index.html', null) + }).option('debug', { + type: 'boolean', + default: getEnv('docz.debug', false) + }).option('clearConsole', { + type: 'boolean', + default: getEnv('docz.clear.console', true) + }).option('host', { + type: 'string', + default: getEnv('docz.host', '127.0.0.1') + }).option('port', { + alias: 'p', + type: 'number', + default: getEnv('docz.port', 3000) + }).option('websocketHost', { + type: 'string', + default: getEnv('docz.websocket.host', '127.0.0.1') + }).option('websocketPort', { + type: 'number', + default: getEnv('docz.websocket.port', 60505) + }).option('native', { + type: 'boolean', + default: getEnv('docz.native', false) + }).option('codeSandbox', { + type: 'boolean', + default: getEnv('docz.codeSandbox', true) + }).option('sourcemaps', { + type: 'boolean', + default: getEnv('docz.sourcemaps', true) + }).option('separator', { + type: 'string', + default: getEnv('docz.separator', '-') + }).option('open', { + alias: 'o', + describe: 'auto open browser in dev mode', + type: 'boolean', + default: false + }); +}; + +const populateNodePath = () => { + // We support resolving modules according to `NODE_PATH`. + // It works similar to `NODE_PATH` in Node itself: + // https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders + // Note that unlike in Node, only *relative* paths from `NODE_PATH` are honored. + // Otherwise, we risk importing Node.js core modules into an app instead of Webpack shims. + // https://github.com/facebook/create-react-app/issues/1023#issuecomment-265344421 + // We also resolve them to make sure all tools using them work consistently. + set('node.path', get('node.path', '').split(delimiter).filter(folder => folder && !isAbsolute(folder)).map(folder => resolve(root, folder)).join(delimiter)); +}; + +const configDotEnv = () => { + const NODE_ENV = get('node.env'); + const dotenv = resolveApp('.env'); + const dotenvFiles = [`${dotenv}.${NODE_ENV}.local`, `${dotenv}.${NODE_ENV}`, // Don't include `.env.local` for `test` environment + // since normally you expect tests to produce the same + // results for everyone + NODE_ENV !== 'test' && `${dotenv}.local`, dotenv]; // Load environment variables from .env* files. Suppress warnings using silent + // if this file is missing. dotenv will never modify any environment variables + // that have already been set. Variable expansion is supported in .env files. + // https://github.com/motdotla/dotenv + + dotenvFiles.filter(Boolean).forEach(dotenvFile => { + require('dotenv').config({ + path: dotenvFile + }); + }); +}; + +const setEnv = env => { + set('babel.env', env); + set('node.env', env); + configDotEnv(); + populateNodePath(); +}; +const getClientEnvironment = publicUrl => { + const APP_TEST = /^(REACT_APP_)|(ANGULAR_APP_)|(VUE_APP_)|(DOCZ_)/i; + const raw = Object.keys(process.env).filter(key => APP_TEST.test(key)).reduce((env, key) => { + env[key] = process.env[key]; + return env; + }, { + // Useful for determining whether we’re running in production mode. Most + // importantly, it switches React into the correct mode. + NODE_ENV: get('node.env') || 'development', + // Useful for resolving the correct path to static assets in `public`. For + // example, . This should + // only be used as an escape hatch. Normally you would put images into the `src` + // and `import` them in code to get their + PUBLIC_URL: publicUrl + }); + const stringified = { + 'process.env': Object.keys(raw).reduce((env, key) => { + env[key] = JSON.stringify(raw[key]); + return env; + }, {}) + }; + return { + raw, + stringified + }; +}; + +const createId = file => createHash('md5').update(file).digest('hex'); + +const mountRoute = (base, route) => { + if (base === '/') return route; + const baseHasSlash = base.endsWith('/'); + if (baseHasSlash) return base.substr(0, base.length - 1) + route; + return base + route; +}; + +class Entry { + constructor(ast, file, src, config) { + const filepath = this.getFilepath(file, src); + const parsed = getParsedData(ast); + const name = this.getName(filepath, parsed); + this.id = createId(file); + this.filepath = filepath; + this.link = ''; + this.slug = this.slugify(filepath, config.separator); + this.route = this.getRoute(parsed, config.base); + this.name = name; + this.menu = parsed.menu || ''; + this.headings = headingsFromAst(ast); + this.settings = parsed; + } + + setLink(url) { + if (url) { + this.link = url.replace('{{filepath}}', this.filepath); + } + } + + getFilepath(file, src) { + const srcPath = resolve(root, src); + const filepath = relative(srcPath, file); + + if (process.platform === 'win32') { + return filepath.split('\\').join('/'); + } + + return filepath; + } + + getName(filepath, parsed) { + const filename = humanize(parse(filepath).name); + return parsed && parsed.name ? parsed.name : filename; + } + + slugify(filepath, separator) { + const ext = extname(filepath); + const fileWithoutExt = filepath.replace(ext, ''); + return slugify(fileWithoutExt, { + separator + }); + } + + getRoute(parsed, base) { + const parsedRoute = _get('route', parsed); + + const route = parsedRoute || `/${this.slug}`; + return mountRoute(base, route); + } + +} + +class Plugin { + constructor(p) { + this.setConfig = p.setConfig; + this.modifyBundlerConfig = p.modifyBundlerConfig; + this.modifyBabelRc = p.modifyBabelRc; + this.modifyFiles = p.modifyFiles; + this.onPreCreateApp = p.onPreCreateApp; + this.onCreateWebpackChain = p.onCreateWebpackChain; + this.onCreateApp = p.onCreateApp; + this.onServerListening = p.onServerListening; + this.onPreBuild = p.onPreBuild; + this.onPostBuild = p.onPostBuild; + this.onPreRender = p.onPreRender; + this.onPostRender = p.onPostRender; + } + + static runPluginsMethod(plugins) { + return (method, ...args) => { + if (plugins && plugins.length > 0) { + for (const plugin of plugins) { + const fn = _get(method, plugin); + + _isFunction(fn) && fn(...args); + } + } + }; + } + + static propsOfPlugins(plugins) { + return prop => plugins && plugins.length > 0 ? plugins.map(p => _get(prop, p)).filter(Boolean) : []; + } + + static reduceFromPlugins(plugins) { + return (method, initial, ...args) => { + return [...(plugins || [])].reduce((obj, plugin) => { + const fn = _get(method, plugin); + + return fn && _isFunction(fn) ? fn(obj, ...args) : obj; + }, initial); + }; + } + + static reduceFromPluginsAsync(plugins) { + return (method, initial, ...args) => { + return pReduce([...(plugins || [])], (obj, plugin) => { + const fn = _get(method, plugin); + + return Promise.resolve(fn && _isFunction(fn) ? fn(obj, ...args) : obj); + }, initial); + }; + } + +} +function createPlugin(factory) { + return new Plugin(factory); +} + +const parseRepo = () => { + try { + const pkg = readJsonSync(appPackageJson); + return getPkgRepo(pkg); + } catch (err) { + return null; + } +}; +const getRepoUrl = () => { + const repo = parseRepo(); + return repo && (repo.browsetemplate && repo.browsetemplate.replace('{domain}', repo.domain).replace('{user}', repo.user).replace('{project}', repo.project).replace('{/tree/committish}', '') || repo.browse && repo.browse()); +}; + +const getBitBucketPath = (branch, relative) => { + const querystring = `?mode=edit&spa=0&at=${branch}&fileviewer=file-view-default`; + const filepath = join(`/src/${branch}`, relative, `{{filepath}}`); + return `${filepath}${querystring}`; +}; + +const getTree = (repo, branch, relative) => { + const defaultPath = join(`/edit/${branch}`, relative, `{{filepath}}`); + const bitBucketPath = getBitBucketPath(branch, relative); + if (repo && repo.type === 'bitbucket') return bitBucketPath; + return defaultPath; +}; + +const getRepoEditUrl = (src, branch) => { + try { + const repo = parseRepo(); + const project = parse(findup.sync('.git')).dir; + const root$1 = join(root, src); + const relative$1 = relative(project, root$1); + const tree = getTree(repo, branch, relative$1); + return repo && repo.browsetemplate && repo.browsetemplate.replace('{domain}', repo.domain).replace('{user}', repo.user).replace('{project}', repo.project).replace('{/tree/committish}', tree); + } catch (err) { + return null; + } +}; + +const fromTemplates = file => join(templates, file); + +const mapToObj = map => Array.from(map.entries()).reduce((obj, [key, value]) => Object.assign({}, obj, { + [`${key}`]: value +}), {}); + +const matchFilesWithSrc = config => files => { + const src = relative(root, config.src); + return files.map(file => file.startsWith(src) ? file : join(src, file)); +}; + +const writeAppFiles = async (config, dev) => { + const { + plugins, + theme + } = config; + const props = Plugin.propsOfPlugins(plugins); + const onPreRenders = props('onPreRender'); + const onPostRenders = props('onPostRender'); + const isProd = !dev; + const root = await compiled(fromTemplates('root.tpl.js'), { + minimize: false + }); + const js = await compiled(fromTemplates('index.tpl.js'), { + minimize: false + }); + const websocketUrl = `ws://${config.websocketHost}:${config.websocketPort}`; + const rawRootJs = root({ + theme, + isProd, + wrapper: config.wrapper, + websocketUrl + }); + const rawIndexJs = js({ + onPreRenders, + onPostRenders, + isProd + }); + await remove$1(rootJs); + await remove$1(indexJs); + await touch(rootJs, rawRootJs); + await touch(indexJs, rawIndexJs); +}; + +class Entries { + static async writeApp(config, dev) { + await ensureDir(app); + await writeAppFiles(config, dev); + } + + static async writeImports(map) { + const imports = await compiled(fromTemplates('imports.tpl.js')); + const rawImportsJs = imports({ + entries: Object.values(map) + }); + await touch(join(app, 'imports.js'), rawImportsJs); + } + + constructor(config) { + this.repoEditUrl = getRepoEditUrl(config.src, config.editBranch); + this.all = new Map(); + + this.get = async () => this.getMap(config); + } + + async getMap(config) { + const { + src, + files: pattern, + ignore, + plugins, + mdPlugins + } = config; + const arr = Array.isArray(pattern) ? pattern : [pattern]; + const toMatch = matchFilesWithSrc(config); + const files = await glob(toMatch(arr), { + ignore: ['**/node_modules/**'].concat(ignore), + onlyFiles: true, + unique: true, + nocase: true, + matchBase: true + }); + + const createEntry = async file => { + try { + const ast = await parseMdx(file, mdPlugins); + const entry = new Entry(ast, file, src, config); + if (this.repoEditUrl) entry.setLink(this.repoEditUrl); + + const { + settings + } = entry, + rest = __rest(entry, ["settings"]); + + return Object.assign({}, settings, rest); + } catch (err) { + error(err); + return null; + } + }; + + const reduce = Plugin.reduceFromPlugins(plugins); + const modifiedFiles = reduce('modifyFiles', files); + const map = new Map(); + const entries = await Promise.all(modifiedFiles.map(createEntry).filter(Boolean)); + + for (const entry of entries) { + if (entry) { + map.set(entry.filepath, entry); + } + } + + this.all = map; + return mapToObj(map); + } + +} + +class DataServer { + constructor() { + this.states = new Set(); + this.state = new Map(); + this.listeners = new Set(); + } + + register(states) { + for (const state of states) this.states.add(state); + + return this; + } + + async start() { + const setState = (key, val) => this.setState(key, val); + + const getState = () => this.getState(); + + await Promise.all(Array.from(this.states).map(async state => { + if (!_isFunction(state.start)) return; + return state.start({ + setState, + getState + }); + })); + } + + close() { + for (const state of this.states) { + _isFunction(state.close) && state.close(); + } + } + + onStateChange(listener) { + this.listeners.add(listener); + return () => this.listeners.clear(); + } + + getState() { + return this.mapToObject(this.state); + } + + setState(key, val) { + const prev = _get(key, this.getState()); + + const next = typeof val === 'function' ? val(prev) : val; + this.state.set(key, next); + this.writeDbFile(); + this.listeners.forEach(listener => { + listener({ + type: `state.${key}`, + payload: next + }); + }); + } + + async writeDbFile() { + outputJSONSync(db, this.mapToObject(this.state), { + spaces: 2 + }); + } + + mapToObject(map) { + return Array.from(map.entries()).reduce((obj, [key, val]) => Object.assign({}, obj, { + [key]: val + }), {}); + } + +} + +const onSignal = cb => { + const signals = ['SIGINT', 'SIGTERM']; + + for (const sig of signals) { + process.on(sig, async () => { + await cb(); + process.exit(); + }); + } +}; + +const isSocketOpened = socket => socket.readyState === WS.OPEN; + +const sender = socket => (type, payload) => { + if (socket && isSocketOpened(socket)) { + socket.send(JSON.stringify({ + type, + payload + })); + } +}; + +class Socket { + constructor(server, host, port) { + if (server) { + this.client = new WS.Server({ + server, + host, + port + }); + } + } + + onConnection(listener) { + if (!this.client) return; + this.client.on('connection', socket => { + const emit = sender(socket); + const subs = listener(socket, emit); + + const handleClose = async () => { + subs(); + socket.terminate(); + }; + + this.client.on('close', handleClose); + onSignal(handleClose); + }); + } + +} + +const toOmit = ['_', '$0', 'version', 'help']; +const htmlContext = { + lang: 'en', + favicon: 'https://cdn-std.dprcdn.net/files/acc_649651/LUKiMl' +}; +const doczRcBaseConfig = { + htmlContext, + themeConfig: {}, + docgenConfig: {}, + filterComponents: files => files.filter(filepath => /\/[A-Z]\w*\.(js|jsx|ts|tsx)$/.test(filepath)), + modifyBundlerConfig: config => config, + modifyBabelRc: babelrc => babelrc, + onCreateWebpackChain: () => null, + menu: [], + plugins: [], + mdPlugins: [], + hastPlugins: [], + ignore: ['**/readme.md', '**/changelog.md', '**/code_of_conduct.md', '**/contributing.md', '**/license.md'] +}; +const getBaseConfig = (argv, custom) => { + const initial = _omit(toOmit, argv); + + const base = Object.assign({}, initial, doczRcBaseConfig, { + paths + }); + return _merge(base, custom); +}; +const parseConfig = async (argv, custom) => { + const port = await detectPort(argv.port); + const websocketPort = await detectPort(argv.websocketPort); + const defaultConfig = getBaseConfig(argv, Object.assign({ + port, + websocketPort, + htmlContext + }, custom)); + const config = argv.config ? loadFrom(resolve(argv.config), defaultConfig) : load('docz', defaultConfig); + const reduceAsync = Plugin.reduceFromPluginsAsync(config.plugins); + return reduceAsync('setConfig', config); +}; + +class Bundler { + constructor(params) { + const { + args, + config, + server, + build + } = params; + const run = Plugin.runPluginsMethod(args.plugins); + this.args = args; + this.config = config; + this.server = server; + this.builder = build; + this.hooks = { + onCreateWebpackChain(config, dev, args) { + run('onCreateWebpackChain', config, dev, args); + }, + + onPreCreateApp(app) { + run('onPreCreateApp', app); + }, + + onCreateApp(app) { + run('onCreateApp', app); + }, + + onServerListening(server) { + run('onServerListening', server); + } + + }; + } + + async mountConfig(env) { + const { + plugins + } = this.args; + const isDev = env !== 'production'; + const reduce = Plugin.reduceFromPlugins(plugins); + const userConfig = await this.config(this.hooks); + const config = reduce('modifyBundlerConfig', userConfig, isDev, this.args); + return this.args.modifyBundlerConfig(config, isDev, this.args); + } + + async createApp(config) { + return this.server(config, this.hooks); + } + + async build(config) { + const dist = getDist(this.args.dest); + const publicDir = join(root, this.args.public); + + if (root === resolve(dist)) { + logger__default.fatal(new Error('Unexpected option: "dest" cannot be set to the current working directory.')); + process.exit(1); + } + + await this.builder(config, dist, publicDir); + } + +} + +const excludeNodeModules = filepath => /node_modules/.test(filepath) || /@babel(?:\/|\\{1,2})runtime/.test(filepath); + +const sourceMaps = (config, args) => { + const srcPath = resolve(root, args.src); + config.module.rule('sourcemaps').test(/\.(js|mjs|jsx|ts|tsx|md|mdx)$/).include.add(srcPath).add(app).end().exclude.add(excludeNodeModules).end().use('sourcemaps').loader(require.resolve('source-map-loader')).end().enforce('pre'); +}; + +const addScriptLoaders = opts => { + const { + rule, + threadLoader = true, + babelrc, + args + } = opts; + return rule.when(!args.debug, rule => rule.use('cache-loader').loader(require.resolve('cache-loader')).options({ + cacheDirectory: cache + })).when(Boolean(threadLoader), rule => rule.use('thread-loader').loader(require.resolve('thread-loader')).options({ + workers: require('os').cpus().length - 1 + })).use('babel-loader').loader(require.resolve('babel-loader')).options(babelrc).end(); +}; + +const js = (config, args, babelrc) => { + const srcPath = resolve(root, args.src); + const rule = config.module.rule('js').test(/\.(jsx?|mjs)$/).include.add(srcPath).add(app).end().exclude.add(excludeNodeModules).end(); + addScriptLoaders({ + rule, + babelrc, + args + }); +}; +const ts = (config, args, babelrc) => { + const srcPath = resolve(root, args.src); + const rule = config.module.rule('ts').test(/\.tsx?$/).include.add(srcPath).add(app).end().exclude.add(excludeNodeModules).end(); + addScriptLoaders({ + rule, + babelrc, + args + }); +}; +const mdx = (config, args, babelrc) => { + const { + mdPlugins, + hastPlugins + } = args; + const srcPath = resolve(root, args.src); + const rule = config.module.rule('mdx').test(/\.(md|markdown|mdx)$/).include.add(srcPath).add(root).add(app).end().exclude.add(excludeNodeModules).end(); + addScriptLoaders({ + rule, + babelrc, + args, + threadLoader: false + }).use('mdx-loader').loader(require.resolve('@mdx-js/loader')).options({ + remarkPlugins: mdPlugins.concat([[frontmatter, { + type: 'yaml', + marker: '-' + }], remarkDocz]), + rehypePlugins: hastPlugins.concat([[rehypeDocz, { + root: root, + useCodeSandbox: args.codeSandbox + }], slug]) + }); +}; +const INLINE_LIMIT = 10000; +const images = config => { + config.module.rule('images').test(/\.(png|jpe?g|gif)(\?.*)?$/).use('url-loader').loader(require.resolve('url-loader')).options({ + limit: INLINE_LIMIT, + name: `static/img/[name].[hash:8].[ext]` + }); +}; +const svg = config => { + config.module.rule('svg').test(/\.(svg)(\?.*)?$/).use('file-loader').loader(require.resolve('file-loader')).options({ + name: `static/img/[name].[hash:8].[ext]` + }); +}; +const media = config => { + config.module.rule('media').test(/\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/).use('url-loader').loader(require.resolve('url-loader')).options({ + limit: INLINE_LIMIT, + name: `static/media/[name].[hash:8].[ext]` + }); +}; +const fonts = config => { + config.module.rule('fonts').test(/\.(woff2?|eot|ttf|otf)(\?.*)?$/i).use('url-loader').loader(require.resolve('url-loader')).options({ + limit: INLINE_LIMIT, + name: `static/fonts/[name].[hash:8].[ext]` + }); +}; + +const wrapItems = item => Object.keys(item).map(key => `${key}="${item[key]}"`).join(' '); + +const generateTags = template => (items = []) => items.map(template).join(''); + +const generateMetaTags = generateTags(item => ``); +const generateLinkTags = generateTags(item => ``); +const generateScriptTags = generateTags(item => ``); + +const generateRawTags = (items = []) => { + if (typeof items === 'string' || items instanceof String) return items; + return items.map(item => item).join(''); +}; + +const getHtmlFilepath = indexHtml => indexHtml ? resolve(root, indexHtml) : fromTemplates('index.tpl.html'); + +const getPublicUrl = (config, dev) => { + const prefix = config.base === '/' ? '' : config.base; + return dev ? prefix : `${prefix}/public`; +}; + +const emptyLineTrim = new TemplateTag(replaceResultTransformer(/^\s*[\r\n]/gm, ''), trimResultTransformer); +const htmlTemplate = async indexHtml => compiled(getHtmlFilepath(indexHtml), { + minimize: false, + escape: false +}); +const parseHtml = ({ + config, + ctx, + dev, + template +}) => { + const { + title, + description + } = config; + const { + publicPath, + css, + js, + lang = 'en', + favicon, + head = [], + body = [], + trimWhitespace + } = ctx; + const headStr = ` + ${favicon ? `` : ''} + ${head.meta ? generateMetaTags(head.meta) : ''} + ${head.links ? generateLinkTags(head.links) : ''} + ${head.raw ? generateRawTags(head.raw) : ''} + ${head.scripts ? generateScriptTags(head.scripts) : ''} + ${generateCSSReferences(css, publicPath)}`; + const footerStr = ` + ${body.raw ? generateRawTags(body.raw) : ''} + ${body.scripts ? generateScriptTags(body.scripts) : ''} + ${generateJSReferences(js, publicPath)}`; + const doc = html$1(template({ + title, + description, + lang, + head: headStr, + footer: footerStr, + publicUrl: getPublicUrl(config, dev) + })); + return trimWhitespace ? oneLineTrim(doc) : emptyLineTrim(doc); +}; + +const assets = (config, args, env) => { + const isProd = env === 'production'; + const base = servedPath(args.base); + const publicPath = isProd ? base : '/'; + config.plugin('assets-plugin').use(manifestPlugin, [{ + publicPath, + fileName: 'assets.json' + }]); +}; +const analyzer = config => { + config.plugin('bundle-analyzer').use(BundleAnalyzerPlugin, [{ + generateStatsFile: true, + openAnalyzer: false, + analyzerMode: 'static' + }]); +}; +const injections = (config, args, env) => { + const { + stringify + } = JSON; + const base = servedPath(args.base); + + const plugin = require('webpack/lib/DefinePlugin'); + + config.plugin('injections').use(plugin, [Object.assign({}, getClientEnvironment(base).stringified, { + NODE_ENV: stringify(env), + DOCZ_BASE_URL: stringify(base) + })]); +}; +const ignore = config => { + config.plugin('ignore-plugin').use(IgnorePlugin, [/(regenerate\-unicode\-properties)|(elliptic)/, /node_modules/]); +}; +const hot = config => { + config.plugin('hot-module-replacement').use(HotModuleReplacementPlugin, [{ + multiStep: true + }]); +}; +const html = async (config, args, env) => { + const dev = env !== 'production'; + const template = await htmlTemplate(args.indexHtml); + config.plugin('html-plugin').use(miniHtmlWebpack, [{ + context: Object.assign({}, args.htmlContext, { + trimWhitespace: true + }), + template: ctx => { + const doc = parseHtml({ + ctx, + dev, + template, + config: args + }); + return dev ? doc : minify(doc, { + removeComments: true, + collapseWhitespace: true, + removeRedundantAttributes: true, + useShortDoctype: true, + removeEmptyAttributes: true, + removeStyleLinkTypeAttributes: true, + keepClosingSlash: true, + minifyJS: true, + minifyCSS: true, + minifyURLs: true + }); + } + }]); +}; +const webpackBar = (config, args) => { + config.plugin('webpackbar').use(webpackBarPlugin, [{ + name: 'Docz', + color: '#41b883' + }]); +}; +const watchNodeModulesPlugin = config => { + config.plugin('watch-missing-node-modules').use(watchMissingNodeModules, [appNodeModules]); +}; + +const minifier = (config, args) => { + config.optimization.minimizer('js').use(TerserPlugin, [{ + terserOptions: { + parse: { + ecma: 8 + }, + compress: { + ecma: 5, + warnings: false, + comparisons: false + }, + mangle: { + safari10: true + }, + output: { + ecma: 5, + comments: false, + ascii_only: true + } + }, + parallel: true, + cache: !args.debug, + sourceMap: args.sourcemaps + }]); +}; + +const getBabelConfig = async (args, env, typescript) => { + const isProd = env === 'production'; + const isDev = env === 'development'; + const localBabelRc = load('babel', { + presets: [], + plugins: [] + }, false, true); + const presets = [[require.resolve('babel-preset-react-app'), { + typescript, + flow: !args.typescript + }]]; + const defaultPlugins = [[require.resolve('babel-plugin-export-metadata'), { + notUseSpecifiers: args.notUseSpecifiers + }], [require.resolve('babel-plugin-named-asset-import'), { + loaderMap: { + svg: { + ReactComponent: '@svgr/webpack?-prettier,-svgo![path]' + } + } + }]]; + + const config = _merge(localBabelRc, { + presets, + babelrc: false, + cacheCompression: args.debug ? false : isProd, + cacheDirectory: !args.debug, + cacheIdentifier: args.debug ? null : getCacheIdentifier(isProd ? 'production' : isDev && 'development', ['docz', 'docz-core']), + compact: isProd, + customize: require.resolve('babel-preset-react-app/webpack-overrides'), + plugins: defaultPlugins.concat(!isProd ? [require.resolve('react-hot-loader/babel')] : []) + }); + + const reduce = Plugin.reduceFromPlugins(args.plugins); + const newConfig = reduce('modifyBabelRc', config, args); + return args.modifyBabelRc(newConfig, args); +}; + +/* eslint-disable @typescript-eslint/camelcase */ +const createConfig = (args, env) => async hooks => { + const { + debug + } = args; + const config = new Config(); + const isProd = env === 'production'; + const base = servedPath(args.base); + const dist = getDist(args.dest); + const srcPath = resolve(root, args.src); + const publicPath = isProd ? base : '/'; + /** + * general + */ + + config.context(root); + config.set('mode', env); + config.when(args.sourcemaps, cfg => cfg.devtool(isProd ? 'source-map' : 'cheap-module-eval-source-map'), cfg => cfg.devtool(false)); + config.node.merge({ + child_process: 'empty', + dgram: 'empty', + fs: 'empty', + net: 'empty', + tls: 'empty' + }); + /** + * output + */ + + const outputProd = output => output.filename('static/js/[name].[hash].js').sourceMapFilename('static/js/[name].[hash].js.map').chunkFilename('static/js/[name].[chunkhash:8].js'); + + const outputDev = output => output.filename('static/js/[name].js').sourceMapFilename('static/js/[name].js.map'); + + config.output.pathinfo(true).path(resolve(root, dist)).publicPath(publicPath).when(isProd, outputProd, outputDev).crossOriginLoading('anonymous').devtoolModuleFilenameTemplate(info => resolve(info.resourcePath).replace(/\\/g, '/')); + /** + * entries + */ + + config.entry('app').when(!isProd, entry => entry.add(require.resolve('react-dev-utils/webpackHotDevClient'))).add(indexJs); + /** + * resolve + */ + + config.resolve.set('symlinks', true); + config.resolve.extensions.add('.web.js').add('.mjs').add('.js').add('.json').add('.web.jsx').add('.jsx').add('.mdx').end(); + config.resolve.alias.set('react-native$', 'react-native-web'); + + const inYarnWorkspaces = __dirname.includes('/docz/core/docz-core'); + + const doczDependenciesDir = inYarnWorkspaces ? join(__dirname, '../../../../node_modules') : ownNodeModules; + config.resolve.modules.add('node_modules').add(doczDependenciesDir).add(srcPath).add(root).merge(get('node.path').split(delimiter).filter(Boolean)); + config.resolveLoader.set('symlinks', true).modules // prioritize our own + .add('node_modules').add(doczDependenciesDir).add(root); + /** + * loaders + */ + + const jsBabelrc = await getBabelConfig(args, env); + const tsBabelrc = await getBabelConfig(args, env, true); + config.when(args.sourcemaps, cfg => sourceMaps(cfg, args)); + js(config, args, jsBabelrc); + mdx(config, args, jsBabelrc); + images(config); + svg(config); + media(config); + fonts(config); + await html(config, args, env); + assets(config, args, env); + ignore(config); + injections(config, args, env); + isProd && hot(config); + config.when(debug, cfg => analyzer(cfg)); + config.when(!isProd, cfg => watchNodeModulesPlugin(cfg)); + config.when(!debug && !isProd, cfg => webpackBar(cfg, args)); + /** + * typescript setup + */ + + config.when(args.typescript, cfg => { + cfg.resolve.extensions.prepend('.ts').prepend('.tsx').end(); + ts(cfg, args, tsBabelrc); + }); + /** + * optimization + */ + + config.optimization.nodeEnv(env).namedModules(true).minimize(isProd).splitChunks({ + cacheGroups: { + vendor: { + test: /[\\/]node_modules[\\/]/, + name: 'vendors', + chunks: 'all' + } + } + }); + config.performance.hints(false); + config.when(isProd, cfg => minifier(cfg, args)); + hooks.onCreateWebpackChain(config, !isProd, args); + args.onCreateWebpackChain(config, !isProd, args); + return config.toConfig(); +}; + +const devServerConfig = (hooks, args) => { + const srcPath = resolve(root, args.src); + const publicDir = resolve(root, args.public); + const nonExistentDir = resolve(__dirname, 'non-existent'); + return { + publicPath: '/', + compress: true, + logLevel: args.debug ? 'debug' : 'silent', + clientLogLevel: args.debug ? 'info' : 'none', + contentBase: [nonExistentDir], + watchContentBase: true, + hot: true, + quiet: !args.debug, + open: true, + watchOptions: { + ignored: ignoredFiles(srcPath) + }, + overlay: false, + host: args.host, + port: args.port, + historyApiFallback: { + disableDotRule: true + }, + disableHostCheck: true, + + before(app, server) { + app.use('/public', static$1(publicDir)); + app.use(evalSourceMapMiddleware(server)); + app.use(errorOverlayMiddleware()); + hooks.onPreCreateApp(app); + }, + + after(app) { + hooks.onCreateApp(app); + } + + }; +}; + +const useYarn = existsSync(appYarnLock); +const server = args => async (config, hooks) => ({ + start: async () => { + const serverConfig = devServerConfig(hooks, args); + const protocol = process.env.HTTPS === 'true' ? 'https' : 'http'; + + const appName = require(packageJson).name; + + const useTypescript = args.typescript; + const urls = prepareUrls(protocol, args.host, args.port); + const devSocket = { + warnings: warnings => devServer.sockWrite(devServer.sockets, 'warnings', warnings), + errors: errors => devServer.sockWrite(devServer.sockets, 'errors', errors) + }; + const compiler = createCompiler({ + appName, + config, + devSocket, + urls, + useYarn, + useTypescript, + webpack + }); + const devServer = new WebpackDevServer(compiler, serverConfig); + return devServer.listen(args.port, args.host, err => { + if (err) return logger__default.fatal(err); + hooks.onServerListening(devServer); + }); + } +}); + +const FSR = require('react-dev-utils/FileSizeReporter'); + +const formatWebpackMessages = require('react-dev-utils/formatWebpackMessages'); +const { + measureFileSizesBeforeBuild, + printFileSizesAfterBuild +} = FSR; +const WARN_AFTER_BUNDLE_GZIP_SIZE = 512 * 1024; +const WARN_AFTER_CHUNK_GZIP_SIZE = 1024 * 1024; + +const hasCiEnvVar = () => get('ci', false, { + parse: true +}); + +const copyPublicFolder = async (dest, publicDir) => { + if (await pathExists(publicDir)) { + await copy(publicDir, distPublic(dest), { + dereference: true, + filter: file => file !== indexHtml + }); + } +}; + +const compile = config => new Promise((resolve, reject) => { + let compiler; + + try { + compiler = webpack(config); + } catch (err) { + onError(err); + } + + compiler && compiler.run((err, stats) => { + if (err) reject(err); + resolve(stats); + }); +}); + +const builder = async (config, previousFileSizes) => new Promise(async (resolve, reject) => { + try { + const stats = await compile(config); + const messages = formatWebpackMessages(stats.toJson({}, true)); + + if (messages.errors.length) { + return reject(new Error(messages.errors.join('\n\n'))); + } + + if (hasCiEnvVar() && messages.warnings.length) { + warn('\nTreating warnings as errors because process.env.CI = true.\n' + 'Most CI servers set it automatically.\n'); + return reject(new Error(messages.warnings.join('\n\n'))); + } + + return resolve({ + stats, + previousFileSizes, + warnings: messages.warnings + }); + } catch (err) { + reject(err); + } +}); + +const onSuccess = (dist, { + stats, + previousFileSizes, + warnings +}) => { + if (warnings.length) { + log(); + warn('Compiled with warnings.\n'); + warn(warnings.join('\n\n')); + warn('\nSearch for the ' + chalk$1.underline(chalk$1.yellow('keywords')) + ' to learn more about each warning.'); + warn('To ignore, add ' + chalk$1.cyan('// eslint-disable-next-line') + ' to the line before.\n'); + } + + log(); + log(`File sizes after gzip:\n`); + printFileSizesAfterBuild(stats, previousFileSizes, dist, WARN_AFTER_BUNDLE_GZIP_SIZE, WARN_AFTER_CHUNK_GZIP_SIZE); + log(); +}; + +const onError = err => { + log(); + fatal(err); + process.exit(1); + log(); +}; + +const build = async (config, dist, publicDir) => { + const interactive = new Signale({ + interactive: true, + scope: 'build' + }); + + try { + interactive.start('Creating an optimized bundle'); + await ensureDir(dist); + const previousFileSizes = await measureFileSizesBeforeBuild(dist); + await emptyDir(dist); + await copyPublicFolder(dist, publicDir); + const result = await builder(config, previousFileSizes); + interactive.success('Build successfully created'); + onSuccess(dist, result); + } catch (err) { + fatal(chalk$1.red('Failed to compile.\n')); + onError(err); + } +}; + +const bundler = (args, env) => new Bundler({ + args, + build, + config: createConfig(args, env), + server: server(args) +}); + +/** + * Copyright (c) 2015-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +var chalk = require('chalk'); + +var execSync = require('child_process').execSync; + +var spawn = require('cross-spawn'); + +var opn = require('opn'); // https://github.com/sindresorhus/opn#app + + +var OSX_CHROME = 'google chrome'; +const Actions = Object.freeze({ + NONE: 0, + BROWSER: 1, + SCRIPT: 2 +}); + +function getBrowserEnv() { + // Attempt to honor this environment variable. + // It is specific to the operating system. + // See https://github.com/sindresorhus/opn#app for documentation. + const value = process.env.BROWSER; + let action; + + if (!value) { + // Default. + action = Actions.BROWSER; + } else if (value.toLowerCase().endsWith('.js')) { + action = Actions.SCRIPT; + } else if (value.toLowerCase() === 'none') { + action = Actions.NONE; + } else { + action = Actions.BROWSER; + } + + return { + action, + value + }; +} + +function executeNodeScript(scriptPath, url) { + const extraArgs = process.argv.slice(2); + const child = spawn('node', [scriptPath, ...extraArgs, url], { + stdio: 'inherit' + }); + child.on('close', code => { + if (code !== 0) { + console.log(); + console.log(chalk.red('The script specified as BROWSER environment variable failed.')); + console.log(chalk.cyan(scriptPath) + ' exited with code ' + code + '.'); + console.log(); + return; + } + }); + return true; +} + +function startBrowserProcess(browser, url) { + // If we're on OS X, the user hasn't specifically + // requested a different browser, we can try opening + // Chrome with AppleScript. This lets us reuse an + // existing tab when possible instead of creating a new one. + const shouldTryOpenChromeWithAppleScript = process.platform === 'darwin' && (typeof browser !== 'string' || browser === OSX_CHROME); + + if (shouldTryOpenChromeWithAppleScript) { + try { + // Try our best to reuse existing tab + // on OS X Google Chrome with AppleScript + execSync('ps cax | grep "Google Chrome"'); + execSync('osascript openChrome.applescript "' + encodeURI(url) + '"', { + cwd: __dirname, + stdio: 'ignore' + }); + return true; + } catch (err) {// Ignore errors. + } + } // Another special case: on OS X, check if BROWSER has been set to "open". + // In this case, instead of passing `open` to `opn` (which won't work), + // just ignore it (thus ensuring the intended behavior, i.e. opening the system browser): + // https://github.com/facebook/create-react-app/pull/1690#issuecomment-283518768 + + + if (process.platform === 'darwin' && browser === 'open') { + browser = undefined; + } // Fallback to opn + // (It will always open new tab) + + + try { + var options = { + app: browser, + wait: false + }; + opn(url, options).catch(() => {}); // Prevent `unhandledRejection` error. + + return true; + } catch (err) { + return false; + } +} +/** + * Reads the BROWSER environment variable and decides what to do with it. Returns + * true if it opened a browser or ran a node.js script, otherwise false. + */ + + +function openBrowser(url) { + const { + action, + value + } = getBrowserEnv(); + + switch (action) { + case Actions.NONE: + // Special case: BROWSER="none" will prevent opening completely. + return false; + + case Actions.SCRIPT: + return executeNodeScript(value, url); + + case Actions.BROWSER: + return startBrowserProcess(value, url); + + default: + throw new Error('Not implemented.'); + } +} + +const mapToArray = (map = []) => Object.entries(map).map(entry => entry && { + key: entry[0], + value: entry[1] +}).filter(Boolean); + +const updateEntries = entries => async p => { + const prev = _get('entries', p.getState()); + + const map = await entries.get(); + + if (map && !equal(prev, map)) { + await Entries.writeImports(map); + p.setState('entries', mapToArray(map)); + } +}; + +const state = (entries, config, dev) => { + const src = relative(root, config.src); + const files = Array.isArray(config.files) ? config.files.map(filePath => join(src, filePath)) : join(src, config.files); + const ignored = config.watchIgnore || /(((^|[\/\\])\..+)|(node_modules))/; + const watcher = chokidar.watch(files, { + cwd: root, + ignored, + persistent: true + }); + watcher.setMaxListeners(Infinity); + return { + id: 'entries', + start: async params => { + const update = updateEntries(entries); + await update(params); + + if (dev) { + watcher.on('add', async () => update(params)); + watcher.on('change', async () => update(params)); + watcher.on('unlink', async () => update(params)); + watcher.on('raw', async (event, path, details) => { + if (details.event === 'moved' && details.type === 'directory') { + await update(params); + } + }); + } + }, + close: () => { + watcher.close(); + } + }; +}; + +const getInitialConfig = config => { + const pkg = readJsonSync(appPackageJson, { + throws: false + }); + const repoUrl = getRepoUrl(); + return { + title: config.title, + description: config.description, + menu: config.menu, + version: get$1(pkg, 'version'), + repository: repoUrl, + native: config.native, + codeSandbox: config.codeSandbox, + themeConfig: config.themeConfig, + separator: config.separator + }; +}; + +const update = async (params, initial, { + config +}) => { + const next = config ? loadFrom(resolve(config), initial, true, true) : load('docz', initial, true, true); + params.setState('config', next); +}; + +const state$1 = (config, dev) => { + const initial = getInitialConfig(config); + const glob = config.config || finds('docz'); + const ignored = config.watchIgnore || /(((^|[\/\\])\..+)|(node_modules))/; + const watcher = chokidar.watch(glob, { + cwd: root, + ignored, + persistent: true + }); + watcher.setMaxListeners(Infinity); + return { + id: 'config', + start: async params => { + const fn = async () => update(params, initial, config); + + await update(params, initial, config); + + if (dev) { + watcher.on('add', fn); + watcher.on('change', fn); + watcher.on('unlink', fn); + } + }, + close: () => { + watcher.close(); + } + }; +}; + +const throwError = err => { + logger__default.fatal(`Error parsing static types`); + logger__default.error(err); +}; + +const jsParser = (files, config) => { + const resolver = config.docgenConfig.resolver || reactDocgen.resolver.findAllExportedComponentDefinitions; + + const parseFilepathProps = filepath => { + const handlers = reactDocgen.defaultHandlers.concat([externalProptypesHandler(filepath), actualNameHandler]); + + try { + const code = readFileSync(filepath, 'utf-8'); + const props = reactDocgen.parse(code, resolver, handlers); + return { + key: normalize(filepath), + value: props + }; + } catch (err) { + if (config.debug) throwError(err); + return null; + } + }; + + return files.map(parseFilepathProps).filter(Boolean); +}; + +const digest = str => createHash('md5').update(str).digest('hex'); + +const cacheFilepath = join(cache, 'propsParser.json'); + +const readCacheFile = () => readJSONSync(cacheFilepath, { + throws: false +}); + +function checkFilesOnCache(files) { + const cache = readCacheFile(); + if (_isEmpty(cache)) return files; + return files.filter(filepath => { + const normalized = normalize(filepath); + const hash = digest(readFileSync(normalized, 'utf-8')); + + const found = _get(normalized, cache); + + return found && hash !== found.hash; + }); +} + +function writePropsOnCache(items) { + const cache = readCacheFile(); + const newCache = items.reduce((obj, { + key: filepath, + value + }) => { + const normalized = normalize(filepath); + const hash = digest(readFileSync(normalized, 'utf-8')); + return Object.assign({}, obj, { + [normalized]: { + hash, + props: value + } + }); + }, {}); + outputJSONSync(cacheFilepath, Object.assign({}, cache, newCache)); +} + +function getPropsOnCache() { + const cache = readCacheFile(); + + if (_isEmpty(cache)) { + warn('Any cache was found with your props definitions'); + warn("We'll parse your components to get props from them"); + warn('Depending on your components, this could take while...'); + return []; + } + + return Object.entries(cache).map(([key, value]) => ({ + key, + value: _get('props', value) + })); +} + +const mergeWithCache = (cache, props) => { + const keys = props.map(_prop('key')); + return cache.filter(item => !_contains(item.key, keys)).concat(props); +}; + +const removeFromCache = filepath => { + const cache = readCacheFile(); + outputJSONSync(cacheFilepath, _omit(filepath, cache)); +}; + +const getInitialFilesMap = () => { + const cache = readCacheFile(); + if (_isEmpty(cache)) return new Map(); + const map = new Map(); + + _entries(cache).forEach(([filepath]) => { + const exist = pathExistsSync(filepath); + + if (!exist) { + removeFromCache(filepath); + } else { + map.set(filepath, { + text: readFileSync(filepath, 'utf-8'), + version: 0 + }); + } + }); + + return map; +}; + +let languageService = null; +const filesMap = getInitialFilesMap(); + +function getTSConfigFile(tsconfigPath) { + const basePath = dirname(tsconfigPath); + const configFile = ts$1.readConfigFile(tsconfigPath, ts$1.sys.readFile); + return ts$1.parseJsonConfigFileContent(configFile.config, ts$1.sys, basePath, {}, tsconfigPath); +} + +function loadFiles(filesToLoad) { + filesToLoad.forEach(filepath => { + const normalized = normalize(filepath); + const found = filesMap.get(normalized); + filesMap.set(normalized, { + text: readFileSync(normalized, 'utf-8'), + version: found ? found.version + 1 : 0 + }); + }); +} + +function createServiceHost(compilerOptions, files) { + return { + getScriptFileNames: () => { + return [...files.keys()]; + }, + getScriptVersion: fileName => { + const file = files.get(fileName); + return file && file.version.toString() || ''; + }, + getScriptSnapshot: fileName => { + if (!existsSync$1(fileName)) { + return undefined; + } + + let file = files.get(fileName); + + if (file === undefined) { + const text = readFileSync(fileName).toString(); + file = { + version: 0, + text + }; + files.set(fileName, file); + } + + return ts$1.ScriptSnapshot.fromString(file.text); + }, + getCurrentDirectory: () => process.cwd(), + getCompilationSettings: () => compilerOptions, + getDefaultLibFileName: options => ts$1.getDefaultLibFilePath(options), + fileExists: ts$1.sys.fileExists, + readFile: ts$1.sys.readFile, + readDirectory: ts$1.sys.readDirectory + }; +} + +const parseFiles = (files, config, tsconfig) => { + const opts = { + propFilter(prop) { + if (prop.parent == null) return true; + const propFilter = config.docgenConfig.propFilter; + const val = propFilter && _isFunction(propFilter) && propFilter(prop); + return !prop.parent.fileName.includes('node_modules') || Boolean(val); + }, + + componentNameResolver(exp, source) { + const componentNameResolver = config.docgenConfig.resolver; + const val = componentNameResolver && _isFunction(componentNameResolver) && componentNameResolver(exp, source); + return val; + } + + }; + loadFiles(files); + const parser = reactDocgenTs.withCustomConfig(tsconfig, opts); + + const compilerOptions = _get('options', getTSConfigFile(tsconfig)); + + const programProvider = () => { + if (languageService) return languageService.getProgram(); + const servicesHost = createServiceHost(compilerOptions, filesMap); + const documentRegistry = ts$1.createDocumentRegistry(); + languageService = ts$1.createLanguageService(servicesHost, documentRegistry); + return languageService.getProgram(); + }; + + return files.map(filepath => ({ + key: normalize(filepath), + value: parser.parseWithProgramProvider(filepath, programProvider) + })); +}; + +const tsParser = (files, config, tsconfig) => { + if (!tsconfig) return null; + const filesToLoad = checkFilesOnCache(files); + const propsOnCache = getPropsOnCache(); + if (!filesToLoad.length) return propsOnCache; + const next = parseFiles(filesToLoad, config, tsconfig); + writePropsOnCache(next); + return mergeWithCache(propsOnCache, next); +}; + +const docgen = async (files, config) => { + const tsconfig = await findup('tsconfig.json', { + cwd: root + }); + return config.typescript ? tsParser(files, config, tsconfig) : jsParser(files, config); +}; + +const getPattern = config => { + const { + ignore, + src: source, + typescript: ts, + docgenConfig: docgenConfig + } = config; + const src = relative(root, docgenConfig.searchPath ? docgenConfig.searchPath : source); + return ignore.map(entry => `!**/${entry}`).concat([join(src, ts ? '**/*.{ts,tsx}' : '**/*.{js,jsx,mjs}'), '!**/node_modules', '!**/doczrc.js']); +}; + +const removeFilepath = (items, filepath) => items.filter(item => item.key !== filepath); + +const initial = (config, pattern) => async p => { + const { + filterComponents + } = config; + const files = await glob(pattern, { + cwd: root + }); + const filtered = filterComponents ? filterComponents(files) : files; + const metadata = await docgen(filtered, config); + p.setState('props', metadata); +}; + +const change = (p, config) => async filepath => { + const prev = _get('props', p.getState()); + + const metadata = await docgen([filepath], config); + const filtered = metadata.filter(_propEq('key', filepath)); + const next = removeFilepath(prev, filepath).concat(filtered); + p.setState('props', next); +}; + +const remove = p => async filepath => { + const prev = _get('props', p.getState()); + + const next = removeFilepath(prev, filepath); + p.setState('props', next); +}; + +const state$2 = (config, dev) => { + const pattern = getPattern(config); + const ignored = config.watchIgnore || /(((^|[\/\\])\..+)|(node_modules))/; + const watcher = chokidar.watch(pattern, { + cwd: root, + ignored, + persistent: true + }); + watcher.setMaxListeners(Infinity); + return { + id: 'props', + start: async params => { + const addInitial = initial(config, pattern); + await addInitial(params); + + if (dev) { + watcher.on('change', change(params, config)); + watcher.on('unlink', remove(params)); + } + }, + close: () => { + watcher.close(); + } + }; +}; + + + +var index = /*#__PURE__*/Object.freeze({ + entries: state, + config: state$1, + props: state$2 +}); + +process.setMaxListeners(Infinity); +const dev = async args => { + const env = get('node.env'); + const config = await parseConfig(args); + const bundler$1 = bundler(config, env); + const entries = new Entries(config); + const { + websocketHost, + websocketPort + } = config; + const bundlerConfig = await bundler$1.mountConfig(env); + const app = await bundler$1.createApp(bundlerConfig); + + try { + await Entries.writeApp(config, true); + await Entries.writeImports((await entries.get())); + } catch (err) { + fatal('Failed to build your files'); + error(err); + process.exit(1); + } + + const server = await app.start(); + const dataServer = new DataServer(); + const socket = new Socket(server, websocketHost, websocketPort); + if (config.propsParser) dataServer.register([state$2(config, true)]); + dataServer.register([state$1(config, true), state(entries, config, true)]); + + try { + await dataServer.start(); + if (args.open || args.o) openBrowser(`http://${config.host}:${config.port}`); + } catch (err) { + fatal('Failed to process data server'); + error(err); + dataServer.close(); + process.exit(1); + } + + socket.onConnection((_, emit) => { + const subscribe = dataServer.onStateChange(action => { + emit(action.type, action.payload); + }); + return () => subscribe(); + }); + onSignal(async () => { + dataServer.close(); + server.close(); + }); + server.on('close', async () => { + dataServer.close(); + }); +}; + +const build$1 = async args => { + const env = get('node.env'); + const config = await parseConfig(args); + const entries = new Entries(config); + const bundler$1 = bundler(config, env); + const bundlerConfig = await bundler$1.mountConfig(env); + const run = Plugin.runPluginsMethod(config.plugins); + const dataServer = new DataServer(); + if (config.propsParser) dataServer.register([state$2(config)]); + dataServer.register([state$1(config), state(entries, config)]); + + try { + await Entries.writeApp(config, false); + await Entries.writeImports((await entries.get())); + await dataServer.start(); + await run('onPreBuild', config); + await bundler$1.build(bundlerConfig); + await run('onPostBuild', config); + dataServer.close(); + } catch (err) { + error(err); + process.exit(1); + dataServer.close(); + } +}; + +const serve = async args => { + const config = await parseConfig(args); + const dist = getDist(config.dest); + spawn$1.sync('serve', ['-s', dist], { + stdio: 'inherit' + }); +}; + +const cli = () => { + return command('dev', 'initialize docz dev server', setArgs, async args => { + setEnv('development'); + await dev(args); + }).command('build', 'build dir as static site', setArgs, async args => { + setEnv('production'); + await build$1(args); + process.exit(); + }).command('serve', 'serve dir as static site', setArgs, async args => { + setEnv('production'); + await build$1(args); + await serve(args); + process.exit(); + }).demandCommand().help().wrap(72).epilog('for more information visit https://github.com/pedronauck/docz').showHelpOnFail(false, 'whoops, something went wrong! run with --help').argv; +}; + +/** cli exports */ + +export { DataServer, Entries, Entry, Plugin, cli, createPlugin, getBaseConfig, parseConfig, setArgs, index as states }; diff --git a/docs/docz-lib/docz-core/dist/index.js b/docs/docz-lib/docz-core/dist/index.js new file mode 100644 index 000000000..7a752f052 --- /dev/null +++ b/docs/docz-lib/docz-core/dist/index.js @@ -0,0 +1,2024 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } + +var yargs = require('yargs'); +var _get = _interopDefault(require('lodash/fp/get')); +var fs = require('fs-extra'); +var envDotProp = require('env-dot-prop'); +var humanize = _interopDefault(require('humanize-string')); +var titleize = _interopDefault(require('titleize')); +var fs$1 = require('fs'); +var path = require('path'); +var resolve = require('resolve'); +var logger = require('signale'); +var logger__default = _interopDefault(logger); +var tslib_1 = require('tslib'); +var mdast = require('docz-utils/lib/mdast'); +var fs$2 = require('docz-utils/lib/fs'); +var glob = _interopDefault(require('fast-glob')); +var crypto = require('crypto'); +var slugify = _interopDefault(require('@sindresorhus/slugify')); +var _isFunction = _interopDefault(require('lodash/fp/isFunction')); +var pReduce = _interopDefault(require('p-reduce')); +var getPkgRepo = _interopDefault(require('get-pkg-repo')); +var findup = _interopDefault(require('find-up')); +var WS = _interopDefault(require('ws')); +var _merge = _interopDefault(require('lodash/fp/merge')); +var _omit = _interopDefault(require('lodash/fp/omit')); +var loadCfg = require('load-cfg'); +var detectPort = _interopDefault(require('detect-port')); +var Config = _interopDefault(require('webpack-chain')); +var frontmatter = _interopDefault(require('remark-frontmatter')); +var remarkDocz = _interopDefault(require('remark-docz')); +var rehypeDocz = _interopDefault(require('rehype-docz')); +var slug = _interopDefault(require('rehype-slug')); +var webpack = require('webpack'); +var webpack__default = _interopDefault(webpack); +var webpackBarPlugin = _interopDefault(require('webpackbar')); +var htmlMinifier = require('html-minifier'); +var miniHtmlWebpack = require('mini-html-webpack-plugin'); +var miniHtmlWebpack__default = _interopDefault(miniHtmlWebpack); +var manifestPlugin = _interopDefault(require('webpack-manifest-plugin')); +var watchMissingNodeModules = _interopDefault(require('react-dev-utils/WatchMissingNodeModulesPlugin')); +require('react-dev-utils/ModuleNotFoundPlugin'); +var webpackBundleAnalyzer = require('webpack-bundle-analyzer'); +var ctags = require('common-tags'); +var TerserPlugin = require('terser-webpack-plugin'); +var getCacheIdentifier = _interopDefault(require('react-dev-utils/getCacheIdentifier')); +var WebpackDevServer = _interopDefault(require('webpack-dev-server')); +var WebpackDevServerUtils = require('react-dev-utils/WebpackDevServerUtils'); +var express = require('express'); +var errorOverlayMiddleware = _interopDefault(require('react-dev-utils/errorOverlayMiddleware')); +var evalSourceMapMiddleware = _interopDefault(require('react-dev-utils/evalSourceMapMiddleware')); +var ignoredFiles = _interopDefault(require('react-dev-utils/ignoredFiles')); +var chalk$1 = _interopDefault(require('chalk')); +var chokidar = _interopDefault(require('chokidar')); +var equal = _interopDefault(require('fast-deep-equal')); +var get = _interopDefault(require('lodash/get')); +var _propEq = _interopDefault(require('lodash/fp/propEq')); +var externalProptypesHandler = _interopDefault(require('react-docgen-external-proptypes-handler')); +var actualNameHandler = _interopDefault(require('react-docgen-actual-name-handler')); +var reactDocgen = _interopDefault(require('react-docgen')); +var _entries = _interopDefault(require('lodash/fp/entries')); +var _contains = _interopDefault(require('lodash/fp/contains')); +var _prop = _interopDefault(require('lodash/fp/prop')); +var _isEmpty = _interopDefault(require('lodash/fp/isEmpty')); +var reactDocgenTs = _interopDefault(require('react-docgen-typescript')); +var ts$1 = _interopDefault(require('typescript')); +var spawn$1 = _interopDefault(require('cross-spawn')); + +const ensureSlash = (filepath, needsSlash) => { + const hasSlash = filepath.endsWith('/'); + + if (hasSlash && !needsSlash) { + return filepath.substr(filepath, filepath.length - 1); + } else if (!hasSlash && needsSlash) { + return `${filepath}/`; + } else { + return filepath; + } +}; +const root = fs$1.realpathSync(process.cwd()); +const resolveApp = to => path.resolve(root, to); +const resolveOwn = to => path.resolve(__dirname, '../', to); +const templates = path.join(resolve.sync('./'), '../templates'); +const packageJson = resolveApp('package.json'); +const servedPath = base => ensureSlash(base, true); +const docz = resolveApp('.docz'); +const app = path.resolve(docz, 'app/'); +const cache = path.resolve(docz, 'cache/'); +const appPublic = path.resolve(docz, 'public/'); +const appNodeModules = resolveApp('node_modules'); +const appPackageJson = resolveApp('package.json'); +const appYarnLock = resolveOwn('yarn.lock'); +const ownNodeModules = resolveOwn('node_modules'); +const getDist = dest => path.join(root, dest); +const distPublic = dest => path.join(dest, 'public/'); +const importsJs = path.resolve(app, 'imports.js'); +const rootJs = path.resolve(app, 'root.jsx'); +const indexJs = path.resolve(app, 'index.jsx'); +const indexHtml = path.resolve(app, 'index.html'); +const db = path.resolve(app, 'db.json'); + +var paths = /*#__PURE__*/Object.freeze({ + ensureSlash: ensureSlash, + root: root, + resolveApp: resolveApp, + resolveOwn: resolveOwn, + templates: templates, + packageJson: packageJson, + servedPath: servedPath, + docz: docz, + app: app, + cache: cache, + appPublic: appPublic, + appNodeModules: appNodeModules, + appPackageJson: appPackageJson, + appYarnLock: appYarnLock, + ownNodeModules: ownNodeModules, + getDist: getDist, + distPublic: distPublic, + importsJs: importsJs, + rootJs: rootJs, + indexJs: indexJs, + indexHtml: indexHtml, + db: db +}); + +const getEnv = (val, defaultValue = null) => envDotProp.get(val, defaultValue, { + parse: true +}); + +const getInitialTitle = pkg => { + const name = _get('name', pkg) || 'MyDoc'; + return titleize(humanize(name.replace(/^@.*\//, ''))); +}; + +const getInitialDescription = pkg => _get('description', pkg) || 'My awesome app using docz'; + +const setArgs = yargs => { + const pkg = fs.readJsonSync(appPackageJson, { + throws: false + }); + return yargs.option('base', { + type: 'string', + default: getEnv('docz.base', '/') + }).option('source', { + alias: 'src', + type: 'string', + default: getEnv('docz.source', './') + }).option('files', { + type: 'string', + default: getEnv('docz.files', '**/*.{md,markdown,mdx}') + }).option('ignore', { + type: 'array', + default: getEnv('docz.ignore', []) + }).option('public', { + type: 'string', + default: getEnv('docz.public', '/public') + }).option('dest', { + alias: 'd', + type: 'string', + default: getEnv('docz.dest', '.docz/dist') + }).option('editBranch', { + alias: 'eb', + type: 'string', + default: getEnv('docz.edit.branch', 'master') + }).option('config', { + type: 'string', + default: getEnv('docz.config', '') + }).option('title', { + type: 'string', + default: getEnv('docz.title', getInitialTitle(pkg)) + }).option('description', { + type: 'string', + default: getEnv('docz.description', getInitialDescription(pkg)) + }).option('theme', { + type: 'string', + default: getEnv('docz.theme', 'theme') + }).option('typescript', { + alias: 'ts', + type: 'boolean', + default: getEnv('docz.typescript', false) + }).option('propsParser', { + type: 'boolean', + default: getEnv('docz.props.parser', true) + }).option('wrapper', { + type: 'string', + default: getEnv('docz.wrapper', null) + }).option('indexHtml', { + type: 'string', + default: getEnv('docz.index.html', null) + }).option('debug', { + type: 'boolean', + default: getEnv('docz.debug', false) + }).option('clearConsole', { + type: 'boolean', + default: getEnv('docz.clear.console', true) + }).option('host', { + type: 'string', + default: getEnv('docz.host', '127.0.0.1') + }).option('port', { + alias: 'p', + type: 'number', + default: getEnv('docz.port', 3000) + }).option('websocketHost', { + type: 'string', + default: getEnv('docz.websocket.host', '127.0.0.1') + }).option('websocketPort', { + type: 'number', + default: getEnv('docz.websocket.port', 60505) + }).option('native', { + type: 'boolean', + default: getEnv('docz.native', false) + }).option('codeSandbox', { + type: 'boolean', + default: getEnv('docz.codeSandbox', true) + }).option('sourcemaps', { + type: 'boolean', + default: getEnv('docz.sourcemaps', true) + }).option('separator', { + type: 'string', + default: getEnv('docz.separator', '-') + }).option('open', { + alias: 'o', + describe: 'auto open browser in dev mode', + type: 'boolean', + default: false + }); +}; + +const populateNodePath = () => { + // We support resolving modules according to `NODE_PATH`. + // It works similar to `NODE_PATH` in Node itself: + // https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders + // Note that unlike in Node, only *relative* paths from `NODE_PATH` are honored. + // Otherwise, we risk importing Node.js core modules into an app instead of Webpack shims. + // https://github.com/facebook/create-react-app/issues/1023#issuecomment-265344421 + // We also resolve them to make sure all tools using them work consistently. + envDotProp.set('node.path', envDotProp.get('node.path', '').split(path.delimiter).filter(folder => folder && !path.isAbsolute(folder)).map(folder => path.resolve(root, folder)).join(path.delimiter)); +}; + +const configDotEnv = () => { + const NODE_ENV = envDotProp.get('node.env'); + const dotenv = resolveApp('.env'); + const dotenvFiles = [`${dotenv}.${NODE_ENV}.local`, `${dotenv}.${NODE_ENV}`, // Don't include `.env.local` for `test` environment + // since normally you expect tests to produce the same + // results for everyone + NODE_ENV !== 'test' && `${dotenv}.local`, dotenv]; // Load environment variables from .env* files. Suppress warnings using silent + // if this file is missing. dotenv will never modify any environment variables + // that have already been set. Variable expansion is supported in .env files. + // https://github.com/motdotla/dotenv + + dotenvFiles.filter(Boolean).forEach(dotenvFile => { + require('dotenv').config({ + path: dotenvFile + }); + }); +}; + +const setEnv = env => { + envDotProp.set('babel.env', env); + envDotProp.set('node.env', env); + configDotEnv(); + populateNodePath(); +}; +const getClientEnvironment = publicUrl => { + const APP_TEST = /^(REACT_APP_)|(ANGULAR_APP_)|(VUE_APP_)|(DOCZ_)/i; + const raw = Object.keys(process.env).filter(key => APP_TEST.test(key)).reduce((env, key) => { + env[key] = process.env[key]; + return env; + }, { + // Useful for determining whether we’re running in production mode. Most + // importantly, it switches React into the correct mode. + NODE_ENV: envDotProp.get('node.env') || 'development', + // Useful for resolving the correct path to static assets in `public`. For + // example, . This should + // only be used as an escape hatch. Normally you would put images into the `src` + // and `import` them in code to get their + PUBLIC_URL: publicUrl + }); + const stringified = { + 'process.env': Object.keys(raw).reduce((env, key) => { + env[key] = JSON.stringify(raw[key]); + return env; + }, {}) + }; + return { + raw, + stringified + }; +}; + +const createId = file => crypto.createHash('md5').update(file).digest('hex'); + +const mountRoute = (base, route) => { + if (base === '/') return route; + const baseHasSlash = base.endsWith('/'); + if (baseHasSlash) return base.substr(0, base.length - 1) + route; + return base + route; +}; + +class Entry { + constructor(ast, file, src, config) { + const filepath = this.getFilepath(file, src); + const parsed = mdast.getParsedData(ast); + const name = this.getName(filepath, parsed); + this.id = createId(file); + this.filepath = filepath; + this.link = ''; + this.slug = this.slugify(filepath, config.separator); + this.route = this.getRoute(parsed, config.base); + this.name = name; + this.menu = parsed.menu || ''; + this.headings = mdast.headingsFromAst(ast); + this.settings = parsed; + } + + setLink(url) { + if (url) { + this.link = url.replace('{{filepath}}', this.filepath); + } + } + + getFilepath(file, src) { + const srcPath = path.resolve(root, src); + const filepath = path.relative(srcPath, file); + + if (process.platform === 'win32') { + return filepath.split('\\').join('/'); + } + + return filepath; + } + + getName(filepath, parsed) { + const filename = humanize(path.parse(filepath).name); + return parsed && parsed.name ? parsed.name : filename; + } + + slugify(filepath, separator) { + const ext = path.extname(filepath); + const fileWithoutExt = filepath.replace(ext, ''); + return slugify(fileWithoutExt, { + separator + }); + } + + getRoute(parsed, base) { + const parsedRoute = _get('route', parsed); + const route = parsedRoute || `/${this.slug}`; + return mountRoute('/', route); + } +} + +class Plugin { + constructor(p) { + this.setConfig = p.setConfig; + this.modifyBundlerConfig = p.modifyBundlerConfig; + this.modifyBabelRc = p.modifyBabelRc; + this.modifyFiles = p.modifyFiles; + this.onPreCreateApp = p.onPreCreateApp; + this.onCreateWebpackChain = p.onCreateWebpackChain; + this.onCreateApp = p.onCreateApp; + this.onServerListening = p.onServerListening; + this.onPreBuild = p.onPreBuild; + this.onPostBuild = p.onPostBuild; + this.onPreRender = p.onPreRender; + this.onPostRender = p.onPostRender; + } + + static runPluginsMethod(plugins) { + return (method, ...args) => { + if (plugins && plugins.length > 0) { + for (const plugin of plugins) { + const fn = _get(method, plugin); + + _isFunction(fn) && fn(...args); + } + } + }; + } + + static propsOfPlugins(plugins) { + return prop => plugins && plugins.length > 0 ? plugins.map(p => _get(prop, p)).filter(Boolean) : []; + } + + static reduceFromPlugins(plugins) { + return (method, initial, ...args) => { + return [...(plugins || [])].reduce((obj, plugin) => { + const fn = _get(method, plugin); + + return fn && _isFunction(fn) ? fn(obj, ...args) : obj; + }, initial); + }; + } + + static reduceFromPluginsAsync(plugins) { + return (method, initial, ...args) => { + return pReduce([...(plugins || [])], (obj, plugin) => { + const fn = _get(method, plugin); + + return Promise.resolve(fn && _isFunction(fn) ? fn(obj, ...args) : obj); + }, initial); + }; + } + +} +function createPlugin(factory) { + return new Plugin(factory); +} + +const parseRepo = () => { + try { + const pkg = fs.readJsonSync(appPackageJson); + return getPkgRepo(pkg); + } catch (err) { + return null; + } +}; +const getRepoUrl = () => { + const repo = parseRepo(); + return repo && (repo.browsetemplate && repo.browsetemplate.replace('{domain}', repo.domain).replace('{user}', repo.user).replace('{project}', repo.project).replace('{/tree/committish}', '') || repo.browse && repo.browse()); +}; + +const getBitBucketPath = (branch, relative) => { + const querystring = `?mode=edit&spa=0&at=${branch}&fileviewer=file-view-default`; + const filepath = path.join(`/src/${branch}`, relative, `{{filepath}}`); + return `${filepath}${querystring}`; +}; + +const getTree = (repo, branch, relative) => { + const defaultPath = path.join(`/edit/${branch}`, relative, `{{filepath}}`); + const bitBucketPath = getBitBucketPath(branch, relative); + if (repo && repo.type === 'bitbucket') return bitBucketPath; + return defaultPath; +}; + +const getRepoEditUrl = (src, branch) => { + try { + const repo = parseRepo(); + const project = path.parse(findup.sync('.git')).dir; + const root$1 = path.join(root, src); + const relative = path.relative(project, root$1); + const tree = getTree(repo, branch, relative); + return repo && repo.browsetemplate && repo.browsetemplate.replace('{domain}', repo.domain).replace('{user}', repo.user).replace('{project}', repo.project).replace('{/tree/committish}', tree); + } catch (err) { + return null; + } +}; + +const fromTemplates = file => path.join(templates, file); + +const mapToObj = map => Array.from(map.entries()).reduce((obj, [key, value]) => Object.assign({}, obj, { + [`${key}`]: value +}), {}); + +const matchFilesWithSrc = config => files => { + const src = path.relative(root, config.src); + return files.map(file => file.startsWith(src) ? file : path.join(src, file)); +}; + +const writeAppFiles = async (config, dev) => { + const { + plugins, + theme + } = config; + const props = Plugin.propsOfPlugins(plugins); + const onPreRenders = props('onPreRender'); + const onPostRenders = props('onPostRender'); + const isProd = !dev; + const root = await fs$2.compiled(fromTemplates('root.tpl.js'), { + minimize: false + }); + const js = await fs$2.compiled(fromTemplates('index.tpl.js'), { + minimize: false + }); + const websocketUrl = `ws://${config.websocketHost}:${config.websocketPort}`; + const rawRootJs = root({ + theme, + isProd, + wrapper: config.wrapper, + websocketUrl + }); + const rawIndexJs = js({ + onPreRenders, + onPostRenders, + isProd + }); + await fs.remove(rootJs); + await fs.remove(indexJs); + await fs$2.touch(rootJs, rawRootJs); + await fs$2.touch(indexJs, rawIndexJs); +}; + +class Entries { + static async writeApp(config, dev) { + await fs.ensureDir(app); + await writeAppFiles(config, dev); + } + + static async writeImports(map) { + const imports = await fs$2.compiled(fromTemplates('imports.tpl.js')); + const rawImportsJs = imports({ + entries: Object.values(map) + }); + await fs$2.touch(path.join(app, 'imports.js'), rawImportsJs); + } + + constructor(config) { + this.repoEditUrl = getRepoEditUrl(config.src, config.editBranch); + this.all = new Map(); + + this.get = async () => this.getMap(config); + } + + async getMap(config) { + const { + src, + files: pattern, + ignore, + plugins, + mdPlugins + } = config; + const arr = Array.isArray(pattern) ? pattern : [pattern]; + const toMatch = matchFilesWithSrc(config); + const files = await glob(toMatch(arr), { + ignore: ['**/node_modules/**'].concat(ignore), + onlyFiles: true, + unique: true, + nocase: true, + matchBase: true + }); + + const createEntry = async file => { + try { + const ast = await mdast.parseMdx(file, mdPlugins); + const entry = new Entry(ast, file, src, config); + if (this.repoEditUrl) entry.setLink(this.repoEditUrl); + + const { + settings + } = entry, + rest = tslib_1.__rest(entry, ["settings"]); + + return Object.assign({}, settings, rest); + } catch (err) { + logger.error(err); + return null; + } + }; + + const reduce = Plugin.reduceFromPlugins(plugins); + const modifiedFiles = reduce('modifyFiles', files); + const map = new Map(); + const entries = await Promise.all(modifiedFiles.map(createEntry).filter(Boolean)); + + for (const entry of entries) { + if (entry) { + map.set(entry.filepath, entry); + } + } + + this.all = map; + return mapToObj(map); + } + +} + +class DataServer { + constructor() { + this.states = new Set(); + this.state = new Map(); + this.listeners = new Set(); + } + + register(states) { + for (const state of states) this.states.add(state); + + return this; + } + + async start() { + const setState = (key, val) => this.setState(key, val); + + const getState = () => this.getState(); + + await Promise.all(Array.from(this.states).map(async state => { + if (!_isFunction(state.start)) return; + return state.start({ + setState, + getState + }); + })); + } + + close() { + for (const state of this.states) { + _isFunction(state.close) && state.close(); + } + } + + onStateChange(listener) { + this.listeners.add(listener); + return () => this.listeners.clear(); + } + + getState() { + return this.mapToObject(this.state); + } + + setState(key, val) { + const prev = _get(key, this.getState()); + + const next = typeof val === 'function' ? val(prev) : val; + this.state.set(key, next); + this.writeDbFile(); + this.listeners.forEach(listener => { + listener({ + type: `state.${key}`, + payload: next + }); + }); + } + + async writeDbFile() { + fs.outputJSONSync(db, this.mapToObject(this.state), { + spaces: 2 + }); + } + + mapToObject(map) { + return Array.from(map.entries()).reduce((obj, [key, val]) => Object.assign({}, obj, { + [key]: val + }), {}); + } + +} + +const onSignal = cb => { + const signals = ['SIGINT', 'SIGTERM']; + + for (const sig of signals) { + process.on(sig, async () => { + await cb(); + process.exit(); + }); + } +}; + +const isSocketOpened = socket => socket.readyState === WS.OPEN; + +const sender = socket => (type, payload) => { + if (socket && isSocketOpened(socket)) { + socket.send(JSON.stringify({ + type, + payload + })); + } +}; + +class Socket { + constructor(server, host, port) { + if (server) { + this.client = new WS.Server({ + server, + host, + port + }); + } + } + + onConnection(listener) { + if (!this.client) return; + this.client.on('connection', socket => { + const emit = sender(socket); + const subs = listener(socket, emit); + + const handleClose = async () => { + subs(); + socket.terminate(); + }; + + this.client.on('close', handleClose); + onSignal(handleClose); + }); + } + +} + +const toOmit = ['_', '$0', 'version', 'help']; +const htmlContext = { + lang: 'en', + favicon: 'https://cdn-std.dprcdn.net/files/acc_649651/LUKiMl' +}; +const doczRcBaseConfig = { + htmlContext, + themeConfig: {}, + docgenConfig: {}, + filterComponents: files => files.filter(filepath => /\/[A-Z]\w*\.(js|jsx|ts|tsx)$/.test(filepath)), + modifyBundlerConfig: config => config, + modifyBabelRc: babelrc => babelrc, + onCreateWebpackChain: () => null, + menu: [], + plugins: [], + mdPlugins: [], + hastPlugins: [], + ignore: ['**/readme.md', '**/changelog.md', '**/code_of_conduct.md', '**/contributing.md', '**/license.md'] +}; +const getBaseConfig = (argv, custom) => { + const initial = _omit(toOmit, argv); + + const base = Object.assign({}, initial, doczRcBaseConfig, { + paths + }); + return _merge(base, custom); +}; +const parseConfig = async (argv, custom) => { + const port = await detectPort(argv.port); + const websocketPort = await detectPort(argv.websocketPort); + const defaultConfig = getBaseConfig(argv, Object.assign({ + port, + websocketPort, + htmlContext + }, custom)); + const config = argv.config ? loadCfg.loadFrom(path.resolve(argv.config), defaultConfig) : loadCfg.load('docz', defaultConfig); + const reduceAsync = Plugin.reduceFromPluginsAsync(config.plugins); + return reduceAsync('setConfig', config); +}; + +class Bundler { + constructor(params) { + const { + args, + config, + server, + build + } = params; + const run = Plugin.runPluginsMethod(args.plugins); + this.args = args; + this.config = config; + this.server = server; + this.builder = build; + this.hooks = { + onCreateWebpackChain(config, dev, args) { + run('onCreateWebpackChain', config, dev, args); + }, + + onPreCreateApp(app) { + run('onPreCreateApp', app); + }, + + onCreateApp(app) { + run('onCreateApp', app); + }, + + onServerListening(server) { + run('onServerListening', server); + } + + }; + } + + async mountConfig(env) { + const { + plugins + } = this.args; + const isDev = env !== 'production'; + const reduce = Plugin.reduceFromPlugins(plugins); + const userConfig = await this.config(this.hooks); + const config = reduce('modifyBundlerConfig', userConfig, isDev, this.args); + return this.args.modifyBundlerConfig(config, isDev, this.args); + } + + async createApp(config) { + return this.server(config, this.hooks); + } + + async build(config) { + const dist = getDist(this.args.dest); + const publicDir = path.join(root, this.args.public); + + if (root === path.resolve(dist)) { + logger__default.fatal(new Error('Unexpected option: "dest" cannot be set to the current working directory.')); + process.exit(1); + } + + await this.builder(config, dist, publicDir); + } + +} + +const excludeNodeModules = filepath => /node_modules/.test(filepath) || /@babel(?:\/|\\{1,2})runtime/.test(filepath); + +const sourceMaps = (config, args) => { + const srcPath = path.resolve(root, args.src); + config.module.rule('sourcemaps').test(/\.(js|mjs|jsx|ts|tsx|md|mdx)$/).include.add(srcPath).add(app).end().exclude.add(excludeNodeModules).end().use('sourcemaps').loader(require.resolve('source-map-loader')).end().enforce('pre'); +}; + +const addScriptLoaders = opts => { + const { + rule, + threadLoader = true, + babelrc, + args + } = opts; + return rule.when(!args.debug, rule => rule.use('cache-loader').loader(require.resolve('cache-loader')).options({ + cacheDirectory: cache + })).when(Boolean(threadLoader), rule => rule.use('thread-loader').loader(require.resolve('thread-loader')).options({ + workers: require('os').cpus().length - 1 + })).use('babel-loader').loader(require.resolve('babel-loader')).options(babelrc).end(); +}; + +const js = (config, args, babelrc) => { + const srcPath = path.resolve(root, args.src); + const rule = config.module.rule('js').test(/\.(jsx?|mjs)$/).include.add(srcPath).add(app).end().exclude.add(excludeNodeModules).end(); + addScriptLoaders({ + rule, + babelrc, + args + }); +}; +const ts = (config, args, babelrc) => { + const srcPath = path.resolve(root, args.src); + const rule = config.module.rule('ts').test(/\.tsx?$/).include.add(srcPath).add(app).end().exclude.add(excludeNodeModules).end(); + addScriptLoaders({ + rule, + babelrc, + args + }); +}; +const mdx = (config, args, babelrc) => { + const { + mdPlugins, + hastPlugins + } = args; + const srcPath = path.resolve(root, args.src); + const rule = config.module.rule('mdx').test(/\.(md|markdown|mdx)$/).include.add(srcPath).add(root).add(app).end().exclude.add(excludeNodeModules).end(); + addScriptLoaders({ + rule, + babelrc, + args, + threadLoader: false + }).use('mdx-loader').loader(require.resolve('@mdx-js/loader')).options({ + remarkPlugins: mdPlugins.concat([[frontmatter, { + type: 'yaml', + marker: '-' + }], remarkDocz]), + rehypePlugins: hastPlugins.concat([[rehypeDocz, { + root: root, + useCodeSandbox: args.codeSandbox + }], slug]) + }); +}; +const INLINE_LIMIT = 10000; +const images = config => { + config.module.rule('images').test(/\.(png|jpe?g|gif)(\?.*)?$/).use('url-loader').loader(require.resolve('url-loader')).options({ + limit: INLINE_LIMIT, + name: `static/img/[name].[hash:8].[ext]` + }); +}; +const svg = config => { + config.module.rule('svg').test(/\.(svg)(\?.*)?$/).use('file-loader').loader(require.resolve('file-loader')).options({ + name: `static/img/[name].[hash:8].[ext]` + }); +}; +const media = config => { + config.module.rule('media').test(/\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/).use('url-loader').loader(require.resolve('url-loader')).options({ + limit: INLINE_LIMIT, + name: `static/media/[name].[hash:8].[ext]` + }); +}; +const fonts = config => { + config.module.rule('fonts').test(/\.(woff2?|eot|ttf|otf)(\?.*)?$/i).use('url-loader').loader(require.resolve('url-loader')).options({ + limit: INLINE_LIMIT, + name: `static/fonts/[name].[hash:8].[ext]` + }); +}; + +const wrapItems = item => Object.keys(item).map(key => `${key}="${item[key]}"`).join(' '); + +const generateTags = template => (items = []) => items.map(template).join(''); + +const generateMetaTags = generateTags(item => ``); +const generateLinkTags = generateTags(item => ``); +const generateScriptTags = generateTags(item => ``); + +const generateRawTags = (items = []) => { + if (typeof items === 'string' || items instanceof String) return items; + return items.map(item => item).join(''); +}; + +const getHtmlFilepath = indexHtml => indexHtml ? path.resolve(root, indexHtml) : fromTemplates('index.tpl.html'); + +const getPublicUrl = (config, dev) => { + const prefix = config.base === '/' ? '' : config.base; + return dev ? prefix : `${prefix}/public`; +}; + +const emptyLineTrim = new ctags.TemplateTag(ctags.replaceResultTransformer(/^\s*[\r\n]/gm, ''), ctags.trimResultTransformer); +const htmlTemplate = async indexHtml => fs$2.compiled(getHtmlFilepath(indexHtml), { + minimize: false, + escape: false +}); +const parseHtml = ({ + config, + ctx, + dev, + template +}) => { + const { + title, + description + } = config; + const { + publicPath, + css, + js, + lang = 'en', + favicon, + head = [], + body = [], + trimWhitespace + } = ctx; + const headStr = ` + ${favicon ? `` : ''} + ${head.meta ? generateMetaTags(head.meta) : ''} + ${head.links ? generateLinkTags(head.links) : ''} + ${head.raw ? generateRawTags(head.raw) : ''} + ${head.scripts ? generateScriptTags(head.scripts) : ''} + ${miniHtmlWebpack.generateCSSReferences(css, publicPath)}`; + const footerStr = ` + ${body.raw ? generateRawTags(body.raw) : ''} + ${body.scripts ? generateScriptTags(body.scripts) : ''} + ${miniHtmlWebpack.generateJSReferences(js, publicPath)}`; + const doc = ctags.html(template({ + title, + description, + lang, + head: headStr, + footer: footerStr, + publicUrl: getPublicUrl(config, dev) + })); + return trimWhitespace ? ctags.oneLineTrim(doc) : emptyLineTrim(doc); +}; + +const assets = (config, args, env) => { + const isProd = env === 'production'; + const base = servedPath(args.base); + const publicPath = isProd ? base : '/'; + config.plugin('assets-plugin').use(manifestPlugin, [{ + publicPath, + fileName: 'assets.json' + }]); +}; +const analyzer = config => { + config.plugin('bundle-analyzer').use(webpackBundleAnalyzer.BundleAnalyzerPlugin, [{ + generateStatsFile: true, + openAnalyzer: false, + analyzerMode: 'static' + }]); +}; +const injections = (config, args, env) => { + const { + stringify + } = JSON; + const base = servedPath(args.base); + + const plugin = require('webpack/lib/DefinePlugin'); + + config.plugin('injections').use(plugin, [Object.assign({}, getClientEnvironment(base).stringified, { + NODE_ENV: stringify(env), + DOCZ_BASE_URL: stringify(base) + })]); +}; +const ignore = config => { + config.plugin('ignore-plugin').use(webpack.IgnorePlugin, [/(regenerate\-unicode\-properties)|(elliptic)/, /node_modules/]); +}; +const hot = config => { + config.plugin('hot-module-replacement').use(webpack.HotModuleReplacementPlugin, [{ + multiStep: true + }]); +}; +const html = async (config, args, env) => { + const dev = env !== 'production'; + const template = await htmlTemplate(args.indexHtml); + config.plugin('html-plugin').use(miniHtmlWebpack__default, [{ + context: Object.assign({}, args.htmlContext, { + trimWhitespace: true + }), + template: ctx => { + const doc = parseHtml({ + ctx, + dev, + template, + config: args + }); + return dev ? doc : htmlMinifier.minify(doc, { + removeComments: true, + collapseWhitespace: true, + removeRedundantAttributes: true, + useShortDoctype: true, + removeEmptyAttributes: true, + removeStyleLinkTypeAttributes: true, + keepClosingSlash: true, + minifyJS: true, + minifyCSS: true, + minifyURLs: true + }); + } + }]); +}; +const webpackBar = (config, args) => { + config.plugin('webpackbar').use(webpackBarPlugin, [{ + name: 'Docz', + color: '#41b883' + }]); +}; +const watchNodeModulesPlugin = config => { + config.plugin('watch-missing-node-modules').use(watchMissingNodeModules, [appNodeModules]); +}; + +const minifier = (config, args) => { + config.optimization.minimizer('js').use(TerserPlugin, [{ + terserOptions: { + parse: { + ecma: 8 + }, + compress: { + ecma: 5, + warnings: false, + comparisons: false + }, + mangle: { + safari10: true + }, + output: { + ecma: 5, + comments: false, + ascii_only: true + } + }, + parallel: true, + cache: !args.debug, + sourceMap: args.sourcemaps + }]); +}; + +const getBabelConfig = async (args, env, typescript) => { + const isProd = env === 'production'; + const isDev = env === 'development'; + const localBabelRc = loadCfg.load('babel', { + presets: [], + plugins: [] + }, false, true); + const presets = [[require.resolve('babel-preset-react-app'), { + typescript, + flow: !args.typescript + }]]; + const defaultPlugins = [[require.resolve('babel-plugin-export-metadata'), { + notUseSpecifiers: args.notUseSpecifiers + }], [require.resolve('babel-plugin-named-asset-import'), { + loaderMap: { + svg: { + ReactComponent: '@svgr/webpack?-prettier,-svgo![path]' + } + } + }]]; + + const config = _merge(localBabelRc, { + presets, + babelrc: false, + cacheCompression: args.debug ? false : isProd, + cacheDirectory: !args.debug, + cacheIdentifier: args.debug ? null : getCacheIdentifier(isProd ? 'production' : isDev && 'development', ['docz', 'docz-core']), + compact: isProd, + customize: require.resolve('babel-preset-react-app/webpack-overrides'), + plugins: defaultPlugins.concat(!isProd ? [require.resolve('react-hot-loader/babel')] : []) + }); + + const reduce = Plugin.reduceFromPlugins(args.plugins); + const newConfig = reduce('modifyBabelRc', config, args); + return args.modifyBabelRc(newConfig, args); +}; + +/* eslint-disable @typescript-eslint/camelcase */ +const createConfig = (args, env) => async hooks => { + const { + debug + } = args; + const config = new Config(); + const isProd = env === 'production'; + const base = servedPath(args.base); + const dist = getDist(args.dest); + const srcPath = path.resolve(root, args.src); + const publicPath = isProd ? base : '/'; + /** + * general + */ + + config.context(root); + config.set('mode', env); + config.when(args.sourcemaps, cfg => cfg.devtool(isProd ? 'source-map' : 'cheap-module-eval-source-map'), cfg => cfg.devtool(false)); + config.node.merge({ + child_process: 'empty', + dgram: 'empty', + fs: 'empty', + net: 'empty', + tls: 'empty' + }); + /** + * output + */ + + const outputProd = output => output.filename('static/js/[name].[hash].js').sourceMapFilename('static/js/[name].[hash].js.map').chunkFilename('static/js/[name].[chunkhash:8].js'); + + const outputDev = output => output.filename('static/js/[name].js').sourceMapFilename('static/js/[name].js.map'); + + config.output.pathinfo(true).path(path.resolve(root, dist)).publicPath(publicPath).when(isProd, outputProd, outputDev).crossOriginLoading('anonymous').devtoolModuleFilenameTemplate(info => path.resolve(info.resourcePath).replace(/\\/g, '/')); + /** + * entries + */ + + config.entry('app').when(!isProd, entry => entry.add(require.resolve('react-dev-utils/webpackHotDevClient'))).add(indexJs); + /** + * resolve + */ + + config.resolve.set('symlinks', true); + config.resolve.extensions.add('.web.js').add('.mjs').add('.js').add('.json').add('.web.jsx').add('.jsx').add('.mdx').end(); + config.resolve.alias.set('react-native$', 'react-native-web'); + + const inYarnWorkspaces = __dirname.includes('/docz/core/docz-core'); + + const doczDependenciesDir = inYarnWorkspaces ? path.join(__dirname, '../../../../node_modules') : ownNodeModules; + config.resolve.modules.add('node_modules').add(doczDependenciesDir).add(srcPath).add(root).merge(envDotProp.get('node.path').split(path.delimiter).filter(Boolean)); + config.resolveLoader.set('symlinks', true).modules // prioritize our own + .add('node_modules').add(doczDependenciesDir).add(root); + /** + * loaders + */ + + const jsBabelrc = await getBabelConfig(args, env); + const tsBabelrc = await getBabelConfig(args, env, true); + config.when(args.sourcemaps, cfg => sourceMaps(cfg, args)); + js(config, args, jsBabelrc); + mdx(config, args, jsBabelrc); + images(config); + svg(config); + media(config); + fonts(config); + await html(config, args, env); + assets(config, args, env); + ignore(config); + injections(config, args, env); + isProd && hot(config); + config.when(debug, cfg => analyzer(cfg)); + config.when(!isProd, cfg => watchNodeModulesPlugin(cfg)); + config.when(!debug && !isProd, cfg => webpackBar(cfg, args)); + /** + * typescript setup + */ + + config.when(args.typescript, cfg => { + cfg.resolve.extensions.prepend('.ts').prepend('.tsx').end(); + ts(cfg, args, tsBabelrc); + }); + /** + * optimization + */ + + config.optimization.nodeEnv(env).namedModules(true).minimize(isProd).splitChunks({ + cacheGroups: { + vendor: { + test: /[\\/]node_modules[\\/]/, + name: 'vendors', + chunks: 'all' + } + } + }); + config.performance.hints(false); + config.when(isProd, cfg => minifier(cfg, args)); + hooks.onCreateWebpackChain(config, !isProd, args); + args.onCreateWebpackChain(config, !isProd, args); + return config.toConfig(); +}; + +const devServerConfig = (hooks, args) => { + const srcPath = path.resolve(root, args.src); + const publicDir = path.resolve(root, args.public); + const nonExistentDir = path.resolve(__dirname, 'non-existent'); + return { + publicPath: '/', + compress: true, + logLevel: args.debug ? 'debug' : 'silent', + clientLogLevel: args.debug ? 'info' : 'none', + contentBase: [nonExistentDir], + watchContentBase: true, + hot: true, + quiet: !args.debug, + open: true, + watchOptions: { + ignored: ignoredFiles(srcPath) + }, + overlay: false, + host: args.host, + port: args.port, + historyApiFallback: { + disableDotRule: true + }, + disableHostCheck: true, + + before(app, server) { + app.use('/public', express.static(publicDir)); + app.use(evalSourceMapMiddleware(server)); + app.use(errorOverlayMiddleware()); + hooks.onPreCreateApp(app); + }, + + after(app) { + hooks.onCreateApp(app); + } + + }; +}; + +const useYarn = fs$1.existsSync(appYarnLock); +const server = args => async (config, hooks) => ({ + start: async () => { + const serverConfig = devServerConfig(hooks, args); + const protocol = process.env.HTTPS === 'true' ? 'https' : 'http'; + + const appName = require(packageJson).name; + + const useTypescript = args.typescript; + const urls = WebpackDevServerUtils.prepareUrls(protocol, args.host, args.port); + const devSocket = { + warnings: warnings => devServer.sockWrite(devServer.sockets, 'warnings', warnings), + errors: errors => devServer.sockWrite(devServer.sockets, 'errors', errors) + }; + const compiler = WebpackDevServerUtils.createCompiler({ + appName, + config, + devSocket, + urls, + useYarn, + useTypescript, + webpack: webpack__default + }); + const devServer = new WebpackDevServer(compiler, serverConfig); + return devServer.listen(args.port, args.host, err => { + if (err) return logger__default.fatal(err); + hooks.onServerListening(devServer); + }); + } +}); + +const FSR = require('react-dev-utils/FileSizeReporter'); + +const formatWebpackMessages = require('react-dev-utils/formatWebpackMessages'); +const { + measureFileSizesBeforeBuild, + printFileSizesAfterBuild +} = FSR; +const WARN_AFTER_BUNDLE_GZIP_SIZE = 512 * 1024; +const WARN_AFTER_CHUNK_GZIP_SIZE = 1024 * 1024; + +const hasCiEnvVar = () => envDotProp.get('ci', false, { + parse: true +}); + +const copyPublicFolder = async (dest, publicDir) => { + if (await fs.pathExists(publicDir)) { + await fs.copy(publicDir, distPublic(dest), { + dereference: true, + filter: file => file !== indexHtml + }); + } +}; + +const compile = config => new Promise((resolve, reject) => { + let compiler; + + try { + compiler = webpack__default(config); + } catch (err) { + onError(err); + } + + compiler && compiler.run((err, stats) => { + if (err) reject(err); + resolve(stats); + }); +}); + +const builder = async (config, previousFileSizes) => new Promise(async (resolve, reject) => { + try { + const stats = await compile(config); + const messages = formatWebpackMessages(stats.toJson({}, true)); + + if (messages.errors.length) { + return reject(new Error(messages.errors.join('\n\n'))); + } + + if (hasCiEnvVar() && messages.warnings.length) { + logger.warn('\nTreating warnings as errors because process.env.CI = true.\n' + 'Most CI servers set it automatically.\n'); + return reject(new Error(messages.warnings.join('\n\n'))); + } + + return resolve({ + stats, + previousFileSizes, + warnings: messages.warnings + }); + } catch (err) { + reject(err); + } +}); + +const onSuccess = (dist, { + stats, + previousFileSizes, + warnings +}) => { + if (warnings.length) { + logger.log(); + logger.warn('Compiled with warnings.\n'); + logger.warn(warnings.join('\n\n')); + logger.warn('\nSearch for the ' + chalk$1.underline(chalk$1.yellow('keywords')) + ' to learn more about each warning.'); + logger.warn('To ignore, add ' + chalk$1.cyan('// eslint-disable-next-line') + ' to the line before.\n'); + } + + logger.log(); + logger.log(`File sizes after gzip:\n`); + printFileSizesAfterBuild(stats, previousFileSizes, dist, WARN_AFTER_BUNDLE_GZIP_SIZE, WARN_AFTER_CHUNK_GZIP_SIZE); + logger.log(); +}; + +const onError = err => { + logger.log(); + logger.fatal(err); + process.exit(1); + logger.log(); +}; + +const build = async (config, dist, publicDir) => { + const interactive = new logger.Signale({ + interactive: true, + scope: 'build' + }); + + try { + interactive.start('Creating an optimized bundle'); + await fs.ensureDir(dist); + const previousFileSizes = await measureFileSizesBeforeBuild(dist); + await fs.emptyDir(dist); + await copyPublicFolder(dist, publicDir); + const result = await builder(config, previousFileSizes); + interactive.success('Build successfully created'); + onSuccess(dist, result); + } catch (err) { + logger.fatal(chalk$1.red('Failed to compile.\n')); + onError(err); + } +}; + +const bundler = (args, env) => new Bundler({ + args, + build, + config: createConfig(args, env), + server: server(args) +}); + +/** + * Copyright (c) 2015-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +var chalk = require('chalk'); + +var execSync = require('child_process').execSync; + +var spawn = require('cross-spawn'); + +var opn = require('opn'); // https://github.com/sindresorhus/opn#app + + +var OSX_CHROME = 'google chrome'; +const Actions = Object.freeze({ + NONE: 0, + BROWSER: 1, + SCRIPT: 2 +}); + +function getBrowserEnv() { + // Attempt to honor this environment variable. + // It is specific to the operating system. + // See https://github.com/sindresorhus/opn#app for documentation. + const value = process.env.BROWSER; + let action; + + if (!value) { + // Default. + action = Actions.BROWSER; + } else if (value.toLowerCase().endsWith('.js')) { + action = Actions.SCRIPT; + } else if (value.toLowerCase() === 'none') { + action = Actions.NONE; + } else { + action = Actions.BROWSER; + } + + return { + action, + value + }; +} + +function executeNodeScript(scriptPath, url) { + const extraArgs = process.argv.slice(2); + const child = spawn('node', [scriptPath, ...extraArgs, url], { + stdio: 'inherit' + }); + child.on('close', code => { + if (code !== 0) { + console.log(); + console.log(chalk.red('The script specified as BROWSER environment variable failed.')); + console.log(chalk.cyan(scriptPath) + ' exited with code ' + code + '.'); + console.log(); + return; + } + }); + return true; +} + +function startBrowserProcess(browser, url) { + // If we're on OS X, the user hasn't specifically + // requested a different browser, we can try opening + // Chrome with AppleScript. This lets us reuse an + // existing tab when possible instead of creating a new one. + const shouldTryOpenChromeWithAppleScript = process.platform === 'darwin' && (typeof browser !== 'string' || browser === OSX_CHROME); + + if (shouldTryOpenChromeWithAppleScript) { + try { + // Try our best to reuse existing tab + // on OS X Google Chrome with AppleScript + execSync('ps cax | grep "Google Chrome"'); + execSync('osascript openChrome.applescript "' + encodeURI(url) + '"', { + cwd: __dirname, + stdio: 'ignore' + }); + return true; + } catch (err) {// Ignore errors. + } + } // Another special case: on OS X, check if BROWSER has been set to "open". + // In this case, instead of passing `open` to `opn` (which won't work), + // just ignore it (thus ensuring the intended behavior, i.e. opening the system browser): + // https://github.com/facebook/create-react-app/pull/1690#issuecomment-283518768 + + + if (process.platform === 'darwin' && browser === 'open') { + browser = undefined; + } // Fallback to opn + // (It will always open new tab) + + + try { + var options = { + app: browser, + wait: false + }; + opn(url, options).catch(() => {}); // Prevent `unhandledRejection` error. + + return true; + } catch (err) { + return false; + } +} +/** + * Reads the BROWSER environment variable and decides what to do with it. Returns + * true if it opened a browser or ran a node.js script, otherwise false. + */ + + +function openBrowser(url) { + const { + action, + value + } = getBrowserEnv(); + + switch (action) { + case Actions.NONE: + // Special case: BROWSER="none" will prevent opening completely. + return false; + + case Actions.SCRIPT: + return executeNodeScript(value, url); + + case Actions.BROWSER: + return startBrowserProcess(value, url); + + default: + throw new Error('Not implemented.'); + } +} + +const mapToArray = (map = []) => Object.entries(map).map(entry => entry && { + key: entry[0], + value: entry[1] +}).filter(Boolean); + +const updateEntries = entries => async p => { + const prev = _get('entries', p.getState()); + + const map = await entries.get(); + + if (map && !equal(prev, map)) { + await Entries.writeImports(map); + p.setState('entries', mapToArray(map)); + } +}; + +const state = (entries, config, dev) => { + const src = path.relative(root, config.src); + const files = Array.isArray(config.files) ? config.files.map(filePath => path.join(src, filePath)) : path.join(src, config.files); + const ignored = config.watchIgnore || /(((^|[\/\\])\..+)|(node_modules))/; + const watcher = chokidar.watch(files, { + cwd: root, + ignored, + persistent: true + }); + watcher.setMaxListeners(Infinity); + return { + id: 'entries', + start: async params => { + const update = updateEntries(entries); + await update(params); + + if (dev) { + watcher.on('add', async () => update(params)); + watcher.on('change', async () => update(params)); + watcher.on('unlink', async () => update(params)); + watcher.on('raw', async (event, path, details) => { + if (details.event === 'moved' && details.type === 'directory') { + await update(params); + } + }); + } + }, + close: () => { + watcher.close(); + } + }; +}; + +const getInitialConfig = config => { + const pkg = fs.readJsonSync(appPackageJson, { + throws: false + }); + const repoUrl = getRepoUrl(); + return { + title: config.title, + description: config.description, + menu: config.menu, + version: get(pkg, 'version'), + repository: repoUrl, + native: config.native, + codeSandbox: config.codeSandbox, + themeConfig: config.themeConfig, + separator: config.separator + }; +}; + +const update = async (params, initial, { + config +}) => { + const next = config ? loadCfg.loadFrom(path.resolve(config), initial, true, true) : loadCfg.load('docz', initial, true, true); + params.setState('config', next); +}; + +const state$1 = (config, dev) => { + const initial = getInitialConfig(config); + const glob = config.config || loadCfg.finds('docz'); + const ignored = config.watchIgnore || /(((^|[\/\\])\..+)|(node_modules))/; + const watcher = chokidar.watch(glob, { + cwd: root, + ignored, + persistent: true + }); + watcher.setMaxListeners(Infinity); + return { + id: 'config', + start: async params => { + const fn = async () => update(params, initial, config); + + await update(params, initial, config); + + if (dev) { + watcher.on('add', fn); + watcher.on('change', fn); + watcher.on('unlink', fn); + } + }, + close: () => { + watcher.close(); + } + }; +}; + +const throwError = err => { + logger__default.fatal(`Error parsing static types`); + logger__default.error(err); +}; + +const jsParser = (files, config) => { + const resolver = config.docgenConfig.resolver || reactDocgen.resolver.findAllExportedComponentDefinitions; + + const parseFilepathProps = filepath => { + const handlers = reactDocgen.defaultHandlers.concat([externalProptypesHandler(filepath), actualNameHandler]); + + try { + const code = fs.readFileSync(filepath, 'utf-8'); + const props = reactDocgen.parse(code, resolver, handlers); + return { + key: path.normalize(filepath), + value: props + }; + } catch (err) { + if (config.debug) throwError(err); + return null; + } + }; + + return files.map(parseFilepathProps).filter(Boolean); +}; + +const digest = str => crypto.createHash('md5').update(str).digest('hex'); + +const cacheFilepath = path.join(cache, 'propsParser.json'); + +const readCacheFile = () => fs.readJSONSync(cacheFilepath, { + throws: false +}); + +function checkFilesOnCache(files) { + const cache = readCacheFile(); + if (_isEmpty(cache)) return files; + return files.filter(filepath => { + const normalized = path.normalize(filepath); + const hash = digest(fs.readFileSync(normalized, 'utf-8')); + + const found = _get(normalized, cache); + + return found && hash !== found.hash; + }); +} + +function writePropsOnCache(items) { + const cache = readCacheFile(); + const newCache = items.reduce((obj, { + key: filepath, + value + }) => { + const normalized = path.normalize(filepath); + const hash = digest(fs.readFileSync(normalized, 'utf-8')); + return Object.assign({}, obj, { + [normalized]: { + hash, + props: value + } + }); + }, {}); + fs.outputJSONSync(cacheFilepath, Object.assign({}, cache, newCache)); +} + +function getPropsOnCache() { + const cache = readCacheFile(); + + if (_isEmpty(cache)) { + logger.warn('Any cache was found with your props definitions'); + logger.warn("We'll parse your components to get props from them"); + logger.warn('Depending on your components, this could take while...'); + return []; + } + + return Object.entries(cache).map(([key, value]) => ({ + key, + value: _get('props', value) + })); +} + +const mergeWithCache = (cache, props) => { + const keys = props.map(_prop('key')); + return cache.filter(item => !_contains(item.key, keys)).concat(props); +}; + +const removeFromCache = filepath => { + const cache = readCacheFile(); + fs.outputJSONSync(cacheFilepath, _omit(filepath, cache)); +}; + +const getInitialFilesMap = () => { + const cache = readCacheFile(); + if (_isEmpty(cache)) return new Map(); + const map = new Map(); + + _entries(cache).forEach(([filepath]) => { + const exist = fs.pathExistsSync(filepath); + + if (!exist) { + removeFromCache(filepath); + } else { + map.set(filepath, { + text: fs.readFileSync(filepath, 'utf-8'), + version: 0 + }); + } + }); + + return map; +}; + +let languageService = null; +const filesMap = getInitialFilesMap(); + +function getTSConfigFile(tsconfigPath) { + const basePath = path.dirname(tsconfigPath); + const configFile = ts$1.readConfigFile(tsconfigPath, ts$1.sys.readFile); + return ts$1.parseJsonConfigFileContent(configFile.config, ts$1.sys, basePath, {}, tsconfigPath); +} + +function loadFiles(filesToLoad) { + filesToLoad.forEach(filepath => { + const normalized = path.normalize(filepath); + const found = filesMap.get(normalized); + filesMap.set(normalized, { + text: fs.readFileSync(normalized, 'utf-8'), + version: found ? found.version + 1 : 0 + }); + }); +} + +function createServiceHost(compilerOptions, files) { + return { + getScriptFileNames: () => { + return [...files.keys()]; + }, + getScriptVersion: fileName => { + const file = files.get(fileName); + return file && file.version.toString() || ''; + }, + getScriptSnapshot: fileName => { + if (!fs.existsSync(fileName)) { + return undefined; + } + + let file = files.get(fileName); + + if (file === undefined) { + const text = fs.readFileSync(fileName).toString(); + file = { + version: 0, + text + }; + files.set(fileName, file); + } + + return ts$1.ScriptSnapshot.fromString(file.text); + }, + getCurrentDirectory: () => process.cwd(), + getCompilationSettings: () => compilerOptions, + getDefaultLibFileName: options => ts$1.getDefaultLibFilePath(options), + fileExists: ts$1.sys.fileExists, + readFile: ts$1.sys.readFile, + readDirectory: ts$1.sys.readDirectory + }; +} + +const parseFiles = (files, config, tsconfig) => { + const opts = { + propFilter(prop) { + if (prop.parent == null) return true; + const propFilter = config.docgenConfig.propFilter; + const val = propFilter && _isFunction(propFilter) && propFilter(prop); + return !prop.parent.fileName.includes('node_modules') || Boolean(val); + }, + + componentNameResolver(exp, source) { + const componentNameResolver = config.docgenConfig.resolver; + const val = componentNameResolver && _isFunction(componentNameResolver) && componentNameResolver(exp, source); + return val; + } + + }; + loadFiles(files); + const parser = reactDocgenTs.withCustomConfig(tsconfig, opts); + + const compilerOptions = _get('options', getTSConfigFile(tsconfig)); + + const programProvider = () => { + if (languageService) return languageService.getProgram(); + const servicesHost = createServiceHost(compilerOptions, filesMap); + const documentRegistry = ts$1.createDocumentRegistry(); + languageService = ts$1.createLanguageService(servicesHost, documentRegistry); + return languageService.getProgram(); + }; + + return files.map(filepath => ({ + key: path.normalize(filepath), + value: parser.parseWithProgramProvider(filepath, programProvider) + })); +}; + +const tsParser = (files, config, tsconfig) => { + if (!tsconfig) return null; + const filesToLoad = checkFilesOnCache(files); + const propsOnCache = getPropsOnCache(); + if (!filesToLoad.length) return propsOnCache; + const next = parseFiles(filesToLoad, config, tsconfig); + writePropsOnCache(next); + return mergeWithCache(propsOnCache, next); +}; + +const docgen = async (files, config) => { + const tsconfig = await findup('tsconfig.json', { + cwd: root + }); + return config.typescript ? tsParser(files, config, tsconfig) : jsParser(files, config); +}; + +const getPattern = config => { + const { + ignore, + src: source, + typescript: ts, + docgenConfig: docgenConfig + } = config; + const src = path.relative(root, docgenConfig.searchPath ? docgenConfig.searchPath : source); + return ignore.map(entry => `!**/${entry}`).concat([path.join(src, ts ? '**/*.{ts,tsx}' : '**/*.{js,jsx,mjs}'), '!**/node_modules', '!**/doczrc.js']); +}; + +const removeFilepath = (items, filepath) => items.filter(item => item.key !== filepath); + +const initial = (config, pattern) => async p => { + const { + filterComponents + } = config; + const files = await glob(pattern, { + cwd: root + }); + const filtered = filterComponents ? filterComponents(files) : files; + const metadata = await docgen(filtered, config); + p.setState('props', metadata); +}; + +const change = (p, config) => async filepath => { + const prev = _get('props', p.getState()); + + const metadata = await docgen([filepath], config); + const filtered = metadata.filter(_propEq('key', filepath)); + const next = removeFilepath(prev, filepath).concat(filtered); + p.setState('props', next); +}; + +const remove = p => async filepath => { + const prev = _get('props', p.getState()); + + const next = removeFilepath(prev, filepath); + p.setState('props', next); +}; + +const state$2 = (config, dev) => { + const pattern = getPattern(config); + const ignored = config.watchIgnore || /(((^|[\/\\])\..+)|(node_modules))/; + const watcher = chokidar.watch(pattern, { + cwd: root, + ignored, + persistent: true + }); + watcher.setMaxListeners(Infinity); + return { + id: 'props', + start: async params => { + const addInitial = initial(config, pattern); + await addInitial(params); + + if (dev) { + watcher.on('change', change(params, config)); + watcher.on('unlink', remove(params)); + } + }, + close: () => { + watcher.close(); + } + }; +}; + + + +var index = /*#__PURE__*/Object.freeze({ + entries: state, + config: state$1, + props: state$2 +}); + +process.setMaxListeners(Infinity); +const dev = async args => { + const env = envDotProp.get('node.env'); + const config = await parseConfig(args); + const bundler$1 = bundler(config, env); + const entries = new Entries(config); + const { + websocketHost, + websocketPort + } = config; + const bundlerConfig = await bundler$1.mountConfig(env); + const app = await bundler$1.createApp(bundlerConfig); + + try { + await Entries.writeApp(config, true); + await Entries.writeImports((await entries.get())); + } catch (err) { + logger.fatal('Failed to build your files'); + logger.error(err); + process.exit(1); + } + + const server = await app.start(); + const dataServer = new DataServer(); + const socket = new Socket(server, websocketHost, websocketPort); + if (config.propsParser) dataServer.register([state$2(config, true)]); + dataServer.register([state$1(config, true), state(entries, config, true)]); + + try { + await dataServer.start(); + if (args.open || args.o) openBrowser(`http://${config.host}:${config.port}`); + } catch (err) { + logger.fatal('Failed to process data server'); + logger.error(err); + dataServer.close(); + process.exit(1); + } + + socket.onConnection((_, emit) => { + const subscribe = dataServer.onStateChange(action => { + emit(action.type, action.payload); + }); + return () => subscribe(); + }); + onSignal(async () => { + dataServer.close(); + server.close(); + }); + server.on('close', async () => { + dataServer.close(); + }); +}; + +const build$1 = async args => { + const env = envDotProp.get('node.env'); + const config = await parseConfig(args); + const entries = new Entries(config); + const bundler$1 = bundler(config, env); + const bundlerConfig = await bundler$1.mountConfig(env); + const run = Plugin.runPluginsMethod(config.plugins); + const dataServer = new DataServer(); + if (config.propsParser) dataServer.register([state$2(config)]); + dataServer.register([state$1(config), state(entries, config)]); + + try { + await Entries.writeApp(config, false); + await Entries.writeImports((await entries.get())); + await dataServer.start(); + await run('onPreBuild', config); + await bundler$1.build(bundlerConfig); + await run('onPostBuild', config); + dataServer.close(); + } catch (err) { + logger.error(err); + process.exit(1); + dataServer.close(); + } +}; + +const serve = async args => { + const config = await parseConfig(args); + const dist = getDist(config.dest); + spawn$1.sync('serve', ['-s', dist], { + stdio: 'inherit' + }); +}; + +const cli = () => { + return yargs.command('dev', 'initialize docz dev server', setArgs, async args => { + setEnv('development'); + await dev(args); + }).command('build', 'build dir as static site', setArgs, async args => { + setEnv('production'); + await build$1(args); + process.exit(); + }).command('serve', 'serve dir as static site', setArgs, async args => { + setEnv('production'); + await build$1(args); + await serve(args); + process.exit(); + }).demandCommand().help().wrap(72).epilog('for more information visit https://github.com/pedronauck/docz').showHelpOnFail(false, 'whoops, something went wrong! run with --help').argv; +}; + +/** cli exports */ + +exports.DataServer = DataServer; +exports.Entries = Entries; +exports.Entry = Entry; +exports.Plugin = Plugin; +exports.cli = cli; +exports.createPlugin = createPlugin; +exports.getBaseConfig = getBaseConfig; +exports.parseConfig = parseConfig; +exports.setArgs = setArgs; +exports.states = index; diff --git a/docs/docz-lib/docz-core/dist/lib/Bundler.d.ts b/docs/docz-lib/docz-core/dist/lib/Bundler.d.ts new file mode 100644 index 000000000..227c18faf --- /dev/null +++ b/docs/docz-lib/docz-core/dist/lib/Bundler.d.ts @@ -0,0 +1,35 @@ +/// +import * as http from 'http'; +import { Config as Args, Env } from '../config/argv'; +export interface ServerHooks { + onCreateWebpackChain(config: C, dev: boolean, args: Args): void; + onPreCreateApp(app: A): void; + onCreateApp(app: A): void; + onServerListening(server: S): void; +} +export interface BundlerServer { + start(): Promise; +} +export declare type ConfigFn = (hooks: ServerHooks) => Promise; +export declare type BuildFn = (config: C, dist: string, publicDir: string) => void; +export declare type ServerFn = (config: C, hooks: ServerHooks) => BundlerServer | Promise; +export interface BundlerConstructor { + args: Args; + config: ConfigFn; + server: ServerFn; + build: BuildFn; +} +export interface ConfigObj { + [key: string]: any; +} +export declare class Bundler { + private readonly args; + private config; + private server; + private builder; + private hooks; + constructor(params: BundlerConstructor); + mountConfig(env: Env): Promise; + createApp(config: C): Promise; + build(config: C): Promise; +} diff --git a/docs/docz-lib/docz-core/dist/lib/DataServer.d.ts b/docs/docz-lib/docz-core/dist/lib/DataServer.d.ts new file mode 100644 index 000000000..2fec3af96 --- /dev/null +++ b/docs/docz-lib/docz-core/dist/lib/DataServer.d.ts @@ -0,0 +1,28 @@ +export interface Params { + getState: () => Record; + setState: (key: string, val: any) => void; +} +export interface State { + id: string; + start: (params: Params) => Promise; + close: () => void; +} +export interface Action { + type: string; + payload: any; +} +export declare type Listener = (action: Action) => void; +export declare class DataServer { + private states; + private state; + private listeners; + constructor(); + register(states: State[]): DataServer; + start(): Promise; + close(): void; + onStateChange(listener: Listener): () => void; + getState(): Map; + private setState; + private writeDbFile; + private mapToObject; +} diff --git a/docs/docz-lib/docz-core/dist/lib/Entries.d.ts b/docs/docz-lib/docz-core/dist/lib/Entries.d.ts new file mode 100644 index 000000000..9b7cc16b8 --- /dev/null +++ b/docs/docz-lib/docz-core/dist/lib/Entries.d.ts @@ -0,0 +1,13 @@ +import { EntryObj } from './Entry'; +import { Config } from '../config/argv'; +export declare const fromTemplates: (file: string) => string; +export declare type EntryMap = Record; +export declare class Entries { + static writeApp(config: Config, dev: boolean): Promise; + static writeImports(map: EntryMap): Promise; + all: Map; + get: () => Promise; + repoEditUrl: string | null; + constructor(config: Config); + private getMap; +} diff --git a/docs/docz-lib/docz-core/dist/lib/Entry.d.ts b/docs/docz-lib/docz-core/dist/lib/Entry.d.ts new file mode 100644 index 000000000..a9dc79098 --- /dev/null +++ b/docs/docz-lib/docz-core/dist/lib/Entry.d.ts @@ -0,0 +1,33 @@ +import { Heading } from 'docz-utils/lib/mdast'; +import { Config } from '../config/argv'; +export interface EntryObj { + id: string; + filepath: string; + link: string | null; + slug: string; + name: string; + route: string; + menu: string | null; + headings: Heading[]; + [key: string]: any; +} +export declare class Entry { + readonly [key: string]: any; + id: string; + filepath: string; + link: string | null; + slug: string; + route: string; + name: string; + menu: string | null; + headings: Heading[]; + settings: { + [key: string]: any; + }; + constructor(ast: any, file: string, src: string, config: Config); + setLink(url: string): void; + private getFilepath; + private getName; + private slugify; + private getRoute; +} diff --git a/docs/docz-lib/docz-core/dist/lib/Plugin.d.ts b/docs/docz-lib/docz-core/dist/lib/Plugin.d.ts new file mode 100644 index 000000000..9c6917c40 --- /dev/null +++ b/docs/docz-lib/docz-core/dist/lib/Plugin.d.ts @@ -0,0 +1,49 @@ +import WebpackChainConfig from 'webpack-chain'; +import { Config } from '../config/argv'; +import { BabelRC } from '../config/babel'; +export declare type SetConfig = (config: Config) => Config | Promise; +export declare type ModifyBundlerConfig = (config: C, dev: boolean, args: Config) => C; +export declare type ModifyBabelRC = (babelrc: BabelRC, args: Config) => BabelRC; +export declare type ModifyFiles = (files: string[], args: Config) => string[]; +export declare type OnCreateWebpackChain = (config: WebpackChainConfig, dev: boolean, args: Config) => void; +export declare type onPreCreateApp = (app: A) => void; +export declare type onCreateApp = (app: A) => void; +export declare type OnServerListening = (server: S) => void; +export declare type OnPreBuild = (args: Config) => void; +export declare type OnPostBuild = (args: Config) => void; +export declare type OnPreRender = () => void; +export declare type OnPostRender = () => void; +export interface PluginFactory { + setConfig?: SetConfig; + modifyBundlerConfig?: ModifyBundlerConfig; + modifyBabelRc?: ModifyBabelRC; + modifyFiles?: ModifyFiles; + onCreateWebpackChain?: OnCreateWebpackChain; + onPreCreateApp?: onPreCreateApp; + onCreateApp?: onCreateApp; + onServerListening?: OnServerListening; + onPreBuild?: OnPreBuild; + onPostBuild?: OnPostBuild; + onPreRender?: OnPreRender; + onPostRender?: OnPostRender; +} +export declare class Plugin implements PluginFactory { + static runPluginsMethod(plugins: Plugin[] | undefined): (method: keyof Plugin, ...args: any[]) => void; + static propsOfPlugins(plugins: Plugin[]): (prop: keyof Plugin) => any[]; + static reduceFromPlugins(plugins: Plugin[] | undefined): (method: keyof Plugin, initial: C, ...args: any[]) => C; + static reduceFromPluginsAsync(plugins: Plugin[] | undefined): (method: keyof Plugin, initial: C, ...args: any[]) => Promise; + readonly setConfig?: SetConfig; + readonly modifyBundlerConfig?: ModifyBundlerConfig; + readonly modifyBabelRc?: ModifyBabelRC; + readonly modifyFiles?: ModifyFiles; + readonly onCreateWebpackChain?: OnCreateWebpackChain; + readonly onPreCreateApp?: onPreCreateApp; + readonly onCreateApp?: onCreateApp; + readonly onServerListening?: OnServerListening; + readonly onPreBuild?: OnPreBuild; + readonly onPostBuild?: OnPostBuild; + readonly onPreRender?: OnPreRender; + readonly onPostRender?: OnPostRender; + constructor(p: PluginFactory); +} +export declare function createPlugin(factory: PluginFactory): Plugin; diff --git a/docs/docz-lib/docz-core/dist/lib/Socket.d.ts b/docs/docz-lib/docz-core/dist/lib/Socket.d.ts new file mode 100644 index 000000000..d4254ff6a --- /dev/null +++ b/docs/docz-lib/docz-core/dist/lib/Socket.d.ts @@ -0,0 +1,8 @@ +import WS from 'ws'; +export declare type Send = (type: string, payload: any) => void; +export declare type On = (type: string) => Promise; +export declare class Socket { + private client?; + constructor(server?: any, host?: string, port?: number); + onConnection(listener: (socket: WS, emit: Send) => () => void): void; +} diff --git a/docs/docz-lib/docz-core/dist/states/config.d.ts b/docs/docz-lib/docz-core/dist/states/config.d.ts new file mode 100644 index 000000000..c2205d595 --- /dev/null +++ b/docs/docz-lib/docz-core/dist/states/config.d.ts @@ -0,0 +1,3 @@ +import { State } from '../lib/DataServer'; +import { Config } from '../config/argv'; +export declare const state: (config: Config, dev?: boolean | undefined) => State; diff --git a/docs/docz-lib/docz-core/dist/states/entries.d.ts b/docs/docz-lib/docz-core/dist/states/entries.d.ts new file mode 100644 index 000000000..cc04acd92 --- /dev/null +++ b/docs/docz-lib/docz-core/dist/states/entries.d.ts @@ -0,0 +1,4 @@ +import { State } from '../lib/DataServer'; +import { Entries } from '../lib/Entries'; +import { Config } from '../config/argv'; +export declare const state: (entries: Entries, config: Config, dev?: boolean | undefined) => State; diff --git a/docs/docz-lib/docz-core/dist/states/index.d.ts b/docs/docz-lib/docz-core/dist/states/index.d.ts new file mode 100644 index 000000000..36f20b5cc --- /dev/null +++ b/docs/docz-lib/docz-core/dist/states/index.d.ts @@ -0,0 +1,3 @@ +export { state as entries } from './entries'; +export { state as config } from './config'; +export { state as props } from './props'; diff --git a/docs/docz-lib/docz-core/dist/states/props.d.ts b/docs/docz-lib/docz-core/dist/states/props.d.ts new file mode 100644 index 000000000..c2205d595 --- /dev/null +++ b/docs/docz-lib/docz-core/dist/states/props.d.ts @@ -0,0 +1,3 @@ +import { State } from '../lib/DataServer'; +import { Config } from '../config/argv'; +export declare const state: (config: Config, dev?: boolean | undefined) => State; diff --git a/docs/docz-lib/docz-core/dist/templates/imports.tpl.js b/docs/docz-lib/docz-core/dist/templates/imports.tpl.js new file mode 100644 index 000000000..a5111798d --- /dev/null +++ b/docs/docz-lib/docz-core/dist/templates/imports.tpl.js @@ -0,0 +1,4 @@ +export const imports = { + <% entries.forEach(function(entry) { %>'<%- entry.filepath %>': () => + import(/* webpackPrefetch: true, webpackChunkName: "<%- entry.slug %>" */ '<%- entry.filepath %>'),<% }) %> +} diff --git a/docs/docz-lib/docz-core/dist/templates/index.tpl.html b/docs/docz-lib/docz-core/dist/templates/index.tpl.html new file mode 100644 index 000000000..fdb737c9a --- /dev/null +++ b/docs/docz-lib/docz-core/dist/templates/index.tpl.html @@ -0,0 +1,15 @@ + + + + + + + + {{ title }} + {{ head }} + + +
+ {{ footer }} + + diff --git a/docs/docz-lib/docz-core/dist/templates/index.tpl.js b/docs/docz-lib/docz-core/dist/templates/index.tpl.js new file mode 100644 index 000000000..a828a1acd --- /dev/null +++ b/docs/docz-lib/docz-core/dist/templates/index.tpl.js @@ -0,0 +1,17 @@ +import React from 'react' +import ReactDOM from 'react-dom' +import Root from './root' + +const _onPreRenders = [<% if (onPreRenders) {%><%- onPreRenders %><%}%>] +const _onPostRenders = [<% if (onPostRenders) {%><%- onPostRenders %><%}%>] + +const onPreRender = () => _onPreRenders.forEach(f => f && f()) +const onPostRender = () => _onPostRenders.forEach(f => f && f()) + +const root = document.querySelector('#root') +const render = (Component = Root) => { + onPreRender() + ReactDOM.render(, root, onPostRender) +} + +render(Root) diff --git a/docs/docz-lib/docz-core/dist/templates/root.tpl.js b/docs/docz-lib/docz-core/dist/templates/root.tpl.js new file mode 100644 index 000000000..596c5efaf --- /dev/null +++ b/docs/docz-lib/docz-core/dist/templates/root.tpl.js @@ -0,0 +1,24 @@ +import React from 'react' +import { Link, Router, Routes<% if (!isProd) {%>, useDataServer<%}%> } from '../../docz-lib/docz/dist' +<% if (!isProd) {%>import { hot } from 'react-hot-loader'<%}%> +import Theme from '<%- theme %>' + +import { imports } from './imports' +import database from './db.json' +<% if (wrapper) {%>import Wrapper from '<%- wrapper %>'<%}%> + +const Root = () => { + <% if (!isProd && websocketUrl) {%>useDataServer('<%- websocketUrl %>')<%}%> + return ( + wrapper={Wrapper}<%}%> + linkComponent={Link} + db={database} + > + + + ) +} + +<% if (!isProd) {%>export default hot(module)(Root)<%}%> +<% if (isProd) {%>export default Root<%}%> diff --git a/docs/docz-lib/docz-core/dist/utils/docgen/index.d.ts b/docs/docz-lib/docz-core/dist/utils/docgen/index.d.ts new file mode 100644 index 000000000..722373165 --- /dev/null +++ b/docs/docz-lib/docz-core/dist/utils/docgen/index.d.ts @@ -0,0 +1,2 @@ +import { Config } from '../../config/argv'; +export declare const docgen: (files: string[], config: Config) => Promise; diff --git a/docs/docz-lib/docz-core/dist/utils/docgen/javascript.d.ts b/docs/docz-lib/docz-core/dist/utils/docgen/javascript.d.ts new file mode 100644 index 000000000..e1ff6e3f8 --- /dev/null +++ b/docs/docz-lib/docz-core/dist/utils/docgen/javascript.d.ts @@ -0,0 +1,5 @@ +import { Config } from '../../config/argv'; +export declare const jsParser: (files: string[], config: Config) => ({ + key: string; + value: any; +} | null)[]; diff --git a/docs/docz-lib/docz-core/dist/utils/docgen/typescript.d.ts b/docs/docz-lib/docz-core/dist/utils/docgen/typescript.d.ts new file mode 100644 index 000000000..72a9e07ef --- /dev/null +++ b/docs/docz-lib/docz-core/dist/utils/docgen/typescript.d.ts @@ -0,0 +1,6 @@ +import { Config } from '../../config/argv'; +export interface TSFile { + text?: string; + version: number; +} +export declare const tsParser: (files: string[], config: Config, tsconfig?: string | undefined) => any; diff --git a/docs/docz-lib/docz-core/dist/utils/on-signal.d.ts b/docs/docz-lib/docz-core/dist/utils/on-signal.d.ts new file mode 100644 index 000000000..e1a70b46b --- /dev/null +++ b/docs/docz-lib/docz-core/dist/utils/on-signal.d.ts @@ -0,0 +1 @@ +export declare const onSignal: (cb: () => any) => void; diff --git a/docs/docz-lib/docz-core/dist/utils/open-browser.d.ts b/docs/docz-lib/docz-core/dist/utils/open-browser.d.ts new file mode 100644 index 000000000..04e169f74 --- /dev/null +++ b/docs/docz-lib/docz-core/dist/utils/open-browser.d.ts @@ -0,0 +1,11 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +/** + * Reads the BROWSER environment variable and decides what to do with it. Returns + * true if it opened a browser or ran a node.js script, otherwise false. + */ +export declare function openBrowser(url: any): boolean; diff --git a/docs/docz-lib/docz-core/dist/utils/parse-html.d.ts b/docs/docz-lib/docz-core/dist/utils/parse-html.d.ts new file mode 100644 index 000000000..aa74032bf --- /dev/null +++ b/docs/docz-lib/docz-core/dist/utils/parse-html.d.ts @@ -0,0 +1,11 @@ +import { Config } from '../config/argv'; +export declare type tagsTemplate = (type: string) => string; +export declare const htmlTemplate: (indexHtml: string | undefined) => Promise<(data: any) => string>; +interface ParseHtmlParams { + config: Config; + ctx: Record; + dev: boolean; + template: (props: Record) => string; +} +export declare const parseHtml: ({ config, ctx, dev, template }: ParseHtmlParams) => any; +export {}; diff --git a/docs/docz-lib/docz-core/dist/utils/repo-info.d.ts b/docs/docz-lib/docz-core/dist/utils/repo-info.d.ts new file mode 100644 index 000000000..916ee05ef --- /dev/null +++ b/docs/docz-lib/docz-core/dist/utils/repo-info.d.ts @@ -0,0 +1,3 @@ +export declare const parseRepo: () => any; +export declare const getRepoUrl: () => any; +export declare const getRepoEditUrl: (src: string, branch: string) => string | null; diff --git a/docs/docz-lib/docz/bin/index.js b/docs/docz-lib/docz/bin/index.js new file mode 100755 index 000000000..044994a83 --- /dev/null +++ b/docs/docz-lib/docz/bin/index.js @@ -0,0 +1,2 @@ +#!/usr/bin/env nodejs +require('../../docz-core/dist/index.js').cli() diff --git a/docs/docz-lib/docz/dist/Playground.esm.js b/docs/docz-lib/docz/dist/Playground.esm.js new file mode 100644 index 000000000..382066e11 --- /dev/null +++ b/docs/docz-lib/docz/dist/Playground.esm.js @@ -0,0 +1,42 @@ +import { createElement } from 'react'; +import 'lodash/fp/get'; +import { b as useComponents } from './chunk.esm.js'; +import 'lodash/fp/omit'; +import 'fast-deep-equal'; +import 'lodash/fp/merge'; +import 'array-sort'; +import 'lodash/fp/unionBy'; +import 'lodash/fp/flattenDepth'; +import 'lodash/fp/pipe'; +import 'ulid'; +import 'match-sorter'; +import 'lodash/fp/throttle'; + +const Playground = ({ + className, + style, + wrapper: Wrapper, + children, + __scope, + __position, + __code, + __codesandbox +}) => { + const components = useComponents(); + if (!components || !components.playground) return null; + const props = { + className, + style, + components + }; + return createElement(components.playground, Object.assign({}, props, { + component: children, + wrapper: Wrapper, + scope: __scope, + position: __position, + code: __code, + codesandbox: __codesandbox + })); +}; + +export default Playground; diff --git a/docs/docz-lib/docz/dist/Playground.js b/docs/docz-lib/docz/dist/Playground.js new file mode 100644 index 000000000..82ed23ff5 --- /dev/null +++ b/docs/docz-lib/docz/dist/Playground.js @@ -0,0 +1,44 @@ +'use strict'; + +var React = require('react'); +require('lodash/fp/get'); +var __chunk_1 = require('./chunk.js'); +require('lodash/fp/omit'); +require('fast-deep-equal'); +require('lodash/fp/merge'); +require('array-sort'); +require('lodash/fp/unionBy'); +require('lodash/fp/flattenDepth'); +require('lodash/fp/pipe'); +require('ulid'); +require('match-sorter'); +require('lodash/fp/throttle'); + +const Playground = ({ + className, + style, + wrapper: Wrapper, + children, + __scope, + __position, + __code, + __codesandbox +}) => { + const components = __chunk_1.useComponents(); + if (!components || !components.playground) return null; + const props = { + className, + style, + components + }; + return React.createElement(components.playground, Object.assign({}, props, { + component: children, + wrapper: Wrapper, + scope: __scope, + position: __position, + code: __code, + codesandbox: __codesandbox + })); +}; + +exports.default = Playground; diff --git a/docs/docz-lib/docz/dist/chunk.esm.js b/docs/docz-lib/docz/dist/chunk.esm.js new file mode 100644 index 000000000..d9ea02cd1 --- /dev/null +++ b/docs/docz-lib/docz/dist/chunk.esm.js @@ -0,0 +1,311 @@ +import { createContext, createElement, useContext, Fragment, Component, useEffect, useMemo, useRef, useState } from 'react'; +import _get from 'lodash/fp/get'; +import _omit from 'lodash/fp/omit'; +import equal from 'fast-deep-equal'; +import _merge from 'lodash/fp/merge'; +import sort from 'array-sort'; +import _unionBy from 'lodash/fp/unionBy'; +import _flattenDepth from 'lodash/fp/flattenDepth'; +import _pipe from 'lodash/fp/pipe'; +import { ulid } from 'ulid'; +import match from 'match-sorter'; +import _throttle from 'lodash/fp/throttle'; + +const DefaultNotFound = () => createElement(Fragment, null, "Not found"); + +const DefaultLoading = () => createElement(Fragment, null, "Loading"); + +const DefaultPage = ({ + children +}) => createElement(Fragment, null, children); + +const DefaultPlayground = ({ + component, + code +}) => createElement(Fragment, null, component, code); + +const defaultComponents = { + loading: DefaultLoading, + playground: DefaultPlayground, + notFound: DefaultNotFound, + page: DefaultPage +}; +const ctx = createContext({}); +const ComponentsProvider = ({ + components: themeComponents = {}, + children +}) => createElement(ctx.Provider, { + value: Object.assign({}, defaultComponents, themeComponents) +}, children); +const useComponents = () => { + return useContext(ctx); +}; + +const isFn = value => typeof value === 'function'; +function flatArrFromObject(arr, prop) { + const reducer = (arr, obj) => { + const value = _get(prop)(obj); + + return value ? arr.concat([value]) : arr; + }; + + return Array.from(new Set(arr.reduce(reducer, []))); +} +function compare(a, b, reverse) { + if (a < b) return reverse ? 1 : -1; + if (a > b) return reverse ? -1 : 1; + return 0; +} + +function create(initial) { + var _a; + + const ctx = createContext(initial); + const listeners = new Set(); + + const dispatch = fn => { + listeners.forEach(listener => listener(fn)); + }; + + return { + context: ctx, + set: fn => dispatch(fn), + Provider: (_a = class Provider extends Component { + constructor() { + super(...arguments); + this.state = this.props.initial || initial || {}; + } + + static getDerivedStateFromProps(props, state) { + if (!equal(props.initial, state)) return props.initial; + return null; + } + + componentDidMount() { + listeners.add(fn => this.setState(fn)); + } + + componentWillUnmount() { + listeners.clear(); + } + + render() { + return createElement(ctx.Provider, { + value: this.state + }, this.props.children); + } + + }, _a.displayName = 'DoczStateProvider', _a) + }; +} + +const doczState = create({}); + +const useConfig = () => { + const state = useContext(doczState.context); + const { + linkComponent, + transform, + config, + themeConfig = {} + } = state; + + const newConfig = _merge(themeConfig, config ? config.themeConfig : {}); + + const transformed = transform ? transform(newConfig) : newConfig; + return Object.assign({}, config, { + linkComponent, + themeConfig: transformed + }); +}; + +const updateState = ev => { + const { + type, + payload + } = JSON.parse(ev.data); + const prop = type.startsWith('state.') && type.split('.')[1]; + + if (prop) { + doczState.set(state => Object.assign({}, state, { + [prop]: payload + })); + } +}; + +const useDataServer = url => { + useEffect(() => { + if (!url) return; + const socket = new WebSocket(url); + socket.onmessage = updateState; + return () => socket.close(); + }, []); +}; + +const useDocs = () => { + const { + entries = [] + } = useContext(doczState.context); + const arr = entries.map(({ + value + }) => value); + return sort(arr, (a, b) => compare(a.name, b.name)); +}; + +const noMenu = entry => !entry.menu; + +const fromMenu = menu => entry => entry.menu === menu; + +const entryAsMenu = entry => ({ + name: entry.name, + route: entry.route, + parent: entry.parent +}); + +const entriesOfMenu = (menu, entries) => entries.filter(fromMenu(menu)).map(entryAsMenu); + +const parseMenu = entries => name => ({ + name, + menu: entriesOfMenu(name, entries) +}); + +const menusFromEntries = entries => { + const entriesWithoutMenu = entries.filter(noMenu).map(entryAsMenu); + const menus = flatArrFromObject(entries, 'menu').map(parseMenu(entries)); + return _unionBy('name', menus, entriesWithoutMenu); +}; + +const parseItemStr = item => typeof item === 'string' ? { + name: item +} : item; + +const normalize = item => { + const selected = parseItemStr(item); + return Object.assign({}, selected, { + id: selected.id || ulid(), + parent: _get('parent', selected) || _get('parent', item), + menu: Array.isArray(selected.menu) ? selected.menu.map(normalize) : selected.menu + }); +}; + +const clean = item => item.href || item.route ? _omit('menu', item) : item; + +const normalizeAndClean = _pipe(normalize, clean); + +const mergeMenus = (entriesMenu, configMenu) => { + const first = entriesMenu.map(normalizeAndClean); + const second = configMenu.map(normalizeAndClean); + + const merged = _unionBy('name', first, second); + + return merged.map(item => { + if (!item.menu) return item; + const found = second.find(i => i.name === item.name); + const foundMenu = found && found.menu; + return Object.assign({}, item, { + menu: foundMenu ? mergeMenus(item.menu, foundMenu) : item.menu || found.menu + }); + }); +}; + +const UNKNOWN_POS = Infinity; + +const findPos = (item, orderedList = []) => { + const name = typeof item !== 'string' ? _get('name', item) : item; + const pos = orderedList.findIndex(item => item === name); + return pos !== -1 ? pos : UNKNOWN_POS; +}; + +const compareWithMenu = (to = []) => (a, b) => { + const list = to.map(i => i.name || i); + return compare(findPos(a, list), findPos(b, list)); +}; + +const sortByName = (a, b) => { + return a.name < b.name ? -1 : a.name > b.name ? 1 : 0; +}; + +const sortMenus = (first, second = []) => { + const sorted = sort(first, compareWithMenu(second), sortByName); + return sorted.map(item => { + if (!item.menu) return item; + const found = second.find(menu => menu.name === item.name); + const foundMenu = found && found.menu; + return Object.assign({}, item, { + menu: foundMenu ? sortMenus(item.menu, foundMenu) : sort(item.menu, sortByName) + }); + }); +}; + +const search = (val, menu) => { + const items = menu.map(item => [item].concat(item.menu || [])); + + const flattened = _flattenDepth(2, items); + + const flattenedDeduplicated = [...new Set(flattened)]; + return match(flattenedDeduplicated, val, { + keys: ['name'] + }); +}; + +const filterMenus = (items, filter) => { + if (!filter) return items; + return items.filter(filter).map(item => { + if (!item.menu) return item; + return Object.assign({}, item, { + menu: item.menu.filter(filter) + }); + }); +}; + +const useMenus = opts => { + const { + query = '' + } = opts || {}; + const { + entries, + config + } = useContext(doczState.context); + if (!entries) return null; + const arr = entries.map(({ + value + }) => value); + const entriesMenu = menusFromEntries(arr); + const sorted = useMemo(() => { + const merged = mergeMenus(entriesMenu, config.menu); + const result = sortMenus(merged, config.menu); + return filterMenus(result, opts && opts.filter); + }, [entries, config]); + return query && query.length > 0 ? search(query, sorted) : sorted; +}; + +const usePrevious = (value, defaultValue) => { + const ref = useRef(defaultValue); + useEffect(() => { + ref.current = value; + }); + return ref.current; +}; + +const isClient = typeof window === 'object'; + +const getSize = (initialWidth, initialHeight) => ({ + innerHeight: isClient ? window.innerHeight : initialHeight, + innerWidth: isClient ? window.innerWidth : initialWidth, + outerHeight: isClient ? window.outerHeight : initialHeight, + outerWidth: isClient ? window.outerWidth : initialWidth +}); + +const useWindowSize = (throttleMs = 300, initialWidth = Infinity, initialHeight = Infinity) => { + const [windowSize, setWindowSize] = useState(getSize(initialHeight, initialHeight)); + + const tSetWindowResize = _throttle(throttleMs, () => setWindowSize(getSize(initialHeight, initialHeight))); + + useEffect(() => { + window.addEventListener('resize', tSetWindowResize); + return () => void window.removeEventListener('resize', tSetWindowResize); + }, []); + return windowSize; +}; + +export { isFn as a, useComponents as b, doczState as c, useConfig as d, useDataServer as e, useDocs as f, useMenus as g, usePrevious as h, useWindowSize as i, ComponentsProvider as j }; diff --git a/docs/docz-lib/docz/dist/chunk.js b/docs/docz-lib/docz/dist/chunk.js new file mode 100644 index 000000000..c68a82494 --- /dev/null +++ b/docs/docz-lib/docz/dist/chunk.js @@ -0,0 +1,324 @@ +'use strict'; + +function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } + +var React = require('react'); +var _get = _interopDefault(require('lodash/fp/get')); +var _omit = _interopDefault(require('lodash/fp/omit')); +var equal = _interopDefault(require('fast-deep-equal')); +var _merge = _interopDefault(require('lodash/fp/merge')); +var sort = _interopDefault(require('array-sort')); +var _unionBy = _interopDefault(require('lodash/fp/unionBy')); +var _flattenDepth = _interopDefault(require('lodash/fp/flattenDepth')); +var _pipe = _interopDefault(require('lodash/fp/pipe')); +var ulid = require('ulid'); +var match = _interopDefault(require('match-sorter')); +var _throttle = _interopDefault(require('lodash/fp/throttle')); + +const DefaultNotFound = () => React.createElement(React.Fragment, null, "Not found"); + +const DefaultLoading = () => React.createElement(React.Fragment, null, "Loading"); + +const DefaultPage = ({ + children +}) => React.createElement(React.Fragment, null, children); + +const DefaultPlayground = ({ + component, + code +}) => React.createElement(React.Fragment, null, component, code); + +const defaultComponents = { + loading: DefaultLoading, + playground: DefaultPlayground, + notFound: DefaultNotFound, + page: DefaultPage +}; +const ctx = React.createContext({}); +const ComponentsProvider = ({ + components: themeComponents = {}, + children +}) => React.createElement(ctx.Provider, { + value: Object.assign({}, defaultComponents, themeComponents) +}, children); +const useComponents = () => { + return React.useContext(ctx); +}; + +const isFn = value => typeof value === 'function'; +function flatArrFromObject(arr, prop) { + const reducer = (arr, obj) => { + const value = _get(prop)(obj); + + return value ? arr.concat([value]) : arr; + }; + + return Array.from(new Set(arr.reduce(reducer, []))); +} +function compare(a, b, reverse) { + if (a < b) return reverse ? 1 : -1; + if (a > b) return reverse ? -1 : 1; + return 0; +} + +function create(initial) { + var _a; + + const ctx = React.createContext(initial); + const listeners = new Set(); + + const dispatch = fn => { + listeners.forEach(listener => listener(fn)); + }; + + return { + context: ctx, + set: fn => dispatch(fn), + Provider: (_a = class Provider extends React.Component { + constructor() { + super(...arguments); + this.state = this.props.initial || initial || {}; + } + + static getDerivedStateFromProps(props, state) { + if (!equal(props.initial, state)) return props.initial; + return null; + } + + componentDidMount() { + listeners.add(fn => this.setState(fn)); + } + + componentWillUnmount() { + listeners.clear(); + } + + render() { + return React.createElement(ctx.Provider, { + value: this.state + }, this.props.children); + } + + }, _a.displayName = 'DoczStateProvider', _a) + }; +} + +const doczState = create({}); + +const useConfig = () => { + const state = React.useContext(doczState.context); + const { + linkComponent, + transform, + config, + themeConfig = {} + } = state; + + const newConfig = _merge(themeConfig, config ? config.themeConfig : {}); + + const transformed = transform ? transform(newConfig) : newConfig; + return Object.assign({}, config, { + linkComponent, + themeConfig: transformed + }); +}; + +const updateState = ev => { + const { + type, + payload + } = JSON.parse(ev.data); + const prop = type.startsWith('state.') && type.split('.')[1]; + + if (prop) { + doczState.set(state => Object.assign({}, state, { + [prop]: payload + })); + } +}; + +const useDataServer = url => { + React.useEffect(() => { + if (!url) return; + const socket = new WebSocket(url); + socket.onmessage = updateState; + return () => socket.close(); + }, []); +}; + +const useDocs = () => { + const { + entries = [] + } = React.useContext(doczState.context); + const arr = entries.map(({ + value + }) => value); + return sort(arr, (a, b) => compare(a.name, b.name)); +}; + +const noMenu = entry => !entry.menu; + +const fromMenu = menu => entry => entry.menu === menu; + +const entryAsMenu = entry => ({ + name: entry.name, + route: entry.route, + parent: entry.parent +}); + +const entriesOfMenu = (menu, entries) => entries.filter(fromMenu(menu)).map(entryAsMenu); + +const parseMenu = entries => name => ({ + name, + menu: entriesOfMenu(name, entries) +}); + +const menusFromEntries = entries => { + const entriesWithoutMenu = entries.filter(noMenu).map(entryAsMenu); + const menus = flatArrFromObject(entries, 'menu').map(parseMenu(entries)); + return _unionBy('name', menus, entriesWithoutMenu); +}; + +const parseItemStr = item => typeof item === 'string' ? { + name: item +} : item; + +const normalize = item => { + const selected = parseItemStr(item); + return Object.assign({}, selected, { + id: selected.id || ulid.ulid(), + parent: _get('parent', selected) || _get('parent', item), + menu: Array.isArray(selected.menu) ? selected.menu.map(normalize) : selected.menu + }); +}; + +const clean = item => item.href || item.route ? _omit('menu', item) : item; + +const normalizeAndClean = _pipe(normalize, clean); + +const mergeMenus = (entriesMenu, configMenu) => { + const first = entriesMenu.map(normalizeAndClean); + const second = configMenu.map(normalizeAndClean); + + const merged = _unionBy('name', first, second); + + return merged.map(item => { + if (!item.menu) return item; + const found = second.find(i => i.name === item.name); + const foundMenu = found && found.menu; + return Object.assign({}, item, { + menu: foundMenu ? mergeMenus(item.menu, foundMenu) : item.menu || found.menu + }); + }); +}; + +const UNKNOWN_POS = Infinity; + +const findPos = (item, orderedList = []) => { + const name = typeof item !== 'string' ? _get('name', item) : item; + const pos = orderedList.findIndex(item => item === name); + return pos !== -1 ? pos : UNKNOWN_POS; +}; + +const compareWithMenu = (to = []) => (a, b) => { + const list = to.map(i => i.name || i); + return compare(findPos(a, list), findPos(b, list)); +}; + +const sortByName = (a, b) => { + return a.name < b.name ? -1 : a.name > b.name ? 1 : 0; +}; + +const sortMenus = (first, second = []) => { + const sorted = sort(first, compareWithMenu(second), sortByName); + return sorted.map(item => { + if (!item.menu) return item; + const found = second.find(menu => menu.name === item.name); + const foundMenu = found && found.menu; + return Object.assign({}, item, { + menu: foundMenu ? sortMenus(item.menu, foundMenu) : sort(item.menu, sortByName) + }); + }); +}; + +const search = (val, menu) => { + const items = menu.map(item => [item].concat(item.menu || [])); + + const flattened = _flattenDepth(2, items); + + const flattenedDeduplicated = [...new Set(flattened)]; + return match(flattenedDeduplicated, val, { + keys: ['name'] + }); +}; + +const filterMenus = (items, filter) => { + if (!filter) return items; + return items.filter(filter).map(item => { + if (!item.menu) return item; + return Object.assign({}, item, { + menu: item.menu.filter(filter) + }); + }); +}; + +const useMenus = opts => { + const { + query = '' + } = opts || {}; + const { + entries, + config + } = React.useContext(doczState.context); + if (!entries) return null; + const arr = entries.map(({ + value + }) => value); + const entriesMenu = menusFromEntries(arr); + const sorted = React.useMemo(() => { + const merged = mergeMenus(entriesMenu, config.menu); + const result = sortMenus(merged, config.menu); + return filterMenus(result, opts && opts.filter); + }, [entries, config]); + return query && query.length > 0 ? search(query, sorted) : sorted; +}; + +const usePrevious = (value, defaultValue) => { + const ref = React.useRef(defaultValue); + React.useEffect(() => { + ref.current = value; + }); + return ref.current; +}; + +const isClient = typeof window === 'object'; + +const getSize = (initialWidth, initialHeight) => ({ + innerHeight: isClient ? window.innerHeight : initialHeight, + innerWidth: isClient ? window.innerWidth : initialWidth, + outerHeight: isClient ? window.outerHeight : initialHeight, + outerWidth: isClient ? window.outerWidth : initialWidth +}); + +const useWindowSize = (throttleMs = 300, initialWidth = Infinity, initialHeight = Infinity) => { + const [windowSize, setWindowSize] = React.useState(getSize(initialHeight, initialHeight)); + + const tSetWindowResize = _throttle(throttleMs, () => setWindowSize(getSize(initialHeight, initialHeight))); + + React.useEffect(() => { + window.addEventListener('resize', tSetWindowResize); + return () => void window.removeEventListener('resize', tSetWindowResize); + }, []); + return windowSize; +}; + +exports.ComponentsProvider = ComponentsProvider; +exports.doczState = doczState; +exports.isFn = isFn; +exports.useComponents = useComponents; +exports.useConfig = useConfig; +exports.useDataServer = useDataServer; +exports.useDocs = useDocs; +exports.useMenus = useMenus; +exports.usePrevious = usePrevious; +exports.useWindowSize = useWindowSize; diff --git a/docs/docz-lib/docz/dist/components/AsyncComponent.d.ts b/docs/docz-lib/docz/dist/components/AsyncComponent.d.ts new file mode 100644 index 000000000..9470a4698 --- /dev/null +++ b/docs/docz-lib/docz/dist/components/AsyncComponent.d.ts @@ -0,0 +1,7 @@ +import { SFC, ComponentType } from 'react'; +interface Props { + as: ComponentType; + getInitialProps?: (props: any) => any; +} +export declare const AsyncComponent: SFC; +export {}; diff --git a/docs/docz-lib/docz/dist/components/AsyncPlayground.d.ts b/docs/docz-lib/docz/dist/components/AsyncPlayground.d.ts new file mode 100644 index 000000000..c5978251c --- /dev/null +++ b/docs/docz-lib/docz/dist/components/AsyncPlayground.d.ts @@ -0,0 +1,2 @@ +import * as React from 'react'; +export declare const Playground: React.SFC; diff --git a/docs/docz-lib/docz/dist/components/AsyncRoute.d.ts b/docs/docz-lib/docz/dist/components/AsyncRoute.d.ts new file mode 100644 index 000000000..0f6ad6ea1 --- /dev/null +++ b/docs/docz-lib/docz/dist/components/AsyncRoute.d.ts @@ -0,0 +1,13 @@ +import { SFC } from 'react'; +import { Entry } from '../state'; +import { ComponentsMap } from '../hooks/useComponents'; +export declare type Imports = Record Promise>; +export declare const loadRoute: (path: string, imports: Record Promise>, components: ComponentsMap) => import("@loadable/component").LoadableComponent; +interface AsyncRouteProps { + asyncComponent: any; + components: ComponentsMap; + path: string; + entry: Entry; +} +export declare const AsyncRoute: SFC; +export {}; diff --git a/docs/docz-lib/docz/dist/components/Link.d.ts b/docs/docz-lib/docz/dist/components/Link.d.ts new file mode 100644 index 000000000..00ab189e8 --- /dev/null +++ b/docs/docz-lib/docz/dist/components/Link.d.ts @@ -0,0 +1,4 @@ +import * as React from 'react'; +import { LinkProps } from '@reach/router'; +export { LinkProps }; +export declare const Link: React.ForwardRefExoticComponent, "key" | "download" | "hrefLang" | "media" | "rel" | "target" | "type" | "referrerPolicy" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "className" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "hidden" | "id" | "lang" | "placeholder" | "slot" | "spellCheck" | "style" | "tabIndex" | "title" | "inputMode" | "is" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "children" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "to" | "replace" | "getProps" | "state"> & React.RefAttributes>; diff --git a/docs/docz-lib/docz/dist/components/Playground.d.ts b/docs/docz-lib/docz/dist/components/Playground.d.ts new file mode 100644 index 000000000..1179bbff1 --- /dev/null +++ b/docs/docz-lib/docz/dist/components/Playground.d.ts @@ -0,0 +1,13 @@ +import { ComponentType, SFC } from 'react'; +export interface PlaygroundProps { + className?: string; + style?: any; + wrapper?: ComponentType; + children: any; + __scope: Record; + __position: number; + __code: string; + __codesandbox: string; +} +declare const Playground: SFC; +export default Playground; diff --git a/docs/docz-lib/docz/dist/components/Props.d.ts b/docs/docz-lib/docz/dist/components/Props.d.ts new file mode 100644 index 000000000..5729b469e --- /dev/null +++ b/docs/docz-lib/docz/dist/components/Props.d.ts @@ -0,0 +1,65 @@ +import { SFC, ComponentType } from 'react'; +export interface EnumValue { + value: string; + computed: boolean; +} +export interface FlowTypeElement { + name: string; + value: string; +} +export interface FlowTypeArgs { + name: string; + type: { + name: string; + }; +} +export interface PropType { + name: string; + value?: any; + raw?: any; + computed?: boolean; +} +export interface FlowType extends PropType { + elements: FlowTypeElement[]; + name: string; + raw: string; + type?: string; + computed?: boolean; + signature?: { + arguments: FlowTypeArgs[]; + return: { + name: string; + }; + }; +} +export interface Prop { + required: boolean; + description?: string; + type: PropType; + defaultValue?: { + value: string; + computed: boolean; + }; + flowType?: FlowType; +} +export declare type ComponentWithDocGenInfo = ComponentType & { + __docgenInfo: { + description?: string; + props?: Record; + }; +}; +export interface PropsProps { + title?: Node; + isRaw?: boolean; + isToggle?: boolean; + of: ComponentWithDocGenInfo; +} +export declare const getPropType: (prop: Prop) => any; +export interface PropsComponentProps { + title?: Node; + isRaw?: boolean; + isToggle?: boolean; + props: Record; + getPropType(prop: Prop): string; +} +export declare const Props: SFC; diff --git a/docs/docz-lib/docz/dist/components/Routes.d.ts b/docs/docz-lib/docz/dist/components/Routes.d.ts new file mode 100644 index 000000000..27776c939 --- /dev/null +++ b/docs/docz-lib/docz/dist/components/Routes.d.ts @@ -0,0 +1,8 @@ +import { SFC } from 'react'; +import { ComponentsMap } from '../hooks/useComponents'; +import { Imports } from './AsyncRoute'; +export interface RoutesProps { + components: ComponentsMap; + imports: Imports; +} +export declare const Routes: SFC; diff --git a/docs/docz-lib/docz/dist/hooks/index.d.ts b/docs/docz-lib/docz/dist/hooks/index.d.ts new file mode 100644 index 000000000..d02f7b8c8 --- /dev/null +++ b/docs/docz-lib/docz/dist/hooks/index.d.ts @@ -0,0 +1,7 @@ +export * from './useComponents'; +export { useConfig, UseConfigObj } from './useConfig'; +export { useDataServer } from './useDataServer'; +export { useDocs } from './useDocs'; +export { useMenus } from './useMenus'; +export { usePrevious } from './usePrevious'; +export { useWindowSize } from './useWindowSize'; diff --git a/docs/docz-lib/docz/dist/hooks/useComponents.d.ts b/docs/docz-lib/docz/dist/hooks/useComponents.d.ts new file mode 100644 index 000000000..01e03cf88 --- /dev/null +++ b/docs/docz-lib/docz/dist/hooks/useComponents.d.ts @@ -0,0 +1,44 @@ +import { SFC, ComponentType as CT } from 'react'; +import { RouteComponentProps } from '@reach/router'; +import { Entry } from '../state'; +export declare type PageProps = RouteComponentProps & { + doc: Entry; +}; +export interface PlaygroundProps { + className?: string; + style?: any; + wrapper?: CT; + components: ComponentsMap; + component: JSX.Element; + position: number; + code: string; + codesandbox: string; + scope: Record; +} +export declare type PlaygroundComponent = CT; +export interface ComponentsMap { + loading?: CT; + page?: CT; + notFound?: CT>; + playground?: PlaygroundComponent; + h1?: CT | string; + h2?: CT | string; + h3?: CT | string; + h4?: CT | string; + h5?: CT | string; + h6?: CT | string; + span?: CT | string; + a?: CT | string; + ul?: CT | string; + table?: CT | string; + pre?: CT | string; + code?: CT | string; + inlineCode?: CT | string; + [key: string]: any; +} +export declare type NotFoundComponent = CT>; +export interface ComponentsProviderProps { + components: ComponentsMap; +} +export declare const ComponentsProvider: SFC; +export declare const useComponents: () => ComponentsMap; diff --git a/docs/docz-lib/docz/dist/hooks/useConfig.d.ts b/docs/docz-lib/docz/dist/hooks/useConfig.d.ts new file mode 100644 index 000000000..857250e39 --- /dev/null +++ b/docs/docz-lib/docz/dist/hooks/useConfig.d.ts @@ -0,0 +1,7 @@ +/// +import { ThemeConfig, Config } from '../state'; +export interface UseConfigObj extends Config { + themeConfig: ThemeConfig; + linkComponent?: React.ComponentType; +} +export declare const useConfig: () => UseConfigObj; diff --git a/docs/docz-lib/docz/dist/hooks/useDataServer.d.ts b/docs/docz-lib/docz/dist/hooks/useDataServer.d.ts new file mode 100644 index 000000000..6f66307ba --- /dev/null +++ b/docs/docz-lib/docz/dist/hooks/useDataServer.d.ts @@ -0,0 +1 @@ +export declare const useDataServer: (url: string | undefined) => void; diff --git a/docs/docz-lib/docz/dist/hooks/useDocs.d.ts b/docs/docz-lib/docz/dist/hooks/useDocs.d.ts new file mode 100644 index 000000000..b245978b4 --- /dev/null +++ b/docs/docz-lib/docz/dist/hooks/useDocs.d.ts @@ -0,0 +1,2 @@ +import { Entry } from '../state'; +export declare const useDocs: () => Entry[] | null; diff --git a/docs/docz-lib/docz/dist/hooks/useMenus.d.ts b/docs/docz-lib/docz/dist/hooks/useMenus.d.ts new file mode 100644 index 000000000..88bb144f4 --- /dev/null +++ b/docs/docz-lib/docz/dist/hooks/useMenus.d.ts @@ -0,0 +1,8 @@ +import { MenuItem } from '../state'; +declare type FilterFn = (item: MenuItem) => boolean; +export interface UseMenusParams { + query?: string; + filter?: FilterFn; +} +export declare const useMenus: (opts?: UseMenusParams | undefined) => MenuItem[] | null; +export {}; diff --git a/docs/docz-lib/docz/dist/hooks/usePrevious.d.ts b/docs/docz-lib/docz/dist/hooks/usePrevious.d.ts new file mode 100644 index 000000000..2a580255b --- /dev/null +++ b/docs/docz-lib/docz/dist/hooks/usePrevious.d.ts @@ -0,0 +1 @@ +export declare const usePrevious: (value: any, defaultValue?: any) => any; diff --git a/docs/docz-lib/docz/dist/hooks/useWindowSize.d.ts b/docs/docz-lib/docz/dist/hooks/useWindowSize.d.ts new file mode 100644 index 000000000..006a9de13 --- /dev/null +++ b/docs/docz-lib/docz/dist/hooks/useWindowSize.d.ts @@ -0,0 +1,6 @@ +export declare const useWindowSize: (throttleMs?: number, initialWidth?: number, initialHeight?: number) => { + innerHeight: number; + innerWidth: number; + outerHeight: number; + outerWidth: number; +}; diff --git a/docs/docz-lib/docz/dist/index.d.ts b/docs/docz-lib/docz/dist/index.d.ts new file mode 100644 index 000000000..cc8dd20ed --- /dev/null +++ b/docs/docz-lib/docz/dist/index.d.ts @@ -0,0 +1,8 @@ +export { Playground } from './components/AsyncPlayground'; +export { AsyncRoute, loadRoute } from './components/AsyncRoute'; +export { Link, LinkProps } from './components/Link'; +export { Props, PropsComponentProps } from './components/Props'; +export { Routes } from './components/Routes'; +export * from './hooks'; +export { theme } from './theme'; +export { doczState, Entry, MenuItem, ThemeConfig } from './state'; diff --git a/docs/docz-lib/docz/dist/index.esm.js b/docs/docz-lib/docz/dist/index.esm.js new file mode 100644 index 000000000..1f8671df2 --- /dev/null +++ b/docs/docz-lib/docz/dist/index.esm.js @@ -0,0 +1,302 @@ +import * as React from 'react'; +import { createElement, Suspense, useState, useEffect, forwardRef, useCallback, useContext, useMemo, memo, Fragment } from 'react'; +import loadable from '@loadable/component'; +import _get from 'lodash/fp/get'; +import { __rest } from 'tslib'; +import { a as isFn, b as useComponents, c as doczState } from './chunk.esm.js'; +export { j as ComponentsProvider, c as doczState, b as useComponents, d as useConfig, e as useDataServer, f as useDocs, g as useMenus, h as usePrevious, i as useWindowSize } from './chunk.esm.js'; +import _omit from 'lodash/fp/omit'; +import { Link as Link$1, createHistory, LocationProvider, Router } from '@reach/router'; +import _first from 'lodash/fp/first'; +import capitalize from 'capitalize'; +import 'fast-deep-equal'; +import 'lodash/fp/merge'; +import 'array-sort'; +import 'lodash/fp/unionBy'; +import 'lodash/fp/flattenDepth'; +import 'lodash/fp/pipe'; +import 'ulid'; +import 'match-sorter'; +import 'lodash/fp/throttle'; +import { MDXProvider } from '@mdx-js/react'; +import createHashSource from 'hash-source'; +let source = createHashSource(); + +const BasePlayground = loadable(() => import('./Playground.esm.js')); +const Playground = props => typeof window !== 'undefined' ? createElement(Suspense, { + fallback: null +}, createElement(BasePlayground, Object.assign({}, props))) : null; + +const AsyncComponent = defaultProps => { + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [data, setData] = useState({}); + useEffect(() => { + const { + getInitialProps + } = defaultProps; + + if (getInitialProps && isFn(getInitialProps)) { + setLoading(true); + getInitialProps(defaultProps).then(data => { + setLoading(false); + setError(null); + setData(data); + }).catch(err => { + setLoading(false); + setError(err); + setData({}); + }); + } + }, []); + + const { + as: Comp, + getInitialProps + } = defaultProps, + props = __rest(defaultProps, ["as", "getInitialProps"]); + + return createElement(Comp, Object.assign({}, props, { + data: Object.assign({}, data, { + loading, + error + }) + })); +}; + +const loadRoute = (path, imports, components) => { + const Loading = components.loading; + + const fn = async () => { + const importFn = _get(path, imports); + + const { + default: Component, + getInitialProps + } = await importFn(); + + const ExportedComponent = props => createElement(AsyncComponent, Object.assign({}, props, { + as: Component || 'div', + getInitialProps: getInitialProps + })); + + return ExportedComponent; + }; + + return loadable(fn, { + fallback: createElement(Loading, null) + }); +}; +const AsyncRoute = defaultProps => { + const { + asyncComponent, + path, + entry + } = defaultProps, + routeProps = __rest(defaultProps, ["asyncComponent", "path", "entry"]); + + const components = useComponents(); + const Page = components.page; + const Component = asyncComponent; + const props = Object.assign({}, routeProps, { + doc: entry + }); + return Page ? createElement(Page, Object.assign({}, props), createElement(Component, Object.assign({}, props))) : createElement(Component, Object.assign({}, props)); +}; + +const Link = forwardRef((defaultProps, ref) => { + const props = _omit(['activeClassName', 'partiallyActive'], defaultProps); + + const isActive = useCallback(({ + isCurrent + }) => { + return isCurrent ? { + className: `${props.className} active` + } : {}; + }, [props.className]); + return createElement(Link$1, Object.assign({}, props, { + getProps: isActive, + ref: ref + })); +}); +Link.displayName = 'Link'; + +const RE_OBJECTOF = /(?:React\.)?(?:PropTypes\.)?objectOf\((?:React\.)?(?:PropTypes\.)?(\w+)\)/; + +const getTypeStr = type => { + switch (type.name.toLowerCase()) { + case 'instanceof': + return `Class(${type.value})`; + + case 'enum': + if (type.computed) return type.value; + return type.value ? type.value.map(v => `${v.value}`).join(' │ ') : type.raw; + + case 'union': + return type.value ? type.value.map(t => `${getTypeStr(t)}`).join(' │ ') : type.raw; + + case 'array': + return type.raw; + + case 'arrayof': + return `Array<${getTypeStr(type.value)}>`; + + case 'custom': + if (type.raw.indexOf('function') !== -1 || type.raw.indexOf('=>') !== -1) return 'Custom(Function)';else if (type.raw.toLowerCase().indexOf('objectof') !== -1) { + const m = type.raw.match(RE_OBJECTOF); + if (m && m[1]) return `ObjectOf(${capitalize(m[1])})`; + return 'ObjectOf'; + } + return 'Custom'; + + case 'bool': + return 'Boolean'; + + case 'func': + return 'Function'; + + case 'shape': + const shape = type.value; + const rst = {}; + Object.keys(shape).forEach(key => { + rst[key] = getTypeStr(shape[key]); + }); + return JSON.stringify(rst, null, 2); + + default: + return capitalize(type.name); + } +}; + +const humanize = type => getTypeStr(type); + +const getPropType = prop => { + const propName = _get('name', prop.flowType || prop.type); + + if (!propName) return null; + const isEnum = propName.startsWith('"') || propName === 'enum'; + const name = capitalize(isEnum ? 'enum' : propName); + + const value = _get('type.value', prop); + + if (!name) return null; + + if (isEnum && typeof value === 'string' || !prop.flowType && !isEnum && !value || prop.flowType && !prop.flowType.elements) { + return name; + } + + return prop.flowType ? humanize(prop.flowType) : humanize(prop.type); +}; +const Props = ({ + title, + isToggle, + isRaw, + of: component +}) => { + const components = useComponents(); + const { + props: stateProps + } = useContext(doczState.context); + const PropsComponent = components.props; + + const filename = _get('__filemeta.filename', component); + + const filemetaName = _get('__filemeta.name', component); + + const componentName = filemetaName || component.displayName || component.name; + const found = stateProps && stateProps.length > 0 && stateProps.find(item => filename ? item.key === filename : item.key.includes(`${componentName}.`)); + const value = _get('value', found) || []; + + const firstDefinition = _first(value); + + const definition = value.find(i => i.displayName === componentName); + + const props = _get('props', definition || firstDefinition); + + if (!props) return null; + if (!PropsComponent) return null; + return createElement(PropsComponent, { + title: title, + isRaw: isRaw, + isToggle: isToggle, + props: props, + getPropType: getPropType + }); +}; + +const goToHash = ({ + location +}) => { + setTimeout(() => { + if (location && location.hash) { + const decodedHash = decodeURI(location.hash); + const id = decodedHash.substring(1); + const el = document.getElementById(id); + if (el) el.scrollIntoView(); + } + }); +}; + +const Routes = ({ + imports +}) => { + const components = useComponents(); + const { + entries + } = useContext(doczState.context); + const NotFound = components.notFound; + const history = useMemo(() => createHistory(source), []); + useEffect(() => { + history.listen(goToHash); + }, []); + return createElement(MDXProvider, { + components: components + }, createElement(LocationProvider, { + history: history + }, createElement(Router, null, createElement(NotFound, { + default: true + }), entries && entries.map(({ + key: path, + value: entry + }) => { + const props = { + path, + entries, + components + }; + const component = loadRoute(path, imports, components); + return createElement(AsyncRoute, Object.assign({}, props, { + entry: entry, + key: entry.id, + path: entry.route, + asyncComponent: component + })); + })))); +}; + +function theme(themeConfig, transform = c => c) { + return WrappedComponent => { + const Theme = memo(props => { + const { + linkComponent + } = props; + const { + db, + children, + wrapper: Wrapper = Fragment + } = props; + const initial = Object.assign({}, db, { + themeConfig, + transform, + linkComponent + }); + return createElement(doczState.Provider, { + initial: initial + }, createElement(Wrapper, null, createElement(WrappedComponent, null, children))); + }); + Theme.displayName = WrappedComponent.displayName || 'DoczTheme'; + return Theme; + }; +} + +export { AsyncRoute, Link, Playground, Props, Routes, loadRoute, theme }; diff --git a/docs/docz-lib/docz/dist/index.js b/docs/docz-lib/docz/dist/index.js new file mode 100644 index 000000000..97256b3fa --- /dev/null +++ b/docs/docz-lib/docz/dist/index.js @@ -0,0 +1,321 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } + +var React = require('react'); +var loadable = _interopDefault(require('@loadable/component')); +var _get = _interopDefault(require('lodash/fp/get')); +var tslib_1 = require('tslib'); +var __chunk_1 = require('./chunk.js'); +var _omit = _interopDefault(require('lodash/fp/omit')); +var router = require('@reach/router'); +var _first = _interopDefault(require('lodash/fp/first')); +var capitalize = _interopDefault(require('capitalize')); +require('fast-deep-equal'); +require('lodash/fp/merge'); +require('array-sort'); +require('lodash/fp/unionBy'); +require('lodash/fp/flattenDepth'); +require('lodash/fp/pipe'); +require('ulid'); +require('match-sorter'); +require('lodash/fp/throttle'); +var react = require('@mdx-js/react'); +var createHashSource = require('hash-source'); +let source = createHashSource.default();; + +const BasePlayground = loadable(() => Promise.resolve(require('./Playground.js'))); +const Playground = props => typeof window !== 'undefined' ? React.createElement(React.Suspense, { + fallback: null +}, React.createElement(BasePlayground, Object.assign({}, props))) : null; + +const AsyncComponent = defaultProps => { + const [loading, setLoading] = React.useState(true); + const [error, setError] = React.useState(null); + const [data, setData] = React.useState({}); + React.useEffect(() => { + const { + getInitialProps + } = defaultProps; + + if (getInitialProps && __chunk_1.isFn(getInitialProps)) { + setLoading(true); + getInitialProps(defaultProps).then(data => { + setLoading(false); + setError(null); + setData(data); + }).catch(err => { + setLoading(false); + setError(err); + setData({}); + }); + } + }, []); + + const { + as: Comp, + getInitialProps + } = defaultProps, + props = tslib_1.__rest(defaultProps, ["as", "getInitialProps"]); + + return React.createElement(Comp, Object.assign({}, props, { + data: Object.assign({}, data, { + loading, + error + }) + })); +}; + +const loadRoute = (path, imports, components) => { + const Loading = components.loading; + + const fn = async () => { + const importFn = _get(path, imports); + + const { + default: Component, + getInitialProps + } = await importFn(); + + const ExportedComponent = props => React.createElement(AsyncComponent, Object.assign({}, props, { + as: Component || 'div', + getInitialProps: getInitialProps + })); + + return ExportedComponent; + }; + + return loadable(fn, { + fallback: React.createElement(Loading, null) + }); +}; +const AsyncRoute = defaultProps => { + const { + asyncComponent, + path, + entry + } = defaultProps, + routeProps = tslib_1.__rest(defaultProps, ["asyncComponent", "path", "entry"]); + + const components = __chunk_1.useComponents(); + const Page = components.page; + const Component = asyncComponent; + const props = Object.assign({}, routeProps, { + doc: entry + }); + return Page ? React.createElement(Page, Object.assign({}, props), React.createElement(Component, Object.assign({}, props))) : React.createElement(Component, Object.assign({}, props)); +}; + +const Link = React.forwardRef((defaultProps, ref) => { + const props = _omit(['activeClassName', 'partiallyActive'], defaultProps); + + const isActive = React.useCallback(({ + isCurrent + }) => { + return isCurrent ? { + className: `${props.className} active` + } : {}; + }, [props.className]); + return React.createElement(router.Link, Object.assign({}, props, { + getProps: isActive, + ref: ref + })); +}); +Link.displayName = 'Link'; + +const RE_OBJECTOF = /(?:React\.)?(?:PropTypes\.)?objectOf\((?:React\.)?(?:PropTypes\.)?(\w+)\)/; + +const getTypeStr = type => { + switch (type.name.toLowerCase()) { + case 'instanceof': + return `Class(${type.value})`; + + case 'enum': + if (type.computed) return type.value; + return type.value ? type.value.map(v => `${v.value}`).join(' │ ') : type.raw; + + case 'union': + return type.value ? type.value.map(t => `${getTypeStr(t)}`).join(' │ ') : type.raw; + + case 'array': + return type.raw; + + case 'arrayof': + return `Array<${getTypeStr(type.value)}>`; + + case 'custom': + if (type.raw.indexOf('function') !== -1 || type.raw.indexOf('=>') !== -1) return 'Custom(Function)';else if (type.raw.toLowerCase().indexOf('objectof') !== -1) { + const m = type.raw.match(RE_OBJECTOF); + if (m && m[1]) return `ObjectOf(${capitalize(m[1])})`; + return 'ObjectOf'; + } + return 'Custom'; + + case 'bool': + return 'Boolean'; + + case 'func': + return 'Function'; + + case 'shape': + const shape = type.value; + const rst = {}; + Object.keys(shape).forEach(key => { + rst[key] = getTypeStr(shape[key]); + }); + return JSON.stringify(rst, null, 2); + + default: + return capitalize(type.name); + } +}; + +const humanize = type => getTypeStr(type); + +const getPropType = prop => { + const propName = _get('name', prop.flowType || prop.type); + + if (!propName) return null; + const isEnum = propName.startsWith('"') || propName === 'enum'; + const name = capitalize(isEnum ? 'enum' : propName); + + const value = _get('type.value', prop); + + if (!name) return null; + + if (isEnum && typeof value === 'string' || !prop.flowType && !isEnum && !value || prop.flowType && !prop.flowType.elements) { + return name; + } + + return prop.flowType ? humanize(prop.flowType) : humanize(prop.type); +}; +const Props = ({ + title, + isToggle, + isRaw, + of: component +}) => { + const components = __chunk_1.useComponents(); + const { + props: stateProps + } = React.useContext(__chunk_1.doczState.context); + const PropsComponent = components.props; + + const filename = _get('__filemeta.filename', component); + + const filemetaName = _get('__filemeta.name', component); + + const componentName = filemetaName || component.displayName || component.name; + const found = stateProps && stateProps.length > 0 && stateProps.find(item => filename ? item.key === filename : item.key.includes(`${componentName}.`)); + const value = _get('value', found) || []; + + const firstDefinition = _first(value); + + const definition = value.find(i => i.displayName === componentName); + + const props = _get('props', definition || firstDefinition); + + if (!props) return null; + if (!PropsComponent) return null; + return React.createElement(PropsComponent, { + title: title, + isRaw: isRaw, + isToggle: isToggle, + props: props, + getPropType: getPropType + }); +}; + +const goToHash = ({ + location +}) => { + setTimeout(() => { + if (location && location.hash) { + const decodedHash = decodeURI(location.hash); + const id = decodedHash.substring(1); + const el = document.getElementById(id); + if (el) el.scrollIntoView(); + } + }); +}; + +const Routes = ({ + imports +}) => { + const components = __chunk_1.useComponents(); + const { + entries + } = React.useContext(__chunk_1.doczState.context); + const NotFound = components.notFound; + const history = React.useMemo(() => router.createHistory(source), []); + React.useEffect(() => { + history.listen(goToHash); + }, []); + return React.createElement(react.MDXProvider, { + components: components + }, React.createElement(router.LocationProvider, { + history: history + }, React.createElement(router.Router, null, React.createElement(NotFound, { + default: true + }), entries && entries.map(({ + key: path, + value: entry + }) => { + const props = { + path, + entries, + components + }; + const component = loadRoute(path, imports, components); + return React.createElement(AsyncRoute, Object.assign({}, props, { + entry: entry, + key: entry.id, + path: entry.route, + asyncComponent: component + })); + })))); +}; + +function theme(themeConfig, transform = c => c) { + return WrappedComponent => { + const Theme = React.memo(props => { + const { + linkComponent + } = props; + const { + db, + children, + wrapper: Wrapper = React.Fragment + } = props; + const initial = Object.assign({}, db, { + themeConfig, + transform, + linkComponent + }); + return React.createElement(__chunk_1.doczState.Provider, { + initial: initial + }, React.createElement(Wrapper, null, React.createElement(WrappedComponent, null, children))); + }); + Theme.displayName = WrappedComponent.displayName || 'DoczTheme'; + return Theme; + }; +} + +exports.ComponentsProvider = __chunk_1.ComponentsProvider; +exports.doczState = __chunk_1.doczState; +exports.useComponents = __chunk_1.useComponents; +exports.useConfig = __chunk_1.useConfig; +exports.useDataServer = __chunk_1.useDataServer; +exports.useDocs = __chunk_1.useDocs; +exports.useMenus = __chunk_1.useMenus; +exports.usePrevious = __chunk_1.usePrevious; +exports.useWindowSize = __chunk_1.useWindowSize; +exports.AsyncRoute = AsyncRoute; +exports.Link = Link; +exports.Playground = Playground; +exports.Props = Props; +exports.Routes = Routes; +exports.loadRoute = loadRoute; +exports.theme = theme; diff --git a/docs/docz-lib/docz/dist/state.d.ts b/docs/docz-lib/docz/dist/state.d.ts new file mode 100644 index 000000000..a0a9a9e05 --- /dev/null +++ b/docs/docz-lib/docz/dist/state.d.ts @@ -0,0 +1,59 @@ +import { ComponentType } from 'react'; +export interface Heading { + depth: number; + slug: string; + value: string; +} +export interface Entry { + id: string; + filepath: string; + slug: string; + route: string; + name: string; + order: number; + menu: string | null; + headings: Heading[]; + [key: string]: any; +} +export interface MenuItem { + id: string; + name: string; + route?: string; + href?: string; + menu?: MenuItem[]; + order?: number; + parent?: string; +} +export declare type ThemeConfig = Record; +export interface Config { + title: string; + description: string; + themeConfig: ThemeConfig; + menu: MenuItem[]; + version: string | null; + repository: string | null; + native: boolean; + separator: string; + codeSandbox: boolean; + base?: string; +} +export declare type Entries = { + key: string; + value: Entry; +}[]; +export declare type Props = { + key: string; + value: any; +}[]; +export declare type TransformFn = (config: ThemeConfig) => ThemeConfig; +export interface Database { + config: Config; + props?: Props; + entries?: Entries; +} +export interface DoczState extends Database { + linkComponent: ComponentType; + themeConfig?: ThemeConfig; + transform?: TransformFn; +} +export declare const doczState: import("./utils/createState").State; diff --git a/docs/docz-lib/docz/dist/theme.d.ts b/docs/docz-lib/docz/dist/theme.d.ts new file mode 100644 index 000000000..1dab68f9a --- /dev/null +++ b/docs/docz-lib/docz/dist/theme.d.ts @@ -0,0 +1,10 @@ +import { ComponentType as CT } from 'react'; +import { Database, ThemeConfig, TransformFn } from './state'; +export interface ThemeProps { + db: Database; + wrapper?: CT; + linkComponent?: CT; + children(WrappedComponent: CT): JSX.Element; +} +export declare type ThemeReturn = (WrappedComponent: CT) => CT; +export declare function theme(themeConfig: ThemeConfig, transform?: TransformFn): ThemeReturn; diff --git a/docs/docz-lib/docz/dist/utils/createState.d.ts b/docs/docz-lib/docz/dist/utils/createState.d.ts new file mode 100644 index 000000000..cad3c8ea4 --- /dev/null +++ b/docs/docz-lib/docz/dist/utils/createState.d.ts @@ -0,0 +1,13 @@ +import * as React from 'react'; +export interface ProviderProps { + initial?: T; +} +export declare type PrevState = (prevState: T) => T; +export declare type GetFn = (state: T) => React.ReactNode; +export declare type Dispatch = T | PrevState; +export interface State { + context: React.Context; + set: (param: Dispatch) => void; + Provider: React.ComponentType>; +} +export declare function create(initial: T): State; diff --git a/docs/docz-lib/docz/dist/utils/helpers.d.ts b/docs/docz-lib/docz/dist/utils/helpers.d.ts new file mode 100644 index 000000000..087b6ebb4 --- /dev/null +++ b/docs/docz-lib/docz/dist/utils/helpers.d.ts @@ -0,0 +1,3 @@ +export declare const isFn: (value: any) => boolean; +export declare function flatArrFromObject(arr: T[], prop: string): string[]; +export declare function compare(a: T, b: T, reverse?: boolean): number; diff --git a/docs/docz-lib/docz/dist/utils/humanize-prop.d.ts b/docs/docz-lib/docz/dist/utils/humanize-prop.d.ts new file mode 100644 index 000000000..f9d1124a3 --- /dev/null +++ b/docs/docz-lib/docz/dist/utils/humanize-prop.d.ts @@ -0,0 +1,2 @@ +import { PropType, FlowType } from '../components/Props'; +export declare const humanize: (type: PropType | FlowType) => any; diff --git a/docs/doczrc.js b/docs/doczrc.js new file mode 100644 index 000000000..be24d36e7 --- /dev/null +++ b/docs/doczrc.js @@ -0,0 +1,51 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import menu from "./docz-lib/config/menu"; +import versions from './docz-lib/config/versions'; + +module.exports = { + title: "Apache Atlas", + files: "**/*.{md,mdx}", + base: "/", + baseUrl:"./public", + src: "./src", + public: "./src/resources", + menu: menu, + atlasVersions: versions, + theme: "theme/", + modifyBundlerConfig: config => { + config.module.rules.push( + { + test: /\.(js)$/, + exclude: /node_modules/, + use: { + loader: "babel-loader", + query: { + presets: ["@babel/react"], + plugins: [ + "@babel/plugin-proposal-class-properties", + "@babel/plugin-syntax-dynamic-import" + ] + } + } + } + ); + return config; + } +}; diff --git a/docs/package-lock.json b/docs/package-lock.json new file mode 100644 index 000000000..ed2c499fa --- /dev/null +++ b/docs/package-lock.json @@ -0,0 +1,11891 @@ +{ + "name": "doc", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/cli": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.4.4.tgz", + "integrity": "sha512-XGr5YjQSjgTa6OzQZY57FAJsdeVSAKR/u/KA5exWIz66IKtv/zXtHy+fIZcMry/EgYegwuHE7vzGnrFhjdIAsQ==", + "requires": { + "chokidar": "^2.0.4", + "commander": "^2.8.1", + "convert-source-map": "^1.1.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.0.0", + "lodash": "^4.17.11", + "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==", + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/core": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.5.tgz", + "integrity": "sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.4", + "@babel/helpers": "^7.4.4", + "@babel/parser": "^7.4.5", + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.4.5", + "@babel/types": "^7.4.4", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.11", + "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==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "@babel/generator": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", + "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "requires": { + "@babel/types": "^7.4.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "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==", + "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==", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-builder-react-jsx": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz", + "integrity": "sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw==", + "requires": { + "@babel/types": "^7.3.0", + "esutils": "^2.0.0" + } + }, + "@babel/helper-call-delegate": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", + "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.5.tgz", + "integrity": "sha512-ZsxkyYiRA7Bg+ZTRpPvB6AbOFKTFFK4LrvTet8lInm0V468MWCaSYJE+I7v2z2r8KNLtYiV+K5kTCnR7dvyZjg==", + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-member-expression-to-functions": "^7.5.5", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5", + "@babel/helper-split-export-declaration": "^7.4.4" + } + }, + "@babel/helper-define-map": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", + "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + } + } + }, + "@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==", + "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==", + "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==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", + "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", + "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", + "requires": { + "@babel/types": "^7.5.5" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + } + } + }, + "@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==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", + "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/template": "^7.4.4", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + } + } + }, + "@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==", + "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==" + }, + "@babel/helper-regex": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", + "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", + "requires": { + "lodash": "^4.17.13" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + } + } + }, + "@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==", + "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.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", + "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.5.5", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/parser": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==" + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "@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==", + "requires": { + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@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==", + "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.4.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.4.tgz", + "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==", + "requires": { + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", + "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==" + }, + "@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==", + "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.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz", + "integrity": "sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.5.5", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.4.tgz", + "integrity": "sha512-z7MpQz3XC/iQJWXH9y+MaWcLPNSMY9RQSthrLzak8R8hCj0fuyNk+Dzi9kfNe/JxxlWQ2g7wkABbgWjW36MTcw==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-decorators": "^7.2.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz", + "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.2.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz", + "integrity": "sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==", + "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==", + "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.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz", + "integrity": "sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + } + }, + "@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==", + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", + "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-flow": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz", + "integrity": "sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg==", + "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==", + "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==", + "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==", + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz", + "integrity": "sha512-dGwbSMA1YhVS8+31CnPR7LB4pcbrzcV99wQzby4uAfrkZPYZlQ7ImwdpzLqi6Z6IL02b8IAL379CaMwo0x5Lag==", + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz", + "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==", + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz", + "integrity": "sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + } + } + }, + "@babel/plugin-transform-classes": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", + "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.5.5", + "@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.5.5", + "@babel/helper-split-export-declaration": "^7.4.4", + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz", + "integrity": "sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz", + "integrity": "sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", + "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", + "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==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-flow-strip-types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.4.4.tgz", + "integrity": "sha512-WyVedfeEIILYEaWGAUWzVNyqG4sfsNooMhXWsu/YzOvVGcsnPb5PguysjJqI3t3qiaYj0BR8T2f5njdjTGe44Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.2.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", + "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", + "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", + "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", + "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz", + "integrity": "sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ==", + "requires": { + "@babel/helper-module-transforms": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", + "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==", + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.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==", + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz", + "integrity": "sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg==", + "requires": { + "regexp-tree": "^0.1.6" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", + "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", + "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", + "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", + "requires": { + "@babel/helper-call-delegate": "^7.4.4", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", + "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.5.0.tgz", + "integrity": "sha512-c5Ba8cpybZFp1Izkf2sWGuNjOxoQ32tFgBvvYvwGhi4+9f6vGiSK9Gex4uVuO/Va6YJFu41aAh1MzMjUWkp0IQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz", + "integrity": "sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg==", + "requires": { + "@babel/helper-builder-react-jsx": "^7.3.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==", + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", + "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", + "requires": { + "regenerator-transform": "^0.14.0" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", + "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.5.5.tgz", + "integrity": "sha512-6Xmeidsun5rkwnGfMOp6/z9nSzWpHFNVr2Jx7kwoq4mVatQfQx5S56drBgEHF+XQbKOdIaOiMIINvp/kAwMN+w==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "resolve": "^1.8.1", + "semver": "^5.5.1" + } + }, + "@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==", + "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==", + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", + "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", + "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==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.5.5.tgz", + "integrity": "sha512-pehKf4m640myZu5B2ZviLaiBlxMCjSZ1qTEO459AXKX5GnPueyulJeCqZFs1nz/Ya2dDzXQ1NxZ/kKNWyD4h6w==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.5.5", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-typescript": "^7.2.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz", + "integrity": "sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + } + }, + "@babel/polyfill": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.4.4.tgz", + "integrity": "sha512-WlthFLfhQQhh+A2Gn5NSFl0Huxz36x86Jn+E9OW7ibK8edKPq+KLy4apM1yDpQ8kJOVi1OVjpP4vSDLdrI04dg==", + "requires": { + "core-js": "^2.6.5", + "regenerator-runtime": "^0.13.2" + }, + "dependencies": { + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" + } + } + }, + "@babel/preset-env": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.5.5.tgz", + "integrity": "sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A==", + "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-dynamic-import": "^7.5.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^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.5.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.5.5", + "@babel/plugin-transform-classes": "^7.5.5", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.5.0", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/plugin-transform-duplicate-keys": "^7.5.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.4.4", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.5.0", + "@babel/plugin-transform-modules-commonjs": "^7.5.0", + "@babel/plugin-transform-modules-systemjs": "^7.5.0", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.5.5", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.4.5", + "@babel/plugin-transform-reserved-words": "^7.2.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.4.4", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.4.4", + "@babel/types": "^7.5.5", + "browserslist": "^4.6.0", + "core-js-compat": "^3.1.1", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + } + } + }, + "@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==", + "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/preset-typescript": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.3.3.tgz", + "integrity": "sha512-mzMVuIP4lqtn4du2ynEfdO0+RYcslwrZiJHXu4MGaC1ctJiW2fyaeDrtjJGs7R/KebZ1sgowcIoWf4uRpEfKEg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.3.2" + } + }, + "@babel/register": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.5.5.tgz", + "integrity": "sha512-pdd5nNR+g2qDkXZlW1yRCWFlNrAn2PPdnZUB72zjX4l1Vv4fMRRLwyf+n/idFCLI1UgVGboUU8oVziwTBiyNKQ==", + "requires": { + "core-js": "^3.0.0", + "find-cache-dir": "^2.0.0", + "lodash": "^4.17.13", + "mkdirp": "^0.5.1", + "pirates": "^4.0.0", + "source-map-support": "^0.5.9" + }, + "dependencies": { + "core-js": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.2.1.tgz", + "integrity": "sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw==" + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + } + } + }, + "@babel/runtime": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", + "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", + "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.4", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.4.5", + "@babel/types": "^7.4.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "@babel/types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "@emotion/cache": { + "version": "10.0.14", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.14.tgz", + "integrity": "sha512-HNGEwWnPlNyy/WPXBXzbjzkzeZFV657Z99/xq2xs5yinJHbMfi3ioCvBJ6Y8Zc8DQzO9F5jDmVXJB41Ytx3QMw==", + "dev": true, + "requires": { + "@emotion/sheet": "0.9.3", + "@emotion/stylis": "0.8.4", + "@emotion/utils": "0.11.2", + "@emotion/weak-memoize": "0.2.3" + } + }, + "@emotion/core": { + "version": "10.0.14", + "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.0.14.tgz", + "integrity": "sha512-G9FbyxLm3lSnPfLDcag8fcOQBKui/ueXmWOhV+LuEQg9HrqExuWnWaO6gm6S5rNe+AMcqLXVljf8pYgAdFLNSg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.4.3", + "@emotion/cache": "^10.0.14", + "@emotion/css": "^10.0.14", + "@emotion/serialize": "^0.11.8", + "@emotion/sheet": "0.9.3", + "@emotion/utils": "0.11.2" + } + }, + "@emotion/css": { + "version": "10.0.14", + "resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.14.tgz", + "integrity": "sha512-MozgPkBEWvorcdpqHZE5x1D/PLEHUitALQCQYt2wayf4UNhpgQs2tN0UwHYS4FMy5ROBH+0ALyCFVYJ/ywmwlg==", + "dev": true, + "requires": { + "@emotion/serialize": "^0.11.8", + "@emotion/utils": "0.11.2", + "babel-plugin-emotion": "^10.0.14" + } + }, + "@emotion/hash": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.7.2.tgz", + "integrity": "sha512-RMtr1i6E8MXaBWwhXL3yeOU8JXRnz8GNxHvaUfVvwxokvayUY0zoBeWbKw1S9XkufmGEEdQd228pSZXFkAln8Q==", + "dev": true + }, + "@emotion/is-prop-valid": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.7.3.tgz", + "integrity": "sha512-uxJqm/sqwXw3YPA5GXX365OBcJGFtxUVkB6WyezqFHlNe9jqUWH5ur2O2M8dGBz61kn1g3ZBlzUunFQXQIClhA==", + "requires": { + "@emotion/memoize": "0.7.1" + } + }, + "@emotion/memoize": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.1.tgz", + "integrity": "sha512-Qv4LTqO11jepd5Qmlp3M1YEjBumoTHcHFdgPTQ+sFlIL5myi/7xu/POwP7IRu6odBdmLXdtIs1D6TuW6kbwbbg==" + }, + "@emotion/serialize": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.8.tgz", + "integrity": "sha512-Qb6Us2Yk1ZW8SOYH6s5z7qzXXb2iHwVeqc6FjXtac0vvxC416ki0eTtHNw4Q5smoyxdyZh3519NKGrQvvvrZ/Q==", + "dev": true, + "requires": { + "@emotion/hash": "0.7.2", + "@emotion/memoize": "0.7.2", + "@emotion/unitless": "0.7.4", + "@emotion/utils": "0.11.2", + "csstype": "^2.5.7" + }, + "dependencies": { + "@emotion/memoize": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.2.tgz", + "integrity": "sha512-hnHhwQzvPCW1QjBWFyBtsETdllOM92BfrKWbUTmh9aeOlcVOiXvlPsK4104xH8NsaKfg86PTFsWkueQeUfMA/w==", + "dev": true + }, + "@emotion/unitless": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.4.tgz", + "integrity": "sha512-kBa+cDHOR9jpRJ+kcGMsysrls0leukrm68DmFQoMIWQcXdr2cZvyvypWuGYT7U+9kAExUE7+T7r6G3C3A6L8MQ==", + "dev": true + } + } + }, + "@emotion/sheet": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.3.tgz", + "integrity": "sha512-c3Q6V7Df7jfwSq5AzQWbXHa5soeE4F5cbqi40xn0CzXxWW9/6Mxq48WJEtqfWzbZtW9odZdnRAkwCQwN12ob4A==", + "dev": true + }, + "@emotion/styled": { + "version": "10.0.14", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-10.0.14.tgz", + "integrity": "sha512-Ae8d5N/FmjvZKXjqWcjfhZhjCdkvxZSqD95Q72BYDNQnsOKLHIA4vWlMolLXDNkw1dIxV3l2pp82Z87HXj6eYQ==", + "dev": true, + "requires": { + "@emotion/styled-base": "^10.0.14", + "babel-plugin-emotion": "^10.0.14" + } + }, + "@emotion/styled-base": { + "version": "10.0.14", + "resolved": "https://registry.npmjs.org/@emotion/styled-base/-/styled-base-10.0.14.tgz", + "integrity": "sha512-1nC5iO/Rk0DY47M5wXCyWpbo/woiwXWfVbNKDM3QRi7CKq8CwC++PQ5HgiYflFrAt1vjzIVZqnzrIn3idUoQgg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.4.3", + "@emotion/is-prop-valid": "0.8.2", + "@emotion/serialize": "^0.11.8", + "@emotion/utils": "0.11.2" + }, + "dependencies": { + "@emotion/is-prop-valid": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.2.tgz", + "integrity": "sha512-ZQIMAA2kLUWiUeMZNJDTeCwYRx1l8SQL0kHktze4COT22occKpDML1GDUXP5/sxhOMrZO8vZw773ni4H5Snrsg==", + "dev": true, + "requires": { + "@emotion/memoize": "0.7.2" + } + }, + "@emotion/memoize": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.2.tgz", + "integrity": "sha512-hnHhwQzvPCW1QjBWFyBtsETdllOM92BfrKWbUTmh9aeOlcVOiXvlPsK4104xH8NsaKfg86PTFsWkueQeUfMA/w==", + "dev": true + } + } + }, + "@emotion/stylis": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.4.tgz", + "integrity": "sha512-TLmkCVm8f8gH0oLv+HWKiu7e8xmBIaokhxcEKPh1m8pXiV/akCiq50FvYgOwY42rjejck8nsdQxZlXZ7pmyBUQ==", + "dev": true + }, + "@emotion/unitless": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.3.tgz", + "integrity": "sha512-4zAPlpDEh2VwXswwr/t8xGNDGg8RQiPxtxZ3qQEXyQsBV39ptTdESCjuBvGze1nLMVrxmTIKmnO/nAV8Tqjjzg==" + }, + "@emotion/utils": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.2.tgz", + "integrity": "sha512-UHX2XklLl3sIaP6oiMmlVzT0J+2ATTVpf0dHQVyPJHTkOITvXfaSqnRk6mdDhV9pR8T/tHc3cex78IKXssmzrA==", + "dev": true + }, + "@emotion/weak-memoize": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.3.tgz", + "integrity": "sha512-zVgvPwGK7c1aVdUVc9Qv7SqepOGRDrqCw7KZPSZziWGxSlbII3gmvGLPzLX4d0n0BMbamBacUrN22zOMyFFEkQ==", + "dev": true + }, + "@hutson/parse-repository-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", + "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==" + }, + "@loadable/component": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@loadable/component/-/component-5.10.2.tgz", + "integrity": "sha512-pUzGRc/mhGzZ0+xJPQErnS68BQEApFYGwn10iSDqBHdDhOruCASTer1J+rYI4jaJJcegJwnuzh7j/SqMoiCyAQ==", + "requires": { + "@babel/runtime": "^7.4.4", + "hoist-non-react-statics": "^3.3.0" + } + }, + "@mdx-js/loader": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@mdx-js/loader/-/loader-1.3.1.tgz", + "integrity": "sha512-wg1uxBZ+7lkfawtznD29Acrh9UJ/sySeaDzgi+Q3zk55A25tPmVxKVjwGXWDC0mrRRJ8cjcoWant3whok+WPDw==", + "requires": { + "@mdx-js/mdx": "^1.3.1", + "@mdx-js/react": "^1.3.1", + "loader-utils": "1.2.3" + } + }, + "@mdx-js/mdx": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.3.1.tgz", + "integrity": "sha512-mLP4iN6OhDnA9IqAiKAFb/wSnmwU1Mb9gy0szzV0QbDHtlinmzQmK2YyEv9Stf8NXvWbsNVTj9p3hy01nZY9yA==", + "requires": { + "@babel/core": "7.5.5", + "@babel/plugin-syntax-jsx": "7.2.0", + "@babel/plugin-syntax-object-rest-spread": "7.2.0", + "@mdx-js/util": "^1.3.1", + "babel-plugin-apply-mdx-type-prop": "^1.3.1", + "babel-plugin-extract-import-names": "^1.3.1", + "camelcase-css": "2.0.1", + "detab": "2.0.2", + "hast-util-raw": "5.0.1", + "lodash.uniq": "4.5.0", + "mdast-util-to-hast": "6.0.1", + "remark-mdx": "^1.3.1", + "remark-parse": "7.0.1", + "remark-squeeze-paragraphs": "3.0.4", + "style-to-object": "0.2.3", + "unified": "8.3.2", + "unist-builder": "1.0.4", + "unist-util-visit": "2.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/core": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", + "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helpers": "^7.5.5", + "@babel/parser": "^7.5.5", + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helpers": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz", + "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==", + "requires": { + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" + } + }, + "@babel/parser": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==" + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "remark-parse": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-7.0.1.tgz", + "integrity": "sha512-WOZLa545jYXtSy+txza6ACudKWByQac4S2DmGk+tAGO/3XnVTOxwyCIxB7nTcLlk8Aayhcuf3cV1WV6U6L7/DQ==", + "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" + } + } + } + }, + "@mdx-js/react": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.3.1.tgz", + "integrity": "sha512-HwpA0r4XiydiUXceAtzguLs3FH8Jbfpgoff3L+pejemiqyxol/FYMxwMu0WcBxti5eJYBqZEwL+C5od6OsS7Gw==" + }, + "@mdx-js/util": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.3.1.tgz", + "integrity": "sha512-YOlSyl/EfTRoO7Twzad6RYJlHcyW1WZo8gDRO+4uFTy6+AHMaqSCMAPJIJkmKwgi+IPojQUGuMzKJ47qxQ9BbA==" + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" + }, + "@reach/router": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@reach/router/-/router-1.2.1.tgz", + "integrity": "sha512-kTaX08X4g27tzIFQGRukaHmNbtMYDS3LEWIS8+l6OayGIw6Oyo1HIF/JzeuR2FoF9z6oV+x/wJSVSq4v8tcUGQ==", + "requires": { + "create-react-context": "^0.2.1", + "invariant": "^2.2.3", + "prop-types": "^15.6.1", + "react-lifecycles-compat": "^3.0.4", + "warning": "^3.0.0" + } + }, + "@sindresorhus/slugify": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-0.9.1.tgz", + "integrity": "sha512-b6heYM9dzZD13t2GOiEQTDE0qX+I1GyOotMwKh9VQqzuNiVdPVT8dM43fe9HNb/3ul+Qwd5oKSEDrDIfhq3bnQ==", + "requires": { + "escape-string-regexp": "^1.0.5", + "lodash.deburr": "^4.1.0" + } + }, + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", + "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==" + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz", + "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==" + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz", + "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==" + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz", + "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==" + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.1.tgz", + "integrity": "sha512-p6z6JJroP989jHWcuraeWpzdejehTmLUpyC9smhTBWyPN0VVGe2phbYxpPTV7Vh8XzmFrcG55idrnfWn/2oQEw==" + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz", + "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==" + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz", + "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==" + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz", + "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==" + }, + "@svgr/babel-preset": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.1.tgz", + "integrity": "sha512-rPFKLmyhlh6oeBv3j2vEAj2nd2QbWqpoJLKzBLjwQVt+d9aeXajVaPNEqrES2spjXKR4OxfgSs7U0NtmAEkr0Q==", + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0", + "@svgr/babel-plugin-svg-dynamic-title": "^4.3.1", + "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0", + "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0", + "@svgr/babel-plugin-transform-svg-component": "^4.2.0" + } + }, + "@svgr/core": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.2.tgz", + "integrity": "sha512-N+tP5CLFd1hP9RpO83QJPZY3NL8AtrdqNbuhRgBkjE/49RnMrrRsFm1wY8pueUfAGvzn6tSXUq29o6ah8RuR5w==", + "requires": { + "@svgr/plugin-jsx": "^4.3.2", + "camelcase": "^5.3.1", + "cosmiconfig": "^5.2.1" + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz", + "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==", + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@svgr/plugin-jsx": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.2.tgz", + "integrity": "sha512-+1GW32RvmNmCsOkMoclA/TppNjHPLMnNZG3/Ecscxawp051XJ2MkO09Hn11VcotdC2EPrDfT8pELGRo+kbZ1Eg==", + "requires": { + "@babel/core": "^7.4.5", + "@svgr/babel-preset": "^4.3.1", + "@svgr/hast-util-to-babel-ast": "^4.3.2", + "svg-parser": "^2.0.0" + } + }, + "@svgr/plugin-svgo": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz", + "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==", + "requires": { + "cosmiconfig": "^5.2.1", + "merge-deep": "^3.0.2", + "svgo": "^1.2.2" + } + }, + "@svgr/webpack": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.2.tgz", + "integrity": "sha512-F3VE5OvyOWBEd2bF7BdtFRyI6E9it3mN7teDw0JQTlVtc4HZEYiiLSl+Uf9Uub6IYHVGc+qIrxxDyeedkQru2w==", + "requires": { + "@babel/core": "^7.4.5", + "@babel/plugin-transform-react-constant-elements": "^7.0.0", + "@babel/preset-env": "^7.4.5", + "@babel/preset-react": "^7.0.0", + "@svgr/core": "^4.3.2", + "@svgr/plugin-jsx": "^4.3.2", + "@svgr/plugin-svgo": "^4.3.1", + "loader-utils": "^1.2.3" + } + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" + }, + "@types/node": { + "version": "12.7.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.2.tgz", + "integrity": "sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg==" + }, + "@types/q": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", + "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" + }, + "@types/unist": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", + "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" + }, + "@types/vfile": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/vfile/-/vfile-3.0.2.tgz", + "integrity": "sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw==", + "requires": { + "@types/node": "*", + "@types/unist": "*", + "@types/vfile-message": "*" + } + }, + "@types/vfile-message": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-1.0.1.tgz", + "integrity": "sha512-mlGER3Aqmq7bqR1tTTIVHq8KSAFFRyGbrxuM8C/H82g6k7r2fS+IMEkIu3D7JHzG10NvPdR8DNx0jr0pwpp4dA==", + "requires": { + "@types/node": "*", + "@types/unist": "*" + } + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==" + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==" + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-contrib/schema-utils": { + "version": "1.0.0-beta.0", + "resolved": "https://registry.npmjs.org/@webpack-contrib/schema-utils/-/schema-utils-1.0.0-beta.0.tgz", + "integrity": "sha512-LonryJP+FxQQHsjGBi6W786TQB1Oym+agTpY0c+Kj8alnIw+DLUJb6SI8Y1GHGhLCH1yPRrucjObUmxNICQ1pg==", + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chalk": "^2.3.2", + "strip-ansi": "^4.0.0", + "text-table": "^0.2.0", + "webpack-log": "^1.1.2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "webpack-log": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-1.2.0.tgz", + "integrity": "sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==", + "requires": { + "chalk": "^2.1.0", + "log-symbols": "^2.1.0", + "loglevelnext": "^1.0.1", + "uuid": "^3.1.0" + } + } + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "@zeit/schemas": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.6.0.tgz", + "integrity": "sha512-uUrgZ8AxS+Lio0fZKAipJjAh415JyrOZowliZAzmnJSsf7piVL5w+G0+gFJ0KSu3QRhvui/7zuvpLz03YjXAhg==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.5.tgz", + "integrity": "sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg==" + }, + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" + }, + "address": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.0.tgz", + "integrity": "sha512-4diPfzWbLEIElVG4AnqP+00SULlPzNuyJFNnmMrLgyaxG6tZXJ1sn7mjBu4fHrJE+Yp/jgylOweJn2xsLMFggQ==" + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "requires": { + "string-width": "^2.0.0" + } + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "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==", + "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==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "arch": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz", + "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==" + }, + "arg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arg/-/arg-2.0.0.tgz", + "integrity": "sha512-XxNTUzKnz1ctK3ZIcI2XUPlD96wbHP2nGqkPKpvk/HNRlPveYrXIVSTk9m3LcqOgDPg3B1nMvdV/K8wZd7PG4w==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "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=" + }, + "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==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" + }, + "array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "requires": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "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==" + } + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "art-template": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/art-template/-/art-template-4.13.2.tgz", + "integrity": "sha512-04ws5k+ndA5DghfheY4c8F1304XJKeTcaXqZCLpxFkNMSkaR3ChW1pX2i9d3sEEOZuLy7de8lFriRaik1jEeOQ==", + "requires": { + "acorn": "^5.0.3", + "escodegen": "^1.8.1", + "estraverse": "^4.2.0", + "html-minifier": "^3.4.3", + "is-keyword-js": "^1.0.3", + "js-tokens": "^3.0.1", + "merge-source-map": "^1.0.3", + "source-map": "^0.5.6" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + } + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "ast-types": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.12.4.tgz", + "integrity": "sha512-ky/YVYCbtVAS8TdMIaTiPFHwEpRB5z1hctepJplTr3UW5q8TDrpIMCILyk8pmLxGtn2KCtC/lSn7zOsaI7nzDw==" + }, + "async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "requires": { + "lodash": "^4.17.11" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "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==" + }, + "axios": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", + "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", + "dev": true, + "requires": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "dev": true, + "requires": { + "debug": "=3.1.0" + } + }, + "is-buffer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", + "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=", + "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=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "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=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "babel-core": { + "version": "7.0.0-bridge.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", + "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==" + }, + "babel-loader": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", + "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", + "requires": { + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "pify": "^4.0.1" + } + }, + "babel-plugin-apply-mdx-type-prop": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.3.1.tgz", + "integrity": "sha512-tyh0iGhU4upNy4ruxOOOnqTO9Ci43gcXrH0vtcVmOMvGjyfhDHzug8ULoZZJqSTl5V77qUskafQsYHF3f1UV9g==", + "requires": { + "@babel/helper-plugin-utils": "7.0.0", + "@mdx-js/util": "^1.3.1" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-emotion": { + "version": "10.0.14", + "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.14.tgz", + "integrity": "sha512-T7hdxJ4xXkKW3OXcizK0pnUJlBeNj/emjQZPDIZvGOuwl2adIgicQWRNkz6BuwKdDTrqaXQn1vayaL6aL8QW5A==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@emotion/hash": "0.7.2", + "@emotion/memoize": "0.7.2", + "@emotion/serialize": "^0.11.8", + "babel-plugin-macros": "^2.0.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^1.0.5", + "find-root": "^1.1.0", + "source-map": "^0.5.7" + }, + "dependencies": { + "@emotion/memoize": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.2.tgz", + "integrity": "sha512-hnHhwQzvPCW1QjBWFyBtsETdllOM92BfrKWbUTmh9aeOlcVOiXvlPsK4104xH8NsaKfg86PTFsWkueQeUfMA/w==", + "dev": true + } + } + }, + "babel-plugin-export-metadata": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-export-metadata/-/babel-plugin-export-metadata-1.2.0.tgz", + "integrity": "sha512-rOTzhs/rXbuYMm4e8uTgAvTUw8H7QdU8maFy1ClArp/j8cpgzB80/oixQFiT/KAlLB+6ygLxr3befj97k2WppA==", + "requires": { + "@babel/cli": "^7.4.4", + "@babel/core": "^7.4.4", + "@babel/preset-env": "^7.4.4", + "@babel/template": "^7.4.4", + "babel-core": "7.0.0-bridge.0", + "lodash": "^4.17.11" + } + }, + "babel-plugin-extract-import-names": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.3.1.tgz", + "integrity": "sha512-7KqXFwbzj9y6anLoIpMKQsC2J3PsiZMRaSP3qTCP9PY38Bz2cwsJnTIMKvottVQB2evBCYPqjp3VPSZ74jM1Dw==", + "requires": { + "@babel/helper-plugin-utils": "7.0.0" + } + }, + "babel-plugin-lodash": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/babel-plugin-lodash/-/babel-plugin-lodash-3.3.4.tgz", + "integrity": "sha512-yDZLjK7TCkWl1gpBeBGmuaDIFhZKmkoL+Cu2MUUjv5VxUZx/z7tBGBCBcQs5RI1Bkz5LLmNdjx7paOyQtMovyg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0-beta.49", + "@babel/types": "^7.0.0-beta.49", + "glob": "^7.1.1", + "lodash": "^4.17.10", + "require-package-name": "^2.0.1" + } + }, + "babel-plugin-macros": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.5.1.tgz", + "integrity": "sha512-xN3KhAxPzsJ6OQTktCanNpIFnnMsCV+t8OloKxIL72D6+SUZYFn9qfklPgef5HyyDtzYZqqb+fs1S12+gQY82Q==", + "dev": true, + "requires": { + "@babel/runtime": "^7.4.2", + "cosmiconfig": "^5.2.0", + "resolve": "^1.10.0" + } + }, + "babel-plugin-named-asset-import": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.3.tgz", + "integrity": "sha512-1XDRysF4894BUdMChT+2HHbtJYiO7zx5Be7U6bT8dISy7OdyETMGIAQBMPQCsY1YRf0xcubwnKKaDr5bk15JTA==" + }, + "babel-plugin-react-transform": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-react-transform/-/babel-plugin-react-transform-3.0.0.tgz", + "integrity": "sha512-4vJGddwPiHAOgshzZdGwYy4zRjjIr5SMY7gkOaCyIASjgpcsyLTlZNuB5rHOFoaTvGlhfo8/g4pobXPyHqm/3w==", + "dev": true, + "requires": { + "lodash": "^4.6.1" + } + }, + "babel-plugin-styled-components": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-1.10.1.tgz", + "integrity": "sha512-F6R2TnPGNN6iuXCs0xQ+EsrunwNoWI55J5I8Pkd/+fzzbv1I4gFgTaZepMOVpLobYWU2XaLIm+73L0zD3CnOdQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-module-imports": "^7.0.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "lodash": "^4.17.11" + } + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" + }, + "babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" + }, + "babel-preset-react-app": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.0.1.tgz", + "integrity": "sha512-v7MeY+QxdBhM9oU5uOQCIHLsErYkEbbjctXsb10II+KAnttbe0rvprvP785dRxfa9dI4ZbsGXsRU07Qdi5BtOw==", + "requires": { + "@babel/core": "7.5.5", + "@babel/plugin-proposal-class-properties": "7.5.5", + "@babel/plugin-proposal-decorators": "7.4.4", + "@babel/plugin-proposal-object-rest-spread": "7.5.5", + "@babel/plugin-syntax-dynamic-import": "7.2.0", + "@babel/plugin-transform-destructuring": "7.5.0", + "@babel/plugin-transform-flow-strip-types": "7.4.4", + "@babel/plugin-transform-react-display-name": "7.2.0", + "@babel/plugin-transform-runtime": "7.5.5", + "@babel/preset-env": "7.5.5", + "@babel/preset-react": "7.0.0", + "@babel/preset-typescript": "7.3.3", + "@babel/runtime": "7.5.5", + "babel-plugin-dynamic-import-node": "2.3.0", + "babel-plugin-macros": "2.6.1", + "babel-plugin-transform-react-remove-prop-types": "0.4.24" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/core": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", + "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helpers": "^7.5.5", + "@babel/parser": "^7.5.5", + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helpers": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz", + "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==", + "requires": { + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" + } + }, + "@babel/parser": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==" + }, + "@babel/runtime": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz", + "integrity": "sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "babel-plugin-macros": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.6.1.tgz", + "integrity": "sha512-6W2nwiXme6j1n2erPOnmRiWfObUhWH7Qw1LMi9XZy8cj+KtESu3T6asZvtk5bMQQjX8te35o7CFueiSdL/2NmQ==", + "requires": { + "@babel/runtime": "^7.4.2", + "cosmiconfig": "^5.2.0", + "resolve": "^1.10.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "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=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } + } + }, + "bail": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.4.tgz", + "integrity": "sha512-S8vuDB4w6YpRhICUDET3guPlQpaJl7od94tpZ0Fvnyp+MKW/HyDTcRDck+29C9g+d/qQHnddRH3+94kZdrW0Ww==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "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=", + "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==", + "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==", + "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==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, + "bfj": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", + "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==", + "requires": { + "bluebird": "^3.5.5", + "check-types": "^8.0.3", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "bluebird": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + }, + "dependencies": { + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "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==", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.6.tgz", + "integrity": "sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA==", + "requires": { + "caniuse-lite": "^1.0.30000984", + "electron-to-chromium": "^1.3.191", + "node-releases": "^1.1.25" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "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==" + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" + }, + "buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz", + "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "cacache": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.2.tgz", + "integrity": "sha512-ifKgxH2CKhJEg6tNdAwziu6Q33EvuG26tYcda6PT3WKisZcYDXsnEdnRv67Po3yCzFfaSoMjGZzJyD2c3DT1dg==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "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" + } + }, + "cache-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-3.0.1.tgz", + "integrity": "sha512-HzJIvGiGqYsFUrMjAJNDbVZoG7qQA+vy9AIoKs7s9DscNfki0I589mf2w6/tW+kkFH3zyiknoWV5Jdynu6b/zw==", + "requires": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^1.0.0" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + } + } + }, + "camelize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", + "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" + }, + "caniuse-lite": { + "version": "1.0.30000989", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz", + "integrity": "sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw==" + }, + "capitalize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capitalize/-/capitalize-2.0.0.tgz", + "integrity": "sha512-HwGrAbSn44Tm5Nz+m02oQHf+9y771rmb/cTbXFcoADy29LFRCj4PhWBT54qxfY2HJBWBplwx17Pd4ek6OFbr/Q==" + }, + "ccount": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.4.tgz", + "integrity": "sha512-fpZ81yYfzentuieinmGnphk0pLkOTMm6MZdVqwd77ROvhko6iujLNGrHH5E7utq3ygWklwfmwuG+A7P+NpqT6w==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "character-entities": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.3.tgz", + "integrity": "sha512-yB4oYSAa9yLcGyTbB4ItFwHw43QHdH129IJ5R+WvxOkWlyFnR5FAaBNnUq4mcxsTVZGh28bHoeTHMKXH1wZf3w==" + }, + "character-entities-html4": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.3.tgz", + "integrity": "sha512-SwnyZ7jQBCRHELk9zf2CN5AnGEc2nA+uKMZLHvcqhpPprjkYhiLn0DywMHgN5ttFZuITMATbh68M6VIVKwJbcg==" + }, + "character-entities-legacy": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.3.tgz", + "integrity": "sha512-YAxUpPoPwxYFsslbdKkhrGnXAtXoHNgYjlBM3WMXkWGTl5RsY3QmOyhwAgL8Nxm9l5LBThXGawxKPn68y6/fww==" + }, + "character-reference-invalid": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.3.tgz", + "integrity": "sha512-VOq6PRzQBam/8Jm6XBGk2fNEnHXAdGd6go0rtd4weAGECBamHDwwCQSOT12TACIYUZegUXnV6xBXqUssijtxIg==" + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "check-types": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz", + "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==" + }, + "chokidar": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "chownr": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", + "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==" + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "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==", + "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=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==", + "dev": true + }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" + }, + "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=", + "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=" + }, + "clipboard": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.4.tgz", + "integrity": "sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ==", + "dev": true, + "optional": true, + "requires": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "clipboardy": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-1.2.3.tgz", + "integrity": "sha512-2WNImOvCRe6r63Gk9pShfkwXsVtKCroMAevIbiae021mS850UkWPbevxsBz3tnvjZIEGvlwaqCPsw+4ulzNgJA==", + "requires": { + "arch": "^2.1.0", + "execa": "^0.8.0" + }, + "dependencies": { + "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=", + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", + "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + } + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.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=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "clone-deep": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", + "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", + "requires": { + "for-own": "^0.1.3", + "is-plain-object": "^2.0.1", + "kind-of": "^3.0.2", + "lazy-cache": "^1.0.3", + "shallow-clone": "^0.1.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "codesandboxer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/codesandboxer/-/codesandboxer-1.0.3.tgz", + "integrity": "sha512-LRBGbQ707AsaC8cPEMEr5K5y2EGskg7T5K4RIC30wzgr1LKeLEtB2exy4P+QwUrQKwJOgxmiq1yKPLnKzXWJ+w==", + "requires": { + "babel-runtime": "^6.26.0", + "form-data": "^2.3.2", + "isomorphic-unfetch": "^2.0.0", + "lz-string": "^1.4.4", + "path-browserify": "^1.0.0" + } + }, + "codesandboxer-fs": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/codesandboxer-fs/-/codesandboxer-fs-1.0.3.tgz", + "integrity": "sha512-9BpvAGy2zZzkYU6zq2pzbPgzDewTV/xojE6xXtDEI++wTADNs/mkguDvjvxUH5BopJJ3LOZGHxpJf2o6aodYQA==", + "requires": { + "codesandboxer": "^1.0.3", + "meow": "^5.0.0", + "pkg-dir": "^2.0.0", + "resolve": "^1.7.1" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "collapse-white-space": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.5.tgz", + "integrity": "sha512-703bOOmytCYAX9cXYqoikYIx6twmFCXsnzRQheBcTG3nzKYBR4P/+wkYeH+Mvj7qUz8zZDtdyzbxfnEi/kYzRQ==" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "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==", + "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=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "comma-separated-tokens": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.7.tgz", + "integrity": "sha512-Jrx3xsP4pPv4AwJUDWY9wOXGtwPXARej6Xd99h4TUGotmf8APuquKMpK+dnD3UgyxK7OEWaisjZz+3b5jtL6xQ==" + }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" + }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "compressible": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", + "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "requires": { + "mime-db": ">= 1.40.0 < 2" + } + }, + "compression": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", + "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.14", + "debug": "2.6.9", + "on-headers": "~1.0.1", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" + }, + "consola": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.10.1.tgz", + "integrity": "sha512-4sxpH6SGFYLADfUip4vuY65f/gEogrzJoniVhNUYkJHtng0l8ZjnDCqxxrSVRHOHwKxsy8Vm5ONZh1wOR3/l/w==" + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "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==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "core-js-compat": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.2.1.tgz", + "integrity": "sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A==", + "requires": { + "browserslist": "^4.6.6", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "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=" + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "create-react-context": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.3.tgz", + "integrity": "sha512-CQBmD0+QGgTaxDL3OX1IDXYqjkp2It4RIbcb99jS6AEg27Ga+a9G3JtK6SIu0HBwPLZlmwt9F7UwWA4Bn92Rag==", + "requires": { + "fbjs": "^0.8.0", + "gud": "^1.0.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU=" + }, + "css-select": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.0.2.tgz", + "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^2.1.2", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + }, + "css-to-react-native": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-2.3.1.tgz", + "integrity": "sha512-yO+oEx1Lf+hDKasqQRVrAvzMCz825Huh1VMlEEDlRWyAhFb/FWb6I0KpEF1PkyKQ7NEdcx9d5M2ZEWgJAsgPvQ==", + "requires": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^3.3.0" + } + }, + "css-tree": { + "version": "1.0.0-alpha.33", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.33.tgz", + "integrity": "sha512-SPt57bh5nQnpsTBsx/IXbO14sRc9xXu5MtMAVuo0BaQQmyf0NupNPPSoMaqiAF5tDFafYsTkfeH4Q/HCKXkg4w==", + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.5.3" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" + }, + "csso": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", + "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==", + "requires": { + "css-tree": "1.0.0-alpha.29" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.29", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", + "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", + "requires": { + "mdn-data": "~1.1.0", + "source-map": "^0.5.3" + } + }, + "mdn-data": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", + "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==" + } + } + }, + "csstype": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.5.tgz", + "integrity": "sha512-JsTaiksRsel5n7XwqPAfB0l3TFKdpjW/kgAELf9vrb5adGA7UCPLajKK5s3nFrcFm3Rkyp/Qkgl73ENc1UY3cA==", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "^1.0.1" + } + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=" + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + } + } + }, + "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=" + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "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=" + }, + "deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==" + }, + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "requires": { + "kind-of": "^5.0.2" + }, + "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==" + } + } + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "dependencies": { + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + } + } + }, + "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==", + "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==", + "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==", + "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==", + "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==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", + "dev": true, + "optional": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detab": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.2.tgz", + "integrity": "sha512-Q57yPrxScy816TTE1P/uLRXLDKjXhvYTbfxS/e6lPD+YrqghbsMlGB9nQzj/zVtSPaF0DFPSdO916EWO4sQUyQ==", + "requires": { + "repeat-string": "^1.5.4" + } + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" + }, + "detect-port": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", + "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "requires": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "requires": { + "esutils": "^2.0.2" + } + }, + "docz": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/docz/-/docz-1.2.0.tgz", + "integrity": "sha512-E9X9ffYtv3W/jXVdOi24oeQ4zM6ZCCgp4ls3CIfMRPjR2ZB02qCzIDzXa7pjQyqUVpQAerQ98CVjR1LjLJwj6Q==", + "requires": { + "@loadable/component": "^5.9.0", + "@mdx-js/react": "^1.0.16", + "@reach/router": "^1.2.1", + "array-sort": "^1.0.0", + "capitalize": "^2.0.0", + "docz-core": "^1.2.0", + "fast-deep-equal": "^2.0.1", + "lodash": "^4.17.11", + "match-sorter": "^3.0.0", + "prop-types": "^15.7.2", + "react": "^16.8.6", + "react-dom": "^16.8.6", + "ulid": "^2.3.0", + "yargs": "^13.2.2" + }, + "dependencies": { + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "docz-core": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/docz-core/-/docz-core-1.2.0.tgz", + "integrity": "sha512-ifCycw3Vbw19bb8OPjFSA+INXBSYy/bgAZXRl8sh+nZJL8MJh3cnhl3xfeTjHrQBXeHCKr2qfzBrhhrYyiThmg==", + "requires": { + "@babel/core": "7.4.4", + "@babel/polyfill": "7.4.4", + "@babel/runtime": "^7.4.4", + "@mdx-js/loader": "^1.0.18", + "@sindresorhus/slugify": "^0.9.1", + "@svgr/webpack": "^4.2.0", + "acorn": "6.0.5", + "babel-loader": "^8.0.5", + "babel-plugin-export-metadata": "^1.2.0", + "babel-plugin-named-asset-import": "^0.3.2", + "babel-preset-react-app": "^9.0.0", + "cache-loader": "^3.0.0", + "chalk": "^2.4.2", + "chokidar": "^3.0.0", + "common-tags": "^1.8.0", + "detect-port": "^1.3.0", + "docz-utils": "^1.2.0", + "dotenv": "^8.0.0", + "env-dot-prop": "^2.0.1", + "express": "^4.16.4", + "fast-deep-equal": "^2.0.1", + "fast-glob": "^2.2.6", + "file-loader": "^3.0.1", + "find-up": "^3.0.0", + "fs-extra": "^7.0.1", + "get-pkg-repo": "^4.1.0", + "html-minifier": "^4.0.0", + "humanize-string": "^2.1.0", + "load-cfg": "^1.2.0", + "lodash": "^4.17.11", + "mini-html-webpack-plugin": "^0.2.3", + "p-reduce": "^2.1.0", + "react-dev-utils": "^9.0.1", + "react-docgen": "^4.1.1", + "react-docgen-actual-name-handler": "^1.2.0", + "react-docgen-external-proptypes-handler": "^1.0.2", + "react-docgen-typescript": "^1.12.4", + "react-hot-loader": "^4.8.4", + "recast": "^0.17.6", + "rehype-docz": "^1.2.0", + "rehype-slug": "^2.0.2", + "remark-docz": "^1.2.0", + "remark-frontmatter": "^1.3.1", + "remark-parse": "^6.0.2", + "resolve": "^1.10.1", + "serve": "^11.0.0", + "signale": "^1.4.0", + "source-map-loader": "^0.2.4", + "terser-webpack-plugin": "^1.2.3", + "thread-loader": "^2.1.2", + "titleize": "^2.1.0", + "typescript": "3.3.4000", + "url-loader": "^1.1.2", + "webpack": "^4.30.0", + "webpack-bundle-analyzer": "^3.3.2", + "webpack-chain": "^6.0.0", + "webpack-dev-server": "^3.3.1", + "webpack-hot-client": "^4.1.1", + "webpack-manifest-plugin": "^2.0.4", + "webpackbar": "^3.2.0", + "ws": "^7.0.0", + "yargs": "^13.2.2" + }, + "dependencies": { + "@babel/core": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.4.tgz", + "integrity": "sha512-lQgGX3FPRgbz2SKmhMtYgJvVzGZrmjaF4apZ2bLwofAKiSjxU0drPh4S/VasyYXwaTs+A1gvQ45BN8SQJzHsQQ==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.4", + "@babel/helpers": "^7.4.4", + "@babel/parser": "^7.4.4", + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.11", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "anymatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.0.3.tgz", + "integrity": "sha512-c6IvoeBECQlMVuYUjSwimnhmztImpErfxJzWZhIQinIvQWoGOnB0dLIgifbPHQt5heS6mNlaZG16f06H3C8t1g==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.0.2.tgz", + "integrity": "sha512-c4PR2egjNjI1um6bamCQ6bUNPDiyofNQruHvKgHQ4gDUP/ITSVSzNsiI5OWtHOsX323i5ha/kk4YmOZ1Ktg7KA==", + "requires": { + "anymatch": "^3.0.1", + "braces": "^3.0.2", + "fsevents": "^2.0.6", + "glob-parent": "^5.0.0", + "is-binary-path": "^2.1.0", + "is-glob": "^4.0.1", + "normalize-path": "^3.0.0", + "readdirp": "^3.1.1" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.7.tgz", + "integrity": "sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==", + "optional": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "glob-parent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", + "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "readdirp": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.1.2.tgz", + "integrity": "sha512-8rhl0xs2cxfVsqzreYCvs8EwBfn/DhVdqtoLmw19uI3SC5avYX9teCurlErfpPXGmYtMHReGaP2RsLnFvz/lnw==", + "requires": { + "picomatch": "^2.0.4" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "docz-utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/docz-utils/-/docz-utils-1.2.0.tgz", + "integrity": "sha512-1iuvNJr1PXevzi1hIYyAnytyeITgHzJNBQ1gcbFRWA4+4jf6sU4YLOazyiOFk5Kb1dpppaMvmygKvt+eGy4p0Q==", + "requires": { + "@babel/generator": "^7.4.4", + "@babel/parser": "^7.4.4", + "@babel/traverse": "^7.4.4", + "art-template": "^4.13.2", + "codesandboxer-fs": "^1.0.1", + "fs-extra": "^7.0.1", + "humanize-string": "^2.1.0", + "js-string-escape": "^1.0.1", + "jsx-ast-utils": "^2.1.0", + "lodash": "^4.17.11", + "prettier": "^1.17.0", + "remark-frontmatter": "^1.3.1", + "remark-parse": "^6.0.2", + "remark-parse-yaml": "^0.0.2", + "remark-slug": "^5.1.1", + "signale": "^1.4.0", + "strip-indent": "^3.0.0", + "to-vfile": "^5.0.2", + "unescape-js": "^1.1.1", + "unified": "^7.1.0", + "unist-util-find": "^1.0.1", + "unist-util-is": "^2.1.2", + "unist-util-visit": "^1.4.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" + }, + "unified": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-7.1.0.tgz", + "integrity": "sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw==", + "requires": { + "@types/unist": "^2.0.0", + "@types/vfile": "^3.0.0", + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^1.1.0", + "trough": "^1.0.0", + "vfile": "^3.0.0", + "x-is-string": "^0.1.0" + } + }, + "unist-util-is": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.3.tgz", + "integrity": "sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA==" + }, + "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.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "requires": { + "unist-util-visit-parents": "^2.0.0" + } + }, + "vfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz", + "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==", + "requires": { + "is-buffer": "^2.0.0", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "^1.0.0", + "vfile-message": "^1.0.0" + } + }, + "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" + } + } + } + }, + "dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.1.2" + } + }, + "dom-serializer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.1.tgz", + "integrity": "sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q==", + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==" + } + } + }, + "dom-walk": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "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" + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "requires": { + "is-obj": "^1.0.0" + } + }, + "dotenv": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.1.0.tgz", + "integrity": "sha512-GUE3gqcDCaMltj2++g6bRQ5rBJWtkWTmqmD0fo1RnnMuUqHNCt2oTPeDnS9n6fKYvlhn7AeBkb38lymBtWBQdA==" + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "ejs": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.2.tgz", + "integrity": "sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q==" + }, + "electron-to-chromium": { + "version": "1.3.235", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.235.tgz", + "integrity": "sha512-xNabEDbMIKPLQd6xgv4nyyeMaWXIKSJr6G51ZhUemHhbz6kjZAYcygA8CvfEcMF+Mt5eLmDWaLmfSOWdQxzBVQ==" + }, + "elliptic": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.0.tgz", + "integrity": "sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "email-addresses": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.0.3.tgz", + "integrity": "sha512-kUlSC06PVvvjlMRpNIl3kR1NRXLEe86VQ7N0bQeaCZb2g+InShCeHQp/JvyYNTugMnRN2NvJhHlc3q12MWbbpg==", + "dev": true + }, + "emoji-regex": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.1.1.tgz", + "integrity": "sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4=" + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "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" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==" + }, + "env-dot-prop": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/env-dot-prop/-/env-dot-prop-2.0.1.tgz", + "integrity": "sha512-L0PFMUHxuafXE0qdc6g+VftmjZKcMovQeutjQ5Cw9AFR6LIZtTuUDj/fDFv083Je4ftDiE5K46MBffToECkjhw==", + "requires": { + "dot-prop": "^4.2.0" + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "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==", + "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==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.50", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz", + "integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "^1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "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=" + }, + "escodegen": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", + "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + } + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + }, + "events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==" + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "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=", + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "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": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "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=", + "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==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "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==", + "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=", + "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=", + "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==", + "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==", + "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==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "facepaint": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/facepaint/-/facepaint-1.2.1.tgz", + "integrity": "sha512-oNvBekbhsm/0PNSOWca5raHNAi6dG960Bx6LJgxDPNF59WpuspgQ17bN5MKwOr7JcFdQYc7StW3VZ28DBZLavQ==" + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "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=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=", + "requires": { + "punycode": "^1.3.2" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "fault": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.3.tgz", + "integrity": "sha512-sfFuP4X0hzrbGKjAUNXYvNqsZ5F6ohx/dZ9I0KQud/aiZNwg263r5L9yGB0clvXHCkzXh5W3t7RSHchggYIFmA==", + "requires": { + "format": "^0.2.2" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "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" + } + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==" + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", + "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==", + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^1.0.0" + } + }, + "filename-reserved-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz", + "integrity": "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q=", + "dev": true + }, + "filenamify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz", + "integrity": "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=", + "dev": true, + "requires": { + "filename-reserved-regex": "^1.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" + } + }, + "filenamify-url": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/filenamify-url/-/filenamify-url-1.0.0.tgz", + "integrity": "sha1-syvYExnvWGO3MHi+1Q9GpPeXX1A=", + "dev": true, + "requires": { + "filenamify": "^1.0.0", + "humanize-url": "^1.0.0" + } + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==" + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", + "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", + "requires": { + "debug": "^3.2.6" + }, + "dependencies": { + "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" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "^1.0.1" + } + }, + "fork-ts-checker-webpack-plugin": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-1.5.0.tgz", + "integrity": "sha512-zEhg7Hz+KhZlBhILYpXy+Beu96gwvkROWJiTXOCyOOMMrdBIRPvsBpBqgTI4jfJGrJXcqGwJR8zsBGDmzY0jsA==", + "requires": { + "babel-code-frame": "^6.22.0", + "chalk": "^2.4.1", + "chokidar": "^2.0.4", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + } + }, + "form-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.0.tgz", + "integrity": "sha512-WXieX3G/8side6VIqx44ablyULoGruSde5PNTxoUyo5CeyAMX6nVWUd0rgist/EuX655cjhUhTo1Fo3tRYqbcA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=" + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "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==" + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": 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.3", + "bundled": 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, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": 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, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": 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.3", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "optional": 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, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "optional": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "get-pkg-repo": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.1.0.tgz", + "integrity": "sha512-BHJovsEz9igoxU9Idfa9XjKr0OuAfg6/wInYegP0/M3efsdVtKo1DipPebwnTZXtL9gzaPLvJv74J/U68yiiMg==", + "requires": { + "@hutson/parse-repository-url": "^3.0.0", + "hosted-git-info": "^2.1.4", + "meow": "^5.0.0", + "through2": "^2.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "gh-pages": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-2.0.1.tgz", + "integrity": "sha512-uFlk3bukljeiWKQ2XvPfjcSi/ou7IfoDf2p+Fj672saLAr8bnOdFVqI/JSgrSgInKpCg5BksxEwGUl++dbg8Dg==", + "dev": true, + "requires": { + "async": "^2.6.1", + "commander": "^2.18.0", + "email-addresses": "^3.0.1", + "filenamify-url": "^1.0.0", + "fs-extra": "^7.0.0", + "globby": "^6.1.0", + "graceful-fs": "^4.1.11", + "rimraf": "^2.6.2" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "github-buttons": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/github-buttons/-/github-buttons-2.2.9.tgz", + "integrity": "sha512-G/UGx6GKUL3747gTUULGGqWDjKANVbLCnCHdYMqf1iUGYxIj+wMHK9WG4e4J/V0bG03auI4o6bZJQf7IjHyE1A==", + "dev": true + }, + "github-slugger": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.2.1.tgz", + "integrity": "sha512-SsZUjg/P03KPzQBt7OxJPasGw6NRO5uOgiZ5RGXVud5iSIZ0eNZeNp5rTwCxtavrRUa/A77j8mePVc5lEvk0KQ==", + "requires": { + "emoji-regex": ">=6.0.0 <=6.1.1" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "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=", + "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=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=" + }, + "global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "requires": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globby": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", + "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", + "requires": { + "array-union": "^1.0.1", + "dir-glob": "2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + } + } + }, + "good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "dev": true, + "optional": true, + "requires": { + "delegate": "^3.1.2" + } + }, + "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==" + }, + "gud": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + } + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "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=", + "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=" + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "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=", + "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=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash-source": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hash-source/-/hash-source-1.0.4.tgz", + "integrity": "sha512-UNKYuVzDH11EXWjdN2C/+qKobJBRxmCn91fCHX5xueRsY1ubsZmCY4L8s/TU0DAWUkahuooDQJ/0cI04Ek5QqA==" + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hast-to-hyperscript": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-7.0.2.tgz", + "integrity": "sha512-NBMMst0hkDR21uSH75m9W2DkljBrLoMQEhGiLMLNij4HIzEDJMC1UG+CFR6EAjHi2zs3NHBoaAHJOHxftoIN2g==", + "requires": { + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.2.1", + "unist-util-is": "^3.0.0", + "web-namespaces": "^1.1.2" + } + }, + "hast-util-from-parse5": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.1.tgz", + "integrity": "sha512-UfPzdl6fbxGAxqGYNThRUhRlDYY7sXu6XU9nQeX4fFZtV+IHbyEJtd+DUuwOqNV4z3K05E/1rIkoVr/JHmeWWA==", + "requires": { + "ccount": "^1.0.3", + "hastscript": "^5.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.1.2", + "xtend": "^4.0.1" + } + }, + "hast-util-has-property": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-1.0.3.tgz", + "integrity": "sha512-tT3ffSnrBu38RKnjn27n9vi+h/CUEXCQP5O2mriji4NNI2QNnhAqefjOg5ORAyvVfJItn0SC2Sx4CHReZSYh3g==" + }, + "hast-util-is-element": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.0.3.tgz", + "integrity": "sha512-C62CVn7jbjp89yOhhy7vrkSaB7Vk906Gtcw/Ihd+Iufnq+2pwOZjdPmpzpKLWJXPJBMDX3wXg4FqmdOayPcewA==" + }, + "hast-util-parse-selector": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.2.tgz", + "integrity": "sha512-jIMtnzrLTjzqgVEQqPEmwEZV+ea4zHRFTP8Z2Utw0I5HuBOXHzUPPQWr6ouJdJqDKLbFU/OEiYwZ79LalZkmmw==" + }, + "hast-util-raw": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-5.0.1.tgz", + "integrity": "sha512-iHo7G6BjRc/GU1Yun5CIEXjil0wVnIbz11C6k0JdDichSDMtYi2+NNtk6YN7EOP0JfPstX30d3pRLfaJv5CkdA==", + "requires": { + "hast-util-from-parse5": "^5.0.0", + "hast-util-to-parse5": "^5.0.0", + "html-void-elements": "^1.0.1", + "parse5": "^5.0.0", + "unist-util-position": "^3.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.1", + "zwitch": "^1.0.0" + } + }, + "hast-util-to-parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-5.1.1.tgz", + "integrity": "sha512-ivCeAd5FCXr7bapJIVsWMnx/EmbjkkW2TU2hd1prq+jGwiaUoK+FcpjyPNwsC5ogzCwWO669tOqIovGeLc/ntg==", + "requires": { + "hast-to-hyperscript": "^7.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.1", + "zwitch": "^1.0.0" + } + }, + "hast-util-to-string": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-1.0.2.tgz", + "integrity": "sha512-fQNr0n5KJmZW1TmBfXbc4DO0ucZmseUw3T6K4PDsUUTMtTGGLZMUYRB8mOKgPgtw7rtICdxxpRQZmWwo8KxlOA==" + }, + "hastscript": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.0.tgz", + "integrity": "sha512-7mOQX5VfVs/gmrOGlN8/EDfp1GqV6P3gTNVt+KnX4gbYhpASTM8bklFdFQCbFRAadURXAmw0R1QQdBdqp7jswQ==", + "requires": { + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.2.0", + "property-information": "^5.0.1", + "space-separated-tokens": "^1.0.0" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "highlight.js": { + "version": "9.13.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.13.1.tgz", + "integrity": "sha512-Sc28JNQNDzaH6PORtRLMvif9RSn1mYuOoX3omVjnb0+HbpPygU2ALBI0R/wsiqCb4/fcp07Gdo8g+fhtFrQl6A==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", + "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", + "requires": { + "react-is": "^16.7.0" + } + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==" + }, + "hosted-git-info": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", + "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==" + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" + }, + "html-minifier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", + "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==", + "requires": { + "camel-case": "^3.0.0", + "clean-css": "^4.2.1", + "commander": "^2.19.0", + "he": "^1.2.0", + "param-case": "^2.1.1", + "relateurl": "^0.2.7", + "uglify-js": "^3.5.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "uglify-js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "requires": { + "commander": "~2.20.0", + "source-map": "~0.6.1" + } + } + } + }, + "html-void-elements": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.4.tgz", + "integrity": "sha512-yMk3naGPLrfvUV9TdDbuYXngh/TpHbA6TrOw3HL9kS8yhwx7i309BReNg7CbAJXGE+UMJ6je5OqJ7lC63o6YuQ==" + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=" + }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "requires": { + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "humanize-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/humanize-string/-/humanize-string-2.1.0.tgz", + "integrity": "sha512-sQ+hqmxyXW8Cj7iqxcQxD7oSy3+AXnIZXdUF9lQMkzaG8dtbKAB8U7lCtViMnwQ+MpdCKsO2Kiij3G6UUXq/Xg==", + "requires": { + "decamelize": "^2.0.0" + }, + "dependencies": { + "decamelize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", + "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", + "requires": { + "xregexp": "4.0.0" + } + } + } + }, + "humanize-url": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/humanize-url/-/humanize-url-1.0.1.tgz", + "integrity": "sha1-9KuZ4NKIF0yk4eUEB8VfuuRk7/8=", + "dev": true, + "requires": { + "normalize-url": "^1.0.0", + "strip-url-auth": "^1.0.0" + } + }, + "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" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" + }, + "immer": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", + "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==" + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "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=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "inquirer": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", + "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" + }, + "is-absolute-url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.1.tgz", + "integrity": "sha512-c2QjUwuMxLsld90sj3xYzpFYWJtuxkIn1f5ua9RTEYJt/vV2IsM+Py00/6qjV7qExgifUvt7qfyBGBBKm+2iBg==" + }, + "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=", + "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=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-alphabetical": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.3.tgz", + "integrity": "sha512-eEMa6MKpHFzw38eKm56iNNi6GJ7lf6aLLio7Kr23sJPAECscgRtZvOBYybejWDQ2bM949Y++61PY+udzj5QMLA==" + }, + "is-alphanumerical": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.3.tgz", + "integrity": "sha512-A1IGAPO5AW9vSh7omxIlOGwIqEvpW/TA+DksVOPM5ODuxKlZS09+TEM1E3275lJqO2oJ38vDpeAL3DCIiHE6eA==", + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "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=", + "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==" + }, + "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=", + "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=", + "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=" + }, + "is-decimal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.3.tgz", + "integrity": "sha512-bvLSwoDg2q6Gf+E2LEPiklHZxxiSi3XAh4Mav65mKqTfCO1HM3uBs24TjEH8iJX3bbDdLXKJXBTmGzuTUuAEjQ==" + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "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==" + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "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=" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-hexadecimal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.3.tgz", + "integrity": "sha512-zxQ9//Q3D/34poZf8fiy3m3XVpbQc7ren15iKqrTtLPwkPD/t3Scy9Imp63FujULGxuK0ZlCwoo5xNpktFgbOA==" + }, + "is-keyword-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-keyword-js/-/is-keyword-js-1.0.3.tgz", + "integrity": "sha1-rDDc81tnH0snsX9ctXI1EmAhEy0=" + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "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=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "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==", + "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=" + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "requires": { + "has": "^1.0.1" + } + }, + "is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" + }, + "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==", + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-what": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.2.3.tgz", + "integrity": "sha512-c4syLgFnjXTH5qd82Fp/qtUIeM0wA69xbI0KH1QpurMIvDaZFrS8UtAa4U52Dc2qSznaMxHit0gErMp6A/Qk1w==" + }, + "is-whitespace-character": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.3.tgz", + "integrity": "sha512-SNPgMLz9JzPccD3nPctcj8sZlX9DAMJSKH8bP7Z6bohCwuNgX8xbWr1eTAYXX9Vpi/aSn8Y1akL9WgM3t43YNQ==" + }, + "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==" + }, + "is-word-character": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.3.tgz", + "integrity": "sha512-0wfcrFgOOOBdgRNT9H33xe6Zi6yhX/uoc4U8NBZGeQQB0ctU1dnlNTyL9JM2646bHDTpsDm1Brb3VPoCIMrd/A==" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "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=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "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" + } + }, + "isomorphic-unfetch": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-2.1.1.tgz", + "integrity": "sha512-nd8AULy4i2rA8dv0nOBT9xieIegd3xi7NDxTQ9+iNXDTyaG6VbUYW3F+TdMRqxqXhDFWM2k7fttKx9W2Wd8JpQ==", + "requires": { + "node-fetch": "^2.1.2", + "unfetch": "^3.1.0" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + } + } + }, + "javascript-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.0.0.tgz", + "integrity": "sha512-zzK8+ByrzvOL6N92hRewwUKL0wN0TOaIuUjX0Jj8lraxWvr5wHYs2YTjaj2lstF+8qMv5cmPPef47va8NT8lDw==" + }, + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==" + }, + "js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=" + }, + "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.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "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==" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + }, + "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==", + "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=" + } + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsx-ast-utils": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz", + "integrity": "sha512-v3FxCcAf20DayI+uxnCuw795+oOIkVu6EnJ1+kSzhqqTZHNkTZ7B66ZgLp4oLJ/gbA64cI0B7WRoHZMSRdyVRQ==", + "requires": { + "array-includes": "^3.0.3", + "object.assign": "^4.1.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "requires": { + "invert-kv": "^2.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "load-cfg": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/load-cfg/-/load-cfg-1.2.0.tgz", + "integrity": "sha512-6YgJ6G/R+hT3y3OPs55VdQ7FeMYEGuq6KHJ8ZId7NVyTvkI7yUDH7Gclxz9Ggkz5DJirjbvapMORMfk9NAiyMQ==", + "requires": { + "@babel/preset-env": "^7.4.4", + "@babel/register": "^7.4.4", + "find-up": "^3.0.0", + "fs-extra": "^7.0.1", + "lodash": "^4.17.11" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, + "lodash.deburr": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", + "integrity": "sha1-3bG7s+8HRYwBd7oH3hRCLLAz/5s=" + }, + "lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "dev": true + }, + "lodash.isobject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", + "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=", + "dev": true + }, + "lodash.iteratee": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.iteratee/-/lodash.iteratee-4.7.0.tgz", + "integrity": "sha1-vkF32yiajMw8CZDx2ya1si/BVUw=" + }, + "lodash.tonumber": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/lodash.tonumber/-/lodash.tonumber-4.0.3.tgz", + "integrity": "sha1-C5azGzVnJ5Prf1pj7nkfG56QJdk=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "requires": { + "chalk": "^2.0.1" + } + }, + "loglevel": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.3.tgz", + "integrity": "sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA==" + }, + "loglevelnext": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-1.0.5.tgz", + "integrity": "sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A==", + "requires": { + "es6-symbol": "^3.1.1", + "object.assign": "^4.1.0" + } + }, + "longest-streak": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-1.0.0.tgz", + "integrity": "sha1-0GWXxNTDG1LMsfXY+P5xSOr9aWU=" + }, + "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" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + }, + "lowlight": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.11.0.tgz", + "integrity": "sha512-xrGGN6XLL7MbTMdPD6NfWPwY43SNkjf/d0mecSx/CW36fUZTjRHEq0/Cdug3TWKtRXLWi7iMl1eP0olYxj/a4A==", + "dev": true, + "requires": { + "fault": "^1.0.2", + "highlight.js": "~9.13.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==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "lz-string": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", + "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=" + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==" + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "markdown-escapes": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.3.tgz", + "integrity": "sha512-XUi5HJhhV5R74k8/0H2oCbCiYf/u4cO/rX8tnGkRvrqhsr5BRNU6Mg0yt/8UIx1iIS8220BNJsDb7XnILhLepw==" + }, + "markdown-table": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-0.4.0.tgz", + "integrity": "sha1-iQwsGzv+g/sA5BKbjkz+ZFJw+dE=" + }, + "match-sorter": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-3.1.1.tgz", + "integrity": "sha512-Qlox3wRM/Q4Ww9rv1cBmYKNJwWVX/WC+eA3+1S3Fv4EOhrqyp812ZEfVFKQk0AP6RfzmPUUOwEZBbJ8IRt8SOw==", + "requires": { + "remove-accents": "0.4.2" + }, + "dependencies": { + "remove-accents": { + "version": "0.4.2", + "bundled": true + } + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdast-squeeze-paragraphs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-3.0.5.tgz", + "integrity": "sha512-xX6Vbe348Y/rukQlG4W3xH+7v4ZlzUbSY4HUIQCuYrF2DrkcHx584mCaFxkWoDZKNUfyLZItHC9VAqX3kIP7XA==", + "requires": { + "unist-util-remove": "^1.0.0" + } + }, + "mdast-util-definitions": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-1.2.4.tgz", + "integrity": "sha512-HfUArPog1j4Z78Xlzy9Q4aHLnrF/7fb57cooTHypyGoe2XFNbcx/kWZDoOz+ra8CkUzvg3+VHV434yqEd1DRmA==", + "requires": { + "unist-util-visit": "^1.0.0" + }, + "dependencies": { + "unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "requires": { + "unist-util-visit-parents": "^2.0.0" + } + } + } + }, + "mdast-util-to-hast": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-6.0.1.tgz", + "integrity": "sha512-KRh9wIYzUQk877JcV+8q4FqBUEouLpCKMObqeWg4dnL1/rh9vtSIq5mqQFwIK9YzSULl91F8FP5+EJ/xqRHaBw==", + "requires": { + "collapse-white-space": "^1.0.0", + "detab": "^2.0.0", + "mdast-util-definitions": "^1.2.0", + "mdurl": "^1.0.1", + "trim": "0.0.1", + "trim-lines": "^1.0.0", + "unist-builder": "^1.0.1", + "unist-util-generated": "^1.1.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^1.1.0", + "xtend": "^4.0.1" + }, + "dependencies": { + "unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "requires": { + "unist-util-visit-parents": "^2.0.0" + } + } + } + }, + "mdast-util-to-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.0.6.tgz", + "integrity": "sha512-868pp48gUPmZIhfKrLbaDneuzGiw3OTDjHc5M1kAepR2CWBJ+HpEsm252K4aXdiP5coVZaJPOqGtVU6Po8xnXg==" + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + } + } + }, + "memoize-one": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.0.4.tgz", + "integrity": "sha512-P0z5IeAH6qHHGkJIXWw0xC2HNEgkx/9uWWBQw64FJj3/ol14VYdfVGWWr0fXfjhhv3TKVIqUq65os6O4GUNksA==" + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "meow": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", + "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0", + "yargs-parser": "^10.0.0" + } + }, + "merge-anything": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/merge-anything/-/merge-anything-2.2.5.tgz", + "integrity": "sha512-WgZGR7EQ1D8pyh57uKBbkPhUCJZLGdMzbDaxL4MDTJSGsvtpGdm8myr6DDtgJwT46xiFBlHqxbveDRpFBWlKWQ==", + "requires": { + "is-what": "^3.2.3" + } + }, + "merge-deep": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", + "integrity": "sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA==", + "requires": { + "arr-union": "^3.1.0", + "clone-deep": "^0.2.4", + "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=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "merge-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-1.0.1.tgz", + "integrity": "sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==", + "requires": { + "is-plain-obj": "^1.1" + } + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "merge2": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.4.tgz", + "integrity": "sha512-FYE8xI+6pjFOhokZu0We3S5NKCirLbCzSh2Usf3qEyr4X8U+0jNg9P8RZ4qz+V2UoECLVwSyzU3LxXBaLGtD3A==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "microevent.ts": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", + "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "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" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "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.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "requires": { + "mime-db": "1.40.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==" + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "requires": { + "dom-walk": "^0.1.0" + } + }, + "min-indent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz", + "integrity": "sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=" + }, + "mini-html-webpack-plugin": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/mini-html-webpack-plugin/-/mini-html-webpack-plugin-0.2.3.tgz", + "integrity": "sha512-wfkLf+CmyDg++K1S0QdAvUvS29DfVHe9SQ63syX8aX375mInzC5uwHxb/1+3exiiv84xnPrf6zsOnReRe15rjg==", + "requires": { + "webpack-sources": "^1.1.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "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=" + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "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==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "requires": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=" + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "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" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-dir": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", + "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=", + "requires": { + "minimatch": "^3.0.2" + } + }, + "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-forge": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", + "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==" + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" + }, + "node-releases": { + "version": "1.1.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.27.tgz", + "integrity": "sha512-9iXUqHKSGo6ph/tdXVbHFbhRVQln4ZDTIBJCzsa90HimnBYc5jw8RWYt4wBYFHehGyC3koIz5O4mb2fHrbPOuA==", + "requires": { + "semver": "^5.3.0" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "~1.0.0" + } + }, + "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=", + "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=", + "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=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", + "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "requires": { + "is-wsl": "^1.1.0" + } + }, + "opener": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", + "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==" + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "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" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + }, + "dependencies": { + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + } + } + }, + "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=" + }, + "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==", + "requires": { + "graceful-fs": "^4.1.11", + "is-plain-obj": "^1.1.0", + "mkdirp": "^0.5.1" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + }, + "p-reduce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", + "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==" + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "requires": { + "no-case": "^2.2.0" + } + }, + "parse-asn1": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-entities": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", + "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", + "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" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.0.tgz", + "integrity": "sha512-Hkavx/nY4/plImrZPHRk2CL9vpOymZLgEbMNX1U0bjcBL7QN9wODxyx0yaMZURSQaUtSEvDrfAvxa9oPb0at9g==" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "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=" + }, + "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=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "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==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "picomatch": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", + "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==" + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-conf": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", + "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", + "requires": { + "find-up": "^2.0.0", + "load-json-file": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + } + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + } + } + }, + "popper.js": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.15.0.tgz", + "integrity": "sha512-w010cY1oCUmI+9KwwlWki+r5jxKfTFDVoadl7MSrIujHU5MJ5OR6HTDj6Xo8aoR/QsA56x8jKjA59qGH4ELtrA==", + "dev": true + }, + "portfinder": { + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.22.tgz", + "integrity": "sha512-aZuwaz9ujJsyE8C5kurXAD8UmRxsJr+RtZWyQRvRk19Z2ri5uuHw5YS4tDBZrJlOS9Zw96uAbBuPb6W4wgvV5A==", + "requires": { + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + } + } + }, + "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=" + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "prettier": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz", + "integrity": "sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==" + }, + "pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==" + }, + "prismjs": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.17.1.tgz", + "integrity": "sha512-PrEDJAFdUGbOP6xK/UsfkC5ghJsPJviKgnQOoxaDbBjwc8op68Quupwt1DeAFoG8GImPhiKXAvvsH7wDSLsu1Q==", + "dev": true, + "requires": { + "clipboard": "^2.0.0" + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "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==" + }, + "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" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "property-information": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.1.0.tgz", + "integrity": "sha512-tODH6R3+SwTkAQckSp2S9xyYX8dEKYkeXw+4TmJzTxnNzd6mQPu1OD4f9zPrvw/Rm4wpPgI+Zp63mNSGNzUgHg==", + "requires": { + "xtend": "^4.0.1" + } + }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "react": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.9.0.tgz", + "integrity": "sha512-+7LQnFBwkiw+BobzOF6N//BdoNw0ouwmSJTEm9cglOOmsg/TMiFHZLe2sEoN5M7LgJTj9oHH0gxklfnQe66S1w==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-dev-utils": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-9.0.3.tgz", + "integrity": "sha512-OyInhcwsvycQ3Zr2pQN+HV4gtRXrky5mJXIy4HnqrWa+mI624xfYfqGuC9dYbxp4Qq3YZzP8GSGQjv0AgNU15w==", + "requires": { + "@babel/code-frame": "7.5.5", + "address": "1.1.0", + "browserslist": "4.6.6", + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "detect-port-alt": "1.1.6", + "escape-string-regexp": "1.0.5", + "filesize": "3.6.1", + "find-up": "3.0.0", + "fork-ts-checker-webpack-plugin": "1.5.0", + "global-modules": "2.0.0", + "globby": "8.0.2", + "gzip-size": "5.1.1", + "immer": "1.10.0", + "inquirer": "6.5.0", + "is-root": "2.1.0", + "loader-utils": "1.2.3", + "open": "^6.3.0", + "pkg-up": "2.0.0", + "react-error-overlay": "^6.0.1", + "recursive-readdir": "2.2.2", + "shell-quote": "1.6.1", + "sockjs-client": "1.3.0", + "strip-ansi": "5.2.0", + "text-table": "0.2.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + } + } + } + }, + "react-docgen": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-4.1.1.tgz", + "integrity": "sha512-o1wdswIxbgJRI4pckskE7qumiFyqkbvCO++TylEDOo2RbMiueIOg8YzKU4X9++r0DjrbXePw/LHnh81GRBTWRw==", + "requires": { + "@babel/core": "^7.0.0", + "@babel/runtime": "^7.0.0", + "async": "^2.1.4", + "commander": "^2.19.0", + "doctrine": "^3.0.0", + "node-dir": "^0.1.10", + "recast": "^0.17.3" + } + }, + "react-docgen-actual-name-handler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/react-docgen-actual-name-handler/-/react-docgen-actual-name-handler-1.2.0.tgz", + "integrity": "sha512-eNAa4dUSI7EnGd+OO/Lqy9JaJOKQXtAkyZhBMJN9dVxPFAEA3yEtaAfyntgKehpVB878sT51xD23hlpSjbVNQg==", + "requires": { + "react-docgen": "^4.1.1", + "recast": "^0.17.6" + } + }, + "react-docgen-external-proptypes-handler": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/react-docgen-external-proptypes-handler/-/react-docgen-external-proptypes-handler-1.0.3.tgz", + "integrity": "sha512-jWFA7NCdSnNs9Yr7xAhcUJEwH7qhIKxsyXF5yzzriFiBBfGIlkdzslGWRW4GFD5B8Fu24MTDM1G5q8M3L8+Qdw==" + }, + "react-docgen-typescript": { + "version": "1.12.5", + "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-1.12.5.tgz", + "integrity": "sha512-rXwT6sNThl4A9ISJCnhGLIZBbz0KnXKaNRDIJlpyAsUnG0CutR51grpJv+gsltj+wTLXyr4bhRcuOu8l6MkCHw==" + }, + "react-dom": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.9.0.tgz", + "integrity": "sha512-YFT2rxO9hM70ewk9jq0y6sQk8cL02xm4+IzYBz75CQGlClQQ1Bxq0nhHF6OtSbit+AIahujJgb/CPRibFkMNJQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.15.0" + } + }, + "react-dropdown-select": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-dropdown-select/-/react-dropdown-select-3.0.0.tgz", + "integrity": "sha512-Ek6fm37pI4RkOGzgU4qVso+FJPi4Sta9MAVI9tcx/wPyiPRCHmuoHG3zP0EsY7zWhH050l3vVrvcvpl8qJSnEA==", + "dev": true, + "requires": { + "@emotion/core": "^10.0.10", + "@emotion/styled": "^10.0.10" + } + }, + "react-error-overlay": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.1.tgz", + "integrity": "sha512-V9yoTr6MeZXPPd4nV/05eCBvGH9cGzc52FN8fs0O0TVQ3HYYf1n7EgZVtHbldRq5xU9zEzoXIITjYNIfxDDdUw==" + }, + "react-feather": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/react-feather/-/react-feather-1.1.6.tgz", + "integrity": "sha512-iCofWhTjX+vQwvDmg7o6vg0XrUg1c41yBDZG+l83nz1FiCsleJoUgd3O+kHpOeWMXuPrRIFfCixvcqyOLGOgIg==" + }, + "react-github-btn": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/react-github-btn/-/react-github-btn-1.0.5.tgz", + "integrity": "sha512-wE3s2e3Rrs6I9n2TDdBSUzTQXJy68EetFBxrYPosAVp/OSP5DwI9u/npf/Eu0/Uww1pTh60yvYO2wOS63HihkQ==", + "dev": true, + "requires": { + "github-buttons": "^2.2.9" + } + }, + "react-hot-loader": { + "version": "4.12.11", + "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.12.11.tgz", + "integrity": "sha512-ySsg1hPwr/5dkZCJVp1nZRbwbpbEQ+3e2+bn/D681Wvr9+o+5bLKkTGq0TXskj8HgCS3ScysXddOng9Cg+JKzw==", + "requires": { + "fast-levenshtein": "^2.0.6", + "global": "^4.3.0", + "hoist-non-react-statics": "^3.3.0", + "loader-utils": "^1.1.0", + "prop-types": "^15.6.1", + "react-lifecycles-compat": "^3.0.4", + "shallowequal": "^1.1.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, + "react-is": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", + "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==" + }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "react-popper": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.4.tgz", + "integrity": "sha512-9AcQB29V+WrBKk6X7p0eojd1f25/oJajVdMZkywIoAV6Ag7hzE1Mhyeup2Q1QnvFRtGQFQvtqfhlEoDAPfKAVA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.1.2", + "create-react-context": "^0.3.0", + "popper.js": "^1.14.4", + "prop-types": "^15.6.1", + "typed-styles": "^0.0.7", + "warning": "^4.0.2" + }, + "dependencies": { + "create-react-context": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.3.0.tgz", + "integrity": "sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw==", + "dev": true, + "requires": { + "gud": "^1.0.0", + "warning": "^4.0.3" + } + }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "react-syntax-highlighter": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-11.0.2.tgz", + "integrity": "sha512-kqmpM2OH5OodInbEADKARwccwSQWBfZi0970l5Jhp4h39q9Q65C4frNcnd6uHE5pR00W8pOWj9HDRntj2G4Rww==", + "dev": true, + "requires": { + "@babel/runtime": "^7.3.1", + "highlight.js": "~9.13.0", + "lowlight": "~1.11.0", + "prismjs": "^1.8.4", + "refractor": "^2.4.1" + } + }, + "react-transition-group": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", + "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", + "dev": true, + "requires": { + "dom-helpers": "^3.4.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" + } + }, + "reactstrap": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/reactstrap/-/reactstrap-8.0.1.tgz", + "integrity": "sha512-GvUWEL+a2+3npK1OxTXcNBMHXX4x6uc1KQRzK7yAOl+8sAHTRWqjunvMUfny3oDh8yKVzgqpqQlWWvs1B2HR9A==", + "dev": true, + "requires": { + "@babel/runtime": "^7.2.0", + "classnames": "^2.2.3", + "lodash.isfunction": "^3.0.9", + "lodash.isobject": "^3.0.2", + "lodash.tonumber": "^4.0.3", + "prop-types": "^15.5.8", + "react-lifecycles-compat": "^3.0.4", + "react-popper": "^1.3.3", + "react-transition-group": "^2.3.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + } + } + }, + "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" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "recast": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.17.6.tgz", + "integrity": "sha512-yoQRMRrK1lszNtbkGyM4kN45AwylV5hMiuEveUBlxytUViWevjvX6w+tzJt1LH4cfUhWt4NZvy3ThIhu6+m5wQ==", + "requires": { + "ast-types": "0.12.4", + "esprima": "~4.0.0", + "private": "^0.1.8", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "requires": { + "minimatch": "3.0.4" + } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + }, + "dependencies": { + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" + } + } + }, + "refractor": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-2.10.0.tgz", + "integrity": "sha512-maW2ClIkm9IYruuFYGTqKzj+m31heq92wlheW4h7bOstP+gf8bocmMec+j7ljLcaB1CAID85LMB3moye31jH1g==", + "dev": true, + "requires": { + "hastscript": "^5.0.0", + "parse-entities": "^1.1.2", + "prismjs": "~1.17.0" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + }, + "regenerate-unicode-properties": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", + "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", + "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" + }, + "regenerator-transform": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", + "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", + "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==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp-tree": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.11.tgz", + "integrity": "sha512-7/l/DgapVVDzZobwMCCgMlqiqyLFJ0cduo/j+3BcDJIB+yJdsYCfKuI3l/04NV+H/rfNRdPIDbXNZHM9XvQatg==" + }, + "regexpu-core": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.5.tgz", + "integrity": "sha512-FpI67+ky9J+cDizQUJlIlNZFKual/lUkFr1AG6zOCpwZ9cLrg8UUVakyUQJD7fCDIe9Z2nwTQJNPyonatNmDFQ==", + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "requires": { + "rc": "^1.0.1" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==" + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "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=" + } + } + }, + "rehype-docz": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/rehype-docz/-/rehype-docz-1.2.0.tgz", + "integrity": "sha512-pRgdQkVwo5aAIRAkUUu4bOxka+9bCKVWge5wYwIOIei0ThH2968Z41Y08zlYFArZIsUUA5KCGBsLZImpfsQTaA==", + "requires": { + "docz-utils": "^1.2.0", + "hast-util-to-string": "^1.0.1", + "jsx-ast-utils": "^2.1.0", + "lodash": "^4.17.11", + "unist-util-is": "^2.1.2" + }, + "dependencies": { + "unist-util-is": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.3.tgz", + "integrity": "sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA==" + } + } + }, + "rehype-slug": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-2.0.3.tgz", + "integrity": "sha512-7hgS91klce+p/1CrgMjV/JKyVmEevTM3YMkFtxF29twydKBSYVcy2x44z74SgCnzANj8H8N0g0O8F1OH1/OXJA==", + "requires": { + "github-slugger": "^1.1.1", + "hast-util-has-property": "^1.0.0", + "hast-util-is-element": "^1.0.0", + "hast-util-to-string": "^1.0.0", + "unist-util-visit": "^1.1.0" + }, + "dependencies": { + "unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "requires": { + "unist-util-visit-parents": "^2.0.0" + } + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" + }, + "remark": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/remark/-/remark-5.1.0.tgz", + "integrity": "sha1-y0Y709vLS5l5STXu4c9x16jjBow=", + "requires": { + "remark-parse": "^1.1.0", + "remark-stringify": "^1.1.0", + "unified": "^4.1.1" + }, + "dependencies": { + "remark-parse": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-1.1.0.tgz", + "integrity": "sha1-w8oQ+ajaBGFcKPCapOMEUQUm7CE=", + "requires": { + "collapse-white-space": "^1.0.0", + "extend": "^3.0.0", + "parse-entities": "^1.0.2", + "repeat-string": "^1.5.4", + "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" + } + }, + "unified": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/unified/-/unified-4.2.1.tgz", + "integrity": "sha1-dv9Dqo2kMPbn5KVchOusKtLPzS4=", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "has": "^1.0.1", + "once": "^1.3.3", + "trough": "^1.0.0", + "vfile": "^1.0.0" + } + }, + "vfile": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-1.4.0.tgz", + "integrity": "sha1-wP1vpIT43r23cfaMMe112I2pf+c=" + } + } + }, + "remark-docz": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remark-docz/-/remark-docz-1.2.0.tgz", + "integrity": "sha512-uL4CW4pLk9+7owCa/ce6PuYGZ+99P3ZAubT3HrTcyhAjyE2f0iG08lUgDUXQbdjo9L8OfXWCEg9AWgQijr0JsA==", + "requires": { + "@babel/generator": "^7.4.4", + "@babel/types": "^7.4.4", + "unist-util-remove": "^1.0.1", + "unist-util-visit": "^1.4.0" + }, + "dependencies": { + "unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "requires": { + "unist-util-visit-parents": "^2.0.0" + } + } + } + }, + "remark-frontmatter": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-1.3.2.tgz", + "integrity": "sha512-2eayxITZ8rezsXdgcXnYB3iLivohm2V/ZT4Ne8uhua6A4pk6GdLE2ZzJnbnINtD1HRLaTdB7RwF9sgUbMptJZA==", + "requires": { + "fault": "^1.0.1", + "xtend": "^4.0.1" + } + }, + "remark-mdx": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.3.1.tgz", + "integrity": "sha512-meOzRZRatApALyx8uPugc+O97e7CsMUOCMC8mJq4agdRG2J1Upg7+PAQiTiDJnT2TRok4EbLoz7OXWjDDDHIRw==", + "requires": { + "@babel/core": "7.5.5", + "@babel/helper-plugin-utils": "7.0.0", + "@babel/plugin-proposal-object-rest-spread": "7.5.5", + "@babel/plugin-syntax-jsx": "7.2.0", + "@mdx-js/util": "^1.3.1", + "is-alphabetical": "1.0.3", + "remark-parse": "7.0.1", + "unified": "8.3.2" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/core": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", + "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helpers": "^7.5.5", + "@babel/parser": "^7.5.5", + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helpers": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz", + "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==", + "requires": { + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" + } + }, + "@babel/parser": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==" + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "remark-parse": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-7.0.1.tgz", + "integrity": "sha512-WOZLa545jYXtSy+txza6ACudKWByQac4S2DmGk+tAGO/3XnVTOxwyCIxB7nTcLlk8Aayhcuf3cV1WV6U6L7/DQ==", + "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" + } + } + } + }, + "remark-parse": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-6.0.3.tgz", + "integrity": "sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg==", + "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" + } + }, + "remark-parse-yaml": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/remark-parse-yaml/-/remark-parse-yaml-0.0.2.tgz", + "integrity": "sha512-zfs9hl/SKlgLw6ktGeRO+Xh+o+3CUSdo/z/W0pHCwZLNHwgaWkylWaJFHQ/O9eVvTO9PJwnOHVYUIhGpqRYu5g==", + "requires": { + "js-yaml": "^3.9.0", + "unist-util-map": "^1.0.3" + } + }, + "remark-slug": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/remark-slug/-/remark-slug-5.1.2.tgz", + "integrity": "sha512-DWX+Kd9iKycqyD+/B+gEFO3jjnt7Yg1O05lygYSNTe5i5PIxxxPjp5qPBDxPIzp5wreF7+1ROCwRgjEcqmzr3A==", + "requires": { + "github-slugger": "^1.0.0", + "mdast-util-to-string": "^1.0.0", + "unist-util-visit": "^1.0.0" + }, + "dependencies": { + "unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "requires": { + "unist-util-visit-parents": "^2.0.0" + } + } + } + }, + "remark-squeeze-paragraphs": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-3.0.4.tgz", + "integrity": "sha512-Wmz5Yj9q+W1oryo8BV17JrOXZgUKVcpJ2ApE2pwnoHwhFKSk4Wp2PmFNbmJMgYSqAdFwfkoe+TSYop5Fy8wMgA==", + "requires": { + "mdast-squeeze-paragraphs": "^3.0.0" + } + }, + "remark-stringify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-1.1.0.tgz", + "integrity": "sha1-pxBeJbnuK/mkm3XSxCPxGwauIJI=", + "requires": { + "ccount": "^1.0.0", + "extend": "^3.0.0", + "longest-streak": "^1.0.0", + "markdown-table": "^0.4.0", + "parse-entities": "^1.0.2", + "repeat-string": "^1.5.4", + "stringify-entities": "^1.0.1", + "unherit": "^1.0.4" + } + }, + "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=" + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "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-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "require-package-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/require-package-name/-/require-package-name-2.0.1.tgz", + "integrity": "sha1-wR6XJ2tluOKSP3Xav1+y7ww4Qbk=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "resolve": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", + "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "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==" + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", + "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", + "requires": { + "tslib": "^1.9.0" + } + }, + "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=", + "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==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "scheduler": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.15.0.tgz", + "integrity": "sha512-xAefmSfN6jqAa7Kuq7LIJY0bwAPG3xlCj0HMEBQk1lxYiDKZscY2xJ5U/61ZTrYbmNQbXa+gc7czPkVo11tnCg==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", + "dev": true, + "optional": true + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + }, + "selfsigned": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", + "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", + "requires": { + "node-forge": "0.7.5" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "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==" + } + } + }, + "serialize-javascript": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz", + "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==" + }, + "serve": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/serve/-/serve-11.1.0.tgz", + "integrity": "sha512-+4wpDtOSS+4ZLyDWMxThutA3iOTawX2+yDovOI8cjOUOmemyvNlHyFAsezBlSgbZKTYChI3tzA1Mh0z6XZ62qA==", + "requires": { + "@zeit/schemas": "2.6.0", + "ajv": "6.5.3", + "arg": "2.0.0", + "boxen": "1.3.0", + "chalk": "2.4.1", + "clipboardy": "1.2.3", + "compression": "1.7.3", + "serve-handler": "6.1.0", + "update-check": "1.5.2" + }, + "dependencies": { + "ajv": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz", + "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "serve-handler": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.0.tgz", + "integrity": "sha512-63N075Tn3PsFYcu0NVV7tb367UbiW3gnC+/50ohL4oqOhAG6bmbaWqiRcXQgbzqc0ALBjSAzg7VTfa0Qw4E3hA==", + "requires": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.0.4", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "~1.33.0" + } + }, + "path-to-regexp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + } + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "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=", + "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=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", + "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", + "requires": { + "is-extendable": "^0.1.1", + "kind-of": "^2.0.1", + "lazy-cache": "^0.2.3", + "mixin-object": "^2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", + "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", + "requires": { + "is-buffer": "^1.0.2" + } + }, + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" + } + } + }, + "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=", + "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=" + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "requires": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "signale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", + "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", + "requires": { + "chalk": "^2.3.2", + "figures": "^2.0.0", + "pkg-conf": "^2.1.0" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "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": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "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==", + "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=", + "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==", + "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==", + "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==", + "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==", + "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=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "sockjs-client": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "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" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-loader": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", + "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", + "requires": { + "async": "^2.5.0", + "loader-utils": "^1.1.0" + } + }, + "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==", + "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-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "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=" + }, + "space-separated-tokens": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.4.tgz", + "integrity": "sha512-UyhMSmeIqZrQn2UdjYpxEkwY9JUrn8pP+7L4f91zRzOQuI8MF1FGLfYU9DKCYeLdo7LXMxwrX5zKFy7eeeVHuA==" + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" + }, + "spdy": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", + "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "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==", + "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=" + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "state-toggle": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.2.tgz", + "integrity": "sha512-8LpelPGR0qQM4PnfLiplOQNJcIN1/r2Gy0xKB2zKnIW2YzPMt2sR4I/+gtPjhN7Svh9kw+zqEg2SFwpBO9iNiw==" + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "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=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "std-env": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-2.2.1.tgz", + "integrity": "sha512-IjYQUinA3lg5re/YMlwlfhqNRTzMZMqE+pezevdcTaHceqx8ngEi1alX9nNCk9Sc81fy1fLDeQoaCzeiW1yBOQ==", + "requires": { + "ci-info": "^1.6.0" + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string.fromcodepoint": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string.fromcodepoint/-/string.fromcodepoint-0.2.1.tgz", + "integrity": "sha1-jZeDM8C8klOPUPOD5IiPPlYZ1lM=" + }, + "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" + } + }, + "stringify-entities": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.2.tgz", + "integrity": "sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A==", + "requires": { + "character-entities-html4": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "requires": { + "min-indent": "^1.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=" + }, + "strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, + "strip-url-auth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-url-auth/-/strip-url-auth-1.0.1.tgz", + "integrity": "sha1-IrD6OkE4WzO+PzMVUbu4N/oM164=", + "dev": true + }, + "style-to-object": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.2.3.tgz", + "integrity": "sha512-1d/k4EY2N7jVLOqf2j04dTc37TPOv/hHxZmvpg8Pdh8UYydxeu/C1W1U4vD8alzf5V2Gt7rLsmkr4dxAlDm9ng==", + "requires": { + "inline-style-parser": "0.1.1" + } + }, + "styled-components": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-4.3.1.tgz", + "integrity": "sha512-04XKQFFSEx3qTeN5I4kiSeajrwG6juDMw2+vUgvfxeXFegE40TuPKS4fFey8RJP1Ii1AoVQVUOglrdUUey0ZHw==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@emotion/is-prop-valid": "^0.7.3", + "@emotion/unitless": "^0.7.0", + "babel-plugin-styled-components": ">= 1", + "css-to-react-native": "^2.2.2", + "memoize-one": "^5.0.0", + "merge-anything": "^2.2.4", + "prop-types": "^15.5.4", + "react-is": "^16.6.0", + "stylis": "^3.5.0", + "stylis-rule-sheet": "^0.0.10", + "supports-color": "^5.5.0" + } + }, + "stylis": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", + "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==" + }, + "stylis-rule-sheet": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz", + "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "svg-parser": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.2.tgz", + "integrity": "sha512-1gtApepKFweigFZj3sGO8KT8LvVZK8io146EzXrpVuWCDAbISz/yMucco3hWTkpZNoPabM+dnMOpy6Swue68Zg==" + }, + "svgo": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.0.tgz", + "integrity": "sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ==", + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.33", + "csso": "^3.5.1", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "requires": { + "execa": "^0.7.0" + } + }, + "terser": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.1.4.tgz", + "integrity": "sha512-+ZwXJvdSwbd60jG0Illav0F06GDJF0R4ydZ21Q3wGAFKoBGyJGo34F63vzJHgvYxc1ukOtIjvwEvl9MkjzM6Pg==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz", + "integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==", + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "thread-loader": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.3.tgz", + "integrity": "sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg==", + "requires": { + "loader-runner": "^2.3.1", + "loader-utils": "^1.1.0", + "neo-async": "^2.6.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", + "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==" + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "dev": true, + "optional": true + }, + "titleize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-2.1.0.tgz", + "integrity": "sha512-m+apkYlfiQTKLW+sI4vqUkwMEzfgEUEYSqljx1voUE3Wz/z1ZsxyzSxvH2X8uKVrOp7QkByWt0rA6+gvhCKy6g==" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "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=" + }, + "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=", + "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=", + "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==", + "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=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "to-vfile": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/to-vfile/-/to-vfile-5.0.3.tgz", + "integrity": "sha512-z1Lfx60yAMDMmr+f426Y4yECsHdl8GVEAE+LymjRF5oOIZ7T4N20IxWNAxXLMRzP9jSSll38Z0fKVAhVLsdLOw==", + "requires": { + "is-buffer": "^2.0.0", + "vfile": "^3.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" + }, + "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==" + }, + "vfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz", + "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==", + "requires": { + "is-buffer": "^2.0.0", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "^1.0.0", + "vfile-message": "^1.0.0" + } + }, + "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" + } + } + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" + }, + "trim-lines": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-1.1.2.tgz", + "integrity": "sha512-3GOuyNeTqk3FAqc3jOJtw7FTjYl94XBR5aD9QnDbK/T4CA9sW/J0l9RoaRPE9wyPP7NF331qnHnvJFBJ+IDkmQ==" + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=" + }, + "trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, + "trim-trailing-lines": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.2.tgz", + "integrity": "sha512-MUjYItdrqqj2zpcHFTkMa9WAv4JHTI6gnRQGPFLrt5L9a6tRMiDnIqYl8JBvu2d2Tc3lWJKQwlGCp0K8AvCM+Q==" + }, + "trough": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.4.tgz", + "integrity": "sha512-tdzBRDGWcI1OpPVmChbdSKhvSVurznZ8X36AYURAcl+0o2ldlCY2XPzyXNNxwJwwyIU+rIglTCG4kxtNKBQH7Q==" + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "type": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/type/-/type-1.0.3.tgz", + "integrity": "sha512-51IMtNfVcee8+9GJvj0spSuFcZHe9vSib6Xtgsny1Km9ugyz2mbS08I3rsUIRYgJohFRFU1160sgRodYz378Hg==" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", + "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typed-styles": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", + "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typescript": { + "version": "3.3.4000", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.4000.tgz", + "integrity": "sha512-jjOcCZvpkl2+z7JFn0yBOoLQyLoIkNZAs/fYJkUG6VKy6zLPHJGfQJYFHzibB6GJaF/8QrcECtlQ5cpvRHSMEA==" + }, + "ua-parser-js": { + "version": "0.7.20", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.20.tgz", + "integrity": "sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw==" + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "ulid": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ulid/-/ulid-2.3.0.tgz", + "integrity": "sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==" + }, + "unescape-js": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unescape-js/-/unescape-js-1.1.1.tgz", + "integrity": "sha512-2/6CdybfFt9fzYJhCD6SHfBnqCGNfjhMwPK9Pf+sJRloa/WmyAmxdBVOslOIYkvSIRKX+9xGePF5t1tugtZ63g==", + "requires": { + "string.fromcodepoint": "^0.2.1" + } + }, + "unfetch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-3.1.2.tgz", + "integrity": "sha512-L0qrK7ZeAudGiKYw6nzFjnJ2D5WHblUBwmHIqtPS6oKUd+Hcpk7/hKsSmcHsTlpd1TbTNsiRBUKRq3bHLNIqIw==" + }, + "unherit": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.2.tgz", + "integrity": "sha512-W3tMnpaMG7ZY6xe/moK04U9fBhi6wEiCYHUW5Mop/wQHf12+79EQGwxYejNdhEz2mkqkBlGwm7pxmgBKMVUj0w==", + "requires": { + "inherits": "^2.0.1", + "xtend": "^4.0.1" + } + }, + "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==" + }, + "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==", + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==" + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==" + }, + "unified": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-8.3.2.tgz", + "integrity": "sha512-NDtUAXcd4c+mKppCbsZHzmhkKEQuhveZNBrFYmNgMIMk2K9bc8hmG3mLEGVtRmSNodobwyMePAnvIGVWZfPdzQ==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "dependencies": { + "is-plain-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.0.0.tgz", + "integrity": "sha512-EYisGhpgSCwspmIuRHGjROWTon2Xp8Z7U03Wubk/bTL5TTRC5R1rGVgyjzBrk9+ULdH6cRD06KRcw/xfqhVYKQ==" + } + } + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "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=", + "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=", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unist-builder": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-1.0.4.tgz", + "integrity": "sha512-v6xbUPP7ILrT15fHGrNyHc1Xda8H3xVhP7/HAIotHOhVPjH5dCXA097C3Rry1Q2O+HbOLCao4hfPB+EYEjHgVg==", + "requires": { + "object-assign": "^4.1.0" + } + }, + "unist-util-find": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unist-util-find/-/unist-util-find-1.0.1.tgz", + "integrity": "sha1-EGK7tpKMepfGrcibU3RdTEbCIqI=", + "requires": { + "lodash.iteratee": "^4.5.0", + "remark": "^5.0.1", + "unist-util-visit": "^1.1.0" + }, + "dependencies": { + "unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "requires": { + "unist-util-visit-parents": "^2.0.0" + } + } + } + }, + "unist-util-generated": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.4.tgz", + "integrity": "sha512-SA7Sys3h3X4AlVnxHdvN/qYdr4R38HzihoEVY2Q2BZu8NHWDnw5OGcC/tXWjQfd4iG+M6qRFNIRGqJmp2ez4Ww==" + }, + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" + }, + "unist-util-map": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/unist-util-map/-/unist-util-map-1.0.5.tgz", + "integrity": "sha512-dFil/AN6vqhnQWNCZk0GF/G3+Q5YwsB+PqjnzvpO2wzdRtUJ1E8PN+XRE/PRr/G3FzKjRTJU0haqE0Ekl+O3Ag==", + "requires": { + "object-assign": "^4.0.1" + } + }, + "unist-util-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.0.3.tgz", + "integrity": "sha512-28EpCBYFvnMeq9y/4w6pbnFmCUfzlsc41NJui5c51hOFjBA1fejcwc+5W4z2+0ECVbScG3dURS3JTVqwenzqZw==" + }, + "unist-util-remove": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-1.0.3.tgz", + "integrity": "sha512-mB6nCHCQK0pQffUAcCVmKgIWzG/AXs/V8qpS8K72tMPtOSCMSjDeMc5yN+Ye8rB0FhcE+JvW++o1xRNc0R+++g==", + "requires": { + "unist-util-is": "^3.0.0" + } + }, + "unist-util-remove-position": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.3.tgz", + "integrity": "sha512-CtszTlOjP2sBGYc2zcKA/CvNdTdEs3ozbiJ63IPBxh8iZg42SCCb8m04f8z2+V1aSk5a7BxbZKEdoDjadmBkWA==", + "requires": { + "unist-util-visit": "^1.1.0" + }, + "dependencies": { + "unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "requires": { + "unist-util-visit-parents": "^2.0.0" + } + } + } + }, + "unist-util-stringify-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.1.tgz", + "integrity": "sha512-Zqlf6+FRI39Bah8Q6ZnNGrEHUhwJOkHde2MHVk96lLyftfJJckaPslKgzhVcviXj8KcE9UJM9F+a4JEiBUTYgA==", + "requires": { + "@types/unist": "^2.0.2" + } + }, + "unist-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.0.tgz", + "integrity": "sha512-kiTpWKsF54u/78L/UU/i7lxrnqGiEWBgqCpaIZBYP0gwUC+Akq0Ajm4U8JiNIoQNfAioBdsyarnOcTEAb9mLeQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "dependencies": { + "unist-util-is": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.0.tgz", + "integrity": "sha512-E5JLUKRQlAYiJmN2PVBdSz01R3rUKRSM00X+0DB/yLqxdLu6wZZkRdTIsxDp9X+bkxh8Eq+O2YYRbZvLZtQT1A==" + }, + "unist-util-visit-parents": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.0.0.tgz", + "integrity": "sha512-H3K8d81S4V3XVXVwLvrLGk+R5VILryfUotD06/R/rLsTsPLGjkn6gIP8qEEVITcuIySNYj0ocJLsePjm9F/Vcg==", + "requires": { + "@types/unist": "^2.0.3", + "unist-util-is": "^4.0.0" + } + } + } + }, + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "requires": { + "unist-util-is": "^3.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "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=", + "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=", + "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=" + } + } + }, + "upath": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==" + }, + "update-check": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.2.tgz", + "integrity": "sha512-1TrmYLuLj/5ZovwUS7fFd1jMH3NnFDN1y1A8dboedIDt7zs/zJMo6TwwlhYKkSeEwzleeiSBV5/3c9ufAQWDaQ==", + "requires": { + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0" + } + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "url-loader": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", + "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", + "requires": { + "loader-utils": "^1.1.0", + "mime": "^2.0.3", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" + } + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "vfile": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.0.1.tgz", + "integrity": "sha512-lRHFCuC4SQBFr7Uq91oJDJxlnftoTLQ7eKIpMdubhYcVMho4781a8MWXLy3qZrZ0/STD1kRiKc0cQOHm4OkPeA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" + } + } + }, + "vfile-location": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.5.tgz", + "integrity": "sha512-Pa1ey0OzYBkLPxPZI3d9E+S4BmvfVwNAAXrrqGbwTVXWaX2p9kM1zZ+n35UtVM06shmWKH4RPRN8KI80qE3wNQ==" + }, + "vfile-message": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.1.tgz", + "integrity": "sha512-KtasSV+uVU7RWhUn4Lw+wW1Zl/nW8JWx7JCPps10Y9JRRIDeDXf8wfBLoOSsJLyo27DqMyAi54C6Jf/d6Kr2Bw==", + "requires": { + "@types/unist": "^2.0.2", + "unist-util-stringify-position": "^2.0.0" + } + }, + "vm-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==" + }, + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "web-namespaces": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.3.tgz", + "integrity": "sha512-r8sAtNmgR0WKOKOxzuSgk09JsHlpKlB+uHi937qypOu3PZ17UxPrierFKDye/uNHjNTTEshu5PId8rojIPj/tA==" + }, + "webpack": { + "version": "4.39.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.39.2.tgz", + "integrity": "sha512-AKgTfz3xPSsEibH00JfZ9sHXGUwIQ6eZ9tLN8+VLzachk1Cw2LVmy+4R7ZiwTa9cZZ15tzySjeMui/UnSCAZhA==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.1", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==" + } + } + }, + "webpack-bundle-analyzer": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.4.1.tgz", + "integrity": "sha512-Bs8D/1zF+17lhqj2OYmzi7HEVYqEVxu7lCO9Ff8BwajenOU0vAwEoV8e4ICCPNZAcqR1PCR/7o2SkW+cnCmF0A==", + "requires": { + "acorn": "^6.0.7", + "acorn-walk": "^6.1.1", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.15", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" + }, + "dependencies": { + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==" + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "webpack-chain": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.0.0.tgz", + "integrity": "sha512-NK62XgJOOSmYs4kaXFIKKeClpuOVHY7m6e4XwxbVX/2HAUboH6xFCTVXMVv8+jB6K8o/UGjlo1Cv3XXOyNAAGw==", + "requires": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^2.0.0" + } + }, + "webpack-dev-middleware": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz", + "integrity": "sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==", + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.2", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" + } + } + }, + "webpack-dev-server": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.8.0.tgz", + "integrity": "sha512-Hs8K9yI6pyMvGkaPTeTonhD6JXVsigXDApYk9JLW4M7viVBspQvb1WdAcWxqtmttxNW4zf2UFLsLNe0y87pIGQ==", + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.6", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.2.1", + "http-proxy-middleware": "^0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.0", + "killable": "^1.0.1", + "loglevel": "^1.6.3", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.21", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.4", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.3.0", + "spdy": "^4.0.1", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.0", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "12.0.5" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "requires": { + "async-limiter": "~1.0.0" + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-hot-client": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/webpack-hot-client/-/webpack-hot-client-4.1.2.tgz", + "integrity": "sha512-J0qt5mxEOt9UAQkyQ59Mz0n9Sk4NWKJ4awVE5/idmG2vOHVjseczbY9hbdzHV3NyNllufhN2USvSJK5FUBFbeg==", + "requires": { + "@webpack-contrib/schema-utils": "^1.0.0-beta.0", + "json-stringify-safe": "^5.0.1", + "loglevelnext": "^1.0.2", + "merge-options": "^1.0.1", + "strip-ansi": "^4.0.0", + "uuid": "^3.1.0", + "webpack-log": "^1.1.1", + "ws": "^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=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "webpack-log": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-1.2.0.tgz", + "integrity": "sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==", + "requires": { + "chalk": "^2.1.0", + "log-symbols": "^2.1.0", + "loglevelnext": "^1.0.1", + "uuid": "^3.1.0" + } + }, + "ws": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", + "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-manifest-plugin": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.0.4.tgz", + "integrity": "sha512-nejhOHexXDBKQOj/5v5IZSfCeTO3x1Dt1RZEcGfBSul891X/eLIcIVH31gwxPDdsi2Z8LKKFGpM4w9+oTBOSCg==", + "requires": { + "fs-extra": "^7.0.0", + "lodash": ">=3.5 <5", + "tapable": "^1.0.0" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "webpackbar": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-3.2.0.tgz", + "integrity": "sha512-PC4o+1c8gWWileUfwabe0gqptlXUDJd5E0zbpr2xHP1VSOVlZVPBZ8j6NCR8zM5zbKdxPhctHXahgpNK1qFDPw==", + "requires": { + "ansi-escapes": "^4.1.0", + "chalk": "^2.4.1", + "consola": "^2.6.0", + "figures": "^3.0.0", + "pretty-time": "^1.1.0", + "std-env": "^2.2.1", + "text-table": "^0.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz", + "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", + "requires": { + "type-fest": "^0.5.2" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "figures": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz", + "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + } + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" + }, + "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.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "requires": { + "string-width": "^2.1.1" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "requires": { + "errno": "~0.1.7" + } + }, + "worker-rpc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", + "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", + "requires": { + "microevent.ts": "~0.1.1" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.1.2.tgz", + "integrity": "sha512-gftXq3XI81cJCgkUiAVixA0raD9IVmXqsylCrjRygw4+UOOGzPoxnQ6r/CnVL9i+mDncJo94tSkyrtuuQVBmrg==", + "requires": { + "async-limiter": "^1.0.0" + } + }, + "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=" + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + }, + "xregexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", + "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.0.0.tgz", + "integrity": "sha512-ssa5JuRjMeZEUjg7bEL99AwpitxU/zWGAGpdj0di41pOEmJti8NR6kyUIJBkR78DTYNPZOU08luUo0GTHuB+ow==", + "requires": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + }, + "dependencies": { + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "requires": { + "camelcase": "^4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + } + } + }, + "zwitch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.4.tgz", + "integrity": "sha512-YO803/X+13GNaZB7fVopjvHH0uWQKgJkgKnU1YCjxShjKGVuN9PPHHW8g+uFDpkHpSTNi3rCMKMewIcbC1BAYg==" + } + } +} diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 000000000..d91db32bf --- /dev/null +++ b/docs/package.json @@ -0,0 +1,39 @@ +{ + "name": "doc", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start": "node ./docz-lib/docz/bin/index.js dev", + "build": "node ./docz-lib/docz/bin/index.js build", + "predeploy": "npm install && npm run build", + "deploy": "gh-pages -d .docz/dist" + }, + "author": "", + "license": "MIT", + "peerDependencies": {}, + "devDependencies": { + "@babel/cli": "^7.4.4", + "@babel/core": "^7.4.5", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/preset-react": "^7.0.0", + "axios": "^0.19.0", + "babel-loader": "^8.0.6", + "babel-plugin-lodash": "^3.3.4", + "babel-plugin-react-transform": "^3.0.0", + "gh-pages": "^2.0.1", + "react-dropdown-select": "^3.0.0", + "react-github-btn": "^1.0.5", + "react-syntax-highlighter": "^11.0.1", + "reactstrap": "^8.0.0", + "xml2js": "^0.4.19" + }, + "dependencies": { + "docz": "^1.2.0", + "facepaint": "^1.2.1", + "hash-source": "^1.0.4", + "react-feather": "^1.1.6", + "styled-components": "^4.3.1", + "yargs": "^14.0.0" + } +} diff --git a/docs/pom.xml b/docs/pom.xml index c07a31475..858798918 100755 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -1,5 +1,4 @@ - + + + + + com.github.eirslett + frontend-maven-plugin + + validate + ${project.build.directory} + + + + - org.apache.maven.plugins - maven-site-plugin - - - org.apache.maven.doxia - doxia-module-twiki - ${doxia.version} - - - org.apache.maven.doxia - doxia-module-markdown - ${doxia.version} - - - org.apache.maven.doxia - doxia-module-markdown - ${doxia.version} - - - org.apache.maven.doxia - doxia-core - ${doxia.version} - - - - 8888 - + maven-resources-plugin + 2.7 + copy-resources - site + copy-resources - prepare-package + validate + + ${basedir}/target + + + ${basedir} + + .docz/** + node_modules/** + target/** + + + + + + + + + com.github.eirslett + frontend-maven-plugin + + + install node and npm + + install-node-and-npm + + + ${node-for-v2.version} + ${npm-for-v2.version} + + + + npm install + + npm + + + install + + + + npm build + + npm + + + run build + - + \ No newline at end of file diff --git a/docs/src/documents/Asf/asfinfo.md b/docs/src/documents/Asf/asfinfo.md new file mode 100644 index 000000000..99f7db675 --- /dev/null +++ b/docs/src/documents/Asf/asfinfo.md @@ -0,0 +1,17 @@ +--- +name: ASF +route: /asf +menu: ASF +--- + +import {CustomLink} from "theme/components/shared/common/CustomLink"; + +# ASF Infomation + + +1. How Apache Works +2. Events +3. License +4. Foundation +5. Sponsoring Apache +6. Thanks diff --git a/docs/src/documents/ClassificationPropagation.md b/docs/src/documents/ClassificationPropagation.md new file mode 100644 index 000000000..45004666d --- /dev/null +++ b/docs/src/documents/ClassificationPropagation.md @@ -0,0 +1,94 @@ +--- +name: Classification Propagation +route: /ClassificationPropagation +menu: Documentation +submenu: Features +--- +import Img from 'theme/components/shared/Img' + +# Classification Propagation + +* Classification propagation enables classifications associated to an entity to be automatically associated with other related entities of the entity. This is very useful in dealing with scenarios where a dataset derives it data from other datasets - like a table loaded with data in a file, a report generated from a table/view, etc. +* For example, when a table is classified as *PII*, tables or views that derive data from this table (via CTAS or ‘create view’ operation) will be automatically classified as *PII*. + + +## Use Cases + +Consider the following lineage where data from a 'hdfs_path' entity is loaded into a table, which is further made available through views. We will go through various scenarios to understand the classification propagation feature. + + + +## Add classification to an entity + +When classification ‘PII’ is added to 'hdfs_path' entity, the classification is propagated to all impacted entities in the lineage path, including 'employees' table, views 'us_employees' and 'uk_employees' - as shown below. + + +## Update classification associated with an entity + +Any updates to classifications associated with an entity will be seen in all entities the classification is propagated to as well. + + +## Remove classification associated with an entity + +When a classification is deleted from an entity, the classification will be removed from all entities the classification is propagated to as well. + + +## Add lineage between entities + +When lineage is added between entities, for example to capture loading of data in a file to a table, the classifications associated with the source entity are propagated to all impacted entities as well. +For example, when a view is created from a table, classifications associated with the table are propagated to the newly created view as well. + + +## Delete an entity + +**Case 1:** +When an entity is deleted, classifications associated with this entity will be removed from all entities the classifications are propagated to. +For example. when _employees_ table is deleted, classifications associated with this table are removed from 'employees_view' view. + + +**Case 2:** +When an entity is deleted in the middle of a lineage path, the propagation link is broken and previously propagated classifications will be removed from all derived entities of the deleted entity. +For example. when 'us_employees' table is deleted, classifications propagating through this table (**PII**) are removed from 'ca_employees' table, since the only path of propagation is broken by entity deletion. + + + + +**Case 3:** +When an entity is deleted in the middle of a lineage path and if there exists alternate path for propagation, previously propagated classifications will be retained. +For example. when 'us_employees' table is deleted, classifications propagating (**PII**) through this table are retained in 'ca_employees' table, since there are two propagation paths available and only one of them is broken by entity deletion. + + + + +## Control Propagation + +Apache Atlas provides few options to control whether/where a classification is propagated. +This section details available options. + +## Propagate flag in classification + +Each association of classification to an entity has a boolean flag that controls whether the classification is propagated or not. +When a classification is associated with an entity, this flag is set to ‘true’ i.e. the classification will be propagated to all impacted entities. This flag can be updated to desired value during initial association or later. + + +## Propagate flag in lineage edge + +Apache Atlas supports a flag at lineage edge to enable/disable propagation of classifications through the edge. By default, the propagation is enabled for lineage edges. +When the flag is turned off, no classification will be propagated through this edge; and propagation of currently propagated classifications through the edge will be reevaluated, so that they can be removed from impacted entities. +When the flag is turned on, propagation of classifications of the source entity will be reevaluated, so that they can be propagated to all impacted entities. + +## Block propagation of specific classifications in lineage edge + +Apache Atlas supports blocking propagation of specific classifications in at lineage edges. +This can be useful, for example, to handle scenarios like: a column classified as PII is masked when creating a view; in such scenario, if corresponding column in the created view might not have PII, hence the propagation of PII classification should be blocked. +This can be done by updating the lineage edge to add the PII classification in _‘blocked propagated classifications’_ list. +Classifications in blocked propagated classifications will not be propagated in the derivative/downstream entities. + + +## Notifications and Audit + +When propagated classifications are added/update/deleted, Apache Atlas sends notifications to 'ATLAS_ENTITIES' topic for each entity affected by the propagation. + +## Glossary + +When a classification is associated with a glossary term, the classification is automatically propagated to all entities associated with the term. diff --git a/docs/src/documents/Downloads/Downloads.md b/docs/src/documents/Downloads/Downloads.md new file mode 100644 index 000000000..930813633 --- /dev/null +++ b/docs/src/documents/Downloads/Downloads.md @@ -0,0 +1,187 @@ +--- +name: Download +route: /Downloads +menu: Downloads +submenu: Download +--- +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + +# Downloads + + +Apache Atlas release artifacts are distributed via mirror sites and should be checked for tampering using GPG or SHA-256. + +The table below lists release artifacts and their associated signatures and hashes. The keys used to sign the release +artifacts can be found in our published [KEYS file](https://www.apache.org/dist/atlas/KEYS). + +| **Version** | **Release Date** | **Tarball** | **GPG** | **Hash** | +| : ------------- : | : ------------- : | : ------------- : | : ------------- : |: ------------- :| +| 2.0.0 | 2019-05-14 | [source](https://www.apache.org/dyn/closer.cgi/atlas/2.0.0/apache-atlas-2.0.0-sources.tar.gz) | [signature](https://www.apache.org/dist/atlas/2.0.0/apache-atlas-2.0.0-sources.tar.gz.asc) | [SHA512](https://www.apache.org/dist/atlas/2.0.0/apache-atlas-2.0.0-sources.tar.gz.sha512) | +| 1.1.0 | 2018-09-17 | [source](https://www.apache.org/dyn/closer.cgi/atlas/1.1.0/apache-atlas-1.1.0-sources.tar.gz) | [signature](https://www.apache.org/dist/atlas/1.1.0/apache-atlas-1.1.0-sources.tar.gz.asc) | [SHA512](https://www.apache.org/dist/atlas/1.1.0/apache-atlas-1.1.0-sources.tar.gz.sha512) | +| 1.0.0 | 2018-06-02 | [source](https://www.apache.org/dyn/closer.cgi/atlas/1.0.0/apache-atlas-1.0.0-sources.tar.gz) | [signature](https://www.apache.org/dist/atlas/1.0.0/apache-atlas-1.0.0-sources.tar.gz.asc) | [SHA512](https://www.apache.org/dist/atlas/1.0.0/apache-atlas-1.0.0-sources.tar.gz.sha512) | +| 0.8.2 | 2018-02-05 | [source](https://www.apache.org/dyn/closer.cgi/atlas/0.8.2/apache-atlas-0.8.2-sources.tar.gz) | [signature](https://www.apache.org/dist/atlas/0.8.2/apache-atlas-0.8.2-sources.tar.gz.asc) | [SHA512](https://www.apache.org/dist/atlas/0.8.2/apache-atlas-0.8.2-sources.tar.gz.sha512) | +| 0.8.1 | 2017-08-29 | [source](https://archive.apache.org/dist/atlas/0.8.1/apache-atlas-0.8.1-sources.tar.gz) | [signature](https://archive.apache.org/dist/atlas/0.8.1/apache-atlas-0.8.1-sources.tar.gz.asc) | [SHA512](https://archive.apache.org/dist/atlas/0.8.1/apache-atlas-0.8.1-sources.tar.gz.sha512) | +| 0.8.0-incubating | 2017-03-16 | [source](https://archive.apache.org/dist/incubator/atlas/0.8.0-incubating/apache-atlas-0.8-incubating-sources.tar.gz) | [signature](https://archive.apache.org/dist/incubator/atlas/0.8.0-incubating/apache-atlas-0.8-incubating-sources.tar.gz.asc) | [SHA512](https://archive.apache.org/dist/incubator/atlas/0.8.0-incubating/apache-atlas-0.8-incubating-sources.tar.gz.sha512) | +| 0.7.1-incubating | 2017-01-29 | [source](https://archive.apache.org/dist/incubator/atlas/0.7.1-incubating/apache-atlas-0.7.1-incubating-sources.tar.gz) | [signature](https://archive.apache.org/dist/incubator/atlas/0.7.1-incubating/apache-atlas-0.7.1-incubating-sources.tar.gz.asc) | [checksum](https://archive.apache.org/dist/incubator/atlas/0.7.1-incubating/apache-atlas-0.7.1-incubating-sources.tar.gz.mds) | +| 0.7.0-incubating | 2016-07-09 | [source](https://archive.apache.org/dist/incubator/atlas/0.7.0-incubating/apache-atlas-0.7-incubating-sources.tar.gz) | [signature](https://archive.apache.org/dist/incubator/atlas/0.7.0-incubating/apache-atlas-0.7-incubating-sources.tar.gz.asc) | [SHA512](https://archive.apache.org/dist/incubator/atlas/0.7.0-incubating/apache-atlas-0.7-incubating-sources.tar.gz.sha512) | +| 0.6.0-incubating | 2015-12-31 | [source](https://archive.apache.org/dist/incubator/atlas/0.6.0-incubating/apache-atlas-0.6-incubating-sources.tar.gz) | [signature](https://archive.apache.org/dist/incubator/atlas/0.6.0-incubating/apache-atlas-0.6-incubating-sources.tar.gz.asc) | [SHA](https://archive.apache.org/dist/incubator/atlas/0.6.0-incubating/apache-atlas-0.6-incubating-sources.tar.gz.sha) | +| 0.5.0-incubating | 2015-06-22 | [source](https://archive.apache.org/dist/incubator/atlas/0.5.0-incubating/apache-atlas-0.5-incubating-sources.tar.gz) | [signature](https://archive.apache.org/dist/incubator/atlas/0.5.0-incubating/apache-atlas-0.5-incubating-sources.tar.gz.asc) | [SHA](https://archive.apache.org/dist/incubator/atlas/0.5.0-incubating/apache-atlas-0.5-incubating-sources.tar.gz.sha) | + +## Verify the integrity of the files + +It is essential that you verify the integrity of the downloaded file using the PGP signature (.asc file) or a hash +(.md5 or .sha* file). Please read [Verifying Apache Software Foundation Releases](https://www.apache.org/info/verification.html) +for more information on why you should verify our releases. + +The PGP signature can be verified using PGP or GPG, with the following steps: + * Download the release artifact from the link in the table above + * Download the signature file for the release from the link in the table above + * Download [Apache Atlas KEYS file](https://www.apache.org/dist/atlas/KEYS) + * Verify the signatures using one of the following: + + +% gpg --import KEYS +% gpg --verify downloaded_file.asc downloaded_file + + +or + + +% pgpk -a KEYS +% pgpv downloaded_file.asc + + +or + + +% pgp -ka KEYS +% pgp downloaded_file.asc + + +## Release Notes +**[Atlas 2.0.0](../2.0.0/index) (Released on 2019/05/14)** + * Soft-reference attribute implementation. + * Unique-attributes constraints at graph store-level + * Atlas Index Repair tool for Janusgraph + * Relationship notifications when new relationships are created in atlas + * Atlas Import Transform handler implementation + * Updated component versions to use Hadoop 3.1, Hive 3.1, HBase 2.0, Solr 7.5 and Kafka 2.0 + * Updated JanusGraph version to 0.3.1 + * Updated authentication to support trusted proxy + * Updated patch framework to persist typedef patches applied to atlas and handle data patches. + * Updated metrics module to collect notification metrics + * Updated Atlas Export to support incremental export of metadata. + * Notification Processing Improvements: + * Notification processing to support batch-commits + * New option in notification processing to ignore potentially incorrect hive_column_lineage + * Updated Hive hook to avoid duplicate column-lineage entities; also updated Atlas server to skip duplicate column-lineage entities + * Improved batch processing in notificaiton handler to avoid processing of an entity multiple times + * Add option to ignore/prune metadata for temporary/staging hive tables + * Avoid unnecessary lookup when creating new relationships + * UI Improvements: + * UI: Display counts besides the Type and Classification dropdown list in basic search + * UI: Display lineage information for process entities + * UI: Display entity specific icon for the lineage graph + * UI: Add relationships table inside relationships view in entity details page. + * UI: Add service-type dropdown in basic search to filter entitydef type. + * Various Bug-fixes and optimizations + * [List of JIRAs resolved in Apache Atlas 2.0.0 release](https://issues.apache.org/jira/issues/?jql=project%20%3D%20ATLAS%20AND%20status%20%3D%20Resolved%20AND%20fixVersion%20%3D%202.0.0%20ORDER%20BY%20updated%20DESC%2C%20priority%20DESC) + +**[Atlas 1.1.0](../1.1.0/index) (Released on 2018/09/17)** + * Updated authorization model to support access control on relationship operations + * Added support for AWS S3 datatypes, in Atlas server and Hive hook + * Updated [[http://atlas.apache.org/JanusGraph.html][JanusGraph]] version from 0.2.0 to 0.3.0 + * Updated hooks to send Kafka notifications asynchronously + * Enhanced classification-propagation with options to handle entity-deletes + * BugFixes and Optimizations + +**[Atlas 1.0.0](../1.0.0/index) (Released on 2018/06/02)** + + * Core model enhancement to support Relationship as first-class construct + * Support for JanusGraph graph database + * New DSL implementation, using ANTLR instead of Scala + * Removal of older type system implementation in atlas-typesystem library + * Metadata security - fine grained authorization + * Notification enhancements to support V2 style data structures + * Jackson library update from 1.9.13 to 2.9.2 + * Classification propagation via entity relationships + * Glossary terms, categories + * HBase Hook + * UI updates to show entity relationships + * [List of JIRAs resolved in Apache Atlas 1.0.0 release](https://issues.apache.org/jira/issues/?jql=project%20%3D%20Atlas%20AND%20resolution%20%3D%20Fixed%20AND%20fixVersion%20%3D%201.0.0%20ORDER%20BY%20key%20DESC) + +**[Atlas 0.8.2](../0.8.2/index) (Released on 2018/02/05)** + + * Search improvements: + * Basic search enhancement to optionally exclude sub-type entities and sub-classification-types + * Basic search to return classification attributes + * Support for saving searches + * UI support to reorder columns in search results page + * UI - updates for classification rendering – tree/flat view + * UI – minification of js, css; cache busting for static content (css, js) + * notification updates to handle large messages + * fix type initialization issues in HA deployment + * In HA, the passive node redirects the request with wrong URL encoding + * tool kit to recover from lost/bad index data + * [List of JIRAs resolved in Apache Atlas 0.8.2 release](https://issues.apache.org/jira/issues/?jql=project%20%3D%20Atlas%20AND%20fixVersion%20%3D%200.8.2%20ORDER%20BY%20key%20ASC) + +**[Atlas 0.8.1](../0.8.1/index) (Released on 2017/08/29)** + + * Basic-search improvement in use of index for attribute filtering + * DSL query enhancement to support 'like' operator + * REST API and UI enhancements to update classification attributes + * Export/import support to copy data between Apache Atlas instances + * Ability to delete a tag from UI (and API) + * UI enhancements: lineage, attribute search filter, ability to search historical data + * Knox SSO for Atlas REST APIs + * Moved from use of Guice + Spring framework for dependency-injection to use only Spring framework + +**[Atlas 0.8-incubating](../0.8.0-incubating/index) (Released on 2017/03/16)** + + * API revamp - new, structured REST API + * Simplified search UI + * UI to create/update entities - HDFS/HBase/Kafka + * Performance and scalability improvements + * Knox SSO for Atlas UI + +**[Atlas 0.7.1-incubating](../0.7.1-incubating/index) (Released on 2017/01/29)** + + * Performance and scalability improvements (ATLAS-1403, ATLAS-1404) + * Bug fixes + +**[Atlas 0.7-incubating](../0.7.0-incubating/index) (Released on 2016/07/09)** + + * High Availability (ATLAS-510) + * Business Catalog / Taxonomy (ATLAS-491) + * Improved Hive Integration (ATLAS-492) + * Improved Sqoop Integration + * Improved Falcon Integration + * Improved Storm Integration + * Improved Ambari Deployment & Management Support + * Entity Versioning / Audit (ATLAS-493) + * Performance Improvements + * Authorization (ATLAS-497) + * Atlas / Ranger Authorization Integration (ATLAS-495) + * Standalone HBase Support (ATLAS-498) + * Upgrade Support (ATLAS-631) + +**[Atlas 0.6-incubating](../0.6.0-incubating/index) (Released on 2015/12/30)** + * Improved Hive Server 2 Integration + * Sqoop Integration + * Falcon Integration + * Storm Integration + * Various Bug Fixes + * Atlas / Ranger Integration + +**[Atlas 0.5-incubating](../0.5.0-incubating/index) (Released on 2015/07/09)** + * Hive Server 2 Integration + * Basic Hive Lineage + * Basic Ambari Integration + * Kerberos Support + * DSL for query of datastore + * Basic Storage of Metadata + * Support for BerkleyDB + * Support for Titan 0.5 + * Support diff --git a/docs/src/site/markdown/Glossary.md b/docs/src/documents/Glossary.md similarity index 74% rename from docs/src/site/markdown/Glossary.md rename to docs/src/documents/Glossary.md index cb04787f7..61cab3c38 100644 --- a/docs/src/site/markdown/Glossary.md +++ b/docs/src/documents/Glossary.md @@ -1,20 +1,14 @@ - +--- +name: Glossary +route: /Glossary +menu: Documentation +submenu: Features +--- +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + +import Img from 'theme/components/shared/Img' # Glossary @@ -23,7 +17,8 @@ other and categorized so that they can be understood in different contexts. Thes like a Database, tables, columns etc. This helps abstract the technical jargon associated with the repositories and allows the user to discover/work with data in the vocabulary that is more familiar to them. -###Use cases +### Use cases + * Ability to define rich glossary vocabularies using the natural terminology (technical terms and/or business terms). * Ability to semantically relate the term(s) to each other. * Ability to map assets to glossary terms(s). @@ -31,7 +26,7 @@ allows the user to discover/work with data in the vocabulary that is more famili * Allow categories to be arranged in hierarchy - to express broader and finer scopes. * Separate management of glossary term(s) from the metadata. -###What is a Glossary term ? +### What is a Glossary term ? A term is a useful word for an enterprise. For the term(s) to be useful and meaningful, they need to grouped around their use and context. A term in Apache Atlas must have a unique qualifiedName, there can be term(s) with same name but they @@ -84,25 +79,25 @@ Category view allows an user to perform the following operations: Users can switch between term view and category view using toggle provided in GLOSSARY tab. - -

- - + + + + ##### Term context menu -* Create a new term +* Create a new term Clicking on the **ellipsis (...)** next to a glossary name shows a pop-over menu that allows users to create a term in the glossary or delete the glossary - as shown below. - + -* To delete a term +* To delete a term Clicking on the **ellipsis (...)** next to a term name shows a pop-over menu that allows users to delete the term - as shown below. - + ##### Term detail page @@ -113,109 +108,109 @@ page provides different details of the term. * Classifications tab shows the classification(s) associated with the selected term * Related terms tab shows the terms that are related to the selected term - + ##### Add classification to Term Clicking on **+** next to classification label to add a classification to the term. -Add classification -

-Add classification - details -

-Classifications associated with term +Add classification + +Add classification - details + +Classifications associated with term ##### Create term relationship with other term Click on "Related Terms" tab when viewing term details. Clicking on **+** will allow linking a term with the current term. - + ##### Categorize a term Click on **+** next to categories label to categorize a term. A modal dialog will be presented for choosing a category. - + #### **Category view** -When the toggle switch is on category, the panel will list down all glossaries along-with the category hierarchy. Here's a list of possible +When the toggle switch is on category, the panel will list down all glossaries along-with the category hierarchy. Here's a list of possible interactions under this view. -* Expanded view - - +* Expanded view + + ##### Category context menu Clicking on **ellipsis (...)** next to the category name will present a category context menu. -* To create a new category +* To create a new category - + -* To create a sub-category or delete a category +* To create a sub-category or delete a category - + ##### Category detail page Once a category is selected, the details will be presented in the right pane. - + ##### Categorize term Click on **+** next to the terms label to link a term under selected category. - -

- -

- - + + + + + + #### **Term assignment flow** -Terms can be assigned to an entity either from the results page or entity details page. - +Terms can be assigned to an entity either from the results page or entity details page. + ##### Assign term Click on **+** under "terms" column (if associating term from search page) - + Click on **+** next to "terms" label (if viewing a specific entity details) - + -Both the actions will present the following modal, follow prompts on screen to complete term assignment. +Both the actions will present the following modal, follow prompts on screen to complete term assignment. - + ##### Propagated classification If a term has classification then the entity is has been assigned inherits the same. - -

- + + + -#### **Search using a term** +#### **Search using a term** Apache Atlas basic-search API and UI have been updated to support term as a search criteria. This allows users to find -entities associated with a given term. Basic search UI now includes a new input drop-down for term based searches. +entities associated with a given term. Basic search UI now includes a new input drop-down for term based searches. - + *** @@ -226,8 +221,8 @@ Following operations are supported by Atlas, the details of REST interface can b ##### JSON structure * Glossary -```json -{ + +{`{ "guid": "2f341934-f18c-48b3-aa12-eaa0a2bfce85", "qualifiedName": "SampleBank", "displayName": "Banking", @@ -268,12 +263,12 @@ Following operations are supported by Atlas, the details of REST interface can b "relationGuid": "7757b031-4e25-43a8-bf77-946f7f06c67a", "displayText": "Loans" }] -} -``` +}`} + * Term -```json -{ + +{`{ "guid": "e441a540-ee55-4fc8-8eaf-4b9943d8929c", "qualifiedName": "fixed_mtg@SampleBank", "displayName": "15-30 yr mortgage", @@ -304,12 +299,12 @@ Following operations are supported by Atlas, the details of REST interface can b "termGuid" : "c4e2b956-2589-4648-8596-240d3bea5e44", "displayText": "ARM Loans" }] -} -``` +}`} + * Category -```json -{ + +{`{ "guid": "7f041401-de8c-443f-a3b7-7bf5a910ff6f", "qualifiedName": "Loans.Customer@HortoniaBank", "displayName": "Loans", @@ -332,8 +327,8 @@ Following operations are supported by Atlas, the details of REST interface can b "relationGuid": "8db1e784-4f04-4eda-9a58-6c9535a95451", "displayText": "ARM loans" }] -} -``` +}`} + ##### CREATE operations @@ -345,7 +340,7 @@ Following operations are supported by Atlas, the details of REST interface can b 6. Create a category with hierarchy 7. Create category and categorize term(s) 8. Assign term to entities - + **NOTE:** * During create operations glossary, term and category get an auto assigned GUID and qualifiedName. @@ -361,7 +356,7 @@ Following operations are supported by Atlas, the details of REST interface can b 2. Get all Glossaries - Gives all glossaries with terms and categories (headers) belonging to the respective glossary. 3. Get a term by GUID - Gives details about the term, categories it belongs to (if any) and any related term(s). 4. Get a category by GUID - Gives details about the category, category hierarchy (if any) and term(s) belonging to the category. -5. Get all terms of a given glossary - Gives all terms (with details as mentioned in #3) belonging to given glossary. +5. Get all terms of a given glossary - Gives all terms (with details as mentioned in #3) belonging to given glossary. 6. Get all categories of a given glossary - Gives all categories (with details as mentioned in #4) belonging to given glossary. 7. Get all terms related to given term - Gives all terms related/linked to the given term. 8. Get all categories related to a given category (parent and children) @@ -379,13 +374,13 @@ Following operations are supported by Atlas, the details of REST interface can b 6. Update a given category **NOTE:** - -* Partial update only deals with the **_primitive attributes_** defined in the Glossary model file. + +* Partial update only deals with the **_primitive attributes_** defined in the Glossary model file. * GUID and qualifiedName can't be changed once assigned. Only way to this is to delete and recreate the required object. * Anchors **can't** be removed in any updates * Update APIs expect the JSON to be modified **in-place** after the **GET** call. Any **_missing_** attributes/relations will be **_deleted_**. * Any update to category's hierarchy leads to a cascaded update of the hierarchy under it e.g. anchor change would affect all children, - parent change would affect the qualifiedName of self and children. + parent change would affect the qualifiedName of self and children. *** ##### DELETE operations @@ -394,4 +389,3 @@ Following operations are supported by Atlas, the details of REST interface can b 2. Delete term - Only deletes the term **_if_** it's not associated/assigned to any entity. 3. Delete category - **_Only_** deletes the given category, all children become top-level categories. 4. Remove term assignment from entity - diff --git a/docs/src/site/twiki/HighAvailability.twiki b/docs/src/documents/HighAvailability.md similarity index 64% rename from docs/src/site/twiki/HighAvailability.twiki rename to docs/src/documents/HighAvailability.md index e2fee46f2..5a483b150 100644 --- a/docs/src/site/twiki/HighAvailability.twiki +++ b/docs/src/documents/HighAvailability.md @@ -1,6 +1,17 @@ ----+ Fault Tolerance and High Availability Options +--- +name: High Availability +route: /HighAvailability +menu: Documentation +submenu: Features +--- ----++ Introduction +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + +# Fault Tolerance and High Availability Options + +## Introduction Apache Atlas uses and interacts with a variety of systems to provide metadata management and data lineage to data administrators. By choosing and configuring these dependencies appropriately, it is possible to achieve a high degree @@ -8,11 +19,11 @@ of service availability with Atlas. This document describes the state of high av including its capabilities and current limitations, and also the configuration required for achieving this level of high availability. -[[Architecture][The architecture page]] in the wiki gives an overview of the various components that make up Atlas. +[The architecture page](Architecture) in the wiki gives an overview of the various components that make up Atlas. The options mentioned below for various components derive context from the above page, and would be worthwhile to review before proceeding to read this page. ----++ Atlas Web Service +## Atlas Web Service Currently, the Atlas Web Service has a limitation that it can only have one active instance at a time. In earlier releases of Atlas, a backup instance could be provisioned and kept available. However, a manual failover was @@ -33,82 +44,87 @@ requests that return information about that instance. When configured in a High Availability mode, users can get the following operational benefits: - * *Uninterrupted service during maintenance intervals*: If an active instance of the Atlas Web Service needs to be brought down for maintenance, another instance would automatically become active and can service requests. - * *Uninterrupted service in event of unexpected failures*: If an active instance of the Atlas Web Service fails due to software or hardware errors, another instance would automatically become active and can service requests. + * **Uninterrupted service during maintenance intervals**: If an active instance of the Atlas Web Service needs to be brought down for maintenance, another instance would automatically become active and can service requests. + * **Uninterrupted service in event of unexpected failures**: If an active instance of the Atlas Web Service fails due to software or hardware errors, another instance would automatically become active and can service requests. In the following sub-sections, we describe the steps required to setup High Availability for the Atlas Web Service. We also describe how the deployment and client can be designed to take advantage of this capability. Finally, we describe a few details of the underlying implementation. ----+++ Setting up the High Availability feature in Atlas +### Setting up the High Availability feature in Atlas The following pre-requisites must be met for setting up the High Availability feature. * Ensure that you install Apache Zookeeper on a cluster of machines (a minimum of 3 servers is recommended for production). * Select 2 or more physical machines to run the Atlas Web Service instances on. These machines define what we refer to as a 'server ensemble' for Atlas. -To setup High Availability in Atlas, a few configuration options must be defined in the =atlas-application.properties= -file. While the complete list of configuration items are defined in the [[Configuration][Configuration Page]], this +To setup High Availability in Atlas, a few configuration options must be defined in the `atlas-application.properties` +file. While the complete list of configuration items are defined in the [Configuration Page](Configuration), this section lists a few of the main options. - * High Availability is an optional feature in Atlas. Hence, it must be enabled by setting the configuration option =atlas.server.ha.enabled= to true. - * Next, define a list of identifiers, one for each physical machine you have selected for the Atlas Web Service instance. These identifiers can be simple strings like =id1=, =id2= etc. They should be unique and should not contain a comma. - * Define a comma separated list of these identifiers as the value of the option =atlas.server.ids=. - * For each physical machine, list the IP Address/hostname and port as the value of the configuration =atlas.server.address.id=, where =id= refers to the identifier string for this physical machine. - * For e.g., if you have selected 2 machines with hostnames =host1.company.com= and =host2.company.com=, you can define the configuration options as below: - - atlas.server.ids=id1,id2 - atlas.server.address.id1=host1.company.com:21000 - atlas.server.address.id2=host2.company.com:21000 - + * High Availability is an optional feature in Atlas. Hence, it must be enabled by setting the configuration option `atlas.server.ha.enabled` to true. + * Next, define a list of identifiers, one for each physical machine you have selected for the Atlas Web Service instance. These identifiers can be simple strings like `id1`, `id2` etc. They should be unique and should not contain a comma. + * Define a comma separated list of these identifiers as the value of the option `atlas.server.ids`. + * For each physical machine, list the IP Address/hostname and port as the value of the configuration `atlas.server.address.id`, where `id` refers to the identifier string for this physical machine. + + * For e.g., if you have selected 2 machines with hostnames `host1.company.com` and `host2.company.com`, you can define the configuration options as below: + + +{`atlas.server.ids=id1,id2 +atlas.server.address.id1=host1.company.com:21000 +atlas.server.address.id2=host2.company.com:21000`} + + * Define the Zookeeper quorum which will be used by the Atlas High Availability feature. - + + atlas.server.ha.zookeeper.connect=zk1.company.com:2181,zk2.company.com:2181,zk3.company.com:2181 - - * You can review other configuration options that are defined for the High Availability feature, and set them up as desired in the =atlas-application.properties= file. + + + * You can review other configuration options that are defined for the High Availability feature, and set them up as desired in the `atlas-application.properties` file. * For production environments, the components that Atlas depends on must also be set up in High Availability mode. This is described in detail in the following sections. Follow those instructions to setup and configure them. * Install the Atlas software on the selected physical machines. - * Copy the =atlas-application.properties= file created using the steps above to the configuration directory of all the machines. + * Copy the `atlas-application.properties` file created using the steps above to the configuration directory of all the machines. * Start the dependent components. * Start each instance of the Atlas Web Service. To verify that High Availability is working, run the following script on each of the instances where Atlas Web Service is installed. - + + $ATLAS_HOME/bin/atlas_admin.py -status - + This script can print one of the values below as response: - * *ACTIVE*: This instance is active and can respond to user requests. - * *PASSIVE*: This instance is PASSIVE. It will redirect any user requests it receives to the current active instance. - * *BECOMING_ACTIVE*: This would be printed if the server is transitioning to become an ACTIVE instance. The server cannot service any metadata user requests in this state. - * *BECOMING_PASSIVE*: This would be printed if the server is transitioning to become a PASSIVE instance. The server cannot service any metadata user requests in this state. + * **ACTIVE**: This instance is active and can respond to user requests. + * **PASSIVE**: This instance is PASSIVE. It will redirect any user requests it receives to the current active instance. + * **BECOMING_ACTIVE**: This would be printed if the server is transitioning to become an ACTIVE instance. The server cannot service any metadata user requests in this state. + * **BECOMING_PASSIVE**: This would be printed if the server is transitioning to become a PASSIVE instance. The server cannot service any metadata user requests in this state. Under normal operating circumstances, only one of these instances should print the value *ACTIVE* as response to the script, and the others would print *PASSIVE*. ----+++ Configuring clients to use the High Availability feature +### Configuring clients to use the High Availability feature The Atlas Web Service can be accessed in two ways: - * *Using the Atlas Web UI*: This is a browser based client that can be used to query the metadata stored in Atlas. - * *Using the Atlas REST API*: As Atlas exposes a RESTful API, one can use any standard REST client including libraries in other applications. In fact, Atlas ships with a client called !AtlasClient that can be used as an example to build REST client access. + * **Using the Atlas Web UI**: This is a browser based client that can be used to query the metadata stored in Atlas. + * **Using the Atlas REST API**: As Atlas exposes a RESTful API, one can use any standard REST client including libraries in other applications. In fact, Atlas ships with a client called !AtlasClient that can be used as an example to build REST client access. In order to take advantage of the High Availability feature in the clients, there are two options possible. ----++++ Using an intermediate proxy +#### Using an intermediate proxy The simplest solution to enable highly available access to Atlas is to install and configure some intermediate proxy -that has a capability to transparently switch services based on status. One such proxy solution is [[http://www.haproxy.org/][HAProxy]]. +that has a capability to transparently switch services based on status. One such proxy solution is [HAProxy](http://www.haproxy.org/). Here is an example HAProxy configuration that can be used. Note this is provided for illustration only, and not as a recommended production configuration. For that, please refer to the HAProxy documentation for appropriate instructions. - -frontend atlas_fe + +{`frontend atlas_fe bind *:41000 default_backend atlas_be - backend atlas_be mode http option httpchk get /api/atlas/admin/status @@ -116,23 +132,22 @@ backend atlas_be balance roundrobin server host1_21000 host1:21000 check server host2_21000 host2:21000 check backup - listen atlas - bind localhost:42000 - + bind localhost:42000`} + The above configuration binds HAProxy to listen on port 41000 for incoming client connections. It then routes the connections to either of the hosts host1 or host2 depending on a HTTP status check. The status check is -done using a HTTP GET on the REST URL =/api/atlas/admin/status=, and is deemed successful only if the HTTP response +done using a HTTP GET on the REST URL `/api/atlas/admin/status`, and is deemed successful only if the HTTP response contains the string ACTIVE. ----++++ Using automatic detection of active instance +#### Using automatic detection of active instance If one does not want to setup and manage a separate proxy, then the other option to use the High Availability feature is to build a client application that is capable of detecting status and retrying operations. In such a setting, the client application can be launched with the URLs of all Atlas Web Service instances that form the -ensemble. The client should then call the REST URL =/api/atlas/admin/status= on each of these to determine which is -the active instance. The response from the Active instance would be of the form ={Status:ACTIVE}=. Also, when the +ensemble. The client should then call the REST URL `/api/atlas/admin/status` on each of these to determine which is +the active instance. The response from the Active instance would be of the form `{Status:ACTIVE}`. Also, when the client faces any exceptions in the course of an operation, it should again determine which of the remaining URLs is active and retry the operation. @@ -143,56 +158,57 @@ Utilities in Atlas, like =quick_start.py= and =import-hive.sh= can be configured URLs. When launched in this mode, the !AtlasClient automatically selects and works with the current active instance. If a proxy is set up in between, then its address can be used when running quick_start.py or import-hive.sh. ----+++ Implementation Details of Atlas High Availability +### Implementation Details of Atlas High Availability -The Atlas High Availability work is tracked under the master JIRA [[https://issues.apache.org/jira/browse/ATLAS-510][ATLAS-510]]. +The Atlas High Availability work is tracked under the master JIRA +[ATLAS-510](https://issues.apache.org/jira/browse/ATLAS-510). The JIRAs filed under it have detailed information about how the High Availability feature has been implemented. At a high level the following points can be called out: * The automatic selection of an Active instance, as well as automatic failover to a new Active instance happen through a leader election algorithm. - * For leader election, we use the [[http://curator.apache.org/curator-recipes/leader-latch.html][Leader Latch Recipe]] of [[http://curator.apache.org][Apache Curator]]. + * For leader election, we use the [Leader Latch Recipe](http://curator.apache.org/curator-recipes/leader-latch.html) of [Apache Curator](http://curator.apache.org) * The Active instance is the only one which initializes, modifies or reads state in the backend stores to keep them consistent. * Also, when an instance is elected as Active, it refreshes any cached information from the backend stores to get up to date. * A servlet filter ensures that only the active instance services user requests. If a passive instance receives these requests, it automatically redirects them to the current active instance. ----++ Metadata Store +## Metadata Store As described above, Atlas uses JanusGraph to store the metadata it manages. By default, Atlas uses a standalone HBase instance as the backing store for JanusGraph. In order to provide HA for the metadata store, we recommend that Atlas be configured to use distributed HBase as the backing store for JanusGraph. Doing this implies that you could benefit from the HA guarantees HBase provides. In order to configure Atlas to use HBase in HA mode, do the following: - * Choose an existing HBase cluster that is set up in HA mode to configure in Atlas (OR) Set up a new HBase cluster in [[http://hbase.apache.org/book.html#quickstart_fully_distributed][HA mode]]. - * If setting up HBase for Atlas, please following instructions listed for setting up HBase in the [[InstallationSteps][Installation Steps]]. + * Choose an existing HBase cluster that is set up in HA mode to configure in Atlas (OR) Set up a new HBase cluster in [HA mode](http://hbase.apache.org/book.html#quickstart_fully_distributed). + * If setting up HBase for Atlas, please following instructions listed for setting up HBase in the [Installation Steps](InstallationSteps). * We recommend using more than one HBase masters (at least 2) in the cluster on different physical hosts that use Zookeeper for coordination to provide redundancy and high availability of HBase. - * Refer to the [[Configuration][Configuration page]] for the options to configure in atlas.properties to setup Atlas with HBase. + * Refer to the [Configuration page](Configuration) for the options to configure in atlas.properties to setup Atlas with HBase. ----++ Index Store +## Index Store As described above, Atlas indexes metadata through JanusGraph to support full text search queries. In order to provide HA for the index store, we recommend that Atlas be configured to use Solr or Elasticsearch as the backing index store for JanusGraph. ----+++ Solr +### Solr In order to configure Atlas to use Solr in HA mode, do the following: - * Choose an existing !SolrCloud cluster setup in HA mode to configure in Atlas (OR) Set up a new [[https://cwiki.apache.org/confluence/display/solr/SolrCloud][SolrCloud cluster]]. + * Choose an existing !SolrCloud cluster setup in HA mode to configure in Atlas (OR) Set up a new [SolrCloud cluster](https://cwiki.apache.org/confluence/display/solr/SolrCloud). * Ensure Solr is brought up on at least 2 physical hosts for redundancy, and each host runs a Solr node. * We recommend the number of replicas to be set to at least 2 for redundancy. - * Create the !SolrCloud collections required by Atlas, as described in [[InstallationSteps][Installation Steps]] - * Refer to the [[Configuration][Configuration page]] for the options to configure in atlas.properties to setup Atlas with Solr. + * Create the !SolrCloud collections required by Atlas, as described in [Installation Steps](InstallationSteps) + * Refer to the [Configuration page](Configuration) for the options to configure in atlas.properties to setup Atlas with Solr. ----+++ Elasticsearch (Tech Preview) +### Elasticsearch (Tech Preview) In order to configure Atlas to use Elasticsearch in HA mode, do the following: - * Choose an existing Elasticsearch cluster setup, (OR) setup a new cluster [[https://www.elastic.co/guide/en/elasticsearch/reference/5.6/setup.html][Elasticsearch cluster]]. + * Choose an existing Elasticsearch cluster setup, (OR) setup a new cluster [Elasticsearch cluster](https://www.elastic.co/guide/en/elasticsearch/reference/5.6/setup.html). * Ensure that Elasticsearch is brought up on at least five physical hosts for redundancy. * A replica count of 3 is recommended - * Refer to the [[Configuration][Configuration page]] for the options to configure in atlas.properties to setup Atlas with Elasticsearch. + * Refer to the [Configuration page](Configuration) for the options to configure in atlas.properties to setup Atlas with Elasticsearch. ----++ Notification Server +## Notification Server -Metadata notification events from Hooks are sent to Atlas by writing them to a Kafka topic called *ATLAS_HOOK*. Similarly, events from -Atlas to other integrating components like Ranger, are written to a Kafka topic called *ATLAS_ENTITIES*. Since Kafka +Metadata notification events from Hooks are sent to Atlas by writing them to a Kafka topic called **ATLAS_HOOK**. Similarly, events from +Atlas to other integrating components like Ranger, are written to a Kafka topic called **ATLAS_ENTITIES**. Since Kafka persists these messages, the events will not be lost even if the consumers are down as the events are being sent. In addition, we recommend Kafka is also setup for fault tolerance so that it has higher availability guarantees. In order to configure Atlas to use Kafka in HA mode, do the following: @@ -204,18 +220,21 @@ to configure Atlas to use Kafka in HA mode, do the following: * The number of partitions for the ATLAS topics should be set to 1 (numPartitions) * Decide number of replicas for Kafka topic: Set this to at least 2 for redundancy. * Run the following commands: - - $KAFKA_HOME/bin/kafka-topics.sh --create --zookeeper --topic ATLAS_HOOK --replication-factor --partitions 1 - $KAFKA_HOME/bin/kafka-topics.sh --create --zookeeper --topic ATLAS_ENTITIES --replication-factor --partitions 1 - Here KAFKA_HOME points to the Kafka installation directory. - + + + {`$KAFKA_HOME/bin/kafka-topics.sh --create --zookeeper --topic ATLAS_HOOK --replication-factor --partitions 1 + $KAFKA_HOME/bin/kafka-topics.sh --create --zookeeper --topic ATLAS_ENTITIES --replication-factor --partitions 1 + Here KAFKA_HOME points to the Kafka installation directory.`} + + * In atlas-application.properties, set the following configuration: - - atlas.notification.embedded=false - atlas.kafka.zookeeper.connect= - atlas.kafka.bootstrap.servers= - Give at least 2 for redundancy. - ----++ Known Issues + + {`atlas.notification.embedded=false + atlas.kafka.zookeeper.connect= + atlas.kafka.bootstrap.servers= - Give at least 2 for redundancy.`} + - * If the HBase region servers hosting the Atlas table are down, Atlas would not be able to store or retrieve metadata from HBase until they are brought back online. \ No newline at end of file +## Known Issues + + * If the HBase region servers hosting the Atlas table are down, Atlas would not be able to store or retrieve metadata from HBase until they are brought back online. diff --git a/docs/src/site/twiki/Architecture.twiki b/docs/src/documents/HighLevelArchitecture.md old mode 100755 new mode 100644 similarity index 71% rename from docs/src/site/twiki/Architecture.twiki rename to docs/src/documents/HighLevelArchitecture.md index 654dbdf23..75d11c58f --- a/docs/src/site/twiki/Architecture.twiki +++ b/docs/src/documents/HighLevelArchitecture.md @@ -1,16 +1,24 @@ ----+ Architecture +--- +name: High Level Architecture +route: /Architecture +menu: Documentation +submenu: Features +--- +import Img from 'theme/components/shared/Img' ----++ Introduction +# Architecture ----++ Atlas High Level Architecture - Overview - +## Introduction + +## Atlas High Level Architecture - Overview + The components of Atlas can be grouped under the following major categories: ----+++ Core +### Core Atlas core includes the following components: -*Type System*: Atlas allows users to define a model for the metadata objects they want to manage. The model is composed +**Type System**: Atlas allows users to define a model for the metadata objects they want to manage. The model is composed of definitions called ‘types’. Instances of ‘types’ called ‘entities’ represent the actual metadata objects that are managed. The Type System is a component that allows users to define and manage the types and entities. All metadata objects managed by Atlas out of the box (like Hive tables, for e.g.) are modelled using types and represented as @@ -20,60 +28,53 @@ One key point to note is that the generic nature of the modelling in Atlas allow define both technical metadata and business metadata. It is also possible to define rich relationships between the two using features of Atlas. -*Graph Engine*: Internally, Atlas persists metadata objects it manages using a Graph model. This approach provides great +**Graph Engine**: Internally, Atlas persists metadata objects it manages using a Graph model. This approach provides great flexibility and enables efficient handling of rich relationships between the metadata objects. Graph engine component is responsible for translating between types and entities of the Atlas type system, and the underlying graph persistence model. In addition to managing the graph objects, the graph engine also creates the appropriate indices for the metadata objects so that they can be searched efficiently. Atlas uses the JanusGraph to store the metadata objects. -*Ingest / Export*: The Ingest component allows metadata to be added to Atlas. Similarly, the Export component exposes +**Ingest / Export**: The Ingest component allows metadata to be added to Atlas. Similarly, the Export component exposes metadata changes detected by Atlas to be raised as events. Consumers can consume these change events to react to metadata changes in real time. ----+++ Integration +### Integration Users can manage metadata in Atlas using two methods: -*API*: All functionality of Atlas is exposed to end users via a REST API that allows types and entities to be created, +**API**: All functionality of Atlas is exposed to end users via a REST API that allows types and entities to be created, updated and deleted. It is also the primary mechanism to query and discover the types and entities managed by Atlas. -*Messaging*: In addition to the API, users can choose to integrate with Atlas using a messaging interface that is +**Messaging**: In addition to the API, users can choose to integrate with Atlas using a messaging interface that is based on Kafka. This is useful both for communicating metadata objects to Atlas, and also to consume metadata change events from Atlas using which applications can be built. The messaging interface is particularly useful if one wishes to use a more loosely coupled integration with Atlas that could allow for better scalability, reliability etc. Atlas uses Apache Kafka as a notification server for communication between hooks and downstream consumers of metadata notification events. Events are written by the hooks and Atlas to different Kafka topics. ----+++ Metadata sources +### Metadata sources Atlas supports integration with many sources of metadata out of the box. More integrations will be added in future as well. Currently, Atlas supports ingesting and managing metadata from the following sources: - - * [[Hook-HBase][HBase]] - * [[Hook-Hive][Hive]] - * [[Hook-Sqoop][Sqoop]] - * [[Hook-Storm][Storm]] - * [[Bridge-Kafka][Kafka]] + * [HBase](/Hook-HBase) + * [Hive](/Hook-Hive) + * [Sqoop](/Hook-Sqoop) + * [Storm](/Hook-Storm) + * [Kafka](/Hook-Kafka) The integration implies two things: There are metadata models that Atlas defines natively to represent objects of these components. There are components Atlas provides to ingest metadata objects from these components (in real time or in batch mode in some cases). ----+++ Applications +### Applications The metadata managed by Atlas is consumed by a variety of applications for satisfying many governance use cases. -*Atlas Admin UI*: This component is a web based application that allows data stewards and scientists to discover +**Atlas Admin UI**: This component is a web based application that allows data stewards and scientists to discover and annotate metadata. Of primary importance here is a search interface and SQL like query language that can be used to query the metadata types and objects managed by Atlas. The Admin UI uses the REST API of Atlas for building its functionality. -*Tag Based Policies*: [[http://ranger.apache.org/][Apache Ranger]] is an advanced security management solution +**Tag Based Policies**: [Apache Ranger](http://ranger.apache.org/) is an advanced security management solution for the Hadoop ecosystem having wide integration with a variety of Hadoop components. By integrating with Atlas, Ranger allows security administrators to define metadata driven security policies for effective governance. Ranger is a consumer to the metadata change events notified by Atlas. - - - - - - diff --git a/docs/src/site/twiki/Hook-Falcon.twiki b/docs/src/documents/Hook/Hook-Falcon.md similarity index 60% rename from docs/src/site/twiki/Hook-Falcon.twiki rename to docs/src/documents/Hook/Hook-Falcon.md index ca43812b3..1bf47a296 100644 --- a/docs/src/site/twiki/Hook-Falcon.twiki +++ b/docs/src/documents/Hook/Hook-Falcon.md @@ -1,6 +1,17 @@ ----+ Falcon Atlas Bridge +--- +name: Falcon +route: /Hook-Falcon +menu: Documentation +submenu: Hooks +--- ----++ Falcon Model +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + +# Falcon Atlas Bridge + +## Falcon Model The default hive model includes the following types: * Entity types: * falcon_cluster @@ -22,25 +33,28 @@ The default hive model includes the following types: One falcon_process entity is created for every cluster that the falcon process is defined for. The entities are created and de-duped using unique qualifiedName attribute. They provide namespace and can be used for querying/lineage as well. The unique attributes are: - * falcon_process.qualifiedName - @ - * falcon_cluster.qualifiedName - - * falcon_feed.qualifiedName - @ - * falcon_feed_creation.qualifiedName - - * falcon_feed_replication.qualifiedName - + * falcon_process.qualifiedName - `@` + * falcon_cluster.qualifiedName - `` + * falcon_feed.qualifiedName - `@` + * falcon_feed_creation.qualifiedName - `` + * falcon_feed_replication.qualifiedName - `` ----++ Falcon Hook +## Falcon Hook Falcon supports listeners on falcon entity submission. This is used to add entities in Atlas using the model detailed above. Follow the instructions below to setup Atlas hook in Falcon: - * Add 'org.apache.atlas.falcon.service.AtlasService' to application.services in /startup.properties + * Add 'org.apache.atlas.falcon.service.AtlasService' to application.services in ``/startup.properties * untar apache-atlas-${project.version}-falcon-hook.tar.gz * cd apache-atlas-falcon-hook-${project.version} - * Copy entire contents of folder apache-atlas-falcon-hook-${project.version}/hook/falcon to /hook/falcon - * Link Atlas hook jars in Falcon classpath - 'ln -s /hook/falcon/* /server/webapp/falcon/WEB-INF/lib/' - * In /falcon-env.sh, set an environment variable as follows: - - export FALCON_SERVER_OPTS="/hook/falcon/*:$FALCON_SERVER_OPTS" + * Copy entire contents of folder apache-atlas-falcon-hook-${project.version}/hook/falcon to ``/hook/falcon + * Link Atlas hook jars in Falcon classpath - 'ln -s ``/hook/falcon/* ``/server/webapp/falcon/WEB-INF/lib/' + * In ``/falcon-env.sh, set an environment variable as follows: + + + {`export FALCON_SERVER_OPTS="/hook/falcon/*:$FALCON_SERVER_OPTS"`} + -The following properties in /atlas-application.properties control the thread pool and notification details: + +The following properties in ``/atlas-application.properties control the thread pool and notification details: * atlas.hook.falcon.synchronous - boolean, true to run the hook synchronously. default false * atlas.hook.falcon.numRetries - number of retries for notification failure. default 3 * atlas.hook.falcon.minThreads - core number of threads. default 5 @@ -48,8 +62,8 @@ The following properties in /atlas-application.properties control th * atlas.hook.falcon.keepAliveTime - keep alive time in msecs. default 10 * atlas.hook.falcon.queueSize - queue size for the threadpool. default 10000 -Refer [[Configuration][Configuration]] for notification related configurations +Refer [Configuration](Configuration) for notification related configurations ----++ NOTES +## NOTES * In falcon cluster entity, cluster name used should be uniform across components like hive, falcon, sqoop etc. If used with ambari, ambari cluster name should be used for cluster entity diff --git a/docs/src/site/twiki/Hook-HBase.twiki b/docs/src/documents/Hook/Hook-HBase.md similarity index 66% rename from docs/src/site/twiki/Hook-HBase.twiki rename to docs/src/documents/Hook/Hook-HBase.md index 898655adc..d5bc96ad8 100644 --- a/docs/src/site/twiki/Hook-HBase.twiki +++ b/docs/src/documents/Hook/Hook-HBase.md @@ -1,6 +1,17 @@ ----+ Apache Atlas Hook & Bridge for Apache HBase +--- +name: HBase +route: /Hook-HBase +menu: Documentation +submenu: Hooks +--- ----++ HBase Model +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + +# Apache Atlas Hook & Bridge for Apache HBase + +## HBase Model HBase model includes the following types: * Entity types: * hbase_namespace @@ -14,60 +25,63 @@ HBase model includes the following types: * attributes: qualifiedName, name, description, owner, columns, createTime, bloomFilterType, compressionType, compactionCompressionType, encryptionType, inMemoryCompactionPolicy, keepDeletedCells, maxversions, minVersions, datablockEncoding, storagePolicy, ttl, blockCachedEnabled, cacheBloomsOnWrite, cacheDataOnWrite, evictBlocksOnClose, prefetchBlocksOnOpen, newVersionsBehavior, isMobEnabled, mobCompactPartitionPolicy HBase entities are created and de-duped in Atlas using unique attribute qualifiedName, whose value should be formatted as detailed below. Note that namespaceName, tableName and columnFamilyName should be in lower case. - - hbase_namespace.qualifiedName: @ - hbase_table.qualifiedName: :@ - hbase_column_family.qualifiedName: :.@ - + + +{`hbase_namespace.qualifiedName: @ +hbase_table.qualifiedName: :@ +hbase_column_family.qualifiedName: :.@`} + ----++ HBase Hook +## HBase Hook Atlas HBase hook registers with HBase master as a co-processor. On detecting changes to HBase namespaces/tables/column-families, Atlas hook updates the metadata in Atlas via Kafka notifications. Follow the instructions below to setup Atlas hook in HBase: * Register Atlas hook in hbase-site.xml by adding the following: - - - hbase.coprocessor.master.classes - org.apache.atlas.hbase.hook.HBaseAtlasCoprocessor - + + +{` +hbase.coprocessor.master.classes +org.apache.atlas.hbase.hook.HBaseAtlasCoprocessor +`} + + * untar apache-atlas-${project.version}-hbase-hook.tar.gz * cd apache-atlas-hbase-hook-${project.version} - * Copy entire contents of folder apache-atlas-hbase-hook-${project.version}/hook/hbase to /hook/hbase - * Link Atlas hook jars in HBase classpath - 'ln -s /hook/hbase/* /lib/' - * Copy /atlas-application.properties to the HBase conf directory. + * Copy entire contents of folder apache-atlas-hbase-hook-${project.version}/hook/hbase to ``/hook/hbase + * Link Atlas hook jars in HBase classpath - 'ln -s ``/hook/hbase/* ``/lib/' + * Copy ``/atlas-application.properties to the HBase conf directory. The following properties in atlas-application.properties control the thread pool and notification details: - -atlas.hook.hbase.synchronous=false # whether to run the hook synchronously. false recommended to avoid delays in HBase operations. Default: false + + +{`atlas.hook.hbase.synchronous=false # whether to run the hook synchronously. false recommended to avoid delays in HBase operations. Default: false atlas.hook.hbase.numRetries=3 # number of retries for notification failure. Default: 3 atlas.hook.hbase.queueSize=10000 # queue size for the threadpool. Default: 10000 - atlas.cluster.name=primary # clusterName to use in qualifiedName of entities. Default: primary - atlas.kafka.zookeeper.connect= # Zookeeper connect URL for Kafka. Example: localhost:2181 atlas.kafka.zookeeper.connection.timeout.ms=30000 # Zookeeper connection timeout. Default: 30000 atlas.kafka.zookeeper.session.timeout.ms=60000 # Zookeeper session timeout. Default: 60000 -atlas.kafka.zookeeper.sync.time.ms=20 # Zookeeper sync time. Default: 20 - +atlas.kafka.zookeeper.sync.time.ms=20 # Zookeeper sync time. Default: 20`} + Other configurations for Kafka notification producer can be specified by prefixing the configuration name with "atlas.kafka.". -For list of configuration supported by Kafka producer, please refer to [[http://kafka.apache.org/documentation/#producerconfigs][Kafka Producer Configs]] +For list of configuration supported by Kafka producer, please refer to [Kafka Producer Configs](http://kafka.apache.org/documentation/#producerconfigs) ----++ NOTES +## NOTES * Only the namespace, table and column-family create/update/ delete operations are captured by Atlas HBase hook. Changes to columns are be captured. ----++ Importing HBase Metadata +## Importing HBase Metadata Apache Atlas provides a command-line utility, import-hbase.sh, to import metadata of Apache HBase namespaces and tables into Apache Atlas. This utility can be used to initialize Apache Atlas with namespaces/tables present in a Apache HBase cluster. This utility supports importing metadata of a specific table, tables in a specific namespace or all tables. - -Usage 1: /hook-bin/import-hbase.sh + +{`Usage 1: /hook-bin/import-hbase.sh Usage 2: /hook-bin/import-hbase.sh [-n OR --namespace ] [-t OR --table
] Usage 3: /hook-bin/import-hbase.sh [-f ] File Format: namespace1:tbl1 namespace1:tbl2 - namespace2:tbl1 - + namespace2:tbl1`} + diff --git a/docs/src/site/twiki/Hook-Hive.twiki b/docs/src/documents/Hook/Hook-Hive.md similarity index 67% rename from docs/src/site/twiki/Hook-Hive.twiki rename to docs/src/documents/Hook/Hook-Hive.md index 129e17975..8860c2031 100644 --- a/docs/src/site/twiki/Hook-Hive.twiki +++ b/docs/src/documents/Hook/Hook-Hive.md @@ -1,12 +1,25 @@ ----+ Apache Atlas Hook & Bridge for Apache Hive +--- +name: Hive +route: /Hook-Hive +menu: Documentation +submenu: Hooks +--- ----++ Hive Model +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; +import Img from 'theme/components/shared/Img' + +# Apache Atlas Hook & Bridge for Apache Hive + + +## Hive Model Hive model includes the following types: * Entity types: - * hive_db - * super-types: !Asset - * attributes: qualifiedName, name, description, owner, clusterName, location, parameters, ownerName - * hive_table + * hive_db + * super-types: !Asset + * attributes: qualifiedName, name, description, owner, clusterName, location, parameters, ownerName + * hive_table * super-types: !DataSet * attributes: qualifiedName, name, description, owner, db, createTime, lastAccessTime, comment, retention, sd, partitionKeys, columns, aliases, parameters, viewOriginalText, viewExpandedText, tableType, temporary * hive_column @@ -21,63 +34,69 @@ Hive model includes the following types: * hive_column_lineage * super-types: Process * attributes: qualifiedName, name, description, owner, inputs, outputs, query, depenendencyType, expression + * Enum types: - * hive_principal_type - * values: USER, ROLE, GROUP + * hive_principal_type + * values: USER, ROLE, GROUP + * Struct types: - * hive_order + * hive_order * attributes: col, order * hive_serde * attributes: name, serializationLib, parameters + Hive entities are created and de-duped in Atlas using unique attribute qualifiedName, whose value should be formatted as detailed below. Note that dbName, tableName and columnName should be in lower case. - - hive_db.qualifiedName: @ - hive_table.qualifiedName: .@ - hive_column.qualifiedName: ..@ - hive_process.queryString: trimmed query string in lower case - + + +{`hive_db.qualifiedName: @ +hive_table.qualifiedName: .@ +hive_column.qualifiedName: ..@ +hive_process.queryString: trimmed query string in lower case`} + ----++ Hive Hook +## Hive Hook Atlas Hive hook registers with Hive to listen for create/update/delete operations and updates the metadata in Atlas, via Kafka notifications, for the changes in Hive. Follow the instructions below to setup Atlas hook in Hive: - * Set-up Atlas hook in hive-site.xml by adding the following: - - - hive.exec.post.hooks + * Set-up Atlas hook in hive-site.xml by adding the following: + + +{` + hive.exec.post.hooks org.apache.atlas.hive.hook.HiveHook - + `} + - * untar apache-atlas-${project.version}-hive-hook.tar.gz - * cd apache-atlas-hive-hook-${project.version} - * Copy entire contents of folder apache-atlas-hive-hook-${project.version}/hook/hive to /hook/hive - * Add 'export HIVE_AUX_JARS_PATH=/hook/hive' in hive-env.sh of your hive configuration - * Copy /atlas-application.properties to the hive conf directory. + * untar apache-atlas-${project.version}-hive-hook.tar.gz + * cd apache-atlas-hive-hook-${project.version} + * Copy entire contents of folder apache-atlas-hive-hook-${project.version}/hook/hive to ``/hook/hive + * Add 'export HIVE_AUX_JARS_PATH=``/hook/hive' in hive-env.sh of your hive configuration + * Copy ``/atlas-application.properties to the hive conf directory. + The following properties in atlas-application.properties control the thread pool and notification details: - -atlas.hook.hive.synchronous=false # whether to run the hook synchronously. false recommended to avoid delays in Hive query completion. Default: false + + +{`atlas.hook.hive.synchronous=false # whether to run the hook synchronously. false recommended to avoid delays in Hive query completion. Default: false atlas.hook.hive.numRetries=3 # number of retries for notification failure. Default: 3 atlas.hook.hive.queueSize=10000 # queue size for the threadpool. Default: 10000 - atlas.cluster.name=primary # clusterName to use in qualifiedName of entities. Default: primary - atlas.kafka.zookeeper.connect= # Zookeeper connect URL for Kafka. Example: localhost:2181 atlas.kafka.zookeeper.connection.timeout.ms=30000 # Zookeeper connection timeout. Default: 30000 atlas.kafka.zookeeper.session.timeout.ms=60000 # Zookeeper session timeout. Default: 60000 -atlas.kafka.zookeeper.sync.time.ms=20 # Zookeeper sync time. Default: 20 - +atlas.kafka.zookeeper.sync.time.ms=20 # Zookeeper sync time. Default: 20`} + -Other configurations for Kafka notification producer can be specified by prefixing the configuration name with "atlas.kafka.". For list of configuration supported by Kafka producer, please refer to [[http://kafka.apache.org/documentation/#producerconfigs][Kafka Producer Configs]] +Other configurations for Kafka notification producer can be specified by prefixing the configuration name with "atlas.kafka.". For list of configuration supported by Kafka producer, please refer to [Kafka Producer Configs](http://kafka.apache.org/documentation/#producerconfigs) ----++ Column Level Lineage +## Column Level Lineage Starting from 0.8-incubating version of Atlas, Column level lineage is captured in Atlas. Below are the details ----+++ Model +### Model * !ColumnLineageProcess type is a subtype of Process * This relates an output Column to a set of input Columns or the Input Table @@ -91,23 +110,24 @@ Starting from 0.8-incubating version of Atlas, Column level lineage is captured * Since Process links input and output !DataSets, Column is a subtype of !DataSet ----+++ Examples +### Examples For a simple CTAS below: - -create table t2 as select id, name from T1 + + +create table t2 as select id, name from T1 + The lineage is captured as - + ----+++ Extracting Lineage from Hive commands +### Extracting Lineage from Hive commands * The !HiveHook maps the !LineageInfo in the !HookContext to Column lineage instances - * The !LineageInfo in Hive provides column-level lineage for the final !FileSinkOperator, linking them to the input columns in the Hive Query ----++ NOTES +## NOTES * Column level lineage works with Hive version 1.2.1 after the patch for HIVE-13112 is applied to Hive source * Since database name, table name and column names are case insensitive in hive, the corresponding names in entities are lowercase. So, any search APIs should use lowercase while querying on the entity names * The following hive operations are captured by hive hook currently @@ -120,17 +140,17 @@ The lineage is captured as * alter view ----++ Importing Hive Metadata +## Importing Hive Metadata Apache Atlas provides a command-line utility, import-hive.sh, to import metadata of Apache Hive databases and tables into Apache Atlas. This utility can be used to initialize Apache Atlas with databases/tables present in Apache Hive. This utility supports importing metadata of a specific table, tables in a specific database or all databases and tables. - -Usage 1: /hook-bin/import-hive.sh + +{`Usage 1: /hook-bin/import-hive.sh Usage 2: /hook-bin/import-hive.sh [-d OR --database ] [-t
OR --table
] Usage 3: /hook-bin/import-hive.sh [-f ] File Format: database1:tbl1 database1:tbl2 - database2:tbl1 - + database2:tbl1`} + diff --git a/docs/src/documents/Hook/Hook-Kafka.md b/docs/src/documents/Hook/Hook-Kafka.md new file mode 100644 index 000000000..403f9a3c6 --- /dev/null +++ b/docs/src/documents/Hook/Hook-Kafka.md @@ -0,0 +1,50 @@ +--- +name: Kafka +route: /Hook-Kafka +menu: Documentation +submenu: Hooks +--- + +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; +import Img from 'theme/components/shared/Img' + + +# Apache Atlas Hook for Apache Kafka + +## Kafka Model +Kafka model includes the following types: + * Entity types: + * kafka_topic + * super-types: !DataSet + * attributes: qualifiedName, name, description, owner, topic, uri, partitionCount + +Kafka entities are created and de-duped in Atlas using unique attribute qualifiedName, whose value should be formatted as detailed below. +Note that qualifiedName will have topic name in lower case. + + {`topic.qualifiedName: @`} + + + +## Setup +Binary files are present in apache-atlas--kafka-hook.tar.gz + +Copy apache-atlas-kafka-hook-/hook/kafka folder to /hook/ directory + +Copy apache-atlas-kafka-hook-/hook-bin folder to /hook-bin directory + +## Importing Kafka Metadata +Apache Atlas provides a command-line utility, import-kafka.sh, to import metadata of Apache Kafka topics into Apache Atlas. +This utility can be used to initialize Apache Atlas with topics present in Apache Kafka. +This utility supports importing metadata of a specific topic or all topics. + + +{`sage 1: /hook-bin/import-kafka.sh +Usage 2: /hook-bin/import-kafka.sh [-t OR --topic ] +Usage 3: /hook-bin/import-kafka.sh [-f ] + File Format: + topic1 + topic2 + topic3`} + diff --git a/docs/src/site/twiki/Hook-Sqoop.twiki b/docs/src/documents/Hook/Hook-Sqoop.md similarity index 59% rename from docs/src/site/twiki/Hook-Sqoop.twiki rename to docs/src/documents/Hook/Hook-Sqoop.md index ba4698397..a696e154b 100644 --- a/docs/src/site/twiki/Hook-Sqoop.twiki +++ b/docs/src/documents/Hook/Hook-Sqoop.md @@ -1,6 +1,17 @@ ----+ Apache Atlas Hook for Apache Sqoop +--- +name: Sqoop +route: /Hook-Sqoop +menu: Documentation +submenu: Hooks +--- ----++ Sqoop Model +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + +# Apache Atlas Hook for Apache Sqoop + +## Sqoop Model Sqoop model includes the following types: * Entity types: * sqoop_process @@ -9,7 +20,6 @@ Sqoop model includes the following types: * sqoop_dbdatastore * super-types: !DataSet * attributes: qualifiedName, name, description, owner, dbStoreType, storeUse, storeUri, source - * Enum types: * sqoop_operation_type * values: IMPORT, EXPORT, EVAL @@ -17,48 +27,52 @@ Sqoop model includes the following types: * values: TABLE, QUERY, PROCEDURE, OTHER Sqoop entities are created and de-duped in Atlas using unique attribute qualifiedName, whose value should be formatted as detailed below. - - sqoop_process.qualifiedName: sqoop --connect {[--table ] || [--database ]} [--query ] - sqoop_dbdatastore.qualifiedName: --url {[--table ] || [--database ]} [--query ] --hive- --hive-database [--hive-table ] --hive-cluster - ----++ Sqoop Hook + +{`sqoop_process.qualifiedName: sqoop --connect {[--table ] || [--database ]} [--query ] +sqoop_dbdatastore.qualifiedName: --url {[--table ] || [--database ]} [--query ] --hive- --hive-database [--hive-table ] --hive-cluster `} + + +## Sqoop Hook Sqoop added a !SqoopJobDataPublisher that publishes data to Atlas after completion of import Job. Today, only hiveImport is supported in !SqoopHook. This is used to add entities in Atlas using the model detailed above. Follow the instructions below to setup Atlas hook in Hive: Add the following properties to to enable Atlas hook in Sqoop: - * Set-up Atlas hook in /sqoop-site.xml by adding the following: - - + * Set-up Atlas hook in ``/sqoop-site.xml by adding the following: + + +{` sqoop.job.data.publish.class org.apache.atlas.sqoop.hook.SqoopHook - + `} + + * untar apache-atlas-${project.version}-sqoop-hook.tar.gz * cd apache-atlas-sqoop-hook-${project.version} - * Copy entire contents of folder apache-atlas-sqoop-hook-${project.version}/hook/sqoop to /hook/sqoop - * Copy /atlas-application.properties to to the sqoop conf directory / - * Link /hook/sqoop/*.jar in sqoop lib + * Copy entire contents of folder apache-atlas-sqoop-hook-${project.version}/hook/sqoop to ``/hook/sqoop + * Copy ``/atlas-application.properties to to the sqoop conf directory ``/ + * Link ``/hook/sqoop/*.jar in sqoop lib + The following properties in atlas-application.properties control the thread pool and notification details: - -atlas.hook.sqoop.synchronous=false # whether to run the hook synchronously. false recommended to avoid delays in Sqoop operation completion. Default: false + + +{`atlas.hook.sqoop.synchronous=false # whether to run the hook synchronously. false recommended to avoid delays in Sqoop operation completion. Default: false atlas.hook.sqoop.numRetries=3 # number of retries for notification failure. Default: 3 atlas.hook.sqoop.queueSize=10000 # queue size for the threadpool. Default: 10000 - atlas.cluster.name=primary # clusterName to use in qualifiedName of entities. Default: primary - atlas.kafka.zookeeper.connect= # Zookeeper connect URL for Kafka. Example: localhost:2181 atlas.kafka.zookeeper.connection.timeout.ms=30000 # Zookeeper connection timeout. Default: 30000 atlas.kafka.zookeeper.session.timeout.ms=60000 # Zookeeper session timeout. Default: 60000 -atlas.kafka.zookeeper.sync.time.ms=20 # Zookeeper sync time. Default: 20 - +atlas.kafka.zookeeper.sync.time.ms=20 # Zookeeper sync time. Default: 20`} + -Other configurations for Kafka notification producer can be specified by prefixing the configuration name with "atlas.kafka.". For list of configuration supported by Kafka producer, please refer to [[http://kafka.apache.org/documentation/#producerconfigs][Kafka Producer Configs]] +Other configurations for Kafka notification producer can be specified by prefixing the configuration name with "atlas.kafka.". For list of configuration supported by Kafka producer, please refer to [Kafka Producer Configs](http://kafka.apache.org/documentation/#producerconfigs) ----++ NOTES +## NOTES * Only the following sqoop operations are captured by sqoop hook currently * hiveImport diff --git a/docs/src/site/twiki/Hook-Storm.twiki b/docs/src/documents/Hook/Hook-Storm.md similarity index 79% rename from docs/src/site/twiki/Hook-Storm.twiki rename to docs/src/documents/Hook/Hook-Storm.md index 6b940a71d..a159ec4cf 100644 --- a/docs/src/site/twiki/Hook-Storm.twiki +++ b/docs/src/documents/Hook/Hook-Storm.md @@ -1,6 +1,17 @@ ----+ Apache Atlas Hook for Apache Storm +--- +name: Storm +route: /Hook-Storm +menu: Documentation +submenu: Hooks +--- ----++ Introduction +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + +# Apache Atlas Hook for Apache Storm + +## Introduction Apache Storm is a distributed real-time computation system. Storm makes it easy to reliably process unbounded streams of data, doing for real-time @@ -20,7 +31,7 @@ There are 2 parts in this process detailed below: * Storm Atlas Hook to update metadata in Atlas ----++ Storm Data Model +## Storm Data Model A data model is represented as Types in Atlas. It contains the descriptions of various nodes in the topology graph, such as spouts and bolts and the @@ -39,7 +50,7 @@ if it finds that these are not known to the Atlas server. The data model for each of the types is described in the class definition at org.apache.atlas.storm.model.StormDataModel. ----++ Storm Atlas Hook +## Storm Atlas Hook Atlas is notified when a new topology is registered successfully in Storm. Storm provides a hook, backtype.storm.ISubmitterHook, at the Storm client used to @@ -50,7 +61,7 @@ topology and updates Atlas using the types defined. Atlas implements the Storm client hook interface in org.apache.atlas.storm.hook.StormAtlasHook. ----++ Limitations +## Limitations The following apply for the first version of the integration. @@ -59,7 +70,7 @@ The following apply for the first version of the integration. * The Hook currently does not support capturing lineage for custom spouts and bolts. ----++ Installation +## Installation The Storm Atlas Hook needs to be manually installed in Storm on the client side. * untar apache-atlas-${project.version}-storm-hook.tar.gz @@ -72,16 +83,16 @@ Replace STORM_HOME with storm installation path. Restart all daemons after you have installed the atlas hook into Storm. ----++ Configuration +## Configuration ----+++ Storm Configuration +### Storm Configuration The Storm Atlas Hook needs to be configured in Storm client config in *$STORM_HOME/conf/storm.yaml* as: - -storm.topology.submission.notifier.plugin.class: "org.apache.atlas.storm.hook.StormAtlasHook" - + +{`storm.topology.submission.notifier.plugin.class: "org.apache.atlas.storm.hook.StormAtlasHook"`} + Also set a 'cluster name' that would be used as a namespace for objects registered in Atlas. This name would be used for namespacing the Storm topology, spouts and bolts. @@ -94,23 +105,23 @@ the client and the cluster name is defined there. This happens similarly for HBa data sets. In case this configuration is not available, the cluster name set in the Storm configuration will be used. - + atlas.cluster.name: "cluster_name" - + In *$STORM_HOME/conf/storm_env.ini*, set an environment variable as follows: - + STORM_JAR_JVM_OPTS:"-Datlas.conf=$ATLAS_HOME/conf/" - + where ATLAS_HOME is pointing to where ATLAS is installed. You could also set this up programatically in Storm Config as: - - Config stormConf = new Config(); - ... - stormConf.put(Config.STORM_TOPOLOGY_SUBMISSION_NOTIFIER_PLUGIN, - org.apache.atlas.storm.hook.StormAtlasHook.class.getName()); - + + {`Config stormConf = new Config(); + ... + stormConf.put(Config.STORM_TOPOLOGY_SUBMISSION_NOTIFIER_PLUGIN, + org.apache.atlas.storm.hook.StormAtlasHook.class.getName());`} + diff --git a/docs/src/site/twiki/Export-API.twiki b/docs/src/documents/Import-Export/Export-API.md similarity index 77% rename from docs/src/site/twiki/Export-API.twiki rename to docs/src/documents/Import-Export/Export-API.md index cbae2de09..cb56244ac 100644 --- a/docs/src/site/twiki/Export-API.twiki +++ b/docs/src/documents/Import-Export/Export-API.md @@ -1,12 +1,24 @@ ----+ Export API +--- +name: Export API +route: /Export-API +menu: Documentation +submenu: Import/Export +--- + +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + +# Export API The general approach is: * Consumer specifies the scope of data to be exported (details below). * The API if successful, will return the stream in the format specified. * Error will be returned on failure of the call. -See [[Export-HDFS-API][here]] for details on exporting *hdfs_path* entities. +See [here](http://atlas.apache.org/Export-HDFS-API.html) for details on exporting *hdfs_path* entities. -|*Title*|*Export API*| +|**Title**|**Export API**| +| ------------ | ------------ | | _Example_ | See Examples sections below. | | _URL_ |_api/atlas/admin/export_ | | _Method_ |_POST_ | @@ -17,13 +29,14 @@ See [[Export-HDFS-API][here]] for details on exporting *hdfs_path* entities. | _Notes_ | Consumer could choose to consume the output of the API by programmatically using _java.io.ByteOutputStream_ or by manually, save the contents of the stream to a file on the disk.| __Method Signature__ - -@POST -@Path("/export") -@Consumes("application/json;charset=UTF-8") - ----+++ Additional Options + +{`@POST +@Path("/export") +@Consumes("application/json;charset=UTF-8")`} + + +### Additional Options It is possible to specify additional parameters for the _Export_ operation. Current implementation has 2 options. Both are optional: @@ -36,17 +49,17 @@ Current implementation has 2 options. Both are optional: * _fetchType_ This option configures the approach used for fetching entities. It has following values: * _FULL_: This fetches all the entities that are connected directly and indirectly to the starting entity. E.g. If a starting entity specified is a table, then this option will fetch the table, database and all the other tables within the database. * _CONNECTED_: This fetches all the etnties that are connected directly to the starting entity. E.g. If a starting entity specified is a table, then this option will fetch the table and the database entity only. - * _INCREMENTAL_: See [[Incremental-Export][here]] for details. + * _INCREMENTAL_: See [here](http://atlas.apache.org/Incremental-Export.html) for details. If no _matchType_ is specified, exact match is used. Which means, that the entire string is used in the search criteria. -Searching using _matchType_ applies for all types of entities. It is particularly useful for matching entities of type hdfs_path (see [[Export-HDFS-API][here]]). +Searching using _matchType_ applies for all types of entities. It is particularly useful for matching entities of type hdfs_path (see (here)[Export-HDFS-API]). The _fetchType_ option defaults to _FULL_. For complete example see section below. ----+++ Contents of Exported ZIP File +### Contents of Exported ZIP File The exported ZIP file has the following entries within it: * _atlas-export-result.json_: @@ -57,20 +70,22 @@ The exported ZIP file has the following entries within it: * _atlas-export-order.json_: Order in which entities should be exported. * _{guid}.json_: Individual entities are exported with file names that correspond to their id. ----+++ Examples +### Examples The _!AtlasExportRequest_ below shows filters that attempt to export 2 databases in cluster cl1: - -{ + + +{`{ "itemsToExport": [ { "typeName": "hive_db", "uniqueAttributes": { "qualifiedName": "accounts@cl1" } }, { "typeName": "hive_db", "uniqueAttributes": { "qualifiedName": "hr@cl1" } } ] -} - +}`} + The _!AtlasExportRequest_ below specifies the _fetchType_ as _FULL_. The _matchType_ option will fetch _accounts@cl1_. - -{ + + +{`{ "itemsToExport": [ { "typeName": "hive_db", "uniqueAttributes": { "qualifiedName": "accounts@" } }, ], @@ -78,12 +93,13 @@ The _!AtlasExportRequest_ below specifies the _fetchType_ as _FULL_. The _matchT "fetchType": "FULL", "matchType": "startsWith" } -} - +}`} + The _!AtlasExportRequest_ below specifies the _fetchType_ as _connected_. The _matchType_ option will fetch _accountsReceivable_, _accountsPayable_, etc present in the database. - -{ + + +{`{ "itemsToExport": [ { "typeName": "hive_db", "uniqueAttributes": { "name": "accounts" } }, ], @@ -91,15 +107,15 @@ The _!AtlasExportRequest_ below specifies the _fetchType_ as _connected_. The _m "fetchType": "CONNECTED", "matchType": "startsWith" } -} - +}`} + Below is the _!AtlasExportResult_ JSON for the export of the _Sales_ DB present in the _!QuickStart_. The _metrics_ contains the number of types and entities exported as part of the operation. - -{ + +{`{ "clientIpAddress": "10.0.2.15", "hostName": "10.0.2.2", "metrics": { @@ -128,26 +144,24 @@ The _metrics_ contains the number of types and entities exported as part of the } ], "options": { - "fetchType": "FULL" + "fetchType": "full" } }, "userName": "admin" -} - +}`} + ----+++ CURL Calls +### CURL Calls Below are sample CURL calls that demonstrate Export of _!QuickStart_ database. - -curl -X POST -u adminuser:password -H "Content-Type: application/json" -H "Cache-Control: no-cache" -d '{ + +{`curl -X POST -u adminuser:password -H "Content-Type: application/json" -H "Cache-Control: no-cache" -d '{ "itemsToExport": [ - { "typeName": "DB", "uniqueAttributes": { "name": "Sales" } }, - { "typeName": "DB", "uniqueAttributes": { "name": "Reporting" } }, - { "typeName": "DB", "uniqueAttributes": { "name": "Logging" } } + { "typeName": "DB", "uniqueAttributes": { "name": "Sales" } + { "typeName": "DB", "uniqueAttributes": { "name": "Reporting" } + { "typeName": "DB", "uniqueAttributes": { "name": "Logging" } + } ], - "options": { - "fetchType": "FULL" - } -}' "http://localhost:21000/api/atlas/admin/export" > quickStartDB.zip - - + "options": { "full" } + }' "http://localhost:21000/api/atlas/admin/export" > quickStartDB.zip`} + diff --git a/docs/src/documents/Import-Export/Export-HDFS-API.md b/docs/src/documents/Import-Export/Export-HDFS-API.md new file mode 100644 index 000000000..aabdefd60 --- /dev/null +++ b/docs/src/documents/Import-Export/Export-HDFS-API.md @@ -0,0 +1,52 @@ +--- +name: Export HDFS API +route: /Export-HDFS-API +menu: Documentation +submenu: Import/Export +--- + +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + +# Export & Import APIs for HDFS Path + +### Introduction + +The general approach for using the Import-Export APIs for HDFS Paths remain the same. There are minor variations caused how HDFS paths are handled within Atlas. + +Unlike HIVE entities, HDFS entities within Atlas are created manually using the _Create Entity_ link within the Atlas Web UI. + +Also, HDFS paths tend to be hierarchical, in the sense that users tend to model the same HDFS storage structure within Atlas. + +__Sample HDFS Setup__ + +|**HDFS Path**|**Atlas Entity**| +| ------------ | ------------ | +|/apps/warehouse/finance|**Entity type: **hdfs_path
**Name: **Finance
**QualifiedName: **FinanceAll| +|/apps/warehouse/finance/accounts-receivable|**Entity type: **hdfs_path
**Name: **FinanceReceivable
**QualifiedName: **FinanceReceivable
**Path: **/apps/warehouse/finance| +|/apps/warehouse/finance/accounts-payable|**Entity type: **hdfs_path
**Name: **Finance-Payable
**QualifiedName: **FinancePayable
**Path: **/apps/warehouse/finance/accounts-payable| +|/apps/warehouse/finance/billing|**Entity type: **hdfs_path
**Name: **FinanceBilling
**QualifiedName: **FinanceBilling
**Path: **/apps/warehouse/finance/billing| + + +### Export API Using matchType +To export entities that represent HDFS path, use the Export API using the _matchType_ option. Details can be found [here](Export-API). + +### Example Using CURL Calls +Below are sample CURL calls that performs export operation on the _Sample HDFS Setup_ shown above. + + +{`curl -X POST -u adminuser:password -H "Content-Type: application/json" -H "Cache-Control: no-cache" -d '{ + "itemsToExport": [ + { "typeName": "hdfs_path", "uniqueAttributes": { "name": "FinanceAll" } + } + ], + "options": { + "fetchType": "full", + "matchType": "startsWith" + } +}' "http://localhost:21000/api/atlas/admin/export" > financeAll.zip`} + + +### Automatic Creation of HDFS entities +Given that HDFS entity creation is a manual process. The Export API offers a mechanism for creation of requested HDFS entities. diff --git a/docs/src/site/markdown/ExportImportAudits.md b/docs/src/documents/Import-Export/ExportImportAudits.md similarity index 76% rename from docs/src/site/markdown/ExportImportAudits.md rename to docs/src/documents/Import-Export/ExportImportAudits.md index a7c142d20..e5077daa6 100644 --- a/docs/src/site/markdown/ExportImportAudits.md +++ b/docs/src/documents/Import-Export/ExportImportAudits.md @@ -1,20 +1,14 @@ - +--- +name: Export Import Audits +route: /ExportImportAudits +menu: Documentation +submenu: Import/Export +--- + +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + # Export & Import Audits #### Background @@ -23,7 +17,7 @@ The new audits for Export and Import operations also have corresponding REST API #### REST APIs -|Title | Replication Audits for a Cluster | +|**Title** | **Replication Audits for a Cluster** | |----------------|------------------------------------------------------------------| |Example | See below. | |URL | api/atlas/admin/expimp/audit | @@ -44,8 +38,8 @@ The new audits for Export and Import operations also have corresponding REST API ###### CURL curl -X GET -u admin:admin -H "Content-Type: application/json" -H "Cache-Control: no-cache" 'http://localhost:21000/api/atlas/admin/expimp/audit?sourceClusterName=cl2' -```json -{ + +{`{ "queryType": "BASIC", "searchParameters": { "typeName": "ReplicationAuditEntry", @@ -89,5 +83,5 @@ curl -X GET -u admin:admin -H "Content-Type: application/json" -H "Cache-Control "displayText": "cl2", "classificationNames": [] }] -} -``` +}`} + diff --git a/docs/src/site/twiki/Import-API-Options.twiki b/docs/src/documents/Import-Export/Import-API-Options.md similarity index 72% rename from docs/src/site/twiki/Import-API-Options.twiki rename to docs/src/documents/Import-Export/Import-API-Options.md index 7f9047523..728efaef5 100644 --- a/docs/src/site/twiki/Import-API-Options.twiki +++ b/docs/src/documents/Import-Export/Import-API-Options.md @@ -1,26 +1,38 @@ ----+ Import API Options +--- +name: Import API Options +route: /Import-API-Options +menu: Documentation +submenu: Import/Export +--- + +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + +# Import API Options Import API options are specified as _options_ JSON. Since the API accepts multi-part form data, it is possible to sepecify multipls input streams within the CURL call. ----+++ Examples Using CURL Calls - -curl -g -X POST -u adminuser:password -H "Content-Type: multipart/form-data" +### Examples Using CURL Calls + +{`curl -g -X POST -u adminuser:password -H "Content-Type: multipart/form-data" -H "Cache-Control: no-cache" -F request=@importOptions.json -F data=@quickStartDB.zip - "http://localhost:21000/api/atlas/admin/import" - + "http://localhost:21000/api/atlas/admin/import"`} + To use the defaults, set the contents of _importOptions.json_ to: - -{ + + +{`{ "options": { } -} - +}`} + ----+++ Options +### Options Following options are supported for Import process: * Specify transforms during import operation. @@ -28,7 +40,7 @@ Following options are supported for Import process: * Optionally import type definition. * Handling large imports. ----++++ Transforms +#### Transforms During the import process, the attribute value of the incoming entity can be changed. @@ -43,50 +55,51 @@ Example: The example below applies couple of transforms to the the _qualifiedName_ attribute of hive_table. It converts the value to lower case, then searches for 'cl1', if found, replaces it with 'cl2'. To use the option, set the contents of _importOptions.json_ to: - -{ + + +{`{ "options": { - "transforms": "{ \"hive_table\": { \"qualifiedName\": [ \"replace:@cl1:@cl2\" ] }, \"hive_db\": { \"qualifiedName\": [ \"replace:@cl1:@cl2\" ] } }" + "transforms": {"hive_table": { "qualifiedName": [ replace:@cl1:@cl2 ] }, "hive_db": { "qualifiedName": [ replace:@cl1:@cl2 ] } } } -} - +}`} + -Please refer to [[https://issues.apache.org/jira/browse/ATLAS-1825][ATLAS-1825]] for details scenarios when this option could be used. +Please refer to [ATLAS-1825](https://issues.apache.org/jira/browse/ATLAS-1825) for details scenarios when this option could be used. ----++++ Start Guid or Start Index +#### Start Guid or Start Index When an import operation is in progress and the server goes down, it would be possible to resume import from the last successfully imported entity. This would allow the import to resume from where it left off. Server-side logging is improved to display the detail of the last successfully imported entity, this includes the index within the import list and the entity's guid. Either can be used specify the point to resume import. To use the option, set the contents of _importOptions.json_ to: - -{ + +{`{ "options": { "startGuid": "bd97c78e-3fa5-4f9c-9f48-3683ca3d1fb1" } -} - +}`} + To use _startPosition_, use the following in the _importOptions.json_: - -{ + +{`{ "options": { "startPosition": "332" } -} - +}`} + Steps to use the behavior: - * Start an import (using the CURL) that is fairly long, say about 1000+ entities. + * Start an import (using the CURL) that is fairly long, say about 1000# entities. * While the import is in progress, stop atlas server (using atlas_stop.py). * From the log file located at _/var/log/atlas/application.log_ get the last successfully imported entity GUID or index position. * Update the _importOptions.json_ with the guid. * Restart import. ----++++ Optional Importing Type Definition +#### Optional Importing Type Definition The output of Export has _atlas-typedef.json_ that contains the type definitions for the entities exported. @@ -98,44 +111,45 @@ This option allows for optionally importing of type definition. The option is se Table below enumerates the conditions that get addressed as part of type definition import: -|*Condition*|*Action*| +|**Condition**|**Action**| | Incoming type does not exist in target system | Type is created. | |Type to be imported and type in target system are same | No change | |Type to be imported and type in target system differ by some attributes| Target system type is updated to the attributes present in the source. It is possible that the target system will have attributes in addition to the one present in the source. In that case, the target system's type attributes will be an union of the attributes. Attributes in target system will not be deleted to match the source. If the type of the attribute differ, import process will be aborted and exception logged.| To use the option, set the contents of _importOptions.json_ to: - -{ + +{`{ "options": { "updateTypeDefinition": true } -} - +}`} + ----++++ Specifying File to be Imported From Server Location +#### Specifying File to be Imported From Server Location In scenario where the file to be imported is present at a location on the server, the _importfile_ API can be used. It behaves like the Import API. To use the option, set the contents of _importOptions.json_ to: - -{ + +{`{ "options": { "fileName": "/root/fileToBeImported.zip" } -} - +}`} + _CURL_ - -curl -g -X POST -u adminuser:password -H "Content-Type: application/json" + + +{`curl -g -X POST -u adminuser:password -H "Content-Type: application/json" -H "Cache-Control: no-cache" -d r@importOptions.json - "http://localhost:21000/api/atlas/admin/importfile" - + "http://localhost:21000/api/atlas/admin/importfile"`} + ----++++ Handling Large Imports +#### Handling Large Imports By default, the Import Service stores all of the data in memory. This may be limiting for ZIPs containing large amount of data. diff --git a/docs/src/site/twiki/Import-API.twiki b/docs/src/documents/Import-Export/Import-API.md similarity index 62% rename from docs/src/site/twiki/Import-API.twiki rename to docs/src/documents/Import-Export/Import-API.md index 6deda2722..a16c3b4bb 100644 --- a/docs/src/site/twiki/Import-API.twiki +++ b/docs/src/documents/Import-Export/Import-API.md @@ -1,13 +1,26 @@ ----+ Import API +--- +name: Import API +route: /Import-API +menu: Documentation +submenu: Import/Export +--- + +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + +# Import API The general approach is: * Consumer makes a ZIP file available for import operation. See details below for the 2 flavors of the API. * The API if successful, will return the results of the operation. * Error will be returned on failure of the call. ----+++ Import ZIP File Using POST +### Import ZIP File Using POST -|*Title*|*Import API*| + +| **Title** | **Import API** | +| ------------ | ------------ | | _Example_ | See Examples sections below. | | _Description_|Provide the contents of the file to be imported in the request body.| | _URL_ |_api/atlas/admin/import_ | @@ -17,9 +30,10 @@ The general approach is: | _Success Response_ | _!AtlasImporResult_ is returned as JSON. See details below.| |_Error Response_|Errors that are handled within the system will be returned as _!AtlasBaseException_. | ----+++ Import ZIP File Available on Server +### Import ZIP File Available on Server -|*Title*|*Import API*| +|**Title**|**Import API**| +| ------------ | ------------ | | _Example_ | See Examples sections below. | | _Description_|Provide the path of the file to be imported.| | _URL_ |_api/atlas/admin/importfile_ | @@ -31,64 +45,69 @@ The general approach is: |_Notes_| The file to be imported needs to be present on the server at the location specified by the _FILENAME_ parameter.| __Method Signature for Import__ - -@POST + + +{`@POST @Path("/import") @Produces("application/json; charset=UTF-8") -@Consumes("multipart/form-data") - +@Consumes("multipart/form-data")`} + __Method Signature for Import File__ - -@POST + + +{`@POST @Path("/importfile") @Produces("application/json; charset=UTF-8") -@Consumes("application/json") - +@Consumes("application/json")`} + __Import Options__ -Please see __[[Import-API-Options][here]]__ for the available options during import process. +Please see [here](Import-API-Options) for the available options during import process. -__!AtlasImportResult Response__ -The API will return the results of the import operation in the format defined by the _!AtlasImportResult_: - * _!AtlasImportParameters_: This contains a collection of name value pair of the options that are applied during the import operation. +__AtlasImportResult Response__ +The API will return the results of the import operation in the format defined by the _AtlasImportResult_: + * _AtlasImportParameters_: This contains a collection of name value pair of the options that are applied during the import operation. * _Metrics_: Operation metrics. These include details on the number of types imported, number of entities imported, etc. * _Processed Entities_: Contains list of GUIDs for the entities that were processed. * _Operation Status_: Overall status of the operation. Values are _SUCCESS_, PARTIAL_SUCCESS, _FAIL_. ----+++ Examples Using CURL Calls +### Examples Using CURL Calls The call below performs Import of _!QuickStart_ database using POST. - -curl -g -X POST -u adminuser:password -H "Content-Type: multipart/form-data" + + +{`curl -g -X POST -u adminuser:password -H "Content-Type: multipart/form-data" -H "Cache-Control: no-cache" -F request=@importOptions.json -F data=@quickStartDB.zip - "http://localhost:21000/api/atlas/admin/import" - + "http://localhost:21000/api/atlas/admin/import"`} + The _request_ parameter is optional. If import has to be run without any options use: - -curl -g -X POST -u adminuser:password -H "Content-Type: multipart/form-data" + + +{`curl -g -X POST -u adminuser:password -H "Content-Type: multipart/form-data" -H "Cache-Control: no-cache" -F data=@quickStartDB.zip - "http://localhost:21000/api/atlas/admin/import" - + "http://localhost:21000/api/atlas/admin/import"`} + -The call below performs Import of _!QuickStart_ database using a ZIP file available on server. - -curl -X POST -u adminuser:password -H "Cache-Control: no-cache" -d ./importOptions.json -"http://localhost:21000/api/atlas/admin/importFile" > quickStartDB-import-result.json - +The call below performs Import of _QuickStart_ database using a ZIP file available on server. -Below is the _!AtlasImportResult_ JSON for an import that contains _hive_db_. + +{`curl -X POST -u adminuser:password -H "Cache-Control: no-cache" -d ./importOptions.json +"http://localhost:21000/api/atlas/admin/importFile" > quickStartDB-import-result.json`} + + +Below is the _AtlasImportResult_ JSON for an import that contains _hive_db_. The _processedEntities_ contains the _guids_ of all the entities imported. The _metrics_ contain a breakdown of the types and entities imported along with the operation performed on them viz. _created_ or _updated_. - -{ + +{`{ "request": { "options": {} }, @@ -112,12 +131,11 @@ The _metrics_ contain a breakdown of the types and entities imported along with "processedEntities": [ "2c4aa713-030b-4fb3-98b1-1cab23d9ac81", "e4aa71ed-70fd-4fa7-9dfb-8250a573e293", - ... - "ea0f9bdb-1dfc-4e48-9848-a006129929f9", "b5e2cb41-3e7d-4468-84e1-d87c320e75f9" ], "operationStatus": "SUCCESS" -} - +}`} + + diff --git a/docs/src/documents/Import-Export/Import-Export-API.md b/docs/src/documents/Import-Export/Import-Export-API.md new file mode 100644 index 000000000..c5311d790 --- /dev/null +++ b/docs/src/documents/Import-Export/Import-Export-API.md @@ -0,0 +1,56 @@ +--- +name: Import Export API +route: /Import-Export-API +menu: Documentation +submenu: Import/Export +--- + +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + +# Export & Import REST APIs + +### What's New +The release of 0.8.3 includes the following improvements to Export and Import APIs: + * Export: Support for [Incremental Export](Incremental-Export). + * Export & Import: Support for [replicated attributes](ReplicatedToFromAttributes) to entities made possible by [SoftReference](SoftReference) entity attribute option. + * Export option: [skipLineage](skipLineage). + * New entity transforms framework. + * New [AtlasServer](AtlasServer) entity type. + * Export: [Automatic creation of HDFS path](Export-HDFS-API) requested entities. + * New [ExportImportAudits](ExportImportAudits) for Export & Import operations. + +### Background +The Import-Export APIs for Atlas facilitate transfer of data to and from a cluster that has Atlas provisioned. + +The APIs when integrated with backup and/or disaster recovery process will ensure participation of Atlas. + +### Introduction +There are 2 broad categories viz. Export & Import. The details of the APIs are discussed below. + +The APIs are available only to _admin_ user. + +Only a single import or export operation can be performed at a given time. The operations have a potential for generating large amount. They can also put pressure on resources. This restriction tries to alleviate this problem. + +For Import-Export APIs relating to HDFS path, can be found [here](Import-Export-HDFS-Path). + +For additional information please refer to the following: + * [ATLAS-1503](https://issues.apache.org/jira/browse/ATLAS-1503) Original Import-Export API requirements. + * [ATLAS-1618](https://issues.apache.org/jira/browse/ATLAS-1618) Export API Scope Specification. + +### Errors +If an import or export operation is initiated while another is in progress, the consumer will receive this error: + + +{`"ATLAS5005E": "Another import or export is in progress. Please try again."`} + + +Unhandled errors will be returned as Internal error code 500. + +### REST API Reference + * [Export](Export-API) + * [Export HDFS](Export-HDFS-API) + * [Import](Import-API) + * [Import Options](Import-API-Options) + diff --git a/docs/src/site/markdown/ImportEntityTransforms.md b/docs/src/documents/Import-Export/ImportEntityTransforms.md similarity index 80% rename from docs/src/site/markdown/ImportEntityTransforms.md rename to docs/src/documents/Import-Export/ImportEntityTransforms.md index 142a13100..a477a4b30 100644 --- a/docs/src/site/markdown/ImportEntityTransforms.md +++ b/docs/src/documents/Import-Export/ImportEntityTransforms.md @@ -1,3 +1,14 @@ +--- +name: Import Entity Transforms +route: /ImportEntityTransforms +menu: Documentation +submenu: Import/Export +--- + +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + # (New) Entity Transforms Framework #### Background @@ -30,7 +41,7 @@ The approach used by the new transformation framework creates a transformation b Following are built-in conditions. -Condition Types | Description | +|**Condition Types** | **Description** | -----------------------------------------|-----------------| ENTITY_ALL | Any/every entity | ENTITY_TOP_LEVEL | Entity that is the top-level entity. This is also the entity present specified in _AtlasExportRequest_.| @@ -43,7 +54,7 @@ HAS_VALUE | Entity attribute has value. | ##### Actions -Action Type | Description | +|**Action Type** | *Description** | -------------------|----------------------------------------------| ADD_CLASSIFICATION | Add classifiction | REPLACE_PREFIX | Replace value starting with another value. | @@ -56,87 +67,91 @@ CLEAR | Clear value of an attribute | ###### Add Classification During import, hive_db entity whose _qualifiedName_ is _stocks@cl1_ will get the classification _clSrcImported_. -```json -{ + + +{`{ "conditions": { "hive_db.qualifiedName": "stocks@cl1" }, "action": { "__entity": "ADD_CLASSIFICATION: clSrcImported" } -} -``` +}`} + Every imported entity will get the classification by simply changing the condition. The __entity is special condition which matches entity. -```json -{ + + +{`{ "conditions": { "__entity": "" }, "action": { "__entity": "ADD_CLASSIFICATION: clSrcImported" } -} -``` +}`} + To add classification to only the top-level entity (entity that is used as starting point for an export), use: -```json -{ + +{`{ "conditions": { "__entity": "topLevel:" }, "action": { "__entity": "ADD_CLASSIFICATION: clSrcImported" } -} -``` +}`} + + ###### Replace Prefix This action works on string values. The first parameter is the prefix that is searched for a match, once matched, it is replaced with the provided replacement string. The sample below searches for _/aa/bb/_, once found replaces it with _/xx/yy/_. -```json -{ + + +{`{ "conditions": { "hdfs_path.clusterName": "EQUALS: CL1" }, "action": { "hdfs_path.path": "REPLACE_PREFIX: = :/aa/bb/=/xx/yy/" } -} -``` +}`} + ###### To Lower Entity whose hdfs_path.clusterName is CL1 will get its path attribute converted to lower case. -```json -{ + +{`{ "conditions": { "hdfs_path.clusterName": "EQUALS: CL1" }, "action": { "hdfs_path.path": "TO_LOWER:" } -} -``` +}`} + ###### Clear Entity whose hdfs_path.clusterName has value set, will get its _replicatedTo_ attribute value cleared. -```json -{ + +{`{ "conditions": { "hdfs_path.clusterName": "HAS_VALUE:" }, "action": { "hdfs_path.replicatedTo": "CLEAR:" } -} -``` +}`} + #### Additional Examples diff --git a/docs/src/site/markdown/Incremental-Export.md b/docs/src/documents/Import-Export/Incremental-Export.md similarity index 77% rename from docs/src/site/markdown/Incremental-Export.md rename to docs/src/documents/Import-Export/Incremental-Export.md index bddde8d48..928394723 100644 --- a/docs/src/site/markdown/Incremental-Export.md +++ b/docs/src/documents/Import-Export/Incremental-Export.md @@ -1,3 +1,14 @@ +--- +name: Incremental Export +route: /Incremental-Export +menu: Documentation +submenu: Import/Export +--- + +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + ## Incremental Export #### Background @@ -6,8 +17,8 @@ Incremental export allows for export of entities after a specified timestamp. Th #### Export Options New _fetchType_ added to indicate incremental export. This option can be used with any _matchType_. When _fetchType_ is _incremental_, it is necessary to specify the _changeMarker_ option for incremental export to function, else full export will be performed. -```json -{ + +{`{ "itemsToExport": [ { "typeName": "hive_db", "uniqueAttributes": { "qualifiedName": "stocks@cl1" } } ], @@ -15,8 +26,8 @@ New _fetchType_ added to indicate incremental export. This option can be used wi "fetchType": "incremental", "changeMarker": 10000 } -} -``` +}`} + #### Getting Change Marker diff --git a/docs/src/site/twiki/index.twiki b/docs/src/documents/Introduction.md old mode 100755 new mode 100644 similarity index 57% rename from docs/src/site/twiki/index.twiki rename to docs/src/documents/Introduction.md index 608c9b680..ecc781ced --- a/docs/src/site/twiki/index.twiki +++ b/docs/src/documents/Introduction.md @@ -1,7 +1,14 @@ ----+ Data Governance and Metadata framework for Hadoop +--- +name: Introduction +route: / +menu: Introduction +--- +# Introduction ----++ Overview +Atlas is Data Governance and Metadata framework for Hadoop + +## Overview Atlas is a scalable and extensible set of core foundational governance services – enabling enterprises to effectively and efficiently meet their compliance requirements within Hadoop and @@ -11,79 +18,49 @@ Apache Atlas provides open metadata management and governance capabilities for o to build a catalog of their data assets, classify and govern these assets and provide collaboration capabilities around these data assets for data scientists, analysts and the data governance team. ----++ Features ----+++ Metadata types & instances +## Features + +### Metadata types & instances * Pre-defined types for various Hadoop and non-Hadoop metadata * Ability to define new types for the metadata to be managed * Types can have primitive attributes, complex attributes, object references; can inherit from other types * Instances of types, called entities, capture metadata object details and their relationships * REST APIs to work with types and instances allow easier integration ----+++ Classification +### Classification * Ability to dynamically create classifications - like PII, EXPIRES_ON, DATA_QUALITY, SENSITIVE * Classifications can include attributes - like expiry_date attribute in EXPIRES_ON classification * Entities can be associated with multiple classifications, enabling easier discovery and security enforcement * Propagation of classifications via lineage - automatically ensures that classifications follow the data as it goes through various processing ----+++ Lineage +### Lineage * Intuitive UI to view lineage of data as it moves through various processes * REST APIs to access and update lineage ----+++ Search/Discovery +### Search/Discovery * Intuitive UI to search entities by type, classification, attribute value or free-text * Rich REST APIs to search by complex criteria * SQL like query language to search entities - Domain Specific Language (DSL) ----+++ Security & Data Masking +### Security & Data Masking * Fine grained security for metadata access, enabling controls on access to entity instances and operations like add/update/remove classifications * Integration with Apache Ranger enables authorization/data-masking on data access based on classifications associated with entities in Apache Atlas. For example: * who can access data classified as PII, SENSITIVE * customer-service users can only see last 4 digits of columns classified as NATIONAL_ID ----++ Getting Started +## Getting Started - * [[WhatsNew-2.0][What's new in Apache Atlas 2.0?]] - * [[InstallationSteps][Build & Install]] - * [[QuickStart][Quick Start]] + * [What's new in Apache Atlas 2.0?](WhatsNew-2.0) + * [Build & Install](InstallationSteps) + * [Quick Start](QuickStart) - ----++ Documentation - - * [[Architecture][High Level Architecture]] - * [[TypeSystem][Type System]] - * [[Search - Basic][Search: Basic]] - * [[Search - Advanced][Search: Advanced]] - * [[Glossary][Glossary]] - * [[security][Security]] - * [[Atlas-Authentication][Authentication]] - * [[Atlas-Authorization-Model][Atlas Authorization Model]] - * [[Atlas-Authorization-Simple-Authorizer][Steps to configure Atlas Simple Authorizer]] - * [[Atlas-Authorization-Ranger-Authorizer][Steps to configure Atlas Ranger Authorizer]] - * [[ClassificationPropagation][Classification Propagation]] - * [[Configuration][Configuration]] - * [[Notifications][Notifications]] - * Hooks & Bridges - * [[Hook-HBase][HBase Hook & Bridge]] - * [[Hook-Hive][Hive Hook & Bridge]] - * [[Hook-Sqoop][Sqoop Hook]] - * [[Hook-Storm][Storm Hook]] - * [[Bridge-Kafka][Kafka Bridge]] - * [[HighAvailability][Fault Tolerance And High Availability Options]] - * [[Migration-0.8-to-1.0][Migration from Apache Atlas 0.8]] - * [[AtlasRepairIndex][Index repair tool]] - ----++ API Documentation +## API Documentation * REST API Documentation - * [[Import-Export-API][Export & Import REST API Documentation]] + * [Export & Import REST API Documentation](Import-Export-API) * Legacy API Documentation ----++ Developer Setup Documentation - * [[EclipseSetup][Developer Setup: Eclipse]] - -#LicenseInfo ----+ Licensing Information - -Atlas is distributed under [[http://www.apache.org/licenses/][Apache License 2.0]]. +## Developer Setup Documentation + * [Developer Setup: Eclipse](EclipseSetup) diff --git a/docs/src/site/twiki/Migration-0.8-to-1.0.twiki b/docs/src/documents/Migration/Migration-0.8-to-1.0.md similarity index 67% rename from docs/src/site/twiki/Migration-0.8-to-1.0.twiki rename to docs/src/documents/Migration/Migration-0.8-to-1.0.md index c145af71d..148a3b0f2 100644 --- a/docs/src/site/twiki/Migration-0.8-to-1.0.twiki +++ b/docs/src/documents/Migration/Migration-0.8-to-1.0.md @@ -1,4 +1,15 @@ ----+ Migrating data from Apache Atlas 0.8 to Apache Atlas 1.0 +--- +name: Migration-0.8 to 1.0 +route: /Migration-0.8-to-1.0 +menu: Downloads +submenu: Migration +--- + +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + +# Migrating data from Apache Atlas 0.8 to Apache Atlas 1.0 Apache Atlas 1.0 uses !JanusGraph graph database to store its type and entity details. Prior versions of Apache Atlas use Titan 0.5.4 graph database. The two databases use different formats for storage. For deployments upgrading from @@ -8,14 +19,14 @@ In addition to the change to the graph database, Apache Atlas 1.0 introduces few representation compared to previous versions. Migration steps detailed below will transform data to be compliant with the new internal representation. ----+++ Migration Steps +### Migration Steps Migration of data is done in following steps: * Planning the migration. * Export Apache Atlas 0.8 data to a directory on the file system. * Import data from exported files into Apache Atlas 1.0. ----++++ Planning the migration +##### Planning the migration The duration of migration of data from Apache Atlas 0.8 to Apache Atlas 1.0 can be significant, depending upon the amount of data present in Apache Atlas. This section helps you to estimate the time to migrate, so that you can plan the @@ -23,17 +34,17 @@ upgrade process better. To estimate the time needed to export data, first you need to find the number of entities in Apache Atlas 0.8. This can be done by running the following DSL query: - -Referenceable select count() - + + +{`Referenceable select count()`} + Assuming Apache Atlas is deployed in a quad-core CPU with 4 GB of RAM allocated: * Export from Apache Atlas 0.8 will process approximately 2 million entities per hour. * Import into Apache Atlas 1.0 will process approximately 0.7 million entities per hour. ----++++ Exporting data from Apache Atlas 0.8 -_Atlas Migration Export Utility_ from Apache Atlas branch-0.8 should be used to export the data from Apache Atlas 0.8 -deployments. The implementation of which can be found [[https://github.com/apache/atlas/tree/branch-0.8/tools/atlas-migration-exporter][here]]. +#### Exporting data from Apache Atlas 0.8 +_Atlas Migration Export Utility_ from Apache Atlas branch-0.8 should be used to export the data from Apache Atlas 0.8 deployments. The implementation of which can be found [here](https://github.com/apache/atlas/tree/branch-0.8/tools/atlas-migration-exporter). To build this utility: * Navigate to root directory of Apache Atlas branch-0.8 local repo (say, _/home/atlas/_) @@ -45,44 +56,52 @@ Move the _Atlas Migration Utility_ directory to the Apache Atlas 0.8 cluster. Follow these steps to export the data: * Shutdown _Apache Atlas 0.8_, so that the database is not updated while the migration is in progress. * Execute the following command to export Apache Atlas data in Titan graph database to the specified directory: - - atlas_migration_export.py -d + + + {`atlas_migration_export.py -d `} + Example: - + + /home/atlas-migration-utility/atlas_migration_export.py -d /home/atlas-0.8-data - + On successful execution, _Atlas Migration Utility_ tool will display messages like these: - -atlas-migration-export: starting migration export. Log file location /var/log/atlas/atlas-migration-exporter.log + + +{`atlas-migration-export: starting migration export. Log file location /var/log/atlas/atlas-migration-exporter.log atlas-migration-export: initializing atlas-migration-export: initialized atlas-migration-export: exporting typesDef to file /home/atlas-0.8-data/atlas-migration-typesdef.json atlas-migration-export: exported typesDef to file /home/atlas-0.8-data/atlas-migration-typesdef.json atlas-migration-export: exporting data to file /home/atlas-0.8-data/atlas-migration-data.json atlas-migration-export: exported data to file /home/atlas-0.8-data/atlas-migration-data.json -atlas-migration-export: completed migration export! - +atlas-migration-export: completed migration export!`} + More details on the progress of export can be found in a log file named _atlas-migration-exporter.log_, in the log directory specified in _atlas-log4j.xml_. ----+++ Before importing into Apache Atlas 1.0 +### Before importing into Apache Atlas 1.0 * For Apache Atlas deployments that use Solr as index store, please ensure that existing Apache Atlas specific collections are deleted or renamed before installing Apache Atlas 1.0. Apache Atlas specific Solr collections can be deleted using CURL commands shown below: - -curl 'http:///solr/admin/collections?action=DELETE&name=vertex_index' + + +{`curl 'http:///solr/admin/collections?action=DELETE&name=vertex_index' curl 'http:///solr/admin/collections?action=DELETE&name=edge_index' -curl 'http:///solr/admin/collections?action=DELETE&name=fulltext_index' +curl 'http:///solr/admin/collections?action=DELETE&name=fulltext_index'`} + * Create Solr collections for Apache Atlas 1.0 Apache Atlas specific Solr collections can be created using CURL commands shown below: - -curl 'http:///solr/admin/collections?action=CREATE&name=vertex_index&numShards=1&replicationFactor=1&collection.configName=atlas_configs' + + +{`curl 'http:///solr/admin/collections?action=CREATE&name=vertex_index&numShards=1&replicationFactor=1&collection.configName=atlas_configs' curl 'http:///solr/admin/collections?action=CREATE&name=edge_index&numShards=1&replicationFactor=1&collection.configName=atlas_configs' -curl 'http:///solr/admin/collections?action=CREATE&name=fulltext_index&numShards=1&replicationFactor=1&collection.configName=atlas_configs' +curl 'http:///solr/admin/collections?action=CREATE&name=fulltext_index&numShards=1&replicationFactor=1&collection.configName=atlas_configs'`} + * For Apache Atlas deployments that use HBase as backend store, please note that HBase table used by earlier version can't be used by Apache Atlas 1.0. If you are constrained on disk storage space, the table used by earlier version can be removed after successful export of data. * Apache Atlas 0.8 uses HBase table named 'atlas_titan' (by default) @@ -93,27 +112,33 @@ curl 'http:///solr/admin/collections?action=CREATE&name=fulltext_ * Make sure the directory containing exported data is accessible to Apache Atlas 1.0 instance. ----++++ Importing Data into Apache Atlas 1.0 +#### Importing Data into Apache Atlas 1.0 Please follow the steps below to import the data exported above into Apache Atlas 1.0: * Specify the location of the directory containing exported data in following property to _atlas-application.properties_: - -atlas.migration.data.filename= + + +{`atlas.migration.data.filename=`} + * Start Apache Atlas 1.0. Apache Atlas will start in migration mode. It will start importing data from the specified directory. * Monitor the progress of import process with the following curl command: - -curl -X GET -u admin: -H "Content-Type: application/json" -H "Cache-Control: no-cache" http://:port/api/atlas/admin/status + + +{`curl -X GET -u admin: -H "Content-Type: application/json" -H "Cache-Control: no-cache" http://:port/api/atlas/admin/status`} + Progress of import will be indicated by a message like this: - -{"Status":"MIGRATING","MigrationStatus":{"operationStatus":"IN_PROGRESS","startTime":1526512275110,"endTime":1526512302750,"currentIndex":10,"currentCounter":101,"totalCount":0}} - + + +{`{"Status":"MIGRATING","MigrationStatus":{"operationStatus":"IN_PROGRESS","startTime":1526512275110,"endTime":1526512302750,"currentIndex":10,"currentCounter":101,"totalCount":0}}`} + Successful completion of the operation will show a message like this: - -{"Status":"MIGRATING","MigrationStatus":{"operationStatus":"SUCCESS","startTime":1526512275110,"endTime":1526512302750,"currentIndex":0,"currentCounter":0,"totalCount":371}} - + + +{`{"Status":"MIGRATING","MigrationStatus":{"operationStatus":"SUCCESS","startTime":1526512275110,"endTime":1526512302750,"currentIndex":0,"currentCounter":0,"totalCount":371}}`} + Once migration import is complete, i.e. _operationStatus_ is _SUCCESS_, follow the steps given below to restart Apache Atlas in _ACTIVE_ mode for regular use: @@ -121,13 +146,13 @@ in _ACTIVE_ mode for regular use: * Remove property _atlas.migration.data.filename_ from _atlas-application.properties_. * Start Apache Atlas 1.0. ----+++ Atlas Entity Defaults for Migrated Data +### Atlas Entity Defaults for Migrated Data Apache Atlas 1.0 introduces number of new features. For data that is migrated, the following defaults are set: * All classifications will have _isPropagate_ set to _false_. * Taxonomy terms present in Apache Atlas 0.8, if any, will be converted to classification. ----++++ Handling of Entity Definitions that use Classifications as Types +#### Handling of Entity Definitions that use Classifications as Types This features is no longer supported. Classifications that are used as types in _attribute definitions_ (_AttributeDefs_) are converted in to new types whose name has _legacy_ prefix. These are then handled like any other type. Creation of such types was prevented in an earlier release, hence only type definitions have potential to exist. Care has been taken to handle entities of this type as well. diff --git a/docs/src/site/markdown/AtlasServer.md b/docs/src/documents/Misc/AtlasServer.md similarity index 72% rename from docs/src/site/markdown/AtlasServer.md rename to docs/src/documents/Misc/AtlasServer.md index 63a3fbfe0..802ed0452 100644 --- a/docs/src/site/markdown/AtlasServer.md +++ b/docs/src/documents/Misc/AtlasServer.md @@ -1,27 +1,21 @@ - +--- +name: Atlas Server +route: /AtlasServer +menu: Documentation +submenu: Misc +--- +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; +import Img from 'theme/components/shared/Img' + # Atlas Server Entity Type #### Background The _AtlasServer_ entity type is special entity type in following ways: -* Gets created during Export or Import operation. +* Gets created during Export or Import operation. * It also has special property pages that display detailed audits for export and import operations. * Entities are linked to it using the new option within entity's attribute _[SoftReference](SoftReference)_. @@ -39,8 +33,7 @@ The property page for _AtlasServer_ entity has one additional tab 'Export/Import The _additionalInfo_ attribute property is discussed in detail below. - - + ###### Export/Import Audits @@ -53,26 +46,26 @@ The table has following columns: * _Operation EndTIme_: Time the operation completed. * _Tools_: Pop-up property page that contains details of the operation. - - + ###### Example The following export request will end up creating _AtlasServer_ entity with _clMain_ as its name. The audit record of this operation will be displayed within the property page of this entity. -```json -{ + + +{`{ "itemsToExport": [ { "typeName": "hive_db", "uniqueAttributes": { "qualifiedName": "stocks@cl1" }} ], "options": { "replicatedTo": "clMain" } -} -``` +}`} + #### Support for Cluster's Full Name -Often times it is necessary to disambiguate the name of the cluster by specifying the location or the data center within which the Atlas instance resides. +Often times it is necessary to disambiguate the name of the cluster by specifying the location or the data center within which the Atlas instance resides. The name of the cluster can be specified by separating the location name and cluster name by '$'. For example, a clsuter name specified as 'SFO$cl1' can be a cluster in San Fancisco (SFO) data center with the name 'cl1'. @@ -81,12 +74,12 @@ The _AtlasServer_ will handle this and set its name as 'cl1' and _fullName_ as ' #### Additional Information -This property in _AtlasServer_ is a map with key and value both as String. This can be used to store any information pertaining to this instance. +This property in _AtlasServer_ is a map with key and value both as String. This can be used to store any information pertaining to this instance. Please see [Incremental Export](IncrementalExport) for and example of how this property can be used. #### REST APIs -Title |Atlas Server API | +**Title** |**Atlas Server API** | ----------------|---------------------------------------| Example | see below. | URL | api/atlas/admin/server/{serverName} | @@ -98,13 +91,14 @@ Error Response | Errors Returned as AtlasBaseException | ###### CURL -``` -curl -X GET -u admin:admin -H "Content-Type: application/json" -H "Cache-Control: no-cache" http://localhost:21000/api/atlas/admin/server/cl2 -``` + +{`curl -X GET -u admin:admin -H "Content-Type: application/json" -H "Cache-Control:no-cache" http://localhost:21000/api/atlas/admin/server/cl2`} + -Output: -```json -{ +Output: + + +{`{ "guid": "f87e4fd1-bfb5-482d-9ab1-e735621b7d16", "name": "cl2", "qualifiedName": "cl2", @@ -113,7 +107,5 @@ Output: "replicationOperation": "EXPORT", "topLevelEntity": "stocks@cl1" } -} -``` - - +}`} + diff --git a/docs/src/site/markdown/ReplicatedToFromAttributes.md b/docs/src/documents/Misc/ReplicatedAttributes.md similarity index 77% rename from docs/src/site/markdown/ReplicatedToFromAttributes.md rename to docs/src/documents/Misc/ReplicatedAttributes.md index 0debf8100..5b3ba2a44 100644 --- a/docs/src/site/markdown/ReplicatedToFromAttributes.md +++ b/docs/src/documents/Misc/ReplicatedAttributes.md @@ -1,3 +1,9 @@ +--- +name: Replicated Attributes +route: /ReplicatedAttributes +menu: Documentation +submenu: Misc +--- # Replicated Attributes #### Background @@ -5,4 +11,3 @@ Users want knowledge of how the entities have landed into Atlas instance, if they were created via hook ingestion or whether they were imported from another Atlas instance. This is addressed by 2 new attributes that are now part of _Referenceable_ entity type viz. _replicatedFrom_ and _replicatedTo_. - diff --git a/docs/src/documents/Misc/SoftReference.md b/docs/src/documents/Misc/SoftReference.md new file mode 100644 index 000000000..0143c76f5 --- /dev/null +++ b/docs/src/documents/Misc/SoftReference.md @@ -0,0 +1,40 @@ +--- +name: Soft Reference +route: /SoftReference +menu: Documentation +submenu: Misc +--- + +import { dark } from 'react-syntax-highlighter/dist/esm/styles/prism'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + +# Entity Attribute Option: SoftReference + +#### Background + +Entity attributes are specified using attribute definitions. An attributes persistence strategy is determined by based on their type. + +Primitive types are persisted as properties within the vertex of their parent. + +Non-primitive attributes get a vertex of their own and and edge is created between the parent the child to establish ownership. + +Attribute with _isSoftReference_ option set to _true_, is non-primitive attribute that gets treatment of a primitive attribute. + +#### Specification + +Below is an example of using the new attribute option. + + + {`"attributeDefs": [ + { + "name": "replicatedFrom", + "typeName": "array", + "cardinality": "SET", + "isIndexable": false, + "isOptional": true, + "isUnique": false, + "options": { + "isSoftReference": "true" + } + }`} + diff --git a/docs/src/documents/Notifications.md b/docs/src/documents/Notifications.md new file mode 100644 index 000000000..34d5c1a4b --- /dev/null +++ b/docs/src/documents/Notifications.md @@ -0,0 +1,87 @@ +--- +name: Notifications +route: /Notifications +menu: Documentation +submenu: Features +--- + +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + +# Notifications + +## Notifications from Apache Atlas +Apache Atlas sends notifications about metadata changes to Kafka topic named ATLAS_ENTITIES . +Applications interested in metadata changes can monitor for these notifications. +For example, Apache Ranger processes these notifications to authorize data access based on classifications. + + +### Notifications - V2: Apache Atlas version 1.0 +Apache Atlas 1.0 sends notifications for following operations on metadata. + + + {`ENTITY_CREATE: sent when an entity instance is created + ENTITY_UPDATE: sent when an entity instance is updated + ENTITY_DELETE: sent when an entity instance is deleted + CLASSIFICATION_ADD: sent when classifications are added to an entity instance + CLASSIFICATION_UPDATE: sent when classifications of an entity instance are updated + CLASSIFICATION_DELETE: sent when classifications are removed from an entity instance`} + + +Notification includes the following data. + + +{`AtlasEntity entity; + OperationType operationType; + List classifications;`} + + +### Notifications - V1: Apache Atlas version 0.8.x and earlier +Notifications from Apache Atlas version 0.8.x and earlier have content formatted differently, as detailed below. + +__*Operations*__ + + + {`ENTITY_CREATE: sent when an entity instance is created + ENTITY_UPDATE: sent when an entity instance is updated + ENTITY_DELETE: sent when an entity instance is deleted + TRAIT_ADD: sent when classifications are added to an entity instance + TRAIT_UPDATE: sent when classifications of an entity instance are updated + TRAIT_DELETE: sent when classifications are removed from an entity instance`} + + +Notification includes the following data. + + +{`Referenceable entity; + OperationType operationType; + List traits;`} + + +Apache Atlas 1.0 can be configured to send notifications in older version format, instead of the latest version format. +This can be helpful in deployments that are not yet ready to process notifications in latest version format. +To configure Apache Atlas 1.0 to send notifications in earlier version format, please set following configuration in atlas-application.properties: + + + atlas.notification.entity.version=v1 + + +## Notifications to Apache Atlas +Apache Atlas can be notified of metadata changes and lineage via notifications to Kafka topic named ATLAS_HOOK. +Atlas hooks for Apache Hive/Apache HBase/Apache Storm/Apache Sqoop use this mechanism to notify Apache Atlas of events of interest. + + +{`ENTITY_CREATE : create an entity. For more details, refer to Java class HookNotificationV1.EntityCreateRequest +ENTITY_FULL_UPDATE : update an entity. For more details, refer to Java class HookNotificationV1.EntityUpdateRequest +ENTITY_PARTIAL_UPDATE : update specific attributes of an entity. For more details, refer to HookNotificationV1.EntityPartialUpdateRequest +ENTITY_DELETE : delete an entity. For more details, refer to Java class HookNotificationV1.EntityDeleteRequest +ENTITY_CREATE_V2 : create an entity. For more details, refer to Java class HookNotification.EntityCreateRequestV2 +ENTITY_FULL_UPDATE_V2 : update an entity. For more details, refer to Java class HookNotification.EntityUpdateRequestV2 +ENTITY_PARTIAL_UPDATE_V2 : update specific attributes of an entity. For more details, refer to HookNotification.EntityPartialUpdateRequestV2 +ENTITY_DELETE_V2 : delete one or more entities. For more details, refer to Java class HookNotification.EntityDeleteRequestV2`} + + + + + diff --git a/docs/src/documents/Project-Info/Mailing-Lists.md b/docs/src/documents/Project-Info/Mailing-Lists.md new file mode 100644 index 000000000..bfb9a6e71 --- /dev/null +++ b/docs/src/documents/Project-Info/Mailing-Lists.md @@ -0,0 +1,18 @@ +--- +name: Mailing Lists +route: /Mailing-Lists +menu: Project Info +submenu: Mailing Lists +--- + +# Project Mailing Lists + + +* These are the mailing lists that have been established for this project. For each list, there is a subscribe, unsubscribe, and an archive link. + + +| **Name** | **Subscribe** | **Unsubscribe** | **Post** | **Archive** | +| : ------------- : | : ------------- : | : ------------- : | : ------------- : |: ------------- :| +|atlas-dev|[Subscribe](mailto:dev-subscribe@atlas.incubator.apache.org) |[Unsubscribe](mailto:dev-unsubscribe@atlas.incubator.apache.org)|[Post](mailto:dev@atlas.incubator.apache.org)|[mail-archives.apache.org](http://mail-archives.apache.org/mod_mbox/atlas-dev/)| +|atlas-user |[Subscribe](mailto:user-subscribe@atlas.apache.org) |[Unsubscribe](mailto:user-unsubscribe@atlas.apache.org) |[Post](mailto:user@atlas.apache.org) |[mail-archives.apache.org](http://mail-archives.apache.org/mod_mbox/atlas-user/)| +|atlas-commits|[Subscribe](mailto:commits-subscribe@atlas.incubator.apache.org)|[Unsubscribe](mailto:commits-unsubscribe@atlas.incubator.apache.org)|[Post](mailto:commits@atlas.incubator.apache.org)|[mail-archives.apache.org](http://mail-archives.apache.org/mod_mbox/atlas-commits/)| diff --git a/docs/src/documents/Project-Info/issue-tracking.md b/docs/src/documents/Project-Info/issue-tracking.md new file mode 100644 index 000000000..0bc93389c --- /dev/null +++ b/docs/src/documents/Project-Info/issue-tracking.md @@ -0,0 +1,23 @@ +--- +name: Issue Tracking +route: /Issue-Tracking +menu: Project Info +submenu: Issue Tracking +--- + +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + +# Overview + + +* This project uses [JIRA](http://www.atlassian.com/software/jira) a J2EE-based, issue tracking and project management application. + + +# Issue Tracking +* Issues, bugs, and feature requests should be submitted to the following issue tracking system for this project. + + + {`https://issues.apache.org/jira/browse/ATLAS`} + diff --git a/docs/src/documents/Project-Info/project-info.md b/docs/src/documents/Project-Info/project-info.md new file mode 100644 index 000000000..e59571ebf --- /dev/null +++ b/docs/src/documents/Project-Info/project-info.md @@ -0,0 +1,22 @@ +--- +name: Project Information +route: /Project-Info +menu: Project Info +submenu: Project Information +--- + + + +# Project Information + +* This document provides an overview of the various documents and links that are part of this project's general information. All of this content is automatically generated by [Maven](http://maven.apache.org) on behalf of the project. + +# Overview + |Document|Description| + |:----|:----| + |[About](/)|Apache Atlas Documentation| + |[Project Team](/Team-List)|This document provides information on the members of this project. These are the individuals who have contributed to the project in one form or another.| + |[Mailing Lists](/Mailing-Lists)|This document provides subscription and archive information for this project's mailing lists.| + |[Issue Tracking](/Issue-Tracking)|This is a link to the issue management system for this project. Issues (bugs, features, change requests) can be created and queried using this link.| + |[Project License](/Project-License)|This is a link to the definitions of project licenses.| + |[Source Repository](/Source-Repository)|This is a link to the online source repository that can be viewed via a web browser.| diff --git a/docs/src/documents/Project-Info/project-license.md b/docs/src/documents/Project-Info/project-license.md new file mode 100644 index 000000000..87003c9d9 --- /dev/null +++ b/docs/src/documents/Project-Info/project-license.md @@ -0,0 +1,279 @@ +--- +name: License +route: /Project-License +menu: Project Info +submenu: License +--- + +# Project License + +### The Apache Software License, Version 2.0 + + Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +### Apache Atlas Subcomponents: + +The Apache Atlas project contains subcomponents with separate copyright +notices and license terms. Your use of the source code for the these +subcomponents is subject to the terms and conditions of the following +licenses. + +This product bundles titan 0.5.4, which is available under +Apache License. For details, see 3party-licenses/titan-LICENSE + +This product bundles JanusGraph 0.2.0, which is available under +Apache License. For details, see 3party-licenses/janusgraph-LICENSE + +This product bundles pnotify, which is available under +Apache License. For details, see 3party-licenses/pnotify-LICENSE + +This product bundles hppc, which is available under +Apache License. For details, see 3party-licenses/pnotify-LICENSE + +This product bundles mock(for python tests) 1.0.1, which is available under +BSD License. For details, see 3party-licenses/mock-LICENSE + +This product bundles animate, which is available under +MIT License. For details, see 3party-licenses/animate-LICENSE + +This product bundles Handlebars.js, which is available under +MIT License. For details, see 3party-licenses/handlebars-LICENSE + +This product bundles bootstrap-sidebar 0.4.0, which is available under +MIT License. For details, see 3party-licenses/bootstrap-sidebar-LICENSE + +This product bundles hbs 0.4.0, which is available under +MIT License. For details, see 3party-licenses/hbs-LICENSE + +This product bundles require-handlebars-plugin 0.4.0, which is available under +WTFPL License. For details, see 3party-licenses/require-handlebars-plugin-LICENSE + +This product bundles jQuery-ui.js, which is available under +MIT License. For details, see 3party-licenses/jQuery-ui-LICENSE + +This product bundles platform.js, which is available under +MIT License. For details, see 3party-licenses/platform-LICENSE + +This product bundles jquery-placeholder, which is available under +MIT License. For details, see 3party-licenses/jquery-placeholder-LICENSE + +This product bundles es5-shim, which is available under +MIT License. For details, see 3party-licenses/es5-shim-LICENSE + +This product bundles Respond, which is available under +MIT License. For details, see 3party-licenses/Respond-LICENSE + +This product bundles Google Fonts, which are available under +Open Font License. For details, see 3party-licenses/google-fonts-LICENSE + +This product bundles bootstrap-daterangepicker 2.1.25, which is available under +MIT License. For details, see 3party-licenses/bootstrap-daterangepicker-LICENSE + +This product bundles jQuery QueryBuilder 2.4.3, which is available under +MIT License. For details, see 3party-licenses/jQuery-QueryBuilder-LICENSE + +This product bundles backgrid-columnmanager 0.2.4, which is available under +MIT License. For details, see 3party-licenses/backgrid-columnmanager-LICENSE diff --git a/docs/src/documents/Project-Info/source-repository.md b/docs/src/documents/Project-Info/source-repository.md new file mode 100644 index 000000000..f85269206 --- /dev/null +++ b/docs/src/documents/Project-Info/source-repository.md @@ -0,0 +1,33 @@ +--- +name: Source Repository +route: /Source-Repository +menu: Project Info +submenu: Source Repository +--- + +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + +# Overview + +This project uses a Source Content Management System to manage its source code. + +# Web Access +The following is a link to the online source repository. + + +https://github.com/apache/atlas.git + +# Anonymous access +Refer to the documentation of the SCM used for more information about anonymously check out. The connection url is: + +git://git.apache.org/atlas.git +# Developer access +Refer to the documentation of the SCM used for more information about developer check out. The connection url is: + + +https://gitbox.apache.org/repos/asf/atlas.git + +# Access from behind a firewall +Refer to the documentation of the SCM used for more information about access behind a firewall. diff --git a/docs/src/documents/Project-Info/team-list.md b/docs/src/documents/Project-Info/team-list.md new file mode 100644 index 000000000..727b90c9f --- /dev/null +++ b/docs/src/documents/Project-Info/team-list.md @@ -0,0 +1,19 @@ +--- +name: Team List +route: /Team-List +menu: Project Info +submenu: Team List +--- + +# The Team + +import TeamList from 'theme/components/shared/TeamList' + +#### A successful project requires many people to play many roles. Some members write code or documentation, while others are valuable as testers, submitting patches and suggestions. +#### The team is comprised of Members and Contributors. Members have direct access to the source of a project and actively evolve the code-base. Contributors improve the project through submission of patches and suggestions to the Members. The number of Contributors to the project is unbounded. Get involved today. All contributions to the project are greatly appreciated. + +## Members + +#### The following is a list of developers with commit privileges that have directly contributed to the project in one way or another. + + diff --git a/docs/src/documents/RestAPI.md b/docs/src/documents/RestAPI.md new file mode 100644 index 000000000..276f0e947 --- /dev/null +++ b/docs/src/documents/RestAPI.md @@ -0,0 +1,13 @@ +--- +name: REST API +route: /rest-api +menu: Documentation +submenu: REST API +--- + +import {CustomLink} from "theme/components/shared/common/CustomLink"; + +# REST API + +1. REST API Documentation +2. Legacy API Documentation diff --git a/docs/src/site/twiki/Search-Advanced.twiki b/docs/src/documents/Search/Search-Advanced.md similarity index 62% rename from docs/src/site/twiki/Search-Advanced.twiki rename to docs/src/documents/Search/Search-Advanced.md index c6d6e7112..f49d3e321 100644 --- a/docs/src/site/twiki/Search-Advanced.twiki +++ b/docs/src/documents/Search/Search-Advanced.md @@ -1,6 +1,17 @@ ----+ Advanced Search +--- +name: Advance Search +route: /Search-Advance +menu: Documentation +submenu: Search +--- ----+++ Background +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + +# Advanced Search + +### **Background** Advanced Search in Atlas is also referred to as DSL-based Search. Domain Specific Search (DSL) is a language with simple constructs that help users navigate Atlas data repository. The syntax loosely emulates the popular Structured Query Language (SQL) from relation database world. @@ -14,67 +25,81 @@ Benefits of DSL: We will be using the quick start dataset in the examples that follow. This dataset is comprehensive enough to be used to to demonstrate the various features of the language. -For details on the grammar, please refer to Atlas DSL Grammer on [[https://github.com/apache/atlas/blob/master/repository/src/main/java/org/apache/atlas/query/antlr4/AtlasDSLParser.g4][Github]] (Antlr G4 format). +For details on the grammar, please refer to Atlas DSL Grammer on [Github](https://github.com/apache/atlas/blob/master/repository/src/main/java/org/apache/atlas/query/antlr4/AtlasDSLParser.g4) (Antlr G4 format). ----++ Using Advanced Search +## Using Advanced Search Within the Atlas UI, select Advanced in the Search pane on the left. -Notice that the _Favorite Searches_ pane below the _Search By Query_ box. Like _Basic Search_, it is possible to save the _Advanced Searches_ as well. +Notice that the *Favorite Searches* pane below the *Search By Query* box. Like *Basic Search*, it is possible to save the *Advanced Searches* as well. ----++ Introduction to Domain Specific Language +## Introduction to Domain Specific Language DSL uses the familiar SQL-like syntax. At a high-level a query has a _from-where-select_ format. Additional keywords like _grouby_, _orderby_, _limit_ can be used to added to affect the output. We will see examples of these below. ----+++ From Clause +### From Clause Specifying the _from_ clause is mandatory. Using the _from_ keyword itself is optional. The value specified in the _from_ clause acts as the source or starting point for the rest of the query to source its inputs. Example: To retrieve all entities of type _DB_: - -DB -from DB + + +{`DB +from DB`} + In the absence of _where_ for filtering on the source, the dataset fetched by the _from_ clause is everything from the database. Based on the size of the data present in the database, there is a potential to overwhelm the server. The query processor thus adds _limit_ clause with a default value set. See the section on _limit_ clause for details. ----+++ Where Clause + +### Where Clause + The _where_ clause allows for filtering over the dataset. This achieved by using conditions within the where clause. A conditions is identifier followed by an operator followed by a literal. Literal must be enclosed in single or double quotes. Example, _name = "Sales"_. An identifier can be name of the property of the type specified in the _from_ clause or an alias. Example: To retrieve entity of type _Table_ with a specific name say time_dim: - -from Table where name = 'time_dim' + + +{`from Table where name = 'time_dim'`} + It is possible to specify multiple conditions by combining them using _and_, _or_ operators. Example: To retrieve entity of type Table with name that can be either time_dim or customer_dim: - -from Table where name = 'time_dim' or name = 'customer_dim' + + +{`from Table where name = 'time_dim' or name = 'customer_dim'`} + Filtering based on a list of values is done using by specifying the values in the square brackets. A value array is a list of values enclosed within square brackets. This is a simple way to specify an OR clause on an identifier. Note that having several OR clauses on the same attribute may be inefficient. Alternate way is to use the value array as shown in the example below. Example: The query in the example above can be written using a value array as shown below. - -from Table where name = ["customer_dim", "time_dim"] + + +{`from Table where name = ["customer_dim", "time_dim"]`} + A condition that uses the LIKE operator, allows for filtering using wildcards like '*' or '?'. - Example: To retrieve entity of type _Table_ whose name ends with '_dim': - -from Table where name LIKE '*_dim' + + + +{`from Table where name LIKE '*_dim'`} + Additional forms of regular expressions can also be used. Example: To retrieve _DB_ whose name starts with _R_ followed by has any 3 characters, followed by _rt_ followed by at least 1 character, followed by none or any number of characters. - -DB where name like "R???rt?*" + + +{`DB where name like "R???rt?*"`} + ----++++ Using Date Literals +### Using Date Literals Dates used in literals need to be specified using the ISO 8601 format. Dates in this format follow this notation: @@ -82,48 +107,61 @@ Dates in this format follow this notation: * _yyyy-MM-dd_. Which means, year-month-day. Example: Date represents December 11, 2017 at 2:35 AM. -2017-12-11T02:35:0.0Z + + +{`2017-12-11T02:35:0.0Z`} + Example: To retrieve entity of type _Table_ created within 2017 and 2018. - -from Table where createTime < '2018-01-01' and createTime > '2017-01-01' ----++++ Using Boolean Literals + +{`from Table where createTime < '2018-01-01' and createTime > '2017-01-01'`} + + +#### Using Boolean Literals Properties of entities of type boolean can be used within queries. Eample: To retrieve entity of type hdfs_path whose attribute _isFile_ is set to _true_ and whose name is _Invoice_. - -from hdfs_path where isFile = true or name = "Invoice" + + +{`from hdfs_path where isFile = true or name = "Invoice"`} + Valid values for boolean literals are 'true' and 'false'. ----+++ Existence of a Property +### Existence of a Property The has keyword can be used with or without the where clause. It is used to check existence of a property in an entity. Example: To retreive entity of type Table with a property locationUri. - -Table has locationUri -from Table where Table has locationUri - ----+++ Select Clause + + +{`Table has locationUri +from Table where Table has locationUri`} + +### Select Clause If you noticed the output displayed on the web page, it displays a tabular display, each row corresponding to an entity and columns are properties of that entity. The select clause allows for choosing the properties of entity that are of interest. Example: To retrieve entity of type _Table_ with few properties: - -from Table select owner, name, qualifiedName - + + +{`from Table select owner, name, qualifiedName`} + Example: To retrieve entity of type Table for a specific table with some properties. - -from Table where name = 'customer_dim' select owner, name, qualifiedName + + +{`from Table where name = 'customer_dim' select owner, name, qualifiedName`} + To display column headers that are more meaningful, aliases can be added using the 'as' clause. Example: To display column headers as 'Owner', 'Name' and 'FullName'. - -from Table select owner as Owner, name as Name, qualifiedName as FullName ----++++ Note About Select Clauses + +{`from Table select owner as Owner, name as Name, qualifiedName as FullName`} + + +#### Note About Select Clauses Given the complexity involved in using select clauses, these are the few rules to remember when using select clauses: * Works with all immediate attributes. @@ -131,47 +169,64 @@ Given the complexity involved in using select clauses, these are the few rules t * Referred attributes cannot be mixed with immediate attributes. Example: To retrieve entity of type Table with name 'Sales' and display 'name' and 'owner' attribute of the referred entity DB. - -Table where name = 'abcd' select DB.name, DB.owner + + + +{`Table where name = 'abcd' select DB.name, DB.owner`} + Current implementation does not allow the following: - -Table where name = 'abcd' select DB.name, Table.name ----+++ Classification-based Filtering + +{`Table where name = 'abcd' select DB.name, Table.name`} + + +### Classification-based Filtering In order to retrieve entities based on classification, a query would use _is_ or _isa_ keywords. Example: To retrieve all entities of type _Table_ that are tagged with _Dimension_ classification. - -from Table isa Dimension + + +{`from Table isa Dimension`} + Since, from is optional and _is_ (or _isa_) are equivalent, the following queries yield the same results: - -Table is Dimension + + +{`Table is Dimension`} + The _is_ and _isa_ clauses can also be used in _where_ condition like: - -from Table where Table isa Dimension + + +{`from Table where Table isa Dimension`} + To search for all entities having a particular classification, simply use the name of the classification. Example: To retrieve all entities that have _Dimension_ classification. - -Dimension ----+++ Limit & Offset Clauses + +{`Dimension`} + + +### Limit & Offset Clauses Often a query yields large number of results. To limit the outcome of the query, the limit and offset clauses are used. Example: To retrieve only the 5 entities from a result set. - -Column limit 5 + + +{`Column limit 5`} + The offset clauses retrieves results after the offset value. Example: To retrieve only 5 entities from the result set after skipping the first 10. - -Column limit 5 offset 10 + + +{`Column limit 5 offset 10`} + The _limit_ and _offset_ clauses are usually specified in conjunction. @@ -179,7 +234,7 @@ If no limit clause is specified in the query, a limit clause with a default limi The _offset_ clause is useful for displaying results in a user interface where few results from the result set are showing and more results are fetched as the user advances to next page. ----+++ Ordering Results +### Ordering Results The _orderby_ clause allows for sorting of results. Results are sorted in ascending order by default. Only immediate attributes can be used within this clause. Ordering can be changed by using: @@ -187,15 +242,19 @@ Ordering can be changed by using: * DESC Sort in descending order. This needs to be explicitly specified after the _orderby_ clause. Example: To retrieve the entities of type _Column_ that are sorted in ascending order using the name property. - -from Column orderby name -from Column orderby name asc + + +{`from Column orderby name +from Column orderby name asc`} + Example: Same results as above except that they are sorted in descending order. - -from Column orderby name desc ----+++ Aggregate Functions + +{`from Column orderby name desc`} + + +### Aggregate Functions Let's look at aggregate functions: * _sum_: Adds (sums up) a value of the property specified, within the result set. @@ -207,56 +266,74 @@ These work only on immediate attributes. Other examples of these in the _Grouping Results_ section. ----++++ The count Keyword +### The count Keyword Shows the number of items in a result set. Example: To know how may entities of a type Column. - -Column select count() + + +{`Column select count()`} + Example: Same as above with alias. - -Column select count() as Cols + + +{`Column select count() as Cols`} + Example: To find the number of tables in a database. - -Table where db.name = "Reporting" select count() ----++++ The max Keyword + +{`Table where db.name = "Reporting" select count()`} + + +### The max Keyword Using this keyword it is possible to retrieve the maximum value of a property for an entity. Example: Get the most recently created value of the _createTime_ property of the Table entity. - -Table select max(createTime) ----++++ The min Keyword + +{`Table select max(createTime)`} + + +### The min Keyword Using this keyword it is possible to retrieve the minimum value of a property for an entity. Example: Get the least recently created value of the _createTime_ property of the Table entity. - -Table select min(createTime) ----+++ Grouping Results + +{`Table select min(createTime)`} + + +### Grouping Results The _groupby_ clause groups results within the result using specified property. Example: To retrieve entity of type Table such that tables belonging to an owner are together (grouped by owner). - -Table groupby(owner) + + +{`Table groupby(owner)`} + While _groupby_ can work without _select_, if aggregate functions are used within _select_ clause, using _groupby_ clause becomes mandatory as aggregate functions operate on a group. Example: To retrieve entity of type Table such we know the most recently created entity. - -Table groupby(createTime) select owner, name, max(createTime) + + +{`Table groupby(createTime) select owner, name, max(createTime)`} + Example: To retrieve entity of type Table such we know the oldest entity. - -Table groupby(createTime) select owner, name, min(createTime) + + +{`Table groupby(createTime) select owner, name, min(createTime)`} + Example: To know the number of entities owned by each owner. - -Table groupby(owner) select owner, count() ----+++ Where Clause With Complex Types + +{`Table groupby(owner) select owner, count()`} + + +### Where Clause With Complex Types In the discussion so far we looked at where clauses with primitive types. This section will look at using properties that are non-primitive types. In this model, the DB is modeled such that it is aware of all the Table it contains. Table on the other hand is aware of existence of the DB but is not aware of all the other _Table_ instances within the system. Each Table maintains reference of the _DB_ it belongs to. @@ -264,20 +341,23 @@ In this model, the DB is modeled such that it is aware of all the Table it conta Similar structure exists within the _hive_ data model. Example: To retrieve all the instances of the _Table_ belonging to a database named 'Sales': - -Table where db.name = "Sales" + + +{`Table where db.name = "Sales"`} + The entity Column is modeled in a similar way. Each Table entity has outward edges pointing to Column entity instances corresponding to each column within the table. Example: To retrieve all the Column entities for a given Table. - -Table where name = "time_dim" select columns + + +{`Table where name = "time_dim" select columns`} + The propeties of each _Column_ entity type are displayed. ----+++ Using System Attributes +### Using System Attributes Each type defined within Atlas gets few attributes by default. These attributes help with internal book keeping of the entities. All the system attributes are prefixed with '__' (double underscore). This helps in identifying them from other attributes. - Following are the system attributes: * __guid Each entity within Atlas is assigned a globally unique identifier (GUID for short). * __modifiedBy Name of the user who last modified the entity. @@ -286,33 +366,41 @@ Following are the system attributes: * __timestamp Timestamp (date represented as integer) of the entity at the time of creation. * __modificationTimestamp Timestamp (date represented as integer) of the entity at the time of last modification. ----++++ State of an Entity +### State of an Entity Entity within Atlas can be in the following states: * ACTIVE This is the state of entities that when it is available and is used within the system. It can be retrieved by default by searches. * DELETED When an entity is deleted, it's state is marked as DELETED. Entity in this state does not show up in search results. Explicit request needs to be made to retrieve this entity. ----++++ Using System Attributes in Queries +### Using System Attributes in Queries Example: To retrieve all entities that are deleted. - -Asset where __state = "DELETED" + + +{`Asset where __state = "DELETED"`} + Example: To retrieve entity GUIDs. - -Table select __guid + + +{`Table select __guid`} + Example: To retrieve several system attributes. - -hive_db select __timestamp, __modificationTimestamp, __state, __createdBy ----++ Advanced Search REST API + +{`hive_db select __timestamp, __modificationTimestamp, __state, __createdBy`} + + +## Advanced Search REST API Relevant models for these operations: - * _[[https://github.com/apache/atlas/blob/master/intg/src/main/java/org/apache/atlas/model/discovery/AtlasSearchResult.java][AtlasSearchResult]]_ - * _[[https://github.com/apache/atlas/blob/master/intg/src/main/java/org/apache/atlas/exception/AtlasBaseException.java][AtlasBaseException]]_ + * *[AtlasSearchResult](https://github.com/apache/atlas/blob/master/intg/src/main/java/org/apache/atlas/model/discovery/AtlasSearchResult.java)* + * *[AtlasBaseException](https://github.com/apache/atlas/blob/master/intg/src/main/java/org/apache/atlas/exception/AtlasBaseException.java)* ----+++ The V2 API -|*Get Results using DSL Search*|| -| _Example_ | See Examples sections below. | +### The V2 API +**Get Results using DSL Search** + +| **_Example_** | **See Examples sections below.** | +|:----:|:----:| |_URL_|_api/atlas/v2/search/dsl_| |_Method_|_GET_| |_URL Parameters_|_query_: Query conforming to DSL syntax.| @@ -321,22 +409,24 @@ Relevant models for these operations: ||_limit_: Maximum number of items in the result set.| ||_offset_: Starting index of the item in the result set.| |_Data Parameters_|_None_| -|_Success Response_|The JSON will correspond to [[https://github.com/apache/atlas/blob/master/intg/src/main/java/org/apache/atlas/model/discovery/AtlasSearchResult.java][AtlasSearchResult]].| -|_Error Response_|Errors that are handled within the system will be returned as [[https://github.com/apache/atlas/blob/master/intg/src/main/java/org/apache/atlas/exception/AtlasBaseException.java][AtlasBaseException]].| +|_Success Response_|The JSON will correspond to [AtlasSearchResult](https://github.com/apache/atlas/blob/master/intg/src/main/java/org/apache/atlas/model/discovery/AtlasSearchResult.java).| +|_Error Response_|Errors that are handled within the system will be returned as [AtlasBaseException](https://github.com/apache/atlas/blob/master/intg/src/main/java/org/apache/atlas/exception/AtlasBaseException.java).| |_Method Signature_|@GET| ||@Path("/dsl")| ||@Consumes(Servlets.JSON_MEDIA_TYPE)| ||@Produces(Servlets.JSON_MEDIA_TYPE)| *Examples* - -curl -X GET -u admin:admin -H "Content-Type: application/json" "http://localhost:21000/api/atlas/v2/search/dsl?typeName=Table" + + +{`curl -X GET -u admin:admin -H "Content-Type: application/json" "http://localhost:21000/api/atlas/v2/search/dsl?typeName=Table" curl -X GET -u admin:admin -H "Content-Type: application/json" "http://localhost:21000/api/atlas/v2/search/dsl?typeName=Column&classification=PII" curl -X GET -u admin:admin -H "Content-Type: application/json" "http://localhost:21000/api/atlas/v2/search/dsl?typeName=Table&classification=Dimension&limit=10&offset=2" curl -X GET -u admin:admin -H "Content-Type: application/json" "http://localhost:21000/api/atlas/v2/search/dsl?query=Table%20isa%20Dimension" -curl -X GET -u admin:admin -H "Content-Type: application/json" "http://localhost:21000/api/atlas/v2/search/dsl?query=Table%20isa%20Dimension&limit=5&offset=2" +curl -X GET -u admin:admin -H "Content-Type: application/json" "http://localhost:21000/api/atlas/v2/search/dsl?query=Table%20isa%20Dimension&limit=5&offset=2"`} + ----++ Implementation Approach +## Implementation Approach The general approach followed in implementation of DSL within Atlas can be enumerated in following steps: * Parser parses the incoming query for syntax. * Abstract syntax tree is generated by for a query that is parsed successfully. @@ -345,12 +435,12 @@ The general approach followed in implementation of DSL within Atlas can be enume * When done, the generated script is executed using Gremlin Script Engine. * Results generated be the query, if any, are processed and packaged in AtlasSearchResult structure. ----++ Differences Between Master and Earlier Versions +## Differences Between Master and Earlier Versions The following clauses are no longer supported: * path * loop ----++ Resources - * Antlr [[https://pragprog.com/book/tpantlr2/the-definitive-antlr-4-reference][Book]]. - * Antlr [[https://github.com/antlr/antlr4/blob/master/doc/getting-started.md][Quick Start]]. - * Atlas DSL Grammar on [[https://github.com/apache/atlas/blob/master/repository/src/main/java/org/apache/atlas/query/antlr4/AtlasDSLParser.g4][Github]] (Antlr G4 format). +## Resources + * Antlr [Book](https://pragprog.com/book/tpantlr2/the-definitive-antlr-4-reference). + * Antlr [Quick Start](https://github.com/antlr/antlr4/blob/master/doc/getting-started.md). + * Atlas DSL Grammar on [Github](https://github.com/apache/atlas/blob/master/repository/src/main/java/org/apache/atlas/query/antlr4/AtlasDSLParser.g4) (Antlr G4 format). \ No newline at end of file diff --git a/docs/src/site/twiki/Search-Basic.twiki b/docs/src/documents/Search/Search-Basic.md similarity index 62% rename from docs/src/site/twiki/Search-Basic.twiki rename to docs/src/documents/Search/Search-Basic.md index 910b50a44..89c302d53 100644 --- a/docs/src/site/twiki/Search-Basic.twiki +++ b/docs/src/documents/Search/Search-Basic.md @@ -1,12 +1,23 @@ ----+ Basic Search +--- +name: Basic Search +route: /Search-Basic +menu: Documentation +submenu: Search +--- -The basic search allows you to query using typename of an entity, associated classification/tag -and has support for filtering on the entity attribute(s) as well as the classification/tag attributes. +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; +import Img from 'theme/components/shared/Img' + +# Basic Search + +The basic search allows you to query using typename of an entity, associated classification/tag and has support for filtering on the entity attribute(s) as well as the classification/tag attributes. The entire query structure can be represented using the following JSON structure (called !SearchParameters) - -{ + +{`{ "typeName": "hive_column", "excludeDeletedEntities": true, "classification": "PII", @@ -16,31 +27,32 @@ The entire query structure can be represented using the following JSON structure "entityFilters": { }, "tagFilters": { }, "attributes": [ "table", "qualifiedName"] -} - +}`} + -__Field description__ +**Field description** - - typeName: the type of entity to look for - excludeDeletedEntities: should the search exclude deleted entities? (default: true) - classification: only include entities with given classification - query: any free text occurrence that the entity should have (generic/wildcard queries might be slow) - offset: starting offset of the result set (useful for pagination) - limit: max number of results to fetch - entityFilters: entity attribute filter(s) - tagFilters: classification attribute filter(s) - attributes: attributes to include in the search result - + + {`typeName: the type of entity to look for +excludeDeletedEntities: should the search exclude deleted entities? (default: true) +classification: only include entities with given classification +query: any free text occurrence that the entity should have (generic/wildcard queries might be slow) +offset: starting offset of the result set (useful for pagination) +limit: max number of results to fetch +entityFilters: entity attribute filter(s) +tagFilters: classification attribute filter(s) +attributes: attributes to include in the search result`} + - + Attribute based filtering can be done on multiple attributes with AND/OR conditions. -__Examples of filtering (for hive_table attributes)__ +**Examples of filtering (for hive_table attributes)** * Single attribute - - { + + +{` { "typeName": "hive_table", "excludeDeletedEntities": true, "offset": 0, @@ -51,14 +63,15 @@ __Examples of filtering (for hive_table attributes)__ "attributeValue": "customers" }, "attributes": [ "db", "qualifiedName" ] - } - + }`} + - + * Multi-attribute with OR - - { + + +{` { "typeName": "hive_table", "excludeDeletedEntities": true, "offset": 0, @@ -79,14 +92,15 @@ __Examples of filtering (for hive_table attributes)__ ] }, "attributes": [ "db", "qualifiedName" ] - } - + }`} + - + * Multi-attribute with AND - - { + + +{` { "typeName": "hive_table", "excludeDeletedEntities": true, "offset": 0, @@ -107,12 +121,12 @@ __Examples of filtering (for hive_table attributes)__ ] }, "attributes": [ "db", "qualifiedName" ] - } - + }`} + - + -__Supported operators for filtering__ +**Supported operators for filtering** * LT (symbols: <, lt) works with Numeric, Date attributes * GT (symbols: >, gt) works with Numeric, Date attributes @@ -125,10 +139,10 @@ __Supported operators for filtering__ * ENDS_WITH (symbols: endsWith, ENDSWITH) works with String attributes * CONTAINS (symbols: contains, CONTAINS) works with String attributes -__CURL Samples__ +**CURL Samples** - - curl -sivk -g + +{`curl -sivk -g -u : -X POST -d '{ @@ -155,5 +169,5 @@ __CURL Samples__ }, "attributes": [ "db", "qualifiedName" ] }' - ://:/api/atlas/v2/search/basic - + ://:/api/atlas/v2/search/basic`} + \ No newline at end of file diff --git a/docs/src/documents/Security/AtlasRangerAuthorizer.md b/docs/src/documents/Security/AtlasRangerAuthorizer.md new file mode 100644 index 000000000..7d69f1388 --- /dev/null +++ b/docs/src/documents/Security/AtlasRangerAuthorizer.md @@ -0,0 +1,83 @@ +--- +name: Atlas Ranger Authorizer +route: /AtlasRangerAuthorizer +menu: Documentation +submenu: Security +--- + +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; +import Img from 'theme/components/shared/Img' + + +# Atlas Ranger Authorizer + + +## Setting up Apache Atlas to use Apache Ranger Authorization + +As detailed in [Atlas Authorization Model](http://atlas.apache.org//Atlas-Authorization-Model.html), Apache Atlas supports pluggable authorization +model. Apache Ranger provides an authorizer implementation that uses Apache Ranger policies for authorization. In +addition, the authorizer provided by Apache Ranger audits all authorizations into a central audit store. + +### Configure Apache Atlas +To configure Apache Atlas to use Apache Ranger authorizer, please follow the instructions given below: + +* Include the following property in atlas-application.properties config file: + + + {`atlas.authorizer.impl=ranger`} + + + If you use Apache Ambari to deploy Apache Atlas and Apache Ranger, enable Atlas plugin in configuration pages for + Apache Ranger. + +* Include libraries of Apache Ranger plugin in libext directory of Apache Atlas + * ``/libext/ranger-atlas-plugin-impl/ + * ``/libext/ranger-atlas-plugin-shim-.jar + * ``/libext/ranger-plugin-classloader-.jar + +* Include configuration files for Apache Ranger plugin in configuration directory of Apache Atlas - typically under /etc/atlas/conf directory. For more details on configuration file contents, please refer to appropriate documentation in Apache Ranger. + * ``/ranger-atlas-audit.xml + * ``/ranger-atlas-security.xml + * ``/ranger-policymgr-ssl.xml + * ``/ranger-security.xml + + + +### Apache Ranger authorization policy model for Apache Atlas + +Apache Ranger authorization policy model for Apache Atlas supports 3 resource hierarchies, to control access to: types, +entities and admin operations. Following images show various details of each type of policy in Apache Ranger. + + * **Types** + +Following authorization policy allows user 'admin' to create/update/delete any classification type. +Apache Ranger policy for type operations + +------- + + + + * **Entity** + +Following authorization policy allows user 'admin' perform all operations on metadata entities of Hive database named "my_db". +Apache Ranger policy for entity operations + +------- + + * **Admin Operations** +Following authorization policy allows user 'admin' to perform export/import admin operations. + +Apache Ranger policy for admin operations + + +------- + +### Apache Ranger access audit for Apache Atlas authorizations +Apache Ranger authorization plugin generates audit logs with details of the access authorized by the plugin. The details +include the object accessed (eg. hive_table with ID cost_savings.claim_savings@cl1), type of access performed (eg. +entity-add-classification, entity-remove-classification), name of the user, time of access and the IP address the access +request came from - as shown in the following image. + +Apache Ranger audit diff --git a/docs/src/site/twiki/Atlas-Authorization-Simple-Authorizer.twiki b/docs/src/documents/Security/AtlasSimpleAuthorizer.md similarity index 75% rename from docs/src/site/twiki/Atlas-Authorization-Simple-Authorizer.twiki rename to docs/src/documents/Security/AtlasSimpleAuthorizer.md index 388be56dd..081e2f1b8 100644 --- a/docs/src/site/twiki/Atlas-Authorization-Simple-Authorizer.twiki +++ b/docs/src/documents/Security/AtlasSimpleAuthorizer.md @@ -1,31 +1,44 @@ ----+++ Setting up Atlas to use Simple Authorizer +--- +name: Atlas Simple Authorizer +route: /AtlasSimpleAuthorizer +menu: Documentation +submenu: Security +--- -As detailed in [[Atlas-Authorization-Model][Atlas Authorization Model]], Apache Atlas supports a pluggable authorization +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + +# Atlas Simple Authorizer + +## Setting up Atlas to use Simple Authorizer + +As detailed in Atlas Authorization Model](http://atlas.apache.org/Atlas-Authorization-Model.html), Apache Atlas supports a pluggable authorization model. Simple authorizer is the default authorizer implementation included in Apache Atlas. Simple authorizer uses policies defined in a JSON file. This document provides details of steps to configure Apache Atlas to use the simple authorizer and details of the JSON file format containing authorization policies. ----++++ Configure Apache Atlas +## Configure Apache Atlas To configure Apache Atlas to use simple authorizer, include the following properties in application.properties config file: - -atlas.authorizer.impl=simple -atlas.authorizer.simple.authz.policy.file=/etc/atlas/conf/atlas-simple-authz-policy.json - + +{`atlas.authorizer.impl=simple +atlas.authorizer.simple.authz.policy.file=/etc/atlas/conf/atlas-simple-authz-policy.json`} + Please note that if the policy file location specified is not an absolute path, the file will be looked up in following paths: * Apache Atlas configuration directory (specified by system property =atlas.conf=) * Apache Atlas server's current directory * CLASSPATH ----++++ Policy file format +### Policy file format Simple authorizer uses =roles= to group permissions, which can then be assigned to users and user-groups. Following examples would help to understand the details of the policy file format: ----+++++ Roles +### Roles Following policy file defines 3 roles: * ROLE_ADMIN: has all permissions * PROD_READ_ONLY: has access to read entities having qualifiedName ending with "@prod" @@ -33,8 +46,8 @@ Following policy file defines 3 roles: Simple authorizer supports Java reg-ex to specify values for privilege/entity-type/entity-id/classification/typeName/typeCategory. - -{ + +{`{ "roles": { "ROLE_ADMIN": { "adminPermissions": [ @@ -89,20 +102,19 @@ Simple authorizer supports Java reg-ex to specify values for privilege/entity-ty "groupRoles": { ... } -} +}`} - + ----+++++ Assign Roles to Users and User Groups +### Assign Roles to Users and User Groups Roles defined above can be assigned (granted) to users as shown below: - -{ + +{`{ "roles": { ... }, - "userRoles": { "admin": [ "ROLE_ADMIN" ], "steward": [ "DATA_STEWARD" ], @@ -110,32 +122,29 @@ Roles defined above can be assigned (granted) to users as shown below: "user2": [ "TEST_ALL_ACCESS" ], "user3": [ "PROD_READ_ONLY", "TEST_ALL_ACCESS" ], }, - "groupRoles": { ... } -} - +}`} + + Roles can be assigned (granted) to user-groups as shown below. An user can belong to multiple groups; roles assigned to all groups the user belongs to will be used to authorize the access. - -{ + +{`{ "roles": { ... }, - "userRoles": { ... }, - "groupRoles": { "admins": [ "ROLE_ADMIN" ], "dataStewards": [ "DATA_STEWARD" ], "testUsers": [ "TEST_ALL_ACCESS" ], "prodReadUsers": [ "PROD_READ_ONLY" ] } -} - - +}`} + diff --git a/docs/src/documents/Security/Authentication.md b/docs/src/documents/Security/Authentication.md new file mode 100644 index 000000000..2097820d1 --- /dev/null +++ b/docs/src/documents/Security/Authentication.md @@ -0,0 +1,155 @@ +--- +name: Authentication +route: /Authentication +menu: Documentation +submenu: Security +--- + + +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + +# Authentication in Apache Atlas. + +### Authentication + +Atlas supports following authentication methods + + * **File** + * **Kerberos** + * **LDAP** + * **Keycloak (OpenID Connect / OAUTH2)** + + +Following properties should be set true to enable the authentication of that type in `atlas-application.properties` file. + + + +{`atlas.authentication.method.kerberos=true|false +atlas.authentication.method.ldap=true|false +atlas.authentication.method.file=true|false +atlas.authentication.method.keycloak=true|false`} + + +If two or more authentication methods are set to true, then the authentication falls back to the latter method if the earlier one fails. +For example if Kerberos authentication is set to true and ldap authentication is also set to true then, if for a request without kerberos principal and keytab LDAP authentication will be used as a fallback scenario. + +### FILE method. + +File authentication requires users' login details in users credentials file in the format specified below and +the file path should set to property `atlas.authentication.method.file.filename` in `atlas-application.properties`. + + +{`atlas.authentication.method.file=true +atlas.authentication.method.file.filename=${'sys:atlas.home'}/conf/users-credentials.properties`} + + +The users credentials file should have below format + +{`username=group::sha256-password`} + + + For e.g. + +{`admin=ADMIN::e7cf3ef4f17c3999a94f2c6f612e8a888e5b1026878e4e19398b23bd38ec221a`} + + +Users group can be either **ADMIN**, **DATA_STEWARD** OR **DATA_SCIENTIST** + +*Note*:-password is encoded with sha256 encoding method and can be generated using unix tool. + +For e.g. + +{`echo -n "Password" | sha256sum +e7cf3ef4f17c3999a94f2c6f612e8a888e5b1026878e4e19398b23bd38ec221a -`} + + + +### Kerberos Method. + +To enable the authentication in Kerberos mode in Atlas, set the property `atlas.authentication.method.kerberos` to true in `atlas-application.properties` + + +{`atlas.authentication.method.kerberos = true`} + + +Also following properties should be set. + + +{`atlas.authentication.method.kerberos.principal=/@EXAMPLE.COM +atlas.authentication.method.kerberos.keytab = /.keytab +atlas.authentication.method.kerberos.name.rules = RULE:[2:$1@$0](atlas@EXAMPLE.COM)s/.*/atlas/ +atlas.authentication.method.kerberos.token.validity = 3600 [ in Seconds (optional)]`} + + + +### LDAP Method. + +To enable the authentication in LDAP mode in Atlas, set the property `atlas.authentication.method.ldap` to true and also set Ldap type to property `atlas.authentication.method.ldap.type` to LDAP or AD in `atlas-application.properties`. +Use AD if connecting to Active Directory. + + +{`atlas.authentication.method.ldap=true +atlas.authentication.method.ldap.type=ldap|ad`} + + + +For LDAP or AD the following configuration needs to be set in atlas application properties. + + +### Active Directory + + +{`atlas.authentication.method.ldap.ad.domain= example.com +atlas.authentication.method.ldap.ad.url=ldap://:389 +atlas.authentication.method.ldap.ad.base.dn=DC=example,DC=com +atlas.authentication.method.ldap.ad.bind.dn=CN=Administrator,CN=Users,DC=example,DC=com +atlas.authentication.method.ldap.ad.bind.password= +atlas.authentication.method.ldap.ad.referral=ignore +atlas.authentication.method.ldap.ad.user.searchfilter=(sAMAccountName={0}) +atlas.authentication.method.ldap.ad.default.role=ROLE_USER`} + + +### LDAP Directroy + + +{`atlas.authentication.method.ldap.url=ldap://:389 +atlas.authentication.method.ldap.userDNpattern=uid={0],ou=users,dc=example,dc=com +atlas.authentication.method.ldap.groupSearchBase=dc=example,dc=com +atlas.authentication.method.ldap.groupSearchFilter=(member=cn={0},ou=users,dc=example,dc=com +atlas.authentication.method.ldap.groupRoleAttribute=cn +atlas.authentication.method.ldap.base.dn=dc=example,dc=com +atlas.authentication.method.ldap.bind.dn=cn=Manager,dc=example,dc=com +atlas.authentication.method.ldap.bind.password= +atlas.authentication.method.ldap.referral=ignore +atlas.authentication.method.ldap.user.searchfilter=(uid={0}) +atlas.authentication.method.ldap.default.role=ROLE_USER`} + + +### Keycloak Method. + +To enable Keycloak authentication mode in Atlas, set the property `atlas.authentication.method.keycloak` to true and also set the property `atlas.authentication.method.keycloak.file` to the localtion of your `keycloak.json` in `atlas-application.properties`. +Also set `atlas.authentication.method.keycloak.ugi-groups` to false if you want to pickup groups from Keycloak. By default the groups will be picked up from the *roles* defined in Keycloak. In case you want to use the groups +you need to create a mapping in keycloak and define `atlas.authentication.method.keycloak.groups_claim` equal to the token claim name. Make sure **not** to use the full group path and add the information to the access token. + + +{`atlas.authentication.method.keycloak=true +atlas.authentication.method.keycloak.file=/opt/atlas/conf/keycloak.json +atlas.authentication.method.keycloak.ugi-groups=false`} + + +Setup you keycloak.json per instructions from Keycloak. Make sure to include `"principal-attribute": "preferred_username"` to ensure readable user names and `"autodetect-bearer-only": true`. + + +{`{ + "realm": "auth", + "auth-server-url": "http://keycloak-server/auth", + "ssl-required": "external", + "resource": "atlas", + "public-client": true, + "confidential-port": 0, + "principal-attribute": "preferred_username", + "autodetect-bearer-only": true +}`} + diff --git a/docs/src/site/twiki/Atlas-Authorization-Model.twiki b/docs/src/documents/Security/AuthorizationModel.md similarity index 65% rename from docs/src/site/twiki/Atlas-Authorization-Model.twiki rename to docs/src/documents/Security/AuthorizationModel.md index ee0993568..9f7dea3d7 100644 --- a/docs/src/site/twiki/Atlas-Authorization-Model.twiki +++ b/docs/src/documents/Security/AuthorizationModel.md @@ -1,10 +1,19 @@ +--- +name: Authorization Model +route: /AuthorizationModel +menu: Documentation +submenu: Security +--- + +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; ----++ Atlas Authorization Model +### Atlas Authorization Model - ----+++ Introduction +## Introduction Atlas is a scalable and extensible set of core foundational governance services – enabling enterprises to effectively and efficiently meet their compliance requirements within Hadoop and allows integration with the whole enterprise data ecosystem. @@ -14,7 +23,7 @@ scientists, analysts and the data governance team. This document covers details of the authorization model supported by Apache Atlas to control access to metadata managed by Atlas. ----+++ Authorization of access to Types +## Authorization of access to Types Apache Atlas provides a type system that allows users to model the metadata objects they would like to manage. The model is composed of definitions called ‘types’. Apache Atlas type system supports following categories of types: * Entity @@ -35,7 +44,7 @@ Here are few examples of access controls supported by the model: * Healthcare data stewards can create/update/delete types having names start with “hc” ----+++ Authorization of access to Entities +## Authorization of access to Entities An entity is an instance of an entity-type and such instances represent objects in the real world – for example a table in Hive, a HDFS file, a Kafka topic. The authorization model enables control of which users, groups can perform the following operations on entities – based on entity-types, entity-classifications, entity-id: @@ -56,55 +65,55 @@ Here are few examples of access controls supported by the model: * Users in specific groups can read/update entities with PII classification or its sub-classification * Finance users can read/update entities whose ID start with ‘finance’ ----+++ Authorization of Admin operations +## Authorization of Admin operations The authorization model enables control of which users, groups can perform the following administrative operations: - * import entities - * export entities + * *import entities* + * *export entities* Users with above accesses can import/export entities without requiring them to be granted with fine-grained entity level accesses. ----+++ Pluggable Authorization +## Pluggable Authorization Apache Atlas supports a pluggable authorization interface, as shown below, that enable alternate implementations to handle authorizations. -The name of the class implementing the authorization interface can be registered with Apache Atlas using configuration =atlas.authorizer.impl=. When this property is not set, Apache Atlas will use its default implementation in =org.apache.atlas.authorize.simple.AtlasSimpleAuthorizer=. +The name of the class implementing the authorization interface can be registered with Apache Atlas using configuration `atlas.authorizer.impl`. When this property is not set, Apache Atlas will use its default implementation in `org.apache.atlas.authorize.simple.AtlasSimpleAuthorizer`. - + +{` + package org.apache.atlas.authorize; -package org.apache.atlas.authorize; + public interface AtlasAuthorizer { + void init(); -public interface AtlasAuthorizer { - void init(); + void cleanUp(); - void cleanUp(); + boolean isAccessAllowed(AtlasAdminAccessRequest request) throws AtlasAuthorizationException; - boolean isAccessAllowed(AtlasAdminAccessRequest request) throws AtlasAuthorizationException; + boolean isAccessAllowed(AtlasEntityAccessRequest request) throws AtlasAuthorizationException; - boolean isAccessAllowed(AtlasEntityAccessRequest request) throws AtlasAuthorizationException; + boolean isAccessAllowed(AtlasTypeAccessRequest request) throws AtlasAuthorizationException; + }`} + - boolean isAccessAllowed(AtlasTypeAccessRequest request) throws AtlasAuthorizationException; -} - - ----+++ Simple Authorizer +## Simple Authorizer Simple authorizer is the default authorizer implementation included in Apache Atlas. For details of setting up Apache Atlas -to use simple authorizer, please see [[Atlas-Authorization-Simple-Authorizer][Setting up Atlas to use Simple Authorizer]] +to use simple authorizer, please see [Setting up Atlas to use Simple Authorizer](http://atlas.apache.org/Atlas-Authorization-Simple-Authorizer.html) ----+++ Ranger Authorizer +## Ranger Authorizer To configure Apache Atlas to use authorization implementation provided by Apache Ranger, include the following property in application.properties config file: - -atlas.authorizer.impl=ranger - + +{`atlas.authorizer.impl=ranger`} + Apache Ranger Authorizer requires configuration files to be setup, for example to specify Apache Ranger admin server URL, -name of the service containing authorization policies, etc. For more details please see, [[Atlas-Authorization-Ranger-Authorizer][Setting up Atlas to use Ranger Authorizer]]. +name of the service containing authorization policies, etc. For more details please see, [Setting up Atlas to use Ranger Authorizer](http://atlas.apache.org/Atlas-Authorization-Ranger-Authorizer.html). ----+++ None authorizer +## None authorizer In addition to the default authorizer, Apache Atlas includes an authorizer that permits all accesses to all users. This authorizer can be useful in test environments and unit tests. To use this authorizer, set the following configuration: - -atlas.authorizer.impl=NONE - + +{`atlas.authorizer.impl=NONE`} + diff --git a/docs/src/documents/Security/security.md b/docs/src/documents/Security/security.md new file mode 100644 index 000000000..94de84574 --- /dev/null +++ b/docs/src/documents/Security/security.md @@ -0,0 +1,278 @@ +--- +name: Security Details +route: /security +menu: Documentation +submenu: Security +--- + +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + +# Security Features of Apache Atlas + + +## Overview + +The following features are available for enhancing the security of the platform: + * SSL + * Service Authentication + * SPNEGO-based HTTP Authentication + +## SSL + +Both SSL one-way (server authentication) and two-way (server and client authentication) are supported. The following application properties (properties configured in the atlas-application.properties file) are available for configuring SSL: + + * `atlas.enableTLS` (false|true) [default: false] - enable/disable the SSL listener + * `keystore.file` - the path to the keystore file leveraged by the server. This file contains the server certificate. + * `truststore.file` - the path to the truststore file. This file contains the certificates of other trusted entities (e.g. the certificates for client processes if two-way SSL is enabled). In most instances this can be set to the same value as the keystore.file property (especially if one-way SSL is enabled). + * `client.auth.enabled` (false|true) [default: false] - enable/disable client authentication. If enabled, the client will have to authenticate to the server during the transport session key creation process (i.e. two-way SSL is in effect). + * `cert.stores.credential.provider.path` - the path to the Credential Provider store file. The passwords for the keystore, truststore, and server certificate are maintained in this secure file. Utilize the cputil script in the 'bin' directoy (see below) to populate this file with the passwords required. + * `atlas.ssl.exclude.cipher.suites` - the excluded Cipher Suites list - *NULL.*,.*RC4.*,.*MD5.*,.*DES.*,.*DSS.* are weak and unsafe Cipher Suites that are excluded by default. If additional Ciphers need to be excluded, set this property with the default Cipher Suites such as atlas.ssl.exclude.cipher.suites=.*NULL.*, .*RC4.*, .*MD5.*, .*DES.*, .*DSS.*, and add the additional Ciper Suites to the list with a comma separator. They can be added with their full name or a regular expression. The Cipher Suites listed in the atlas.ssl.exclude.cipher.suites property will have precedence over the default Cipher Suites. One would keep the default Cipher Suites, and add additional ones to be safe. + +#### Credential Provider Utility Script + +In order to prevent the use of clear-text passwords, the Atlas platofrm makes use of the Credential Provider facility for secure password storage (see [Hadoop Credential Command Reference](http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/CommandsManual.html#credentia) for more information about this facility). The cputil script in the `bin` directory can be leveraged to create the password store required. + +To create the credential provdier for Atlas: + + * cd to the `bin` directory + * type `./cputil.py` + * Enter the path for the generated credential provider. The format for the path is: + * [jceks://file/local/file/path/file.jceks]() or [jceks://hdfs@namenodehost:port/path/in/hdfs/to/file.jceks](). The files generally use the ".jceks" extension (e.g. test.jceks) + * Enter the passwords for the keystore, truststore, and server key (these passwords need to match the ones utilized for actually creating the associated certificate store files). + + The credential provider will be generated and saved to the path provided. + +## Service Authentication + +The Atlas platform, upon startup, is associated to an authenticated identity. By default, in an insecure environment, that identity is the same as the OS authenticated user launching the server. However, in a secure cluster leveraging kerberos, it is considered a best practice to configure a keytab and principal in order for the platform to authenticate to the KDC. This allows the service to subsequently interact with other secure cluster services (e.g. HDFS). + +The properties for configuring service authentication are: + + * `atlas.authentication.method` (simple|kerberos) [default: simple] - the authentication method to utilize. Simple will leverage the OS authenticated identity and is the default mechanism. 'kerberos' indicates that the service is required to authenticate to the KDC leveraging the configured keytab and principal. + * `atlas.authentication.keytab` - the path to the keytab file. + * `atlas.authentication.principal` - the principal to use for authenticating to the KDC. The principal is generally of the form "user/host@realm". You may use the '_HOST' token for the hostname and the local hostname will be substituted in by the runtime (e.g. "Atlas/_HOST@EXAMPLE.COM") + +> Note that when Atlas is configured with HBase as the storage backend in a secure cluster, the graph db (JanusGraph) needs sufficient user permissions to be able to create and access an HBase table. To grant the appropriate permissions see [Graph persistence engine - Hbase](Configuration). + +### JAAS configuration + +In a secure cluster, some of the components (such as Kafka) that Atlas interacts with, require Atlas to authenticate itself to them using JAAS. The following properties are used to set up appropriate JAAS Configuration. + + * `atlas.jaas.client-id.loginModuleName` - the authentication method used by the component (for example, com.sun.security.auth.module.Krb5LoginModule) + * `atlas.jaas.client-id.loginModuleControlFlag` (required|requisite|sufficient|optional) [default: required] + * `atlas.jaas.client-id.option.useKeyTab` (true|false) + * `atlas.jaas.client-id.option.storeKey` (true | false) + * `atlas.jaas.client-id.option.serviceName` - service name of server component + * `atlas.jaas.client-id.option.keyTab` = `` + * `atlas.jaas.client-id.option.principal` = `` + +For example, the following property settings in jaas-application.properties file + + + +{`atlas.jaas.KafkaClient.loginModuleName = com.sun.security.auth.module.Krb5LoginModule +atlas.jaas.KafkaClient.loginModuleControlFlag = required +atlas.jaas.KafkaClient.option.useKeyTab = true +atlas.jaas.KafkaClient.option.storeKey = true +atlas.jaas.KafkaClient.option.serviceName = kafka +atlas.jaas.KafkaClient.option.keyTab = /etc/security/keytabs/kafka_client.keytab +atlas.jaas.KafkaClient.option.principal = kafka-client-1@EXAMPLE.COM +atlas.jaas.MyClient.0.loginModuleName = com.sun.security.auth.module.Krb5LoginModule +atlas.jaas.MyClient.0.loginModuleControlFlag = required +atlas.jaas.MyClient.0.option.useKeyTab = true +atlas.jaas.MyClient.0.option.storeKey = true +atlas.jaas.MyClient.0.option.serviceName = kafka +atlas.jaas.MyClient.0.option.keyTab = /etc/security/keytabs/kafka_client.keytab +atlas.jaas.MyClient.0.option.principal = kafka-client-1@EXAMPLE.COM +atlas.jaas.MyClient.1.loginModuleName = com.sun.security.auth.module.Krb5LoginModule +atlas.jaas.MyClient.1.loginModuleControlFlag = optional +atlas.jaas.MyClient.1.option.useKeyTab = true +atlas.jaas.MyClient.1.option.storeKey = true +atlas.jaas.MyClient.1.option.serviceName = kafka +atlas.jaas.MyClient.1.option.keyTab = /etc/security/keytabs/kafka_client.keytab +atlas.jaas.MyClient.1.option.principal = kafka-client-1@EXAMPLE.COM`} + + +will set the JAAS configuration that is equivalent to the following jaas.conf file entries. + + +{`KafkaClient { + com.sun.security.auth.module.Krb5LoginModule required + useKeyTab=true + storeKey=true + serviceName=kafka + keyTab="/etc/security/keytabs/kafka_client.keytab" + principal="kafka-client-1@EXAMPLE.COM"; +}; +MyClient { + com.sun.security.auth.module.Krb5LoginModule required + useKeyTab=true + storeKey=true + serviceName=kafka keyTab="/etc/security/keytabs/kafka_client.keytab" + principal="kafka-client-1@EXAMPLE.COM"; +}; +MyClient { + com.sun.security.auth.module.Krb5LoginModule optional + useKeyTab=true + storeKey=true + serviceName=kafka + keyTab="/etc/security/keytabs/kafka_client.keytab" + principal="kafka-client-1@EXAMPLE.COM"; +};`} + + + +## SPNEGO-based HTTP Authentication + +HTTP access to the Atlas platform can be secured by enabling the platform's SPNEGO support. There are currently two supported authentication mechanisms: + + * `simple` - authentication is performed via a provided user name + * `kerberos` - the KDC authenticated identity of the client is leveraged to authenticate to the server + +The kerberos support requires the client accessing the server to first authenticate to the KDC (usually this is done via the 'kinit' command). Once authenticated, the user may access the server (the authenticated identity will be related to the server via the SPNEGO negotiation mechanism). + +The properties for configuring the SPNEGO support are: + + * `atlas.http.authentication.enabled` (true|false) [default: false] - a property indicating whether to enable HTTP authentication + * `atlas.http.authentication.type` (simple|kerberos) [default: simple] - the authentication type + * `atlas.http.authentication.kerberos.principal` - the web-application Kerberos principal name. The Kerberos principal name must start with "HTTP/...". For example: "HTTP/localhost@LOCALHOST". There is no default value. + * `atlas.http.authentication.kerberos.keytab` - the path to the keytab file containing the credentials for the kerberos principal. + * `atlas.rest.address` - `://:` + +For a more detailed discussion of the HTTP authentication mechanism refer to [Hadoop Auth, Java HTTP SPNEGO 2.6.0 - Server Side Configuration](http://hadoop.apache.org/docs/stable/hadoop-auth/Configuration.html). The prefix that document references is "atlas.http.authentication" in the case of the Atlas authentication implementation. + +### Client security configuration + +When leveraging Atlas client code to communicate with an Atlas server configured for SSL transport and/or Kerberos authentication, there is a requirement to provide the Atlas client configuration file that provides the security properties that allow for communication with, or authenticating to, the server. + +Update the atlas-application.properties file with the appropriate settings (see below) and copy it to the client's classpath or to the directory specified by the "atlas.conf" system property. + +The client properties for SSL communication are: + + * `atlas.enableTLS` (false|true) [default: false] - enable/disable the SSL client communication infrastructure. + * `keystore.file` - the path to the keystore file leveraged by the client. This file is only required if 2-Way SSL is enabled at the server and contains the client certificate. + * `truststore.file` - the path to the truststore file. This file contains the certificates of trusted entities (e.g. the certificates for the server or a shared certification authority). This file is required for both one-way or two-way SSL. + * `cert.stores.credential.provider.path` - the path to the Credential Provider store file. The passwords for the keystore, truststore, and client certificate are maintained in this secure file. + +The property required for authenticating to the server (if authentication is enabled): + + * `atlas.http.authentication.type` (simple|kerberos) [default: simple] - the authentication type + +### SOLR Kerberos configuration +If the authentication type specified is 'kerberos', then the kerberos ticket cache will be accessed for authenticating to the server (Therefore the client is required to authenticate to the KDC prior to communication with the server using 'kinit' or a similar mechanism). + +See [the Apache SOLR Kerberos configuration](https://cwiki.apache.org/confluence/display/RANGER/How+to+configure+Solr+Cloud+with+Kerberos+for+Ranger+0.5). + + * Add principal and generate the keytab file for solr. Create a keytab per host for each host where Solr is going to run and use the principal name with the host (e.g. addprinc -randkey solr/${HOST1}@EXAMPLE.COM. Replace ${HOST1} with the actual host names). + + + + +{`kadmin.local +kadmin.local: addprinc -randkey solr/@EXAMPLE.COM +kadmin.local: xst -k solr.keytab solr/@EXAMPLE.COM +kadmin.local: quit`} + + + * Add principal and generate the keytab file for authenticating HTTP request. (Note that if Ambari is used to Kerberize the cluster, the keytab /etc/security/keytabs/spnego.service.keytab can be used) + + + +{`kadmin.local +kadmin.local: addprinc -randkey HTTP/@EXAMPLE.COM +kadmin.local: xst -k HTTP.keytab HTTP/@EXAMPLE.COM +kadmin.local: quit`} + + + * Copy the keytab file to all the hosts running Solr. + + + +{`cp solr.keytab /etc/security/keytabs/ +chmod 400 /etc/security/keytabs/solr.keytab +cp HTTP.keytab /etc/security/keytabs/ +chmod 400 /etc/security/keytabs/HTTP.keytab`} + + + + + * Create path in Zookeeper for storing the Solr configs and other parameters. + + + +{`$SOLR_INSTALL_HOME/server/scripts/cloud-scripts/zkcli.sh -zkhost $ZK_HOST:2181 -cmd makepath solr`} + + + + * Upload the configuration to Zookeeper. + + + +{`$SOLR_INSTALL_HOME/server/scripts/cloud-scripts/zkcli.sh -cmd upconfig -zkhost $ZK_HOST:2181/solr -confname basic_configs -confdir $SOLR_INSTALL_HOME/server/solr/configsets/_default/conf`} + + + + + * Create the JAAS configuration. + + + +{`vi /etc/solr/conf/solr_jaas.conf +Client { + com.sun.security.auth.module.Krb5LoginModule required + useKeyTab=true + keyTab="/etc/security/keytabs/solr.keytab" + storeKey=true + useTicketCache=true + debug=true + principal="solr/@EXAMPLE.COM"; +};`} + + + + * Copy /etc/solr/conf/solr_jaas.conf to all hosts running Solr. + + * Edit solr.in.sh in $SOLR_INSTALL_HOME/bin/ + + + +{`vi $SOLR_INSTALL_HOME/bin/solr.in.sh +SOLR_JAAS_FILE=/etc/solr/conf/solr_jaas.conf +SOLR_HOST='hostname -f' +ZK_HOST="$ZK_HOST1:2181,$ZK_HOST2:2181,$ZK_HOST3:2181/solr" +KERBEROS_REALM="EXAMPLE.COM" +SOLR_KEYTAB=/etc/solr/conf/solr.keytab +SOLR_KERB_PRINCIPAL=HTTP@{KERBEROS_REALM} +SOLR_KERB_KEYTAB=/etc/solr/conf/HTTP.keytab +SOLR_AUTHENTICATION_CLIENT_CONFIGURER="org.apache.solr.client.solrj.impl.Krb5HttpClientConfigurer" +SOLR_AUTHENTICATION_OPTS=" -DauthenticationPlugin=org.apache.solr.security.KerberosPlugin -Djava.security.auth.login.config={SOLR_JAAS_FILE} -Dsolr.kerberos.principal={SOLR_KERB_PRINCIPAL} -Dsolr.kerberos.keytab={SOLR_KERB_KEYTAB} -Dsolr.kerberos.cookie.domain={SOLR_HOST} -Dhost={SOLR_HOST} -Dsolr.kerberos.name.rules=DEFAULT"`} + + + * Copy solr.in.sh to all hosts running Solr. + + * Set up Solr to use the Kerberos plugin by uploading the security.json. + + + +{`$SOLR_INSTALL_HOME/server/scripts/cloud-scripts/zkcli.sh -zkhost :2181 -cmd put /security.json '{"authentication":{"class": "org.apache.solr.security.KerberosPlugin"}}'`} + + + + * Start Solr. + + +{`$SOLR_INSTALL_HOME/bin/solr start -cloud -z $ZK_HOST1:2181,$ZK_HOST2:2181,$ZK_HOST3:2181 -noprompt`} + + + + * Test Solr + + + +{`kinit -k -t /etc/security/keytabs/HTTP.keytab HTTP/@EXAMPLE.COM +curl --negotiate -u : "http://:8983/solr/"`} + + + * Create collections in Solr corresponding to the indexes that Atlas uses and change the Atlas configuration to point to the Solr instance setup as described in the [Install Steps](InstallationSteps) diff --git a/docs/src/documents/Setup/BuildInstruction.md b/docs/src/documents/Setup/BuildInstruction.md new file mode 100644 index 000000000..925b13ae9 --- /dev/null +++ b/docs/src/documents/Setup/BuildInstruction.md @@ -0,0 +1,81 @@ +--- +name: Build Instruction +route: /Build-Installation +menu: Documentation +submenu: Setup +--- + +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + +## Building & Installing Apache Atlas + +### Building Apache Atlas +Download Apache Atlas 1.0.0 release sources, apache-atlas-1.0.0-sources.tar.gz, from the [downloads](http://atlas.apache.org/Downloads.html) page. +Then follow the instructions below to to build Apache Atlas. + + + + +{`tar xvfz apache-atlas-1.0.0-sources.tar.gz +cd apache-atlas-sources-1.0.0/ +export MAVEN_OPTS="-Xms2g -Xmx2g" +mvn clean -DskipTests install`} + + + +### Packaging Apache Atlas +To create Apache Atlas package for deployment in an environment having functional Apache HBase and Apache Solr instances, build with the following command: + + +mvn clean -DskipTests package -Pdist + + + * NOTES: + * Remove option '-DskipTests' to run unit and integration tests + * To build a distribution without minified js,css file, build with _skipMinify_ profile. By default js and css files are minified. + + +Above will build Apache Atlas for an environment having functional HBase and Solr instances. Apache Atlas needs to be setup with the following to run in this environment: + * Configure atlas.graph.storage.hostname (see "Graph persistence engine - HBase" in the [Configuration](Configuration) section). + * Configure atlas.graph.index.search.solr.zookeeper-url (see "Graph Search Index - Solr" in the [Configuration](Configuration) section). + * Set HBASE_CONF_DIR to point to a valid Apache HBase config directory (see "Graph persistence engine - HBase" in the [Configuration](Configuration) section). + * Create indices in Apache Solr (see "Graph Search Index - Solr" in the [Configuration](Configuration) section). + + +### Packaging Apache Atlas with embedded Apache HBase & Apache Solr +To create Apache Atlas package that includes Apache HBase and Apache Solr, build with the embedded-hbase-solr profile as shown below: + + +{`mvn clean -DskipTests package -Pdist,embedded-hbase-solr`} + + +Using the embedded-hbase-solr profile will configure Apache Atlas so that an Apache HBase instance and an Apache Solr instance will be started and stopped along with the Apache Atlas server. + +>NOTE: This distribution profile is only intended to be used for single node development not in production. + +### Packaging Apache Atlas with embedded Apache Cassandra & Apache Solr +To create Apache Atlas package that includes Apache Cassandra and Apache Solr, build with the embedded-cassandra-solr profile as shown below: + + +{`mvn clean package -Pdist,embedded-cassandra-solr`} + + +Using the embedded-cassandra-solr profile will configure Apache Atlas so that an Apache Cassandra instance and an Apache Solr instance will be started and stopped along with the Atlas server. + +>NOTE: This distribution profile is only intended to be used for single node development not in production. + +### Apache Atlas Package +Build will create following files, which are used to install Apache Atlas. + + + +{`distro/target/apache-atlas-{project.version}-bin.tar.gz +distro/target/apache-atlas-{project.version}-hbase-hook.tar.gz +distro/target/apache-atlas-{project.version}-hive-hook.gz +distro/target/apache-atlas-{project.version}-kafka-hook.gz +distro/target/apache-atlas-{project.version}-sources.tar.gz +distro/target/apache-atlas-{project.version}-sqoop-hook.tar.gz +distro/target/apache-atlas-{project.version}-storm-hook.tar.gz`} + diff --git a/docs/src/site/twiki/Configuration.twiki b/docs/src/documents/Setup/Configuration.md similarity index 62% rename from docs/src/site/twiki/Configuration.twiki rename to docs/src/documents/Setup/Configuration.md index 41e5c279b..26816119d 100644 --- a/docs/src/site/twiki/Configuration.twiki +++ b/docs/src/documents/Setup/Configuration.md @@ -1,211 +1,202 @@ ----+ Configuring Apache Atlas - Application Properties +--- +name: Configuration +route: /Configuration +menu: Documentation +submenu: Setup +--- +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + +# Configuring Apache Atlas - Application Properties All configuration in Atlas uses java properties style configuration. The main configuration file is atlas-application.properties which is in the *conf* dir at the deployed location. It consists of the following sections: ----++ Graph Configs +## Graph Configs ----+++ Graph Persistence engine - HBase -Set the following properties to configure JanusGraph to use HBase as the persistence engine. Please refer to -link for more details. +### Graph Persistence engine - HBase +Set the following properties to configure [JanusGraph](http://atlas.apache.org/JanusGraph.html) to use HBase as the persistence engine. Please refer to [link](http://docs.janusgraph.org/0.2.0/configuration.html#_hbase_caching) for more details. - -atlas.graph.storage.backend=hbase + +{`atlas.graph.storage.backend=hbase atlas.graph.storage.hostname= -atlas.graph.storage.hbase.table=atlas - +atlas.graph.storage.hbase.table=atlas`} + If any further JanusGraph configuration needs to be setup, please prefix the property name with "atlas.graph.". In addition to setting up configurations, please ensure that environment variable HBASE_CONF_DIR is setup to point to the directory containing HBase configuration file hbase-site.xml. ----+++ Graph Index Search Engine +### Graph Index Search Engine An index search engine is required for ATLAS. This search engine runs separately from the ATLAS server and from the storage backend. Only two search engines are currently supported: Solr and Elasticsearch. Pick the search engine best suited for your environment and follow the configuration instructions below. ----++++ Graph Search Index - Solr +#### Graph Search Index - Solr Solr installation in Cloud mode is a prerequisite for Apache Atlas use. Set the following properties to configure JanusGraph to use Solr as the index search engine. - -atlas.graph.index.search.backend=solr5 + +{`atlas.graph.index.search.backend=solr5 atlas.graph.index.search.solr.mode=cloud atlas.graph.index.search.solr.wait-searcher=true - # ZK quorum setup for solr as comma separated value. Example: 10.1.6.4:2181,10.1.6.5:2181 atlas.graph.index.search.solr.zookeeper-url= - # SolrCloud Zookeeper Connection Timeout. Default value is 60000 ms atlas.graph.index.search.solr.zookeeper-connect-timeout=60000 - # SolrCloud Zookeeper Session Timeout. Default value is 60000 ms -atlas.graph.index.search.solr.zookeeper-session-timeout=60000 - +atlas.graph.index.search.solr.zookeeper-session-timeout=60000`} + ----++++ Graph Search Index - Elasticsearch (Tech Preview) +#### Graph Search Index - Elasticsearch (Tech Preview) Elasticsearch is a prerequisite for Apache Atlas use. Set the following properties to configure JanusGraph to use Elasticsearch as the index search engine. - -atlas.graph.index.search.backend=elasticsearch + +{`atlas.graph.index.search.backend=elasticsearch atlas.graph.index.search.hostname= -atlas.graph.index.search.elasticsearch.client-only=true +atlas.graph.index.search.elasticsearch.client-only=true`} + ----++ Search Configs +## Search Configs Search APIs (DSL, basic search, full-text search) support pagination and have optional limit and offset arguments. Following configs are related to search pagination - -# Default limit used when limit is not specified in API + +{`# Default limit used when limit is not specified in API atlas.search.defaultlimit=100 - # Maximum limit allowed in API. Limits maximum results that can be fetched to make sure the atlas server doesn't run out of memory -atlas.search.maxlimit=10000 - +atlas.search.maxlimit=10000`} + ----++ Notification Configs +## Notification Configs Refer http://kafka.apache.org/documentation.html#configuration for Kafka configuration. All Kafka configs should be prefixed with 'atlas.kafka.' - + +{` atlas.kafka.auto.commit.enable=false - -# Kafka servers. Example: localhost:6667 +#Kafka servers. Example: localhost:6667 atlas.kafka.bootstrap.servers= - atlas.kafka.hook.group.id=atlas - -# Zookeeper connect URL for Kafka. Example: localhost:2181 +#Zookeeper connect URL for Kafka. Example: localhost:2181 atlas.kafka.zookeeper.connect= - atlas.kafka.zookeeper.connection.timeout.ms=30000 atlas.kafka.zookeeper.session.timeout.ms=60000 atlas.kafka.zookeeper.sync.time.ms=20 +#Setup the following configurations only in test deployments where Kafka is started within Atlas in embedded mode +#atlas.notification.embedded=true +#atlas.kafka.data={sys:atlas.home}/data/kafka +#Setup the following two properties if Kafka is running in Kerberized mode. +#atlas.notification.kafka.service.principal=kafka/_HOST@EXAMPLE.COM +#atlas.notification.kafka.keytab.location=/etc/security/keytabs/kafka.service.keytab`} + -# Setup the following configurations only in test deployments where Kafka is started within Atlas in embedded mode -# atlas.notification.embedded=true -# atlas.kafka.data=${sys:atlas.home}/data/kafka +## Client Configs -# Setup the following two properties if Kafka is running in Kerberized mode. -# atlas.notification.kafka.service.principal=kafka/_HOST@EXAMPLE.COM -# atlas.notification.kafka.keytab.location=/etc/security/keytabs/kafka.service.keytab - - ----++ Client Configs - -atlas.client.readTimeoutMSecs=60000 + +{`atlas.client.readTimeoutMSecs=60000 atlas.client.connectTimeoutMSecs=60000 - # URL to access Atlas server. For example: http://localhost:21000 -atlas.rest.address= - +atlas.rest.address=`} + ----++ Security Properties +## Security Properties ----+++ SSL config +### SSL config The following property is used to toggle the SSL feature. - + atlas.enableTLS=false - + ----++ High Availability Properties +## High Availability Properties The following properties describe High Availability related configuration options: - + +{` # Set the following property to true, to enable High Availability. Default = false. atlas.server.ha.enabled=true - # Specify the list of Atlas instances atlas.server.ids=id1,id2 # For each instance defined above, define the host and port on which Atlas server listens. atlas.server.address.id1=host1.company.com:21000 atlas.server.address.id2=host2.company.com:31000 - # Specify Zookeeper properties needed for HA. # Specify the list of services running Zookeeper servers as a comma separated list. atlas.server.ha.zookeeper.connect=zk1.company.com:2181,zk2.company.com:2181,zk3.company.com:2181 - # Specify how many times should connection try to be established with a Zookeeper cluster, in case of any connection issues. atlas.server.ha.zookeeper.num.retries=3 - # Specify how much time should the server wait before attempting connections to Zookeeper, in case of any connection issues. atlas.server.ha.zookeeper.retry.sleeptime.ms=1000 - # Specify how long a session to Zookeeper should last without inactiviy to be deemed as unreachable. atlas.server.ha.zookeeper.session.timeout.ms=20000 - # Specify the scheme and the identity to be used for setting up ACLs on nodes created in Zookeeper for HA. -# The format of these options is :. For more information refer to http://zookeeper.apache.org/doc/r3.2.2/zookeeperProgrammers.html#sc_ZooKeeperAccessControl. +# The format of these options is . +# For more information refer to +http://zookeeper.apache.org/doc/r3.2.2/zookeeperProgrammers.html#sc_ZooKeeperAccessControl # The 'acl' option allows to specify a scheme, identity pair to setup an ACL for. atlas.server.ha.zookeeper.acl=sasl:client@comany.com - # The 'auth' option specifies the authentication that should be used for connecting to Zookeeper. atlas.server.ha.zookeeper.auth=sasl:client@company.com - # Since Zookeeper is a shared service that is typically used by many components, # it is preferable for each component to set its znodes under a namespace. # Specify the namespace under which the znodes should be written. Default = /apache_atlas atlas.server.ha.zookeeper.zkroot=/apache_atlas - # Specify number of times a client should retry with an instance before selecting another active instance, or failing an operation. atlas.client.ha.retries=4 # Specify interval between retries for a client. -atlas.client.ha.sleep.interval.ms=5000 - +atlas.client.ha.sleep.interval.ms=5000`} + ----++ Server Properties - -# Set the following property to true, to enable the setup steps to run on each server start. Default = false. -atlas.server.run.setup.on.start=false - +## Server Properties + +{`# Set the following property to true, to enable the setup steps to run on each server start. Default = false. +atlas.server.run.setup.on.start=false`} + ----++ Performance configuration items +## Performance configuration items The following properties can be used to tune performance of Atlas under specific circumstances: - + +{` # The number of times Atlas code tries to acquire a lock (to ensure consistency) while committing a transaction. # This should be related to the amount of concurrency expected to be supported by the server. For e.g. with retries set to 10, upto 100 threads can concurrently create types in the Atlas system. # If this is set to a low value (default is 3), concurrent operations might fail with a PermanentLockingException. atlas.graph.storage.lock.retries=10 - # Milliseconds to wait before evicting a cached entry. This should be > atlas.graph.storage.lock.wait-time x atlas.graph.storage.lock.retries # If this is set to a low value (default is 10000), warnings on transactions taking too long will occur in the Atlas application log. atlas.graph.storage.cache.db-cache-time=120000 - # Minimum number of threads in the atlas web server atlas.webserver.minthreads=10 - # Maximum number of threads in the atlas web server atlas.webserver.maxthreads=100 - # Keepalive time in secs for the thread pool of the atlas web server atlas.webserver.keepalivetimesecs=60 - # Queue size for the requests(when max threads are busy) for the atlas web server atlas.webserver.queuesize=100 - # Set to the property to true to enable warn on no relationships defined between entities on a particular attribute # Not having relationships defined can lead to performance loss while adding new entities -atlas.relationships.warnOnNoRelationships=false - +atlas.relationships.warnOnNoRelationships=false`} + ----+++ Recording performance metrics +### Recording performance metrics To enable performance logs for various Atlas operations (like REST API calls, notification processing), setup the following in atlas-log4j.xml: - - - - - - - - - - - - - - + +{` + + + + + + + + + + + + `} + diff --git a/docs/src/site/twiki/EclipseSetup.twiki b/docs/src/documents/Setup/EclipseSetup.md similarity index 73% rename from docs/src/site/twiki/EclipseSetup.twiki rename to docs/src/documents/Setup/EclipseSetup.md index b9f1d5b46..1092e8319 100644 --- a/docs/src/site/twiki/EclipseSetup.twiki +++ b/docs/src/documents/Setup/EclipseSetup.md @@ -1,4 +1,15 @@ ----+ Tools required to build and run Apache Atlas on Eclipse +--- +name: Eclipse Setup +route: /EclipseSetup +menu: For Developers +submenu: Eclipse Setup +--- + +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + +# Tools required to build and run Apache Atlas on Eclipse These instructions are provided as-is. They worked at a point in time; other variants of software may work. These instructions may become stale if the build dependencies change. @@ -6,29 +17,32 @@ They have been shown to work on 19th of December 2016. To build, run tests, and debug Apache Atlas, the following software is required: -*Java* +**Java** * Download and install a 1.8 Java SDK * Set JAVA_HOME system environment variable to the installed JDK home directory * Add JAVA_HOME/bin directory to system PATH -*Python* +**Python** Atlas command line tools are written in Python. * Download and install Python version 2.7.7 * For Mac, we used 2.7.11 * Add Python home directory to system PATH -*Maven* + +**Maven** * Download and install Maven 3.3.9 * Set the environment variable M2_HOME to point to the maven install directory * Add M2_HOME/bin directory to system PATH e.g. C:\Users\IBM_ADMIN\Documents\Software\apache-maven-3.3.9\bin -*Git* + +**Git** * Install Git * Add git bin directory to the system PATH e.g. C:\Program Files (x86)\Git\bin -*Eclipse* - * Install Eclipse Neon (4.6) - * The non-EE Neon for iOS from eclipse.org has been proven to work here. - * Install the Scala IDE, TestNG, and m2eclipse-scala features/plugins as described below. -*Scala IDE Eclipse feature* +**Eclipse** +* Install Eclipse Neon (4.6) +* The non-EE Neon for iOS from eclipse.org has been proven to work here. +* Install the Scala IDE, TestNG, and m2eclipse-scala features/plugins as described below. + +**Scala IDE Eclipse feature** Some of the Atlas source code is written in the Scala programming language. The Scala IDE feature is required to compile Scala source code in Eclipse. * In Eclipse, choose Help - Install New Software.. * Click Add... to add an update site, and set Location to http://download.scala-ide.org/sdk/lithium/e44/scala211/stable/site @@ -37,7 +51,7 @@ Some of the Atlas source code is written in the Scala programming language. The * Set the Scala compiler to target the 1.7 JVM: Window - Preferences - Scala - Compiler, change target to 1.7 *TestNG Eclipse plug-in* -Atlas tests use the [[http://testng.org/doc/documentation-main.html][TestNG framework]], which is similar to JUnit. The TestNG plug-in is required to run TestNG tests from Eclipse. +Atlas tests use the [TestNG framework](http://testng.org/doc/documentation-main.html), which is similar to JUnit. The TestNG plug-in is required to run TestNG tests from Eclipse. * In Eclipse, choose Help - Install New Software.. * Click Add... to add an update site, and set Location to http://beust.com/eclipse-old/eclipse_6.9.9.201510270734 * Choose TestNG and continue with install @@ -54,9 +68,12 @@ Atlas tests use the [[http://testng.org/doc/documentation-main.html][TestNG fram a. File - Import - Maven - Existing Maven Projects b. Browse to your Atlas folder c. Uncheck the root project and non-Java projects such as dashboardv2, docs and distro, then click Finish On the Mac, the Maven import fails with message - -"Cannot complete the install because one or more required items could not be found. Software being installed: Maven Integration for AJDT (Optional) 0.14.0.201506231302 (org.maven.ide.eclipse.ajdt.feature.feature.group 0.14.0.201506231302) Missing requirement: Maven Integration for AJDT (Optional) 0.14.0.201506231302 (org.maven.ide.eclipse.ajdt.feature.feature.group 0.14.0.201506231302) requires 'org.eclipse.ajdt.core 1.5.0' but it could not be found". - + + +{`"Cannot complete the install because one or more required items could not be found. +Software being installed: Maven Integration for AJDT (Optional) 0.14.0.201506231302 (org.maven.ide.eclipse.ajdt.feature.feature.group 0.14.0.201506231302) +Missing requirement: Maven Integration for AJDT (Optional) 0.14.0.201506231302 (org.maven.ide.eclipse.ajdt.feature.feature.group 0.14.0.201506231302) requires 'org.eclipse.ajdt.core 1.5.0' but it could not be found".`} + Install http://download.eclipse.org/tools/ajdt/46/dev/update and rerun. The Maven AspectJ should plugin install - allowing the references to Aspects in Maven to be resolved. @@ -86,21 +103,23 @@ You should now have a clean workspace. You will need to change some of these scripts to point to your installation targets. * Run this script to setup your command line build environment - -#!/bin/bash # export JAVA_HOME=/Library/Java/JavaVirtualMachines/macosxx6480sr3fp10hybrid-20160719_01-sdk + + +{`#!/bin/bash # export JAVA_HOME=/Library/Java/JavaVirtualMachines/macosxx6480sr3fp10hybrid-20160719_01-sdk export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home export M2_HOME=/Applications/apache-maven-3.3.9 # Git is installed in the system path export PYTHON_HOME='/Applications/Python 2.7' export PATH=$PYTHON_HOME:$M2_HOME/bin:$JAVA_HOME/bin:$PATH -export MAVEN_OPTS="-Xmx1536m -Drat.numUnapprovedLicenses=100" - +export MAVEN_OPTS="-Xmx1536m -Drat.numUnapprovedLicenses=100"`} + * If you do not want to set Java 8 as your system java, you can use this bash script to setup the environment and run Eclipse (which you can drop in Applications and rename to neon). - -#!/bin/bash + + +{`#!/bin/bash export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home export M2_HOME=/Applications/apache-maven-3.3.9 # Git is installed in the system path export PYTHON_HOME='/Applications/Python 2.7' -export PATH=$PYTHON_HOME:$M2_HOME/bin:$JAVA_HOME/bin:$PATH/Applications/neon.app/Contents/MacOS/eclipse - +export PATH=$PYTHON_HOME:$M2_HOME/bin:$JAVA_HOME/bin:$PATH/Applications/neon.app/Contents/MacOS/eclipse`} + diff --git a/docs/src/documents/Setup/InstallationInstruction.md b/docs/src/documents/Setup/InstallationInstruction.md new file mode 100644 index 000000000..d6aea1e2b --- /dev/null +++ b/docs/src/documents/Setup/InstallationInstruction.md @@ -0,0 +1,327 @@ +--- +name: Installation Instruction +route: /Installation +menu: Documentation +submenu: Setup +--- + + +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + + +### Installing & Running Apache Atlas + +#### Installing Apache Atlas +From the directory you would like Apache Atlas to be installed, run the following commands: + + +{`tar -xzvf apache-atlas-{project.version}-server.tar.gz +cd atlas-{project.version}`} + + +#### Running Apache Atlas with Local Apache HBase & Apache Solr +To run Apache Atlas with local Apache HBase & Apache Solr instances that are started/stopped along with Atlas start/stop, run following commands: + + +{`export MANAGE_LOCAL_HBASE=true +export MANAGE_LOCAL_SOLR=true +bin/atlas_start.py`} + + +#### Using Apache Atlas + + * To verify if Apache Atlas server is up and running, run curl command as shown below: + + {`curl -u username:password http://localhost:21000/api/atlas/admin/version + {"Description":"Metadata Management and Data Governance Platform over Hadoop","Version":"1.0.0","Name":"apache-atlas"}`} + + + * Run quick start to load sample model and data + + + {`bin/quick_start.py +Enter username for atlas :- +Enter password for atlas :-`} + + + * Access Apache Atlas UI using a browser: http://localhost:21000 + +#### Stopping Apache Atlas Server +To stop Apache Atlas, run following command: + + +{`bin/atlas_stop.py`} + + + +### Configuring Apache Atlas +By default config directory used by Apache Atlas is _{package dir}/conf_. To override this set environment variable ATLAS_CONF to the path of the conf dir. + +Environment variables needed to run Apache Atlas can be set in _atlas-env.sh_ file in the conf directory. This file will be sourced by Apache Atlas scripts before any commands are executed. The following environment variables are available to set. + + +{`# The java implementation to use. If JAVA_HOME is not found we expect java and jar to be in path +#export JAVA_HOME= + +# any additional java opts you want to set. This will apply to both client and server operations +#export ATLAS_OPTS= + +# any additional java opts that you want to set for client only +#export ATLAS_CLIENT_OPTS= + +# java heap size we want to set for the client. Default is 1024MB +#export ATLAS_CLIENT_HEAP= + +# any additional opts you want to set for atlas service. +#export ATLAS_SERVER_OPTS= + +# java heap size we want to set for the atlas server. Default is 1024MB +#export ATLAS_SERVER_HEAP= + +# What is is considered as atlas home dir. Default is the base location of the installed software +#export ATLAS_HOME_DIR= + +# Where log files are stored. Defatult is logs directory under the base install location +#export ATLAS_LOG_DIR= + +# Where pid files are stored. Defatult is logs directory under the base install location +#export ATLAS_PID_DIR= + +# Where do you want to expand the war file. By Default it is in /server/webapp dir under the base install dir. +#export ATLAS_EXPANDED_WEBAPP_DIR=`} + + +*Settings to support large number of metadata objects* + +If you plan to store large number of metadata objects, it is recommended that you use values tuned for better GC performance of the JVM. + +The following values are common server side options: + + +{`export ATLAS_SERVER_OPTS="-server -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+PrintTenuringDistribution -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=dumps/atlas_server.hprof -Xloggc:logs/gc-worker.log -verbose:gc -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=1m -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintGCTimeStamps"`} + + +The `-XX:SoftRefLRUPolicyMSPerMB` option was found to be particularly helpful to regulate GC performance for query heavy workloads with many concurrent users. + +The following values are recommended for JDK 8: + + +export ATLAS_SERVER_HEAP="-Xms15360m -Xmx15360m -XX:MaxNewSize=5120m -XX:MetaspaceSize=100M -XX:MaxMetaspaceSize=512m" + + +*NOTE for Mac OS users* +If you are using a Mac OS, you will need to configure the ATLAS_SERVER_OPTS (explained above). + +In _{package dir}/conf/atlas-env.sh_ uncomment the following line + +{`export ATLAS_SERVER_OPTS=`} + + +and change it to look as below + + +{`export ATLAS_SERVER_OPTS="-Djava.awt.headless=true -Djava.security.krb5.realm= -Djava.security.krb5.kdc="`} + + +#### Configuring Apache HBase as the storage backend for the Graph Repository + +By default, Apache Atlas uses JanusGraph as the graph repository and is the only graph repository implementation available currently. Apache HBase versions currently supported are 1.1.x. For configuring Apache Atlas graph persistence on Apache HBase, please see "Graph persistence engine - HBase" in the [Configuration](Configuration) section for more details. + +Apache HBase tables used by Apache Atlas can be set using the following configurations: + + +{`atlas.graph.storage.hbase.table=atlas +atlas.audit.hbase.tablename=apache_atlas_entity_audit`} + + +#### Configuring Apache Solr as the indexing backend for the Graph Repository + +By default, Apache Atlas uses JanusGraph as the graph repository and is the only graph repository implementation available currently. For configuring JanusGraph to work with Apache Solr, please follow the instructions below + + * Install Apache Solr if not already running. The version of Apache Solr supported is 5.5.1. Could be installed from http://archive.apache.org/dist/lucene/solr/5.5.1/solr-5.5.1.tgz + + * Start Apache Solr in cloud mode. + +SolrCloud mode uses a ZooKeeper Service as a highly available, central location for cluster management. For a small cluster, running with an existing ZooKeeper quorum should be fine. For larger clusters, you would want to run separate multiple ZooKeeper quorum with at least 3 servers. + Note: Apache Atlas currently supports Apache Solr in "cloud" mode only. "http" mode is not supported. For more information, refer Apache Solr documentation - https://cwiki.apache.org/confluence/display/solr/SolrCloud + + * For e.g., to bring up an Apache Solr node listening on port 8983 on a machine, you can use the command: + + {`$SOLR_HOME/bin/solr start -c -z -p 8983`} + + + * Run the following commands from SOLR_BIN (e.g. $SOLR_HOME/bin) directory to create collections in Apache Solr corresponding to the indexes that Apache Atlas uses. In the case that the Apache Atlas and Apache Solr instances are on 2 different hosts, first copy the required configuration files from ATLAS_HOME/conf/solr on the Apache Atlas instance host to Apache Solr instance host. SOLR_CONF in the below mentioned commands refer to the directory where Apache Solr configuration files have been copied to on Apache Solr host: + + + {`$SOLR_BIN/solr create -c vertex_index -d SOLR_CONF -shards #numShards -replicationFactor #replicationFactor +$SOLR_BIN/solr create -c edge_index -d SOLR_CONF -shards #numShards -replicationFactor #replicationFactor +$SOLR_BIN/solr create -c fulltext_index -d SOLR_CONF -shards #numShards -replicationFactor #replicationFactor`} + + + Note: If numShards and replicationFactor are not specified, they default to 1 which suffices if you are trying out solr with ATLAS on a single node instance. + Otherwise specify numShards according to the number of hosts that are in the Solr cluster and the maxShardsPerNode configuration. + The number of shards cannot exceed the total number of Solr nodes in your !SolrCloud cluster. + + The number of replicas (replicationFactor) can be set according to the redundancy required. + + Also note that Apache Solr will automatically be called to create the indexes when Apache Atlas server is started if the + SOLR_BIN and SOLR_CONF environment variables are set and the search indexing backend is set to 'solr5'. + + * Change ATLAS configuration to point to Apache Solr instance setup. Please make sure the following configurations are set to the below values in ATLAS_HOME/conf/atlas-application.properties + + +{`atlas.graph.index.search.backend=solr +atlas.graph.index.search.solr.mode=cloud +atlas.graph.index.search.solr.zookeeper-url= eg: 10.1.6.4:2181,10.1.6.5:2181 +atlas.graph.index.search.solr.zookeeper-connect-timeout=. Default value is 60000 ms +atlas.graph.index.search.solr.zookeeper-session-timeout=. Default value is 60000 ms`} + + +For more information on JanusGraph solr configuration , please refer http://docs.janusgraph.org/0.2.0/solr.html + +Pre-requisites for running Apache Solr in cloud mode + * Memory - Apache Solr is both memory and CPU intensive. Make sure the server running Apache Solr has adequate memory, CPU and disk. + Apache Solr works well with 32GB RAM. Plan to provide as much memory as possible to Apache Solr process + * Disk - If the number of entities that need to be stored are large, plan to have at least 500 GB free space in the volume where Apache Solr is going to store the index data + * !SolrCloud has support for replication and sharding. It is highly recommended to use !SolrCloud with at least two Apache Solr nodes running on different servers with replication enabled. + If using !SolrCloud, then you also need !ZooKeeper installed and configured with 3 or 5 !ZooKeeper nodes + +*Configuring Elasticsearch as the indexing backend for the Graph Repository (Tech Preview)* + +By default, Apache Atlas uses [JanusGraph](https://atlas.apache.org/JanusGraph.html) as the graph repository and is the only graph repository implementation available currently. For configuring [JanusGraph](https://atlas.apache.org/JanusGraph.html) to work with Elasticsearch, please follow the instructions below + + * Install an Elasticsearch cluster. The version currently supported is 5.6.4, and can be acquired from: https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.4.tar.gz + + * For simple testing a single Elasticsearch node can be started by using the 'elasticsearch' command in the bin directory of the Elasticsearch distribution. + + * Change Apache Atlas configuration to point to the Elasticsearch instance setup. Please make sure the following configurations are set to the below values in ATLAS_HOME/conf/atlas-application.properties + +{`atlas.graph.index.search.backend=elasticsearch +atlas.graph.index.search.hostname= +atlas.graph.index.search.elasticsearch.client-only=true`} + + +For more information on JanusGraph configuration for elasticsearch, please refer http://docs.janusgraph.org/0.2.0/elasticsearch.html + +#### Configuring Kafka Topics + +Apache Atlas uses Apache Kafka to ingest metadata from other components at runtime. This is described in the [[Architecture][Architecture page]] +in more detail. Depending on the configuration of Apache Kafka, sometimes you might need to setup the topics explicitly before +using Apache Atlas. To do so, Apache Atlas provides a script =bin/atlas_kafka_setup.py= which can be run from Apache Atlas server. In some +environments, the hooks might start getting used first before Apache Atlas server itself is setup. In such cases, the topics +can be run on the hosts where hooks are installed using a similar script `hook-bin/atlas_kafka_setup_hook.py`. Both these +use configuration in `atlas-application.properties` for setting up the topics. Please refer to the [[Configuration][Configuration page]] +for these details. + +#### Setting up Apache Atlas +There are a few steps that setup dependencies of Apache Atlas. One such example is setting up the JanusGraph schema in the storage backend of choice. In a simple single server setup, these are automatically setup with default configuration when the server first accesses these dependencies. + +However, there are scenarios when we may want to run setup steps explicitly as one time operations. For example, in a multiple server scenario using [High Availability](HighAvailability), it is preferable to run setup steps from one of the server instances the first time, and then start the services. + +To run these steps one time, execute the command =bin/atlas_start.py -setup= from a single Apache Atlas server instance. + +However, Apache Atlas server does take care of parallel executions of the setup steps. Also, running the setup steps multiple times is idempotent. Therefore, if one chooses to run the setup steps as part of server startup, for convenience, then they should enable the configuration option `atlas.server.run.setup.on.start` by defining it with the value `true` in the `atlas-application.properties` file. + +### Examples: calling Apache Atlas REST APIs +Here are few examples of calling Apache Atlas REST APIs via curl command. + * List the types in the repository + + + {`curl -u username:password http://localhost:21000/api/atlas/v2/types/typedefs/headers + [ {"guid":"fa421be8-c21b-4cf8-a226-fdde559ad598","name":"Referenceable","category":"ENTITY"}, + {"guid":"7f3f5712-521d-450d-9bb2-ba996b6f2a4e","name":"Asset","category":"ENTITY"}, + {"guid":"84b02fa0-e2f4-4cc4-8b24-d2371cd00375","name":"DataSet","category":"ENTITY"}, + {"guid":"f93975d5-5a5c-41da-ad9d-eb7c4f91a093","name":"Process","category":"ENTITY"}, + {"guid":"79dcd1f9-f350-4f7b-b706-5bab416f8206","name":"Infrastructure","category":"ENTITY"} + ]`} + + + * List the instances for a given type + + + {`curl -u username:password http://localhost:21000/api/atlas/v2/search/basic?typeName=hive_db + { + "queryType":"BASIC", + "searchParameters":{ + "typeName":"hive_db", + "excludeDeletedEntities":false, + "includeClassificationAttributes":false, + "includeSubTypes":true, + "includeSubClassifications":true, + "limit":100, + "offset":0 + }, + "entities":[ + { + "typeName":"hive_db", + "guid":"5d900c19-094d-4681-8a86-4eb1d6ffbe89", + "status":"ACTIVE", + "displayText":"default", + "classificationNames":[], + "attributes":{ + "owner":"public", + "createTime":null, + "qualifiedName":"default@cl1", + "name":"default", + "description":"Default Hive database" + } + }, + { + "typeName":"hive_db", + "guid":"3a0b14b0-ab85-4b65-89f2-e418f3f7f77c", + "status":"ACTIVE", + "displayText":"finance", + "classificationNames":[], + "attributes":{ + "owner":"hive", + "createTime":null, + "qualifiedName":"finance@cl1", + "name":"finance", + "description":null + } + } + ] + }`} + + + * Search for entities + + + {`curl -u username:password http://localhost:21000/api/atlas/v2/search/dsl?query=hive_db%20where%20name='default' + { + "queryType":"DSL", + "queryText":"hive_db where name='default'", + "entities":[ + { + "typeName":"hive_db", + "guid":"5d900c19-094d-4681-8a86-4eb1d6ffbe89", + "status":"ACTIVE", + "displayText":"default", + "classificationNames":[], + "attributes":{ + "owner":"public", + "createTime":null, + "qualifiedName":"default@cl1", + "name":"default", + "description": + "Default Hive database" + } + } + ] + }`} + + + +### Troubleshooting + +#### Setup issues +If the setup of Apache Atlas service fails due to any reason, the next run of setup (either by an explicit invocation of +`atlas_start.py -setup` or by enabling the configuration option `atlas.server.run.setup.on.start`) will fail with +a message such as `A previous setup run may not have completed cleanly.`. In such cases, you would need to manually +ensure the setup can run and delete the Zookeeper node at `/apache_atlas/setup_in_progress` before attempting to +run setup again. + +If the setup failed due to Apache HBase schema setup errors, it may be necessary to repair Apache HBase schema. If no +data has been stored, one can also disable and drop the Apache HBase tables used by Apache Atlas and run setup again. diff --git a/docs/src/site/twiki/QuickStart.twiki b/docs/src/documents/Setup/QuickStart.md similarity index 52% rename from docs/src/site/twiki/QuickStart.twiki rename to docs/src/documents/Setup/QuickStart.md index dd648d0ea..bcf29c4cf 100644 --- a/docs/src/site/twiki/QuickStart.twiki +++ b/docs/src/documents/Setup/QuickStart.md @@ -1,27 +1,37 @@ ----+ Quick Start +--- +name: Quick Start +route: /QuickStart +menu: Documentation +submenu: Setup +--- +import Img from 'theme/components/shared/Img' ----++ Introduction + +# Quick Start + +## Introduction Quick start is a simple client that adds a few sample type definitions modeled after the example shown below. It also adds sample entities along with traits as shown in the instance graph below. ----+++ Example Type Definitions +### Example Type Definitions - + ----+++ Example Instance Graph +### Example Instance Graph - + ----++ Running the example +## Running the example This will add sample types and instances along with traits as shown in the instance graph above. * bin/quick-start.sh ----++ Dashboard +## Dashboard A simple dashboard with search is available. * http://localhost:21000/ + diff --git a/docs/src/documents/Tools/AtlasRepairIndex.md b/docs/src/documents/Tools/AtlasRepairIndex.md new file mode 100644 index 000000000..416d58a89 --- /dev/null +++ b/docs/src/documents/Tools/AtlasRepairIndex.md @@ -0,0 +1,78 @@ +--- +name: Atlas Repair Index +route: /AtlasRepairIndex +menu: Documentation +submenu: Tools +--- + +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + +# Atlas Repair Index + +## Introduction + +The document describes the use of the Atlas Index Repair Utility for JanusGraph, with HBase as back-end data store and Solr as index store. + +#### Need for this Tool +In rare, cases it is possible that during entity creation, the entity is stored in the data store, but the corresponding indexes are not created in Solr. Since Atlas relies heavily on Solr in the operation of its Basic Search, this will result in entity not being returned by a search. Note that Advanced Search is not affected by this. + +#### Location +The tool is part of the normal Atlas installation, it is located under the tools/atlas-index-repair directory. + +#### Steps to Execute Tool + +##### Complete Restore + +If the user needs to restore all the indexes, this can be accomplished by executing the tool with no command-line parameters: + + +atlas-index-repair/repair_index.py + + +This will result in vertex_index, edge_index and fulltext_index to be re-built completely. It is recommended that existing contents of these indexes be deleted before executing this restore. + +###### Caveats +Note that the full index repair is a time consuming process. Depending on the size of data the process may take days to complete. During the restore process the Basic Search functionality will not be available. Be sure to allocate sufficient time for this activity. + +##### Selective Restore + +To perform selective restore for an Atlas entity, specify the GUID of that entity: + + +{`atlas-index-repair/repair_index.py [-g \]`} + + +Example: + + +atlas-index-repair/repair_index.py -g 13d77457-2a45-4e92-ad53-a172c7cb70a5 + + +Note that Atlas will use REST APIs to fetch the entity, which will need correct authentication mechanism to be specified based on the installation. + +For an Atlas installation with username and password use: + + +{`atlas-index-repair/repair_index.py [-g \] [-u \] [-p \]`} + + +* guid: [optional] specify guid for which indexes are to be updated +* user: [optional] specify username for atlas instance +* password: [optional] specify password for atlas instance + +Example: + +{`atlas-index-repair/repair_index.py -u admin -p admin123 -g + 13d77457-2a45-4e92-ad53-a172c7cb70a5`} + + +For Atlas installation that uses kerberos as authentication mode, +use: kinit -kt /etc/security/keytabs/atlas.service.keytab atlas/fqdn@DOMAIN + +Example: + +{`kinit -kt /etc/security/keytabs/atlas.service.keytab atlas/fqdn@EXAMPLE.com + atlas-index-repair/repair_index.py -g 13d77457-2a45-4e92-ad53-a172c7cb70a5`} + diff --git a/docs/src/site/twiki/TypeSystem.twiki b/docs/src/documents/TypeSystem.md old mode 100755 new mode 100644 similarity index 72% rename from docs/src/site/twiki/TypeSystem.twiki rename to docs/src/documents/TypeSystem.md index dbaea3188..03adcc426 --- a/docs/src/site/twiki/TypeSystem.twiki +++ b/docs/src/documents/TypeSystem.md @@ -1,23 +1,32 @@ ----+ Type System +--- +name: Type System +route: /TypeSystem +menu: Documentation +submenu: Features +--- ----++ Overview +import themen from 'theme/styles/styled-colors'; +import * as theme from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import SyntaxHighlighter from 'react-syntax-highlighter'; + + +# Type System + +## Overview Atlas allows users to define a model for the metadata objects they want to manage. The model is composed of definitions called ‘types’. Instances of ‘types’ called ‘entities’ represent the actual metadata objects that are managed. The Type System is a component that allows users to define and manage the types and entities. All metadata objects managed by Atlas out of the box (like Hive tables, for e.g.) are modelled using types and represented as entities. To store new types of metadata in Atlas, one needs to understand the concepts of the type system component. ----++ Types -A ‘Type’ in Atlas is a definition of how a particular type of metadata objects are stored and accessed. A type -represents one or a collection of attributes that define the properties for the metadata object. Users with a -development background will recognize the similarity of a type to a ‘Class’ definition of object oriented programming -languages, or a ‘table schema’ of relational databases. +## Types +A Type in Atlas is a definition of how a particular type of metadata objects are stored and accessed. A type represents one or a collection of attributes that define the properties for the metadata object. Users with a development background will recognize the similarity of a type to a ‘Class’ definition of object oriented programming languages, or a ‘table schema’ of relational databases. An example of a type that comes natively defined with Atlas is a Hive table. A Hive table is defined with these attributes: - -Name: hive_table + +{`Name: hive_table TypeCategory: Entity SuperTypes: DataSet Attributes: @@ -32,11 +41,12 @@ Attributes: partitionKeys: array aliases: array columns: array - parameters: map + parameters: map viewOriginalText: string viewExpandedText: string tableType: string - temporary: boolean + temporary: boolean`} + The following points can be noted from the above example: @@ -52,36 +62,44 @@ The following points can be noted from the above example: * In this example, hive_table.name is a String, hive_table.aliases is an array of Strings, hive_table.db refers to an instance of a type called hive_db and so on. * Type references in attributes, (like hive_table.db) are particularly interesting. Note that using such an attribute, we can define arbitrary relationships between two types defined in Atlas and thus build rich models. Note that one can also collect a list of references as an attribute type (e.g. hive_table.columns which represents a list of references from hive_table to hive_column type) ----++ Entities -An ‘entity’ in Atlas is a specific value or instance of an Entity ‘type’ and thus represents a specific metadata object -in the real world. Referring back to our analogy of Object Oriented Programming languages, an ‘instance’ is an -‘Object’ of a certain ‘Class’. +## Entities +An ‘entity’ in Atlas is a specific value or instance of an Entity ‘type’ and thus represents a specific metadata object in the real world. Referring back to our analogy of Object Oriented Programming languages, an ‘instance’ is an‘Object’ of a certain ‘Class’. -An example of an entity will be a specific Hive Table. Say Hive has a table called ‘customers’ in the ‘default’ -database. This table will be an ‘entity’ in Atlas of type hive_table. By virtue of being an instance of an entity -type, it will have values for every attribute that are a part of the Hive table ‘type’, such as: +An example of an entity will be a specific Hive Table. Say Hive has a table called ‘customers’ in the ‘default’database. This table will be an ‘entity’ in Atlas of type hive_table. By virtue of being an instance of an entity type, it will have values for every attribute that are a part of the Hive table ‘type’, such as: - -guid: "9ba387dd-fa76-429c-b791-ffc338d3c91f" + + +{`guid: "9ba387dd-fa76-429c-b791-ffc338d3c91f" typeName: "hive_table" status: "ACTIVE" values: name: “customers” - db: { "guid": "b42c6cfc-c1e7-42fd-a9e6-890e0adf33bc", "typeName": "hive_db" } + db: { "guid": "b42c6cfc-c1e7-42fd-a9e6-890e0adf33bc", + "typeName": "hive_db" + } owner: “admin” createTime: 1490761686029 updateTime: 1516298102877 comment: null retention: 0 - sd: { "guid": "ff58025f-6854-4195-9f75-3a3058dd8dcf", "typeName": "hive_storagedesc" } + sd: { "guid": "ff58025f-6854-4195-9f75-3a3058dd8dcf", + "typeName": + "hive_storagedesc" + } partitionKeys: null aliases: null - columns: [ { "guid": ""65e2204f-6a23-4130-934a-9679af6a211f", "typeName": "hive_column" }, { "guid": ""d726de70-faca-46fb-9c99-cf04f6b579a6", "typeName": "hive_column" }, ...] + columns: [ { "guid": "65e2204f-6a23-4130-934a-9679af6a211f", + "typeName": "hive_column" }, + { "guid": "d726de70-faca-46fb-9c99-cf04f6b579a6", + "typeName": "hive_column" }, + ... + ] parameters: { "transient_lastDdlTime": "1466403208"} viewOriginalText: null viewExpandedText: null tableType: “MANAGED_TABLE” - temporary: false + temporary: false`} + The following points can be noted from the example above: @@ -92,25 +110,23 @@ The following points can be noted from the example above: * The values of this entity are a map of all the attribute names and their values for attributes that are defined in the hive_table type definition. * Attribute values will be according to the datatype of the attribute. Entity-type attributes will have value of type AtlasObjectId -With this idea on entities, we can now see the difference between Entity and Struct metatypes. Entities and Structs -both compose attributes of other types. However, instances of Entity types have an identity (with a GUID value) and can -be referenced from other entities (like a hive_db entity is referenced from a hive_table entity). Instances of Struct -types do not have an identity of their own. The value of a Struct type is a collection of attributes that are -‘embedded’ inside the entity itself. +With this idea on entities, we can now see the difference between Entity and Struct metatypes. Entities and Structs both compose attributes of other types. However, instances of Entity types have an identity (with a GUID value) and can be referenced from other entities (like a hive_db entity is referenced from a hive_table entity). Instances of Struct types do not have an identity of their own. The value of a Struct type is a collection of attributes that are 'embedded' inside the entity itself. ----++ Attributes +## Attributes We already saw that attributes are defined inside metatypes like Entity, Struct, Classification and Relationship. But we implistically referred to attributes as having a name and a metatype value. However, attributes in Atlas have some more properties that define more concepts related to the type system. An attribute has the following properties: - - name: string, - typeName: string, - isOptional: boolean, - isIndexable: boolean, - isUnique: boolean, - cardinality: enum + + +{`name: string, +typeName: string, +isOptional: boolean, +isIndexable: boolean, +isUnique: boolean, +cardinality: enum`} + The properties above have the following meanings: @@ -130,57 +146,61 @@ The properties above have the following meanings: Using the above, let us expand on the attribute definition of one of the attributes of the hive table below. Let us look at the attribute called ‘db’ which represents the database to which the hive table belongs: - -db: + + +{`db: "name": "db", "typeName": "hive_db", "isOptional": false, "isIndexable": true, "isUnique": false, - "cardinality": "SINGLE" + "cardinality": "SINGLE"`} + Note the “isOptional=true” constraint - a table entity cannot be created without a db reference. - -columns: + + +{`columns: "name": "columns", "typeName": "array", "isOptional": optional, "isIndexable": true, “isUnique": false, - "constraints": [ { "type": "ownedRef" } ] + "constraints": [ { "type": "ownedRef" } ]`} + -Note the “ownedRef” constraint for columns. By doing this, we are indicating that the defined column entities should +> Note: The “ownedRef” constraint for columns. By doing this, we are indicating that the defined column entities should always be bound to the table entity they are defined with. From this description and examples, you will be able to realize that attribute definitions can be used to influence specific modelling behavior (constraints, indexing, etc) to be enforced by the Atlas system. ----++ System specific types and their significance +## System specific types and their significance Atlas comes with a few pre-defined system types. We saw one example (DataSet) in preceding sections. In this section we will see more of these types and understand their significance. -*Referenceable*: This type represents all entities that can be searched for using a unique attribute called +**Referenceable**: This type represents all entities that can be searched for using a unique attribute called qualifiedName. -*Asset*: This type extends Referenceable and adds attributes like name, description and owner. Name is a required +**Asset**: This type extends Referenceable and adds attributes like name, description and owner. Name is a required attribute (isOptional=false), the others are optional. The purpose of Referenceable and Asset is to provide modellers with way to enforce consistency when defining and querying entities of their own types. Having these fixed set of attributes allows applications and user interfaces to make convention based assumptions about what attributes they can expect of types by default. -*Infrastructure*: This type extends Asset and typically can be used to be a common super type for infrastructural +**Infrastructure**: This type extends Asset and typically can be used to be a common super type for infrastructural metadata objects like clusters, hosts etc. -*!DataSet*: This type extends Asset. Conceptually, it can be used to represent a type that stores data. In Atlas, +**DataSet**: This type extends Referenceable. Conceptually, it can be used to represent an type that stores data. In Atlas, hive tables, hbase_tables etc are all types that extend from !DataSet. Types that extend !DataSet can be expected to have a Schema in the sense that they would have an attribute that defines attributes of that dataset. For e.g. the columns attribute in a hive_table. Also entities of types that extend !DataSet participate in data transformation and this transformation can be captured by Atlas via lineage (or provenance) graphs. -*Process*: This type extends Asset. Conceptually, it can be used to represent any data transformation operation. For +**Process**: This type extends Asset. Conceptually, it can be used to represent any data transformation operation. For example, an ETL process that transforms a hive table with raw data to another hive table that stores some aggregate can be a specific type that extends the Process type. A Process type has two specific attributes, inputs and outputs. Both inputs and outputs are arrays of !DataSet entities. Thus an instance of a Process type can use these inputs and outputs -to capture how the lineage of a !DataSet evolves. +to capture how the lineage of a !DataSet evolves. \ No newline at end of file diff --git a/docs/src/site/markdown/WhatsNew-1.0.md b/docs/src/documents/Whats-New/WhatsNew-1.0.md similarity index 73% rename from docs/src/site/markdown/WhatsNew-1.0.md rename to docs/src/documents/Whats-New/WhatsNew-1.0.md index 17b687316..5224603fd 100644 --- a/docs/src/site/markdown/WhatsNew-1.0.md +++ b/docs/src/documents/Whats-New/WhatsNew-1.0.md @@ -1,21 +1,10 @@ - - +--- +name: WhatsNew-1.0 +route: /WhatsNew-1.0 +menu: Downloads +submenu: Whats New +--- + # What's new in Apache Atlas 1.0? ## Features @@ -27,7 +16,7 @@ * Introduction of V2 style notifications * Introduction of Atlas hook for HBase * Support for Cassandra and Elasticsearch (tech-preview) - + ## Updates * Graph store has been updated from Titan 0.5.4 to JanusGraph 0.2.0 @@ -45,10 +34,10 @@ releases. More DSL related changes can be found [here](Search-Advanced.html). * When filtering or narrowing results using string attribute, the value **MUST** be enclosed in double quotes * Table name="Table1" * Table where name="Table1" - * Join queries are no longer supported e.g. hive_table, hive_db + * Join queries are no longer supported e.g. hive_table, hive_db * Select clauses only work with immediate entity attributes or a single referred (entity) type. * Table select name, owner - * Table select Columns + * Table select Columns * Table select name, owner, Columns _*(won't work)*_ * OrderBy clause can only be used with a _*single primitive*_ attribute. * GroupBy clause can only be used with a _*single primitive*_ attribute. @@ -70,4 +59,4 @@ releases. More DSL related changes can be found [here](Search-Advanced.html). * Aggregator clause can't be repeated with different _*primitive attribute*_, the clause appearing last would take preference. * Table select min(name), min(createTime) will ignore _*min(name)*_ * Limit and offset are not applicable when using aggregator clauses (min, max, sum) - * Table select min(name) limit 10 offset 5 - min(name) is computed over **ALL** entities of type Asset \ No newline at end of file + * Table select min(name) limit 10 offset 5 - min(name) is computed over **ALL** entities of type Asset diff --git a/docs/src/site/markdown/WhatsNew-2.0.md b/docs/src/documents/Whats-New/WhatsNew-2.0.md similarity index 51% rename from docs/src/site/markdown/WhatsNew-2.0.md rename to docs/src/documents/Whats-New/WhatsNew-2.0.md index d88d1a41d..724e8ab31 100644 --- a/docs/src/site/markdown/WhatsNew-2.0.md +++ b/docs/src/documents/Whats-New/WhatsNew-2.0.md @@ -1,52 +1,41 @@ - - +--- +name: WhatsNew-2.0 +route: /WhatsNew-2.0 +menu: Downloads +submenu: Whats New +--- + # What's new in Apache Atlas 2.0? ## Features -* Soft-reference attribute implementation +* Soft-reference attribute implementation. * Unique-attributes constraint at graph store-level * Atlas Index Repair tool for Janusgraph -* Relationship notifications when new relationships are created in Atlas +* Relationship notifications when new relationships are created in atlas * Atlas Import Transform handler implementation ## Updates * Updated component versions to use Hadoop 3.1, Hive 3.1, HBase 2.0, Solr 7.5 and Kafka 2.0 * Updated JanusGraph version to 0.3.1 * Updated authentication to support trusted proxy -* Updated patch framework to persist typedef patches applied to Atlas and handle data patches +* Updated patch framework to persist typedef patches applied to atlas and handle data patches. * Updated metrics module to collect notification metrics -* Updated Atlas Export to support incremental export of metadata +* Updated Atlas Export to support incremental export of metadata. * Notification Processing Improvements: * Notification processing to support batch-commits * New option in notification processing to ignore potentially incorrect hive_column_lineage - * Updated Hive hook to avoid duplicate column_lineage entities; also updated Atlas server to skip duplicate column_lineage entities - * Improved batch processing in notification handler to avoid processing of an entity multiple times - * Add option to ignore/prune metadata for temporary/staging Hive tables + * Updated Hive hook to avoid duplicate column-lineage entities; also updated Atlas server to skip duplicate column-lineage entities + * Improved batch processing in notificaiton handler to avoid processing of an entity multiple times + * Add option to ignore/prune metadata for temporary/staging hive tables * Avoid unnecessary lookup when creating new relationships * UI Improvements: - * UI: Display counts beside the Type and Classification dropdown list in basic search + * UI: Display counts besides the Type and Classification dropdown list in basic search * UI: Display lineage information for process entities * UI: Display entity specific icon for the lineage graph - * UI: Add relationships table inside relationships view in entity details page - * UI: Add service-type dropdown in basic search to filter entitydef type - * Various bug-fixes and optimizations + * UI: Add relationships table inside relationships view in entity details page. + * UI: Add service-type dropdown in basic search to filter entitydef type. + * Various Bug-fixes and optimizations * List of JIRAs resolved in Apache Atlas 2.0.0 ## Data Migration -After migrating to 2.0, expect some delay during the initial startup while Atlas adds the new unique attribute constraint to existing metadata. \ No newline at end of file +With the introduction of unique-attributes constraint at graph store changes - when atlas starts up for the first time after migration to 2.0, expect some delay during startup since unique attribute constraint will be added to existing atlas metadata. diff --git a/docs/src/site/resources/images/accessories-text-editor.png b/docs/src/resources/images/accessories-text-editor.png similarity index 100% rename from docs/src/site/resources/images/accessories-text-editor.png rename to docs/src/resources/images/accessories-text-editor.png diff --git a/docs/src/site/resources/images/application-certificate.png b/docs/src/resources/images/application-certificate.png similarity index 100% rename from docs/src/site/resources/images/application-certificate.png rename to docs/src/resources/images/application-certificate.png diff --git a/docs/src/resources/images/atlas-logo-grey.png b/docs/src/resources/images/atlas-logo-grey.png new file mode 100644 index 0000000000000000000000000000000000000000..395403dfc629fd989457fac24b7335fc639488b0 GIT binary patch literal 4935 zcmaJ_c{H2r){i-c8gKPf4MC4mjYz~4M1s;HN@=O!m_pDDBq~Z3rIR-3F)K=2tr|N} z^VFJZi1DbQMNBPPDyA5Y8)vxp`{O(JS?hhDXYaLtd;j*Z-nE|hj;)QwAt4zd00404 z>>0E3oPC?~z<~Umcd%pY3}-t^J?%ubC;3oAJc4ilv^U8U2Rcje@Wq|Sd3c8gcHj&F z03KC82Pdi%#v0*8B4~IV*l5rQWDXhtFf^u-J-h;NRFEgm*NFkR0oBoh>+7Ea!8Dq9hQ5Eu;1u>ey- ziBu07m`G9n+k+X7;uYjaruvbHpaYK{o}^%^krIdLpD7T?7|eeh6DfZcic>NO&4Ubq zYG^_TgoC{Pu%=MY;2E!qyG^L;gEqGwDG;u05E`y>GH(8;$LBKi^`bq}E|&1zJ4*G*s0r zFG`#|efUi~{jybIdrEO9asOQQrHFW+o^;B_l4aoBts5IbJrDQ0dNwEa?JzH$)@1dA zs9yHPncNn1*#*uWK|_P~<-T)GAfp(Yj}_#I@#o$iTvLYr^LOwxQojvfKs9FQs)Gqi>%mbod1Z z{um}Y%O#^D+~vsw_PBv8l-p|R!otGc!oosrnvt>b^~G$Xu+e9nHNJ)rIx9zA+X
C@Ti2g~(kE10)FaqY}D@yg{AUb39~z3Y(){S~cxf8n#a(Sg&`)0?a$89$bB4}+0ff2-8Z(a}-p!ySh)t3YTR9(n)M+v-=Zq#X*Z zj@t|k4qCsjr?{lkWk&r(}W=p!C^Dp@^U2H1BFL#r| zuRbY51s3vHq&6D}T~~Sk`cT-EP$Z05N$fJ1FodbKg)e`UEK(XEG<-5`svKD zZ%?+-PDyv&mF3U(5s@C=Vo%)93r4jPI%c52GR+1UQ>xa@)dKsLXk@jEEaXw0iyErV z$zxla;z2-5*1nuvLmE%U>yG^V{Lh*Nm=#OPj;TzI8lJdZHJ=?aZLSACAIZEoSNKkZ z42aSA_S<~A@=BTH=ez9}@3-iMgbpu!8VZY^CwA`4#Fhz3p1Q$3`7OmuRDAN5a{Bj# zEy)?r-1_GRr7vIpnBT2CQ$AA7rxuEO=NahLC-qY{i|3FulBS%{@Gf8(#DSj_OQJ3!XV}lSV9bXb;$HGUb0K6q zsPmDrNhb!rr&hBb+2t0OCH#<=QTdr7m@xUfRi8(amAJgZr=Zh(^too)o{3o$7e8zPT9KC6zv@ zAo-Cr;OCif>$t*^i>)d7`32i%%n4d4UBFFn<@zlT@tcmj`NyBIsMenHngX4joxeP2 zQ0|Gf)eB_4cU-Pnt~c=PpHuVr{32%e3cZdYWbfv>1RF{jb5AgxG`!ThzQ;VuuMIMm z3G8xnvU)N?$&Ku>_t%uz{5GaL>lJNmB|M{Fg>sj_sePSAp%|wCZe}J}t0?HOyT-;w z%^@zePR^RWr~-$DYtAbnc##a|XJXwPb zw8a9Kz8s@D8y#_WuIF!{sbr)EZ|2m|epEh$+zZH{;KTZRhJT!#M{j244IYg)T@{Mx z?HU{&-lU2EI%wNTqh(XCO_4s|%=^nG(Zzi^YbB)jiS;!$23FnK!ev)hnYDsY;wW}P zA(GNBIrAG5VXbq9QsGn&-qRjvm3k7IqHpV$3m;PrTIZ>%Bv{+ke~cyVC-n&MyA!bf zpt?Gj3eJ2yogy*-51;4O+V$?ZME*fP=(uZ-^r|7yG=Xm!tmK{4n42%lg0XmDj| ziy)4lst9c2EmUHyyjzFj*B<)x%^O`?=$h%AZwW!8i;JF>-m?;L@m+lUjCX64uTcPw zG!!Va!5g)3-xFV17I^sD{3FdIZDEi38NhbIE66p;loVW!hCNxIaQC?`#qIBLgu6dP z2PA+VdrO#zIMUd@h4j{(7^txGzjOjrETxSDb|00V0Xa$VR$h#Rszw4?#_dYYv|5CO zVL`od1dnLYivQ#E+^>rFXiIr6*R!Pa)hfM(N@jUAgOOi-R)*$dDk9t>;m5>N^>E@R zUC6WwmT6P^Qn~!g{wsMIgWTx+EzE;Vrn>a){1Tbx$BFK-w z7PRK$0*)rKyTXzHOfH|6B65@Xkv>Bwu(w;5DzANxq;F_6%U?O+IJ(kw<<-l2g&QM8 zA^%WmE=1k(>maJDtL)C^vN2v*yu@Qt_ZF8N6JUp!9DKgN z+TS1lVQ<|(AfPm(3s<6;iFHQat_cvM5HlHKhEP=fVO;tpI zSxwpTI-LPX(xwiH3nRdKEHIKQ^(srKH<&RBu0OVF0;jY2r^Rnisg;+-@yOgPQAk`a zb*tM}$IjvHG{B#}h9J8}W@l&J`Xk;J6%}1R60QcYx|o`hGUyh(=z!Hv zb~E8A<*Kt)y=>Po-vXoNv&Ddz z!NL;@^(`j#6aRayVE%{0%5=qyiQpDk6v{D5?afZHT@^jUU$~f0>W*-}JO6iM zEiKmVv&u~}wwT}x?_ST3V80I8+uQ%TNjxREEUR&)JWf5EE#xOgUV~n-+6so$84O0 zdbAn$qp&K<+cK?NCE=W4j?S)sFi>2 zU7Kp^2fNS`{w8O|2&=<^c|2vKwHa^N-n`&(4}eqt2h{R9+i;QMT5bJngtcs%fUBaN z~ z)-7IOx`t1t&wZcq;X`bQsa{f;v5d`{aCD0Z{a5h^)jRj`%!MybW;rq$3l6u#aEF=- zEhCNEPbsV|RreuyCrEt2(yB*{0BxTIg{`pi(UT{;ySfbTGsW_Ucx&q5HshO7FeY#z0GnD6L2M7&`j}%EQ%Zn-mG=ab|fO>#nb1 z#O_v+VCB~C`#Vz0tb7&f*x|Sq$ot96bA6s&DS~UYvql(`TzkB=>|=?@@4DZQD!RX7 zLOyRgMH?0hzFJrHlICMnyN?I|HX7Wdx6O4u7ytgqw2OE1@G@?ck;eH3285-=^!y4a z)ib}Hqd1~Vm({si-WP8Zr=1&lW=w7_q`fA|P$j$MCi9!anIUo*b2Od7ju}muw>T{_q(*vT@A6Nxka4 zZ~LkJG#a~f<}ly+1yRGvWZoH`ikj}*+()HoOdvluzS@nfJ*0DDJf<>C;uY7liqSQp zD<>Pn8SM9PYp>PGxk!mGEOxl@KANyN`tB4g(l%vi`{`(zm`r-b+uUUP42IH`vaw~w zz3Mi=nf`~aGv>QVeDYlF#7}7eeOlSb&jJh-AVVc0KB!aaw(qzp!M+&oA>Tf_rLe4( zYS2L&7Rq~5`$2vu0c*)7OdHC+n-&S3!zc_oj74f*tML-;#ify7=ALaDetvFO5j^+o z#Bs>)gcl#T5;ub$7d(-SvtDQKRgZeBpSb$6YNS|;rHJZ1p)i;j>%`SFo#nK6Dt>$W zFi_-8LbSk==sOoWb{7y65WSVW*%+!rc##YmA4qWo$j%#WP2MP$*tmZT9*!iw=%i07 zkMYlXKOJF7aAS4cE#kK;8T!4 - - ##Introduction - - The document describes the use of the Atlas Index Repair Utility for JanusGraph, with HBase as back-end data store and Solr as index store. - ####Need for this Tool - In rare, cases it is possible that during entity creation, the entity is stored in the data store, but the corresponding indexes are not created in Solr. Since Atlas relies heavily on Solr in the operation of its Basic Search, this will result in entity not being returned by a search. Note that Advanced Search is not affected by this. - ####Location - The tool is part of the normal Atlas installation, it is located under the tools/atlas-index-repair directory. - ####Steps to Execute Tool - #####Complete Restore - If the user needs to restore all the indexes, this can be accomplished by executing the tool with no command-line parameters: - - >atlas-index-repair/repair_index.py - - This will result in vertex_index, edge_index and fulltext_index to be re-built completely. It is recommended that existing contents of these indexes be deleted before executing this restore. - ######Caveats - Note that the full index repair is a time consuming process. Depending on the size of data the process may take days to complete. During the restore process the Basic Search functionality will not be available. Be sure to allocate sufficient time for this activity. - #####Selective Restore - To perform selective restore for an Atlas entity, specify the GUID of that entity: - >atlas-index-repair/repair_index.py [-g \] - - Example: - > atlas-index-repair/repair_index.py -g 13d77457-2a45-4e92-ad53-a172c7cb70a5 - - Note that Atlas will use REST APIs to fetch the entity, which will need correct authentication mechanism to be specified based on the installation. - - For an Atlas installation with username and password use: - >atlas-index-repair/repair_index.py [-g \] [-u \] [-p \] - * guid: [optional] specify guid for which indexes are to be updated - * user: [optional] specify username for atlas instance - * password: [optional] specify password for atlas instance - - Example: - >atlas-index-repair/repair_index.py -u admin -p admin123 -g 13d77457-2a45-4e92-ad53-a172c7cb70a5 - - For Atlas installation that uses kerberos as authentication mode, - use: kinit -kt /etc/security/keytabs/atlas.service.keytab atlas/fqdn@DOMAIN - - Example: - >kinit -kt /etc/security/keytabs/atlas.service.keytab atlas/fqdn@EXAMPLE.com - > - >atlas-index-repair/repair_index.py -g 13d77457-2a45-4e92-ad53-a172c7cb70a5 diff --git a/docs/src/site/markdown/SoftReference.md b/docs/src/site/markdown/SoftReference.md deleted file mode 100644 index 0853761c3..000000000 --- a/docs/src/site/markdown/SoftReference.md +++ /dev/null @@ -1,31 +0,0 @@ -# Entity Attribute Option: SoftReference - -#### Background - -Entity attributes are specified using attribute definitions. An attributes persistence strategy is determined by based on their type. - -Primitive types are persisted as properties within the vertex of their parent. - -Non-primitive attributes get a vertex of their own and and edge is created between the parent the child to establish ownership. - -Attribute with _isSoftReference_ option set to _true_, is non-primitive attribute that gets treatment of a primitive attribute. - -#### Specification - -Below is an example of using the new attribute option. - -```json - "attributeDefs": [ - { - "name": "replicatedFrom", - "typeName": "array", - "cardinality": "SET", - "isIndexable": false, - "isOptional": true, - "isUnique": false, - "options": { - "isSoftReference": "true" - } - }, -``` - diff --git a/docs/src/site/site.xml b/docs/src/site/site.xml deleted file mode 100755 index d666f502f..000000000 --- a/docs/src/site/site.xml +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - org.apache.maven.skins - maven-fluido-skin - 1.7 - - - - - Apache Atlas - true - width: 68%; - false - span2 - span10 - - http://atlas.apache.org - - - - - - - - Apache Atlas - ./images/atlas-logo.png - http://atlas.apache.org - 200px - 45px - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Copyright © 2011-2018 The Apache Software Foundation. Licensed under the Apache License, Version 2.0.
-Apache Atlas, Atlas, Apache, the Apache feather logo are trademarks of the Apache Software Foundation.
-All other marks mentioned may be trademarks or registered trademarks of their respective owners.

-]]> -
- -
diff --git a/docs/src/site/twiki/Atlas-Authentication.twiki b/docs/src/site/twiki/Atlas-Authentication.twiki deleted file mode 100644 index 75626ea3d..000000000 --- a/docs/src/site/twiki/Atlas-Authentication.twiki +++ /dev/null @@ -1,141 +0,0 @@ ----++ Authentication in Apache Atlas. - ----+++ Authentication - -Atlas supports following authentication methods - - * *File* - * *Kerberos* - * *LDAP* - * *Keycloak (OpenID Connect / OAUTH2)* - - -Following properties should be set true to enable the authentication of that type in =atlas-application.properties= file. - - - -atlas.authentication.method.kerberos=true|false -atlas.authentication.method.ldap=true|false -atlas.authentication.method.file=true|false -atlas.authentication.method.keycloak=true|false - - -If two or more authentication methods are set to true, then the authentication falls back to the latter method if the earlier one fails. -For example if Kerberos authentication is set to true and ldap authentication is also set to true then, if for a request without kerberos principal and keytab LDAP authentication will be used as a fallback scenario. - ----++++FILE method. - -File authentication requires users' login details in users credentials file in the format specified below and -the file path should set to property =atlas.authentication.method.file.filename= in =atlas-application.properties=. - - -atlas.authentication.method.file=true -atlas.authentication.method.file.filename=${sys:atlas.home}/conf/users-credentials.properties - - -The users credentials file should have below format - -username=group::sha256-password - - -For e.g. - -admin=ADMIN::e7cf3ef4f17c3999a94f2c6f612e8a888e5b1026878e4e19398b23bd38ec221a - - -Users group can be either *ADMIN*, *DATA_STEWARD* OR *DATA_SCIENTIST* - -*Note*:-password is encoded with sha256 encoding method and can be generated using unix tool. - -For e.g. - -echo -n "Password" | sha256sum -e7cf3ef4f17c3999a94f2c6f612e8a888e5b1026878e4e19398b23bd38ec221a - - - ----++++ Kerberos Method. - -To enable the authentication in Kerberos mode in Atlas, set the property =atlas.authentication.method.kerberos= to true in =atlas-application.properties= - - -atlas.authentication.method.kerberos = true - - -Also following properties should be set. - - -atlas.authentication.method.kerberos.principal=/@EXAMPLE.COM -atlas.authentication.method.kerberos.keytab = /.keytab -atlas.authentication.method.kerberos.name.rules = RULE:[2:$1@$0](atlas@EXAMPLE.COM)s/.*/atlas/ -atlas.authentication.method.kerberos.token.validity = 3600 [ in Seconds (optional)] - - - ----++++ LDAP Method. - -To enable the authentication in LDAP mode in Atlas, set the property =atlas.authentication.method.ldap= to true and also set Ldap type to property =atlas.authentication.method.ldap.type= to LDAP or AD in =atlas-application.properties=. -Use AD if connecting to Active Directory. - - -atlas.authentication.method.ldap=true -atlas.authentication.method.ldap.type=ldap|ad - - - -For LDAP or AD the following configuration needs to be set in atlas application properties. - -*Active Directory* - - -atlas.authentication.method.ldap.ad.domain= example.com -atlas.authentication.method.ldap.ad.url=ldap://:389 -atlas.authentication.method.ldap.ad.base.dn=DC=example,DC=com -atlas.authentication.method.ldap.ad.bind.dn=CN=Administrator,CN=Users,DC=example,DC=com -atlas.authentication.method.ldap.ad.bind.password= -atlas.authentication.method.ldap.ad.referral=ignore -atlas.authentication.method.ldap.ad.user.searchfilter=(sAMAccountName={0}) -atlas.authentication.method.ldap.ad.default.role=ROLE_USER - - -*LDAP Directroy* - - -atlas.authentication.method.ldap.url=ldap://:389 -atlas.authentication.method.ldap.userDNpattern=uid={0],ou=users,dc=example,dc=com -atlas.authentication.method.ldap.groupSearchBase=dc=example,dc=com -atlas.authentication.method.ldap.groupSearchFilter=(member=cn={0},ou=users,dc=example,dc=com -atlas.authentication.method.ldap.groupRoleAttribute=cn -atlas.authentication.method.ldap.base.dn=dc=example,dc=com -atlas.authentication.method.ldap.bind.dn=cn=Manager,dc=example,dc=com -atlas.authentication.method.ldap.bind.password= -atlas.authentication.method.ldap.referral=ignore -atlas.authentication.method.ldap.user.searchfilter=(uid={0}) -atlas.authentication.method.ldap.default.role=ROLE_USER - - ----++++ Keycloak Method. - -To enable Keycloak authentication mode in Atlas, set the property =atlas.authentication.method.keycloak= to true and also set the property =atlas.authentication.method.keycloak.file= to the localtion of your =keycloak.json= in =atlas-application.properties=. -Also set =atlas.authentication.method.keycloak.ugi-groups= to false if you want to pickup groups from Keycloak. By default the groups will be picked up from the *roles* defined in Keycloak. In case you want to use the groups -you need to create a mapping in keycloak and define =atlas.authentication.method.keycloak.groups_claim= equal to the token claim name. Make sure *not* to use the full group path and add the information to the access token. - - -atlas.authentication.method.keycloak=true -atlas.authentication.method.keycloak.file=/opt/atlas/conf/keycloak.json -atlas.authentication.method.keycloak.ugi-groups=false - - -Setup you keycloak.json per instructions from Keycloak. Make sure to include ="principal-attribute": "preferred_username"= to ensure readable user names and ="autodetect-bearer-only": true=. - - -{ - "realm": "auth", - "auth-server-url": "http://keycloak-server/auth", - "ssl-required": "external", - "resource": "atlas", - "public-client": true, - "confidential-port": 0, - "principal-attribute": "preferred_username", - "autodetect-bearer-only": true -} - diff --git a/docs/src/site/twiki/Atlas-Authorization-Ranger-Authorizer.twiki b/docs/src/site/twiki/Atlas-Authorization-Ranger-Authorizer.twiki deleted file mode 100644 index 33447b9ae..000000000 --- a/docs/src/site/twiki/Atlas-Authorization-Ranger-Authorizer.twiki +++ /dev/null @@ -1,63 +0,0 @@ ----+++ Setting up Apache Atlas to use Apache Ranger Authorization - -As detailed in [[Atlas-Authorization-Model][Atlas Authorization Model]], Apache Atlas supports pluggable authorization -model. Apache Ranger provides an authorizer implementation that uses Apache Ranger policies for authorization. In -addition, the authorizer provided by Apache Ranger audits all authorizations into a central audit store. - ----++++ Configure Apache Atlas -To configure Apache Atlas to use Apache Ranger authorizer, please follow the instructions given below: - - * Include the following property in atlas-application.properties config file: - atlas.authorizer.impl=ranger - - If you use Apache Ambari to deploy Apache Atlas and Apache Ranger, enable Atlas plugin in configuration pages for - Apache Ranger. - - * Include libraries of Apache Ranger plugin in libext directory of Apache Atlas - * ==/libext/ranger-atlas-plugin-impl/ - * ==/libext/ranger-atlas-plugin-shim-.jar - * ==/libext/ranger-plugin-classloader-.jar - - * Include configuration files for Apache Ranger plugin in configuration directory of Apache Atlas - typically under /etc/atlas/conf directory. For more details on configuration file contents, please refer to appropriate documentation in Apache Ranger. - * ==/ranger-atlas-audit.xml - * ==/ranger-atlas-security.xml - * ==/ranger-policymgr-ssl.xml - * ==/ranger-security.xml - - ----++++ Apache Ranger authorization policy model for Apache Atlas - -Apache Ranger authorization policy model for Apache Atlas supports 3 resource hierarchies, to control access to: types, -entities and admin operations. Following images show various details of each type of policy in Apache Ranger. - - * *Types* - -Following authorization policy allows user 'admin' to create/update/delete any classification type. -

-Apache Ranger policy for type operations - -------- - - * *Entity* - -Following authorization policy allows user 'admin' perform all operations on metadata entities of Hive database named "my_db". -

-Apache Ranger policy for entity operations - -------- - - * *Admin Operations* -Following authorization policy allows user 'admin' to perform export/import admin operations. -

-Apache Ranger policy for admin operations - - -------- - ----++++ Apache Ranger access audit for Apache Atlas authorizations -Apache Ranger authorization plugin generates audit logs with details of the access authorized by the plugin. The details -include the object accessed (eg. hive_table with ID cost_savings.claim_savings@cl1), type of access performed (eg. -entity-add-classification, entity-remove-classification), name of the user, time of access and the IP address the access -request came from - as shown in the following image. - -Apache Ranger audit diff --git a/docs/src/site/twiki/Bridge-Kafka.twiki b/docs/src/site/twiki/Bridge-Kafka.twiki deleted file mode 100644 index 0a0ed1c46..000000000 --- a/docs/src/site/twiki/Bridge-Kafka.twiki +++ /dev/null @@ -1,37 +0,0 @@ ----+ Apache Atlas Hook for Apache Kafka - ----++ Kafka Model -Kafka model includes the following types: - * Entity types: - * kafka_topic - * super-types: !DataSet - * attributes: qualifiedName, name, description, owner, topic, uri, partitionCount - -Kafka entities are created and de-duped in Atlas using unique attribute qualifiedName, whose value should be formatted as detailed below. -Note that qualifiedName will have topic name in lower case. - - topic.qualifiedName: @ - - - ----++ Setup - Binary files are present in apache-atlas--kafka-hook.tar.gz - - Copy apache-atlas-kafka-hook-/hook/kafka folder to /hook/ directory - - Copy apache-atlas-kafka-hook-/hook-bin folder to /hook-bin directory - ----++ Importing Kafka Metadata -Apache Atlas provides a command-line utility, import-kafka.sh, to import metadata of Apache Kafka topics into Apache Atlas. -This utility can be used to initialize Apache Atlas with topics present in Apache Kafka. -This utility supports importing metadata of a specific topic or all topics. - - -Usage 1: /hook-bin/import-kafka.sh -Usage 2: /hook-bin/import-kafka.sh [-t OR --topic ] -Usage 3: /hook-bin/import-kafka.sh [-f ] - File Format: - topic1 - topic2 - topic3 - diff --git a/docs/src/site/twiki/ClassificationPropagation.twiki b/docs/src/site/twiki/ClassificationPropagation.twiki deleted file mode 100755 index 6c5d82aab..000000000 --- a/docs/src/site/twiki/ClassificationPropagation.twiki +++ /dev/null @@ -1,108 +0,0 @@ ----+ Classification Propagation - -Classification propagation enables classifications associated to an entity to be automatically associated with other -related entities of the entity. This is very useful in dealing with scenarios where a dataset derives it data from other -datasets - like a table loaded with data in a file, a report generated from a table/view, etc. For example, when a table -is classified as *"PII"*, tables or views that derive data from this table (via CTAS or ‘create view’ operation) will be -automatically classified as *"PII"*. - - ----++ Use Cases -Consider the following lineage where data from a 'hdfs_path' entity is loaded into a table, which is further made -available through views. We will go through various scenarios to understand the classification propagation feature. - - - - ----++ Add classification to an entity -When classification ‘PII’ is added to 'hdfs_path' entity, the classification is propagated to all impacted entities in the -lineage path, including 'employees' table, views 'us_employees' and 'uk_employees' - as shown below. - - - ----++ Update classification associated with an entity -Any updates to classifications associated with an entity will be seen in all entities the classification is -propagated to as well. - - - ----++ Remove classification associated with an entity -When a classification is deleted from an entity, the classification will be removed from all entities the classification -is propagated to as well. - - - ----++ Add lineage between entities -When lineage is added between entities, for example to capture loading of data in a file to a table, the classifications -associated with the source entity are propagated to all impacted entities as well. - -For example, when a view is created from a table, classifications associated with the table are propagated to the newly -created view as well. - - - ----++ Delete an entity -*Case 1:* -When an entity is deleted, classifications associated with this entity will be removed from all entities the -classifications are propagated to. - -For example. when _employees_ table is deleted, classifications associated with this table are removed from -'employees_view' view. - - - -*Case 2:* -When an entity is deleted in the middle of a lineage path, the propagation link is broken and previously propagated -classifications will be removed from all derived entities of the deleted entity. - -For example. when 'us_employees' table is deleted, classifications propagating through this table (*PII*) are removed from -'ca_employees' table, since the only path of propagation is broken by entity deletion. - - - - - -*Case 3:* -When an entity is deleted in the middle of a lineage path and if there exists alternate path for propagation, previously propagated classifications will be retained. - -For example. when 'us_employees' table is deleted, classifications propagating (*PII*) through this table are retained in -'ca_employees' table, since there are two propagation paths available and only one of them is broken by entity deletion. - - - - - ----++ Control Propagation -Apache Atlas provides few options to control whether/where a classification is propagated. -This section details available options. - ----++ Propagate flag in classification -Each association of classification to an entity has a boolean flag that controls whether the classification is -propagated or not. When a classification is associated with an entity, this flag is set to ‘true’ i.e. the classification -will be propagated to all impacted entities. This flag can be updated to desired value during initial association or later. - - - ----++ Propagate flag in lineage edge -Apache Atlas supports a flag at lineage edge to enable/disable propagation of classifications through the edge. By default, -the propagation is enabled for lineage edges. When the flag is turned off, no classification will be propagated through -this edge; and propagation of currently propagated classifications through the edge will be reevaluated, so that they can -be removed from impacted entities. When the flag is turned on, propagation of classifications of the source entity will -be reevaluated, so that they can be propagated to all impacted entities. - ----++ Block propagation of specific classifications in lineage edge -Apache Atlas supports blocking propagation of specific classifications in at lineage edges. This can be useful, for example, -to handle scenarios like: a column classified as PII is masked when creating a view; in such scenario, if corresponding -column in the created view might not have PII, hence the propagation of PII classification should be blocked. This can be -done by updating the lineage edge to add the PII classification in _‘blocked propagated classifications’_ list. -Classifications in blocked propagated classifications will not be propagated in the derivative/downstream entities. - - - ----++ Notifications and Audit -When propagated classifications are added/update/deleted, Apache Atlas sends notifications to 'ATLAS_ENTITIES' topic for -each entity affected by the propagation. - ----++ Glossary -When a classification is associated with a glossary term, the classification is automatically propagated to all entities -associated with the term. \ No newline at end of file diff --git a/docs/src/site/twiki/Downloads.twiki b/docs/src/site/twiki/Downloads.twiki deleted file mode 100755 index 347015bff..000000000 --- a/docs/src/site/twiki/Downloads.twiki +++ /dev/null @@ -1,226 +0,0 @@ ----+ Downloads - - -Apache Atlas release artifacts are distributed via mirror sites and should be checked for tampering using GPG or SHA-256. - -The table below lists release artifacts and their associated signatures and hashes. The keys used to sign the release -artifacts can be found in our published [[https://www.apache.org/dist/atlas/KEYS][KEYS file]]. - -| *Version* | *Release Date* | *Tarball* | *GPG* | *Hash* | -| 0.8.4 | 2019-06-21 | [[https://www.apache.org/dyn/closer.cgi/atlas/0.8.4/apache-atlas-0.8.4-sources.tar.gz][source]] | [[https://www.apache.org/dist/atlas/0.8.4/apache-atlas-0.8.4-sources.tar.gz.asc][signature]]| [[https://www.apache.org/dist/atlas/0.8.4/apache-atlas-0.8.4-sources.tar.gz.sha512][SHA512]] | -| 1.2.0 | 2019-06-06 | [[https://www.apache.org/dyn/closer.cgi/atlas/1.2.0/apache-atlas-1.2.0-sources.tar.gz][source]] | [[https://www.apache.org/dist/atlas/1.2.0/apache-atlas-1.2.0-sources.tar.gz.asc][signature]] | [[https://www.apache.org/dist/atlas/1.2.0/apache-atlas-1.2.0-sources.tar.gz.sha512][SHA512]] | -| 2.0.0 | 2019-05-14 | [[https://www.apache.org/dyn/closer.cgi/atlas/2.0.0/apache-atlas-2.0.0-sources.tar.gz][source]] | [[https://www.apache.org/dist/atlas/2.0.0/apache-atlas-2.0.0-sources.tar.gz.asc][signature]] | [[https://www.apache.org/dist/atlas/2.0.0/apache-atlas-2.0.0-sources.tar.gz.sha512][SHA512]] | -| 0.8.3 | 2018-11-01 | [[https://archive.apache.org/dist/atlas/0.8.3/apache-atlas-0.8.3-sources.tar.gz][source]] | [[https://www.apache.org/dist/atlas/0.8.3/apache-atlas-0.8.3-sources.tar.gz.asc][signature]] | [[https://www.apache.org/dist/atlas/0.8.3/apache-atlas-0.8.3-sources.tar.gz.sha512][SHA512]] | -| 1.1.0 | 2018-09-17 | [[https://archive.apache.org/dist/atlas/1.1.0/apache-atlas-1.1.0-sources.tar.gz][source]] | [[https://www.apache.org/dist/atlas/1.1.0/apache-atlas-1.1.0-sources.tar.gz.asc][signature]] | [[https://www.apache.org/dist/atlas/1.1.0/apache-atlas-1.1.0-sources.tar.gz.sha512][SHA512]] | -| 1.0.0 | 2018-06-02 | [[https://archive.apache.org/dist/atlas/1.0.0/apache-atlas-1.0.0-sources.tar.gz][source]] | [[https://www.apache.org/dist/atlas/1.0.0/apache-atlas-1.0.0-sources.tar.gz.asc][signature]] | [[https://www.apache.org/dist/atlas/1.0.0/apache-atlas-1.0.0-sources.tar.gz.sha512][SHA512]] | -| 0.8.2 | 2018-02-05 | [[https://archive.apache.org/dist/atlas/0.8.2/apache-atlas-0.8.2-sources.tar.gz][source]] | [[https://www.apache.org/dist/atlas/0.8.2/apache-atlas-0.8.2-sources.tar.gz.asc][signature]] | [[https://www.apache.org/dist/atlas/0.8.2/apache-atlas-0.8.2-sources.tar.gz.sha512][SHA512]] | -| 0.8.1 | 2017-08-29 | [[https://archive.apache.org/dist/atlas/0.8.1/apache-atlas-0.8.1-sources.tar.gz][source]] | [[https://archive.apache.org/dist/atlas/0.8.1/apache-atlas-0.8.1-sources.tar.gz.asc][signature]] | [[https://archive.apache.org/dist/atlas/0.8.1/apache-atlas-0.8.1-sources.tar.gz.sha512][SHA512]] | -| 0.8.0-incubating | 2017-03-16 | [[https://archive.apache.org/dist/incubator/atlas/0.8.0-incubating/apache-atlas-0.8-incubating-sources.tar.gz][source]] | [[https://archive.apache.org/dist/incubator/atlas/0.8.0-incubating/apache-atlas-0.8-incubating-sources.tar.gz.asc][signature]] | [[https://archive.apache.org/dist/incubator/atlas/0.8.0-incubating/apache-atlas-0.8-incubating-sources.tar.gz.sha512][SHA512]] | -| 0.7.1-incubating | 2017-01-29 | [[https://archive.apache.org/dist/incubator/atlas/0.7.1-incubating/apache-atlas-0.7.1-incubating-sources.tar.gz][source]] | [[https://archive.apache.org/dist/incubator/atlas/0.7.1-incubating/apache-atlas-0.7.1-incubating-sources.tar.gz.asc][signature]] | [[https://archive.apache.org/dist/incubator/atlas/0.7.1-incubating/apache-atlas-0.7.1-incubating-sources.tar.gz.mds][checksum]] | -| 0.7.0-incubating | 2016-07-09 | [[https://archive.apache.org/dist/incubator/atlas/0.7.0-incubating/apache-atlas-0.7-incubating-sources.tar.gz][source]] | [[https://archive.apache.org/dist/incubator/atlas/0.7.0-incubating/apache-atlas-0.7-incubating-sources.tar.gz.asc][signature]] | [[https://archive.apache.org/dist/incubator/atlas/0.7.0-incubating/apache-atlas-0.7-incubating-sources.tar.gz.sha512][SHA512]] | -| 0.6.0-incubating | 2015-12-31 | [[https://archive.apache.org/dist/incubator/atlas/0.6.0-incubating/apache-atlas-0.6-incubating-sources.tar.gz][source]] | [[https://archive.apache.org/dist/incubator/atlas/0.6.0-incubating/apache-atlas-0.6-incubating-sources.tar.gz.asc][signature]] | [[https://archive.apache.org/dist/incubator/atlas/0.6.0-incubating/apache-atlas-0.6-incubating-sources.tar.gz.sha][SHA]] | -| 0.5.0-incubating | 2015-06-22 | [[https://archive.apache.org/dist/incubator/atlas/0.5.0-incubating/apache-atlas-0.5-incubating-sources.tar.gz][source]] | [[https://archive.apache.org/dist/incubator/atlas/0.5.0-incubating/apache-atlas-0.5-incubating-sources.tar.gz.asc][signature]] | [[https://archive.apache.org/dist/incubator/atlas/0.5.0-incubating/apache-atlas-0.5-incubating-sources.tar.gz.sha][SHA]] | - ----++ Verify the integrity of the files - -It is essential that you verify the integrity of the downloaded file using the PGP signature (.asc file) or a hash -(.md5 or .sha* file). Please read [[https://www.apache.org/info/verification.html][Verifying Apache Software Foundation Releases]] -for more information on why you should verify our releases. - -The PGP signature can be verified using PGP or GPG, with the following steps: - * Download the release artifact from the link in the table above - * Download the signature file for the release from the link in the table above - * Download [[https://www.apache.org/dist/atlas/KEYS][Apache Atlas KEYS file]] - * Verify the signatures using one of the following: - - -% gpg --import KEYS -% gpg --verify downloaded_file.asc downloaded_file - -or - - -% pgpk -a KEYS -% pgpv downloaded_file.asc - -or - - -% pgp -ka KEYS -% pgp downloaded_file.asc - ----++ Release Notes -*[[../0.8.4/index][Atlas 0.8.4]] (Released on 2018/06/21)* - - * Entity specific icons updated - * Improve FullTextMapper performance during entity retrieval - * Option to ignore/prune metadata for temporary/staging Hive tables - * Add instrumentation to enable troubleshooting and optimization of ingest - * Name of Kafka topics used by Atlas should be configurable - * Atlas authentication to support proxy-user - * IE-10 Issue fixed - * Lineage UI Improvements - * Show hide tooltip - * Show Path when user hovers on node - * Entity detail popup improvments - * Export Lineage in PNG format - * Search for the node - * Drag and Drop node - * Reset button - * Full Screen support - * !BugFixes, Optimizations & UI Improvements - * [[https://issues.apache.org/jira/issues/?jql=project%3DATLAS%20AND%20resolution%3DFixed%20AND%20fixVersion%3D0.8.4%20ORDER%20BY%20key%20DESC][List of JIRAs resolved in Apache Atlas 0.8.4 release]] - -*[[../1.2.0/index][Atlas 1.2.0]] (Released on 2019/06/06)* - - - * Lineage UI Improvements and changes. - * Show entity specific icon for the lineage node. - * Atlas authentication to support proxy-user. - * Update model files to include service-type for each entityDef. - * Update !JanusGraph version to 0.3.1 - * New Transform Framework - * Atlas Import Transform Handler Implementation. - * !BugFixes, Optimizations & UI Improvements. - * [[https://issues.apache.org/jira/issues/?jql=project%3DATLAS%20AND%20resolution%3DFixed%20AND%20fixVersion%3D1.2.0%20ORDER%20BY%20key%20DESC][List of JIRAs resolved in Apache Atlas 1.2.0 release]] - - -*[[../2.0.0/index][Atlas 2.0.0]] (Released on 2019/05/14)* - * Soft-reference attribute implementation. - * Unique-attributes constraints at graph store-level - * Atlas Index Repair tool for Janusgraph - * Relationship notifications when new relationships are created in atlas - * Atlas Import Transform handler implementation - * Updated component versions to use Hadoop 3.1, Hive 3.1, HBase 2.0, Solr 7.5 and Kafka 2.0 - * Updated JanusGraph version to 0.3.1 - * Updated authentication to support trusted proxy - * Updated patch framework to persist typedef patches applied to atlas and handle data patches. - * Updated metrics module to collect notification metrics - * Updated Atlas Export to support incremental export of metadata. - * Notification Processing Improvements: - * Notification processing to support batch-commits - * New option in notification processing to ignore potentially incorrect hive_column_lineage - * Updated Hive hook to avoid duplicate column-lineage entities; also updated Atlas server to skip duplicate column-lineage entities - * Improved batch processing in notificaiton handler to avoid processing of an entity multiple times - * Add option to ignore/prune metadata for temporary/staging hive tables - * Avoid unnecessary lookup when creating new relationships - * UI Improvements: - * UI: Display counts besides the Type and Classification dropdown list in basic search - * UI: Display lineage information for process entities - * UI: Display entity specific icon for the lineage graph - * UI: Add relationships table inside relationships view in entity details page. - * UI: Add service-type dropdown in basic search to filter entitydef type. - * Various Bug-fixes and optimizations - * [[https://issues.apache.org/jira/issues/?jql=project%20%3D%20ATLAS%20AND%20status%20%3D%20Resolved%20AND%20fixVersion%20%3D%202.0.0%20ORDER%20BY%20updated%20DESC%2C%20priority%20DESC][List of JIRAs resolved in Apache Atlas 2.0.0 release]] - -*[[../0.8.3/index][Atlas 0.8.3]] (Released on 2018/11/01)* - - * Utility to detect incorrect entity state - * Export & Import improvements - * Implement clear attribute value transformer for Atlas Entity Transformer - * Rename AtlasCluster to AtlasServer - * Upgrade commons-fileupload to 1.3.3 - * Updated node/NPM version and add package-lock.json - * Enhance AtlasClient to use UGI's authentication method to initialize URL connection handler - * UI enhancement for Avro schemas and other JSON-valued attributes - * Updated frontend-maven-plugin to 1.4 - * Remove Powermock Usage - * !BugFixes, Optimizations & UI Improvements. - * [[https://issues.apache.org/jira/issues/?jql=project%3DATLAS%20AND%20resolution%3DFixed%20AND%20fixVersion%3D0.8.3%20ORDER%20BY%20key%20DESC][List of JIRAs resolved in Apache Atlas 0.8.3 release]] - -*[[../1.1.0/index][Atlas 1.1.0]] (Released on 2018/09/17)* - * Updated authorization model to support access control on relationship operations - * Added support for AWS S3 datatypes, in Atlas server and Hive hook - * Updated [[http://atlas.apache.org/JanusGraph.html][JanusGraph]] version from 0.2.0 to 0.3.0 - * Updated hooks to send Kafka notifications asynchronously - * Enhanced classification-propagation with options to handle entity-deletes - * BugFixes and Optimizations - -*[[../1.0.0/index][Atlas 1.0.0]] (Released on 2018/06/02)* - - * Core model enhancement to support Relationship as first-class construct - * Support for JanusGraph graph database - * New DSL implementation, using ANTLR instead of Scala - * Removal of older type system implementation in atlas-typesystem library - * Metadata security - fine grained authorization - * Notification enhancements to support V2 style data structures - * Jackson library update from 1.9.13 to 2.9.2 - * Classification propagation via entity relationships - * Glossary terms, categories - * HBase Hook - * UI updates to show entity relationships - * [[https://issues.apache.org/jira/issues/?jql=project%20%3D%20Atlas%20AND%20resolution%20%3D%20Fixed%20AND%20fixVersion%20%3D%201.0.0%20ORDER%20BY%20key%20DESC][List of JIRAs resolved in Apache Atlas 1.0.0 release]] - -*[[../0.8.2/index][Atlas 0.8.2]] (Released on 2018/02/05)* - - * Search improvements: - * Basic search enhancement to optionally exclude sub-type entities and sub-classification-types - * Basic search to return classification attributes - * Support for saving searches - * UI support to reorder columns in search results page - * UI - updates for classification rendering – tree/flat view - * UI – minification of js, css; cache busting for static content (css, js) - * notification updates to handle large messages - * fix type initialization issues in HA deployment - * In HA, the passive node redirects the request with wrong URL encoding - * tool kit to recover from lost/bad index data - * [[https://issues.apache.org/jira/issues/?jql=project%20%3D%20Atlas%20AND%20fixVersion%20%3D%200.8.2%20ORDER%20BY%20key%20ASC][List of JIRAs resolved in Apache Atlas 0.8.2 release]] - -*[[../0.8.1/index][Atlas 0.8.1]] (Released on 2017/08/29)* - - * Basic-search improvement in use of index for attribute filtering - * DSL query enhancement to support 'like' operator - * REST API and UI enhancements to update classification attributes - * Export/import support to copy data between Apache Atlas instances - * Ability to delete a tag from UI (and API) - * UI enhancements: lineage, attribute search filter, ability to search historical data - * Knox SSO for Atlas REST APIs - * Moved from use of Guice + Spring framework for dependency-injection to use only Spring framework - -*[[../0.8.0-incubating/index][Atlas 0.8-incubating]] (Released on 2017/03/16)* - - * API revamp - new, structured REST API - * Simplified search UI - * UI to create/update entities - HDFS/HBase/Kafka - * Performance and scalability improvements - * Knox SSO for Atlas UI - -*[[../0.7.1-incubating/index][Atlas 0.7.1-incubating]] (Released on 2017/01/29)* - - * Performance and scalability improvements (ATLAS-1403, ATLAS-1404) - * Bug fixes - -*[[../0.7.0-incubating/index][Atlas 0.7-incubating]] (Released on 2016/07/09)* - - * High Availability (ATLAS-510) - * Business Catalog / Taxonomy (ATLAS-491) - * Improved Hive Integration (ATLAS-492) - * Improved Sqoop Integration - * Improved Falcon Integration - * Improved Storm Integration - * Improved Ambari Deployment & Management Support - * Entity Versioning / Audit (ATLAS-493) - * Performance Improvements - * Authorization (ATLAS-497) - * Atlas / Ranger Authorization Integration (ATLAS-495) - * Standalone HBase Support (ATLAS-498) - * Upgrade Support (ATLAS-631) - -*[[../0.6.0-incubating/index][Atlas 0.6-incubating]] (Released on 2015/12/30)* - * Improved Hive Server 2 Integration - * Sqoop Integration - * Falcon Integration - * Storm Integration - * Various Bug Fixes - * Atlas / Ranger Integration - -*[[../0.5.0-incubating/index][Atlas 0.5-incubating]] (Released on 2015/07/09)* - * Hive Server 2 Integration - * Basic Hive Lineage - * Basic Ambari Integration - * Kerberos Support - * DSL for query of datastore - * Basic Storage of Metadata - * Support for BerkleyDB - * Support for Titan 0.5 - * Support diff --git a/docs/src/site/twiki/Export-HDFS-API.twiki b/docs/src/site/twiki/Export-HDFS-API.twiki deleted file mode 100644 index 7e9285b9f..000000000 --- a/docs/src/site/twiki/Export-HDFS-API.twiki +++ /dev/null @@ -1,81 +0,0 @@ ----+ Export & Import APIs for HDFS Path - ----+++ Introduction - -The general approach for using the Import-Export APIs for HDFS Paths remain the same. There are minor variations caused how HDFS paths are handled within Atlas. - -Unlike HIVE entities, HDFS entities within Atlas are created manually using the _Create Entity_ link within the Atlas Web UI. - -Also, HDFS paths tend to be hierarchical, in the sense that users tend to model the same HDFS storage structure within Atlas. - -__Sample HDFS Setup__ - -
- - - - - - - - - - - - - - - - - - -
HDFS Path Atlas Entity
- /apps/warehouse/finance - - Entity type: hdfs_path
- Name: Finance
- QualifiedName: FinanceAll -
- /apps/warehouse/finance/accounts-receivable - - Entity type: hdfs_path
- Name: FinanceReceivable
- QualifiedName: FinanceReceivable
- Path: /apps/warehouse/finance -
- /apps/warehouse/finance/accounts-payable - - Entity type: hdfs_path
- Name: Finance-Payable
- QualifiedName: FinancePayable
- Path: /apps/warehouse/finance/accounts-payable -
- /apps/warehouse/finance/billing - - Entity type: hdfs_path
- Name: FinanceBilling
- QualifiedName: FinanceBilling
- Path: /apps/warehouse/finance/billing -
- ----+++ Export API Using matchType -To export entities that represent HDFS path, use the Export API using the _matchType_ option. Details can be found [[Export-API][here]]. - ----+++ Example Using CURL Calls -Below are sample CURL calls that performs export operation on the _Sample HDFS Setup_ shown above. - - -curl -X POST -u adminuser:password -H "Content-Type: application/json" -H "Cache-Control: no-cache" -d '{ - "itemsToExport": [ - { "typeName": "hdfs_path", "uniqueAttributes": { "name": "FinanceAll" } - } - ], - "options": { - "fetchType": "full", - "matchType": "startsWith" - } -}' "http://localhost:21000/api/atlas/admin/export" > financeAll.zip - - ----+++ Automatic Creation of HDFS entities -Given that HDFS entity creation is a manual process. The Export API offers a mechanism for creation of requested HDFS entities. diff --git a/docs/src/site/twiki/Import-Export-API.twiki b/docs/src/site/twiki/Import-Export-API.twiki deleted file mode 100644 index 4897eca84..000000000 --- a/docs/src/site/twiki/Import-Export-API.twiki +++ /dev/null @@ -1,43 +0,0 @@ ----+ Export & Import REST APIs - ----+++ What's New -The release of 0.8.3 includes the following improvements to Export and Import APIs: - * Export: Support for _[[Incremental-Export][Incremental Export]]_. - * Export & Import: Support for [[ReplicatedToFromAttributes][replicated attributes]] to entities made possible by _[[SoftReference][SoftReference]]_ entity attribute option. - * Export option: _[[Incremental-Export][skipLineage]]_. - * New entity transforms framework. - * New _[[AtlasServer][AtlasServer]]_ entity type. - * Export: [[Export-HDFS-API][Automatic creation of HDFS path]] requested entities. - * New [[ExportImportAudits][audits]] for Export & Import operations. - ----+++ Background -The Import-Export APIs for Atlas facilitate transfer of data to and from a cluster that has Atlas provisioned. - -The APIs when integrated with backup and/or disaster recovery process will ensure participation of Atlas. - ----+++ Introduction -There are 2 broad categories viz. Export & Import. The details of the APIs are discussed below. - -The APIs are available only to _admin_ user. - -Only a single import or export operation can be performed at a given time. The operations have a potential for generating large amount. They can also put pressure on resources. This restriction tries to alleviate this problem. - -For Import-Export APIs relating to HDFS path, can be found [[Import-Export-HDFS-Path][here]]. - -For additional information please refer to the following: - * [[https://issues.apache.org/jira/browse/ATLAS-1503][ATLAS-1503]] Original Import-Export API requirements. - * [[https://issues.apache.org/jira/browse/ATLAS-1618][ATLAS-1618]] Export API Scope Specification. - ----+++ Errors -If an import or export operation is initiated while another is in progress, the consumer will receive this error: - -"ATLAS5005E": "Another import or export is in progress. Please try again." - - -Unhandled errors will be returned as Internal error code 500. - ----++ REST API Reference - * __[[Export-API][Export]]__ - * __[[Export-HDFS-API][Export HDFS]]__ - * __[[Import-API][Import]]__ - * __[[Import-API-Options][Import Options]]__ diff --git a/docs/src/site/twiki/InstallationSteps.twiki b/docs/src/site/twiki/InstallationSteps.twiki deleted file mode 100644 index f38efd1ca..000000000 --- a/docs/src/site/twiki/InstallationSteps.twiki +++ /dev/null @@ -1,348 +0,0 @@ ----++ Building & Installing Apache Atlas - ----+++ Building Apache Atlas -Download Apache Atlas 2.0.0 release sources, apache-atlas-2.0.0-sources.tar.gz, from [[http://atlas.apache.org/Downloads.html][downloads]] page. -Then follow the instructions below to to build Apache Atlas. - -tar xvfz apache-atlas-2.0.0-sources.tar.gz -cd apache-atlas-sources-2.0.0/ -export MAVEN_OPTS="-Xms2g -Xmx2g" -mvn clean -DskipTests install - - ----+++ Packaging Apache Atlas -To create Apache Atlas package for deployment in an environment having functional Apache HBase and Apache Solr instances, build with the following command: - - -mvn clean -DskipTests package -Pdist - - * NOTES: - * Remove option '-DskipTests' to run unit and integration tests - * To build a distribution without minified js,css file, build with _skipMinify_ profile. By default js and css files are minified. - - -Above will build Apache Atlas for an environment having functional HBase and Solr instances. Apache Atlas needs to be setup with the following to run in this environment: - * Configure atlas.graph.storage.hostname (see "Graph persistence engine - HBase" in the [[Configuration][Configuration]] section). - * Configure atlas.graph.index.search.solr.zookeeper-url (see "Graph Search Index - Solr" in the [[Configuration][Configuration]] section). - * Set HBASE_CONF_DIR to point to a valid Apache HBase config directory (see "Graph persistence engine - HBase" in the [[Configuration][Configuration]] section). - * Create indices in Apache Solr (see "Graph Search Index - Solr" in the [[Configuration][Configuration]] section). - - ----+++ Packaging Apache Atlas with embedded Apache HBase & Apache Solr -To create Apache Atlas package that includes Apache HBase and Apache Solr, build with the embedded-hbase-solr profile as shown below: - - -mvn clean -DskipTests package -Pdist,embedded-hbase-solr - -Using the embedded-hbase-solr profile will configure Apache Atlas so that an Apache HBase instance and an Apache Solr instance will be started and stopped along with the Apache Atlas server. - -NOTE: This distribution profile is only intended to be used for single node development not in production. - ----+++ Packaging Apache Atlas with embedded Apache Cassandra & Apache Solr -To create Apache Atlas package that includes Apache Cassandra and Apache Solr, build with the embedded-cassandra-solr profile as shown below: - - -mvn clean package -Pdist,embedded-cassandra-solr - -Using the embedded-cassandra-solr profile will configure Apache Atlas so that an Apache Cassandra instance and an Apache Solr instance will be started and stopped along with the Atlas server. - -NOTE: This distribution profile is only intended to be used for single node development not in production. - ----+++ Apache Atlas Package -Build will create following files, which are used to install Apache Atlas. - - -distro/target/apache-atlas-${project.version}-bin.tar.gz -distro/target/apache-atlas-${project.version}-hbase-hook.tar.gz -distro/target/apache-atlas-${project.version}-hive-hook.gz -distro/target/apache-atlas-${project.version}-kafka-hook.gz -distro/target/apache-atlas-${project.version}-sources.tar.gz -distro/target/apache-atlas-${project.version}-sqoop-hook.tar.gz -distro/target/apache-atlas-${project.version}-storm-hook.tar.gz - ----+++ Installing & Running Apache Atlas - ----++++ Installing Apache Atlas -From the directory you would like Apache Atlas to be installed, run the following commands: - -tar -xzvf apache-atlas-${project.version}-server.tar.gz -cd atlas-${project.version} - ----++++ Running Apache Atlas with Local Apache HBase & Apache Solr -To run Apache Atlas with local Apache HBase & Apache Solr instances that are started/stopped along with Atlas start/stop, run following commands: - -export MANAGE_LOCAL_HBASE=true -export MANAGE_LOCAL_SOLR=true - -bin/atlas_start.py - ----++++ Using Apache Atlas - * To verify if Apache Atlas server is up and running, run curl command as shown below: - - curl -u username:password http://localhost:21000/api/atlas/admin/version - - {"Description":"Metadata Management and Data Governance Platform over Hadoop","Version":"2.0.0","Name":"apache-atlas"} - - * Run quick start to load sample model and data - - bin/quick_start.py - Enter username for atlas :- - Enter password for atlas :- - - - * Access Apache Atlas UI using a browser: http://localhost:21000 - ----++++ Stopping Apache Atlas Server -To stop Apache Atlas, run following command: - -bin/atlas_stop.py - - ----+++ Configuring Apache Atlas -By default config directory used by Apache Atlas is _{package dir}/conf_. To override this set environment variable ATLAS_CONF to the path of the conf dir. - -Environment variables needed to run Apache Atlas can be set in _atlas-env.sh_ file in the conf directory. This file will be sourced by Apache Atlas scripts before any commands are executed. The following environment variables are available to set. - - -# The java implementation to use. If JAVA_HOME is not found we expect java and jar to be in path -#export JAVA_HOME= - -# any additional java opts you want to set. This will apply to both client and server operations -#export ATLAS_OPTS= - -# any additional java opts that you want to set for client only -#export ATLAS_CLIENT_OPTS= - -# java heap size we want to set for the client. Default is 1024MB -#export ATLAS_CLIENT_HEAP= - -# any additional opts you want to set for atlas service. -#export ATLAS_SERVER_OPTS= - -# java heap size we want to set for the atlas server. Default is 1024MB -#export ATLAS_SERVER_HEAP= - -# What is is considered as atlas home dir. Default is the base location of the installed software -#export ATLAS_HOME_DIR= - -# Where log files are stored. Defatult is logs directory under the base install location -#export ATLAS_LOG_DIR= - -# Where pid files are stored. Defatult is logs directory under the base install location -#export ATLAS_PID_DIR= - -# Where do you want to expand the war file. By Default it is in /server/webapp dir under the base install dir. -#export ATLAS_EXPANDED_WEBAPP_DIR= - -*Settings to support large number of metadata objects* - -If you plan to store large number of metadata objects, it is recommended that you use values tuned for better GC performance of the JVM. - -The following values are common server side options: - -export ATLAS_SERVER_OPTS="-server -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+PrintTenuringDistribution -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=dumps/atlas_server.hprof -Xloggc:logs/gc-worker.log -verbose:gc -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=1m -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintGCTimeStamps" - -The =-XX:SoftRefLRUPolicyMSPerMB= option was found to be particularly helpful to regulate GC performance for query heavy workloads with many concurrent users. - -The following values are recommended for JDK 8: - -export ATLAS_SERVER_HEAP="-Xms15360m -Xmx15360m -XX:MaxNewSize=5120m -XX:MetaspaceSize=100M -XX:MaxMetaspaceSize=512m" - -*NOTE for Mac OS users* -If you are using a Mac OS, you will need to configure the ATLAS_SERVER_OPTS (explained above). - -In _{package dir}/conf/atlas-env.sh_ uncomment the following line - -#export ATLAS_SERVER_OPTS= - -and change it to look as below - -export ATLAS_SERVER_OPTS="-Djava.awt.headless=true -Djava.security.krb5.realm= -Djava.security.krb5.kdc=" - -*Configuring Apache HBase as the storage backend for the Graph Repository* - -By default, Apache Atlas uses JanusGraph as the graph repository and is the only graph repository implementation available currently. Apache HBase versions currently supported are 1.1.x. For configuring Apache Atlas graph persistence on Apache HBase, please see "Graph persistence engine - HBase" in the [[Configuration][Configuration]] section for more details. - -Apache HBase tables used by Apache Atlas can be set using the following configurations: - -atlas.graph.storage.hbase.table=atlas -atlas.audit.hbase.tablename=apache_atlas_entity_audit - -*Configuring Apache Solr as the indexing backend for the Graph Repository* - -By default, Apache Atlas uses JanusGraph as the graph repository and is the only graph repository implementation available currently. For configuring JanusGraph to work with Apache Solr, please follow the instructions below - - * Install Apache Solr if not already running. The version of Apache Solr supported is 5.5.1. Could be installed from http://archive.apache.org/dist/lucene/solr/5.5.1/solr-5.5.1.tgz - - * Start Apache Solr in cloud mode. - !SolrCloud mode uses a !ZooKeeper Service as a highly available, central location for cluster management. - For a small cluster, running with an existing !ZooKeeper quorum should be fine. For larger clusters, you would want to run separate multiple !ZooKeeper quorum with at least 3 servers. - Note: Apache Atlas currently supports Apache Solr in "cloud" mode only. "http" mode is not supported. For more information, refer Apache Solr documentation - https://cwiki.apache.org/confluence/display/solr/SolrCloud - - * For e.g., to bring up an Apache Solr node listening on port 8983 on a machine, you can use the command: - - $SOLR_HOME/bin/solr start -c -z -p 8983 - - * Run the following commands from SOLR_BIN (e.g. $SOLR_HOME/bin) directory to create collections in Apache Solr corresponding to the indexes that Apache Atlas uses. In the case that the Apache Atlas and Apache Solr instances are on 2 different hosts, first copy the required configuration files from ATLAS_HOME/conf/solr on the Apache Atlas instance host to Apache Solr instance host. SOLR_CONF in the below mentioned commands refer to the directory where Apache Solr configuration files have been copied to on Apache Solr host: - - - $SOLR_BIN/solr create -c vertex_index -d SOLR_CONF -shards #numShards -replicationFactor #replicationFactor - $SOLR_BIN/solr create -c edge_index -d SOLR_CONF -shards #numShards -replicationFactor #replicationFactor - $SOLR_BIN/solr create -c fulltext_index -d SOLR_CONF -shards #numShards -replicationFactor #replicationFactor - - Note: If numShards and replicationFactor are not specified, they default to 1 which suffices if you are trying out solr with ATLAS on a single node instance. - Otherwise specify numShards according to the number of hosts that are in the Solr cluster and the maxShardsPerNode configuration. - The number of shards cannot exceed the total number of Solr nodes in your !SolrCloud cluster. - - The number of replicas (replicationFactor) can be set according to the redundancy required. - - Also note that Apache Solr will automatically be called to create the indexes when Apache Atlas server is started if the - SOLR_BIN and SOLR_CONF environment variables are set and the search indexing backend is set to 'solr5'. - - * Change ATLAS configuration to point to Apache Solr instance setup. Please make sure the following configurations are set to the below values in ATLAS_HOME/conf/atlas-application.properties - - atlas.graph.index.search.backend=solr - atlas.graph.index.search.solr.mode=cloud - atlas.graph.index.search.solr.zookeeper-url= eg: 10.1.6.4:2181,10.1.6.5:2181 - atlas.graph.index.search.solr.zookeeper-connect-timeout=. Default value is 60000 ms - atlas.graph.index.search.solr.zookeeper-session-timeout=. Default value is 60000 ms - -For more information on JanusGraph solr configuration , please refer http://docs.janusgraph.org/0.2.0/solr.html - -Pre-requisites for running Apache Solr in cloud mode - * Memory - Apache Solr is both memory and CPU intensive. Make sure the server running Apache Solr has adequate memory, CPU and disk. - Apache Solr works well with 32GB RAM. Plan to provide as much memory as possible to Apache Solr process - * Disk - If the number of entities that need to be stored are large, plan to have at least 500 GB free space in the volume where Apache Solr is going to store the index data - * !SolrCloud has support for replication and sharding. It is highly recommended to use !SolrCloud with at least two Apache Solr nodes running on different servers with replication enabled. - If using !SolrCloud, then you also need !ZooKeeper installed and configured with 3 or 5 !ZooKeeper nodes - -*Configuring Elasticsearch as the indexing backend for the Graph Repository (Tech Preview)* - -By default, Apache Atlas uses JanusGraph as the graph repository and is the only graph repository implementation available currently. For configuring JanusGraph to work with Elasticsearch, please follow the instructions below - - * Install an Elasticsearch cluster. The version currently supported is 5.6.4, and can be acquired from: https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.4.tar.gz - - * For simple testing a single Elasticsearch node can be started by using the 'elasticsearch' command in the bin directory of the Elasticsearch distribution. - - * Change Apache Atlas configuration to point to the Elasticsearch instance setup. Please make sure the following configurations are set to the below values in ATLAS_HOME/conf/atlas-application.properties - - atlas.graph.index.search.backend=elasticsearch - atlas.graph.index.search.hostname= - atlas.graph.index.search.elasticsearch.client-only=true - -For more information on JanusGraph configuration for elasticsearch, please refer http://docs.janusgraph.org/0.2.0/elasticsearch.html - -*Configuring Kafka Topics* - -Apache Atlas uses Apache Kafka to ingest metadata from other components at runtime. This is described in the [[Architecture][Architecture page]] -in more detail. Depending on the configuration of Apache Kafka, sometimes you might need to setup the topics explicitly before -using Apache Atlas. To do so, Apache Atlas provides a script =bin/atlas_kafka_setup.py= which can be run from Apache Atlas server. In some -environments, the hooks might start getting used first before Apache Atlas server itself is setup. In such cases, the topics -can be run on the hosts where hooks are installed using a similar script =hook-bin/atlas_kafka_setup_hook.py=. Both these -use configuration in =atlas-application.properties= for setting up the topics. Please refer to the [[Configuration][Configuration page]] -for these details. - ----++++ Setting up Apache Atlas -There are a few steps that setup dependencies of Apache Atlas. One such example is setting up the JanusGraph schema in the storage backend of choice. In a simple single server setup, these are automatically setup with default configuration when the server first accesses these dependencies. - -However, there are scenarios when we may want to run setup steps explicitly as one time operations. For example, in a multiple server scenario using [[HighAvailability][High Availability]], it is preferable to run setup steps from one of the server instances the first time, and then start the services. - -To run these steps one time, execute the command =bin/atlas_start.py -setup= from a single Apache Atlas server instance. - -However, Apache Atlas server does take care of parallel executions of the setup steps. Also, running the setup steps multiple times is idempotent. Therefore, if one chooses to run the setup steps as part of server startup, for convenience, then they should enable the configuration option =atlas.server.run.setup.on.start= by defining it with the value =true= in the =atlas-application.properties= file. - ----+++ Examples: calling Apache Atlas REST APIs -Here are few examples of calling Apache Atlas REST APIs via curl command. - * List the types in the repository - - curl -u username:password http://localhost:21000/api/atlas/v2/types/typedefs/headers - [ {"guid":"fa421be8-c21b-4cf8-a226-fdde559ad598","name":"Referenceable","category":"ENTITY"}, - {"guid":"7f3f5712-521d-450d-9bb2-ba996b6f2a4e","name":"Asset","category":"ENTITY"}, - {"guid":"84b02fa0-e2f4-4cc4-8b24-d2371cd00375","name":"DataSet","category":"ENTITY"}, - {"guid":"f93975d5-5a5c-41da-ad9d-eb7c4f91a093","name":"Process","category":"ENTITY"}, - {"guid":"79dcd1f9-f350-4f7b-b706-5bab416f8206","name":"Infrastructure","category":"ENTITY"} - ] - - * List the instances for a given type - - curl -u username:password http://localhost:21000/api/atlas/v2/search/basic?typeName=hive_db - { - "queryType":"BASIC", - "searchParameters":{ - "typeName":"hive_db", - "excludeDeletedEntities":false, - "includeClassificationAttributes":false, - "includeSubTypes":true, - "includeSubClassifications":true, - "limit":100, - "offset":0 - }, - "entities":[ - { - "typeName":"hive_db", - "guid":"5d900c19-094d-4681-8a86-4eb1d6ffbe89", - "status":"ACTIVE", - "displayText":"default", - "classificationNames":[], - "attributes":{ - "owner":"public", - "createTime":null, - "qualifiedName":"default@cl1", - "name":"default", - "description":"Default Hive database" - } - }, - { - "typeName":"hive_db", - "guid":"3a0b14b0-ab85-4b65-89f2-e418f3f7f77c", - "status":"ACTIVE", - "displayText":"finance", - "classificationNames":[], - "attributes":{ - "owner":"hive", - "createTime":null, - "qualifiedName":"finance@cl1", - "name":"finance", - "description":null - } - } - ] - } - - * Search for entities - - curl -u username:password http://localhost:21000/api/atlas/v2/search/dsl?query=hive_db%20where%20name='default' - { - "queryType":"DSL", - "queryText":"hive_db where name='default'", - "entities":[ - { - "typeName":"hive_db", - "guid":"5d900c19-094d-4681-8a86-4eb1d6ffbe89", - "status":"ACTIVE", - "displayText":"default", - "classificationNames":[], - "attributes":{ - "owner":"public", - "createTime":null, - "qualifiedName":"default@cl1", - "name":"default", - "description": - "Default Hive database" - } - } - ] - } - - ----+++ Troubleshooting - ----++++ Setup issues -If the setup of Apache Atlas service fails due to any reason, the next run of setup (either by an explicit invocation of -=atlas_start.py -setup= or by enabling the configuration option =atlas.server.run.setup.on.start=) will fail with -a message such as =A previous setup run may not have completed cleanly.=. In such cases, you would need to manually -ensure the setup can run and delete the Zookeeper node at =/apache_atlas/setup_in_progress= before attempting to -run setup again. - -If the setup failed due to Apache HBase schema setup errors, it may be necessary to repair Apache HBase schema. If no -data has been stored, one can also disable and drop the Apache HBase tables used by Apache Atlas and run setup again. diff --git a/docs/src/site/twiki/LICENSE.txt b/docs/src/site/twiki/LICENSE.txt deleted file mode 100755 index d3b580f7d..000000000 --- a/docs/src/site/twiki/LICENSE.txt +++ /dev/null @@ -1,3 +0,0 @@ -All files in this directory and subdirectories are under Apache License Version 2.0. -The reason being Maven Doxia plugin that converts twiki to html does not have -commenting out feature. diff --git a/docs/src/site/twiki/Notifications.twiki b/docs/src/site/twiki/Notifications.twiki deleted file mode 100644 index fb1e694b5..000000000 --- a/docs/src/site/twiki/Notifications.twiki +++ /dev/null @@ -1,73 +0,0 @@ ----+ Notifications - ----++ Notifications from Apache Atlas -Apache Atlas sends notifications about metadata changes to Kafka topic named ATLAS_ENTITIES . -Applications interested in metadata changes can monitor for these notifications. -For example, Apache Ranger processes these notifications to authorize data access based on classifications. - - ----+++ Notifications - V2: Apache Atlas version 1.0 -Apache Atlas 1.0 sends notifications for following operations on metadata. - - - ENTITY_CREATE: sent when an entity instance is created - ENTITY_UPDATE: sent when an entity instance is updated - ENTITY_DELETE: sent when an entity instance is deleted - CLASSIFICATION_ADD: sent when classifications are added to an entity instance - CLASSIFICATION_UPDATE: sent when classifications of an entity instance are updated - CLASSIFICATION_DELETE: sent when classifications are removed from an entity instance - - -Notification includes the following data. - - AtlasEntity entity; - OperationType operationType; - List classifications; - - ----+++ Notifications - V1: Apache Atlas version 0.8.x and earlier -Notifications from Apache Atlas version 0.8.x and earlier have content formatted differently, as detailed below. - -__Operations__ - - ENTITY_CREATE: sent when an entity instance is created - ENTITY_UPDATE: sent when an entity instance is updated - ENTITY_DELETE: sent when an entity instance is deleted - TRAIT_ADD: sent when classifications are added to an entity instance - TRAIT_UPDATE: sent when classifications of an entity instance are updated - TRAIT_DELETE: sent when classifications are removed from an entity instance - - -Notification includes the following data. - - Referenceable entity; - OperationType operationType; - List traits; - - -Apache Atlas 1.0 can be configured to send notifications in older version format, instead of the latest version format. -This can be helpful in deployments that are not yet ready to process notifications in latest version format. -To configure Apache Atlas 1.0 to send notifications in earlier version format, please set following configuration in - atlas-application.properties: - - - atlas.notification.entity.version=v1 - - ----++ Notifications to Apache Atlas -Apache Atlas can be notified of metadata changes and lineage via notifications to Kafka topic named ATLAS_HOOK. -Atlas hooks for Apache Hive/Apache HBase/Apache Storm/Apache Sqoop use this mechanism to notify Apache Atlas of events of interest. - - -ENTITY_CREATE : create an entity. For more details, refer to Java class HookNotificationV1.EntityCreateRequest -ENTITY_FULL_UPDATE : update an entity. For more details, refer to Java class HookNotificationV1.EntityUpdateRequest -ENTITY_PARTIAL_UPDATE : update specific attributes of an entity. For more details, refer to HookNotificationV1.EntityPartialUpdateRequest -ENTITY_DELETE : delete an entity. For more details, refer to Java class HookNotificationV1.EntityDeleteRequest -ENTITY_CREATE_V2 : create an entity. For more details, refer to Java class HookNotification.EntityCreateRequestV2 -ENTITY_FULL_UPDATE_V2 : update an entity. For more details, refer to Java class HookNotification.EntityUpdateRequestV2 -ENTITY_PARTIAL_UPDATE_V2 : update specific attributes of an entity. For more details, refer to HookNotification.EntityPartialUpdateRequestV2 -ENTITY_DELETE_V2 : delete one or more entities. For more details, refer to Java class HookNotification.EntityDeleteRequestV2 - - - - diff --git a/docs/src/site/twiki/security.twiki b/docs/src/site/twiki/security.twiki deleted file mode 100755 index 2a8a386ea..000000000 --- a/docs/src/site/twiki/security.twiki +++ /dev/null @@ -1,263 +0,0 @@ ----+ Security Features of Apache Atlas - - ----++ Overview - -The following features are available for enhancing the security of the platform: - * SSL - * Service Authentication - * SPNEGO-based HTTP Authentication - ----+++ SSL - -Both SSL one-way (server authentication) and two-way (server and client authentication) are supported. The following application properties (properties configured in the atlas-application.properties file) are available for configuring SSL: - - * atlas.enableTLS (false|true) [default: false] - enable/disable the SSL listener - * keystore.file - the path to the keystore file leveraged by the server. This file contains the server certificate. - * truststore.file - the path to the truststore file. This file contains the certificates of other trusted entities (e.g. the certificates for client processes if two-way SSL is enabled). In most instances this can be set to the same value as the keystore.file property (especially if one-way SSL is enabled). - * client.auth.enabled (false|true) [default: false] - enable/disable client authentication. If enabled, the client will have to authenticate to the server during the transport session key creation process (i.e. two-way SSL is in effect). - * cert.stores.credential.provider.path - the path to the Credential Provider store file. The passwords for the keystore, truststore, and server certificate are maintained in this secure file. Utilize the cputil script in the 'bin' directoy (see below) to populate this file with the passwords required. - * atlas.ssl.exclude.cipher.suites - the excluded Cipher Suites list - *NULL.*,.*RC4.*,.*MD5.*,.*DES.*,.*DSS.* are weak and unsafe Cipher Suites that are excluded by default. If additional Ciphers need to be excluded, set this property with the default Cipher Suites such as atlas.ssl.exclude.cipher.suites=.*NULL.*, .*RC4.*, .*MD5.*, .*DES.*, .*DSS.*, and add the additional Ciper Suites to the list with a comma separator. They can be added with their full name or a regular expression. The Cipher Suites listed in the atlas.ssl.exclude.cipher.suites property will have precedence over the default Cipher Suites. One would keep the default Cipher Suites, and add additional ones to be safe. - ----++++ Credential Provider Utility Script - -In order to prevent the use of clear-text passwords, the Atlas platofrm makes use of the Credential Provider facility for secure password storage (see [[http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/CommandsManual.html#credential][Hadoop Credential Command Reference]] for more information about this facility). The cputil script in the 'bin' directory can be leveraged to create the password store required. - -To create the credential provdier for Atlas: - - * cd to the 'bin' directory - * type './cputil.py' - * Enter the path for the generated credential provider. The format for the path is: - * jceks://file/local/file/path/file.jceks or jceks://hdfs@namenodehost:port/path/in/hdfs/to/file.jceks. The files generally use the ".jceks" extension (e.g. test.jceks) - * Enter the passwords for the keystore, truststore, and server key (these passwords need to match the ones utilized for actually creating the associated certificate store files). - - The credential provider will be generated and saved to the path provided. - ----+++ Service Authentication - -The Atlas platform, upon startup, is associated to an authenticated identity. By default, in an insecure environment, that identity is the same as the OS authenticated user launching the server. However, in a secure cluster leveraging kerberos, it is considered a best practice to configure a keytab and principal in order for the platform to authenticate to the KDC. This allows the service to subsequently interact with other secure cluster services (e.g. HDFS). - -The properties for configuring service authentication are: - - * atlas.authentication.method (simple|kerberos) [default: simple] - the authentication method to utilize. Simple will leverage the OS authenticated identity and is the default mechanism. 'kerberos' indicates that the service is required to authenticate to the KDC leveraging the configured keytab and principal. - * atlas.authentication.keytab - the path to the keytab file. - * atlas.authentication.principal - the principal to use for authenticating to the KDC. The principal is generally of the form "user/host@realm". You may use the '_HOST' token for the hostname and the local hostname will be substituted in by the runtime (e.g. "Atlas/_HOST@EXAMPLE.COM"). - -Note that when Atlas is configured with HBase as the storage backend in a secure cluster, the graph db (JanusGraph) needs sufficient user permissions to be able to create and access an HBase table. To grant the appropriate permissions see [[Configuration][Graph persistence engine - Hbase]]. - ----+++ JAAS configuration - -In a secure cluster, some of the components (such as Kafka) that Atlas interacts with, require Atlas to authenticate itself to them using JAAS. The following properties are used to set up appropriate JAAS Configuration. - - * atlas.jaas.client-id.loginModuleName - the authentication method used by the component (for example, com.sun.security.auth.module.Krb5LoginModule) - * atlas.jaas.client-id.loginModuleControlFlag (required|requisite|sufficient|optional) [default: required] - * atlas.jaas.client-id.option.useKeyTab (true|false) - * atlas.jaas.client-id.option.storeKey (true | false) - * atlas.jaas.client-id.option.serviceName - service name of server component - * atlas.jaas.client-id.option.keyTab = - * atlas.jaas.client-id.option.principal = - -For example, the following property settings in jaas-application.properties file - - - -atlas.jaas.KafkaClient.loginModuleName = com.sun.security.auth.module.Krb5LoginModule -atlas.jaas.KafkaClient.loginModuleControlFlag = required -atlas.jaas.KafkaClient.option.useKeyTab = true -atlas.jaas.KafkaClient.option.storeKey = true -atlas.jaas.KafkaClient.option.serviceName = kafka -atlas.jaas.KafkaClient.option.keyTab = /etc/security/keytabs/kafka_client.keytab -atlas.jaas.KafkaClient.option.principal = kafka-client-1@EXAMPLE.COM - -atlas.jaas.MyClient.0.loginModuleName = com.sun.security.auth.module.Krb5LoginModule -atlas.jaas.MyClient.0.loginModuleControlFlag = required -atlas.jaas.MyClient.0.option.useKeyTab = true -atlas.jaas.MyClient.0.option.storeKey = true -atlas.jaas.MyClient.0.option.serviceName = kafka -atlas.jaas.MyClient.0.option.keyTab = /etc/security/keytabs/kafka_client.keytab -atlas.jaas.MyClient.0.option.principal = kafka-client-1@EXAMPLE.COM - -atlas.jaas.MyClient.1.loginModuleName = com.sun.security.auth.module.Krb5LoginModule -atlas.jaas.MyClient.1.loginModuleControlFlag = optional -atlas.jaas.MyClient.1.option.useKeyTab = true -atlas.jaas.MyClient.1.option.storeKey = true -atlas.jaas.MyClient.1.option.serviceName = kafka -atlas.jaas.MyClient.1.option.keyTab = /etc/security/keytabs/kafka_client.keytab -atlas.jaas.MyClient.1.option.principal = kafka-client-1@EXAMPLE.COM - - - -will set the JAAS configuration that is equivalent to the following jaas.conf file entries. - - - -KafkaClient { - com.sun.security.auth.module.Krb5LoginModule required - useKeyTab=true - storeKey=true - serviceName=kafka - keyTab="/etc/security/keytabs/kafka_client.keytab" - principal="kafka-client-1@EXAMPLE.COM"; -}; -MyClient { - com.sun.security.auth.module.Krb5LoginModule required - useKeyTab=true - storeKey=true - serviceName=kafka keyTab="/etc/security/keytabs/kafka_client.keytab" - principal="kafka-client-1@EXAMPLE.COM"; -}; -MyClient { - com.sun.security.auth.module.Krb5LoginModule optional - useKeyTab=true - storeKey=true - serviceName=kafka - keyTab="/etc/security/keytabs/kafka_client.keytab" - principal="kafka-client-1@EXAMPLE.COM"; -}; - - - - ----+++ SPNEGO-based HTTP Authentication - -HTTP access to the Atlas platform can be secured by enabling the platform's SPNEGO support. There are currently two supported authentication mechanisms: - - * simple - authentication is performed via a provided user name - * kerberos - the KDC authenticated identity of the client is leveraged to authenticate to the server - -The kerberos support requires the client accessing the server to first authenticate to the KDC (usually this is done via the 'kinit' command). Once authenticated, the user may access the server (the authenticated identity will be related to the server via the SPNEGO negotiation mechanism). - -The properties for configuring the SPNEGO support are: - - * atlas.http.authentication.enabled (true|false) [default: false] - a property indicating whether to enable HTTP authentication - * atlas.http.authentication.type (simple|kerberos) [default: simple] - the authentication type - * atlas.http.authentication.kerberos.principal - the web-application Kerberos principal name. The Kerberos principal name must start with "HTTP/...". For example: "HTTP/localhost@LOCALHOST". There is no default value. - * atlas.http.authentication.kerberos.keytab - the path to the keytab file containing the credentials for the kerberos principal. - * atlas.rest.address - ://: - -For a more detailed discussion of the HTTP authentication mechanism refer to [[http://hadoop.apache.org/docs/stable/hadoop-auth/Configuration.html][Hadoop Auth, Java HTTP SPNEGO 2.6.0 - Server Side Configuration]]. The prefix that document references is "atlas.http.authentication" in the case of the Atlas authentication implementation. - ----+++ Client security configuration - -When leveraging Atlas client code to communicate with an Atlas server configured for SSL transport and/or Kerberos authentication, there is a requirement to provide the Atlas client configuration file that provides the security properties that allow for communication with, or authenticating to, the server. -Update the atlas-application.properties file with the appropriate settings (see below) and copy it to the client's classpath or to the directory specified by the "atlas.conf" system property. - -The client properties for SSL communication are: - - * atlas.enableTLS (false|true) [default: false] - enable/disable the SSL client communication infrastructure. - * keystore.file - the path to the keystore file leveraged by the client. This file is only required if 2-Way SSL is enabled at the server and contains the client certificate. - * truststore.file - the path to the truststore file. This file contains the certificates of trusted entities (e.g. the certificates for the server or a shared certification authority). This file is required for both one-way or two-way SSL. - * cert.stores.credential.provider.path - the path to the Credential Provider store file. The passwords for the keystore, truststore, and client certificate are maintained in this secure file. - -The property required for authenticating to the server (if authentication is enabled): - - * atlas.http.authentication.type (simple|kerberos) [default: simple] - the authentication type - ----+++ SOLR Kerberos configuration -If the authentication type specified is 'kerberos', then the kerberos ticket cache will be accessed for authenticating to the server (Therefore the client is required to authenticate to the KDC prior to communication with the server using 'kinit' or a similar mechanism). - -See [[https://cwiki.apache.org/confluence/display/RANGER/How+to+configure+Solr+Cloud+with+Kerberos+for+Ranger+0.5][the Apache SOLR Kerberos configuration]]. - - * Add principal and generate the keytab file for solr. Create a keytab per host for each host where Solr is going to run and use the principal name with the host (e.g. addprinc -randkey solr/${HOST1}@EXAMPLE.COM. Replace ${HOST1} with the actual host names). - - - kadmin.local - kadmin.local: addprinc -randkey solr/@EXAMPLE.COM - kadmin.local: xst -k solr.keytab solr/@EXAMPLE.COM - kadmin.local: quit - - - - * Add principal and generate the keytab file for authenticating HTTP request. (Note that if Ambari is used to Kerberize the cluster, the keytab /etc/security/keytabs/spnego.service.keytab can be used) - - - kadmin.local - kadmin.local: addprinc -randkey HTTP/@EXAMPLE.COM - kadmin.local: xst -k HTTP.keytab HTTP/@EXAMPLE.COM - kadmin.local: quit - - - * Copy the keytab file to all the hosts running Solr. - - - cp solr.keytab /etc/security/keytabs/ - chmod 400 /etc/security/keytabs/solr.keytab - - cp HTTP.keytab /etc/security/keytabs/ - chmod 400 /etc/security/keytabs/HTTP.keytab - - - - * Create path in Zookeeper for storing the Solr configs and other parameters. - - - $SOLR_INSTALL_HOME/server/scripts/cloud-scripts/zkcli.sh -zkhost $ZK_HOST:2181 -cmd makepath solr - - - - * Upload the configuration to Zookeeper. - - - $SOLR_INSTALL_HOME/server/scripts/cloud-scripts/zkcli.sh -cmd upconfig -zkhost $ZK_HOST:2181/solr -confname basic_configs -confdir $SOLR_INSTALL_HOME/server/solr/configsets/_default/conf - - - - * Create the JAAS configuration. - - - vi /etc/solr/conf/solr_jaas.conf - - Client { - com.sun.security.auth.module.Krb5LoginModule required - useKeyTab=true - keyTab="/etc/security/keytabs/solr.keytab" - storeKey=true - useTicketCache=true - debug=true - principal="solr/@EXAMPLE.COM"; - }; - - - - * Copy /etc/solr/conf/solr_jaas.conf to all hosts running Solr. - - * Edit solr.in.sh in $SOLR_INSTALL_HOME/bin/ - - - vi $SOLR_INSTALL_HOME/bin/solr.in.sh - - SOLR_JAAS_FILE=/etc/solr/conf/solr_jaas.conf - SOLR_HOST=`hostname -f` - ZK_HOST="$ZK_HOST1:2181,$ZK_HOST2:2181,$ZK_HOST3:2181/solr" - KERBEROS_REALM="EXAMPLE.COM" - SOLR_KEYTAB=/etc/solr/conf/solr.keytab - SOLR_KERB_PRINCIPAL=HTTP@${KERBEROS_REALM} - SOLR_KERB_KEYTAB=/etc/solr/conf/HTTP.keytab - SOLR_AUTHENTICATION_CLIENT_CONFIGURER="org.apache.solr.client.solrj.impl.Krb5HttpClientConfigurer" - SOLR_AUTHENTICATION_OPTS=" -DauthenticationPlugin=org.apache.solr.security.KerberosPlugin -Djava.security.auth.login.config=${SOLR_JAAS_FILE} -Dsolr.kerberos.principal=${SOLR_KERB_PRINCIPAL} -Dsolr.kerberos.keytab=${SOLR_KERB_KEYTAB} -Dsolr.kerberos.cookie.domain=${SOLR_HOST} -Dhost=${SOLR_HOST} -Dsolr.kerberos.name.rules=DEFAULT" - - - * Copy solr.in.sh to all hosts running Solr. - - * Set up Solr to use the Kerberos plugin by uploading the security.json. - - - $SOLR_INSTALL_HOME/server/scripts/cloud-scripts/zkcli.sh -zkhost :2181 -cmd put /security.json '{"authentication":{"class": "org.apache.solr.security.KerberosPlugin"}}' - - - * Start Solr. - - - $SOLR_INSTALL_HOME/bin/solr start -cloud -z $ZK_HOST1:2181,$ZK_HOST2:2181,$ZK_HOST3:2181 -noprompt - - - * Test Solr - - - kinit -k -t /etc/security/keytabs/HTTP.keytab HTTP/@EXAMPLE.COM - curl --negotiate -u : "http://:8983/solr/" - - - - * Create collections in Solr corresponding to the indexes that Atlas uses and change the Atlas configuration to point to the Solr instance setup as described in the [[InstallationSteps][Install Steps]]. - diff --git a/docs/theme/components/shared/Header/GithubLink/index.js b/docs/theme/components/shared/Header/GithubLink/index.js new file mode 100644 index 000000000..38d47fc10 --- /dev/null +++ b/docs/theme/components/shared/Header/GithubLink/index.js @@ -0,0 +1,64 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +import styled from "styled-components"; +import GitHubButton from "react-github-btn"; + +const GitHubDivContent = styled.div` + width: auto; + padding: 0; + float: right; + margin-right: 2px; + margin-left: 12px; + display: ${p => (p.showGithubLink ? "display-inline" : "none")}; +`; + +const GithubLinkProps = { + repository: "https://github.com/apache/atlas/" +}; + +export const GithubLink = ({ repository, ...props }) => { + return ( + + + Fork + + + + Download + + + + Star + + + ); +}; \ No newline at end of file diff --git a/docs/theme/components/shared/Header/HeaderDropDown/Basic.js b/docs/theme/components/shared/Header/HeaderDropDown/Basic.js new file mode 100644 index 000000000..e98016165 --- /dev/null +++ b/docs/theme/components/shared/Header/HeaderDropDown/Basic.js @@ -0,0 +1,69 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Select from "react-dropdown-select"; +import React, { Fragment, useState } from "react"; +import styled from "styled-components"; +import * as colors from "../../../../styles/colors"; + +const Basic = props => { + let { options, ...rest } = props; + const [value, setValue] = useState([ + { id: 1, href: "/", title: "Latest", label: "Latest" } + ]); + + const ComponentStyle = styled.div` + > div { + display: inline-block; + width: 145px; + } + label { + margin-right: 5px; + } + `; + + return ( + + + + { + onSearch && onSearch(ev.target.value); + }} + /> + +); +Search.defaultProps = SearchProps; \ No newline at end of file diff --git a/docs/theme/components/shared/Sidebar/Docz.js b/docs/theme/components/shared/Sidebar/Docz.js new file mode 100644 index 000000000..bbd8cae1b --- /dev/null +++ b/docs/theme/components/shared/Sidebar/Docz.js @@ -0,0 +1,27 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +import { SFC } from "react"; + +const DoczProps = { + width: "", + className: "" +}; + +export const Docz = ({ width = 100, className }) => ; diff --git a/docs/theme/components/shared/Sidebar/Hamburger.js b/docs/theme/components/shared/Sidebar/Hamburger.js new file mode 100644 index 000000000..e2743c9f5 --- /dev/null +++ b/docs/theme/components/shared/Sidebar/Hamburger.js @@ -0,0 +1,135 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +import { SFC } from "react"; +import styled from "styled-components"; + +import { get } from "../../../utils/theme"; +import { mq } from "../../../styles/responsive"; + +const OpenProps = { + opened: true +}; + +const IconFirst = p => (!p.opened ? "0px" : "10px"); +const IconMiddle = p => (!p.opened ? "1" : "0"); +const IconLast = p => (!p.opened ? "0px" : "-6px"); +const IconRotate = p => (!p.opened ? "0deg" : "45deg"); + +const Icon = styled.div` + position: relative; + width: 23px; + height: 32px; + transform: translateX(${p => (p.opened ? "-2px" : "-1px")}) + translateY(${p => (p.opened ? "0" : "2px")}) + scale(${p => (p.opened ? 0.8 : 1)}); +`; +Icon.defaultProps = OpenProps; +const sidebarBg = get("colors.sidebarBg"); +const sidebarPrimary = get("colors.sidebarPrimary"); +const sidebarText = get("colors.sidebarText"); +const primaryColor = get("colors.primary"); +const backgroundColor = get("colors.background"); +const textColor = get("colors.text"); + +const IconLine = styled.span` + content: ""; + display: block; + position: absolute; + width: 100%; + height: 2px; + left: 0; + right: 0; + background: ${p => (p.opened ? sidebarText(p) : textColor(p))}; + transition: transform 0.3s, opacity 0.3s; + + &:nth-of-type(1) { + top: -2px; + transform: translateY(${IconFirst}) rotate(${IconRotate}); + } + + &:nth-of-type(2) { + top: 6px; + opacity: ${IconMiddle}; + } + + &:nth-of-type(3) { + top: 14px; + transform: translateY(${IconLast}) rotate(-${IconRotate}); + } +`; +IconLine.defaultProps = OpenProps; + +const translateX = p => (!p.opened ? "10px" : "-6px"); +const translateY = p => (!p.opened ? "4px" : "0px"); + +const radii = get("radii"); + +const ToggleButton = styled.button` + cursor: pointer; + z-index: 99; + position: absolute; + display: flex; + align-items: center; + justify-content: center; + padding: 5px 6px; + width: 33px; + height: 30px; + top: ${p => (p.opened ? "3px" : "2px")}; + right: ${p => (p.opened ? "-39px" : "-27px")}; + transform: translateX(${translateX}) translateY(${translateY}); + transition: transform 0.3s; + outline: none; + border: none; + background: ${p => (p.opened ? sidebarBg(p) : backgroundColor(p))}; + border-radius: ${p => (p.opened ? `0 0 ${radii(p)} 0` : `${radii(p)}`)}; + + &:before { + position: absolute; + content: ""; + top: -3px; + left: 0; + width: calc(100% + 1px); + height: ${p => (p.opened ? "3px" : 0)}; + background: ${p => sidebarPrimary(p) || primaryColor(p)}; + } + + ${mq({ + display: ["block", "block", "block", "none"] + })}; +`; +ToggleButton.defaultProps = OpenProps; + +// interface HamburgerProps extends OpenProps { +// onClick: (ev: React.SyntheticEvent) => void +// } + +const HamburgerProps = Object.assign({}, OpenProps, { + onClick: ev => null +}); + +export const Hamburger = ({ opened, onClick }) => ( + + + + + + + +); diff --git a/docs/theme/components/shared/Sidebar/Menu.js b/docs/theme/components/shared/Sidebar/Menu.js new file mode 100644 index 000000000..c9e606dea --- /dev/null +++ b/docs/theme/components/shared/Sidebar/Menu.js @@ -0,0 +1,127 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +import { useState } from "react"; +import ChevronDown from "react-feather/dist/icons/chevron-down"; +import styled from "styled-components"; + +import { MenuLink } from "./MenuLink"; +import { get } from "../../../utils/theme"; + +import { SubMenu } from "./SubMenu"; +import Utils from "../../../utils/utils"; +export const MenuItem = { + id: "", + name: "", + route: "", + href: "", + menu: [], + order: Number, + parent: "" +}; + +const Wrapper = styled.div` + display: flex; + flex-direction: column; +`; + +const OpenedProps = { + opened: false +}; + +const List = styled.dl` + flex: 1; + overflow-y: auto; + visibility: ${p => (p.opened ? "visible" : "hidden")}; + max-height: ${p => (p.opened ? "auto" : "0px")}; +`; + +List.defaultProps = OpenedProps; + +const iconRotate = p => (p.opened ? "-180deg" : "0deg"); + +const Icon = styled.div` + position: absolute; + top: 50%; + right: 20px; + transform: translateY(-50%) rotate(${iconRotate}); + transform-origin: 50% 50%; + transition: transform 0.3s; + & svg { + stroke: ${get("colors.sidebarText")}; + } +`; +Icon.defaultProps = OpenedProps; +const MenuProps = { + item: MenuItem, + sidebarToggle: null, + collapseAll: true +}; + +const MenuState = { + opened: false, + hasActive: false +}; +export const Menu = props => { + const { item, sidebarToggle, handleActiveMenu, activeMenu } = props; + const opened = Utils.checkMenuIsOPen(props); + const show = opened; + const hasChildren = !item.href && item.menu && item.menu.length > 0; + const hasToggle = !item.href && !item.route; + const handleToggle = ev => { + ev.preventDefault(); + handleActiveMenu(item); + }; + const options = { handleActiveMenu, activeMenu }; + let OutputHtml = ( + + + {` ${item.name} `} + {hasChildren && ( + + + + )} + + {hasChildren && ( + + {item.menu && + item.menu.map(dataItem => ( + + + + ))} + + )} + + ); + + if (!hasChildren && !hasToggle) { + OutputHtml = ( + + + {`${item.name} `} + + + ); + } + return OutputHtml; +}; +Menu.defaultProps = MenuProps; +Menu.defaultProps = MenuState; \ No newline at end of file diff --git a/docs/theme/components/shared/Sidebar/MenuHeadings.js b/docs/theme/components/shared/Sidebar/MenuHeadings.js new file mode 100644 index 000000000..b370cb6e3 --- /dev/null +++ b/docs/theme/components/shared/Sidebar/MenuHeadings.js @@ -0,0 +1,51 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +import { SFC } from "react"; +import { Entry, useDocs, useConfig } from "../../../../docz-lib/docz/dist"; +import { Location } from "@reach/router"; +import styled from "styled-components"; +import get from "lodash/get"; + +import { SmallLink } from "./SmallLink"; + +const Submenu = styled.div` + display: flex; + flex-direction: column; + margin: 5px 0 0 24px; +`; + +const getHeadings = (route, docs) => { + const doc = docs.find(doc => doc.route === route); + const headings = get(doc, "headings"); + return headings ? headings.filter(heading => heading.depth === 2) : []; +}; + +const MenuHeadingsProps = { + route: "", + onClick: null +}; + +export const MenuHeadings = ({ route, onClick }) => { + const docs = useDocs(); + const { linkComponent: Link } = useConfig(); + const headings = docs && getHeadings(route, docs); + + return null; +}; diff --git a/docs/theme/components/shared/Sidebar/MenuLink.js b/docs/theme/components/shared/Sidebar/MenuLink.js new file mode 100644 index 000000000..282ebfdb8 --- /dev/null +++ b/docs/theme/components/shared/Sidebar/MenuLink.js @@ -0,0 +1,191 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +import { useMemo, useEffect, useRef, useState } from "react"; +import { useConfig, usePrevious } from "../../../../docz-lib/docz/dist"; +//import { MenuItem } from "./Menu"; +import styled, { css } from "styled-components"; +import _isArray from "lodash/fp/isArray"; + +import { MenuHeadings } from "./MenuHeadings"; +import { get } from "../../../utils/theme"; + +export const MenuItem = { + id: "", + name: "", + route: "", + href: "", + menu: [], + order: Number, + parent: "" +}; + +const WrapperProps = { + active: false, + theme: null +}; + +const hrefLinks = css` + font-weight: normal !important; + color: #807e7e !important; + &:hover, + &.active { + color: ${p => + get("colors.sidebarPrimary")(p) || get("colors.primary")(p)} !important; + } +`; + +const activeWrapper = css` + padding-left: 0; + &:after { + width: 1px; + } +`; + +const Wrapper = styled.div` + position: relative; + transition: padding 0.2s; + + &:after { + position: absolute; + display: block; + content: ""; + top: 30px; + left: 24px; + width: 0; + height: calc(100% - 36px); + border-left: 1px dashed ${get("colors.sidebarBorder")}; + transition: width 0.2s; + } + + ${p => p.active && activeWrapper}; +`; +Wrapper.defaultProps = WrapperProps; +export const createLink = Link => styled(Link)` + position: relative; + display: block; + padding: 4px 15px; + font-weight: 600; + font-size: 18px; + letter-spacing: -0.02em; + color: ${get("colors.sidebarText")}; + text-decoration: none; + transition: color 0.2s; + + &:hover, + &:visited { + color: ${get("colors.sidebarText")}; + } + + &:hover, + &.active { + color: ${p => get("colors.sidebarPrimary")(p) || get("colors.primary")(p)}; + font-weight: 600; + } + ${p => { + return checkChildMenu(p) ? hrefLinks : ""; + }} +`; + +const checkChildMenu = obj => { + const { partiallyActive, to, children } = obj; + return partiallyActive && !`REST API,ASF`.includes(children.trim()); +}; + +const LinkAnchor = createLink(styled.a``); + +const getActiveByLocation = route => { + if (typeof window === "undefined") return; + return location.pathname.slice(0, location.pathname.length - 1) === route; +}; + +const getActiveFromClass = (el = null, route = undefined) => { + const activeByClass = el && el.classList.contains("active"); + const activeByLocation = route && getActiveByLocation(route); + return Boolean(activeByClass || activeByLocation); +}; + +const checkActiveClass = ($el, isActive) => { + if (!isActive) return; + if (isActive && !$el.classList.contains("active")) { + $el.classList.add("active"); + } +}; + +const LinkProps = { + item: MenuItem, + onClick: React.MouseEventHandler, + className: "", + innerRef: node => null, + children: React.ReactNode, + onActiveChange: active => null +}; + +export const MenuLink = React.forwardRef( + ({ item, children, onClick, onActiveChange }, ref) => { + const { linkComponent } = useConfig(); + const [active, setActive] = useState(false); + const prevActive = usePrevious(active); + const $el = useRef(ref); + const Link = useMemo(() => createLink(linkComponent), [linkComponent]); + + const linkProps = { + children, + onClick + }; + + useEffect(() => { + const isActive = getActiveFromClass($el.current, item.route); + if (prevActive !== isActive) { + setActive(isActive); + $el && checkActiveClass($el.current, isActive); + //isActive && onActiveChange && onActiveChange(item.name); + } + }); + return ( + + {item.route ? ( + + ) : ( + { + ev.preventDefault(); + linkProps.onClick && linkProps.onClick(ev); + } + })} + /> + )} + {active && item.route && } + + ); + } +); + +MenuLink.displayName = "MenuLink"; \ No newline at end of file diff --git a/docs/theme/components/shared/Sidebar/SmallLink.js b/docs/theme/components/shared/Sidebar/SmallLink.js new file mode 100644 index 000000000..ebd5398e9 --- /dev/null +++ b/docs/theme/components/shared/Sidebar/SmallLink.js @@ -0,0 +1,90 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +import { SFC, useState, useEffect } from "react"; +import { WindowLocation } from "@reach/router"; +import styled from "styled-components"; + +import { get as themeGet } from "../../../utils/theme"; + +const sidebarPrimary = themeGet("colors.sidebarPrimary"); +const primaryColor = themeGet("colors.primary"); + +export const LinkProps = { + to: "", + onClick: React.MouseEventHandler +}; +const Link = styled.a` + position: relative; + font-size: 14px; + padding: 0 0 5px 16px; + text-decoration: none; + opacity: 0.5; + transition: opacity 0.2s; + + &, + &:visited, + &.active { + color: ${themeGet("colors.sidebarText")}; + } + + &.active { + opacity: 1; + } + + &:before { + z-index: 1; + position: absolute; + display: block; + content: ""; + top: 1px; + left: 0; + width: 0; + height: 20px; + background: ${p => sidebarPrimary(p) || primaryColor(p)}; + transition: width 0.2s; + } + + &.active:before { + width: 2px; + } +`; +Link.defaultProps = LinkProps; + +const SmallLinkProps = Object.assign({}, LinkProps, { + as: null, + slug: "" + //location: WindowLocation +}); + +export const SmallLink = ({ as: Component, slug, location, ...props }) => { + const [isActive, setActive] = useState(false); + + useEffect(() => { + const decodedHash = decodeURI(location.hash); + const currentHash = decodedHash && decodedHash.slice(1, Infinity); + setActive(Boolean(slug === currentHash)); + }, [location]); + + return ( + + ); +}; + +SmallLink.defaultProps = SmallLinkProps; diff --git a/docs/theme/components/shared/Sidebar/SubMenu.js b/docs/theme/components/shared/Sidebar/SubMenu.js new file mode 100644 index 000000000..65221a04c --- /dev/null +++ b/docs/theme/components/shared/Sidebar/SubMenu.js @@ -0,0 +1,137 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +import { useState } from "react"; +import ChevronDown from "react-feather/dist/icons/chevron-down"; +import styled from "styled-components"; + +import { MenuLink } from "./MenuLink"; +import { get } from "../../../utils/theme"; +import Utils from "../../../utils/utils"; + +export const MenuItem = { + id: "", + name: "", + route: "", + href: "", + menu: [], + order: Number, + parent: "" +}; + +const Wrapper = styled.div` + display: flex; + flex-direction: column; +`; + +const OpenedProps = { + opened: false +}; + +const List = styled.dl` + flex: 1; + overflow-y: auto; + visibility: ${p => (p.opened ? "visible" : "hidden")}; + max-height: ${p => (p.opened ? "auto" : "0px")}; +`; + +List.defaultProps = OpenedProps; + +const iconRotate = p => (p.opened ? "-180deg" : "0deg"); + +const Icon = styled.div` + position: absolute; + top: 50%; + right: 20px; + transform: translateY(-50%) rotate(${iconRotate}); + transform-origin: 50% 50%; + transition: transform 0.3s; + + & svg { + stroke: ${get("colors.sidebarText")}; + } +`; +Icon.defaultProps = OpenedProps; +const MenuProps = { + item: MenuItem, + sidebarToggle: null, + collapseAll: true +}; + +const MenuState = { + opened: true, + hasActive: true +}; +export const SubMenu = props => { + const { item, sidebarToggle, handleActiveMenu } = props; + const opened = Utils.checkMenuIsOPen(props); + const show = opened; + const hasChildren = !item.href && item.submenu && item.submenu.length > 0; + const hasToggle = !item.href && !item.route; + const hasSubMenu = ""; + const handleToggle = ev => { + ev.preventDefault(); + handleActiveMenu(item); + }; + const lengthOfSubMenu = item.submenu && item.submenu.length; + + let output = ""; + + if (lengthOfSubMenu > 0 && item.name !== item.submenu[0].name) { + output = ( + + + {`${item.name}`} + {hasChildren && ( + + + + )} + + + {hasChildren && ( + + {item.submenu && + item.menu.map(dataItem => ( +

+ + {`${dataItem.name}`} + +
+ ))} + + )} + + ); + } else { + output = ( + + {item.submenu && + item.submenu.map(dataItem => ( +
+ {`${dataItem.name}`} +
+ ))} +
+ ); + } + return output; +}; +SubMenu.defaultProps = MenuProps; +SubMenu.defaultProps = MenuState; \ No newline at end of file diff --git a/docs/theme/components/shared/Sidebar/index.js b/docs/theme/components/shared/Sidebar/index.js new file mode 100644 index 000000000..93c8743a4 --- /dev/null +++ b/docs/theme/components/shared/Sidebar/index.js @@ -0,0 +1,478 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +function _interopDefault(ex) { + return ex && typeof ex === "object" && "default" in ex ? ex["default"] : ex; +} +import { + createContext, + createElement, + useContext, + Component, + useMemo, + useRef, + Fragment, + SFC, + useState, + useEffect +} from "react"; +import * as React from "react"; + +import { + useMenus, + useWindowSize, + usePrevious, + doczState +} from "../../../../docz-lib/docz/dist"; +import styled from "styled-components"; +import _unionBy from "lodash/fp/unionBy"; +import _get from "lodash/fp/get"; +import { Logo } from "../Logo"; +import { Search } from "../Search"; +import { Menu } from "./Menu"; +import { Docz } from "./Docz"; +import { Hamburger } from "./Hamburger"; +import { MenuLink } from "./MenuLink"; +import { SubMenu } from "./SubMenu"; +import { get } from "../../../utils/theme"; +import { mq, breakpoints } from "../../../styles/responsive"; +import Utils from "../../../utils/utils"; + +const _pipe = _interopDefault(require("lodash/fp/pipe")); +const _omit = _interopDefault(require("lodash/fp/omit")); +const sort = _interopDefault(require("array-sort")); +const _flattenDepth = _interopDefault(require("lodash/fp/flattenDepth")); +const match = _interopDefault(require("match-sorter")); +const ulid = require("ulid"); +const WrapperProps = { + opened: true, + theme: "" +}; + +const sidebarBg = get("colors.sidebarBg"); +const sidebarText = get("colors.sidebarText"); +const sidebarBorder = get("colors.sidebarBorder"); +const Wrapper = styled.div` + position: relative; + width: 320px; + min-width: 320px; + min-height: 100vh; + background: ${sidebarBg}; + transition: transform 0.2s, background 0.3s; + z-index: 1000; + + ${mq({ + position: ["absolute", "absolute", "absolute", "relative"] + })}; + + dl { + padding: 0; + margin: 0 10px; + } + + dl a { + font-weight: 400; + } + + @media screen and (max-width: ${breakpoints.desktop - 1}px) { + transform: translateX(${p => (p.opened ? "-100%" : "0")}); + position: ${p => (p.opened ? "auto" : "fixed")}; + } + + ${get("styles.sidebar")}; +`; + +Wrapper.defaultProps = WrapperProps; +const GitHubDivContainer = styled.div` + position: relative; +`; +const GitHubDivContent = styled.div` + position: fixed; + top: 0px; + right: 10px; +`; + +const Content = styled.div` + position: fixed; + top: 0; + left: 0; + display: flex; + flex-direction: column; + width: 280px; + min-width: 320px; + height: 100%; + max-height: 100vh; + background: ${sidebarBg}; +`; + +const Menus = styled.nav` + flex: 1; + overflow-y: auto; + margin-bottom: 10px; +`; + +const Empty = styled.div` + flex: 1; + opacity: 0.7; + padding: 0 24px; + color: ${sidebarText}; +`; + +const Footer = styled.div` + padding: 10px 0; + display: flex; + align-items: center; + justify-content: center; + font-size: 14px; + color: ${sidebarText}; + border-top: 1px dashed ${sidebarBorder}; +`; + +const FooterLink = styled.a` + padding: 0; + margin: 0; + margin-left: 5px; +`; + +const FooterLogo = styled(Docz)` + fill: ${sidebarText}; +`; + +const OpenProps = { + opened: false +}; +const ToggleBackground = styled.div` + content: ""; + display: ${p => (p.opened ? "none" : "block")}; + position: fixed; + background-color: rgba(0, 0, 0, 0.4); + width: 100vw; + height: 100vh; + top: 0; + bottom: 0; + left: 0; + right: 0; + cursor: pointer; + z-index: 99; +`; +const UNKNOWN_POS = Infinity; +function compare(a, b, reverse) { + if (a < b) return reverse ? 1 : -1; + if (a > b) return reverse ? -1 : 1; + return 0; +} +const sortByName = (a, b) => { + return a.name < b.name ? -1 : a.name > b.name ? 1 : 0; +}; +const findPos = (item, orderedList = []) => { + const name = typeof item !== "string" ? _get("name", item) : item; + const pos = orderedList.findIndex(item => item === name); + return pos !== -1 ? pos : UNKNOWN_POS; +}; +const compareWithMenu = (to = []) => (a, b) => { + const list = to.map(i => i.name || i); + return compare(findPos(a, list), findPos(b, list)); +}; +const noMenu = entry => !entry.submenu; +const parseItemStr = item => + typeof item === "string" + ? { + name: item + } + : item; +const normalize = item => { + const selected = parseItemStr(item); + return Object.assign({}, selected, { + id: selected.id || ulid.ulid(), + parent: _get("parent", selected) || _get("parent", item), + menu: Array.isArray(selected.menu) + ? selected.menu.map(normalize) + : selected.menu + }); +}; + +const clean = item => (item.href || item.route ? _omit("menu", item) : item); +const normalizeAndClean = _pipe(normalize, clean); +const fromMenu = submenu => entry => entry.submenu === submenu; + +const entryAsMenu = entry => ({ + name: entry.name, + route: entry.route, + parent: entry.parent, + submenu: entry.submenu, + menu: entry.menu +}); + +function flatArrFromObject(arr, prop, menus) { + const reducer = (arr, obj) => { + const value = _get(prop)(obj); + + return value ? arr.concat([value]) : arr; + }; + + return Array.from(new Set(arr.reduce(reducer, []))); +} +const entriesOfSubMenu = (submenu, entries) => + entries.filter(fromMenu(submenu)).map(entryAsMenu); +const entriesOfMenu = (menu, entries) => + entries.filter(fromMenu(menu)).map(entryAsMenu); +const parseMenu = entries => name => ({ + name, + menu: entriesOfMenu(name, entries) +}); + +// const parseSubMenu = entries => name => ({ +// name, +// submenu: entriesOfSubMenu(name, entries), +// menu:entries.menu +// }); + +const parseSubMenu = function parseSubMenu(entries) { + return function(name) { + return { + name: name, + submenu: entriesOfSubMenu(name, entries), + menu: entriesOfMenu(name, entries) + }; + }; +}; +const menusFromEntries = entries => { + const entriesWithoutMenu = entries.filter(noMenu).map(entryAsMenu); + const menus = flatArrFromObject(entries, "menu").map(parseMenu(entries)); + const submenus = flatArrFromObject(entries, "submenu", menus).map( + parseSubMenu(entries) + ); + + for (var x in menus) { + for (var without of entriesWithoutMenu) { + if (without.name == menus[x].name) { + menus[x] = without; + break; + } + } + } + for (var x in menus) { + for (var y in submenus) { + if (menus[x].name == submenus[y].menu[0].menu) { + if (menus[x].menu.length > 0) { + menus[x].menu.push(submenus[y]); + } else { + menus[x].menu.push(submenus[y]); + } + } + } + } + return _unionBy("name", menus, entriesWithoutMenu); +}; +const mergeMenus = (entriesMenu, configMenu) => { + const first = entriesMenu.map(normalizeAndClean); + const second = configMenu.map(normalizeAndClean); + + const merged = _unionBy("name", first, second); + return merged.map(item => { + if (!item.menu) return item; + const found = second.find(i => i.name === item.name); + const foundMenu = found && found.menu; + return Object.assign({}, item, { + menu: foundMenu + ? mergeMenus(item.menu, foundMenu) + : item.menu || found.menu + }); + }); +}; +const sortMenus = (first, second = []) => { + const sorted = sort(first, compareWithMenu(second), sortByName); + return sorted.map(item => { + if (!item.menu) return item; + const found = second.find(menu => menu.name === item.name); + const foundMenu = found && found.menu; + return Object.assign({}, item, { + menu: foundMenu ? sortMenus(item.menu, foundMenu) : item.menu + }); + }); +}; +const search = (val, menu) => { + const items = menu.map(item => [item].concat(item.menu || [])); + + const flattened = _flattenDepth(2, items); + + const flattenedDeduplicated = [...new Set(flattened)]; + const matchedValues = match(flattenedDeduplicated, val, { + keys: ["name"] + }); + return matchedValues; +}; + +const filterMenus = (items, filter) => { + if (!filter) return items; + return items.filter(filter).map(item => { + if (!item.menu) return item; + return Object.assign({}, item, { + menu: item.menu.filter(filter) + }); + }); +}; +const useMenusCustom = opts => { + const { query = "" } = opts || {}; + const { entries, config } = useContext(doczState.context); + if (!entries) return null; + const arr = entries.map(({ value }) => value); + + const entriesMenu = menusFromEntries(arr); + + const sorted = React.useMemo(() => { + const merged = mergeMenus(entriesMenu, config.menu); + const result = sortMenus(merged, config.menu); + return filterMenus(result, opts && opts.filter); + }, [entries, config]); + return query && query.length > 0 ? search(query, sorted) : sorted; + // return entriesMenu; +}; + +ToggleBackground.defaultProps = OpenProps; +const getActiveMenu = () => { + const { localStorageKeys } = Utils; + let act_menu = JSON.parse(localStorage.getItem(localStorageKeys.ACTIVEMENU)); + if (!act_menu) { + act_menu = ["Documentation"]; + localStorage.setItem(localStorageKeys.ACTIVEMENU, JSON.stringify(act_menu)); + } + return act_menu; +}; +export const Sidebar = () => { + const [activeMenu, setActiveMenu] = useState(getActiveMenu()); + const [hidden, setHidden] = useState(true); + const [query, setQuery] = useState(""); + const menus = useMenusCustom({ query }); + const windowSize = useWindowSize(); + const isDesktop = windowSize.innerWidth >= breakpoints.desktop; + const prevIsDesktop = usePrevious(isDesktop); + const navRef = useRef(); + + useEffect(() => { + if (!hidden && !prevIsDesktop && isDesktop) { + setHidden(true); + document.documentElement.classList.remove("with-overlay"); + } + }); + + useEffect(() => { + const { localStorageKeys } = Utils; + const navTop = parseInt(localStorage.getItem(localStorageKeys.NAVPOSITION)); + if (navTop) { + navRef.current.scrollTop = navTop; + } + }, []); + + const addOverlayClass = isHidden => { + const method = !isHidden ? "add" : "remove"; + + if (typeof window !== "undefined" && !isDesktop) { + document.documentElement.classList[method]("with-overlay"); + } + }; + + const handleSidebarToggle = () => { + if (isDesktop) return; + setHidden(s => !s); + addOverlayClass(!hidden); + }; + const handleScroll = () => { + const { localStorageKeys } = Utils; + localStorage.setItem( + localStorageKeys.NAVPOSITION, + navRef.current.scrollTop + ); + }; + const handleActiveMenu = menu => { + const { localStorageKeys } = Utils; + const t_activeMenu = JSON.parse(JSON.stringify(activeMenu)); + const index = t_activeMenu.findIndex(a => a === menu.name); + if (index === -1) { + t_activeMenu.push(menu.name); + setActiveMenu(t_activeMenu); + } else { + t_activeMenu.splice(index, 1); + setActiveMenu([...t_activeMenu]); + } + localStorage.setItem( + localStorageKeys.ACTIVEMENU, + JSON.stringify(t_activeMenu) + ); + }; + let outputHtml = ( + + + + + + + {menus && menus.length === 0 ? ( + No documents founda. + ) : ( + + {menus && + menus.map(menu => ( + + ))} + + )} + {/*
+ Built with + + + +
*/} + + + + + ); + if (query.length > 0) { + outputHtml = ( + + + + + + + + + {menus && + menus.map(menu => ( + + ))} + + + + + ); + } + return outputHtml; +}; \ No newline at end of file diff --git a/docs/theme/components/shared/TeamList/index.js b/docs/theme/components/shared/TeamList/index.js new file mode 100644 index 000000000..719684536 --- /dev/null +++ b/docs/theme/components/shared/TeamList/index.js @@ -0,0 +1,140 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React, { Component } from "react"; +import axios from "axios"; +import { parseString } from "xml2js"; +import styled from "styled-components"; + +const TeamListStyle = styled.div` + > table { + font-family: "Inconsolata", monospace; + font-size: 14px; + display: table; + table-layout: auto; + color: #13161f; + width: 100%; + padding: 0; + box-shadow: 0 0 0 1px #529d8b; + background-color: transparent; + border-spacing: 0; + border-collapse: collapse; + border-style: hidden; + border-radius: 2px; + overflow-y: hidden; + overflow-x: initial; + } + > table tr { + display: table-row; + vertical-align: inherit; + border-color: inherit; + } + > table tr > td { + padding: 15px; + line-height: 2; + font-weight: 200; + } + > table > thead { + color: #7d899c; + background: #f5f6f7; + } + > table > tbody tr { + display: table-row; + border-top: 1px solid #529d8b; + } + > table > thead > tr > th { + font-weight: 400; + padding: 15px; + } +`; + +export default class TeamList extends Component { + constructor(props) { + super(props); + this.state = { + isLoading: true, + displayData: [] + }; + this.fetchData(); + } + + fetchData() { + axios + .get(`https://raw.githubusercontent.com/apache/atlas/master/pom.xml`) + .then(res => { + // Transform the raw data by extracting the nested posts + parseString(res.data, (err, result) => { + const developersList = result.project.developers[0].developer; + const developersListLength = developersList.length; + let t_displayData = []; + const keys = Object.keys(developersList[0]); + for (var i = 0; i < developersListLength; i++) { + const obj = {}; + keys.map(k => (obj[k] = developersList[i][k])); + t_displayData.push(obj); + } + this.setState({ displayData: t_displayData, isLoading: false }); + }); + }) + .catch(err => { + console.log("fetching data from pom.xml is failed."); + }); + } + + render() { + const { displayData, isLoading } = this.state; + return ( + + + + + + + + + + + + + + {isLoading ? ( + + + + ) : displayData.length === 0 ? ( + "Not found" + ) : ( + displayData.map((data, i) => { + return ( + + + + + + + + + ); + }) + )} + +
IdNameEmailOrganizationRolesTime Zone
loading...
{data.id.toString()}{data.name.toString()}{data.email.toString()}{data.organization.toString()}{data.roles.map(r => r.role.toString())}{data.timezone.toString()}
+
+ ); + } +} \ No newline at end of file diff --git a/docs/theme/components/shared/common/CustomLink.js b/docs/theme/components/shared/common/CustomLink.js new file mode 100644 index 000000000..8b2720f9e --- /dev/null +++ b/docs/theme/components/shared/common/CustomLink.js @@ -0,0 +1,30 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React from "react"; + +const CustomLink = props => { + const style = { color: "#4a90e2" }; + return ( + + {props.children} + + ); +}; + +export { CustomLink }; \ No newline at end of file diff --git a/docs/theme/components/shared/index.js b/docs/theme/components/shared/index.js new file mode 100644 index 000000000..94cccc5f1 --- /dev/null +++ b/docs/theme/components/shared/index.js @@ -0,0 +1,21 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { GithubLink } from "./Header/GithubLink"; +export { Sidebar } from "./Sidebar"; +export { Main } from "./Main"; \ No newline at end of file diff --git a/docs/theme/components/ui/Blockquote.js b/docs/theme/components/ui/Blockquote.js new file mode 100644 index 000000000..356945929 --- /dev/null +++ b/docs/theme/components/ui/Blockquote.js @@ -0,0 +1,32 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import styled from "styled-components"; +import { get } from "../../utils/theme"; + +export const Blockquote = styled.blockquote` + background: ${get("colors.blockquoteBg")}; + border-left: 5px solid ${get("colors.blockquoteBorder")}; + color: ${get("colors.blockquoteColor")}; + ${get("styles.blockquote")}; + + & > p { + margin: 0; + color: ${get("colors.blockquoteColor")}; + } +`; \ No newline at end of file diff --git a/docs/theme/components/ui/Button.js b/docs/theme/components/ui/Button.js new file mode 100644 index 000000000..dfca21cfb --- /dev/null +++ b/docs/theme/components/ui/Button.js @@ -0,0 +1,31 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import styled from "styled-components"; + +export const Button = styled.button` + cursor: pointer; + display: flex; + align-items: center; + outline: none; + border: none; +`; + +export const ButtonLink = styled(Button)` + background: transparent; +`; \ No newline at end of file diff --git a/docs/theme/components/ui/CodeMirror/index.js b/docs/theme/components/ui/CodeMirror/index.js new file mode 100644 index 000000000..1f283a9de --- /dev/null +++ b/docs/theme/components/ui/CodeMirror/index.js @@ -0,0 +1,150 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +import { useEffect, useRef, SFC } from "react"; +import { useConfig } from "../../../../docz-lib/docz/dist"; +import { Controlled as BaseCodeMirror } from "react-codemirror2"; +import PerfectScrollbar from "react-perfect-scrollbar"; +import styled from "styled-components"; + +import { get } from "~utils/theme"; + +import { ScrollbarStyles } from "./ps-scrollbar"; +import * as themes from "./themes"; + +import "codemirror/mode/markdown/markdown"; +import "codemirror/mode/javascript/javascript"; +import "codemirror/mode/jsx/jsx"; +import "codemirror/mode/css/css"; +import "codemirror/addon/edit/matchbrackets"; +import "codemirror/addon/edit/closetag"; +import "codemirror/addon/fold/xml-fold"; + +const Scrollbar = styled(PerfectScrollbar)` + overflow: auto; + position: relative; + max-height: ${p => 25 * p.linesToScroll}px; + + .ps__rail-y { + z-index: 9; + opacity: 0.4; + } +`; + +const preStyles = get("styles.pre"); +const EditorStyled = styled(BaseCodeMirror)` + ${themes.dark}; + ${themes.light}; + position: relative; + flex: 1; + + .CodeMirror { + max-width: 100%; + height: 100%; + } + + .CodeMirror-gutters { + left: 1px !important; + } + + .CodeMirror-lines { + padding: 10px 0; + box-sizing: content-box; + } + + .CodeMirror-line { + padding: 0 10px; + } + + .CodeMirror-linenumber { + padding: 0 7px 0 5px; + } + + &, + .CodeMirror pre { + ${preStyles}; + } +`; + +const scrollbarOpts = { + wheelSpeed: 2, + wheelPropagation: true, + minScrollbarLength: 20, + suppressScrollX: true +}; + +const noCurrent = (val: any) => !val || !val.current; + +const CodeMirror: SFC = props => { + const { themeConfig } = useConfig(); + const editor = useRef < any > null; + const forceUpdateEditorTimeout = useRef(0); + const previousEditor = useRef(0); + const linesToScroll = themeConfig.linesToScrollEditor || 14; + + const editorProps = { + ...props, + editorDidMount: (codemirror: any) => { + props.editorDidMount && props.editorDidMount(codemirror); + editor.current = codemirror; + } + }; + + const refreshCodeMirror = () => { + if (noCurrent(editor)) return; + editor.current.refresh(); + }; + + const clearForceUpdateCodeMirror = () => { + if (noCurrent(forceUpdateEditorTimeout)) return; + clearTimeout(forceUpdateEditorTimeout.current); + }; + + const forceUpdateCodeMirror = () => { + if (noCurrent(editor)) return; + clearForceUpdateCodeMirror(); + + forceUpdateEditorTimeout.current = setTimeout(() => { + const currentHeight = editor.current.getScrollInfo().height || 0; + const hasNoHeight = currentHeight <= 0; + + // Don't refresh if no height (CodeMirror is not visible) or + // Don't refresh if same height + if (hasNoHeight || previousEditor === currentHeight) return; + refreshCodeMirror(); + previousEditor.current = editor.current.getScrollInfo().height || 0; + }); + }; + + useEffect(() => { + forceUpdateCodeMirror(); + return () => clearForceUpdateCodeMirror(); + }, []); + + return ( + + + + + + + ); +}; + +export default CodeMirror; \ No newline at end of file diff --git a/docs/theme/components/ui/CodeMirror/ps-scrollbar.js b/docs/theme/components/ui/CodeMirror/ps-scrollbar.js new file mode 100644 index 000000000..bacaefc05 --- /dev/null +++ b/docs/theme/components/ui/CodeMirror/ps-scrollbar.js @@ -0,0 +1,115 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { createGlobalStyle } from "styled-components"; + +export const ScrollbarStyles = createGlobalStyle` + /* + * Container style + */ + .ps { + overflow: hidden !important; + overflow-anchor: none; + -ms-overflow-style: none; + touch-action: auto; + -ms-touch-action: auto; + } + /* + * Scrollbar rail styles + */ + .ps__rail-x { + display: none; + opacity: 0; + transition: background-color 0.2s linear, opacity 0.2s linear; + -webkit-transition: background-color 0.2s linear, opacity 0.2s linear; + height: 15px; + /* there must be 'bottom' or 'top' for ps__rail-x */ + bottom: 0px; + /* please don't change 'position' */ + position: absolute; + } + .ps__rail-y { + display: none; + opacity: 0; + transition: background-color 0.2s linear, opacity 0.2s linear; + -webkit-transition: background-color 0.2s linear, opacity 0.2s linear; + width: 15px; + /* there must be 'right' or 'left' for ps__rail-y */ + right: 0; + /* please don't change 'position' */ + position: absolute; + } + .ps--active-x > .ps__rail-x, + .ps--active-y > .ps__rail-y { + display: block; + background-color: transparent; + } + /* + * Scrollbar thumb styles + */ + .ps__thumb-x { + background-color: #aaa; + border-radius: 4px; + transition: background-color 0.2s linear, height 0.2s ease-in-out; + -webkit-transition: background-color 0.2s linear, + height 0.2s ease-in-out; + height: 6px; + /* there must be 'bottom' for ps__thumb-x */ + bottom: 2px; + /* please don't change 'position' */ + position: absolute; + } + .ps__thumb-y { + background-color: #aaa; + border-radius: 4px; + transition: background-color 0.2s linear, width 0.2s ease-in-out; + -webkit-transition: background-color 0.2s linear, width 0.2s ease-in-out; + width: 6px; + /* there must be 'right' for ps__thumb-y */ + right: 2px; + /* please don't change 'position' */ + position: absolute; + } + .ps__rail-x:hover > .ps__thumb-x, + .ps__rail-x:focus > .ps__thumb-x, + .ps__rail-x.ps--clicking .ps__thumb-x { + background-color: #999; + height: 11px; + } + .ps__rail-y:hover > .ps__thumb-y, + .ps__rail-y:focus > .ps__thumb-y, + .ps__rail-y.ps--clicking .ps__thumb-y { + background-color: #999; + width: 11px; + } + /* MS supports */ + @supports (-ms-overflow-style: none) { + .ps { + overflow: auto !important; + } + } + @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .ps { + overflow: auto !important; + } + } + .scrollbar-container { + position: relative; + height: 100%; + } +`; \ No newline at end of file diff --git a/docs/theme/components/ui/CodeMirror/themes/dark.js b/docs/theme/components/ui/CodeMirror/themes/dark.js new file mode 100755 index 000000000..d666752c9 --- /dev/null +++ b/docs/theme/components/ui/CodeMirror/themes/dark.js @@ -0,0 +1,151 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { css } from "styled-components"; + +export const theme = css` + .CodeMirror.cm-s-docz-dark { + color: #d8dee9; + background-color: #2e3440; + border-radius: 0; + } + .cm-s-docz-dark .CodeMirror-selected { + background-color: rgba(67, 76, 94, 0.8); + } + .cm-s-docz-dark .CodeMirror-gutter, + .cm-s-docz-dark .CodeMirror-gutters { + border: none; + background-color: #2e3440; + border-radius: 0; + } + .cm-s-docz-dark .CodeMirror-linenumber, + .cm-s-docz-dark .CodeMirror-linenumbers { + color: rgba(216, 222, 233, 0.4) !important; + background-color: #2e3440; + } + .cm-s-docz-dark .CodeMirror-lines { + color: #d8dee9 !important; + background-color: transparent; + } + .cm-s-docz-dark .CodeMirror-cursor { + border-left: 2px solid #d8dee9 !important; + } + /* addon: edit/machingbrackets.js & addon: edit/matchtags.js */ + .cm-s-docz-dark .CodeMirror-matchingbracket, + .cm-s-docz-dark .CodeMirror-matchingtag { + border-bottom: 2px solid #81a1c1; + color: #d8dee9 !important; + background-color: transparent; + } + .cm-s-docz-dark .CodeMirror-nonmatchingbracket { + border-bottom: 2px solid #bf616a; + color: #d8dee9 !important; + background-color: transparent; + } + /* addon: fold/foldgutter.js */ + .cm-s-docz-dark .CodeMirror-foldmarker, + .cm-s-docz-dark .CodeMirror-foldgutter, + .cm-s-docz-dark .CodeMirror-foldgutter-open, + .cm-s-docz-dark .CodeMirror-foldgutter-folded { + border: none; + text-shadow: none; + color: #d8dee9 !important; + background-color: transparent; + } + /* addon: selection/active-line.js */ + .cm-s-docz-dark .CodeMirror-activeline-background { + background-color: rgba(67, 76, 94, 0.32); + } + /* basic syntax */ + .cm-s-docz-dark .cm-attribute { + color: #8fbcbb; + } + .cm-s-docz-dark .cm-keyword { + color: #81a1c1; + } + .cm-s-docz-dark .cm-def { + color: #d8dee9; + } + .cm-s-docz-dark .cm-atom { + color: #81a1c1; + } + .cm-s-docz-dark .cm-number { + color: #b48ead; + } + .cm-s-docz-dark .cm-property { + color: #d8dee9; + } + .cm-s-docz-dark .cm-qualifier { + color: #88c0d0; + } + .cm-s-docz-dark .cm-variable, + .cm-s-docz-dark .cm-variable-2 { + color: #88c0d0; + } + .cm-s-docz-dark .cm-variable-3 { + color: #d8dee9; + } + .cm-s-docz-dark .cm-string, + .cm-s-docz-dark .cm-string-2 { + color: #a3be8c; + } + .cm-s-docz-dark .cm-operator { + color: #81a1c1; + } + .cm-s-docz-dark .cm-meta { + color: #81a1c1; + } + .cm-s-docz-dark .cm-comment { + color: #4c566a; + } + .cm-s-docz-dark .cm-error { + color: #bf616a; + } + /* markdown */ + .cm-s-docz-dark .cm-header { + color: #88c0d0; + } + .cm-s-docz-dark .cm-quote { + color: #4c566a; + } + .cm-s-docz-dark .cm-link { + color: #88c0d0; + text-decoration: none; + } + .cm-s-docz-dark .cm-url { + color: #d8dee9; + text-decoration: underline; + } + .cm-s-docz-dark .cm-strong { + font-weight: bold; + } + .cm-s-docz-dark .cm-em { + font-style: italic; + } + /* diff */ + .cm-s-docz-dark .cm-negative { + color: #bf616a; + } + .cm-s-docz-dark .cm-positive { + color: #a3be8c; + } + /* html */ + .cm-s-docz-dark .cm-tag { + color: #81a1c1; + } +`; \ No newline at end of file diff --git a/docs/theme/components/ui/CodeMirror/themes/index.js b/docs/theme/components/ui/CodeMirror/themes/index.js new file mode 100755 index 000000000..d22712b92 --- /dev/null +++ b/docs/theme/components/ui/CodeMirror/themes/index.js @@ -0,0 +1,20 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { theme as light } from "./light"; +export { theme as dark } from "./dark"; \ No newline at end of file diff --git a/docs/theme/components/ui/CodeMirror/themes/light.js b/docs/theme/components/ui/CodeMirror/themes/light.js new file mode 100755 index 000000000..88b718c54 --- /dev/null +++ b/docs/theme/components/ui/CodeMirror/themes/light.js @@ -0,0 +1,125 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { css } from "styled-components"; + +export const theme = css` + .cm-s-docz-light.CodeMirror { + border-radius: 0; + background: #fbfcfd; + color: #24292e; + } + + .cm-s-docz-light .CodeMirror-gutters { + background: #fbfcfd; + border-right-width: 0; + border-radius: 0; + } + + .cm-s-docz-light .CodeMirror-guttermarker { + color: white; + } + + .cm-s-docz-light .CodeMirror-guttermarker-subtle { + color: #d0d0d0; + } + + .cm-s-docz-light .CodeMirror-linenumber { + color: #959da5; + background: #fbfcfd; + } + + .cm-s-docz-light .CodeMirror-cursor { + border-left: 1px solid #24292e; + } + + .cm-s-docz-light div.CodeMirror-selected, + .cm-s-docz-light .CodeMirror-line::selection, + .cm-s-docz-light .CodeMirror-line > span::selection, + .cm-s-docz-light .CodeMirror-line > span > span::selection, + .cm-s-docz-light .CodeMirror-line::-moz-selection, + .cm-s-docz-light .CodeMirror-line > span::-moz-selection, + .cm-s-docz-light .CodeMirror-line > span > span::-moz-selection { + background: #c8c8fa; + } + + .cm-s-docz-light .CodeMirror-activeline-background { + background: #fafbfc; + } + + .cm-s-docz-light .CodeMirror-matchingbracket { + text-decoration: underline; + color: #949495 !important; + } + + .cm-s-docz-light .CodeMirror-lines { + background: #fbfcfd; + } + + .cm-s-docz-light .cm-comment { + color: #6a737d; + } + + .cm-s-docz-light .cm-tag, + .cm-s-docz-light .cm-bracket { + color: #d73a49; + } + + .cm-s-docz-light .cm-constant { + color: #005cc5; + } + + .cm-s-docz-light .cm-entity { + font-weight: normal; + font-style: normal; + text-decoration: none; + color: #6f42c1; + } + + .cm-s-docz-light .cm-keyword { + font-weight: normal; + font-style: normal; + text-decoration: none; + color: #d73a49; + } + + .cm-s-docz-light .cm-storage { + color: #d73a49; + } + + .cm-s-docz-light .cm-string { + font-weight: normal; + font-style: normal; + text-decoration: none; + color: #005cc5; + } + + .cm-s-docz-light .cm-support { + font-weight: normal; + font-style: normal; + text-decoration: none; + color: #005cc5; + } + + .cm-s-docz-light .cm-variable { + font-weight: normal; + font-style: normal; + text-decoration: none; + color: #e36209; + } +`; \ No newline at end of file diff --git a/docs/theme/components/ui/InlineCode.js b/docs/theme/components/ui/InlineCode.js new file mode 100644 index 000000000..c0cbecf56 --- /dev/null +++ b/docs/theme/components/ui/InlineCode.js @@ -0,0 +1,26 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import styled from "styled-components"; +import { get } from "../../utils/theme"; + +export const InlineCode = styled.code` + background: ${get("colors.codeBg")}; + color: ${get("colors.codeColor")}; + ${get("styles.code")}; +`; \ No newline at end of file diff --git a/docs/theme/components/ui/Link.js b/docs/theme/components/ui/Link.js new file mode 100644 index 000000000..3200ded0a --- /dev/null +++ b/docs/theme/components/ui/Link.js @@ -0,0 +1,70 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +import { useMemo, SFC } from "react"; +import { useConfig, useDocs } from "../../../docz-lib/docz/dist"; +import styled from "styled-components"; + +import { get } from "../../utils/theme"; + +export const LinkStyled = styled.a` + &, + &:visited, + &:active { + text-decoration: none; + color: ${get("colors.link")}; + } + + &:hover { + color: ${get("colors.link")}; + } + + ${get("styles.link")}; +`; + +const getSeparator = (separator, href) => { + if (typeof window === "undefined") return null; + return [ + location.pathname + .split(separator) + .slice(0, -1) + .join(separator) + .slice(1), + (href || "").replace(/^(?:\.\/)+/gi, "") + ].join("/"); +}; + +export const Link = ({ href, ...props }) => { + const { separator, linkComponent: Link } = useConfig(); + const docs = useDocs(); + const toCheck = useMemo(() => getSeparator(separator, href), [ + separator, + href + ]); + + const matched = docs && docs.find(doc => doc.filepath === toCheck); + const nHref = matched ? matched.route : href; + const isInternal = nHref && nHref.startsWith("/"); + + return isInternal ? ( + + ) : ( + + ); +}; \ No newline at end of file diff --git a/docs/theme/components/ui/Loading.js b/docs/theme/components/ui/Loading.js new file mode 100644 index 000000000..f6fe47d18 --- /dev/null +++ b/docs/theme/components/ui/Loading.js @@ -0,0 +1,108 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +import { css, keyframes } from "styled-components"; +import styled from "styled-components"; + +import { get } from "../../utils/theme"; + +const Wrapper = styled.div` + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100vh; +`; + +const dash = keyframes` + to { + stroke-dashoffset: 1000; + } +`; + +const spinnerClass = (delay = 0) => css` + stroke-dasharray: 100; + animation: ${dash} 5s ${delay}s cubic-bezier(0.455, 0.03, 0.515, 0.955) + infinite; +`; + +const Lines = styled.path` + stroke: ${get("colors.primary")}; + stroke-width: 3px; +`; +const Path = styled.path` + fill: ${get("colors.primary")}; +`; +const Spinner = ({ size = 60 }) => ( + + + + + + + + + + +); + +export const Loading = () => ( + + + +); diff --git a/docs/theme/components/ui/NotFound.js b/docs/theme/components/ui/NotFound.js new file mode 100644 index 000000000..79a4242e8 --- /dev/null +++ b/docs/theme/components/ui/NotFound.js @@ -0,0 +1,58 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +import styled from "styled-components"; + +import { Sidebar, Main } from "../shared"; +import { get } from "../../utils/theme"; + +const Wrapper = styled.div` + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + width: 100%; + height: 100vh; + color: ${get("colors.text")}; + background: ${get("colors.background")}; +`; + +const Title = styled.h1` + margin: 0; + font-size: 42px; + font-weight: 400; + color: ${get("colors.primary")}; +`; + +const Subtitle = styled.p` + margin: 0; + font-size: 18px; +`; + +export const NotFound = () => ( +
+ + + Page Not Found + + Check if you changed the document route or deleted it! + + +
+); \ No newline at end of file diff --git a/docs/theme/components/ui/OrderedList.js b/docs/theme/components/ui/OrderedList.js new file mode 100644 index 000000000..f6957b200 --- /dev/null +++ b/docs/theme/components/ui/OrderedList.js @@ -0,0 +1,39 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import styled from "styled-components"; +import { get } from "../../utils/theme"; + +export const OrderedList = styled.ol` + list-style: none; + counter-reset: my-awesome-counter; + + & li { + counter-increment: my-awesome-counter; + } + + & li::before { + content: counter(my-awesome-counter) ". "; + color: ${get("colors.border")}; + font-weight: bold; + font-family: "Playfair Display", serif; + margin-right: 5px; + } + + ${get("styles.ol")}; +`; \ No newline at end of file diff --git a/docs/theme/components/ui/Page.js b/docs/theme/components/ui/Page.js new file mode 100644 index 000000000..496e8e78a --- /dev/null +++ b/docs/theme/components/ui/Page.js @@ -0,0 +1,106 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +import { SFC, Fragment } from "react"; +import { PageProps, useConfig } from "../../../docz-lib/docz/dist"; +import Edit from "react-feather/dist/icons/edit-2"; +import styled from "styled-components"; + +import { ButtonLink } from "./Button"; +import { GithubLink, Sidebar, Main } from "../shared"; +import { get } from "../../utils/theme"; +import { mq } from "../../styles/responsive"; +import Header from "../shared/Header"; +import Utils from "../../utils/utils"; + +const Wrapper = styled.div` + flex: 1; + color: ${get("colors.text")}; + background: ${get("colors.background")}; + min-width: 0; + position: relative; + padding-top: 50px; +`; + +export const Container = styled.div` + box-sizing: border-box; + margin: 0 auto; + + ${mq({ + width: ["100%", "100%", 920], + padding: ["20px", "0 40px 40px"] + })} + + ${get("styles.container")}; +`; + +const EditPage = styled(ButtonLink.withComponent("a"))` + display: flex; + align-items: center; + justify-content: center; + position: absolute; + padding: 2px 8px; + margin: 8px; + border-radius: ${get("radii")}; + border: 1px solid ${get("colors.border")}; + opacity: 0.7; + transition: opacity 0.4s; + font-size: 14px; + color: ${get("colors.text")}; + text-decoration: none; + text-transform: uppercase; + + &:hover { + opacity: 1; + background: ${get("colors.border")}; + } + + ${mq({ + visibility: ["hidden", "hidden", "visible"], + top: [0, -60, 32], + right: [0, 0, 40] + })}; +`; + +const EditIcon = styled(Edit)` + margin-right: 5px; +`; +export const Page = ({ children, doc: { link, fullpage, edit = false } }) => { + const { repository } = useConfig(); + const { props } = children; + const show = Utils.pagesForGithubLink.toString().includes(props.doc.name); + const content = ( + + {link && edit && ( + + Edit page + + )} +
+ {children} + + ); + return ( +
+ {repository && } + {!fullpage && } + {fullpage ? content : {content}} +
+ ); +}; \ No newline at end of file diff --git a/docs/theme/components/ui/Paragraph.js b/docs/theme/components/ui/Paragraph.js new file mode 100644 index 000000000..3aeee24c0 --- /dev/null +++ b/docs/theme/components/ui/Paragraph.js @@ -0,0 +1,25 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import styled from "styled-components"; +import { get } from "../../utils/theme"; + +export const Paragraph = styled.p` + color: ${get("colors.text")}; + ${get("styles.paragraph")}; +`; \ No newline at end of file diff --git a/docs/theme/components/ui/Pre.js b/docs/theme/components/ui/Pre.js new file mode 100644 index 000000000..939c74e5c --- /dev/null +++ b/docs/theme/components/ui/Pre.js @@ -0,0 +1,25 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +// import { Editor } from "./Editor"; + +{ + /*export const Pre = () => ;*/ +} +export const Pre = () =>
; \ No newline at end of file diff --git a/docs/theme/components/ui/Props/PropsRaw.js b/docs/theme/components/ui/Props/PropsRaw.js new file mode 100644 index 000000000..936a5b84d --- /dev/null +++ b/docs/theme/components/ui/Props/PropsRaw.js @@ -0,0 +1,116 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +import { useMemo } from "react"; +import { + PropsComponentProps, + useComponents +} from "../../../../docz-lib/docz/dist"; +import styled from "styled-components"; + +import { get } from "../../../utils/theme"; + +const Wrapper = styled.div` + display: flex; + flex-direction: column; + + & ~ & { + margin-top: 20px; + } +`; + +const Title = styled.div` + display: flex; + border-bottom: 1px solid ${get("colors.propsBg")}; +`; + +const PropName = styled.span` + background: ${get("colors.propsBg")}; + color: ${get("colors.primary")}; + padding: 5px 10px; + border-radius: 4px 4px 0 0; + font-size: 16px; + font-weight: 500; + + & ~ & { + margin-left: 5px; + } +`; + +const PropType = styled(PropName)` + color: ${get("colors.propsText")}; + background: ${get("colors.propsBg")}; + font-weight: 400; +`; + +const PropDefaultValue = styled(PropType)` + background: transparent; + padding-left: 0; + padding-right: 0; +`; + +const PropRequired = styled(PropType)` + flex: 1; + text-align: right; + background: transparent; + opacity: 0.5; +`; + +export const PropsRaw = ({ props, getPropType }) => { + const entries = Object.entries(props); + const components = useComponents(); + const Paragraph = useMemo( + () => styled(components.P || "p")` + font-size: 16px; + color: ${get("colors.sidebarText")}; + `, + [] + ); + + return ( + + {entries.map(([key, prop]) => { + if (!prop.type && !prop.flowType) return null; + return ( + + + <PropName>{key}</PropName> + <PropType>{getPropType(prop)}</PropType> + {prop.defaultValue && ( + <PropDefaultValue> + {prop.defaultValue.value === "''" ? ( + <em>= [Empty String]</em> + ) : ( + <em>= {prop.defaultValue.value.replace(/\'/g, '"')}</em> + )} + </PropDefaultValue> + )} + {prop.required && ( + <PropRequired> + <em>required</em> + </PropRequired> + )} + + {prop.description && {prop.description}} + + ); + })} + + ); +}; \ No newline at end of file diff --git a/docs/theme/components/ui/Props/PropsTable.js b/docs/theme/components/ui/Props/PropsTable.js new file mode 100644 index 000000000..d023bc0f0 --- /dev/null +++ b/docs/theme/components/ui/Props/PropsTable.js @@ -0,0 +1,157 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +import { useMemo } from "react"; +import { + PropsComponentProps, + useComponents +} from "../../../../docz-lib/docz/dist"; +import styled from "styled-components"; + +import { get } from "../../../utils/theme"; + +const breakpoint = "600px"; + +const Container = styled.div` + border: 1px solid ${get("colors.border")}; + border-radius: 4px; + overflow: hidden; + background: ${get("colors.propsBg")}; + color: ${get("colors.propsText")}; +`; + +const Line = styled.div` + padding: 8px 0; + + @media (min-width: ${breakpoint}) { + padding: O; + } + + & + & { + border-top: 1px solid ${get("colors.border")}; + } +`; + +const Column = styled.div` + min-width: 0; + padding: 2px 15px; + word-wrap: break-word; + + @media (min-width: ${breakpoint}) { + padding: 8px 15px; + } +`; + +const ColumnName = styled(Column)` + @media (min-width: ${breakpoint}) { + flex-basis: 25%; + } +`; + +const ColumnType = styled(Column)` + @media (min-width: ${breakpoint}) { + flex-basis: 50%; + } +`; + +const ColumnValue = styled(Column)` + @media (min-width: ${breakpoint}) { + flex-basis: 25%; + } +`; + +const Content = styled.div` + display: flex; + flex-direction: column; + font-family: ${get("fonts.mono")}; + + @media (min-width: ${breakpoint}) { + flex-wrap: nowrap; + flex-direction: row; + } +`; + +const PropName = styled.span` + color: ${get("colors.primary")}; + font-weight: bold; +`; + +const PropType = styled.span` + font-size: 0.9em; +`; + +const PropDefaultValue = styled.span` + font-size: 0.9em; +`; + +const PropRequired = styled.span` + font-size: 0.8em; + opacity: 0.8; +`; + +export const PropsTable = ({ props, getPropType }) => { + const entries = Object.entries(props); + const components = useComponents(); + const Paragraph = useMemo( + () => styled(components.P || "p")` + margin: 0; + font-size: 16px; + color: ${get("colors.blockquoteColor")}; + padding: 0 15px 8px 15px; + `, + [] + ); + + return ( + + {entries.map(([key, prop]) => { + if (!prop.type && !prop.flowType) return null; + return ( + + + + {key} + + + {getPropType(prop)} + + + {prop.defaultValue && ( + + {prop.defaultValue.value === "''" ? ( + = [Empty String] + ) : ( + = {prop.defaultValue.value.replace(/\'/g, '"')} + )} + + )} + {prop.required && ( + + required + + )} + + + {prop.description && {prop.description}} + + ); + })} + + ); +}; \ No newline at end of file diff --git a/docs/theme/components/ui/Props/index.js b/docs/theme/components/ui/Props/index.js new file mode 100644 index 000000000..4a9b0ec93 --- /dev/null +++ b/docs/theme/components/ui/Props/index.js @@ -0,0 +1,90 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +import { useState, useMemo } from "react"; +import { + PropsComponentProps, + useComponents +} from "../../../../docz-lib/docz/dist"; +import styled from "styled-components"; +import { PropsRaw } from "./PropsRaw"; +import { PropsTable } from "./PropsTable"; + +const Container = styled.div` + margin: 20px 0; +`; + +export const Props = ({ title, isRaw, isToggle, ...props }) => { + const [isOpen, setIsOpen] = useState(true); + + const components = useComponents(); + const Title = useMemo( + () => styled(components.H3 || "h3")` + padding: 8px 0; + position: relative; + ${!isRaw ? "margin-bottom: 0;" : ""} + ${!isOpen || isRaw ? "border-bottom: 1px solid rgba(0, 0, 0, 0.1);" : ""} + + ${ + isToggle + ? ` + cursor: pointer; + padding-right: 40px; + + &::after { + content: ''; + position: absolute; + top: 50%; + right: 16px; + transform: translateY(-50%) ${ + isOpen ? "rotate(-135deg)" : "rotate(45deg)" + }; + ${!isOpen ? "margin-top: -2px;" : ""} + width: 8px; + height: 8px; + border-bottom: 2px solid; + border-right: 2px solid; + } + ` + : "" + } + `, + [isOpen] + ); + + const titleProps = isToggle + ? { + onClick: () => setIsOpen(open => !open), + onkeydown: () => setIsOpen(open => !open), + role: "button", + tabindex: 0 + } + : {}; + + return ( + + {(!!title || isToggle) && ( + {title || "Component props"} + )} + {isOpen && ( +
{isRaw ? : }
+ )} +
+ ); +}; \ No newline at end of file diff --git a/docs/theme/components/ui/Table.js b/docs/theme/components/ui/Table.js new file mode 100644 index 000000000..9c8e19af0 --- /dev/null +++ b/docs/theme/components/ui/Table.js @@ -0,0 +1,111 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +import styled from "styled-components"; + +import { get } from "../../utils/theme"; +import { mq } from "../../styles/responsive"; + +const Wrapper = styled.div` + overflow-x: auto; + padding: 2px; + margin-bottom: 30px; + + ${mq({ + marginBottom: [20, 40], + maxWidth: ["calc(100vw - 40px)", "calc(100vw - 80px)", "100%"] + })}; +`; + +const TableStyled = styled.table` + padding: 0; + table-layout: auto; + box-shadow: 0 0 0 1px ${get("colors.border")}; + background-color: transparent; + border-spacing: 0; + border-collapse: collapse; + border-style: hidden; + border-radius: ${get("radii")}; + font-size: 14px; + color: ${get("colors.tableColor")}; + + ${mq({ + overflowX: ["initial", "initial", "initial", "hidden"], + display: ["table", "table", "table", "table"] + })} + + & thead { + color: ${get("colors.theadColor")}; + background: ${get("colors.theadBg")}; + } + + & thead th { + font-weight: 400; + padding: 20px 20px; + + &:nth-of-type(1) { + ${mq({ + width: ["20%", "20%", "20%", "auto"] + })}; + } + + &:nth-of-type(2) { + ${mq({ + width: ["10%", "10%", "10%", "auto"] + })}; + } + + &:nth-of-type(3) { + ${mq({ + width: ["10%", "10%", "10%", "auto"] + })}; + } + + &:nth-of-type(4) { + ${mq({ + width: ["10%", "10%", "10%", "auto"] + })}; + } + + &:nth-of-type(5) { + ${mq({ + width: ["20%", "20%", "20%", "auto"] + })}; + } + } + + & tbody td { + padding: 12px 20px; + line-height: 2; + font-weight: 200; + } + + & tbody > tr { + display: table-row; + border-top: 1px solid ${get("colors.border")}; + } + + ${get("styles.table")}; +`; + +export const Table = props => ( + + + +); diff --git a/docs/theme/components/ui/UnorderedList.js b/docs/theme/components/ui/UnorderedList.js new file mode 100644 index 000000000..2e54eb222 --- /dev/null +++ b/docs/theme/components/ui/UnorderedList.js @@ -0,0 +1,38 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import styled from "styled-components"; +import { get } from "../../utils/theme"; + +export const UnorderedList = styled.ul` + list-style: none; + + & li::before { + content: "● "; + color: ${get("colors.border")}; + font-weight: bold; + font-size: 0.5em; + margin-right: 5px; + } + + ${get("styles.ul")}; + + ul li { + padding-left: 25px; + } +`; \ No newline at end of file diff --git a/docs/theme/components/ui/index.js b/docs/theme/components/ui/index.js new file mode 100644 index 000000000..3dd83d156 --- /dev/null +++ b/docs/theme/components/ui/index.js @@ -0,0 +1,45 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Blockquote } from "./Blockquote"; +import { InlineCode } from "./InlineCode"; +import { Link } from "./Link"; +import { Loading } from "./Loading"; +import { NotFound } from "./NotFound"; +import { OrderedList } from "./OrderedList"; +import { Page } from "./Page"; +import { Paragraph } from "./Paragraph"; +import { Pre } from "./Pre"; +import { Props } from "./Props"; +import { Table } from "./Table"; +import { UnorderedList } from "./UnorderedList"; + +export const components = { + a: Link, + blockquote: Blockquote, + inlineCode: InlineCode, + loading: Loading, + notFound: NotFound, + ol: OrderedList, + p: Paragraph, + page: Page, + pre: Pre, + props: Props, + table: Table, + ul: UnorderedList +}; \ No newline at end of file diff --git a/docs/theme/config.js b/docs/theme/config.js new file mode 100644 index 000000000..25393d48a --- /dev/null +++ b/docs/theme/config.js @@ -0,0 +1,31 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { styles } from "./styles"; +import { fonts } from "./styles/fonts"; +import * as colors from "./styles/colors"; + +export const config = { + colors, + styles, + fonts, + radii: "2px", + mode: "light", + showPlaygroundEditor: false, + linesToScrollEditor: 18 +}; \ No newline at end of file diff --git a/docs/theme/index.js b/docs/theme/index.js new file mode 100644 index 000000000..cc96f7e2d --- /dev/null +++ b/docs/theme/index.js @@ -0,0 +1,55 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +import { theme, ComponentsProvider } from "../docz-lib/docz/dist"; +import get from "lodash/get"; + +import * as modes from "./styles/modes"; +import { components } from "./components/ui"; +import { Global } from "./styles/global"; +import { config } from "./config"; +import { ThemeProvider } from "./utils/theme"; +import { LegalFooter } from "./components/shared/LegalFooter"; + +const Theme = ({ children }) => { + return ( + + + + {children} + + + + ); +}; + +export const enhance = theme(config, ({ mode, codemirrorTheme, ...config }) => { + return { + ...config, + mode, + codemirrorTheme: codemirrorTheme || `docz-${mode}`, + colors: { + ...get(modes, mode), + ...config.colors + } + }; +}); + +export default enhance(Theme); +export { components }; diff --git a/docs/theme/styles/colors.js b/docs/theme/styles/colors.js new file mode 100644 index 000000000..b66a6c23c --- /dev/null +++ b/docs/theme/styles/colors.js @@ -0,0 +1,34 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const white = "#FFFFFF"; +export const grayUltraLight = "#FCFBFA"; +export const grayExtraLight = "#F5F6F7"; +export const grayLight = "#CED4DE"; +export const gray = "#7D899C"; +export const grayDark = "#2D3747"; +export const grayExtraDark = "#1D2330"; +export const dark = "#13161F"; + +export const blueLight = "#e9f2fa"; +export const blue = "#4a90e2 "; +export const skyBlue = "#1FB6FF"; +export const negative = "#EB4D4B"; + +export const green = "#37bb9b"; +export const greenLight = "#529d8b"; diff --git a/docs/theme/styles/fonts.js b/docs/theme/styles/fonts.js new file mode 100644 index 000000000..d2da18b8c --- /dev/null +++ b/docs/theme/styles/fonts.js @@ -0,0 +1,32 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const fonts = { + /** + * Used for headings larger than 20px. + */ + display: '"Source Sans Pro", sans-serif', + /** + * Used for code and sometimes numbers in tables. + */ + mono: '"Inconsolata", monospace', + /** + * Used for text and UI (which includes almost anything). + */ + ui: '"Source Sans Pro", sans-serif' +}; diff --git a/docs/theme/styles/global.js b/docs/theme/styles/global.js new file mode 100644 index 000000000..5fe58c5fc --- /dev/null +++ b/docs/theme/styles/global.js @@ -0,0 +1,47 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { createGlobalStyle } from "styled-components"; +import { get } from "../utils/theme"; + +export const Global = createGlobalStyle` + @import url('https://unpkg.com/codemirror@5.42.0/lib/codemirror.css'); + @import url('https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,600'); + @import url('https://fonts.googleapis.com/css?family=Inconsolata'); + + .icon-link { + display: none; + } + + body { + margin: 0; + padding: 0; + ${get("styles.body")}; + } + + .with-overlay { + overflow: hidden; + } + + html, + body, + #root { + height: 100%; + min-height: 100%; + } +`; diff --git a/docs/theme/styles/index.js b/docs/theme/styles/index.js new file mode 100644 index 000000000..fe0ef867c --- /dev/null +++ b/docs/theme/styles/index.js @@ -0,0 +1,105 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { css } from "styled-components"; +import { get } from "../utils/theme"; + +export const styles = { + body: css` + font-family: ${get("fonts.ui")}; + font-size: 16px; + line-height: 1.6; + `, + h1: css` + margin: 40px 0 20px; + font-family: ${get("fonts.display")}; + font-size: 48px; + font-weight: 600; + letter-spacing: -0.02em; + `, + h2: css` + margin: 30px 0 15px; + line-height: 1.4em; + font-family: ${get("fonts.display")}; + font-weight: 500; + font-size: 28px; + letter-spacing: -0.02em; + `, + h3: css` + margin: 25px 0 10px; + font-size: 20px; + font-weight: 400; + `, + h4: css` + margin: 25px 0 10px; + font-size: 16px; + font-weight: 400; + `, + h5: css` + margin: 20px 0 10px; + font-size: 16px; + font-weight: 400; + `, + h6: css` + margin: 20px 0 10px; + font-size: 16px; + font-weight: 400; + text-transform: uppercase; + `, + ol: css` + padding: 0; + margin: 10px 0 10px; + `, + ul: css` + padding: 0; + margin: 10px 0 10px; + `, + playground: css` + padding: 40px; + `, + code: css` + margin: 0 3px; + border-radius: 3px; + font-family: ${get("fonts.mono")}; + padding: 2px 5px; + font-size: 0.8em; + border: "1px solid rgba(0, 0, 0, 0.02)"; + `, + pre: css` + font-family: ${get("fonts.mono")}; + font-size: 1em; + line-height: 1.8; + `, + paragraph: css` + margin: 10px 0 20px 0; + `, + table: css` + overflow-y: hidden; + width: 100%; + font-family: ${get("fonts.mono")}; + font-size: 16px; + overflow-x: initial; + display: block; + `, + blockquote: css` + margin: 25px 0; + padding: 20px; + font-style: italic; + font-size: 16px; + ` +}; diff --git a/docs/theme/styles/modes.js b/docs/theme/styles/modes.js new file mode 100644 index 000000000..6adee3388 --- /dev/null +++ b/docs/theme/styles/modes.js @@ -0,0 +1,73 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as colors from "./colors"; + +export const light = { + ...colors, + primary: colors.green, + text: colors.grayDark, + link: colors.blue, + footerText: colors.grayDark, + sidebarBg: colors.grayExtraLight, + sidebarText: colors.dark, + sidebarHighlight: null, + sidebarBorder: colors.grayLight, + background: colors.white, + border: colors.greenLight, + theadColor: colors.gray, + theadBg: colors.grayExtraLight, + tableColor: colors.dark, + tooltipBg: colors.dark, + tooltipColor: colors.grayExtraLight, + codeBg: colors.grayExtraLight, + codeColor: colors.gray, + preBg: colors.grayExtraLight, + blockquoteBg: colors.grayExtraLight, + blockquoteBorder: colors.grayLight, + blockquoteColor: colors.gray, + propsText: colors.gray, + propsBg: colors.grayUltraLight +}; + +export const dark = { + ...colors, + primary: colors.skyBlue, + text: colors.grayExtraLight, + link: colors.skyBlue, + footerText: colors.grayLight, + sidebarBg: colors.dark, + sidebarText: colors.grayLight, + sidebarHighlight: null, + sidebarBorder: colors.grayDark, + background: colors.grayExtraDark, + border: colors.grayDark, + theadColor: colors.gray, + theadBg: colors.grayDark, + tableColor: colors.grayExtraLight, + tooltipBg: colors.dark, + tooltipColor: colors.grayExtraLight, + codeBg: colors.gray, + codeColor: colors.grayExtraLight, + preBg: colors.grayDark, + blockquoteBg: colors.grayDark, + blockquoteBorder: colors.gray, + blockquoteColor: colors.gray, + propsText: colors.grayLight, + propsBg: colors.dark +}; diff --git a/docs/theme/styles/responsive.js b/docs/theme/styles/responsive.js new file mode 100644 index 000000000..d6656e6ef --- /dev/null +++ b/docs/theme/styles/responsive.js @@ -0,0 +1,32 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import facepaint from "facepaint"; + +export const breakpoints = { + mobile: 420, + tablet: 920, + oldDesktop: 1024, + desktop: 1120 +}; + +export const mq = facepaint([ + `@media(min-width: ${breakpoints.mobile}px)`, + `@media(min-width: ${breakpoints.tablet}px)`, + `@media(min-width: ${breakpoints.desktop}px)` +]); diff --git a/docs/theme/styles/styled-colors.js b/docs/theme/styles/styled-colors.js new file mode 100644 index 000000000..bfb0c4b85 --- /dev/null +++ b/docs/theme/styles/styled-colors.js @@ -0,0 +1,23 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { dark } from "react-syntax-highlighter/dist/esm/styles/hljs"; + +//dark["powershell"]["color"] = "#37bb9b"; +dark.hljs.color = "#37bb9b"; +export default dark; \ No newline at end of file diff --git a/docs/theme/utils/hotkeys.js b/docs/theme/utils/hotkeys.js new file mode 100644 index 000000000..f93827bc0 --- /dev/null +++ b/docs/theme/utils/hotkeys.js @@ -0,0 +1,30 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { useEffect } from "react"; +import hotkeys from "hotkeys-js"; + +export const useHotkeys = (key, cb, inputs) => { + useEffect(() => { + if (typeof window !== "undefined") { + hotkeys(key, cb); + return () => hotkeys.unbind(key); + } + return; + }, inputs); +}; \ No newline at end of file diff --git a/docs/theme/utils/storage.js b/docs/theme/utils/storage.js new file mode 100644 index 000000000..ac990ac1d --- /dev/null +++ b/docs/theme/utils/storage.js @@ -0,0 +1,80 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +define(["require", "exports"], function(require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var Storage = /** @class */ (function() { + function Storage(name) { + this.name = name; + } + Storage.prototype.get = function() { + if (typeof window !== "undefined") { + try { + var item = window.localStorage.getItem(this.name); + return typeof item === "string" ? JSON.parse(item) : null; + } catch (err) { + return {}; + } + } + }; + Storage.prototype.set = function(value) { + if (typeof window !== "undefined") { + window.localStorage.setItem(this.name, JSON.stringify(value)); + } + }; + Storage.prototype.delete = function() { + if (typeof window !== "undefined") { + window.localStorage.removeItem(this.name); + } + }; + return Storage; + })(); + exports.Storage = Storage; +}); + +/*export class Storage { + public name: string + constructor(name: string) { + this.name = name + } + + public get(): any { + if (typeof window !== 'undefined') { + try { + const item = window.localStorage.getItem(this.name) + return typeof item === 'string' ? JSON.parse(item) : null + } catch (err) { + return {} + } + } + } + + public set(value: any): void { + if (typeof window !== 'undefined') { + window.localStorage.setItem(this.name, JSON.stringify(value)) + } + } + + public delete(): void { + if (typeof window !== 'undefined') { + window.localStorage.removeItem(this.name) + } + } +} +*/ diff --git a/docs/theme/utils/theme.js b/docs/theme/utils/theme.js new file mode 100644 index 000000000..0287fd1cf --- /dev/null +++ b/docs/theme/utils/theme.js @@ -0,0 +1,35 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +import { ThemeProvider as StyledThemeProvider } from "styled-components"; +import { useConfig } from "../../docz-lib/docz/dist"; +import getter from "lodash/get"; + +export const get = (val, defaultValue) => p => + getter(p, `theme.docz.${val}`, defaultValue); + +export const ThemeProvider = ({ children }) => { + const config = useConfig(); + const next = prev => ({ ...prev, docz: config.themeConfig }); + return ( + + {children} + + ); +}; diff --git a/docs/theme/utils/utils.js b/docs/theme/utils/utils.js new file mode 100644 index 000000000..88891f340 --- /dev/null +++ b/docs/theme/utils/utils.js @@ -0,0 +1,33 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const Utils = { + localStorageKeys: { + ACTIVEMENU: "ACTIVEMENU", + NAVPOSITION: "NAVPOSITION" + }, + checkMenuIsOPen: obj => { + const { activeMenu, item } = obj; + return activeMenu.findIndex(menu => menu === item.name) !== -1 + ? true + : false; + }, + pagesForGithubLink: ["Source Repository"] +}; + +export default Utils; \ No newline at end of file diff --git a/pom.xml b/pom.xml index cd865734f..239a1f7ae 100644 --- a/pom.xml +++ b/pom.xml @@ -2090,6 +2090,11 @@ **/*rebel*.xml **/*rebel*.xml.bak **/test/resources/** + + + **/docz-lib/** + **/.docz/** +