diff --git a/README.md b/README.md index 7747effc..e6dfa5c1 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,24 @@ The views are simple Svelte3 components that live inside `src/views`

Hello {name}

``` +You can use the following authentication strategies to specify who can access the route: + +- `'user'` - require signed in user, otherwise redirect to signin +- `'admin'` - admin only route, throw error if accessed by non-admins +- `'session'` - a valid session is needed (including guest sessions) +- `false` - no restrictions + +```jsx +server.route({ + path: '/users-only', + method: 'GET', + options: { + auth: 'user', + async handler(request, h) {} + } +}); +``` + ### Server-side rendering + client-side hydration + IE transpiling Each view is compiled twice, so we can render it server-side and then „hydrate“ it client-side. diff --git a/locale/de_DE.json b/locale/de_DE.json index 1f3e1123..b27da7b3 100644 --- a/locale/de_DE.json +++ b/locale/de_DE.json @@ -55,7 +55,7 @@ "controls / color-scale / breaks / custom": "benutzerdef.", "controls / custom-format / info": "Lerne mehr über benutzerdefinierte Zahlenformate in unserem Academy-Artikel.", "controls / custom-format / custom / number": "Eine Erklärung zu Zahlenformaten findest du in unserer Dokumentation.", - "controls / custom-format / custom / date": "Eine Erklärung zu Datumsformaten findest du in der moment.js-Dokumentation.", + "controls / custom-format / custom / date": "Eine Erklärung zu Datumsformaten findest du in der Dokumentation.", "controls / custom-format / custom": "(anpassen)", "controls / custom-format / auto": "(automatisch)", "controls / gradient-editor / how-this-works": "Anleitung:", @@ -229,10 +229,10 @@ "publish / publish-btn-intro": "Klicke hier wenn du dein Diagramm auf deiner Website oder CMS einbetten willst.", "publish / publish-btn": "Veröffentlichen", "publish / republish-btn": "Erneut veröffentlichen", - "publish / republish-alert": "Dein Diagramm wurde geändert nachdem es veröffentlicht wurde. Du musst es erneut veröffentlichen damit die Änderungen wirksam werden.", - "publish / progress / please-wait": "Dein Diagramm wird jetzt für die Veröffentlichung vorbereitet. In wenigen Sekunden erhältst du einen Link für die Einbettung. ", - "publish / publish-success": "Glückwunsch, das Diagramm kann jetzt geteilt und eingebettet werden.", - "publish / share-url": "Diagramm per URL teilen", + "publish / republish": "Dein Diagramm wurde geändert nachdem es veröffentlicht wurde. Du musst es erneut veröffentlichen damit die Änderungen wirksam werden.", + "publish / progress / publishing": "Wir bereiten deine Visualisierung für die Veröffentlichung vor. Das dauert nur wenige Sekunden.", + "publish / publish-success": "Glückwunsch! Deine Visualisierung kann jetzt geteilt und eingebettet werden.", + "publish / share-url": "Visualisierung per URL teilen", "publish / share-url / standalone": "Normale Größe", "publish / share-url / fullscreen": "Vollbild", "publish / help / share-url": "Bei normale Größe wird das Diagramm genau so dargestellt, wie es erstellt wurde. Bei Vollbild füllt das Diagramm das komplette Browser-Fenser.", @@ -556,10 +556,10 @@ "Create an account / sign in": "Nutzerkonto anlegen / einloggen", "Create another graphic": "Neues Diagramm erstellen", "Return to visualise step": "Zurück zum Visualisieren", - "publish / export-duplicate": "Diagramm exportieren oder duplizieren", - "publish / export-duplicate / intro": "Du kannst dein Diagramm duplizieren, um eine neue Kopie zu bearbeiten. Oder exportiere das Diagramm in andere Formate.", + "publish / export-duplicate": "Visualisierung exportieren oder duplizieren", + "publish / export-duplicate / intro": "Du kannst deine Visualisierung duplizieren, um eine neue Kopie zu bearbeiten. Oder exportiere die Visualisierung in andere Formate.", "publish / unactivated / h1": "Du hast Post!", - "publish / unactivated / p": "Wir haben dir ein Link zu deinem Diagramm per E-Mail zugesandt. Schau in deinem Postfach und klicke auf den Link um dein Diagramm zu bekommen. Wenn du innerhalb von 15 Minuten keine E-Mail bekommen hast, melde dich bei uns via support@datawrapper.de.", + "publish / unactivated / p": "Wir haben dir ein Link zu deiner Visualisierung per E-Mail zugesandt. Schau in deinem Postfach und klicke auf den Link um deine Visualisierung zu bekommen. Wenn du innerhalb von 15 Minuten keine E-Mail erhalten hast, melde dich bei uns via support@datawrapper.de.", "upload / try-beta": "Neugierig auf Features? Wir arbeiten an einer neuen Version dieser Seite. Klicke hier um zum aktivieren!", "upload / headline": "Alles beginnt mit dem Datensatz...", "upload / quick help": "Markiere die Datentabelle in Excel oder LibreOffice (einschließlich der ersten Zeile mit den Spaltentiteln), und fügen ihn in das nebenstehende Textfeld. Alternativ kannst du auch eine CSV- oder Excel-Datei hochladen.", @@ -708,16 +708,16 @@ "switch-team": "Team wechseln", "teams / remove / alert": "Bist du sicher das du dem Nutzer den Zugriff auf dein Team entziehen willst? Wenn du ein Teammitglied einfernst werden dessen Diagramme weiterhin für das restliche Team verfügbar sein, der entfernte Nutzer hat jedoch keinen Zugriff mehr.", "publish / pending-activation / h1": "Du hast Post!", - "publish / pending-activation / p": "Wir haben dir ein Link zu deinem Diagramm per E-Mail zugesandt. Schau in deinem Postfach und klicke auf den Link um dein Diagramm zu bekommen. Wenn du innerhalb von 15 Minuten keine E-Mail bekommen hast, melde dich bei uns via support@datawrapper.de.", + "publish / pending-activation / p": "Wir haben dir ein Link zu deinem Diagramm per E-Mail zugesandt. Schau in deinem Postfach und klicke auf den Link um deine Visualisierung zu bekommen. Wenn du innerhalb von 15 Minuten keine E-Mail bekommen hast, melde dich bei uns via support@datawrapper.de.", "publish / pending-activation / resend": "E-mail neu versenden", "publish / pending-activation / resend-success": "Deine Aktivierungsemail wurde erneut versandt.", "publish / pending-activation / resend-error": "Your activation e-mail has already been re-sent multiple times. Please contact suppport to activate your account.", "publish / guest / back": "Zurück", - "publish / guest / cta": "Diagramm zusenden", + "publish / guest / cta": "Visualisierung zusenden", "publish / guest / e-mail": "Deine E-Mail:", "publish / guest / example-email": "z.B. max.mustermann@web.de", - "publish / guest / h1": "Erstelle einen Account, um dein Diagramm zu veröffentlichen", - "publish / guest / p": "Gib deine E-Mail-Adresse ein, um einen Account anzulegen, mit dem du dein Diagramm veröffentlichen kannst.", + "publish / guest / h1": "Erstelle einen Account, um deine Visualisierung zu veröffentlichen", + "publish / guest / p": "Gib deine E-Mail-Adresse ein, um einen Account anzulegen, mit dem du deine Visualisierung veröffentlichen kannst.", "visualization": "Visualisierung", "cc / formula / hint / use": "Tipp: Benutze", "cc / formula / hint / instead-of": "anstelle von", @@ -889,5 +889,49 @@ "chart-notification / download / png": "Bilddatei wird zum Download vorbereitet...", "chart-notification / download / svg": "SVG-Datei wird zum Download vorbereitet…", "chart-notification / download / fail / png": "Beim Bilddownload ist ein Problem aufgetreten. Bitte wende dich an support@datawrapper.de, wenn das Problem weiterhin auftritt.", - "template / confirm-q / yes": "Ja, neue Visualisierung erstellen" -} \ No newline at end of file + "template / confirm-q / yes": "Ja, neue Visualisierung erstellen", + "teams / editor / preview-widths": "Vorschaubreiten", + "teams / editor / preview-widths / help": "Konfiguriere, welche Breitenvorgaben für die Visualisierungsvorschau im Editor verwendet werden.", + "teams / editor / h1": "Visualisierungseditor", + "teams / defaults / visualization-size": "Voreinstellung der Visualisierungsgröße", + "teams / defaults / visualization-size / help": "Bestimme die Größe, die für neu erstellte Visualisierungen angewendet wird.", + "teams / error": "", + "error / unauthorized / hed": "", + "publish / published": "Deine Visualisierung wurde veröffentlicht.", + "publish / unpublish-btn": "rückgängig machen.", + "publish / unpublish-intro": "Du kannst die Veröffentlichung jederzeit", + "publish / replace-embed": "Wenn du die Visualisierung bereits in deiner Website eingebettet hast, musst du den Einbett-Code durch die aktualisierte Version unten ersetzen, um die Änderungen auf deiner Website zu sehen.", + "publish / unpublish-confirmation / title": "Willst du die Veröffentlichung rückgängig machen?", + "publish / unpublish-confirmation / explanation": "Alle Einbett-Codes und Links zu dieser Visualisierung werden nicht mehr funktionieren, bis du die Visualisierung wieder veröffentlichst.", + "publish / unpublish-confirmation / close": "Schließen", + "publish / unpublish-confirmation / back": "Zurück", + "publish / unpublish-confirmation / unpublish": "Ja, mach die Veröffentlichung rückgängig", + "publish / update-embed": "Deine eingebettete Visualisierung wird in wenigen Augenblicken automatisch aktualisiert. Falls du die letzte Version sofort brauchst, kannst du den alten Einbett-Code durch den neuen ersetzen.", + "publish / progress / unpublishing": "Wir machen die Veröffentlichung deiner Visualisierung rückgängig. Das dauert nur wenige Sekunden.", + "publish / progress / unpublished": "Die Veröffentlichung wurde rückgängig gemacht. Deine Visualisierung ist nicht mehr unter einem Link oder einem Einbett-Code sichtbar.", + "publish / unpublishing-btn": "Veröffentlichung aufheben", + "publish / title": "Visualisierung veröffentlichen", + "publish / publish-info-1": "Veröffentliche deine Visualisierung, um sie auf einer Webseite einzubetten oder in sozialen Medien zu teilen.", + "publish / publish-info-2": "Deine Visualisierung kann man auch nach der Veröffentlichung nur sehen, wenn man die Visualisierungs-URL kennt. Wir teilen sie nicht öffentlich.", + "publish / publishing-btn": "Veröffentlichen", + "signin / choose-different-provider": "Anderen Anbieter auswählen", + "signin / no-account-yet": "Du hast noch kein Nutzerkonto?", + "signup / create-account": "Benutzerkonto anlegen", + "signin / its-free": "Es ist kostenlos und schnell erledigt.", + "signin / enter-otp": "Bitte das OTP-Gerät (z.B. YubiKey) verbinden und aktivieren oder gib einen Code aus deiner konfigurierten OTP-App ein.", + "signin / already-have-account": "Du hast bereits ein Nutzerkonto?", + "signin / signin-here": "Hier anmelden", + "signin / terms": "Durch die Nutzung von Datawrapper stimmst du unseren Nutzungsbedingungen zu.", + "signin / sign-up-using": "Registrieren mit", + "signin / sign-in-using": "Anmelden mit", + "signin / alternative-signin": "Oder melde dich an über", + "signin / login-success": "Anmeldung erfolgreich, Seite wird neu geladen …", + "signin / signup-check-email": "Bitte prüfe deinen E-Mail-Posteingang, um auf deinem Desktop-Computer fortzufahren.", + "signin / signup-success": "Anmeldung erfolgreich. Willkommen bei Datawrapper :)", + "navbar / teams / no-team": "Kein Team (privat)", + "navbar / create-new": "Neu erstellen", + "navbar / dashboard": "Dashboard", + "navbar / create / chart": "Diagramm", + "navbar / create / map": "Karte", + "navbar / create / table": "Tabelle" +} diff --git a/locale/en_US.json b/locale/en_US.json index 6a809e77..719bba32 100644 --- a/locale/en_US.json +++ b/locale/en_US.json @@ -55,7 +55,7 @@ "controls / color-scale / breaks / custom": "Custom", "controls / custom-format / info": "Learn more about custom number formats in this Academy article.", "controls / custom-format / custom / number": "For help on custom formats, check our documentation.", - "controls / custom-format / custom / date": "For help on custom formats, check the moment.js documentation.", + "controls / custom-format / custom / date": "For help on custom formats, check the documentation.", "controls / custom-format / custom": "(custom)", "controls / custom-format / auto": "(automatic)", "controls / gradient-editor / how-this-works": "How this works:", @@ -226,12 +226,12 @@ "publish / share-embed": "Share & Embed", "publish / republish-intro": "This chart has been published! If you make changes to the chart you will need to re-publish them.", "publish / publish-intro": "To share or embed your chart you need to publish it. It will only be visible to people who know the chart URL.", - "publish / publish-btn-intro": "Click here if you want to embed your chart in your website or CMS.", - "publish / publish-btn": "Publish chart", - "publish / republish-btn": "Re-publish chart", - "publish / republish-alert": "You have changed the chart after its last publication. To make these changes show up you will need to publish the chart again.", - "publish / progress / please-wait": "Your chart is now being prepared for publication and should be ready in a few seconds.", - "publish / publish-success": "Congratulations, your chart can now be shared and embedded on your site.", + "publish / publish-btn-intro": "Your visualization is not published.", + "publish / publish-btn": "Publish now", + "publish / republish-btn": "Republish", + "publish / republish": "Your visualization is published, but it has been changed and needs to be republished to show those changes.", + "publish / progress / publishing": "We're preparing your visualization for publication. Give us a few seconds.", + "publish / publish-success": "Congrats! Your visualization is successfully published. You can now share or embed it.", "publish / share-url": "Share via URL", "publish / share-url / standalone": "normal size", "publish / share-url / fullscreen": "fullscreen", @@ -556,10 +556,10 @@ "Create an account / sign in": "Create an account / sign in", "Create another graphic": "Create another graphic", "Return to visualise step": "Return to visualise step", - "publish / export-duplicate": "Export or duplicate chart", - "publish / export-duplicate / intro": "You can duplicate it to start editing a copy of the chart. Or export it into other formats.", + "publish / export-duplicate": "Export or duplicate visualization", + "publish / export-duplicate / intro": "You can duplicate it to start editing a copy of the visualization. Or export it into other formats.", "publish / unactivated / h1": "You've got mail!", - "publish / unactivated / p": "We've sent you a link to your chart via e-mail. Please check your inbox and click the confirmation link to get your chart. If you don't receive a mail within 15 minutes, please get in touch via support@datawrapper.de.", + "publish / unactivated / p": "We've sent you a link to your visualization via e-mail. Please check your inbox and click the confirmation link to get your chart. If you don't receive a mail within 15 minutes, please get in touch via support@datawrapper.de.", "upload / try-beta": "Curious to try new features? We are working on a new version of this page. Click here to activate it!", "upload / headline": "It all starts with your data...", "upload / quick help": "Select your data (including header row/column) in Excel or LibreOffice and paste it in the text field on the right. You can also upload a CSV or Excel file from your computer.", @@ -708,7 +708,7 @@ "switch-team": "Switch team", "teams / remove / alert": "Are you sure you want to remove this user's access to your team? If you remove a user, their charts will remain available for the team, though the removed user will no longer have access.", "publish / pending-activation / h1": "You've got mail!", - "publish / pending-activation / p": "We've send you a link to your chart via e-mail. Please check your inbox and click the confirmation link to get your chart. If you don't receive a mail within 15 minutes, please get in touch via support@datawrapper.de.", + "publish / pending-activation / p": "We've send you a link to your chart via e-mail. Please check your inbox and click the confirmation link to get your visualization. If you don't receive a mail within 15 minutes, please get in touch via support@datawrapper.de.", "publish / pending-activation / resend": "Re-send e-mail", "publish / pending-activation / resend-success": "Your activation e-mail has been re-sent.", "publish / pending-activation / resend-error": "Your activation e-mail has already been re-sent multiple times. Please contact suppport to activate your account.", @@ -716,8 +716,8 @@ "publish / guest / cta": "Send my embed code", "publish / guest / e-mail": "Enter your e-mail:", "publish / guest / example-email": "e.g. your.email@gmail.com", - "publish / guest / h1": "Create an account to publish your chart", - "publish / guest / p": "Enter your e-mail address to create an account and publish your charrt.", + "publish / guest / h1": "Create an account to publish your visualization", + "publish / guest / p": "Enter your e-mail address to create an account and publish your visualization.", "visualization": "Visualization", "cc / formula / hint / use": "Hint: Use", "cc / formula / hint / instead-of": "instead of", @@ -889,5 +889,49 @@ "chart-notification / download / png": "Image file is being prepared for download…", "chart-notification / download / svg": "SVG file is being prepared for download…", "chart-notification / download / fail / png": "There was a problem with the image download. Please contact support@datawrapper.de if the issue persists.", - "template / confirm-q / yes": "Yes, create new visualization" + "template / confirm-q / yes": "Yes, create new visualization", + "teams / editor / preview-widths": "Preview widths", + "teams / editor / preview-widths / help": "Configure which width presets are available for the preview when editing a visualization.", + "teams / editor / h1": "Visualization editor", + "teams / defaults / visualization-size": "Default visualization size", + "teams / defaults / visualization-size / help": "Set the default size for newly created visualizations.", + "teams / error": "Failed to save team settings: $0", + "error / unauthorized / hed": "You need to be logged in to see this page", + "publish / published": "Your visualization is published.", + "publish / unpublish-btn": "unpublish.", + "publish / unpublish-intro": "You can always", + "publish / replace-embed": "If you already embedded the visualization in your website you need to replace the embed code with the updated version below to see the changes on your site.", + "publish / unpublish-confirmation / title": "Do you really want to unpublish your visualization?", + "publish / unpublish-confirmation / explanation": "All embed codes and links to this visualization will stop working. You can always publish your visualization again to revive your old embeddings and links. ", + "publish / unpublish-confirmation / close": "Close", + "publish / unpublish-confirmation / back": "Back", + "publish / unpublish-confirmation / unpublish": "Yes, unpublish", + "publish / update-embed": "Your embedded visualization will automatically update in a few moments. If you need the latest version right away, replace the old embed code with the new one.", + "publish / progress / unpublishing": "We're unpublishing your visualization. This should be done in a few seconds.", + "publish / progress / unpublished": "Successfully unpublished. Your visualization is not visible anymore under any link or embed code.", + "publish / unpublishing-btn": "Unpublishing", + "publish / title": "Publish visualization", + "publish / publish-info-1": "You'll need to publish this visualization before embedding it on your website or sharing it on social media.", + "publish / publish-info-2": "Your published visualization will still only be visible to people who know its URL. We won't share it publicly.", + "publish / publishing-btn": "Publishing", + "signin / choose-different-provider": "Choose a different provider", + "signin / no-account-yet": "Don't have an account, yet?", + "signup / create-account": "Create a new account", + "signin / its-free": "It's free and done quickly.", + "signin / enter-otp": "Please insert your OTP device and click its button, or enter a code from your configured OTP app.", + "signin / already-have-account": "Already have an account?", + "signin / signin-here": "Sign in here", + "signin / terms": "By using Datawrapper you agree to our Terms of Use.", + "signin / sign-up-using": "Sign up with", + "signin / sign-in-using": "Sign in with", + "signin / alternative-signin": "Alternatively, sign in with", + "signin / login-success": "Login successful, reloading page…", + "signin / signup-check-email": "Please check your e-mail inbox to proceed on your desktop computer.", + "signin / signup-success": "Sign up successful. Welcome to Datawrapper :)", + "navbar / teams / no-team": "No team (private)", + "navbar / create-new": "Create new", + "navbar / dashboard": "Dashboard", + "navbar / create / chart": "Chart", + "navbar / create / map": "Map\n", + "navbar / create / table": "Table" } \ No newline at end of file diff --git a/locale/es_ES.json b/locale/es_ES.json index 6c5d0520..5212c7a7 100644 --- a/locale/es_ES.json +++ b/locale/es_ES.json @@ -55,7 +55,7 @@ "controls / color-scale / breaks / custom": "Personalizar", "controls / custom-format / info": "Aprende más sobre los formatos numéricos personalizados en este artículo de Datawrapper Academy.", "controls / custom-format / custom / number": "Para obtener ayuda sobre formatos personalizados, consulta la documentación.", - "controls / custom-format / custom / date": "Para obtener ayuda sobre formatos personalizados, consulta la documentación moment.js.", + "controls / custom-format / custom / date": "Para obtener ayuda sobre formatos personalizados, consulta la documentación.", "controls / custom-format / custom": "(personalizado)", "controls / custom-format / auto": "(automático)", "controls / gradient-editor / how-this-works": "Cómo funciona:", @@ -228,9 +228,9 @@ "publish / publish-intro": "Para compartir o integrar tu gráfico, debes publicarlo. Solo será visible para las personas que conocen la URL del gráfico.", "publish / publish-btn-intro": "Haz clic aquí si deseas integrar tu gráfico en tu sitio web o CMS.", "publish / publish-btn": "Publicar gráfico", - "publish / republish-btn": "Volver a publicar gráfico", - "publish / republish-alert": "Has cambiado el gráfico después de la última publicación. Para que se vean estos cambios tendrás que volver a publicar el gráfico.", - "publish / progress / please-wait": "Tu gráfico se está preparando para la publicación, estará listo en unos segundos.", + "publish / republish-btn": "", + "publish / republish": "Has cambiado el gráfico después de la última publicación. Para que se vean estos cambios tendrás que volver a publicar el gráfico.", + "publish / progress / publishing": "Tu gráfico se está preparando para la publicación, estará listo en unos segundos.", "publish / publish-success": "Enhorabuena, ya puedes compartir e integrar tu gráfico en tu sitio.", "publish / share-url": "Compartir por URL", "publish / share-url / standalone": "tamaño normal", @@ -838,7 +838,7 @@ "controls / color-scale / interpolation / deciles": "", "controls / color-scale / interpolation / natural": "", "footer / datawrapper-gmbh": "", - "Language": "", + "Language": "Idioma", "chart-size": "", "apply-preset": "", "describe / histogram / min": "", @@ -889,5 +889,49 @@ "chart-notification / download / png": "", "chart-notification / download / svg": "", "chart-notification / download / fail / png": "", - "template / confirm-q / yes": "Sí, crea una nueva visualización" + "template / confirm-q / yes": "Sí, crea una nueva visualización", + "teams / editor / preview-widths": "", + "teams / editor / preview-widths / help": "", + "teams / editor / h1": "", + "teams / defaults / visualization-size": "", + "teams / defaults / visualization-size / help": "", + "teams / error": "", + "error / unauthorized / hed": "", + "publish / published": "", + "publish / unpublish-btn": "", + "publish / unpublish-intro": "", + "publish / replace-embed": "", + "publish / unpublish-confirmation / title": "", + "publish / unpublish-confirmation / explanation": "", + "publish / unpublish-confirmation / close": "", + "publish / unpublish-confirmation / back": "", + "publish / unpublish-confirmation / unpublish": "", + "publish / update-embed": "", + "publish / progress / unpublishing": "", + "publish / progress / unpublished": "", + "publish / unpublishing-btn": "", + "publish / title": "", + "publish / publish-info-1": "", + "publish / publish-info-2": "", + "publish / publishing-btn": "", + "signin / choose-different-provider": "", + "signin / no-account-yet": "", + "signup / create-account": "Crear nueva cuenta", + "signin / its-free": "", + "signin / enter-otp": "", + "signin / already-have-account": "", + "signin / signin-here": "", + "signin / terms": "", + "signin / sign-up-using": "", + "signin / sign-in-using": "", + "signin / alternative-signin": "", + "signin / login-success": "", + "signin / signup-check-email": "", + "signin / signup-success": "", + "navbar / teams / no-team": "", + "navbar / create-new": "", + "navbar / dashboard": "", + "navbar / create / chart": "Gráfico", + "navbar / create / map": "Mapa", + "navbar / create / table": "Tabla" } \ No newline at end of file diff --git a/locale/fr_FR.json b/locale/fr_FR.json index 40612d1c..b7e70b11 100644 --- a/locale/fr_FR.json +++ b/locale/fr_FR.json @@ -55,7 +55,7 @@ "controls / color-scale / breaks / custom": "Personnalisation", "controls / custom-format / info": "Pour en savoir plus sur les formats de nombres personnalisés, consultez l’article de l’Académie.", "controls / custom-format / custom / number": "Pour obtenir de l’aide sur les formats personnalisés, consultez notre documentation.", - "controls / custom-format / custom / date": "Pour obtenir de l’aide sur les formats personnalisés, consultez la documentation moment.js.", + "controls / custom-format / custom / date": "Pour obtenir de l’aide sur les formats personnalisés, consultez la documentation.", "controls / custom-format / custom": "(personnalisation)", "controls / custom-format / auto": "(automatique)", "controls / gradient-editor / how-this-works": "Fonctionnement :", @@ -228,9 +228,9 @@ "publish / publish-intro": "Vous devez publier votre graphique pour pouvoir le partager ou l’intégrer. Il sera visible uniquement par les personnes possédant l’URL du graphique.", "publish / publish-btn-intro": "Cliquez ici pour intégrer votre graphique à votre site web ou votre SGC.", "publish / publish-btn": "Publier un graphique", - "publish / republish-btn": "Republier un graphique", - "publish / republish-alert": "Vous avez modifié le graphique après sa dernière publication. Pour que ces modifications soient visibles, vous devez republier le graphique.", - "publish / progress / please-wait": "Votre graphique est en cours de préparation pour être publié. Il devrait être prêt dans quelques secondes.", + "publish / republish-btn": "", + "publish / republish": "Vous avez modifié le graphique après sa dernière publication. Pour que ces modifications soient visibles, vous devez republier le graphique.", + "publish / progress / publishing": "Votre graphique est en cours de préparation pour être publié. Il devrait être prêt dans quelques secondes.", "publish / publish-success": "Bravo, votre graphique peut désormais être partagé et intégré à votre site.", "publish / share-url": "Partager via URL", "publish / share-url / standalone": "taille normale", @@ -838,7 +838,7 @@ "controls / color-scale / interpolation / deciles": "", "controls / color-scale / interpolation / natural": "", "footer / datawrapper-gmbh": "", - "Language": "", + "Language": "Langue", "chart-size": "", "apply-preset": "", "describe / histogram / min": "", @@ -889,5 +889,49 @@ "chart-notification / download / png": "", "chart-notification / download / svg": "", "chart-notification / download / fail / png": "", - "template / confirm-q / yes": "Oui, créer une nouvelle visualisation" + "template / confirm-q / yes": "Oui, créer une nouvelle visualisation", + "teams / editor / preview-widths": "", + "teams / editor / preview-widths / help": "", + "teams / editor / h1": "", + "teams / defaults / visualization-size": "", + "teams / defaults / visualization-size / help": "", + "teams / error": "", + "error / unauthorized / hed": "", + "publish / published": "", + "publish / unpublish-btn": "", + "publish / unpublish-intro": "", + "publish / replace-embed": "", + "publish / unpublish-confirmation / title": "", + "publish / unpublish-confirmation / explanation": "", + "publish / unpublish-confirmation / close": "", + "publish / unpublish-confirmation / back": "", + "publish / unpublish-confirmation / unpublish": "", + "publish / update-embed": "", + "publish / progress / unpublishing": "", + "publish / progress / unpublished": "", + "publish / unpublishing-btn": "", + "publish / title": "", + "publish / publish-info-1": "", + "publish / publish-info-2": "", + "publish / publishing-btn": "", + "signin / choose-different-provider": "", + "signin / no-account-yet": "", + "signup / create-account": "Créer un nouveau compte", + "signin / its-free": "", + "signin / enter-otp": "", + "signin / already-have-account": "", + "signin / signin-here": "", + "signin / terms": "", + "signin / sign-up-using": "", + "signin / sign-in-using": "", + "signin / alternative-signin": "", + "signin / login-success": "", + "signin / signup-check-email": "", + "signin / signup-success": "", + "navbar / teams / no-team": "", + "navbar / create-new": "", + "navbar / dashboard": "", + "navbar / create / chart": "Diagramme", + "navbar / create / map": "Carte", + "navbar / create / table": "Tableau" } \ No newline at end of file diff --git a/locale/it_IT.json b/locale/it_IT.json index 856bc0e6..52782621 100644 --- a/locale/it_IT.json +++ b/locale/it_IT.json @@ -55,7 +55,7 @@ "controls / color-scale / breaks / custom": "Personalizzato", "controls / custom-format / info": "Scopri di più sui formati numerici personalizzati in quest'articolo della sezione Academy.", "controls / custom-format / custom / number": "Per ricevere supporto sui formati personalizzati, consulta la documentazione.", - "controls / custom-format / custom / date": "Per ricevere supporto sui formati personalizzati, consulta la documentazione moment.js.", + "controls / custom-format / custom / date": "Per ricevere supporto sui formati personalizzati, consulta la documentazione.", "controls / custom-format / custom": "(personalizzato)", "controls / custom-format / auto": "(automatico)", "controls / gradient-editor / how-this-works": "Come funziona:", @@ -228,9 +228,9 @@ "publish / publish-intro": "Per condividere o incorporare il tuo grafico devi prima pubblicarlo. Sarà visibile soltanto a chi è in possesso dell’URL del grafico.", "publish / publish-btn-intro": "Clicca qui per incorporare il grafico nel tuo sito web o CMS.", "publish / publish-btn": "Pubblica grafico", - "publish / republish-btn": "Ripubblica grafico", - "publish / republish-alert": "Hai modificato il grafico dopo la sua ultima pubblicazione. Per rendere visibili queste modifiche dovrai pubblicare nuovamente il grafico.", - "publish / progress / please-wait": "Il tuo grafico è in corso di preparazione per essere pubblicato e sarà pronto tra pochi secondi.", + "publish / republish-btn": "", + "publish / republish": "Hai modificato il grafico dopo la sua ultima pubblicazione. Per rendere visibili queste modifiche dovrai pubblicare nuovamente il grafico.", + "publish / progress / publishing": "Il tuo grafico è in corso di preparazione per essere pubblicato e sarà pronto tra pochi secondi.", "publish / publish-success": "Complimenti, il grafico può ora essere condiviso e incorporato sul tuo sito.", "publish / share-url": "Condividi via URL", "publish / share-url / standalone": "dimensione normale", @@ -838,7 +838,7 @@ "controls / color-scale / interpolation / deciles": "", "controls / color-scale / interpolation / natural": "", "footer / datawrapper-gmbh": "", - "Language": "", + "Language": "Lingua", "chart-size": "", "apply-preset": "", "describe / histogram / min": "", @@ -889,5 +889,49 @@ "chart-notification / download / png": "", "chart-notification / download / svg": "", "chart-notification / download / fail / png": "", - "template / confirm-q / yes": "Sì, crea una nuova visualizzazione" + "template / confirm-q / yes": "Sì, crea una nuova visualizzazione", + "teams / editor / preview-widths": "", + "teams / editor / preview-widths / help": "", + "teams / editor / h1": "", + "teams / defaults / visualization-size": "", + "teams / defaults / visualization-size / help": "", + "teams / error": "", + "error / unauthorized / hed": "", + "publish / published": "", + "publish / unpublish-btn": "", + "publish / unpublish-intro": "", + "publish / replace-embed": "", + "publish / unpublish-confirmation / title": "", + "publish / unpublish-confirmation / explanation": "", + "publish / unpublish-confirmation / close": "", + "publish / unpublish-confirmation / back": "", + "publish / unpublish-confirmation / unpublish": "", + "publish / update-embed": "", + "publish / progress / unpublishing": "", + "publish / progress / unpublished": "", + "publish / unpublishing-btn": "", + "publish / title": "", + "publish / publish-info-1": "", + "publish / publish-info-2": "", + "publish / publishing-btn": "", + "signin / choose-different-provider": "", + "signin / no-account-yet": "", + "signup / create-account": "Crea un nuovo account", + "signin / its-free": "", + "signin / enter-otp": "", + "signin / already-have-account": "", + "signin / signin-here": "", + "signin / terms": "", + "signin / sign-up-using": "", + "signin / sign-in-using": "", + "signin / alternative-signin": "", + "signin / login-success": "", + "signin / signup-check-email": "", + "signin / signup-success": "", + "navbar / teams / no-team": "", + "navbar / create-new": "", + "navbar / dashboard": "", + "navbar / create / chart": "Grafico", + "navbar / create / map": "Mappa", + "navbar / create / table": "Tabella" } \ No newline at end of file diff --git a/locale/zh_CN.json b/locale/zh_CN.json index a523d970..dc38d62d 100644 --- a/locale/zh_CN.json +++ b/locale/zh_CN.json @@ -55,7 +55,7 @@ "controls / color-scale / breaks / custom": "自定义", "controls / custom-format / info": "在此Academy文章中了解有关自定义数字格式的更多信息。", "controls / custom-format / custom / number": "如需有关自定义格式的帮助,请查看numeral.js文档。", - "controls / custom-format / custom / date": "如需有关自定义格式的帮助,请查看moment.js文档。", + "controls / custom-format / custom / date": "如需有关自定义格式的帮助,请查看文档。", "controls / custom-format / custom": "(自定义)", "controls / custom-format / auto": "(自动)", "controls / gradient-editor / how-this-works": "工作原理:", @@ -229,8 +229,8 @@ "publish / publish-btn-intro": "如欲将图表嵌入网站CMS中,请单击此处。", "publish / publish-btn": "发布图表", "publish / republish-btn": "重新发布图表", - "publish / republish-alert": "您在上次发布后更改了图表。要显示这些更改,您将需要再次发布图表。", - "publish / progress / please-wait": "您的图表现在正在准备发布,应该在几秒钟内准备就绪。", + "publish / republish": "您在上次发布后更改了图表。要显示这些更改,您将需要再次发布图表。", + "publish / progress / publishing": "您的图表现在正在准备发布,应该在几秒钟内准备就绪。", "publish / publish-success": "恭喜,您的图表现在可以共享并嵌入到您的网站中了。", "publish / share-url": "通过URL共享", "publish / share-url / standalone": "普通尺寸", @@ -838,7 +838,7 @@ "controls / color-scale / interpolation / deciles": "", "controls / color-scale / interpolation / natural": "", "footer / datawrapper-gmbh": "", - "Language": "", + "Language": "语言", "chart-size": "", "apply-preset": "", "describe / histogram / min": "", @@ -889,5 +889,49 @@ "chart-notification / download / png": "", "chart-notification / download / svg": "", "chart-notification / download / fail / png": "", - "template / confirm-q / yes": "是的,复制可视化" + "template / confirm-q / yes": "是的,复制可视化", + "teams / editor / preview-widths": "", + "teams / editor / preview-widths / help": "", + "teams / editor / h1": "", + "teams / defaults / visualization-size": "", + "teams / defaults / visualization-size / help": "", + "teams / error": "", + "error / unauthorized / hed": "", + "publish / published": "", + "publish / unpublish-btn": "", + "publish / unpublish-intro": "", + "publish / replace-embed": "", + "publish / unpublish-confirmation / title": "", + "publish / unpublish-confirmation / explanation": "", + "publish / unpublish-confirmation / close": "", + "publish / unpublish-confirmation / back": "", + "publish / unpublish-confirmation / unpublish": "", + "publish / update-embed": "", + "publish / progress / unpublishing": "", + "publish / progress / unpublished": "", + "publish / unpublishing-btn": "", + "publish / title": "", + "publish / publish-info-1": "", + "publish / publish-info-2": "", + "publish / publishing-btn": "", + "signin / choose-different-provider": "", + "signin / no-account-yet": "", + "signup / create-account": "创建新帐户", + "signin / its-free": "", + "signin / enter-otp": "", + "signin / already-have-account": "", + "signin / signin-here": "", + "signin / terms": "", + "signin / sign-up-using": "", + "signin / sign-in-using": "", + "signin / alternative-signin": "", + "signin / login-success": "", + "signin / signup-check-email": "", + "signin / signup-success": "", + "navbar / teams / no-team": "", + "navbar / create-new": "", + "navbar / dashboard": "", + "navbar / create / chart": "图表", + "navbar / create / map": "地图", + "navbar / create / table": "表格" } \ No newline at end of file diff --git a/npm-debug.log b/npm-debug.log new file mode 100644 index 00000000..82bc49d8 --- /dev/null +++ b/npm-debug.log @@ -0,0 +1,45 @@ +0 info it worked if it ends with ok +1 verbose cli [ +1 verbose cli '/usr/local/Cellar/node/14.1.0/bin/node', +1 verbose cli '/Users/david/Dev/core/services/frontend/node_modules/.bin/npm', +1 verbose cli 'run', +1 verbose cli 'build:css', +1 verbose cli '--', +1 verbose cli '--watch' +1 verbose cli ] +2 info using npm@2.15.12 +3 info using node@v14.1.0 +4 verbose run-script [ 'prebuild:css', 'build:css', 'postbuild:css' ] +5 info prebuild:css @datawrapper/frontend@2.0.0 +6 info build:css @datawrapper/frontend@2.0.0 +7 verbose unsafe-perm in lifecycle true +8 info @datawrapper/frontend@2.0.0 Failed to exec build:css script +9 verbose stack Error: @datawrapper/frontend@2.0.0 build:css: `node-sass --omit-source-map-url src/styles/index.scss static/datawrapper.css "--watch"` +9 verbose stack Exit status 1 +9 verbose stack at EventEmitter. (/Users/david/Dev/core/services/frontend/node_modules/npm/lib/utils/lifecycle.js:217:16) +9 verbose stack at EventEmitter.emit (events.js:315:20) +9 verbose stack at ChildProcess. (/Users/david/Dev/core/services/frontend/node_modules/npm/lib/utils/spawn.js:24:14) +9 verbose stack at ChildProcess.emit (events.js:315:20) +9 verbose stack at maybeClose (internal/child_process.js:1051:16) +9 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:287:5) +10 verbose pkgid @datawrapper/frontend@2.0.0 +11 verbose cwd /Users/david/Dev/core/services/frontend +12 error Darwin 20.6.0 +13 error argv "/usr/local/Cellar/node/14.1.0/bin/node" "/Users/david/Dev/core/services/frontend/node_modules/.bin/npm" "run" "build:css" "--" "--watch" +14 error node v14.1.0 +15 error npm v2.15.12 +16 error code ELIFECYCLE +17 error @datawrapper/frontend@2.0.0 build:css: `node-sass --omit-source-map-url src/styles/index.scss static/datawrapper.css "--watch"` +17 error Exit status 1 +18 error Failed at the @datawrapper/frontend@2.0.0 build:css script 'node-sass --omit-source-map-url src/styles/index.scss static/datawrapper.css "--watch"'. +18 error This is most likely a problem with the @datawrapper/frontend package, +18 error not with npm itself. +18 error Tell the author that this fails on your system: +18 error node-sass --omit-source-map-url src/styles/index.scss static/datawrapper.css "--watch" +18 error You can get information on how to open an issue for this project with: +18 error npm bugs @datawrapper/frontend +18 error Or if that isn't available, you can get their info via: +18 error +18 error npm owner ls @datawrapper/frontend +18 error There is likely additional logging output above. +19 verbose exit [ 1, true ] diff --git a/package-lock.json b/package-lock.json index d78e93bc..8f268022 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "@babel/core": "^7.12.10", "@babel/preset-env": "^7.12.11", "@datawrapper/chart-core": "^8.41.1", - "@datawrapper/icons": "^1.4.0", + "@datawrapper/icons": "^1.5.1", "@datawrapper/locales": "^1.2.6", "@datawrapper/orm": "^3.25.0", "@datawrapper/schemas": "^1.12.1", @@ -40,6 +40,7 @@ "hapi-plugin-websocket": "^2.3.2", "joi": "^17.4.0", "jsesc": "^3.0.1", + "latest": "^0.2.0", "less": "^4.1.1", "lodash": "^4.17.20", "pug": "^3.0.1", @@ -1321,9 +1322,9 @@ "integrity": "sha512-DMC1LSF3L2aU4gR8o/TTItXdTFvSTZhhZ2wyz3JV2d0B7qOG7AXPxKWEU5NOJ5tgHA+4wP+AIItGi8hpRcyQOg==" }, "node_modules/@datawrapper/icons": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@datawrapper/icons/-/icons-1.4.0.tgz", - "integrity": "sha512-IsWo2AUiRF0c95K+Rb667sCfGi39t2nwhNSdM6LUDeeJxbZb35+CWF9tafKOhtheRTEtOuRclsJFdFkXArQMTw==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@datawrapper/icons/-/icons-1.5.1.tgz", + "integrity": "sha512-87wyaSgOXI1ZMYVCfLqE4sKBNWDQIpVdqJiqyJW1CrUhLYkGMpINkRdUgufQ5LctdtxtEaB3cPwmY8GOz9XTMg==", "dependencies": { "@twbs/svg-sprite": "^1.6.0" } @@ -5457,6 +5458,20 @@ "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" }, + "node_modules/latest": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/latest/-/latest-0.2.0.tgz", + "integrity": "sha1-6kfrj0srsM+RcW76qJbC4WI3WHs=", + "dependencies": { + "npm": "^2.5.1" + }, + "bin": { + "latest": "bin/latest.js" + }, + "engines": { + "node": "*" + } + }, "node_modules/lazy-cache": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", @@ -6538,48 +6553,1854 @@ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm": { + "version": "2.15.12", + "resolved": "https://registry.npmjs.org/npm/-/npm-2.15.12.tgz", + "integrity": "sha1-33w+1aJ3w/nUtdgZsFMR0QogCuY=", + "bundleDependencies": [ + "abbrev", + "ansi", + "ansi-regex", + "ansicolors", + "ansistyles", + "archy", + "async-some", + "block-stream", + "char-spinner", + "chmodr", + "chownr", + "cmd-shim", + "columnify", + "config-chain", + "dezalgo", + "editor", + "fs-vacuum", + "fs-write-stream-atomic", + "fstream", + "fstream-npm", + "github-url-from-git", + "github-url-from-username-repo", + "glob", + "graceful-fs", + "hosted-git-info", + "imurmurhash", + "inflight", + "inherits", + "ini", + "init-package-json", + "lockfile", + "lru-cache", + "minimatch", + "mkdirp", + "node-gyp", + "nopt", + "normalize-git-url", + "normalize-package-data", + "npm-cache-filename", + "npm-install-checks", + "npm-package-arg", + "npm-registry-client", + "npm-user-validate", + "npmlog", + "once", + "opener", + "osenv", + "path-is-inside", + "read", + "read-installed", + "read-package-json", + "readable-stream", + "realize-package-specifier", + "request", + "retry", + "rimraf", + "semver", + "sha", + "slide", + "sorted-object", + "spdx-license-ids", + "strip-ansi", + "tar", + "text-table", + "uid-number", + "umask", + "validate-npm-package-license", + "validate-npm-package-name", + "which", + "wrappy", + "write-file-atomic" + ], + "dependencies": { + "abbrev": "~1.0.9", + "ansi": "~0.3.1", + "ansi-regex": "*", + "ansicolors": "~0.3.2", + "ansistyles": "~0.1.3", + "archy": "~1.0.0", + "async-some": "~1.0.2", + "block-stream": "0.0.9", + "char-spinner": "~1.0.1", + "chmodr": "~1.0.2", + "chownr": "~1.0.1", + "cmd-shim": "~2.0.2", + "columnify": "~1.5.4", + "config-chain": "~1.1.10", + "dezalgo": "~1.0.3", + "editor": "~1.0.0", + "fs-vacuum": "~1.2.9", + "fs-write-stream-atomic": "~1.0.8", + "fstream": "~1.0.10", + "fstream-npm": "~1.1.1", + "github-url-from-git": "~1.4.0", + "github-url-from-username-repo": "~1.0.2", + "glob": "~7.0.6", + "graceful-fs": "~4.1.6", + "hosted-git-info": "~2.1.5", + "imurmurhash": "*", + "inflight": "~1.0.4", + "inherits": "~2.0.3", + "ini": "~1.3.4", + "init-package-json": "~1.9.4", + "lockfile": "~1.0.1", + "lru-cache": "~4.0.1", + "minimatch": "~3.0.3", + "mkdirp": "~0.5.1", + "node-gyp": "~3.6.0", + "nopt": "~3.0.6", + "normalize-git-url": "~3.0.2", + "normalize-package-data": "~2.3.5", + "npm-cache-filename": "~1.0.2", + "npm-install-checks": "~1.0.7", + "npm-package-arg": "~4.1.0", + "npm-registry-client": "~7.2.1", + "npm-user-validate": "~0.1.5", + "npmlog": "~2.0.4", + "once": "~1.4.0", + "opener": "~1.4.1", + "osenv": "~0.1.3", + "path-is-inside": "~1.0.0", + "read": "~1.0.7", + "read-installed": "~4.0.3", + "read-package-json": "~2.0.4", + "readable-stream": "~2.1.5", + "realize-package-specifier": "~3.0.1", + "request": "~2.74.0", + "retry": "~0.10.0", + "rimraf": "~2.5.4", + "semver": "~5.1.0", + "sha": "~2.0.1", + "slide": "~1.1.6", + "sorted-object": "~2.0.0", + "spdx-license-ids": "~1.2.2", + "strip-ansi": "~3.0.1", + "tar": "~2.2.1", + "text-table": "~0.2.0", + "uid-number": "0.0.6", + "umask": "~1.1.0", + "validate-npm-package-license": "~3.0.1", + "validate-npm-package-name": "~2.2.2", + "which": "~1.2.11", + "wrappy": "~1.0.2", + "write-file-atomic": "~1.1.4" + }, + "bin": { + "npm": "bin/npm-cli.js" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/abbrev": { + "version": "1.0.9", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/ansi": { + "version": "0.3.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/ansi-regex": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/ansicolors": { + "version": "0.3.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/ansistyles": { + "version": "0.1.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/archy": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/async-some": { + "version": "1.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "dezalgo": "^1.0.2" + } + }, + "node_modules/npm/node_modules/block-stream": { + "version": "0.0.9", + "inBundle": true, + "license": "ISC", + "dependencies": { + "inherits": "~2.0.0" + }, + "engines": { + "node": "0.4 || >=0.5.8" + } + }, + "node_modules/npm/node_modules/char-spinner": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/chmodr": { + "version": "1.0.2", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/chownr": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/cmd-shim": { + "version": "2.0.2", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "graceful-fs": "^4.1.2", + "mkdirp": "~0.5.0" + } + }, + "node_modules/npm/node_modules/columnify": { + "version": "1.5.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "strip-ansi": "^3.0.0", + "wcwidth": "^1.0.0" + } + }, + "node_modules/npm/node_modules/columnify/node_modules/wcwidth": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.0" + } + }, + "node_modules/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + } + }, + "node_modules/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/node_modules/clone": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npm/node_modules/config-chain": { + "version": "1.1.10", + "inBundle": true, + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/npm/node_modules/config-chain/node_modules/proto-list": { + "version": "1.2.4", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/dezalgo": { + "version": "1.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/npm/node_modules/dezalgo/node_modules/asap": { + "version": "2.0.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/editor": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/fs-vacuum": { + "version": "1.2.9", + "inBundle": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.2", + "path-is-inside": "^1.0.1", + "rimraf": "^2.5.2" + } + }, + "node_modules/npm/node_modules/fs-write-stream-atomic": { + "version": "1.0.8", + "inBundle": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/npm/node_modules/fs-write-stream-atomic/node_modules/iferr": { + "version": "0.1.5", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/fstream": { + "version": "1.0.10", + "inBundle": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/npm/node_modules/fstream-npm": { + "version": "1.1.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "fstream-ignore": "^1.0.0", + "inherits": "2" + } + }, + "node_modules/npm/node_modules/fstream-npm/node_modules/fstream-ignore": { + "version": "1.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" + } + }, + "node_modules/npm/node_modules/github-url-from-git": { + "version": "1.4.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/github-url-from-username-repo": { + "version": "1.0.2", + "inBundle": true, + "license": "BSD-2-Clause" + }, + "node_modules/npm/node_modules/glob": { + "version": "7.0.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/glob/node_modules/fs.realpath": { + "version": "1.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/glob/node_modules/path-is-absolute": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/graceful-fs": { + "version": "4.1.6", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/npm/node_modules/hosted-git-info": { + "version": "2.1.5", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/imurmurhash": { + "version": "0.1.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/npm/node_modules/inflight": { + "version": "1.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/npm/node_modules/inherits": { + "version": "2.0.3", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/ini": { + "version": "1.3.4", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/init-package-json": { + "version": "1.9.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^6.0.0", + "npm-package-arg": "^4.0.0", + "promzard": "^0.3.0", + "read": "~1.0.1", + "read-package-json": "1 || 2", + "semver": "2.x || 3.x || 4 || 5", + "validate-npm-package-license": "^3.0.1", + "validate-npm-package-name": "^2.0.1" + } + }, + "node_modules/npm/node_modules/init-package-json/node_modules/glob": { + "version": "6.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/init-package-json/node_modules/glob/node_modules/path-is-absolute": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/init-package-json/node_modules/promzard": { + "version": "0.3.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "read": "1" + } + }, + "node_modules/npm/node_modules/lockfile": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/lru-cache": { + "version": "4.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "pseudomap": "^1.0.1", + "yallist": "^2.0.0" + } + }, + "node_modules/npm/node_modules/lru-cache/node_modules/pseudomap": { + "version": "1.0.2", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/lru-cache/node_modules/yallist": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/minimatch": { + "version": "3.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/minimatch/node_modules/brace-expansion": { + "version": "1.1.6", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^0.4.1", + "concat-map": "0.0.1" + } + }, + "node_modules/npm/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match": { + "version": "0.4.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map": { + "version": "0.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/mkdirp": { + "version": "0.5.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/npm/node_modules/mkdirp/node_modules/minimist": { + "version": "0.0.8", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/node-gyp": { + "version": "3.6.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "2", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/semver": { + "version": "5.3.0", + "inBundle": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm/node_modules/nopt": { + "version": "3.0.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/npm/node_modules/normalize-git-url": { + "version": "3.0.2", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/normalize-package-data": { + "version": "2.3.5", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/npm/node_modules/normalize-package-data/node_modules/is-builtin-module": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "builtin-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/normalize-package-data/node_modules/is-builtin-module/node_modules/builtin-modules": { + "version": "1.1.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/npm-cache-filename": { + "version": "1.0.2", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/npm-install-checks": { + "version": "1.0.7", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "npmlog": "0.1 || 1 || 2", + "semver": "^2.3.0 || 3.x || 4 || 5" + } + }, + "node_modules/npm/node_modules/npm-package-arg": { + "version": "4.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^2.1.4", + "semver": "4 || 5" + } + }, + "node_modules/npm/node_modules/npm-registry-client": { + "version": "7.2.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "concat-stream": "^1.5.2", + "graceful-fs": "^4.1.6", + "normalize-package-data": "~1.0.1 || ^2.0.0", + "npm-package-arg": "^3.0.0 || ^4.0.0", + "once": "^1.3.3", + "request": "^2.74.0", + "retry": "^0.10.0", + "semver": "2 >=2.2.1 || 3.x || 4 || 5", + "slide": "^1.1.3" + }, + "optionalDependencies": { + "npmlog": "~2.0.0 || ~3.1.0" + } + }, + "node_modules/npm/node_modules/npm-registry-client/node_modules/concat-stream": { + "version": "1.5.2", + "engines": [ + "node >= 0.8" + ], + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "~2.0.0", + "typedarray": "~0.0.5" + } + }, + "node_modules/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.0.6", + "inBundle": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/node_modules/core-util-is": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/node_modules/process-nextick-args": { + "version": "1.0.7", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/node_modules/string_decoder": { + "version": "0.10.31", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/readable-stream/node_modules/util-deprecate": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/npm-registry-client/node_modules/concat-stream/node_modules/typedarray": { + "version": "0.0.6", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/npm-registry-client/node_modules/retry": { + "version": "0.10.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/npm-user-validate": { + "version": "0.1.5", + "inBundle": true, + "license": "BSD-2-Clause" + }, + "node_modules/npm/node_modules/npmlog": { + "version": "2.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "ansi": "~0.3.1", + "are-we-there-yet": "~1.1.2", + "gauge": "~1.2.5" + } + }, + "node_modules/npm/node_modules/npmlog/node_modules/are-we-there-yet": { + "version": "1.1.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.0 || ^1.1.13" + } + }, + "node_modules/npm/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/npmlog/node_modules/gauge": { + "version": "1.2.7", + "inBundle": true, + "license": "ISC", + "dependencies": { + "ansi": "^0.3.0", + "has-unicode": "^2.0.0", + "lodash.pad": "^4.1.0", + "lodash.padend": "^4.1.0", + "lodash.padstart": "^4.1.0" + } + }, + "node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/has-unicode": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/lodash._baseslice": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/lodash._basetostring": { + "version": "4.12.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/lodash.pad": { + "version": "4.4.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "lodash._baseslice": "~4.0.0", + "lodash._basetostring": "~4.12.0", + "lodash.tostring": "^4.0.0" + } + }, + "node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/lodash.padend": { + "version": "4.5.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "lodash._baseslice": "~4.0.0", + "lodash._basetostring": "~4.12.0", + "lodash.tostring": "^4.0.0" + } + }, + "node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/lodash.padstart": { + "version": "4.5.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "lodash._baseslice": "~4.0.0", + "lodash._basetostring": "~4.12.0", + "lodash.tostring": "^4.0.0" + } + }, + "node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/lodash.tostring": { + "version": "4.1.4", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/once": { + "version": "1.4.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/npm/node_modules/opener": { + "version": "1.4.1", + "inBundle": true, + "license": "WTFPL", + "bin": { + "opener": "opener.js" + } + }, + "node_modules/npm/node_modules/osenv": { + "version": "0.1.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/npm/node_modules/osenv/node_modules/os-homedir": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/osenv/node_modules/os-tmpdir": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/path-is-inside": { + "version": "1.0.1", + "inBundle": true, + "license": "WTFPL" + }, + "node_modules/npm/node_modules/read": { + "version": "1.0.7", + "inBundle": true, + "license": "ISC", + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npm/node_modules/read-installed": { + "version": "4.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "debuglog": "^1.0.1", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "slide": "~1.1.3", + "util-extend": "^1.0.1" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.2" + } + }, + "node_modules/npm/node_modules/read-installed/node_modules/debuglog": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/read-installed/node_modules/readdir-scoped-modules": { + "version": "1.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "node_modules/npm/node_modules/read-installed/node_modules/util-extend": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/read-package-json": { + "version": "2.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^6.0.0", + "json-parse-helpfulerror": "^1.0.2", + "normalize-package-data": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.2" + } + }, + "node_modules/npm/node_modules/read-package-json/node_modules/glob": { + "version": "6.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/read-package-json/node_modules/glob/node_modules/path-is-absolute": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/read-package-json/node_modules/json-parse-helpfulerror": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "jju": "^1.1.0" + } + }, + "node_modules/npm/node_modules/read-package-json/node_modules/json-parse-helpfulerror/node_modules/jju": { + "version": "1.3.0", + "inBundle": true, + "license": "WTFPL" + }, + "node_modules/npm/node_modules/read/node_modules/mute-stream": { + "version": "0.0.5", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/readable-stream": { + "version": "2.1.5", + "inBundle": true, + "license": "MIT", + "dependencies": { + "buffer-shims": "^1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/npm/node_modules/readable-stream/node_modules/buffer-shims": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/readable-stream/node_modules/core-util-is": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/readable-stream/node_modules/process-nextick-args": { + "version": "1.0.7", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/readable-stream/node_modules/string_decoder": { + "version": "0.10.31", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/readable-stream/node_modules/util-deprecate": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/realize-package-specifier": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "dezalgo": "^1.0.1", + "npm-package-arg": "^4.0.0" + } + }, + "node_modules/npm/node_modules/request": { + "version": "2.74.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "bl": "~1.1.2", + "caseless": "~0.11.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~1.0.0-rc4", + "har-validator": "~2.0.6", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "node-uuid": "~1.4.7", + "oauth-sign": "~0.8.1", + "qs": "~6.2.0", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "~0.4.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/npm/node_modules/request/node_modules/aws-sign2": { + "version": "0.6.0", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/request/node_modules/aws4": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/request/node_modules/bl": { + "version": "1.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.0.5" + } + }, + "node_modules/npm/node_modules/request/node_modules/bl/node_modules/readable-stream": { + "version": "2.0.6", + "inBundle": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/npm/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args": { + "version": "1.0.7", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder": { + "version": "0.10.31", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/request/node_modules/caseless": { + "version": "0.11.0", + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/npm/node_modules/request/node_modules/combined-stream": { + "version": "1.0.5", + "inBundle": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/npm/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/npm/node_modules/request/node_modules/extend": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/request/node_modules/forever-agent": { + "version": "0.6.1", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/request/node_modules/form-data": { + "version": "1.0.0-rc4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "async": "^1.5.2", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.10" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/npm/node_modules/request/node_modules/form-data/node_modules/async": { + "version": "1.5.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/request/node_modules/har-validator": { + "version": "2.0.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "chalk": "^1.1.1", + "commander": "^2.9.0", + "is-my-json-valid": "^2.12.4", + "pinkie-promise": "^2.0.0" + }, + "bin": { + "har-validator": "bin/har-validator" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/chalk": { + "version": "1.1.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/ansi-styles": { + "version": "2.2.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/commander": { + "version": "2.9.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "graceful-readlink": ">= 1.0.0" + }, + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/commander/node_modules/graceful-readlink": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid": { + "version": "2.13.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "jsonpointer": "2.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property": { + "version": "1.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "is-property": "^1.0.0" + } + }, + "node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend": { + "version": "4.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/node_modules/pinkie": { + "version": "2.0.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/request/node_modules/hawk": { + "version": "3.1.3", + "inBundle": true, + "license": "BSD-3-Clause", + "dependencies": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + }, + "engines": { + "node": ">=0.10.32" + } + }, + "node_modules/npm/node_modules/request/node_modules/hawk/node_modules/boom": { + "version": "2.10.1", + "inBundle": true, + "license": "BSD-3-Clause", + "dependencies": { + "hoek": "2.x.x" + }, + "engines": { + "node": ">=0.10.40" + } + }, + "node_modules/npm/node_modules/request/node_modules/hawk/node_modules/cryptiles": { + "version": "2.0.5", + "inBundle": true, + "license": "BSD-3-Clause", + "dependencies": { + "boom": "2.x.x" + }, + "engines": { + "node": ">=0.10.40" + } + }, + "node_modules/npm/node_modules/request/node_modules/hawk/node_modules/hoek": { + "version": "2.16.3", + "inBundle": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.40" + } + }, + "node_modules/npm/node_modules/request/node_modules/hawk/node_modules/sntp": { + "version": "1.0.9", + "inBundle": true, + "dependencies": { + "hoek": "2.x.x" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/npm/node_modules/request/node_modules/http-signature": { + "version": "1.1.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/npm/node_modules/request/node_modules/http-signature/node_modules/assert-plus": { + "version": "0.2.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim": { + "version": "1.3.0", + "engines": [ + "node >=0.6.0" + ], + "inBundle": true, + "license": "MIT", + "dependencies": { + "extsprintf": "1.0.2", + "json-schema": "0.2.2", + "verror": "1.3.6" + } + }, + "node_modules/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf": { + "version": "1.0.2", + "engines": [ + "node >=0.6.0" + ], + "inBundle": true + }, + "node_modules/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema": { + "version": "0.2.2", + "inBundle": true + }, + "node_modules/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror": { + "version": "1.3.6", + "engines": [ + "node >=0.6.0" + ], + "inBundle": true, + "dependencies": { + "extsprintf": "1.0.2" + } + }, + "node_modules/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk": { + "version": "1.9.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "dashdash": "^1.12.0", + "getpass": "^0.1.1" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + }, + "optionalDependencies": { + "ecc-jsbn": "~0.1.1", + "jodid25519": "^1.0.0", + "jsbn": "~0.1.0", + "tweetnacl": "~0.13.0" + } + }, + "node_modules/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1": { + "version": "0.2.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/assert-plus": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/dashdash": { + "version": "1.14.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn": { + "version": "0.1.1", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "jsbn": "~0.1.0" + } + }, + "node_modules/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/getpass": { + "version": "0.1.6", + "inBundle": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "jsbn": "~0.1.0" + } + }, + "node_modules/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jsbn": { + "version": "0.1.0", + "inBundle": true, + "license": "BSD", + "optional": true + }, + "node_modules/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl": { + "version": "0.13.3", + "inBundle": true, + "license": "Public domain", + "optional": true + }, + "node_modules/npm/node_modules/request/node_modules/is-typedarray": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/request/node_modules/isstream": { + "version": "0.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/request/node_modules/json-stringify-safe": { + "version": "5.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/request/node_modules/mime-types": { + "version": "2.1.11", + "inBundle": true, + "license": "MIT", + "dependencies": { + "mime-db": "~1.23.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db": { + "version": "1.23.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npm/node_modules/request/node_modules/node-uuid": { + "version": "1.4.7", + "inBundle": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/npm/node_modules/request/node_modules/oauth-sign": { + "version": "0.8.2", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/request/node_modules/qs": { + "version": "6.2.1", + "inBundle": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/npm/node_modules/request/node_modules/stringstream": { + "version": "0.0.5", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/request/node_modules/tough-cookie": { + "version": "2.3.1", + "inBundle": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npm/node_modules/request/node_modules/tunnel-agent": { + "version": "0.4.3", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/retry": { + "version": "0.10.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/rimraf": { + "version": "2.5.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^7.0.5" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/npm/node_modules/semver": { + "version": "5.1.0", + "inBundle": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm/node_modules/sha": { + "version": "2.0.1", + "inBundle": true, + "license": "(BSD-2-Clause OR MIT)", + "dependencies": { + "graceful-fs": "^4.1.2", + "readable-stream": "^2.0.2" + } + }, + "node_modules/npm/node_modules/sha/node_modules/readable-stream": { + "version": "2.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "process-nextick-args": "~1.0.0", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/npm/node_modules/sha/node_modules/readable-stream/node_modules/core-util-is": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/sha/node_modules/readable-stream/node_modules/isarray": { + "version": "0.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/sha/node_modules/readable-stream/node_modules/process-nextick-args": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/sha/node_modules/readable-stream/node_modules/string_decoder": { + "version": "0.10.31", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/sha/node_modules/readable-stream/node_modules/util-deprecate": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/slide": { + "version": "1.1.6", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/sorted-object": { + "version": "2.0.0", + "inBundle": true, + "license": "WTFPL" + }, + "node_modules/npm/node_modules/spdx-license-ids": { + "version": "1.2.2", + "inBundle": true, + "license": "Unlicense" + }, + "node_modules/npm/node_modules/strip-ansi": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/tar": { + "version": "2.2.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, + "node_modules/npm/node_modules/text-table": { + "version": "0.2.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/uid-number": { + "version": "0.0.6", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/umask": { + "version": "1.1.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/validate-npm-package-license": { + "version": "3.0.1", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "~1.0.0", + "spdx-expression-parse": "~1.0.0" } }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" + "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-correct": { + "version": "1.0.2", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-license-ids": "^1.0.2" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { + "version": "1.0.2", + "inBundle": true, + "license": "(MIT AND CC-BY-3.0)", + "dependencies": { + "spdx-exceptions": "^1.0.4", + "spdx-license-ids": "^1.0.0" } }, - "node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "engines": { - "node": ">=8" + "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse/node_modules/spdx-exceptions": { + "version": "1.0.4", + "inBundle": true, + "license": "CC-BY-3.0" + }, + "node_modules/npm/node_modules/validate-npm-package-name": { + "version": "2.2.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "builtins": "0.0.7" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, + "node_modules/npm/node_modules/validate-npm-package-name/node_modules/builtins": { + "version": "0.0.7", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/which": { + "version": "1.2.11", + "inBundle": true, + "license": "ISC", "dependencies": { - "path-key": "^3.0.0" + "isexe": "^1.1.1" }, - "engines": { - "node": ">=8" + "bin": { + "which": "bin/which" + } + }, + "node_modules/npm/node_modules/which/node_modules/isexe": { + "version": "1.1.2", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/wrappy": { + "version": "1.0.2", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/write-file-atomic": { + "version": "1.1.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.2", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" } }, "node_modules/npmlog": { @@ -10483,9 +12304,9 @@ "integrity": "sha512-DMC1LSF3L2aU4gR8o/TTItXdTFvSTZhhZ2wyz3JV2d0B7qOG7AXPxKWEU5NOJ5tgHA+4wP+AIItGi8hpRcyQOg==" }, "@datawrapper/icons": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@datawrapper/icons/-/icons-1.4.0.tgz", - "integrity": "sha512-IsWo2AUiRF0c95K+Rb667sCfGi39t2nwhNSdM6LUDeeJxbZb35+CWF9tafKOhtheRTEtOuRclsJFdFkXArQMTw==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@datawrapper/icons/-/icons-1.5.1.tgz", + "integrity": "sha512-87wyaSgOXI1ZMYVCfLqE4sKBNWDQIpVdqJiqyJW1CrUhLYkGMpINkRdUgufQ5LctdtxtEaB3cPwmY8GOz9XTMg==", "requires": { "@twbs/svg-sprite": "^1.6.0" } @@ -13739,6 +15560,14 @@ "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" }, + "latest": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/latest/-/latest-0.2.0.tgz", + "integrity": "sha1-6kfrj0srsM+RcW76qJbC4WI3WHs=", + "requires": { + "npm": "^2.5.1" + } + }, "lazy-cache": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", @@ -14604,6 +16433,1414 @@ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" }, + "npm": { + "version": "2.15.12", + "resolved": "https://registry.npmjs.org/npm/-/npm-2.15.12.tgz", + "integrity": "sha1-33w+1aJ3w/nUtdgZsFMR0QogCuY=", + "requires": { + "abbrev": "~1.0.9", + "ansi": "~0.3.1", + "ansi-regex": "*", + "ansicolors": "~0.3.2", + "ansistyles": "~0.1.3", + "archy": "~1.0.0", + "async-some": "~1.0.2", + "block-stream": "0.0.9", + "char-spinner": "~1.0.1", + "chmodr": "~1.0.2", + "chownr": "~1.0.1", + "cmd-shim": "~2.0.2", + "columnify": "~1.5.4", + "config-chain": "~1.1.10", + "dezalgo": "~1.0.3", + "editor": "~1.0.0", + "fs-vacuum": "~1.2.9", + "fs-write-stream-atomic": "~1.0.8", + "fstream": "~1.0.10", + "fstream-npm": "~1.1.1", + "github-url-from-git": "~1.4.0", + "github-url-from-username-repo": "~1.0.2", + "glob": "~7.0.6", + "graceful-fs": "~4.1.6", + "hosted-git-info": "~2.1.5", + "imurmurhash": "*", + "inflight": "~1.0.4", + "inherits": "~2.0.3", + "ini": "~1.3.4", + "init-package-json": "~1.9.4", + "lockfile": "~1.0.1", + "lru-cache": "~4.0.1", + "minimatch": "~3.0.3", + "mkdirp": "~0.5.1", + "node-gyp": "~3.6.0", + "nopt": "~3.0.6", + "normalize-git-url": "~3.0.2", + "normalize-package-data": "~2.3.5", + "npm-cache-filename": "~1.0.2", + "npm-install-checks": "~1.0.7", + "npm-package-arg": "~4.1.0", + "npm-registry-client": "~7.2.1", + "npm-user-validate": "~0.1.5", + "npmlog": "~2.0.4", + "once": "~1.4.0", + "opener": "~1.4.1", + "osenv": "~0.1.3", + "path-is-inside": "~1.0.0", + "read": "~1.0.7", + "read-installed": "~4.0.3", + "read-package-json": "~2.0.4", + "readable-stream": "~2.1.5", + "realize-package-specifier": "~3.0.1", + "request": "~2.74.0", + "retry": "~0.10.0", + "rimraf": "~2.5.4", + "semver": "~5.1.0", + "sha": "~2.0.1", + "slide": "~1.1.6", + "sorted-object": "~2.0.0", + "spdx-license-ids": "~1.2.2", + "strip-ansi": "~3.0.1", + "tar": "~2.2.1", + "text-table": "~0.2.0", + "uid-number": "0.0.6", + "umask": "~1.1.0", + "validate-npm-package-license": "~3.0.1", + "validate-npm-package-name": "~2.2.2", + "which": "~1.2.11", + "wrappy": "~1.0.2", + "write-file-atomic": "~1.1.4" + }, + "dependencies": { + "abbrev": { + "version": "1.0.9", + "bundled": true + }, + "ansi": { + "version": "0.3.1", + "bundled": true + }, + "ansi-regex": { + "version": "2.0.0", + "bundled": true + }, + "ansicolors": { + "version": "0.3.2", + "bundled": true + }, + "ansistyles": { + "version": "0.1.3", + "bundled": true + }, + "archy": { + "version": "1.0.0", + "bundled": true + }, + "async-some": { + "version": "1.0.2", + "bundled": true, + "requires": { + "dezalgo": "^1.0.2" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "char-spinner": { + "version": "1.0.1", + "bundled": true + }, + "chmodr": { + "version": "1.0.2", + "bundled": true + }, + "chownr": { + "version": "1.0.1", + "bundled": true + }, + "cmd-shim": { + "version": "2.0.2", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.2", + "mkdirp": "~0.5.0" + } + }, + "columnify": { + "version": "1.5.4", + "bundled": true, + "requires": { + "strip-ansi": "^3.0.0", + "wcwidth": "^1.0.0" + }, + "dependencies": { + "wcwidth": { + "version": "1.0.0", + "bundled": true, + "requires": { + "defaults": "^1.0.0" + }, + "dependencies": { + "defaults": { + "version": "1.0.3", + "bundled": true, + "requires": { + "clone": "^1.0.2" + }, + "dependencies": { + "clone": { + "version": "1.0.2", + "bundled": true + } + } + } + } + } + } + }, + "config-chain": { + "version": "1.1.10", + "bundled": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + }, + "dependencies": { + "proto-list": { + "version": "1.2.4", + "bundled": true + } + } + }, + "dezalgo": { + "version": "1.0.3", + "bundled": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + }, + "dependencies": { + "asap": { + "version": "2.0.3", + "bundled": true + } + } + }, + "editor": { + "version": "1.0.0", + "bundled": true + }, + "fs-vacuum": { + "version": "1.2.9", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.2", + "path-is-inside": "^1.0.1", + "rimraf": "^2.5.2" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.8", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + }, + "dependencies": { + "iferr": { + "version": "0.1.5", + "bundled": true + } + } + }, + "fstream": { + "version": "1.0.10", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "fstream-npm": { + "version": "1.1.1", + "bundled": true, + "requires": { + "fstream-ignore": "^1.0.0", + "inherits": "2" + }, + "dependencies": { + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "requires": { + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" + } + } + } + }, + "github-url-from-git": { + "version": "1.4.0", + "bundled": true + }, + "github-url-from-username-repo": { + "version": "1.0.2", + "bundled": true + }, + "glob": { + "version": "7.0.6", + "bundled": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "path-is-absolute": { + "version": "1.0.0", + "bundled": true + } + } + }, + "graceful-fs": { + "version": "4.1.6", + "bundled": true + }, + "hosted-git-info": { + "version": "2.1.5", + "bundled": true + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true + }, + "inflight": { + "version": "1.0.5", + "bundled": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.4", + "bundled": true + }, + "init-package-json": { + "version": "1.9.4", + "bundled": true, + "requires": { + "glob": "^6.0.0", + "npm-package-arg": "^4.0.0", + "promzard": "^0.3.0", + "read": "~1.0.1", + "read-package-json": "1 || 2", + "semver": "2.x || 3.x || 4 || 5", + "validate-npm-package-license": "^3.0.1", + "validate-npm-package-name": "^2.0.1" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "bundled": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "path-is-absolute": { + "version": "1.0.0", + "bundled": true + } + } + }, + "promzard": { + "version": "0.3.0", + "bundled": true, + "requires": { + "read": "1" + } + } + } + }, + "lockfile": { + "version": "1.0.1", + "bundled": true + }, + "lru-cache": { + "version": "4.0.1", + "bundled": true, + "requires": { + "pseudomap": "^1.0.1", + "yallist": "^2.0.0" + }, + "dependencies": { + "pseudomap": { + "version": "1.0.2", + "bundled": true + }, + "yallist": { + "version": "2.0.0", + "bundled": true + } + } + }, + "minimatch": { + "version": "3.0.3", + "bundled": true, + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.6", + "bundled": true, + "requires": { + "balanced-match": "^0.4.1", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + } + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "bundled": true + } + } + }, + "node-gyp": { + "version": "3.6.0", + "bundled": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "2", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "bundled": true + } + } + }, + "nopt": { + "version": "3.0.6", + "bundled": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-git-url": { + "version": "3.0.2", + "bundled": true + }, + "normalize-package-data": { + "version": "2.3.5", + "bundled": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "is-builtin-module": { + "version": "1.0.0", + "bundled": true, + "requires": { + "builtin-modules": "^1.0.0" + }, + "dependencies": { + "builtin-modules": { + "version": "1.1.0", + "bundled": true + } + } + } + } + }, + "npm-cache-filename": { + "version": "1.0.2", + "bundled": true + }, + "npm-install-checks": { + "version": "1.0.7", + "bundled": true, + "requires": { + "npmlog": "0.1 || 1 || 2", + "semver": "^2.3.0 || 3.x || 4 || 5" + } + }, + "npm-package-arg": { + "version": "4.1.0", + "bundled": true, + "requires": { + "hosted-git-info": "^2.1.4", + "semver": "4 || 5" + } + }, + "npm-registry-client": { + "version": "7.2.1", + "bundled": true, + "requires": { + "concat-stream": "^1.5.2", + "graceful-fs": "^4.1.6", + "normalize-package-data": "~1.0.1 || ^2.0.0", + "npm-package-arg": "^3.0.0 || ^4.0.0", + "npmlog": "~2.0.0 || ~3.1.0", + "once": "^1.3.3", + "request": "^2.74.0", + "retry": "^0.10.0", + "semver": "2 >=2.2.1 || 3.x || 4 || 5", + "slide": "^1.1.3" + }, + "dependencies": { + "concat-stream": { + "version": "1.5.2", + "bundled": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "~2.0.0", + "typedarray": "~0.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.0.6", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true + }, + "string_decoder": { + "version": "0.10.31", + "bundled": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + } + } + }, + "typedarray": { + "version": "0.0.6", + "bundled": true + } + } + }, + "retry": { + "version": "0.10.0", + "bundled": true + } + } + }, + "npm-user-validate": { + "version": "0.1.5", + "bundled": true + }, + "npmlog": { + "version": "2.0.4", + "bundled": true, + "requires": { + "ansi": "~0.3.1", + "are-we-there-yet": "~1.1.2", + "gauge": "~1.2.5" + }, + "dependencies": { + "are-we-there-yet": { + "version": "1.1.2", + "bundled": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.0 || ^1.1.13" + }, + "dependencies": { + "delegates": { + "version": "1.0.0", + "bundled": true + } + } + }, + "gauge": { + "version": "1.2.7", + "bundled": true, + "requires": { + "ansi": "^0.3.0", + "has-unicode": "^2.0.0", + "lodash.pad": "^4.1.0", + "lodash.padend": "^4.1.0", + "lodash.padstart": "^4.1.0" + }, + "dependencies": { + "has-unicode": { + "version": "2.0.0", + "bundled": true + }, + "lodash._baseslice": { + "version": "4.0.0", + "bundled": true + }, + "lodash._basetostring": { + "version": "4.12.0", + "bundled": true + }, + "lodash.pad": { + "version": "4.4.0", + "bundled": true, + "requires": { + "lodash._baseslice": "~4.0.0", + "lodash._basetostring": "~4.12.0", + "lodash.tostring": "^4.0.0" + } + }, + "lodash.padend": { + "version": "4.5.0", + "bundled": true, + "requires": { + "lodash._baseslice": "~4.0.0", + "lodash._basetostring": "~4.12.0", + "lodash.tostring": "^4.0.0" + } + }, + "lodash.padstart": { + "version": "4.5.0", + "bundled": true, + "requires": { + "lodash._baseslice": "~4.0.0", + "lodash._basetostring": "~4.12.0", + "lodash.tostring": "^4.0.0" + } + }, + "lodash.tostring": { + "version": "4.1.4", + "bundled": true + } + } + } + } + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1" + } + }, + "opener": { + "version": "1.4.1", + "bundled": true + }, + "osenv": { + "version": "0.1.3", + "bundled": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + }, + "dependencies": { + "os-homedir": { + "version": "1.0.0", + "bundled": true + }, + "os-tmpdir": { + "version": "1.0.1", + "bundled": true + } + } + }, + "path-is-inside": { + "version": "1.0.1", + "bundled": true + }, + "read": { + "version": "1.0.7", + "bundled": true, + "requires": { + "mute-stream": "~0.0.4" + }, + "dependencies": { + "mute-stream": { + "version": "0.0.5", + "bundled": true + } + } + }, + "read-installed": { + "version": "4.0.3", + "bundled": true, + "requires": { + "debuglog": "^1.0.1", + "graceful-fs": "^4.1.2", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "slide": "~1.1.3", + "util-extend": "^1.0.1" + }, + "dependencies": { + "debuglog": { + "version": "1.0.1", + "bundled": true + }, + "readdir-scoped-modules": { + "version": "1.0.2", + "bundled": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "util-extend": { + "version": "1.0.1", + "bundled": true + } + } + }, + "read-package-json": { + "version": "2.0.4", + "bundled": true, + "requires": { + "glob": "^6.0.0", + "graceful-fs": "^4.1.2", + "json-parse-helpfulerror": "^1.0.2", + "normalize-package-data": "^2.0.0" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "bundled": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "path-is-absolute": { + "version": "1.0.0", + "bundled": true + } + } + }, + "json-parse-helpfulerror": { + "version": "1.0.3", + "bundled": true, + "requires": { + "jju": "^1.1.0" + }, + "dependencies": { + "jju": { + "version": "1.3.0", + "bundled": true + } + } + } + } + }, + "readable-stream": { + "version": "2.1.5", + "bundled": true, + "requires": { + "buffer-shims": "^1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "buffer-shims": { + "version": "1.0.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true + }, + "string_decoder": { + "version": "0.10.31", + "bundled": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + } + } + }, + "realize-package-specifier": { + "version": "3.0.1", + "bundled": true, + "requires": { + "dezalgo": "^1.0.1", + "npm-package-arg": "^4.0.0" + } + }, + "request": { + "version": "2.74.0", + "bundled": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "bl": "~1.1.2", + "caseless": "~0.11.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~1.0.0-rc4", + "har-validator": "~2.0.6", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "node-uuid": "~1.4.7", + "oauth-sign": "~0.8.1", + "qs": "~6.2.0", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "~0.4.1" + }, + "dependencies": { + "aws-sign2": { + "version": "0.6.0", + "bundled": true + }, + "aws4": { + "version": "1.4.1", + "bundled": true + }, + "bl": { + "version": "1.1.2", + "bundled": true, + "requires": { + "readable-stream": "~2.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.0.6", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true + }, + "string_decoder": { + "version": "0.10.31", + "bundled": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + } + } + } + } + }, + "caseless": { + "version": "0.11.0", + "bundled": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "requires": { + "delayed-stream": "~1.0.0" + }, + "dependencies": { + "delayed-stream": { + "version": "1.0.0", + "bundled": true + } + } + }, + "extend": { + "version": "3.0.0", + "bundled": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true + }, + "form-data": { + "version": "1.0.0-rc4", + "bundled": true, + "requires": { + "async": "^1.5.2", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.10" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "bundled": true + } + } + }, + "har-validator": { + "version": "2.0.6", + "bundled": true, + "requires": { + "chalk": "^1.1.1", + "commander": "^2.9.0", + "is-my-json-valid": "^2.12.4", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "bundled": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "bundled": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true + }, + "has-ansi": { + "version": "2.0.0", + "bundled": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "bundled": true + } + } + }, + "commander": { + "version": "2.9.0", + "bundled": true, + "requires": { + "graceful-readlink": ">= 1.0.0" + }, + "dependencies": { + "graceful-readlink": { + "version": "1.0.1", + "bundled": true + } + } + }, + "is-my-json-valid": { + "version": "2.13.1", + "bundled": true, + "requires": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "jsonpointer": "2.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "generate-function": { + "version": "2.0.0", + "bundled": true + }, + "generate-object-property": { + "version": "1.2.0", + "bundled": true, + "requires": { + "is-property": "^1.0.0" + }, + "dependencies": { + "is-property": { + "version": "1.0.2", + "bundled": true + } + } + }, + "jsonpointer": { + "version": "2.0.0", + "bundled": true + }, + "xtend": { + "version": "4.0.1", + "bundled": true + } + } + }, + "pinkie-promise": { + "version": "2.0.1", + "bundled": true, + "requires": { + "pinkie": "^2.0.0" + }, + "dependencies": { + "pinkie": { + "version": "2.0.4", + "bundled": true + } + } + } + } + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + }, + "dependencies": { + "boom": { + "version": "2.10.1", + "bundled": true, + "requires": { + "hoek": "2.x.x" + } + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "requires": { + "boom": "2.x.x" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "requires": { + "hoek": "2.x.x" + } + } + } + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "dependencies": { + "assert-plus": { + "version": "0.2.0", + "bundled": true + }, + "jsprim": { + "version": "1.3.0", + "bundled": true, + "requires": { + "extsprintf": "1.0.2", + "json-schema": "0.2.2", + "verror": "1.3.6" + }, + "dependencies": { + "extsprintf": { + "version": "1.0.2", + "bundled": true + }, + "json-schema": { + "version": "0.2.2", + "bundled": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "requires": { + "extsprintf": "1.0.2" + } + } + } + }, + "sshpk": { + "version": "1.9.2", + "bundled": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jodid25519": "^1.0.0", + "jsbn": "~0.1.0", + "tweetnacl": "~0.13.0" + }, + "dependencies": { + "asn1": { + "version": "0.2.3", + "bundled": true + }, + "assert-plus": { + "version": "1.0.0", + "bundled": true + }, + "dashdash": { + "version": "1.14.0", + "bundled": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "getpass": { + "version": "0.1.6", + "bundled": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "jsbn": { + "version": "0.1.0", + "bundled": true, + "optional": true + }, + "tweetnacl": { + "version": "0.13.3", + "bundled": true, + "optional": true + } + } + } + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true + }, + "mime-types": { + "version": "2.1.11", + "bundled": true, + "requires": { + "mime-db": "~1.23.0" + }, + "dependencies": { + "mime-db": { + "version": "1.23.0", + "bundled": true + } + } + }, + "node-uuid": { + "version": "1.4.7", + "bundled": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true + }, + "qs": { + "version": "6.2.1", + "bundled": true + }, + "stringstream": { + "version": "0.0.5", + "bundled": true + }, + "tough-cookie": { + "version": "2.3.1", + "bundled": true + }, + "tunnel-agent": { + "version": "0.4.3", + "bundled": true + } + } + }, + "retry": { + "version": "0.10.0", + "bundled": true + }, + "rimraf": { + "version": "2.5.4", + "bundled": true, + "requires": { + "glob": "^7.0.5" + } + }, + "semver": { + "version": "5.1.0", + "bundled": true + }, + "sha": { + "version": "2.0.1", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.2", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.0.2", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "process-nextick-args": "~1.0.0", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.1", + "bundled": true + }, + "isarray": { + "version": "0.0.1", + "bundled": true + }, + "process-nextick-args": { + "version": "1.0.3", + "bundled": true + }, + "string_decoder": { + "version": "0.10.31", + "bundled": true + }, + "util-deprecate": { + "version": "1.0.1", + "bundled": true + } + } + } + } + }, + "slide": { + "version": "1.1.6", + "bundled": true + }, + "sorted-object": { + "version": "2.0.0", + "bundled": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "bundled": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, + "text-table": { + "version": "0.2.0", + "bundled": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true + }, + "umask": { + "version": "1.1.0", + "bundled": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "bundled": true, + "requires": { + "spdx-correct": "~1.0.0", + "spdx-expression-parse": "~1.0.0" + }, + "dependencies": { + "spdx-correct": { + "version": "1.0.2", + "bundled": true, + "requires": { + "spdx-license-ids": "^1.0.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.2", + "bundled": true, + "requires": { + "spdx-exceptions": "^1.0.4", + "spdx-license-ids": "^1.0.0" + }, + "dependencies": { + "spdx-exceptions": { + "version": "1.0.4", + "bundled": true + } + } + } + } + }, + "validate-npm-package-name": { + "version": "2.2.2", + "bundled": true, + "requires": { + "builtins": "0.0.7" + }, + "dependencies": { + "builtins": { + "version": "0.0.7", + "bundled": true + } + } + }, + "which": { + "version": "1.2.11", + "bundled": true, + "requires": { + "isexe": "^1.1.1" + }, + "dependencies": { + "isexe": { + "version": "1.1.2", + "bundled": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "write-file-atomic": { + "version": "1.1.4", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.2", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + } + } + } + }, "npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", diff --git a/package.json b/package.json index 6aa4f597..373094a0 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "@babel/core": "^7.12.10", "@babel/preset-env": "^7.12.11", "@datawrapper/chart-core": "^8.41.1", - "@datawrapper/icons": "^1.4.0", + "@datawrapper/icons": "^1.5.1", "@datawrapper/locales": "^1.2.6", "@datawrapper/orm": "^3.25.0", "@datawrapper/schemas": "^1.12.1", @@ -42,6 +42,7 @@ "hapi-plugin-websocket": "^2.3.2", "joi": "^17.4.0", "jsesc": "^3.0.1", + "latest": "^0.2.0", "less": "^4.1.1", "lodash": "^4.17.20", "pug": "^3.0.1", diff --git a/src/auth/dw-auth.js b/src/auth/dw-auth.js index d046a4d8..b46de42d 100644 --- a/src/auth/dw-auth.js +++ b/src/auth/dw-auth.js @@ -1,8 +1,10 @@ const Boom = require('@hapi/boom'); const Bell = require('@hapi/bell'); const get = require('lodash/get'); -const { cookieValidation, adminValidation, createCookieAuthScheme } = - require('@datawrapper/service-utils/auth')(require('@datawrapper/orm/models')); +const { cookieValidation, adminValidation, userValidation, createCookieAuthScheme } = + require('@datawrapper/service-utils/auth')(require('@datawrapper/orm/models'), { + includeTeams: true + }); const cookieAuthScheme = createCookieAuthScheme(true); const DWAuth = { @@ -29,6 +31,7 @@ const DWAuth = { server.auth.strategy('session', 'cookie-auth', { validate: cookieValidation }); server.auth.strategy('admin', 'dw-auth', { validate: adminValidation }); + server.auth.strategy('user', 'dw-auth', { validate: userValidation }); server.auth.strategy('simple', 'dw-auth'); server.auth.default('simple'); @@ -65,7 +68,6 @@ function dwAuth(server, options = {}) { authenticate: async (request, h) => { let credentials = {}; let artifacts = {}; - try { const cookie = await server.auth.test('session', request); credentials = cookie.credentials; diff --git a/src/routes/edit.js b/src/routes/edit.js new file mode 100644 index 00000000..b341dd3a --- /dev/null +++ b/src/routes/edit.js @@ -0,0 +1,75 @@ +const path = require('path'); +const Boom = require('@hapi/boom'); +const Joi = require('joi'); +const set = require('lodash/set'); +const { readdir } = require('fs').promises; +const { Op } = require('@datawrapper/orm').db; +const { Chart, User } = require('@datawrapper/orm/models'); + +module.exports = { + name: 'routes/edit', + version: '1.0.0', + register: async (server, options) => { + const config = server.methods.config(); + + server.methods.prepareView('edit/Index.svelte'); + + server.route({ + method: 'GET', + path: '/{chartId}/{step?}', + options: { + validate: { + params: Joi.object({ + chartId: Joi.string() + .alphanum() + .length(5) + .required() + .description('5 character long chart ID.'), + step: Joi.string().alphanum() + }) + }, + // auth: false, + async handler(request, h) { + const { params, auth } = request; + const chart = await getChart(params.chartId, request); + + const api = server.methods.createAPI(config, auth); + + const data = await api(`/charts/${chart.id}/data`, { json: false }); + + return h.view('edit/Index.svelte', { + htmlClass: 'has-background-white-ter', + props: { + rawChart: chart, + rawData: data, + initUrlStep: params.step, + visualizations: Array.from(server.app.visualizations.keys()).map(key => + server.app.visualizations.get(key) + ) + } + }); + } + } + }); + + async function getChart(id, request) { + const isAdmin = server.methods.isAdmin(request); + const options = { + where: { + id, + deleted: { [Op.not]: true } + } + }; + if (isAdmin) { + set(options, ['include'], [{ model: User, attributes: ['name', 'email'] }]); + } + const chart = await Chart.findOne(options); + if (!chart) { + throw Boom.notFound('There is no visualization with that id'); + } + return chart; + } + + server.methods.prepareView('edit/App.svelte'); + } +}; diff --git a/src/routes/hello.js b/src/routes/hello.js index c15a3a87..3681b06c 100644 --- a/src/routes/hello.js +++ b/src/routes/hello.js @@ -11,7 +11,7 @@ module.exports = { method: 'GET', path: '/', options: { - // auth: false, + auth: 'session', async handler(request, h) { // note: in a real-world scenario we would want to cache the icon list // so we don't have to read the file system on every request @@ -21,6 +21,7 @@ module.exports = { ); const icons = (await readdir(iconPath)).map(file => file.replace('.svg', '')); return h.view('HelloWorld.svelte', { + htmlClass: 'has-background-white-ter', props: { icons, magicNumber: 42, diff --git a/src/routes/index.js b/src/routes/index.js index cabc0e1e..4ad1d95c 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -26,6 +26,12 @@ module.exports = { prefix: '/v2/hello' } }); + + await server.register(require('./edit'), { + routes: { + prefix: '/v2/edit' + } + }); } await server.register(require('./create'), { diff --git a/src/routes/preview/index.js b/src/routes/preview/index.js index 8bc82ac3..b900ea47 100644 --- a/src/routes/preview/index.js +++ b/src/routes/preview/index.js @@ -10,12 +10,9 @@ module.exports = { name: 'routes/preview', version: '1.0.0', register: async (server, options) => { - const { loadLocales, loadVendorLocale, createAPI, initCaches } = require('./utils'); + const { loadLocales, loadVendorLocale, initCaches } = require('./utils'); const locales = await loadLocales(); const config = server.methods.config(); - const apiBase = `${config.api.https ? 'https' : 'http'}://${config.api.subdomain}.${ - config.api.domain - }/v3`; server.route({ method: 'GET', @@ -49,11 +46,7 @@ module.exports = { const { auth, params } = request; const { chartId } = params; - const api = createAPI( - apiBase, - config.api.sessionID, - auth.credentials && auth.credentials.data ? auth.credentials.data.id : '' - ); + const api = server.methods.createAPI(config, auth); let chart; @@ -119,7 +112,7 @@ module.exports = { CHART_HTML: html, CHART_HEAD: head, CHART_LOCALE: chartLocale, - VIS_SCRIPT: `${apiBase}/visualizations/${props.visualization.id}/script.js`, + VIS_SCRIPT: `${api.apiBase}/visualizations/${props.visualization.id}/script.js`, MAIN_SCRIPT: '/lib/chart-core/main.js', POLYFILL_SCRIPT: '/lib/chart-core/load-polyfills.js', DEPS: dependencies.map(el => `/lib/chart-core/${el}`), diff --git a/src/routes/preview/utils.js b/src/routes/preview/utils.js index bf3b7c9d..2c2f723b 100644 --- a/src/routes/preview/utils.js +++ b/src/routes/preview/utils.js @@ -1,4 +1,3 @@ -const got = require('got'); const path = require('path'); const fs = require('fs-extra'); const get = require('lodash/get'); @@ -47,26 +46,6 @@ module.exports = { return 'null'; }, - createAPI(baseUrl, sessionID, session) { - async function api(path, { json = true } = {}) { - const response = await got(`${baseUrl}${path}`, { - headers: session - ? { - Cookie: `${sessionID}=${session}` - } - : undefined - }); - - if (json) { - return JSON.parse(response.body); - } else { - return response.body; - } - } - - return api; - }, - initCaches(server) { const config = server.methods.config(); diff --git a/src/routes/signin.js b/src/routes/signin.js index f35d295c..b3f3e72e 100644 --- a/src/routes/signin.js +++ b/src/routes/signin.js @@ -11,6 +11,35 @@ module.exports = { version: '1.0.0', register: async (server, options) => { const oauth = server.methods.config('general').oauth; + const { preventGuestAccess } = server.methods.config('frontend'); + const providers = server.methods.config('frontend').signinProviders || []; + + server.route({ + method: 'GET', + path: '/', + options: { + auth: 'session' + }, + async handler(request, h) { + const { ref } = request.query; + + if (request.auth.isAuthenticated && request.auth.artifacts?.role !== 'guest') { + return h.redirect(ref || '/'); + } + + return h.view('signin/Index.svelte', { + props: { + target: ref || '/', + providers, + // @todo: read from config + noSignUp: !!preventGuestAccess, + signupWithoutPassword: false + } + }); + } + }); + + server.methods.prepareView('signin/Index.svelte'); for (var provider in oauth) { if (!Object.keys(Bell.providers).includes(provider)) continue; @@ -68,6 +97,9 @@ module.exports = { if (user) { await user.save(); } else { + if (preventGuestAccess) { + throw Boom.unauthorized(); + } // create new user user = await User.create({ @@ -82,12 +114,14 @@ module.exports = { const session = await login(user.id, request.auth.credentials, true); await request.server.methods.logAction(user.id, `login/${provider}`); + const { ref } = request.query; + return h .response({ [api.sessionID]: session.id }) .state(api.sessionID, session.id, getStateOpts(request.server, 90)) - .redirect('/'); + .redirect(ref || '/'); } } }); diff --git a/src/server.js b/src/server.js index 357526e0..2b5cb41f 100644 --- a/src/server.js +++ b/src/server.js @@ -16,6 +16,7 @@ const registerVisualizations = require('@datawrapper/service-utils/registerVisua const config = requireConfig(); const path = require('path'); const { getUserLanguage } = require('./utils'); +const headerLinks = require('./utils/header-links'); const { SvelteView, getView, @@ -145,6 +146,9 @@ const start = async () => { server.method('logAction', require('@datawrapper/orm/utils/action').logAction); server.method('isDevMode', () => process.env.DW_DEV_MODE); server.method('registerVisualization', registerVisualizations(server)); + server.method('createAPI', require('./utils/create-api')); + + await server.register(headerLinks); // hooks server.app.event = eventList; @@ -180,8 +184,12 @@ const start = async () => { server.ext('onPreResponse', (request, h) => { if (request.response.isBoom) { const err = request.response; + if (err.output.statusCode === 401) { + return h.redirect(`/signin?ref=${request.path}`).temporary(); + } return h .view('Error.svelte', { + htmlClass: 'has-background-white-ter', props: err.output.payload }) .code(err.output.payload.statusCode); diff --git a/src/styles/colors.scss b/src/styles/colors.scss index d582917a..70be989d 100644 --- a/src/styles/colors.scss +++ b/src/styles/colors.scss @@ -1,25 +1,52 @@ -$dw_blue: #18a1cd; -$dw_red: #c71e1d; -$dw_blue_medium: #1d81a2; -$dw_blue_dark: #15607a; -$dw_green: #39f3bb; -$dw_green_dark: #09bb9f; -$dw_background: #f9f9f9; -$dw_lightgray: #eaeaea; -$dw_gray: #e5e5e5; -$dw_gray_30: #4F4F4F; +$dw-scooter-dark: #15607A; +$dw-scooter: #1D81A2; +$dw-scooter-light: #18A1CD; +$dw-scooter-lightest: #e9f3f6; + +$dw-turquoise-dark: #09bb9f; +$dw-turquoise: #39f3bb; + +$dw-firebrick: #C71E1D; + +$dw-blue: #588CDB; +$dw-green: #6ED778; +$dw-yellow: #FFDC27; +$dw-red: #CF4870; -html { - --color-dw-blue: #18a1cd; - --color-dw-red: #c71e1d; - --color-dw-blue-medium: #1d81a2; - --color-dw-blue-dark: #15607a; - --color-dw-blue-light: #e9f3f6; - --color-dw-green: #39f3bb; - --color-dw-green-dark: #09bb9f; - --color-dw-background: #f9f9f9; - --color-dw-lightgray: #eaeaea; - --color-dw-gray: #e5e5e5; - --color-dw-gray-30: #4f4f4f; -} +$dw-black: #111111; +$dw-black-bis: #333333; // Gray 20 (aka Gray 1) +// $dw-black-ter +$dw-grey-darker: #4F4F4F; // Gray 30 (aka Gray 2) +$dw-grey-dark: #858585; // Gray 50 +$dw-grey: #A7A7A7; // Gray 60 +$dw-grey-light: #C9C9C9; // Gray 70 +$dw-grey-lighter: #E5E5E5; // Gray 80 +$dw-grey-lightest: #F0F0F0; // Gray 85 +$dw-white-ter: #F5F5F5; // Gray 90 +$dw-white-bis: #F9F9F9; // Gray 95 +$dw-white: #FFFFFF; + +$dw-shade: rgba(0,0,0,.1); + +html { + --color-dw-scooter-dark: #15607A; + --color-dw-scooter: #1D81A2; + --color-dw-scooter-light: #18A1CD; + --color-dw-scooter-lightest: #e9f3f6; + --color-dw-turquoise: #39f3bb; + --color-dw-turquoise-dark: #09bb9f; + --color-dw-firebrick: #C71E1D; + --color-dw-black: #111111; + --color-dw-black-bis: #333333; + // --color-dw-black-ter + --color-dw-grey-darker: #4F4F4F; + --color-dw-grey-dark: #858585; + --color-dw-grey: #A7A7A7; + --color-dw-grey-light: #C9C9C9; + --color-dw-grey-lighter: #E5E5E5; + --color-dw-grey-lightest: #F0F0F0; + --color-dw-white-ter: #F5F5F5; + --color-dw-white-bis: #F9F9F9; + --color-dw-white: #FFFFFF; +} \ No newline at end of file diff --git a/src/styles/index.scss b/src/styles/index.scss index d1156137..3713f225 100644 --- a/src/styles/index.scss +++ b/src/styles/index.scss @@ -2,31 +2,79 @@ @import "./fonts"; @import "./colors"; +@import "./vars"; +@import "./spaces"; -// colors -$primary: $dw_blue_medium; -$red: $dw_red; -$green: $dw_green; -$link: $dw_blue; -$link-hover: $dw_blue_dark; -$background: $dw_lightgray; -$body-background-color: $dw_background; -$light: $dw_gray; -$tabs-boxed-link-active-background-color: $dw_background; -$table-background-color: transparent; -$table-striped-row-even-background-color: hsla(0,0,0, 0.03); - -// font styles -$family-sans-serif: "Roboto", Helvetica, sans-serif; -$family-monospace: "Roboto Mono", monospace; -$body-size: 14px; -$size-1: 2.75rem; -$size-3: 1.75rem; -$size-7: 0.85rem; -$title-weight: 400; -$content-heading-weight: 400; - -$footer-padding: 3rem 0rem 6rem; + +// COLORS + +$primary: $dw-scooter; + +$info: $dw-blue; +$success: $dw-green; +$warning: $dw-yellow; +$danger: $dw-red; + +$light: $dw-white-bis; +$dark: $dw-black-bis; + +$background: $dw-white-bis; +$body-background-color: white; +$footer-background-color: transparent; + +// $border: +// $border-hover +// $border-light +// $border-light-hover + +$text: $dw-black-bis; +$text-light: $dw-grey; +$text-strong: $dw-black-bis; + +$code: darken($dw-red, 15%); + + +$link: $dw-scooter; +// $link-visited +$link-hover: $dw-scooter-dark; +// $link-hover-border + +// FOTNTS + +$family-sans-serif: "Roboto", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; +$family-serif: "Bitter", serif; +$family-monospace: "Roboto Mono", Menlo, Consolas, Monaco, "Liberation Mono", monospace; + +// SIZES + +$body-size: 16px; +$body-font-size: 14px; + +$size-1: 3rem; // = 48px @ 16px base +$size-2: 2rem; // = 32px @ 16px base +$size-3: 1.5rem; // = 24px @ 16px base +$size-4: 1.25rem; // = 20px @ 16px base +$size-5: 1rem; // 16px @ 16px base +$size-6: 0.875rem; // = 14px @ 16px base +$size-7: 0.75rem; // = 12px @ 16px base + +// $size-small: $size-7 +// $size-normal: $size-6 +// $size-medium: $size-5 +// $size-large: $size-4 + +$section-padding: 1.5rem !default; + +$hr-height: 1px; +$hr-background-color: $dw-shade; + +$navbar-item-hover-background-color: $dw-white-ter; +$navbar-divider-height: 1px; +$navbar-divider-background-color: $dw-grey-lighter; +$navbar-dropdown-arrow: $dw-grey-darker; + +$box-radius: 4px; +$hr-height: 1px; @import "../../node_modules/bulma/sass/utilities/_all.sass"; @import "../../node_modules/bulma/sass/base/_all.sass"; @@ -89,36 +137,16 @@ $footer-padding: 3rem 0rem 6rem; * BULMA LAYOUT * https://bulma.io/documentation/layout/ */ -// @import "../../node_modules/bulma/sass/layout/_all.sass"; -@import "../../node_modules/bulma/sass/layout/footer.sass"; +@import "../../node_modules/bulma/sass/layout/_all.sass"; +// @import "../../node_modules/bulma/sass/layout/footer.sass"; // @import "../../node_modules/bulma/sass/layout/hero.sass"; -@import "../../node_modules/bulma/sass/layout/section.sass"; - -a:hover { - text-decoration: underline; -} - -.title.is-1, .subtitle.is-1, .subtitle.is-2, .title.is-2 { - font-weight: $weight-light; -} - - -.title.is-3 { - font-weight: $weight-medium; -} - - -button.is-primary, -button.is-link, -button.is-info, -button.is-danger, -button.is-dark, -button.is-black { - svg { - fill: white; - } +// @import "../../node_modules/bulma/sass/layout/section.sass"; + +// adjust navbar arrow +.select:not(.is-multiple):not(.is-loading)::after, .navbar-link:not(.is-arrowless)::after { + border-width: 2px; + border-radius: 0; + width: 0.5em; + height: 0.5em; } -.button.is-large { - font-weight: $weight-medium; -} \ No newline at end of file diff --git a/src/styles/spaces.scss b/src/styles/spaces.scss new file mode 100644 index 00000000..24a57889 --- /dev/null +++ b/src/styles/spaces.scss @@ -0,0 +1,26 @@ + +// $dw-responsive-spacing-shortcuts: ("margin": "r-m", "padding": "r-p") !default; +// $dw-responsive-spacing-directions: ("top": "t", "right": "r", "bottom": "b", "left": "l") !default; +// $dw-responsive-spacing-horizontal: "x" !default; +// $dw-responsive-spacing-vertical: "y" !default; +// $dw-responsive-spacing-values: ("0": 0, "1": 0.25rem, "2": 0.5rem, "3": 0.75rem, "4": 1rem, "5": 1.5rem, "6": 3rem) !default; + +// @each $property, $shortcut in $dw-responsive-spacing-shortcuts +// @each $name, $value in $dw-responsive-spacing-values +// // All directions +// .#{$shortcut}-#{$name} +// #{$property}: $value !important +// // Cardinal directions +// @each $direction, $suffix in $dw-responsive-spacing-directions +// .#{$shortcut}#{$suffix}-#{$name} +// #{$property}-#{$direction}: $value !important +// // Horizontal axis +// @if $dw-responsive-spacing-horizontal != null +// .#{$shortcut}#{$dw-responsive-spacing-horizontal}-#{$name} +// #{$property}-left: $value !important +// #{$property}-right: $value !important +// // Vertical axis +// @if $dw-responsive-spacing-vertical != null +// .#{$shortcut}#{$dw-responsive-spacing-vertical}-#{$name} +// #{$property}-top: $value !important +// #{$property}-bottom: $value !important diff --git a/src/styles/vars.scss b/src/styles/vars.scss new file mode 100644 index 00000000..b3c79f04 --- /dev/null +++ b/src/styles/vars.scss @@ -0,0 +1,5 @@ +html { + --radius-small: $radius-small; + --radius: $radius; + --radius-large: $radius-large; +} \ No newline at end of file diff --git a/src/utils/create-api.js b/src/utils/create-api.js new file mode 100644 index 00000000..804a8fea --- /dev/null +++ b/src/utils/create-api.js @@ -0,0 +1,32 @@ +const got = require('got'); +const get = require('lodash/get'); + +module.exports = function createAPI(config, auth) { + const apiBase = `${config.api.https ? 'https' : 'http'}://${config.api.subdomain}.${ + config.api.domain + }/v3`; + const sessionID = get(config, 'api.sessionID'); + const session = get(auth, 'credentials.data.id', ''); + + async function api(path, { json = true } = {}) { + if (!path.startsWith('/')) throw new Error('API request path needs to start with /'); + try { + const response = await got(`${apiBase}${path}`, { + headers: session + ? { + Cookie: `${sessionID}=${session}` + } + : undefined + }); + if (json) { + return JSON.parse(response.body); + } else { + return response.body; + } + } catch (x) { + console.error(x); + } + } + api.apiBase = apiBase; + return api; +}; diff --git a/src/utils/header-links.js b/src/utils/header-links.js new file mode 100644 index 00000000..0bbc78ef --- /dev/null +++ b/src/utils/header-links.js @@ -0,0 +1,189 @@ +const { getUserLanguage } = require('./index'); + +module.exports = { + name: 'header-links', + version: '1.0.0', + async register(server, options) { + server.app.headerLinks = new Set(); + + server.method('registerHeaderLinks', headerLinkFunc => { + server.app.headerLinks.add(headerLinkFunc); + }); + + server.method('getHeaderLinks', request => { + const links = []; + // evaluate links for each request, please use cache! + server.app.headerLinks.forEach(func => { + links.push.apply(links, func(request)); + }); + // sort links by order + return links.sort((a, b) => { + return a.order !== undefined && b.order !== undefined ? a.order - b.order : 0; + }); + }); + + const frontendConfig = server.methods.config('frontend'); + + // add some core header links + server.methods.registerHeaderLinks(request => { + const user = request.auth.artifacts; + const isGuest = !user || user.role === 'guest'; + const language = getUserLanguage(request.auth); + const __ = key => server.methods.translate(key, { scope: 'core', language }); + return [ + ...(!isGuest + ? [ + { + id: 'dashboard', + svgIcon: 'launch', + // fontIcon: 'fa fa-fw fa-bar-chart-o', + title: __('navbar / dashboard'), + url: '/', + order: 5 + } + ] + : []), + { + id: 'create-new', + svgIcon: 'add', + title: `${__('navbar / create-new')} `, + order: 10, + submenuItems: [ + { + id: 'create-chart', + svgIcon: 'dw-chart', + title: __('navbar / create / chart'), + url: '/create/chart', + order: 10 + }, + { + id: 'create-map', + svgIcon: 'dw-map', + title: __('navbar / create / map'), + url: '/select/map', + order: 20 + }, + { + id: 'create-table', + svgIcon: 'dw-table', + title: __('navbar / create / table'), + url: '/create/table', + order: 30 + }, + ...(!isGuest + ? [ + { + type: 'activeTeam', + order: 999 + } + ] + : []) + ] + }, + + // { + // id: 'settings', + // // fontIcon: 'im im-globe', + // title: language.substr(0, 2).toLowerCase(), + // order: 90, + // + // }, + ...(isGuest + ? [ + { + type: 'separator', + order: 69 + }, + { + svgIcon: 'sign-in', + title: 'Sign in', + type: 'login', + url: `/signin?ref=${request.path}` + } + ] + : [ + { + id: 'my-charts', + svgIcon: 'cabinet', + title: __('My Charts'), + url: '/mycharts', + order: 60 + }, + { + id: 'my-charts', + type: 'visArchive', + submenuItems: true, + order: 61, + style: 'padding-left: 0;margin-left: -20px;' + }, + { + type: 'separator', + order: 69 + } + ]), + { + id: 'settings', + svgIcon: 'menu', + svgIconSize: '30px', + // svgIconCrisp: true, + order: 95, + submenuItems: [ + ...(!isGuest + ? [ + { + url: '/account', + title: __('account / settings'), + svgIcon: 'user-menu' + }, + { + url: '/account/teams', + title: __('account / my-teams'), + svgIcon: 'team' + } + ] + : []), + { + url: '/account/teams', + title: __('Language'), + svgIcon: 'globe', + submenuItems: (frontendConfig.languages || []).map( + ({ id, title, flag }) => ({ + id, + type: 'language', + svgIcon: id === language ? 'check-circle' : 'circle', + svgIconClass: id === language ? '' : 'has-text-grey-light', + title: `${title}` + }) + ) + }, + ...(!isGuest + ? [ + { + type: 'separator' + }, + { + type: 'html', + content: `${__( + 'account / my-teams / select-active' + )}` + }, + { + type: 'teamSelector' + }, + { + type: 'separator' + }, + { + url: '#/logout', + svgIcon: 'sign-out', + type: 'logout', + title: 'Logout' + } + ] + : []) + ] + } + ]; + }); + } +}; diff --git a/src/utils/svelte-view/context.js b/src/utils/svelte-view/context.js index 9834893b..e3dca2ff 100644 --- a/src/utils/svelte-view/context.js +++ b/src/utils/svelte-view/context.js @@ -21,7 +21,10 @@ module.exports = function (request) { frontendDomain: `${frontendConfig.domain}`, imageDomain: `${generalConfig.imageDomain}`, dev: process.env.DW_DEV_MODE, - footerLinks: frontendConfig.footerLinks || [] + footerLinks: frontendConfig.footerLinks || [], + languages: frontendConfig.languages || [], + headerLinks: server.methods.getHeaderLinks(request), + stickyHeaderThreshold: 800 }, request: { method: request.method, @@ -38,7 +41,9 @@ module.exports = function (request) { name: auth.artifacts.email, language: userLang, isAdmin: auth.artifacts.isAdmin(), - isGuest: false + isGuest: false, + teams: auth.artifacts.teams, + activeTeam: auth.artifacts.activeTeam } : { id: -1, diff --git a/src/utils/svelte-view/index.js b/src/utils/svelte-view/index.js index ad06119d..45a0aad7 100644 --- a/src/utils/svelte-view/index.js +++ b/src/utils/svelte-view/index.js @@ -125,33 +125,48 @@ const SvelteView = { context.props.stores = context.stores; // eslint-disable-next-line - const ssrFunc = new Function(ssr + ';return App'); - const { css, html, head } = ssrFunc().render(context.props); - - // remove stores that we already have in client-side cache - Object.keys(context.storeCached).forEach(key => { - context.props.stores[key] = {}; - }); - - const output = ejs.render(template, { - SSR_HEAD: head, - SSR_CSS: css.code, - NODE_ENV: process.env.NODE_ENV, - SSR_HTML: html, - PAGE: page, - PAGE_PROPS: jsesc(JSON.stringify(context.props), { - isScriptContext: true, - json: true, - wrap: true - }), - DW_DEV_MODE: process.env.DW_DEV_MODE, - STORE_HASHES: jsesc(JSON.stringify(context.storeHashes), { - isScriptContext: true, - json: true, - wrap: true - }) - }); - return output; + try { + const ssrFunc = new Function(ssr + ';return App'); + + const { css, html, head } = ssrFunc().render(context.props); + + // remove stores that we already have in client-side cache + Object.keys(context.storeCached).forEach(key => { + context.props.stores[key] = {}; + }); + + const output = ejs.render(template, { + HTML_CLASS: context.htmlClass || '', + SSR_HEAD: head, + SSR_CSS: css.code, + NODE_ENV: process.env.NODE_ENV, + SSR_HTML: html, + PAGE: page, + PAGE_PROPS: jsesc(JSON.stringify(context.props), { + isScriptContext: true, + json: true, + wrap: true + }), + DW_DEV_MODE: process.env.DW_DEV_MODE, + STORE_HASHES: jsesc(JSON.stringify(context.storeHashes), { + isScriptContext: true, + json: true, + wrap: true + }) + }); + return output; + } catch (err) { + const errLines = err.stack.split('\n'); + const errLine = errLines.find(d => d.includes('at eval (eval at runtime')); + + if (errLine) { + const [m, line, col] = errLine.match(/:(\d+):(\d+)/); + const lines = ssr.split('\n'); + console.error('Error near:\n'); + console.error(lines.slice(+line - 3, +line + 4)); // before line + } + throw err; + } }; }, context: require('./context') diff --git a/src/utils/svelte-view/template.ejs b/src/utils/svelte-view/template.ejs index b83f3b62..5dac0795 100644 --- a/src/utils/svelte-view/template.ejs +++ b/src/utils/svelte-view/template.ejs @@ -1,5 +1,5 @@ - + diff --git a/src/views/Create.svelte b/src/views/Create.svelte index 0bd6639c..af8db742 100644 --- a/src/views/Create.svelte +++ b/src/views/Create.svelte @@ -15,7 +15,7 @@ import httpReq from '@datawrapper/shared/httpReq'; import { autoTickFormatDate } from '@datawrapper/shared/autoTickFormat'; import delimited from '@datawrapper/chart-core/lib/dw/dataset/delimited'; - import SignInPageLayout from './layout/SignInPageLayout.svelte'; + import SignInPageLayout from './layout/OldSignInPageLayout.svelte'; let loggedIn = false; let ds; diff --git a/src/views/Error.svelte b/src/views/Error.svelte index d0be9375..b635e467 100644 --- a/src/views/Error.svelte +++ b/src/views/Error.svelte @@ -1,6 +1,7 @@ -
-
-
-

- Error {statusCode} ({error}{#if message !== error} / {message}{/if}) -

-

{niceHed}

-

{niceText}

+
+
+
+
+ +
+
+

+ Error {statusCode} ({error}{#if message !== error} / {message}{/if}) +

+

{niceHed}

+

{niceText}

-
- {#if statusCode === 404} -

Here are some other places you may want to go to now

- - {/if} -

- {@html __('error / support-help').replace( - '%s', - `mailto:support@datawrapper.de?subject=Error%20${statusCode}:%20${error}&body=%0A%0A%0A%0A----%0AError:%20${statusCode}%20/%20${message}%0AURL:%20${$request.method.toUpperCase()}%20${ - $config.frontendDomain - }${$request.path}%0AQuery:%20${encodeURI( - JSON.stringify($request.query) - )}%0ATime:%20${new Date().toUTCString()}` - )} -

+
+ {#if statusCode === 404} +

Here are some other places you may want to go to now

+ + {/if} +

+ {@html __('error / support-help').replace( + '%s', + `mailto:support@datawrapper.de?subject=Error%20${statusCode}:%20${error}&body=%0A%0A%0A%0A----%0AError:%20${statusCode}%20/%20${message}%0AURL:%20${$request.method.toUpperCase()}%20${ + $config.frontendDomain + }${$request.path}%0AQuery:%20${encodeURI( + JSON.stringify($request.query) + )}%0ATime:%20${new Date().toUTCString()}` + )} +

+
+
-
+
diff --git a/src/views/HelloWorld.svelte b/src/views/HelloWorld.svelte index 0ead9a0f..6879c3eb 100644 --- a/src/views/HelloWorld.svelte +++ b/src/views/HelloWorld.svelte @@ -7,6 +7,7 @@ import Tabs from 'layout/partials/bulma/Tabs.svelte'; import Menu from 'layout/partials/bulma/Menu.svelte'; import { onMount, onDestroy, getContext } from 'svelte'; + import SignUp from './signin/SignUpForm.svelte'; export let magicNumber; export let visualizations; @@ -78,7 +79,8 @@ { url: '#titles', title: 'Titles' }, { url: '#content', title: 'Content' }, { url: '#table', title: 'Table' }, - { url: '#forms', title: 'Forms' } + { url: '#forms', title: 'Forms' }, + { url: '#signup', title: 'Sign Up' } ] }, { @@ -96,729 +98,775 @@ -
-
-
- -
-
-
-

- {message} -

-
-

- Welcome to the Hello World demo page of our new frontend! The purpose of - this page is to demonstate the use of our built-in design components, - most of which are based on the Bulma CSS framework. -

-

{__('team / invite / intro')}

-

- The magic number is {magicNumber}, and it keeps increasing - because Svelte client-side hydration works! -

-
+
+
+ content +
+
+
- -
-

Icons!

- -
-
- {#each icons as icon, i} - (iconPreview = icon)}> - - - {/each} +
+
+

Hello world!

+

A Datawrapper demo page

+

+ {message} + {#if $user && $user.activeTeam} + Your active team is {$user.activeTeam.name}. + {:else} + You don't have an active team. + {/if} +

+
+

+ Welcome to the Hello World demo page of our new frontend! The + purpose of this page is to demonstate the use of our built-in design + components, most of which are based on the Bulma CSS framework. +

+

A translation test: {__('team / invite / intro')}

+

+ The magic number is {magicNumber}, and it keeps + increasing because Svelte client-side hydration works! +

-
-
-

- Icons can be used inline in text, - too! And they can spin! - -

-
-
- {#each [16, 24, 32, 48, 64, 96, 128] as size, i} - +
+ +
+

Icons!

+ +
+
+ {#each icons as icon, i} + (iconPreview = icon)}> + + {/each}
+
+
+

+ Icons can be used inline in text, + too! And they can spin! + +

+
+
+ {#each [16, 24, 32, 48, 64, 96, 128] as size, i} + + {/each} +
+
-
-
-

Buttons

- -
- - - - - - - -
+
+

Buttons

+ +
+ + + + + + + +
-
- - - -
+
+ + + +
-
- - -
+
+ + +
-
- - - - -
+
+ + + + +
-
- - - - +
+ + + + +
-
-
- +
+ -
-
- This chart is in -
-
- +
+
+ This chart is in +
+
+ +
-
-
-

Tabs

- - -
+
+

Tabs

+ + +
-
- -
-
- +
+ +
+
+ +
-
-
-

Notifications

-

- Use wrapper component <Notification /> -

- - - Lorem ipsum dolor sit amet, consectetur adipiscing elit lorem ipsum dolor. Pellentesque risus mi, tempus quis placerat ut, porta nec nulla. Vestibulum rhoncus ac ex sit - amet fringilla. Nullam gravida purus diam, et dictum - felis venenatis efficitur. - - - - Primary! Primar lorem ipsum dolor sit amet, consectetur - adipiscing elit lorem ipsum dolor. - Pellentesque risus mi, tempus quis placerat ut, porta nec - nulla. Vestibulum rhoncus ac ex sit amet fringilla. Nullam gravida purus - diam, et dictum - felis venenatis efficitur. - - - - Info! Primar lorem ipsum dolor sit amet, consectetur - adipiscing elit lorem ipsum dolor. - Pellentesque risus mi, tempus quis placerat ut, porta nec - nulla. Vestibulum rhoncus ac ex sit amet fringilla. Nullam gravida purus - diam, et dictum - felis venenatis efficitur. - - - - Success! Primar lorem ipsum dolor sit amet, consectetur - adipiscing elit lorem ipsum dolor. - Pellentesque risus mi, tempus quis placerat ut, porta nec - nulla. Vestibulum rhoncus ac ex sit amet fringilla. Nullam gravida purus - diam, et dictum - felis venenatis efficitur. - - - - Warning! Primar lorem ipsum dolor sit amet, consectetur - adipiscing elit lorem ipsum dolor. - Pellentesque risus mi, tempus quis placerat ut, porta nec - nulla. Vestibulum rhoncus ac ex sit amet fringilla. Nullam gravida purus - diam, et dictum - felis venenatis efficitur. Not deletable :) - - - - Danger! Primar lorem ipsum dolor sit amet, consectetur - adipiscing elit lorem ipsum dolor. - Pellentesque risus mi, tempus quis placerat ut, porta nec - nulla. Vestibulum rhoncus ac ex sit amet fringilla. Nullam gravida purus - diam, et dictum - felis venenatis efficitur. - -
+
+

Notifications

+

+ Use wrapper component <Notification /> +

-
-

Progress bar

+ + Lorem ipsum dolor sit amet, consectetur adipiscing elit lorem ipsum + dolor. Pellentesque risus mi, tempus quis placerat ut, + porta nec nulla. Vestibulum rhoncus ac ex sit amet fringilla. Nullam + gravida purus diam, et dictum + felis venenatis efficitur. + + + + Primary! Primar lorem ipsum dolor sit amet, consectetur + adipiscing elit lorem ipsum dolor. + Pellentesque risus mi, tempus quis placerat ut, porta + nec nulla. Vestibulum rhoncus ac ex sit amet fringilla. Nullam gravida + purus diam, et dictum + felis venenatis efficitur. + + + + Info! Primar lorem ipsum dolor sit amet, consectetur + adipiscing elit lorem ipsum dolor. + Pellentesque risus mi, tempus quis placerat ut, porta + nec nulla. Vestibulum rhoncus ac ex sit amet fringilla. Nullam gravida + purus diam, et dictum + felis venenatis efficitur. + + + + Success! Primar lorem ipsum dolor sit amet, consectetur + adipiscing elit lorem ipsum dolor. + Pellentesque risus mi, tempus quis placerat ut, porta + nec nulla. Vestibulum rhoncus ac ex sit amet fringilla. Nullam gravida + purus diam, et dictum + felis venenatis efficitur. + + + + Warning! Primar lorem ipsum dolor sit amet, consectetur + adipiscing elit lorem ipsum dolor. + Pellentesque risus mi, tempus quis placerat ut, porta + nec nulla. Vestibulum rhoncus ac ex sit amet fringilla. Nullam gravida + purus diam, et dictum + felis venenatis efficitur. Not deletable :) + + + + Danger! Primar lorem ipsum dolor sit amet, consectetur + adipiscing elit lorem ipsum dolor. + Pellentesque risus mi, tempus quis placerat ut, porta + nec nulla. Vestibulum rhoncus ac ex sit amet fringilla. Nullam gravida + purus diam, et dictum + felis venenatis efficitur. + +
- 15% - 30% - 45% - 60% - 75% - 90% -
+
+

Progress bar

-
-

Message

-

- Use wrapper component <Message /> -

- -
-
- - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque risus mi, tempus quis placerat ut, porta nec nulla. Vestibulum rhoncus ac - ex sit amet fringilla. Nullam gravida purus diam, et dictum - felis venenatis - efficitur. Aenean ac eleifend lacus, in mollis lectus. - Donec sodales, arcu et sollicitudin porttitor, tortor urna tempor - ligula, id porttitor mi magna a neque. Donec dui urna, vehicula et - sem eget, facilisis sodales sem. - -
-
- - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque risus mi, tempus quis placerat ut, porta nec nulla. Vestibulum rhoncus ac - ex sit amet fringilla. Nullam gravida purus diam, et dictum - felis venenatis efficitur. - -
-
- - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque risus mi, tempus quis placerat ut, porta nec nulla. Vestibulum rhoncus ac - ex sit amet fringilla. Nullam gravida purus diam, et dictum - felis venenatis efficitur. - + 15% + 30% + 45% + 60% + 75% + 90% +
+ +
+

Message

+

+ Use wrapper component <Message /> +

+ +
+
+ + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque risus mi, tempus quis placerat ut, porta nec nulla. Vestibulum rhoncus + ac ex sit amet fringilla. Nullam gravida purus diam, et dictum + felis venenatis + efficitur. Aenean ac eleifend lacus, in mollis lectus. + Donec sodales, arcu et sollicitudin porttitor, tortor urna + tempor ligula, id porttitor mi magna a neque. Donec dui urna, + vehicula et sem eget, facilisis sodales sem. + +
+
+ + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque risus mi, tempus quis placerat ut, porta nec nulla. Vestibulum rhoncus + ac ex sit amet fringilla. Nullam gravida purus diam, et dictum + felis venenatis efficitur. + +
+
+ + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque risus mi, tempus quis placerat ut, porta nec nulla. Vestibulum rhoncus + ac ex sit amet fringilla. Nullam gravida purus diam, et dictum + felis venenatis efficitur. + +
-
-
-

Titles

-
-

Title size 1

-

Subtitle size 3

-
-

Title size 2

-

Subtitle size 4

- -

Title size 3

-

Subtitle size 5

-
-

Title size 4

-

Subtitle size 6

-
-

Title size 5

+
+

Titles

+
+

Title size 1

+

Subtitle size 3

+
+

Title size 2

+

Subtitle size 4

+ +

Title size 3

+

Subtitle size 5

+
+

Title size 4

+

Subtitle size 6

+
+

Title size 5

+
-
-
-

Content

- -
-

Hello World

-

- Lorem ipsum[1] dolor sit amet, - consectetur adipiscing elit. Nulla accumsan, metus ultrices eleifend - gravida, nulla nunc varius lectus, nec rutrum justo nibh eu lectus. Ut - vulputate semper dui. Fusce erat odio, sollicitudin vel erat vel, - interdum mattis neque. Subscript - works as well! -

-

Second level

-

- Curabitur accumsan turpis pharetra augue tincidunt blandit. - Quisque condimentum maximus mi, sit amet commodo arcu rutrum id. Proin pretium - urna vel cursus venenatis. Suspendisse potenti. Etiam mattis sem rhoncus - lacus dapibus facilisis. Donec at dignissim dui. Ut et neque nisl. -

-
    -
  • In fermentum leo eu lectus mollis, quis dictum mi aliquet.
  • -
  • Morbi eu nulla lobortis, lobortis est in, fringilla felis.
  • -
  • - Aliquam nec felis in sapien venenatis viverra fermentum nec lectus. -
  • -
  • Ut non enim metus.
  • -
-

Third level

-

- Quisque ante lacus, malesuada ac auctor vitae, congue non ante. Phasellus lacus ex, semper ac tortor nec, fringilla condimentum orci. - Fusce eu rutrum tellus. -

-
    -
  1. Donec blandit a lorem id convallis.
  2. -
  3. Cras gravida arcu at diam gravida gravida.
  4. -
  5. Integer in volutpat libero.
  6. -
  7. Quisque aliquam cursus urna, non bibendum massa viverra eget.
  8. -
  9. Vivamus maximus ultricies pulvinar.
  10. -
-
- Ut venenatis, nisl scelerisque sollicitudin fermentum, quam libero - hendrerit ipsum, ut blandit est tellus sit amet turpis. -
-

- Quisque at semper enim, eu hendrerit odio. Etiam auctor nisl et justo sodales elementum. Maecenas ultrices lacus quis neque consectetur, et lobortis - nisi molestie. -

-

- Sed sagittis enim ac tortor maximus rutrum. Nulla facilisi. Donec mattis - vulputate risus in luctus. Maecenas vestibulum interdum commodo. -

+
+

Content

+ +
+

Hello World

+

+ Lorem ipsum[1] dolor sit amet, + consectetur adipiscing elit. Nulla accumsan, metus ultrices eleifend + gravida, nulla nunc varius lectus, nec rutrum justo nibh eu lectus. + Ut vulputate semper dui. Fusce erat odio, sollicitudin vel erat vel, + interdum mattis neque. Subscript + works as well! +

+

Second level

+

+ Curabitur accumsan turpis pharetra augue tincidunt blandit. + Quisque condimentum maximus mi, sit amet commodo arcu rutrum id. Proin + pretium urna vel cursus venenatis. Suspendisse potenti. Etiam mattis + sem rhoncus lacus dapibus facilisis. Donec at dignissim dui. Ut et neque + nisl. +

+
    +
  • In fermentum leo eu lectus mollis, quis dictum mi aliquet.
  • +
  • Morbi eu nulla lobortis, lobortis est in, fringilla felis.
  • +
  • + Aliquam nec felis in sapien venenatis viverra fermentum nec + lectus. +
  • +
  • Ut non enim metus.
  • +
+

Third level

+

+ Quisque ante lacus, malesuada ac auctor vitae, congue non ante. Phasellus lacus ex, semper ac tortor nec, fringilla condimentum + orci. Fusce eu rutrum tellus. +

+
    +
  1. Donec blandit a lorem id convallis.
  2. +
  3. Cras gravida arcu at diam gravida gravida.
  4. +
  5. Integer in volutpat libero.
  6. +
  7. + Quisque aliquam cursus urna, non bibendum massa viverra eget. +
  8. +
  9. Vivamus maximus ultricies pulvinar.
  10. +
+
+ Ut venenatis, nisl scelerisque sollicitudin fermentum, quam libero + hendrerit ipsum, ut blandit est tellus sit amet turpis. +
+

+ Quisque at semper enim, eu hendrerit odio. Etiam auctor nisl et justo sodales elementum. Maecenas ultrices lacus quis neque consectetur, et lobortis + nisi molestie. +

+

+ Sed sagittis enim ac tortor maximus rutrum. Nulla facilisi. Donec + mattis vulputate risus in luctus. Maecenas vestibulum interdum + commodo. +

+
-
-
-

Table

- - - - - - - - - - - - - {#each visualizations as vis, i} +
+

Table

+ +
#IdNamePluginWorkflow
+ - - - - - + + + + + - {/each} - -
{i + 1}{vis.id}{vis.title}{vis.__plugin}{vis.namespace}#IdNamePluginWorkflow
-
+ + + {#each visualizations as vis, i} + + {i + 1} + {vis.id} + {vis.title} + {vis.__plugin} + {vis.namespace} + + {/each} + + +
-
-

Forms

-
-
-

Vertical

-
- -
- +
+

Forms

+
+
+

Vertical

+
+ +
+ +
-
-
- -
- - - - - - - +
+ +
+ + + + + + + +
+

This username is available

-

This username is available

-
-
- -
- - - - - - - +
+ +
+ + + + + + + +
+

This email is invalid

-

This email is invalid

-
-
- -
-
- +
+ +
+
+ +
-
-
- -
-