diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..b7714d1c --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,20 @@ +name: ci +on: [push, pull_request] + +jobs: + test: + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest] + node: ['10', '12', '14'] + + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node }} + - run: npm install + - run: npm test diff --git a/_locales/de/messages.json b/_locales/de/messages.json index 594eaa5a..6521b6f3 100644 --- a/_locales/de/messages.json +++ b/_locales/de/messages.json @@ -1277,6 +1277,10 @@ "message": "Code formatieren", "description": "Label for the CSS-beautifier button on the edit style page" }, + "styleBeautifyHint": { + "message": "Hinweis: Mache einen Rechtsklick auf \"Code formatieren\" oder nutze das weiter unten definierte Tastenkürzel, um den Code zu formatieren ohne dieses Fenster anzuzeigen.", + "description": "Hint shown inside the CSS-beautifier panel" + }, "styleBeautifyIndentConditional": { "message": "Rücke @media / @supports ein", "description": "CSS-beautifier option" diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 33a7ddc0..0f42f307 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1297,6 +1297,10 @@ "message": "Beautify", "description": "Label for the CSS-beautifier button on the edit style page" }, + "styleBeautifyHint": { + "message": "Hint: right-click the “Beautify” button or use the keyboard shortcut defined below to beautify without showing this panel", + "description": "Hint shown inside the CSS-beautifier panel" + }, "styleBeautifyIndentConditional": { "message": "Indent @media, @supports", "description": "CSS-beautifier option" diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index 674a662b..d96e9a3a 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -93,7 +93,7 @@ "description": "" }, "checkAllUpdates": { - "message": "Rechercher des mises à jour pour tous les styles", + "message": "Rechercher des mises à jour", "description": "Label for the button to check all styles for updates" }, "checkAllUpdatesForce": { @@ -101,7 +101,7 @@ "description": "Label for the button to apply all detected updates" }, "checkForUpdate": { - "message": "Rechercher des mises à jour", + "message": "Rechercher une mise à jour", "description": "Label for the button to check a single style for an update" }, "checkingForUpdate": { @@ -292,6 +292,10 @@ "message": "Glisser votre fichier de sauvegarde n’importe où sur cette page pour l’importer.", "description": "Drag'n'drop message" }, + "dragDropUsercssTabstrip": { + "message": "Pour installer le fichier, glisser le fichier sur la barre des onglets (la zone où les titres des onglets sont affichés).", + "description": "Message popup shown when erroneously dropping a usercss file into the manager page" + }, "editDeleteText": { "message": "Supprimer", "description": "Label for the context menu item in the editor to delete selected text" @@ -617,6 +621,14 @@ "message": "Une erreur est survenue durant la surveillance du fichier", "description": "The label of live-reload error" }, + "liveReloadInstallHint": { + "message": "Gardez cet onglet ouvert pour mettre à jour le style automatiquement basé sur les modifications extérieures.", + "description": "The label of live-reload feature" + }, + "liveReloadInstallHintFF": { + "message": "Gardez cet onglet ouvert ainsi que l´onglet original pour mettre à jour le style automatiquement basé sur les modifications extérieures.", + "description": "The extra hint of live-reload feature shown only for file:// URLs in Firefox" + }, "liveReloadLabel": { "message": "Rechargement immédiat", "description": "The label of live-reload feature" @@ -674,15 +686,15 @@ "description": "Tooltip for the checkbox to show only locally created styles i.e. non-updatable" }, "manageOnlyNonUsercss": { - "message": "Uniquement les styles non Usercss", + "message": "Styles non Usercss uniquement", "description": "Checkbox to show only non-Usercss (standard) styles" }, "manageOnlyUpdates": { - "message": "Uniquement avec mises à jour ou problèmes", + "message": "Avec mises à jour ou problèmes uniquement", "description": "Checkbox to show only styles that have updates after check-all-styles-for-updates was performed" }, "manageOnlyUsercss": { - "message": "Uniquement les styles Usercss", + "message": "Styles Usercss uniquement", "description": "Checkbox to show only Usercss styles" }, "menuShowBadge": { @@ -1464,7 +1476,7 @@ "description": "Note in the toolbar popup for some file types that cannot be accessed" }, "updateAllCheckSucceededNoUpdate": { - "message": "All styles are up to date.", + "message": "Aucune mise à jour trouvée.", "description": "Text that displays when an update all check completed and no updates are available" }, "updateAllCheckSucceededSomeEdited": { diff --git a/_locales/ja/messages.json b/_locales/ja/messages.json index 2f98bc39..1b79ccb7 100644 --- a/_locales/ja/messages.json +++ b/_locales/ja/messages.json @@ -1162,7 +1162,7 @@ "description": "Label for the checkbox controlling 'edit' action behavior in the popup." }, "popupStylesFirst": { - "message": "スタイルをコマンドボタンより上に表示", + "message": "スタイル一覧をコマンドボタンより上に表示", "description": "Label for the checkbox controlling section order in the popup." }, "prefShowBadge": { @@ -1305,6 +1305,10 @@ "message": "書式整形", "description": "Label for the CSS-beautifier button on the edit style page" }, + "styleBeautifyHint": { + "message": "ヒント: 書式整形ボタンを右クリックするか、下で設定したキーボードショートカットを使用すると、このパネルを表示せずに書式設定が行えます", + "description": "Hint shown inside the CSS-beautifier panel" + }, "styleBeautifyIndentConditional": { "message": "@media, @supports をインデント", "description": "CSS-beautifier option" diff --git a/_locales/ko/messages.json b/_locales/ko/messages.json index 9e26dfee..9b207cd9 100644 --- a/_locales/ko/messages.json +++ b/_locales/ko/messages.json @@ -1 +1,1639 @@ -{} \ No newline at end of file +{ + "addStyleLabel": { + "message": "새 스타일 작성", + "description": "Label for the button to go to the add style page" + }, + "addStyleTitle": { + "message": "스타일 추가", + "description": "Title of the page for adding styles" + }, + "alphaChannel": { + "message": "투명도", + "description": "Label of color's opacity" + }, + "appliesAdd": { + "message": "추가", + "description": "Label for the button to add an 'applies' entry" + }, + "appliesDisplay": { + "message": "적용 대상: $applies$", + "description": "Text on the manage screen to describe what the style applies to", + "placeholders": { + "applies": { + "content": "$1" + } + } + }, + "appliesDisplayTruncatedSuffix": { + "message": "그 이상", + "description": "Text added to appliesDisplay when there are more sites for the style than are displayed" + }, + "appliesDomainOption": { + "message": "URL의 도메인이 다음과 같음", + "description": "Option to make the style apply to the entered string as a domain" + }, + "appliesHelp": { + "message": "'적용 대상'은 이 섹션에 작성한 스타일을 어느 URL에 적용할지 정합니다", + "description": "Help text for 'applies to' section" + }, + "appliesLabel": { + "message": "적용 대상", + "description": "Label for 'applies to' fields on the edit/add screen" + }, + "appliesLineWidgetLabel": { + "message": "'적용 대상' 정보 표시", + "description": "Label for the checkbox to display applies-to information in the single editor" + }, + "appliesLineWidgetWarning": { + "message": "경량화(Minify) 된 CSS에선 작동하지 않습니다.", + "description": "A warning that applies-to information won't show properly with minified CSS" + }, + "appliesRegexpOption": { + "message": "URL이 다음 정규 표현식과 일치함", + "description": "Option to make the style apply to the entered string as a regular expression" + }, + "appliesRemove": { + "message": "제거", + "description": "Label for the button to remove an 'applies' entry" + }, + "appliesRemoveError": { + "message": "마지막 '적용 대상' 항목은 제거할 수 없습니다", + "description": "Error displayed when the last 'applies' is going to be removed" + }, + "appliesSpecify": { + "message": "개별 지정", + "description": "Label for the button to make a style apply only to specific sites" + }, + "appliesToEverything": { + "message": "전부", + "description": "Text displayed for styles that apply to all sites" + }, + "appliesUrlPrefixOption": { + "message": "URL의 앞부분이 다음과 같음", + "description": "Option to make the style apply to the entered string as a URL prefix" + }, + "applyAllUpdates": { + "message": "모든 업데이트 적용", + "description": "Label for the button to apply all detected updates" + }, + "author": { + "message": "작성자", + "description": "Label for the style author" + }, + "backupButtons": { + "message": "백업", + "description": "Heading for backup" + }, + "backupMessage": { + "message": "파일을 선택하거나, 이 페이지로 파일을 드래그앤드롭하세요.", + "description": "Message for backup" + }, + "bckpInstStyles": { + "message": "스타일 내보내기", + "description": "" + }, + "checkAllUpdates": { + "message": "모든 스타일 업데이트 확인", + "description": "Label for the button to check all styles for updates" + }, + "checkAllUpdatesForce": { + "message": "한 번 더 확인해보세요. 아직 아무것도 수정하지 않았답니다!", + "description": "Label for the button to apply all detected updates" + }, + "checkForUpdate": { + "message": "업데이트 확인", + "description": "Label for the button to check a single style for an update" + }, + "checkingForUpdate": { + "message": "확인 중...", + "description": "Text to display when checking a style for an update" + }, + "clickToUninstall": { + "message": "클릭하여 제거", + "description": "Label for the overlay on a style thumbnail when installed via inline search in the popup" + }, + "cm_autoCloseBrackets": { + "message": "괄호 및 따옴표 자동으로 닫기", + "description": "Label for the checkbox in the style editor." + }, + "cm_autoCloseBracketsTooltip": { + "message": "()[]''\"\"의 여는 기호를 입력할 시, 닫는 기호를 자동으로 추가합니다", + "description": "Label for the checkbox in the style editor." + }, + "cm_autocompleteOnTyping": { + "message": "타이핑 자동완성", + "description": "Label for the checkbox in the style editor." + }, + "cm_colorpicker": { + "message": "CSS 색상에 Colorpicker(색상 선택기) 표시", + "description": "Label for the checkbox controlling colorpicker option for the style editor." + }, + "cm_indentWithTabs": { + "message": "자동 들여쓰기 시 탭 사용", + "description": "Label for the checkbox controlling tabs with smart indentation option for the style editor." + }, + "cm_keyMap": { + "message": "키 매핑", + "description": "Label for the drop-down list controlling the keymap for the style editor." + }, + "cm_lineWrapping": { + "message": "자동 줄바끔", + "description": "Label for the checkbox controlling word wrap option for the style editor." + }, + "cm_matchHighlight": { + "message": "하이라이트", + "description": "Label for the drop-down list controlling the automatic highlighting of current word/selection occurrences in the style editor." + }, + "cm_matchHighlightSelection": { + "message": "선택된 것만", + "description": "Style editor's 'highglight' drop-down list option: highlight the occurrences of currently selected text" + }, + "cm_matchHighlightToken": { + "message": "커서 위치의 토큰", + "description": "Style editor's 'highglight' drop-down list option: highlight the occurrences of the word/token under cursor even if nothing is selected" + }, + "cm_resizeGripHint": { + "message": "더블 클릭으로 높이 최대화/이전 높이로 복구할 수 있습니다", + "description": "Tooltip for the resize grip in style editor" + }, + "cm_selectByTokens": { + "message": "더블 클릭으로 토큰 선택", + "description": "Label for the checkbox in the editor." + }, + "cm_selectByTokensTooltip": { + "message": "토큰 예시: .foo-bar-2 #aabbcc 0.32 !important\n비활성화 시: 문장 부호로 구분된 단어 선택", + "description": "" + }, + "cm_smartIndent": { + "message": "자동 들여쓰기", + "description": "Label for the checkbox controlling smart indentation option for the style editor." + }, + "cm_tabSize": { + "message": "탭 크기", + "description": "Label for the text box controlling tab size option for the style editor." + }, + "cm_theme": { + "message": "테마", + "description": "Label for the style editor's CSS theme." + }, + "colorpickerSwitchFormatTooltip": { + "message": "16 진수-> RGB -> HSL 순서로 형식을 변환합니다.\nShift+클릭을 이용해 역순으로 변환할 수 있습니다.\nPgUp(PageUp), PgDn(PageDown) 키도 사용 가능합니다.", + "description": "Tooltip for the switch button in the color picker popup in the style editor." + }, + "colorpickerTooltip": { + "message": "색상 선택기 열기", + "description": "Tooltip for the colored squares shown before CSS colors in the style editor." + }, + "configOnChange": { + "message": "변경 시", + "description": "VERY SHORT label for the checkbox in style config dialog after the save button - when enabled the changes in the dialog are saved and applied automatically without the need to press the Save button" + }, + "configOnChangeTooltip": { + "message": "자동으로 변경 사항 저장 및 적용", + "description": "" + }, + "configureStyle": { + "message": "설정", + "description": "Label for the button to configure usercss userstyle" + }, + "configureStyleOnHomepage": { + "message": "홈페이지에서 설정", + "description": "Label for the button to configure userstyles.org userstyle" + }, + "confirmCancel": { + "message": "취소", + "description": "" + }, + "confirmClose": { + "message": "닫기", + "description": "'Close' button in a confirm dialog" + }, + "confirmDefault": { + "message": "기본값 사용", + "description": "'Set to default' button in a confirm dialog" + }, + "confirmDelete": { + "message": "삭제", + "description": "" + }, + "confirmDiscardChanges": { + "message": "변경 사항을 무시하시겠습니까?", + "description": "Generic label or title displayed when trying to close something (not a style) with unsaved changes" + }, + "confirmNo": { + "message": "아니오", + "description": "'No' button in a confirm dialog" + }, + "confirmOK": { + "message": "확인", + "description": "" + }, + "confirmSave": { + "message": "저장", + "description": "'Save' button in a confirm dialog" + }, + "confirmStop": { + "message": "중지", + "description": "'Stop' button in a confirm dialog" + }, + "confirmYes": { + "message": "예", + "description": "'Yes' button in a confirm dialog" + }, + "copied": { + "message": "클립보드에 복사됨", + "description": "Message shown when content has been copied to the clipboard" + }, + "copy": { + "message": "클립보드에 복사", + "description": "Tooltip for elements which can be copied" + }, + "dateInstalled": { + "message": "설치된 날짜", + "description": "Option text for the user to sort the style by install date" + }, + "dateUpdated": { + "message": "변경된 날짜", + "description": "Option text for the user to sort the style by last update date" + }, + "dbError": { + "message": "Stylus 데이터베이스를 사용하던 중 오류가 발생했습니다. 해결 방법 안내 웹페이지를 여시겠습니까?", + "description": "Prompt when a DB error is encountered" + }, + "defaultTheme": { + "message": "기본", + "description": "Default CodeMirror CSS theme option on the edit style page" + }, + "deleteStyleConfirm": { + "message": "이 스타일을 정말 삭제하시겠습니까?", + "description": "Confirmation before deleting a style" + }, + "deleteStyleLabel": { + "message": "삭제", + "description": "Label for the button to delete a style" + }, + "description": { + "message": "Stylus로 웹페이지를 새롭게 디자인해보세요. 유명한 사이트의 테마, 스킨도 간단하게 설치할 수 있는 사용자 스타일 관리자입니다.", + "description": "Extension description" + }, + "disableAllStyles": { + "message": "모든 스타일 비활성화", + "description": "Label for the checkbox that turns all enabled styles off." + }, + "disableStyleLabel": { + "message": "비활성화", + "description": "Label for the button to disable a style" + }, + "dragDropMessage": { + "message": "이 페이지 아무 곳에나 백업 파일을 놓으세요.", + "description": "Drag'n'drop message" + }, + "dragDropUsercssTabstrip": { + "message": "파일을 설치하려면, 파일을 탭 표시줄(탭 제목이 표시되는 영역)에 놓으세요.", + "description": "Message popup shown when erroneously dropping a usercss file into the manager page" + }, + "editDeleteText": { + "message": "삭제", + "description": "Label for the context menu item in the editor to delete selected text" + }, + "editGotoLine": { + "message": "줄 이동", + "description": "Go to line or line:column on Ctrl-G in style code editor" + }, + "editStyleHeading": { + "message": "스타일 수정", + "description": "Title of the page for editing styles" + }, + "editStyleLabel": { + "message": "수정", + "description": "Label for the button to go to the edit style page" + }, + "editStyleTitle": { + "message": " $stylename$ 스타일 수정", + "description": "Title of the page for editing styles", + "placeholders": { + "stylename": { + "content": "$1" + } + } + }, + "editorStylesButton": { + "message": "편집기 스타일 찾기", + "description": "Find styles for the editor" + }, + "enableStyleLabel": { + "message": "활성화", + "description": "Label for the button to enable a style" + }, + "excludeStyleByDomainLabel": { + "message": "현재 도메인 제외", + "description": "" + }, + "excludeStyleByUrlLabel": { + "message": "현재 URL 제외", + "description": "" + }, + "exportLabel": { + "message": "내보내기", + "description": "Label for the button to export a style ('edit' page) or all styles ('manage' page)" + }, + "externalFeedback": { + "message": "피드백", + "description": "Label for the external link to send feedback for the style" + }, + "externalHomepage": { + "message": "홈페이지", + "description": "Label for the external link to style's homepage" + }, + "externalLink": { + "message": "외부 링크", + "description": "Label for external links" + }, + "externalSupport": { + "message": "지원", + "description": "Label for the external link to style's support site" + }, + "externalUsercssDocument": { + "message": "Usercss 안내 문서", + "description": "Label for the external link to usercss documentation" + }, + "filteredStyles": { + "message": "$numTotal$개 중 $numShown$개 표시", + "description": "TL note - make this message short", + "placeholders": { + "numTotal": { + "content": "$2" + }, + "numShown": { + "content": "$1" + } + } + }, + "filteredStylesAllHidden": { + "message": "현재 적용된 필터와 일치하는 스타일이 없습니다", + "description": "Text shown when no styles match currently applied filter in the style manager" + }, + "findStyles": { + "message": "스타일 찾기", + "description": "Text for a link that gets a list of styles for the current site" + }, + "findStylesForSite": { + "message": "현재 사이트에 맞는 스타일 찾기", + "description": "Text for a link that gets a list of styles for the current site" + }, + "findStylesInline": { + "message": "팝업창 내에서", + "description": "Text for a checkbox that opens search results 'inline' (within the Stylus popup window)" + }, + "findStylesInlineTooltip": { + "message": "이 창에서 검색 결과 표시", + "description": "Text for a checkbox that displays search results within the Stylus popup." + }, + "genericAdd": { + "message": "추가", + "description": "Used in various places for an action that adds something" + }, + "genericClone": { + "message": "복제", + "description": "Used in various places for an action that clones something" + }, + "genericDisabledLabel": { + "message": "비활성화됨", + "description": "Used in various lists/options to indicate that something is disabled" + }, + "genericEnabledLabel": { + "message": "활성화됨", + "description": "Used in various lists/options to indicate that something is enabled" + }, + "genericError": { + "message": "에러", + "description": "Used in various places to indicate some error occurred." + }, + "genericHistoryLabel": { + "message": "기록", + "description": "Used in various places to show a history log of something" + }, + "genericNext": { + "message": "다음", + "description": "Used in various places to select/perform the next step/action" + }, + "genericPrevious": { + "message": "이전", + "description": "Used in various places to select/perform the previous step/action" + }, + "genericResetLabel": { + "message": "초기화", + "description": "Used in various parts of UI to indicate that something may be reset to its original state" + }, + "genericSavedMessage": { + "message": "저장됨", + "description": "Used in various parts of the UI to indicate that something was saved" + }, + "genericTitle": { + "message": "제목", + "description": "Used in various parts of the UI to indicate the title of something" + }, + "genericUnknown": { + "message": "알 수 없음", + "description": "Used in various parts of the UI to indicate if something is unknown (e.g. an unknown date)" + }, + "helpAlt": { + "message": "도움말", + "description": "Alternate text for help buttons" + }, + "helpKeyMapCommand": { + "message": "명령어를 입력하세요", + "description": "Placeholder text of inputbox in keymap help popup on the edit style page. Must be very short" + }, + "helpKeyMapHotkey": { + "message": "단축키를 입력하세요", + "description": "Placeholder text of inputbox in keymap help popup on the edit style page. Must be very short" + }, + "hostDisabled": { + "message": "이 호스트는 현재 사용 중인 브라우저 버전의 버그로 인해 비활성화되었습니다", + "description": "Tooltip for cloud host disabled" + }, + "importAppendLabel": { + "message": "스타일에 추가", + "description": "Label for the button to import a style and append to the existing sections" + }, + "importAppendTooltip": { + "message": "가져온 스타일을 현재 스타일에 추가", + "description": "Tooltip for the button to import a style and append to the existing sections" + }, + "importLabel": { + "message": "가져오기", + "description": "Label for the button to import a style ('edit' page) or all styles ('manage' page)" + }, + "importReplaceLabel": { + "message": "스타일 덮어쓰기", + "description": "Label for the button to import and overwrite current style" + }, + "importReplaceTooltip": { + "message": "현재 스타일을 버리고, 가져온 스타일로 덮어씁니다.", + "description": "Label for the button to import and overwrite current style" + }, + "importReportLegendAdded": { + "message": "추가됨", + "description": "Text after the number of styles added in the report shown after importing styles" + }, + "importReportLegendIdentical": { + "message": "중복 생략됨", + "description": "Text after the number of styles skipped due to being identical to the already installed ones in the report shown after importing styles" + }, + "importReportLegendInvalid": { + "message": "유효하지 않아 생략됨", + "description": "Text after the number of styles skipped due to being invalid (not a Stylus/Stylish backup file probably) in the report shown after importing styles" + }, + "importReportLegendUpdatedBoth": { + "message": "메타데이터, 코드 모두 업데이트됨", + "description": "Text after the number of styles updated entirely in the report shown after importing styles" + }, + "importReportLegendUpdatedCode": { + "message": "코드가 업데이트됨", + "description": "Text after the number of styles with updated code (meta info is unchanged) in the report shown after importing styles" + }, + "importReportLegendUpdatedMeta": { + "message": "메타데이터 업데이트됨", + "description": "Text after the number of styles with updated meta info like name/url in the report shown after importing styles" + }, + "importReportTitle": { + "message": "스타일 가져오기 완료", + "description": "Title of the report shown after importing styles" + }, + "importReportUnchanged": { + "message": "변경사항 없음", + "description": "Message in the report shown after importing styles" + }, + "importReportUndone": { + "message": "스타일 되돌려짐", + "description": "Text after the number of styles reverted in the message box shown after undoing the import of styles" + }, + "importReportUndoneTitle": { + "message": "가져오기가 취소되었습니다.", + "description": "Title of the message box shown after undoing the import of styles" + }, + "installButton": { + "message": "스타일 설치", + "description": "Label for install button" + }, + "installButtonInstalled": { + "message": "스타일 설치됨", + "description": "Text displayed when the style is successfully installed" + }, + "installButtonReinstall": { + "message": "스타일 재설치", + "description": "Label for reinstall button" + }, + "installButtonUpdate": { + "message": "스타일 업데이트", + "description": "Label for update button" + }, + "installUpdate": { + "message": "업데이트 설치", + "description": "Label for the button to install an update for a single style" + }, + "installUpdateFrom": { + "message": "현재 스타일은 $url$에서 업데이트되었습니다", + "description": "Label to describe where the style gets update", + "placeholders": { + "url": { + "content": "$1" + } + } + }, + "installUpdateFromLabel": { + "message": "업데이트 확인", + "description": "Label for the checkbox to save current URL for update check" + }, + "license": { + "message": "라이센스", + "description": "Label for the license" + }, + "linkGetHelp": { + "message": "도움말", + "description": "Homepage link text on the manage page e.g. https://add0n.com/stylus.html#features with chat/FAQ/intro/info" + }, + "linkGetStyles": { + "message": "스타일 찾기", + "description": "Help link text on the manage page e.g. https://userstyles.org" + }, + "linkStylusWiki": { + "message": "위키", + "description": "Wiki link text on the manage page e.g. https://github.com/openstyles/stylus/wiki" + }, + "linkTranslate": { + "message": "번역", + "description": "Transifex link text on the manage page" + }, + "linterCSSLintIncompatible": { + "message": "CSSLint는 $preprocessorname$ 전처리기를 지원하지 않습니다.", + "description": "The label to display when the preprocessor isn't compatible with CSSLint", + "placeholders": { + "preprocessorname": { + "content": "$1" + } + } + }, + "linterCSSLintSettings": { + "message": "(규칙 설정: 0 = 비활성화, 1 = 경고(warning), 2 = 에러)", + "description": "CSSLint rule config values" + }, + "linterConfigPopupTitle": { + "message": "$linter$ 규칙 설정", + "description": "Stylelint or CSSLint popup header", + "placeholders": { + "linter": { + "content": "$1" + } + } + }, + "linterConfigTooltip": { + "message": "현재 Linter를 설정하려면 클릭하세요", + "description": "Icon tooltip to indicate that it opens a popup with the selected linter configuration" + }, + "linterInvalidConfigError": { + "message": "유효하지 않은 설정으로 인해 저장할 수 없음:", + "description": "Invalid linter config will show a message followed by a list of invalid entries" + }, + "linterIssues": { + "message": "문제점", + "description": "Label for the CSS linter issues block on the style edit page" + }, + "linterIssuesHelp": { + "message": "이 문제점은 $link$에 의해 발견됨:", + "description": "Help popup message for the selected CSS linter issues block on the style edit page", + "placeholders": { + "link": { + "content": "$1" + } + } + }, + "linterJSONError": { + "message": "유효하지 않은 JSON 형식입니다", + "description": "Setting linter config with invalid JSON" + }, + "linterResetMessage": { + "message": "실수로 초기화한 경우, 텍스트 박스 내에서 Ctrl+Z (혹은 Cmd+Z)를 눌러 취소할 수 있습니다", + "description": "Reset button tooltip to inform user on how to undo an accidental reset" + }, + "linterRulesLink": { + "message": "전체 규칙 목록 보기", + "description": "Stylelint or CSSLint rules label added immediately before a link" + }, + "liveReloadError": { + "message": "파일을 주시하는 동안 오류가 발생함", + "description": "The label of live-reload error" + }, + "liveReloadInstallHint": { + "message": "외부 요인으로 인한 변경 시 스타일을 자동으로 업데이트하려면 이 탭을 열어두세요.", + "description": "The label of live-reload feature" + }, + "liveReloadInstallHintFF": { + "message": "외부 요인으로 인한 변경 시 스타일을 자동으로 업데이트하려면 이 탭과 원래 탭을 모두 열어두세요.", + "description": "The extra hint of live-reload feature shown only for file:// URLs in Firefox" + }, + "liveReloadLabel": { + "message": "실시간 리로드", + "description": "The label of live-reload feature" + }, + "manageFavicons": { + "message": "적용 대상 열에 Favicon(사이트 아이콘) 표시", + "description": "Label for the checkbox that toggles applies-to favicons in the new UI on manage page" + }, + "manageFaviconsGray": { + "message": "회색으로 표시", + "description": "Label for the checkbox that toggles grayed out mode of applies-to favicons in the new UI on manage page" + }, + "manageFaviconsHelp": { + "message": "Stylus는 https://www.google.com/s2/favicons 외부 서비스를 이용합니다", + "description": "Label for the checkbox that toggles applies-to favicons in the new UI on manage page" + }, + "manageFilters": { + "message": "필터", + "description": "Label for filters container" + }, + "manageHeading": { + "message": "설치한 스타일 목록", + "description": "Heading for the manage page" + }, + "manageMaxTargets": { + "message": "적용 대상 항목 수", + "description": "Label for the numeric input box to limit max number of applies-to targets in the new UI on manage page" + }, + "manageNewStyleAsUsercss": { + "message": "Usercss로 작성", + "description": "VERY SHORT label for the checkbox next to the 'Write new style' button in the style manager" + }, + "manageNewUI": { + "message": "새로운 관리 페이지 UI 레이아웃", + "description": "Label for the checkbox that toggles the new UI on manage page" + }, + "manageOnlyDisabled": { + "message": "비활성화된 스타일만", + "description": "Checkbox to show only disabled styles" + }, + "manageOnlyEnabled": { + "message": "활성화된 스타일만", + "description": "Checkbox to show only enabled styles" + }, + "manageOnlyExternal": { + "message": "외부에서 설치한 스타일만", + "description": "Checkbox to show only externally installed styles i.e. updatable" + }, + "manageOnlyLocal": { + "message": "로컬에서 생성한 스타일만", + "description": "Checkbox to show only locally created styles i.e. non-updatable" + }, + "manageOnlyLocalTooltip": { + "message": "(userstyles.org 페이지에서 설치하지 않은 스타일)", + "description": "Tooltip for the checkbox to show only locally created styles i.e. non-updatable" + }, + "manageOnlyNonUsercss": { + "message": "Usercss가 아닌 스타일만", + "description": "Checkbox to show only non-Usercss (standard) styles" + }, + "manageOnlyUpdates": { + "message": "업데이트 혹은 문제점이 있는 것만", + "description": "Checkbox to show only styles that have updates after check-all-styles-for-updates was performed" + }, + "manageOnlyUsercss": { + "message": "Usercss 스타일만", + "description": "Checkbox to show only Usercss styles" + }, + "menuShowBadge": { + "message": "활성화된 스타일 개수 표시", + "description": "Label (must be very short) for the checkbox in the toolbar button context menu controlling toolbar badge text." + }, + "meta_invalidCheckboxDefault": { + "message": "@var 체크박스가 유효하지 않습니다. 값은 0, 1중 하나여야 합니다.", + "description": "Error displayed when the value of @var checkbox is invalid" + }, + "meta_invalidColor": { + "message": "@var 색상이 유효하지 않습니다. $color$은(는) 색상이 아닙니다.", + "description": "Error displayed when the value of @var color is invalid", + "placeholders": { + "color": { + "content": "$1" + } + } + }, + "meta_invalidRange": { + "message": "@var $type$이(가) 유효하지 않습니다. 값은 숫자나 배열이어야 합니다.", + "description": "Error displayed when the value of @var range or @var number is invalid", + "placeholders": { + "type": { + "content": "$1" + } + } + }, + "meta_invalidRangeMultipleUnits": { + "message": "@var $type$이(가) 유효하지 않습니다. 구성단위가 여러 개 정의되었습니다.", + "description": "Error displayed when the value of @var range or @var number is invalid", + "placeholders": { + "type": { + "content": "$1" + } + } + }, + "meta_invalidRangeTooManyValues": { + "message": "@var $type$이(가) 유효하지 않습니다. 배열의 요소가 너무 많습니다.", + "description": "Error displayed when the value of @var range or @var number is invalid", + "placeholders": { + "type": { + "content": "$1" + } + } + }, + "meta_invalidRangeValue": { + "message": "@var $type$이(가) 유효하지 않습니다. 배열 요소는 숫자, 문자열, null 중 하나여야 합니다.", + "description": "Error displayed when the value of @var range or @var number is invalid", + "placeholders": { + "type": { + "content": "$1" + } + } + }, + "meta_invalidRangeDefault": { + "message": "@var $type$이(가) 유효하지 않습니다. 기본 값이 null입니다.", + "description": "Error displayed when the value of @var range or @var number is invalid", + "placeholders": { + "type": { + "content": "$1" + } + } + }, + "meta_invalidRangeMin": { + "message": "@var $type$이(가) 유효하지 않습니다. 기본값이 최솟값보다 작습니다.", + "description": "Error displayed when the value of @var range or @var number is invalid", + "placeholders": { + "type": { + "content": "$1" + } + } + }, + "meta_invalidRangeMax": { + "message": "@var $type$이(가) 유효하지 않습니다. 기본값이 최댓값보다 큽니다.", + "description": "Error displayed when the value of @var range or @var number is invalid", + "placeholders": { + "type": { + "content": "$1" + } + } + }, + "meta_invalidRangeStep": { + "message": "@var $type$이(가) 유효하지 않습니다. 기본값이 단계의 변수가 아닙니다.", + "description": "Error displayed when the value of @var range or @var number is invalid", + "placeholders": { + "type": { + "content": "$1" + } + } + }, + "meta_invalidRangeUnits": { + "message": "@var $type$이(가) 유효하지 않습니다. '$units$'은(는) 유효한 구성단위가 아닙니다.", + "description": "Error displayed when the value of @var range or @var number is invalid", + "placeholders": { + "type": { + "content": "$1" + }, + "units": { + "content": "$2" + } + } + }, + "meta_invalidSelect": { + "message": "유효하지 않은 @var 선택입니다. 기본 값은 배열이나 오브젝트여야 합니다.", + "description": "Error displayed when the value of @var select is invalid" + }, + "meta_invalidSelectValue": { + "message": "유효하지 않은 @var 선택입니다. 배열, 오브젝트 내 값은 문자열이어야 합니다.", + "description": "Error displayed when the value of @var select is invalid" + }, + "meta_invalidSelectEmptyOptions": { + "message": "유효하지 않은 @var 선택입니다. 옵션 목록이 비었습니다.", + "description": "Error displayed when the value of @var select is invalid" + }, + "meta_invalidSelectLabel": { + "message": "유효하지 않은 @var 선택입니다. 옵션 라벨이 비었습니다.", + "description": "Error displayed when the value of @var select is invalid" + }, + "meta_invalidSelectMultipleDefaults": { + "message": "유효하지 않은 @var 선택입니다. 기본 옵션이 여러 번 정의되었습니다.", + "description": "Error displayed when the value of @var select is invalid" + }, + "meta_invalidSelectNameDuplicated": { + "message": "유효하지 않은 @var 선택입니다. 옵션명이 중복되었습니다.", + "description": "Error displayed when the value of @var select is invalid" + }, + "meta_invalidSelectValueMismatch": { + "message": "유효하지 않은 @var 선택입니다. 옵션 목록에 값이 존재하지 않습니다.", + "description": "Error displayed when the value of @var select is invalid" + }, + "meta_invalidURLProtocol": { + "message": "$protocol$은(는) 유효하지 않은 URL 프로토콜입니다. http, https만 허용됩니다.", + "description": "Error displayed when the protocol of the URL is invalid", + "placeholders": { + "protocol": { + "content": "$1" + } + } + }, + "meta_invalidVersion": { + "message": "유효하지 않은 버전 숫자입니다. $version$은(는) 유의적 버전 패턴과 일치하지 않습니다.", + "description": "Error displayed when @version is invalid", + "placeholders": { + "version": { + "content": "$1" + } + } + }, + "meta_invalidNumber": { + "message": "숫자를 입력하세요", + "description": "Error displayed when the value is expected to be a number" + }, + "meta_invalidString": { + "message": "따옴표로 묶인 문자열을 입력하세요", + "description": "Error displayed when the value is expected to be a quoted string" + }, + "meta_invalidWord": { + "message": "단어를 입력하세요", + "description": "Error displayed when the value is expected to be a word" + }, + "meta_missingChar": { + "message": "$chars$ 문자를 입력하세요", + "description": "Error displayed when the value is expected to be some characters", + "placeholders": { + "chars": { + "content": "$1" + } + } + }, + "meta_missingEOT": { + "message": "EOT 데이터를 입력하세요", + "description": "Error displayed when the value is expected to be an EOT list" + }, + "meta_missingMandatory": { + "message": "필수 메타 데이터인 $keys$이(가) 누락되었습니다", + "description": "Error displayed when mandatory keys are missing", + "placeholders": { + "keys": { + "content": "$1" + } + } + }, + "meta_unknownJSONLiteral": { + "message": "유효하지 않은 JSON입니다. $literal$은(는) 유효한 JSON 리터럴이 아닙니다.", + "description": "Error displayed when JSON value is invalid", + "placeholders": { + "literal": { + "content": "$1" + } + } + }, + "meta_unknownMeta": { + "message": "알 수 없는 메타데이터 $key$", + "description": "Error displayed when unknown metadata is parsed", + "placeholders": { + "key": { + "content": "$1" + } + } + }, + "meta_unknownVarType": { + "message": "알 수 없는 @$varkey$ 타입: $vartype$", + "description": "Error displayed when unknown variable type is parsed", + "placeholders": { + "varkey": { + "content": "$1" + }, + "vartype": { + "content": "$2" + } + } + }, + "meta_unknownPreprocessor": { + "message": "알 수 없는 @preprocessor $preprocessor$", + "description": "Error displayed when unknown @preprocessor is parsed", + "placeholders": { + "preprocessor": { + "content": "$1" + } + } + }, + "noStylesForSite": { + "message": "현재 사이트에 설치한 스타일이 없습니다.", + "description": "Text displayed when no styles are installed for the current site" + }, + "openManage": { + "message": "관리", + "description": "Link to open the manage page." + }, + "openOptions": { + "message": "옵션", + "description": "Go to Options UI" + }, + "openStylesManager": { + "message": "스타일 관리자 열기", + "description": "Label for the style maanger opener in the browser action context menu." + }, + "optionsActions": { + "message": "동작", + "description": "" + }, + "optionsAdvanced": { + "message": "고급", + "description": "" + }, + "optionsAdvancedContextDelete": { + "message": "편집기 컨텍스트 메뉴에 '삭제' 추가", + "description": "" + }, + "optionsAdvancedExposeIframes": { + "message": "iframe을 HTML[stylus-iframe]으로 노출", + "description": "" + }, + "optionsAdvancedExposeIframesNote": { + "message": "최상위 사이트 도메인을 각 iframe에 노출합니다.\n다음과 같이 iframe용 CSS를 작성할 수 있습니다:\nhtml[stylus-iframe$$=\"twitter.com\"] h1 { display:none }", + "description": "Add attribute to iframe; make sure to include the double $$ in the css example, or the `$=` will be omitted in the displayed text." + }, + "optionsAdvancedNewStyleAsUsercss": { + "message": "새로운 스타일을 Usercss로 작성", + "description": "" + }, + "optionsBadgeDisabled": { + "message": "비활성화 시의 배경 색", + "description": "" + }, + "optionsBadgeNormal": { + "message": "배경 색", + "description": "" + }, + "optionsCheck": { + "message": "스타일 업데이트", + "description": "" + }, + "optionsCheckUpdate": { + "message": "사용 가능한 모든 업데이트 확인 및 설치", + "description": "" + }, + "optionsCustomizeBadge": { + "message": "툴바 아이콘 뱃지", + "description": "" + }, + "optionsCustomizeIcon": { + "message": "툴바 아이콘", + "description": "" + }, + "optionsCustomizePopup": { + "message": "팝업", + "description": "" + }, + "optionsCustomizeUpdate": { + "message": "업데이트", + "description": "" + }, + "optionsCustomizeSync": { + "message": "클라우드에 동기화", + "description": "" + }, + "optionsHeading": { + "message": "옵션", + "description": "Heading for options section on manage page." + }, + "optionsIconDark": { + "message": "어두운 브라우저 테마", + "description": "" + }, + "optionsIconLight": { + "message": "밝은 브라우저 테마", + "description": "" + }, + "optionsOpen": { + "message": "열기", + "description": "" + }, + "optionsOpenManager": { + "message": "스타일 관리", + "description": "" + }, + "optionsPopupWidth": { + "message": "팝업 너비 (픽셀 단위)", + "description": "" + }, + "optionsReset": { + "message": "기본 값으로 설정 초기화", + "description": "" + }, + "optionsResetButton": { + "message": "설정 초기화", + "description": "" + }, + "optionsSubheading": { + "message": "추가 옵션", + "description": "Subheading for options section on manage page." + }, + "optionsUpdateImportNote": { + "message": "Stylish나 구버전 스타일 백업을 가져왔을 경우, 스타일들을 최신 버전으로 유지하려면 스타일 매니저에서 한 번씩 수동으로 업데이트 검사를 진행해 주세요.", + "description": "" + }, + "optionsUpdateInterval": { + "message": "Userstyle 자동 업데이트 간격 (시간 단위, 0일시 업데이트하지 않음)", + "description": "" + }, + "optionsSyncNone": { + "message": "없음", + "description": "" + }, + "optionsSyncConnect": { + "message": "연결", + "description": "" + }, + "optionsSyncDisconnect": { + "message": "연결 끊기", + "description": "" + }, + "optionsSyncSyncNow": { + "message": "지금 동기화", + "description": "" + }, + "optionsSyncLogin": { + "message": "로그인", + "description": "" + }, + "optionsSyncStatusPull": { + "message": "스타일 다운로드 중 ($loaded$/$total$)", + "description": "", + "placeholders": { + "loaded": { + "content": "$1" + }, + "total": { + "content": "$2" + } + } + }, + "optionsSyncStatusPush": { + "message": "스타일 업로드 중 ($loaded$/$total$)", + "description": "", + "placeholders": { + "loaded": { + "content": "$1" + }, + "total": { + "content": "$2" + } + } + }, + "optionsSyncStatusSyncing": { + "message": "동기화 중...", + "description": "" + }, + "optionsSyncStatusConnecting": { + "message": "연결 중...", + "description": "" + }, + "optionsSyncStatusConnected": { + "message": "연결됨", + "description": "" + }, + "optionsSyncStatusDisconnecting": { + "message": "연결 끊는 중...", + "description": "" + }, + "optionsSyncStatusDisconnected": { + "message": "연결 끊김", + "description": "" + }, + "paginationCurrent": { + "message": "현재 페이지", + "description": "Tooltip for the current page index in search results" + }, + "paginationEstimated": { + "message": "예상 페이지 수", + "description": "Tooltip for the total page count in search results" + }, + "paginationNext": { + "message": "다음 페이지", + "description": "Tooltip for the '->' (next page) button in search results" + }, + "paginationPrevious": { + "message": "이전 페이지", + "description": "Tooltip for the '<-' button in search results" + }, + "paginationTotal": { + "message": "총 페이지 수", + "description": "" + }, + "parseUsercssError": { + "message": "Stylus가 Usercss 데이터를 해석하는데 실패했습니다:", + "description": "The error message to show when stylus failed to parse usercss" + }, + "popupAutoResort": { + "message": "팝업 내에서 스타일 토글 시 재정렬", + "description": "Label for the checkbox controlling popup resorting." + }, + "popupBorders": { + "message": "양옆에 흰색 테두리 추가", + "description": "" + }, + "popupBordersTooltip": { + "message": "측면 테두리를 칠하지 않으므로 새로운 Chrome의 다크 테마에서 유용합니다", + "description": "" + }, + "popupHotkeysInfo": { + "message": "<1>-<9>,<0> (숫자패드 포함) - N번째 스타일 토글 (0은 10)\n- 해당 글자로 시작하는 첫 번째 스타일 토글\n 토글 대신 편집기 열기\n 나열된 스타일 활성화\n 나열된 스타일 비활성화\n, <`> (백틱) - 처음에 활성화한 스타일을 토글합니다. 팝업이 열려 있는 동안에는 나중에 활성화한 스타일에 적용되지 않습니다. 따라서 검사 후 초기 선택 항목을 복원할 수 있습니다. 간단하게, 모두 비활성화한 다음 로 다시 전환하세요.\n자세한 내용은 위키를 참고 바랍니다", + "description": "NOTE1: preserve < and > symbols so that is styled as a key.\nNOTE2: the last line is displayed as a text of the link to the wiki page.\nNOTE3: this is the list of hotkeys displayed after clicking the right edge of the extension popup." + }, + "popupHotkeysTooltip": { + "message": "사용 가능한 단축키를 확인하려면 클릭하세요", + "description": "Tooltip displayed when hovering the right edge of the extension popup" + }, + "popupManageTooltip": { + "message": "Shift+클릭이나 우클릭으로 스타일 관리자를 열면 현재 사이트에 적용 가능한 스타일들이 표시됩니다.", + "description": "Tooltip for the 'Manage' button in the popup." + }, + "popupMenuButtonTooltip": { + "message": "상호작용 메뉴", + "description": "Tooltip for menu button in popup." + }, + "popupOpenEditInWindow": { + "message": "새 창에서 편집기 열기", + "description": "Label for the checkbox controlling 'edit' action behavior in the popup." + }, + "popupOpenEditInWindowTooltip": { + "message": "이 옵션은 편집기가 열린 탭을 브라우저 창에서 분리함으로써 활성화할 수도 있습니다.\n편집기 탭만 다른 브라우저 창으로 합치면 비활성화됩니다.", + "description": "Label for the checkbox controlling 'edit' action behavior in the popup." + }, + "popupStylesFirst": { + "message": "스타일 목록을 커맨드 버튼 상단에 표시", + "description": "Label for the checkbox controlling section order in the popup." + }, + "prefShowBadge": { + "message": "현재 사이트에서 활성화된 스타일 개수", + "description": "Label for the checkbox controlling toolbar badge text." + }, + "previewLabel": { + "message": "실시간 미리보기", + "description": "Label for the checkbox in style editor to enable live preview while editing." + }, + "previewTooltip": { + "message": "변경 사항은 저장되지 않고 일시적으로 적용됩니다.\n영구적으로 변경하려면 스타일을 저장하세요.", + "description": "Tooltip for the checkbox in style editor to enable live preview while editing." + }, + "reload": { + "message": "Stylus 확장 프로그램 리로드", + "description": "Context menu reload" + }, + "replace": { + "message": "바꾸기", + "description": "Label before the replace input field in the editor shown on Ctrl-H" + }, + "replaceAll": { + "message": "모두 바꾸기", + "description": "Label before the replace input field in the editor shown on 'replaceAll' hotkey" + }, + "replaceWith": { + "message": "바꿀 내용", + "description": "Label before the replace-with input field in the editor shown on Ctrl-H etc." + }, + "retrieveBckp": { + "message": "스타일 가져오기", + "description": "" + }, + "search": { + "message": "검색", + "description": "Label before the search input field in the editor shown on Ctrl-F" + }, + "searchCaseSensitive": { + "message": "대소문자 구분", + "description": "Tooltip for the 'Aa' icon that enables case-sensitive search in the editor shown on Ctrl-F" + }, + "searchNumberOfResults": { + "message": "일치하는 개수", + "description": "Tooltip for the number of found search results in the editor shown on Ctrl-F" + }, + "searchNumberOfResults2": { + "message": "코드 및 적용 대상 값 내에서 일치하는 개수", + "description": "Tooltip for the number of found search results in the editor shown on Ctrl-F" + }, + "searchRegexp": { + "message": "정규 표현식 검색은 /re/ 문법을 사용합니다", + "description": "Label after the search input field in the editor shown on Ctrl-F" + }, + "searchResultInstallCount": { + "message": "총 설치 수", + "description": "Text for label that shows the number of times a search result was installed" + }, + "searchResultNoneFound": { + "message": "이 사이트에 맞는 스타일을 찾지 못했습니다.", + "description": "Error text in the popup when inline search didn't find any site-specific styles" + }, + "searchResultRating": { + "message": "평가", + "description": "Text for label that shows the search result's rating" + }, + "searchResultUpdated": { + "message": "업데이트됨", + "description": "Text for label that shows the search result's last update date" + }, + "searchResultWeeklyCount": { + "message": "주간 설치 수", + "description": "Text for label that shows the number of times a search result was installed during last week" + }, + "searchStyles": { + "message": "검색 내용", + "description": "Label for the search filter textbox on the Manage styles page" + }, + "searchStylesHelp": { + "message": " 키를 누르면 검색 상자로 포커스가 이동합니다.\n일반 텍스트: 이름, 코드, 홈페이지 및 적용 대상 URL을 대상으로 검색합니다. 3 글자 미만의 단어는 무시됩니다.\n전체 URL에 일치하는 스타일: 접두사를 붙여서 검색하세요. 예시: \n정규 표현식: 슬래시 및 플래그를 포함하세요. 예시: \n단어와 정확히 일치: 쿼리를 큰따옴표로 묶으세요. 예시: <\".header ~ div\">", + "description": "Text in the minihelp displayed when clicking (i) icon to the right of the search input field on the Manage styles page" + }, + "sectionAdd": { + "message": "섹션 추가", + "description": "Label for the button to add a section" + }, + "sectionCode": { + "message": "코드", + "description": "Label for the code for a section" + }, + "sectionRemove": { + "message": "섹션 제거", + "description": "Label for the button to remove a section" + }, + "sectionRestore": { + "message": "제거된 섹션 복구", + "description": "Label for the button to restore a removed section" + }, + "shortcuts": { + "message": "단축키", + "description": "Go to shortcut configuration" + }, + "shortcutsNote": { + "message": "키보드 단축키 정의", + "description": "" + }, + "sortDateNewestFirst": { + "message": "최신 순으로", + "description": "Text added to indicate that sorting a date would add the newest entries at the top" + }, + "sortDateOldestFirst": { + "message": "오래된 순으로", + "description": "Text added to indicate that sorting a date would add the oldest entries at the top" + }, + "sortLabel": { + "message": "설치한 스타일들을 어떻게 정렬할지 선택합니다", + "description": "Title on the sort select to indicate it is used for sorting entries" + }, + "sortLabelTitleAsc": { + "message": "제목 오름차순", + "description": "Text added to option group to indicate a block of options that apply a title ascending (A to Z) sort" + }, + "sortLabelTitleDesc": { + "message": "제목 내림차순", + "description": "Text added to option group to indicate a block of options that apply a title descending (Z to A) sort" + }, + "sortStylesHelp": { + "message": "설치한 스타일들을 정렬할 방식을 드롭 다운 목록에서 선택합니다. 기본 설정은 각 제목을 오름차순(A to Z)으로 정렬하고, \"제목 내림차순\" 을 선택 시 내림차순(Z to A)으로 정렬합니다.\n여러 기준에 따라 항목을 정렬할 수 있는 다른 사전 설정도 있습니다. 여러 개의 열이 있는 테이블을 정렬하고, 각 선택 옵션 내의 카테고리들이(+ 기호 사이) 열 또는 그룹을 나타낸다고 생각해보세요.\n예를 들어, 설정이 \"활성화됨 (first) + 제목\"인 경우, 모든 활성화된 항목이 목록의 맨 위에 정렬되도록 정렬된 후, Entry 제목 오름차순 정렬(A to Z)이 활성화된 항목과 비활성화된 항목 모두에 별도로 적용됩니다.", + "description": "Text in the minihelp displayed when clicking (i) icon to the right of the sort input field on the Manage styles page" + }, + "sortStylesHelpTitle": { + "message": "내용 정렬", + "description": "Label for the sort info popup on the Manage styles page" + }, + "styleBadRegexp": { + "message": "유효하지 않은 정규 표현식입니다.", + "description": "Validation message for a bad regexp in a style" + }, + "styleBeautifyIndentConditional": { + "message": "@media, @supports 들여쓰기", + "description": "CSS-beautifier option" + }, + "styleBeautifyPreserveNewlines": { + "message": "개행 문자 유지", + "description": "CSS-beautifier option" + }, + "styleCancelEditLabel": { + "message": "관리 페이지로 돌아가기", + "description": "Label for cancel button for style editing" + }, + "styleChangesNotSaved": { + "message": "스타일의 변경 사항을 저장하지 않았습니다.", + "description": "Text for the prompt when changes are made to a style and the user tries to leave without saving" + }, + "styleEnabledLabel": { + "message": "활성화됨", + "description": "Label for the enabled state of styles" + }, + "styleFromMozillaFormatError": { + "message": "Mozilla 형식 데이터를 가져오는데 실패했습니다", + "description": "Label for the import error" + }, + "styleFromMozillaFormatPrompt": { + "message": "Mozilla 형식의 코드를 붙여넣으세요", + "description": "Prompt in the dialog displayed after clicking 'Import from Mozilla format' button" + }, + "styleInstall": { + "message": "Stylus에 '$stylename$'을(를) 설치하시겠습니까?", + "description": "Confirmation when installing a style", + "placeholders": { + "stylename": { + "content": "$1" + } + } + }, + "styleInstallFailed": { + "message": "userstyle 설치에 실패했습니다.\n$error$", + "description": "Warning when installation failed", + "placeholders": { + "error": { + "content": "$1" + } + } + }, + "styleInstallOverwrite": { + "message": "'$stylename$'은(는) 이미 설치되어 있습니다. 덮어쓰시겠습니까?\n버전: $oldVersion$ -> $newVersion$", + "description": "Confirmation when re-installing a style", + "placeholders": { + "stylename": { + "content": "$1" + }, + "newVersion": { + "content": "$3" + }, + "oldVersion": { + "content": "$2" + } + } + }, + "styleMissingName": { + "message": "이름을 입력하세요", + "description": "Error displayed when user saves without providing a name" + }, + "styleMozillaFormatHeading": { + "message": "Mozilla 형식", + "description": "Heading for the section with buttons to import/export Mozilla format of the style" + }, + "styleNotAppliedRegexpProblemTooltip": { + "message": "잘못된 'regexp()'의 사용으로 인해 스타일을 적용할 수 없습니다", + "description": "Tooltip in the popup for styles that were not applied at all" + }, + "styleRegexpInvalidExplanation": { + "message": "일부 `regexp()` 규칙은 컴파일할 수 없습니다.", + "description": "" + }, + "styleRegexpPartialExplanation": { + "message": "이 스타일은 부분 일치 정규 표현식을 사용합니다. CSS4 @document 사양은 전체 URL 일치를 사용할 것을 강제하고 있으므로, 해당 CSS 섹션은 페이지에 적용되지 않았습니다. 이 스타일은 초기부터 `regexp()` 규칙을 바르게 확인하지 않는 것으로 알려진 Stylish-for-Chrome에서 생성되었을 것으로 추정됩니다.", + "description": "" + }, + "styleRegexpProblemTooltip": { + "message": "잘못된 'regexp()' 사용으로 인해 몇몇 섹션을 적용할 수 없습니다.", + "description": "Tooltip in the popup for styles that were applied only partially" + }, + "styleRegexpTestButton": { + "message": "정규 표현식 테스트", + "description": "RegExp test button label in the editor shown when applies-to list has a regexp value" + }, + "styleRegexpTestFull": { + "message": "일치하는 탭 목록", + "description": "RegExp test report: label for the fully matching expressions" + }, + "styleRegexpTestInvalid": { + "message": "유효하지 않은 정규 표현식 생략됨", + "description": "RegExp test report: label for the invalid expressions" + }, + "styleRegexpTestNone": { + "message": "일치하는 탭 없음", + "description": "RegExp test report: label for expressions that didn't match any tabs" + }, + "styleRegexpTestNote": { + "message": "참고: 정규 표현식 입력 필드에서 이스케이프 처리는 단일 \\ 를 사용하세요. CSS에서 따옴표로 묶인 문자열의 사양에 따라 스타일 코드에서 자동으로 \\\\ 로 변환됩니다. ", + "description": "RegExp test report: a note displayed at the bottom of the dialog" + }, + "styleRegexpTestPartial": { + "message": "완전히 일치하지는 않으므로 생략됨", + "description": "RegExp test report: label for the partially matching expressions" + }, + "styleRegexpTestTitle": { + "message": "열린 탭 중 일치하는 목록 (URL 클릭 시 해당 탭으로 이동)", + "description": "RegExp test report: title of the report" + }, + "styleSaveLabel": { + "message": "저장", + "description": "Label for save button for style editing" + }, + "styleToMozillaFormatHelp": { + "message": "Mozilla 형식 코드는 userstyles.org에 올리거나 기존 Firefox용 Stylish에 사용할 수 있습니다", + "description": "Help info for the Mozilla format header section that converts the code to/from Mozilla format" + }, + "styleToMozillaFormatTitle": { + "message": "Mozilla 형식으로 변환한 스타일", + "description": "Title of the popup with the style code in Mozilla format, shown after pressing the Export button on Edit style page" + }, + "styleUpdate": { + "message": "'$stylename$'을(를) 정말 수정하시겠습니까?", + "description": "Confirmation when updating a style", + "placeholders": { + "stylename": { + "content": "$1" + } + } + }, + "styleUpdateDiscardChanges": { + "message": "이 스타일은 편집기 외부에서 변경되었습니다. 스타일을 다시 로딩하시겠습니까?", + "description": "Confirmation to update the style in the editor" + }, + "stylusUnavailableForURL": { + "message": "Stylus는 이러한 페이지에서는 작동할 수 없습니다.", + "description": "Note in the toolbar pop-up when on a URL Stylus can't affect" + }, + "stylusUnavailableForURLdetails": { + "message": "브라우저 보안 상의 이유로, 확장 프로그램은 브라우저 내장 페이지(chrome://version, Chrome 61의 표준 새 탭 페이지, about:addons 등)나 타 확장 프로그램의 페이지에 영향을 미칠 수 없습니다. 각 브라우저의 확장 프로그램 스토어(Chrome 웹 스토어, AMO 등) 접근 또한 마찬가지입니다.", + "description": "Sub-note in the toolbar pop-up when on a URL Stylus can't affect" + }, + "syncStorageErrorSaving": { + "message": "값을 저장할 수 없습니다. 텍스트의 양을 줄이세요.", + "description": "Displayed when trying to save an excessively big value via storage.sync API" + }, + "toggleStyle": { + "message": "스타일 토글", + "description": "Label for the checkbox to enable/disable a style" + }, + "undo": { + "message": "취소", + "description": "Button label" + }, + "undoGlobal": { + "message": "모든 섹션에서 실행 취소", + "description": "CSS-beautify global Undo button label" + }, + "unreachableAMO": { + "message": "Firefox가 해당 사이트의 접근을 금지했습니다.", + "description": "Note in the popup displayed when opened on addons.mozilla.org" + }, + "unreachableAMOHint": { + "message": "접근을 허용하려면 를 열고, 목록을 우클릭 한 후, '새로 만들기'를 클릭하고, '불린값'을 선택하고, 을 붙여 넣고 확인을 누르고, , 확인 후 페이지를 새로 고침하세요.", + "description": "Note in the popup when opened on addons.mozilla.org in Firefox >= 59" + }, + "unreachableAMOHintNewFF": { + "message": "Firefox 60 이상 버전에서는 내의 에서 AMO 도메인을 제거해야 합니다.", + "description": "Note in the popup when opened on addons.mozilla.org in Firefox >= 59" + }, + "unreachableAMOHintOldFF": { + "message": "Firefox 59 버전 이상에서만 이처럼 CSP 보호 정책이 적용된 사이트에 웹 확장 기능으로 스타일 요소를 추가할 수 있도록 설정 가능합니다.", + "description": "Note in the popup when opened on addons.mozilla.org in Firefox < 59" + }, + "unreachableContentScript": { + "message": "페이지와 통신할 수 없습니다. 탭을 다시 로딩(새로 고침) 해보세요.", + "description": "Note in the toolbar popup usually on file:// URLs after [re]loading Stylus" + }, + "unreachableFileHint": { + "message": "Stylus가 file:// URL에 접근할 수 있도록 하려면 chrome://extensions 페이지에서 파일 URL에 대한 액세스를 허용해야 합니다.", + "description": "Note in the toolbar popup for file:// URLs" + }, + "InaccessibleFileHint": { + "message": "Stylus는 일부 파일 형식(예: pdf, json 파일 등)에 접근할 수 없습니다.", + "description": "Note in the toolbar popup for some file types that cannot be accessed" + }, + "updateAllCheckSucceededNoUpdate": { + "message": "이용 가능한 업데이트가 없습니다.", + "description": "Text that displays when an update all check completed and no updates are available" + }, + "updateAllCheckSucceededSomeEdited": { + "message": "로컬 수정 사항이 사라지는 것을 방지하기 위해, 일부 업데이트 가능한 스타일이 선택에서 누락되었을 수 있습니다. 이를 강제로 업데이트하려면 각각을 직접 선택하거나, 다른 전체 스타일 검사(따로 수정한 사항은 덮어씌워집니다)를 시행하세요.", + "description": "Text that displays when an update all check completed and no updates are available" + }, + "updateCheckFailBadResponseCode": { + "message": "업데이트 실패. 서버의 응답 에러코드는 $code$입니다.", + "description": "Text that displays when an update check failed because the response code indicates an error", + "placeholders": { + "code": { + "content": "$1" + } + } + }, + "updateCheckFailServerUnreachable": { + "message": "업데이트 실패. 서버와 연결할 수 없습니다.", + "description": "Text that displays when an update check failed because the update server is unreachable" + }, + "updateCheckHistory": { + "message": "업데이트 검사 기록", + "description": "" + }, + "updateCheckManualUpdateForce": { + "message": "업데이트 설치 (로컬 수정 사항은 덮어씌워집니다)", + "description": "Additional text displayed when an update check skipped updating the style to avoid losing local modifications" + }, + "updateCheckManualUpdateHint": { + "message": "로컬 수정 사항을 무시하고 업데이트를 덮어씌웁니다.", + "description": "Additional text displayed when an update check skipped updating the style to avoid losing local modifications" + }, + "updateCheckSkippedLocallyEdited": { + "message": "이 스타일은 로컬에서 수정되었습니다.", + "description": "Text that displays when an update check skipped updating the style to avoid losing local modifications" + }, + "updateCheckSkippedMaybeLocallyEdited": { + "message": "이 스타일은 로컬에서 수정되었을 수 있습니다.", + "description": "Text that displays when an update check skipped updating the style to avoid losing possible local modifications" + }, + "updateCheckSucceededNoUpdate": { + "message": "스타일이 최신 상태입니다.", + "description": "Text that displays when an update check completed and no update is available" + }, + "updateCompleted": { + "message": "업데이트가 완료됐습니다.", + "description": "Text that displays when an update completed" + }, + "updatesCurrentlyInstalled": { + "message": "설치된 업데이트:", + "description": "Text that displays when an update is installed on options page. Followed by the number of currently installed updates." + }, + "usercssAvoidOverwriting": { + "message": "기존에 존재하는 스타일이 덮어씌워지는 것을 방지하려면 @name이나 @namespace 값을 변경하세요.", + "description": "Shown in a message box when attempting to save a new Usercss style that would overwrite an existing one." + }, + "usercssConfigIncomplete": { + "message": "설정 대화상자가 열리고 나서 스타일이 수정되거나 삭제되었습니다. 스타일의 메타 데이터와 충돌이 일어나는 것을 방지하기 위해, 현재 변수들은 저장되지 않습니다:", + "description": "" + }, + "usercssEditorNamePlaceholder": { + "message": "코드에 @name을 지정하세요", + "description": "Placeholder text for the empty name input field when creating a new Usercss style" + }, + "usercssReplaceTemplateConfirmation": { + "message": "현재 코드로 새 Usercss 스타일의 기본 템플릿을 대체하시겠습니까?", + "description": "" + }, + "usercssReplaceTemplateName": { + "message": "@name을 비우면 기본 템플릿이 대체됩니다.", + "description": "The text shown after @name when creating a new Usercss style" + }, + "usercssReplaceTemplateSectionBody": { + "message": "코드를 여기 입력하세요", + "description": "The code placeholder comment in a new style created by clicking 'Write style' in the popup" + }, + "versionInvalidOlder": { + "message": "설치되어 있는 스타일이 더 높은 버전입니다.", + "description": "Displayed when the version of style is older than the installed one" + }, + "writeStyleFor": { + "message": "스타일 작성 대상:", + "description": "Label for toolbar pop-up that precedes the links to write a new style" + }, + "writeStyleForURL": { + "message": "현재 URL", + "description": "Text for link in toolbar pop-up to write a new style for the current URL" + }, + "syncDropboxStyles": { + "message": "Dropbox 내보내기", + "description": "" + }, + "syncDropboxDeprecated": { + "message": "Dropbox 가져오기/내보내기는 옵션 페이지의 더 발전된 스타일 동기화 기능으로 대체되었습니다.", + "description": "" + }, + "retrieveDropboxSync": { + "message": "Dropbox 가져오기", + "description": "" + }, + "overwriteFileExport": { + "message": "기존 파일을 덮어쓰시겠습니까?", + "description": "" + }, + "exportSavedSuccess": { + "message": "파일 저장에 성공했습니다.", + "description": "" + }, + "noFileToImport": { + "message": "스타일을 가져오려면, 먼저 내보내야 합니다.", + "description": "" + }, + "connectingDropbox": { + "message": "Dropbox 연결 중...", + "description": "" + }, + "connectingDropboxNotAllowed": { + "message": "Dropbox 연결은 웹 스토어에서 직접 설치한 앱에서만 가능합니다.", + "description": "" + }, + "gettingStyles": { + "message": "모든 스타일 가져오는 중...", + "description": "" + }, + "zipStyles": { + "message": "스타일 압축 중...", + "description": "" + }, + "unzipStyles": { + "message": "스타일 압축 푸는 중...", + "description": "" + }, + "readingStyles": { + "message": "스타일 읽어들이는 중...", + "description": "" + }, + "uploadingFile": { + "message": "파일 업로드 중...", + "description": "" + } +} \ No newline at end of file diff --git a/_locales/nl/messages.json b/_locales/nl/messages.json index 6c97d286..daa2a292 100644 --- a/_locales/nl/messages.json +++ b/_locales/nl/messages.json @@ -1285,6 +1285,10 @@ "message": "Mooier maken", "description": "Label for the CSS-beautifier button on the edit style page" }, + "styleBeautifyHint": { + "message": "Hint: klik met de rechtermuisknop op de knop ‘Mooier maken’ of gebruik de hieronder gedefinieerde sneltoets om iets mooier te maken zonder dit paneel te tonen", + "description": "Hint shown inside the CSS-beautifier panel" + }, "styleBeautifyIndentConditional": { "message": "@media, @supports inspringen", "description": "CSS-beautifier option" diff --git a/_locales/pl/messages.json b/_locales/pl/messages.json index cef4e512..a5f8ad21 100644 --- a/_locales/pl/messages.json +++ b/_locales/pl/messages.json @@ -1309,6 +1309,10 @@ "message": "Upiększ", "description": "Label for the CSS-beautifier button on the edit style page" }, + "styleBeautifyHint": { + "message": "Wskazówka: kliknij prawym przyciskiem myszy przycisk “Upiększ” lub użyj zdefiniowanego poniżej skrótu klawiaturowego, aby upiększyć bez pokazywania tego panelu", + "description": "Hint shown inside the CSS-beautifier panel" + }, "styleBeautifyIndentConditional": { "message": "Wcięcie @media, @supports", "description": "CSS-beautifier option" diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json index 74addc6f..69985610 100644 --- a/_locales/ru/messages.json +++ b/_locales/ru/messages.json @@ -244,6 +244,14 @@ "message": "Да", "description": "'Yes' button in a confirm dialog" }, + "copied": { + "message": "Скопировано в буфер обмена", + "description": "Message shown when content has been copied to the clipboard" + }, + "copy": { + "message": "Скопировать в буфер обмена", + "description": "Tooltip for elements which can be copied" + }, "dateInstalled": { "message": "Дата установки", "description": "Option text for the user to sort the style by install date" @@ -284,6 +292,10 @@ "message": "Перетащите файл с резервной копией стилей в любое место этой страницы, чтобы импортировать его.", "description": "Drag'n'drop message" }, + "dragDropUsercssTabstrip": { + "message": "Чтобы установить файл, поместите его на вкладку (область, где отображаются заголовки вкладок).", + "description": "Message popup shown when erroneously dropping a usercss file into the manager page" + }, "editDeleteText": { "message": "Удалить", "description": "Label for the context menu item in the editor to delete selected text" @@ -441,6 +453,10 @@ "message": "Нажмите клавишу", "description": "Placeholder text of inputbox in keymap help popup on the edit style page. Must be very short" }, + "hostDisabled": { + "message": "Этот хост был отключен из-за ошибки в текущей версии используемого браузера", + "description": "Tooltip for cloud host disabled" + }, "importAppendLabel": { "message": "Добавить к стилю", "description": "Label for the button to import a style and append to the existing sections" @@ -613,6 +629,14 @@ "message": "Ошибка слежения за файлом", "description": "The label of live-reload error" }, + "liveReloadInstallHint": { + "message": "Держите эту вкладку открытой, чтобы автоматически обновлять стиль при внешних изменениях.", + "description": "The label of live-reload feature" + }, + "liveReloadInstallHintFF": { + "message": "Оставьте эту вкладку и исходную вкладку открытой, чтобы автоматически обновлять стиль при внешних изменениях.", + "description": "The extra hint of live-reload feature shown only for file:// URLs in Firefox" + }, "liveReloadLabel": { "message": "Автозагрузка изменений", "description": "The label of live-reload feature" @@ -909,6 +933,10 @@ "message": "Менеджер", "description": "Link to open the manage page." }, + "openOptions": { + "message": "Опции", + "description": "Go to Options UI" + }, "openStylesManager": { "message": "Менеджер стилей", "description": "Label for the style maanger opener in the browser action context menu." @@ -969,6 +997,10 @@ "message": "Обновления", "description": "" }, + "optionsCustomizeSync": { + "message": "Синхронизация с облаком", + "description": "" + }, "optionsHeading": { "message": "Настройки", "description": "Heading for options section on manage page." @@ -1013,6 +1045,70 @@ "message": "Интервал обновления стилей, в часах (укажите 0 для выключения)", "description": "" }, + "optionsSyncNone": { + "message": "Ничего", + "description": "" + }, + "optionsSyncConnect": { + "message": "Подключить", + "description": "" + }, + "optionsSyncDisconnect": { + "message": "Отсоединить", + "description": "" + }, + "optionsSyncSyncNow": { + "message": "Синхронизировать", + "description": "" + }, + "optionsSyncLogin": { + "message": "Логин", + "description": "" + }, + "optionsSyncStatusPull": { + "message": "Загружено стилей $loaded$ из $total$", + "description": "", + "placeholders": { + "loaded": { + "content": "$1" + }, + "total": { + "content": "$2" + } + } + }, + "optionsSyncStatusPush": { + "message": "Загружено стилей $loaded$ из $total$", + "description": "", + "placeholders": { + "loaded": { + "content": "$1" + }, + "total": { + "content": "$2" + } + } + }, + "optionsSyncStatusSyncing": { + "message": "Синхронизация", + "description": "" + }, + "optionsSyncStatusConnecting": { + "message": "Подключение…", + "description": "" + }, + "optionsSyncStatusConnected": { + "message": "Подключено", + "description": "" + }, + "optionsSyncStatusDisconnecting": { + "message": "Отсоединение…", + "description": "" + }, + "optionsSyncStatusDisconnected": { + "message": "Отсоединено", + "description": "" + }, "paginationCurrent": { "message": "Текущая страница", "description": "Tooltip for the current page index in search results" @@ -1089,6 +1185,10 @@ "message": "Временно применяет стиль пока вы его редактируете.\nСохраните стиль, чтобы сделать изменения постоянными.", "description": "Tooltip for the checkbox in style editor to enable live preview while editing." }, + "reload": { + "message": "Перезагрузить расширение Stylus", + "description": "Context menu reload" + }, "replace": { "message": "Заменить", "description": "Label before the replace input field in the editor shown on Ctrl-H" @@ -1496,6 +1596,10 @@ "message": "Экспорт Dropbox", "description": "" }, + "syncDropboxDeprecated": { + "message": "Импорт/экспорт Dropbox заменен более продвинутой синхронизацией стилей на странице параметров.", + "description": "" + }, "retrieveDropboxSync": { "message": "Импорт Dropbox", "description": "" diff --git a/_locales/tr/messages.json b/_locales/tr/messages.json index 67c60856..941cc153 100644 --- a/_locales/tr/messages.json +++ b/_locales/tr/messages.json @@ -40,6 +40,10 @@ "message": "Şuraya uygulanır", "description": "Label for 'applies to' fields on the edit/add screen" }, + "appliesLineWidgetWarning": { + "message": "Küçültülmüş CSS ile çalışmaz", + "description": "A warning that applies-to information won't show properly with minified CSS" + }, "appliesRegexpOption": { "message": "regexp ile eşleşen URL'ler", "description": "Option to make the style apply to the entered string as a regular expression" @@ -68,6 +72,14 @@ "message": "Yazar", "description": "Label for the style author" }, + "backupButtons": { + "message": "Yedek", + "description": "Heading for backup" + }, + "backupMessage": { + "message": "Bir dosya seçin veya bu sayfaya sürükleyip bırakın.", + "description": "Message for backup" + }, "bckpInstStyles": { "message": "Dışa aktar", "description": "" @@ -76,6 +88,10 @@ "message": "Tüm stiller için güncellemeleri denetle", "description": "Label for the button to check all styles for updates" }, + "checkAllUpdatesForce": { + "message": "Tekrar kontrol et, herhangi bir stil düzenlemedim!", + "description": "Label for the button to apply all detected updates" + }, "checkForUpdate": { "message": "Güncellemeleri denetle", "description": "Label for the button to check a single style for an update" @@ -92,6 +108,10 @@ "message": "Parantezleri ve tırnak işaretlerini otomatik olarak kapat", "description": "Label for the checkbox in the style editor." }, + "cm_autoCloseBracketsTooltip": { + "message": "()[]{}''\"\" Açılışlarından birini yazarken otomatik olarak bir kapanış çifti ekleyin", + "description": "Label for the checkbox in the style editor." + }, "cm_autocompleteOnTyping": { "message": "Yazarken tamamla", "description": "Label for the checkbox in the style editor." @@ -104,6 +124,14 @@ "message": "Akıllı girintili tab kullan", "description": "Label for the checkbox controlling tabs with smart indentation option for the style editor." }, + "cm_keyMap": { + "message": "Tuşeşlem", + "description": "Label for the drop-down list controlling the keymap for the style editor." + }, + "cm_lineWrapping": { + "message": "Kelime kaydırma", + "description": "Label for the checkbox controlling word wrap option for the style editor." + }, "cm_matchHighlight": { "message": "Vurgulama", "description": "Label for the drop-down list controlling the automatic highlighting of current word/selection occurrences in the style editor." @@ -112,6 +140,26 @@ "message": "Yalnızca seçim", "description": "Style editor's 'highglight' drop-down list option: highlight the occurrences of currently selected text" }, + "cm_matchHighlightToken": { + "message": "İmleç altındaki token", + "description": "Style editor's 'highglight' drop-down list option: highlight the occurrences of the word/token under cursor even if nothing is selected" + }, + "cm_resizeGripHint": { + "message": "Yüksekliği en üst düzeye çıkarmak/geri yüklemek için çift tıklayın", + "description": "Tooltip for the resize grip in style editor" + }, + "cm_selectByTokens": { + "message": "Çift tıklamak tokenleri seçer", + "description": "Label for the checkbox in the editor." + }, + "cm_selectByTokensTooltip": { + "message": "Token örnekleri: .foo-bar-2 #aabbcc 0.32 !important\nDevre dışı bırakıldığında: noktalama işareti ile ayrılmış kelimeler seçilir.", + "description": "" + }, + "cm_smartIndent": { + "message": "Akıllı girinti kullanma", + "description": "Label for the checkbox controlling smart indentation option for the style editor." + }, "cm_tabSize": { "message": "Tab büyüklüğü", "description": "Label for the text box controlling tab size option for the style editor." @@ -120,10 +168,30 @@ "message": "Tema", "description": "Label for the style editor's CSS theme." }, + "colorpickerSwitchFormatTooltip": { + "message": "Format değişimleri: HEX -> RGB -> HSL.\nYönü ters çevirmek için Shift tuşunu basılı tutup tıklatın.\nAyrıca PgUp (PageUp), PgDn (PageDown) tuşları ile.", + "description": "Tooltip for the switch button in the color picker popup in the style editor." + }, + "colorpickerTooltip": { + "message": "Renk seçiciyi aç", + "description": "Tooltip for the colored squares shown before CSS colors in the style editor." + }, "configOnChange": { "message": "değişiklikte", "description": "VERY SHORT label for the checkbox in style config dialog after the save button - when enabled the changes in the dialog are saved and applied automatically without the need to press the Save button" }, + "configOnChangeTooltip": { + "message": "Otomatik kaydetme ve değişiklikleri otomatik olarak uygulama", + "description": "" + }, + "configureStyle": { + "message": "Yapılandır", + "description": "Label for the button to configure usercss userstyle" + }, + "configureStyleOnHomepage": { + "message": "Ana sayfada yapılandır", + "description": "Label for the button to configure userstyles.org userstyle" + }, "confirmCancel": { "message": "İptal", "description": "" @@ -180,6 +248,10 @@ "message": "Güncelleme tarihi", "description": "Option text for the user to sort the style by last update date" }, + "dbError": { + "message": "Stylus veritabanı kullanılırken bir hata oluştu. Olası çözümler içeren bir web sayfasını ziyaret etmek ister misiniz?", + "description": "Prompt when a DB error is encountered" + }, "defaultTheme": { "message": "öntanımlı", "description": "Default CodeMirror CSS theme option on the edit style page" @@ -204,6 +276,14 @@ "message": "Devre dışı bırak", "description": "Label for the button to disable a style" }, + "dragDropMessage": { + "message": "İçe aktarmak için yedek dosyanızı bu sayfada herhangi bir yere bırakın.", + "description": "Drag'n'drop message" + }, + "dragDropUsercssTabstrip": { + "message": "Dosyayı yüklemek için sekme şeridine (sekme başlıklarının gösterildiği alan) bırakın.", + "description": "Message popup shown when erroneously dropping a usercss file into the manager page" + }, "editDeleteText": { "message": "Sil", "description": "Label for the context menu item in the editor to delete selected text" @@ -237,6 +317,14 @@ "message": "Etkinleştir", "description": "Label for the button to enable a style" }, + "excludeStyleByDomainLabel": { + "message": "Mevcut alan adını hariç tut", + "description": "" + }, + "excludeStyleByUrlLabel": { + "message": "Mevcut URL'yi hariç tut", + "description": "" + }, "exportLabel": { "message": "Dışa aktar", "description": "Label for the button to export a style ('edit' page) or all styles ('manage' page)" @@ -249,10 +337,34 @@ "message": "Anasayfa", "description": "Label for the external link to style's homepage" }, + "externalLink": { + "message": "Harici bağlantı", + "description": "Label for external links" + }, "externalSupport": { "message": "Destek", "description": "Label for the external link to style's support site" }, + "externalUsercssDocument": { + "message": "Usercss belgeleri", + "description": "Label for the external link to usercss documentation" + }, + "filteredStyles": { + "message": "Toplam $numTotal$ gösterilen $numShown$", + "description": "TL note - make this message short", + "placeholders": { + "numTotal": { + "content": "$2" + }, + "numShown": { + "content": "$1" + } + } + }, + "filteredStylesAllHidden": { + "message": "Şu anda uygulanan filtreler hiçbir stille eşleşmiyor", + "description": "Text shown when no styles match currently applied filter in the style manager" + }, "findStyles": { "message": "Stil bul", "description": "Text for a link that gets a list of styles for the current site" @@ -261,10 +373,22 @@ "message": "Bu site için başka stiller bul", "description": "Text for a link that gets a list of styles for the current site" }, + "findStylesInline": { + "message": "Hizada", + "description": "Text for a checkbox that opens search results 'inline' (within the Stylus popup window)" + }, + "findStylesInlineTooltip": { + "message": "Arama sonuçlarını bu pencerede görüntüleyin.", + "description": "Text for a checkbox that displays search results within the Stylus popup." + }, "genericAdd": { "message": "Ekle", "description": "Used in various places for an action that adds something" }, + "genericClone": { + "message": "Klon", + "description": "Used in various places for an action that clones something" + }, "genericDisabledLabel": { "message": "Devre dışı", "description": "Used in various lists/options to indicate that something is disabled" @@ -289,6 +413,10 @@ "message": "Önceki", "description": "Used in various places to select/perform the previous step/action" }, + "genericResetLabel": { + "message": "Yenile", + "description": "Used in various parts of UI to indicate that something may be reset to its original state" + }, "genericSavedMessage": { "message": "Kaydedildi", "description": "Used in various parts of the UI to indicate that something was saved" @@ -305,10 +433,26 @@ "message": "Yardım", "description": "Alternate text for help buttons" }, + "helpKeyMapCommand": { + "message": "Bir komut adı yazın", + "description": "Placeholder text of inputbox in keymap help popup on the edit style page. Must be very short" + }, + "helpKeyMapHotkey": { + "message": "Bir kısayol tuşuna basın", + "description": "Placeholder text of inputbox in keymap help popup on the edit style page. Must be very short" + }, + "hostDisabled": { + "message": "Bu ana bilgisayar, kullanılan tarayıcının mevcut sürümündeki bir hata nedeniyle devre dışı bırakıldı", + "description": "Tooltip for cloud host disabled" + }, "importAppendLabel": { "message": "Stile ekle", "description": "Label for the button to import a style and append to the existing sections" }, + "importAppendTooltip": { + "message": "İçe aktarılan stili geçerli stile ekleme", + "description": "Tooltip for the button to import a style and append to the existing sections" + }, "importLabel": { "message": "İçe aktar", "description": "Label for the button to import a style ('edit' page) or all styles ('manage' page)" @@ -317,10 +461,18 @@ "message": "Stilin üzerine yaz", "description": "Label for the button to import and overwrite current style" }, + "importReplaceTooltip": { + "message": "Geçerli stilin içeriğini atın ve içe aktarılan stil ile üzerine yazın", + "description": "Label for the button to import and overwrite current style" + }, "importReportLegendAdded": { "message": "eklendi", "description": "Text after the number of styles added in the report shown after importing styles" }, + "importReportLegendUpdatedBoth": { + "message": "hem meta bilgi hem de kod güncellendi", + "description": "Text after the number of styles updated entirely in the report shown after importing styles" + }, "importReportLegendUpdatedCode": { "message": "güncellenmiş kod", "description": "Text after the number of styles with updated code (meta info is unchanged) in the report shown after importing styles" @@ -640,6 +792,10 @@ "message": "Güncelleme kontrolü geçmişi", "description": "" }, + "updateCheckSkippedMaybeLocallyEdited": { + "message": "Bu stil yerel olarak düzenlenmiş olabilir.", + "description": "Text that displays when an update check skipped updating the style to avoid losing possible local modifications" + }, "updateCheckSucceededNoUpdate": { "message": "Stil güncel.", "description": "Text that displays when an update check completed and no update is available" @@ -652,6 +808,38 @@ "message": "Kurulan güncellemeler:", "description": "Text that displays when an update is installed on options page. Followed by the number of currently installed updates." }, + "usercssAvoidOverwriting": { + "message": "Mevcut bir stilin üzerine yazmaktan kaçınmak için lütfen @name veya @ ad alanının değerini değiştirin.", + "description": "Shown in a message box when attempting to save a new Usercss style that would overwrite an existing one." + }, + "usercssConfigIncomplete": { + "message": "Stil, yapılandırma iletişim kutusu gösterildikten sonra güncellendi veya silindi. Bu değişkenler, stilin meta verilerini bozmamak için kaydedilmedi:", + "description": "" + }, + "usercssEditorNamePlaceholder": { + "message": "Kodda @name belirtin", + "description": "Placeholder text for the empty name input field when creating a new Usercss style" + }, + "usercssReplaceTemplateConfirmation": { + "message": "Yeni Usercss stilleri için varsayılan şablonu geçerli kodla değiştir?", + "description": "" + }, + "usercssReplaceTemplateName": { + "message": "Boş @name, varsayılan şablonun yerini alır", + "description": "The text shown after @name when creating a new Usercss style" + }, + "usercssReplaceTemplateSectionBody": { + "message": "Kodu buraya ekle...", + "description": "The code placeholder comment in a new style created by clicking 'Write style' in the popup" + }, + "versionInvalidOlder": { + "message": "Sürüm, kurulu stillerden daha eski.", + "description": "Displayed when the version of style is older than the installed one" + }, + "writeStyleFor": { + "message": "Şunun için stil yaz:", + "description": "Label for toolbar pop-up that precedes the links to write a new style" + }, "writeStyleForURL": { "message": "bu URL", "description": "Text for link in toolbar pop-up to write a new style for the current URL" @@ -660,14 +848,34 @@ "message": "Dropbox'tan aktar", "description": "" }, + "syncDropboxDeprecated": { + "message": "Dropbox içe/dışa aktarma, seçenekler sayfasında daha gelişmiş bir stil senkronizasyonu ile değiştirilir.", + "description": "" + }, "retrieveDropboxSync": { "message": "Dropbox'a aktar", "description": "" }, + "overwriteFileExport": { + "message": "Mevcut bir dosyanın üzerine yazmak istiyor musunuz?", + "description": "" + }, "exportSavedSuccess": { "message": "Dosya başarıyla kaydedildi", "description": "" }, + "noFileToImport": { + "message": "Stillerinizi içe aktarmak için önce dışa aktarmanız gerekir.", + "description": "" + }, + "connectingDropbox": { + "message": "Dropbox'a bağlanıyor...", + "description": "" + }, + "connectingDropboxNotAllowed": { + "message": "Dropbox'a bağlanmak yalnızca doğrudan web mağazasından yüklenen uygulamalarda kullanılabilir", + "description": "" + }, "gettingStyles": { "message": "Tüm stiller alınıyor...", "description": "" @@ -676,6 +884,10 @@ "message": "Stiller sıkıştırılıyor...", "description": "" }, + "unzipStyles": { + "message": "Stiller açılıyor...", + "description": "" + }, "readingStyles": { "message": "Stiller okunuyor...", "description": "" diff --git a/_locales/zh_CN/messages.json b/_locales/zh_CN/messages.json index 6dc328cd..50c1336b 100644 --- a/_locales/zh_CN/messages.json +++ b/_locales/zh_CN/messages.json @@ -125,7 +125,7 @@ "description": "Label for the checkbox in the style editor." }, "cm_autocompleteOnTyping": { - "message": "输入时自动完成", + "message": "输入时自动补全", "description": "Label for the checkbox in the style editor." }, "cm_colorpicker": { @@ -133,7 +133,7 @@ "description": "Label for the checkbox controlling colorpicker option for the style editor." }, "cm_indentWithTabs": { - "message": "使用 Tab 智能缩进", + "message": "使用Tab智能缩进", "description": "Label for the checkbox controlling tabs with smart indentation option for the style editor." }, "cm_keyMap": { @@ -153,7 +153,7 @@ "description": "Style editor's 'highglight' drop-down list option: highlight the occurrences of currently selected text" }, "cm_matchHighlightToken": { - "message": "光标所在 token 字段", + "message": "光标所在token字段", "description": "Style editor's 'highglight' drop-down list option: highlight the occurrences of the word/token under cursor even if nothing is selected" }, "cm_resizeGripHint": { @@ -244,6 +244,14 @@ "message": "是", "description": "'Yes' button in a confirm dialog" }, + "copied": { + "message": "已复制到粘贴板", + "description": "Message shown when content has been copied to the clipboard" + }, + "copy": { + "message": "复制到粘贴板", + "description": "Tooltip for elements which can be copied" + }, "dateInstalled": { "message": "安装日期", "description": "Option text for the user to sort the style by install date" @@ -284,6 +292,10 @@ "message": "把 JSON 备份文件拖放到页面的任意位置,即可导入", "description": "Drag'n'drop message" }, + "dragDropUsercssTabstrip": { + "message": "要安装文件,就将其放在选项卡条(显示选项卡标题的区域)上。", + "description": "Message popup shown when erroneously dropping a usercss file into the manager page" + }, "editDeleteText": { "message": "删除", "description": "Label for the context menu item in the editor to delete selected text" @@ -441,6 +453,10 @@ "message": "按下热键", "description": "Placeholder text of inputbox in keymap help popup on the edit style page. Must be very short" }, + "hostDisabled": { + "message": "由于当前使用的浏览器版本中存在的错误,此主机已被禁用", + "description": "Tooltip for cloud host disabled" + }, "importAppendLabel": { "message": "追加到样式", "description": "Label for the button to import a style and append to the existing sections" @@ -609,6 +625,14 @@ "message": "查看文件时发生错误", "description": "The label of live-reload error" }, + "liveReloadInstallHint": { + "message": "保持此选项卡为打开状态,将在外部更改后自动更新样式。", + "description": "The label of live-reload feature" + }, + "liveReloadInstallHintFF": { + "message": "保持此选项卡和原始选项卡处于打开状态,将在外部更改时自动重新更新样式。", + "description": "The extra hint of live-reload feature shown only for file:// URLs in Firefox" + }, "liveReloadLabel": { "message": "动态刷新", "description": "The label of live-reload feature" @@ -642,7 +666,7 @@ "description": "VERY SHORT label for the checkbox next to the 'Write new style' button in the style manager" }, "manageNewUI": { - "message": "新的样式管理界面", + "message": "新版管理器", "description": "Label for the checkbox that toggles the new UI on manage page" }, "manageOnlyDisabled": { @@ -905,6 +929,10 @@ "message": "管理样式", "description": "Link to open the manage page." }, + "openOptions": { + "message": "选项", + "description": "Go to Options UI" + }, "openStylesManager": { "message": "打开样式管理器", "description": "Label for the style maanger opener in the browser action context menu." @@ -965,6 +993,10 @@ "message": "检测更新", "description": "" }, + "optionsCustomizeSync": { + "message": "同步到云端", + "description": "" + }, "optionsHeading": { "message": "选项", "description": "Heading for options section on manage page." @@ -1009,6 +1041,70 @@ "message": "每隔 N 小时,检查所有样式更新(0 为关闭检查)", "description": "" }, + "optionsSyncNone": { + "message": "无", + "description": "" + }, + "optionsSyncConnect": { + "message": "连接", + "description": "" + }, + "optionsSyncDisconnect": { + "message": "断开连接", + "description": "" + }, + "optionsSyncSyncNow": { + "message": "现在同步", + "description": "" + }, + "optionsSyncLogin": { + "message": "登录", + "description": "" + }, + "optionsSyncStatusPull": { + "message": "正在获取样式 $loaded$ 中的 $total$", + "description": "", + "placeholders": { + "loaded": { + "content": "$1" + }, + "total": { + "content": "$2" + } + } + }, + "optionsSyncStatusPush": { + "message": "正在上传样式 $loaded$ 中的 $total$", + "description": "", + "placeholders": { + "loaded": { + "content": "$1" + }, + "total": { + "content": "$2" + } + } + }, + "optionsSyncStatusSyncing": { + "message": "同步中...", + "description": "" + }, + "optionsSyncStatusConnecting": { + "message": "连接中...", + "description": "" + }, + "optionsSyncStatusConnected": { + "message": "已连接", + "description": "" + }, + "optionsSyncStatusDisconnecting": { + "message": "正在断开连接...", + "description": "" + }, + "optionsSyncStatusDisconnected": { + "message": "已断开连接", + "description": "" + }, "paginationCurrent": { "message": "当前页数", "description": "Tooltip for the current page index in search results" @@ -1085,6 +1181,10 @@ "message": "无需保存即可临时应用样式预览效果。保存以使更改永久生效。", "description": "Tooltip for the checkbox in style editor to enable live preview while editing." }, + "reload": { + "message": "重新加载 Stylus 扩展程序", + "description": "Context menu reload" + }, "replace": { "message": "替换", "description": "Label before the replace input field in the editor shown on Ctrl-H" @@ -1209,6 +1309,10 @@ "message": "格式化", "description": "Label for the CSS-beautifier button on the edit style page" }, + "styleBeautifyHint": { + "message": "提示: 你可以不显示此面板, 而是用右键“美化”按钮 或用下面定义的快捷键来美化.", + "description": "Hint shown inside the CSS-beautifier panel" + }, "styleBeautifyIndentConditional": { "message": "缩进 @media、@supports", "description": "CSS-beautifier option" @@ -1218,7 +1322,7 @@ "description": "CSS-beautifier option" }, "styleCancelEditLabel": { - "message": "返回管理页面", + "message": "返回管理器", "description": "Label for cancel button for style editing" }, "styleChangesNotSaved": { @@ -1492,6 +1596,10 @@ "message": "导出至 Dropbox", "description": "" }, + "syncDropboxDeprecated": { + "message": "在选项页面中, Dropbox 导入/导出 已经替换为更高级的样式同步方式。", + "description": "" + }, "retrieveDropboxSync": { "message": "从 Dropbox 导入", "description": "" diff --git a/_locales/zh_TW/messages.json b/_locales/zh_TW/messages.json index f98b154a..0886cb37 100644 --- a/_locales/zh_TW/messages.json +++ b/_locales/zh_TW/messages.json @@ -1309,6 +1309,10 @@ "message": "美化", "description": "Label for the CSS-beautifier button on the edit style page" }, + "styleBeautifyHint": { + "message": "提示:右鍵點選「美化」按鈕或使用下面定義的鍵盤快捷鍵來美化而不顯示此面板", + "description": "Hint shown inside the CSS-beautifier panel" + }, "styleBeautifyIndentConditional": { "message": "縮排 @media, @supports", "description": "CSS-beautifier option" diff --git a/background/background.js b/background/background.js index 248bcfda..5dc3b4eb 100644 --- a/background/background.js +++ b/background/background.js @@ -1,7 +1,7 @@ /* global download prefs openURL FIREFOX CHROME URLS ignoreChromeError usercssHelper styleManager msg navigatorUtil workerUtil contentScripts sync - findExistingTab createTab activateTab isTabReplaceable getActiveTab + findExistingTab activateTab isTabReplaceable getActiveTab tabManager colorScheme */ 'use strict'; @@ -10,6 +10,20 @@ var backgroundWorker = workerUtil.createWorker({ url: '/background/background-worker.js' }); +// eslint-disable-next-line no-var +var browserCommands, contextMenus; + +// ************************************************************************* +// browser commands +browserCommands = { + openManage, + openOptions: () => openManage({options: true}), + styleDisableAll(info) { + prefs.set('disableAll', info ? info.checked : !prefs.get('disableAll')); + }, + reload: () => chrome.runtime.reload(), +}; + window.API_METHODS = Object.assign(window.API_METHODS || {}, { deleteStyle: styleManager.deleteStyle, editSave: styleManager.editSave, @@ -70,8 +84,8 @@ window.API_METHODS = Object.assign(window.API_METHODS || {}, { }, optionsCustomizeHotkeys() { - return browser.runtime.openOptionsPage() - .then(() => new Promise(resolve => setTimeout(resolve, 100))) + return browserCommands.openOptions() + .then(() => new Promise(resolve => setTimeout(resolve, 500))) .then(() => msg.broadcastExtension({method: 'optionsCustomizeHotkeys'})); }, @@ -86,9 +100,6 @@ window.API_METHODS = Object.assign(window.API_METHODS || {}, { openManage }); -// eslint-disable-next-line no-var -var browserCommands, contextMenus; - // ************************************************************************* // register all listeners msg.on(onRuntimeMessage); @@ -148,17 +159,6 @@ chrome.runtime.onInstalled.addListener(({reason}) => { delete localStorage.codeMirrorThemes; }); -// ************************************************************************* -// browser commands -browserCommands = { - openManage, - openOptions: () => openManage({options: true}), - styleDisableAll(info) { - prefs.set('disableAll', info ? info.checked : !prefs.get('disableAll')); - }, - reload: () => chrome.runtime.reload(), -}; - // ************************************************************************* // context menus contextMenus = { @@ -218,7 +218,7 @@ function createContextMenus(ids) { if (chrome.contextMenus) { // circumvent the bug with disabling check marks in Chrome 62-64 - const toggleCheckmark = CHROME >= 3172 && CHROME <= 3288 ? + const toggleCheckmark = CHROME >= 62 && CHROME <= 64 ? (id => chrome.contextMenus.remove(id, () => createContextMenus([id]) + ignoreChromeError())) : ((id, checked) => chrome.contextMenus.update(id, {checked}, ignoreChromeError)); @@ -337,7 +337,7 @@ function openManage({options = false, search} = {}) { if (isTabReplaceable(tab, url)) { return activateTab(tab, {url}); } - return createTab({url}); + return browser.tabs.create({url}); }); }); } diff --git a/background/content-scripts.js b/background/content-scripts.js index 4be73294..dfd744f2 100644 --- a/background/content-scripts.js +++ b/background/content-scripts.js @@ -1,4 +1,4 @@ -/* global msg queryTabs ignoreChromeError URLS */ +/* global msg ignoreChromeError URLS */ /* exported contentScripts */ 'use strict'; @@ -55,7 +55,7 @@ const contentScripts = (() => { } function injectToAllTabs() { - return queryTabs({}).then(tabs => { + return browser.tabs.query({}).then(tabs => { for (const tab of tabs) { // skip unloaded/discarded/chrome tabs if (!tab.width || tab.discarded || !URLS.supported(tab.url)) continue; diff --git a/background/db-chrome-storage.js b/background/db-chrome-storage.js index 46cfadb1..01e38262 100644 --- a/background/db-chrome-storage.js +++ b/background/db-chrome-storage.js @@ -1,46 +1,29 @@ -/* global promisify */ +/* global chromeLocal */ /* exported createChromeStorageDB */ 'use strict'; function createChromeStorageDB() { - const get = promisify(chrome.storage.local.get.bind(chrome.storage.local)); - const set = promisify(chrome.storage.local.set.bind(chrome.storage.local)); - const remove = promisify(chrome.storage.local.remove.bind(chrome.storage.local)); - let INC; const PREFIX = 'style-'; const METHODS = { // FIXME: we don't use this method at all. Should we remove this? - get: id => get(PREFIX + id) - .then(result => result[PREFIX + id]), - put: obj => Promise.resolve() - .then(() => { - if (!obj.id) { - return prepareInc() - .then(() => { - // FIXME: should we clone the object? - obj.id = INC++; - }); - } - }) - .then(() => set({[PREFIX + obj.id]: obj})) - .then(() => obj.id), + get: id => chromeLocal.getValue(PREFIX + id), + put: obj => + // FIXME: should we clone the object? + Promise.resolve(!obj.id && prepareInc().then(() => Object.assign(obj, {id: INC++}))) + .then(() => chromeLocal.setValue(PREFIX + obj.id, obj)) + .then(() => obj.id), putMany: items => prepareInc() - .then(() => { - for (const item of items) { - if (!item.id) { - item.id = INC++; - } - } - return set(items.reduce((obj, curr) => { - obj[PREFIX + curr.id] = curr; - return obj; - }, {})); - }) + .then(() => + chromeLocal.set(items.reduce((data, item) => { + if (!item.id) item.id = INC++; + data[PREFIX + item.id] = item; + return data; + }, {}))) .then(() => items.map(i => i.id)), - delete: id => remove(PREFIX + id), - getAll: () => get(null) + delete: id => chromeLocal.remove(PREFIX + id), + getAll: () => chromeLocal.get() .then(result => { const output = []; for (const key in result) { @@ -69,7 +52,7 @@ function createChromeStorageDB() { function prepareInc() { if (INC) return Promise.resolve(); - return get(null).then(result => { + return chromeLocal.get().then(result => { INC = 1; for (const key in result) { if (key.startsWith(PREFIX)) { diff --git a/background/icon-manager.js b/background/icon-manager.js index 7319b32e..0ea14d03 100644 --- a/background/icon-manager.js +++ b/background/icon-manager.js @@ -3,7 +3,7 @@ 'use strict'; const iconManager = (() => { - const ICON_SIZES = FIREFOX || CHROME >= 2883 && !VIVALDI ? [16, 32] : [19, 38]; + const ICON_SIZES = FIREFOX || CHROME >= 55 && !VIVALDI ? [16, 32] : [19, 38]; const staleBadges = new Set(); prefs.subscribe([ diff --git a/background/navigator-util.js b/background/navigator-util.js index ab08dffa..67fdc1e7 100644 --- a/background/navigator-util.js +++ b/background/navigator-util.js @@ -1,4 +1,4 @@ -/* global promisify CHROME URLS */ +/* global CHROME URLS */ /* exported navigatorUtil */ 'use strict'; @@ -6,7 +6,6 @@ const navigatorUtil = (() => { const handler = { urlChange: null }; - const tabGet = promisify(chrome.tabs.get.bind(chrome.tabs)); return extendNative({onUrlChange}); function onUrlChange(fn) { @@ -48,7 +47,7 @@ const navigatorUtil = (() => { ) { return Promise.resolve(); } - return tabGet(data.tabId) + return browser.tabs.get(data.tabId) .then(tab => { if (tab.url === 'chrome://newtab/') { data.url = tab.url; diff --git a/background/sync.js b/background/sync.js index ca9bab90..cb03f4f0 100644 --- a/background/sync.js +++ b/background/sync.js @@ -192,6 +192,7 @@ const sync = (() => { .catch(handle401Error) .then(() => syncNow()), err => { + status.errorMessage = err ? err.message : null; // FIXME: should we move this logic to options.js? if (err && !fromPref) { console.error(err); diff --git a/background/token-manager.js b/background/token-manager.js index 0b0fd3e0..8be21874 100644 --- a/background/token-manager.js +++ b/background/token-manager.js @@ -1,9 +1,11 @@ -/* global chromeLocal promisify FIREFOX */ +/* global chromeLocal promisifyChrome FIREFOX */ /* exported tokenManager */ 'use strict'; const tokenManager = (() => { - const launchWebAuthFlow = promisify(chrome.identity.launchWebAuthFlow.bind(chrome.identity)); + promisifyChrome({ + identity: ['launchWebAuthFlow'], + }); const AUTH = { dropbox: { flow: 'token', @@ -158,7 +160,7 @@ const tokenManager = (() => { Object.assign(query, provider.authQuery); } const url = `${provider.authURL}?${stringifyQuery(query)}`; - return launchWebAuthFlow({ + return browser.identity.launchWebAuthFlow({ url, interactive }) diff --git a/background/usercss-helper.js b/background/usercss-helper.js index ea083ae9..3f6081f6 100644 --- a/background/usercss-helper.js +++ b/background/usercss-helper.js @@ -1,8 +1,7 @@ -/* global API_METHODS usercss styleManager deepCopy openURL download URLS getTab */ -/* exports usercssHelper */ +/* global API_METHODS usercss styleManager deepCopy openURL download URLS */ +/* exported usercssHelper */ 'use strict'; -// eslint-disable-next-line no-unused-vars const usercssHelper = (() => { const installCodeCache = {}; const clearInstallCode = url => delete installCodeCache[url]; @@ -46,7 +45,7 @@ const usercssHelper = (() => { openInstallerPage(tabId, url, {code, inTab} = {}) { const newUrl = `${URLS.installUsercss}?updateUrl=${encodeURIComponent(url)}`; if (inTab) { - getTab(tabId).then(tab => + browser.tabs.get(tabId).then(tab => openURL({ url: `${newUrl}&tabId=${tabId}`, active: tab.active, diff --git a/content/style-injector.js b/content/style-injector.js index 96755c73..5c9fffd0 100644 --- a/content/style-injector.js +++ b/content/style-injector.js @@ -19,90 +19,91 @@ self.createStyleInjector = self.INJECTED === 1 ? self.createStyleInjector : ({ let isTransitionPatched; // will store the original method refs because the page can override them let creationDoc, createElement, createElementNS; + return { - apply, - clear, - clearOrphans, - remove, - replace, - toggle, + list, + + apply(styleMap) { + const styles = _styleMapToArray(styleMap); + return ( + !styles.length ? + Promise.resolve([]) : + docRootObserver.evade(() => { + if (!isTransitionPatched && isEnabled) { + _applyTransitionPatch(styles); + } + return styles.map(_addUpdate); + }) + ).then(_emitUpdate); + }, + + clear() { + _addRemoveElements(false); + list.length = 0; + table.clear(); + _emitUpdate(); + }, + + clearOrphans() { + for (const el of document.querySelectorAll(`style[id^="${PREFIX}"].stylus`)) { + const id = el.id.slice(PREFIX.length); + if (/^\d+$/.test(id) || id === PATCH_ID) { + el.remove(); + } + } + }, + + remove(id) { + _remove(id); + _emitUpdate(); + }, + + replace(styleMap) { + const styles = _styleMapToArray(styleMap); + const added = new Set(styles.map(s => s.id)); + const removed = []; + for (const style of list) { + if (!added.has(style.id)) { + removed.push(style.id); + } + } + styles.forEach(_addUpdate); + removed.forEach(_remove); + _emitUpdate(); + }, + + toggle(enable) { + if (isEnabled === enable) return; + isEnabled = enable; + if (!enable) _toggleObservers(false); + _addRemoveElements(enable); + if (enable) _toggleObservers(true); + }, }; - function apply(styleMap) { - const styles = _styleMapToArray(styleMap); - return !styles.length ? - Promise.resolve([]) : - docRootObserver.evade(() => { - if (!isTransitionPatched) _applyTransitionPatch(styles); - const els = styles.map(_apply); - _emitUpdate(); - return els; - }); - } - - function clear() { - for (const style of list) { - style.el.remove(); + function _add(style) { + const el = style.el = _createStyle(style.id, style.code); + const i = list.findIndex(item => compare(item, style) > 0); + table.set(style.id, style); + if (isEnabled) { + document.documentElement.insertBefore(el, i < 0 ? null : list[i].el); } - list.length = 0; - table.clear(); - _emitUpdate(); + list.splice(i < 0 ? list.length : i, 0, style); + return el; } - function clearOrphans() { - for (const el of document.querySelectorAll(`style[id^="${PREFIX}"].stylus`)) { - const id = el.id.slice(PREFIX.length); - if (/^\d+$/.test(id) || id === PATCH_ID) { + function _addRemoveElements(add) { + for (const {el} of list) { + if (add) { + document.documentElement.appendChild(el); + } else { el.remove(); } } } - function remove(id) { - _remove(id); - _emitUpdate(); - } - - function replace(styleMap) { - const styles = _styleMapToArray(styleMap); - const added = new Set(styles.map(s => s.id)); - const removed = []; - for (const style of list) { - if (!added.has(style.id)) { - removed.push(style.id); - } - } - styles.forEach(_apply); - removed.forEach(_remove); - _emitUpdate(); - } - - function toggle(_enabled) { - if (isEnabled === _enabled) return; - isEnabled = _enabled; - for (const style of list) { - style.el.disabled = !isEnabled; - } - } - - function _add(style) { - const el = style.el = _createStyle(style.id, style.code); - table.set(style.id, style); - const nextIndex = list.findIndex(i => compare(i, style) > 0); - if (nextIndex < 0) { - document.documentElement.appendChild(el); - list.push(style); - } else { - document.documentElement.insertBefore(el, list[nextIndex].el); - list.splice(nextIndex, 0, style); - } - // moving an element resets its 'disabled' state - el.disabled = !isEnabled; - return el; - } - - function _apply(style) { + function _addUpdate(style) { return table.has(style.id) ? _update(style) : _add(style); } @@ -151,15 +152,16 @@ self.createStyleInjector = self.INJECTED === 1 ? self.createStyleInjector : ({ return el; } - function _emitUpdate() { - if (!IS_OWN_PAGE && list.length) { - docRewriteObserver.start(); - docRootObserver.start(); - } else { - docRewriteObserver.stop(); - docRootObserver.stop(); - } + function _toggleObservers(shouldStart) { + const onOff = shouldStart && isEnabled ? 'start' : 'stop'; + docRewriteObserver[onOff](); + docRootObserver[onOff](); + } + + function _emitUpdate(value) { + _toggleObservers(!IS_OWN_PAGE && list.length); onUpdate(); + return value; } /* @@ -193,11 +195,7 @@ self.createStyleInjector = self.INJECTED === 1 ? self.createStyleInjector : ({ function _sort() { docRootObserver.evade(() => { list.sort(compare); - for (const style of list) { - // moving an element resets its 'disabled' state - document.documentElement.appendChild(style.el); - style.el.disabled = !isEnabled; - } + _addRemoveElements(true); }); } @@ -241,13 +239,13 @@ self.createStyleInjector = self.INJECTED === 1 ? self.createStyleInjector : ({ if (isChromePre65) { const oldEl = style.el; style.el = _createStyle(id, code); - oldEl.parentNode.insertBefore(style.el, oldEl.nextSibling); - oldEl.remove(); + if (isEnabled) { + oldEl.parentNode.insertBefore(style.el, oldEl.nextSibling); + oldEl.remove(); + } } else { style.el.textContent = code; } - // https://github.com/openstyles/stylus/issues/693 - style.el.disabled = !isEnabled; } function RewriteObserver(onChange) { diff --git a/edit.html b/edit.html index 72a2c45c..12614c99 100644 --- a/edit.html +++ b/edit.html @@ -64,7 +64,6 @@ - diff --git a/edit/beautify.js b/edit/beautify.js index 5a6048a3..0f097fce 100644 --- a/edit/beautify.js +++ b/edit/beautify.js @@ -1,8 +1,49 @@ /* global loadScript css_beautify showHelp prefs t $ $create */ -/* exported beautify */ +/* global editor createHotkeyInput moveFocus CodeMirror */ +/* exported initBeautifyButton */ 'use strict'; -function beautify(scope) { +const HOTKEY_ID = 'editor.beautify.hotkey'; + +prefs.initializing.then(() => { + CodeMirror.defaults.extraKeys[prefs.get(HOTKEY_ID) || ''] = 'beautify'; + CodeMirror.commands.beautify = cm => { + // using per-section mode when code editor or applies-to block is focused + const isPerSection = cm.display.wrapper.parentElement.contains(document.activeElement); + beautify(isPerSection ? [cm] : editor.getEditors(), false); + }; +}); + +prefs.subscribe([HOTKEY_ID], (key, value) => { + const {extraKeys} = CodeMirror.defaults; + for (const [key, cmd] of Object.entries(extraKeys)) { + if (cmd === 'beautify') { + delete extraKeys[key]; + break; + } + } + if (value) { + extraKeys[value] = 'beautify'; + } +}); + +/** + * @param {HTMLElement} btn - the button element shown in the UI + * @param {function():CodeMirror[]} getScope + */ +function initBeautifyButton(btn, getScope) { + btn.addEventListener('click', () => beautify(getScope())); + btn.addEventListener('contextmenu', e => { + e.preventDefault(); + beautify(getScope(), false); + }); +} + +/** + * @param {CodeMirror[]} scope + * @param {?boolean} ui + */ +function beautify(scope, ui = true) { loadScript('/vendor-overwrites/beautify/beautify-css-mod.js') .then(() => { if (!window.css_beautify && window.exports) { @@ -19,7 +60,41 @@ function beautify(scope) { } options.indent_size = tabs ? 1 : prefs.get('editor.tabSize'); options.indent_char = tabs ? '\t' : ' '; + if (ui) { + createBeautifyUI(scope, options); + } + for (const cm of scope) { + setTimeout(doBeautifyEditor, 0, cm, options); + } + } + function doBeautifyEditor(cm, options) { + const pos = options.translate_positions = + [].concat.apply([], cm.doc.sel.ranges.map(r => + [Object.assign({}, r.anchor), Object.assign({}, r.head)])); + const text = cm.getValue(); + const newText = css_beautify(text, options); + if (newText !== text) { + if (!cm.beautifyChange || !cm.beautifyChange[cm.changeGeneration()]) { + // clear the list if last change wasn't a css-beautify + cm.beautifyChange = {}; + } + cm.setValue(newText); + const selections = []; + for (let i = 0; i < pos.length; i += 2) { + selections.push({anchor: pos[i], head: pos[i + 1]}); + } + const {scrollX, scrollY} = window; + cm.setSelections(selections); + window.scrollTo(scrollX, scrollY); + cm.beautifyChange[cm.changeGeneration()] = true; + if (ui) { + $('#help-popup button[role="close"]').disabled = false; + } + } + } + + function createBeautifyUI(scope, options) { showHelp(t('styleBeautify'), $create([ $create('.beautify-options', [ @@ -32,6 +107,10 @@ function beautify(scope) { $createLabeledCheckbox('preserve_newlines', 'styleBeautifyPreserveNewlines'), $createLabeledCheckbox('indent_conditional', 'styleBeautifyIndentConditional'), ]), + $create('p.beautify-hint', [ + $create('span', t('styleBeautifyHint') + '\u00A0'), + createHotkeyInput(HOTKEY_ID, () => moveFocus($('#help-popup'), 1)), + ]), $create('.buttons', [ $create('button', { attributes: {role: 'close'}, @@ -60,32 +139,6 @@ function beautify(scope) { $('#help-popup').className = 'wide'; - scope.forEach(cm => { - setTimeout(() => { - const pos = options.translate_positions = - [].concat.apply([], cm.doc.sel.ranges.map(r => - [Object.assign({}, r.anchor), Object.assign({}, r.head)])); - const text = cm.getValue(); - const newText = css_beautify(text, options); - if (newText !== text) { - if (!cm.beautifyChange || !cm.beautifyChange[cm.changeGeneration()]) { - // clear the list if last change wasn't a css-beautify - cm.beautifyChange = {}; - } - cm.setValue(newText); - const selections = []; - for (let i = 0; i < pos.length; i += 2) { - selections.push({anchor: pos[i], head: pos[i + 1]}); - } - const {scrollX, scrollY} = window; - cm.setSelections(selections); - window.scrollTo(scrollX, scrollY); - cm.beautifyChange[cm.changeGeneration()] = true; - $('#help-popup button[role="close"]').disabled = false; - } - }); - }); - $('.beautify-options').onchange = ({target}) => { const value = target.type === 'checkbox' ? target.checked : target.selectedIndex > 0; prefs.set('editor.beautify', Object.assign(options, {[target.dataset.option]: value})); diff --git a/edit/codemirror-default.css b/edit/codemirror-default.css index 61dd10f2..6adbf962 100644 --- a/edit/codemirror-default.css +++ b/edit/codemirror-default.css @@ -18,6 +18,12 @@ outline: -webkit-focus-ring-color auto 5px; outline-offset: -2px; } +.CodeMirror-bookmark { + background: linear-gradient(to right, currentColor, transparent); + position: absolute; + width: 2em; + opacity: .5; +} @supports (-moz-appearance:none) { /* restrict to FF */ .CodeMirror-focused { diff --git a/edit/codemirror-default.js b/edit/codemirror-default.js index 882390d5..6d97573d 100644 --- a/edit/codemirror-default.js +++ b/edit/codemirror-default.js @@ -8,6 +8,8 @@ prefs.reset('editor.keyMap'); } + const CM_BOOKMARK = 'CodeMirror-bookmark'; + const CM_BOOKMARK_GUTTER = CM_BOOKMARK + 'gutter'; const defaults = { autoCloseBrackets: prefs.get('editor.autoCloseBrackets'), mode: 'css', @@ -15,6 +17,7 @@ lineWrapping: prefs.get('editor.lineWrapping'), foldGutter: true, gutters: [ + CM_BOOKMARK_GUTTER, 'CodeMirror-linenumbers', 'CodeMirror-foldgutter', ...(prefs.get('editor.linter') ? ['CodeMirror-lint-markers'] : []), @@ -102,92 +105,19 @@ } Object.assign(CodeMirror.mimeModes['text/css'].propertyKeywords, { - // CSS Backgrounds and Borders Module L4 'background-position-x': true, 'background-position-y': true, - - // CSS Logical Properties and Values L1 - 'block-size': true, - 'border-block-color': true, - 'border-block-end': true, - 'border-block-end-color': true, - 'border-block-end-style': true, - 'border-block-end-width': true, - 'border-block-start': true, - 'border-block-start-color': true, - 'border-block-start-style': true, - 'border-block-start-width': true, - 'border-block-style': true, - 'border-block-width': true, - 'border-inline-color': true, - 'border-inline-end': true, - 'border-inline-end-color': true, - 'border-inline-end-style': true, - 'border-inline-end-width': true, - 'border-inline-start': true, - 'border-inline-start-color': true, - 'border-inline-start-style': true, - 'border-inline-start-width': true, - 'border-inline-style': true, - 'border-inline-width': true, - 'inline-size': true, - 'inset': true, - 'inset-block': true, - 'inset-block-end': true, - 'inset-block-start': true, - 'inset-inline': true, - 'inset-inline-end': true, - 'inset-inline-start': true, - 'margin-block': true, - 'margin-block-end': true, - 'margin-block-start': true, - 'margin-inline': true, - 'margin-inline-end': true, - 'margin-inline-start': true, - 'max-block-size': true, - 'max-inline-size': true, - 'min-block-size': true, - 'min-inline-size': true, - 'padding-block': true, - 'padding-block-end': true, - 'padding-block-start': true, - 'padding-inline': true, - 'padding-inline-end': true, - 'padding-inline-start': true, - 'text-align-all': true, - 'contain': true, 'mask-image': true, 'mix-blend-mode': true, + 'overscroll-behavior': true, 'rotate': true, 'isolation': true, - 'zoom': true, - - // https://www.w3.org/TR/css-round-display-1/ - 'border-boundary': true, - 'shape': true, - 'shape-inside': true, - 'viewport-fit': true, - - // nonstandard https://compat.spec.whatwg.org/ - 'box-reflect': true, - 'text-fill-color': true, - 'text-stroke': true, - 'text-stroke-color': true, - 'text-stroke-width': true, - // end - }); - Object.assign(CodeMirror.mimeModes['text/css'].valueKeywords, { - 'isolate': true, - 'rect': true, - 'recto': true, - 'verso': true, }); Object.assign(CodeMirror.mimeModes['text/css'].colorKeywords, { 'darkgrey': true, 'darkslategrey': true, 'dimgrey': true, - 'grey': true, 'lightgrey': true, 'lightslategrey': true, 'slategrey': true, @@ -242,22 +172,27 @@ CodeMirror.commands[name] = (...args) => editor[name](...args); } - // speedup: reuse the old folding marks - // TODO: remove when https://github.com/codemirror/CodeMirror/pull/6010 is shipped in /vendor - const {setGutterMarker} = CodeMirror.prototype; - CodeMirror.prototype.setGutterMarker = function (line, gutterID, value) { - const o = this.state.foldGutter.options; - if (typeof o.indicatorOpen === 'string' || - typeof o.indicatorFolded === 'string') { - const old = line.gutterMarkers && line.gutterMarkers[gutterID]; - // old className can contain other names set by CodeMirror so we'll use classList - if (old && value && old.classList.contains(value.className) || - !old && !value) { - return line; - } + const elBookmark = document.createElement('div'); + elBookmark.className = CM_BOOKMARK; + elBookmark.textContent = '\u00A0'; + const clearMarker = function () { + const line = this.lines[0]; + CodeMirror.TextMarker.prototype.clear.apply(this); + if (!line.markedSpans.some(span => span.marker.sublimeBookmark)) { + this.doc.setGutterMarker(line, CM_BOOKMARK_GUTTER, null); } - return setGutterMarker.apply(this, arguments); }; + const {markText} = CodeMirror.prototype; + Object.assign(CodeMirror.prototype, { + markText() { + const marker = markText.apply(this, arguments); + if (marker.sublimeBookmark) { + this.doc.setGutterMarker(marker.lines[0], CM_BOOKMARK_GUTTER, elBookmark.cloneNode(true)); + marker.clear = clearMarker; + } + return marker; + }, + }); // CodeMirror convenience commands Object.assign(CodeMirror.commands, { @@ -307,6 +242,7 @@ CodeMirror.hint && (() => { const RX_IMPORTANT = /(i(m(p(o(r(t(a(nt?)?)?)?)?)?)?)?)?(?=\b|\W|$)/iy; const RX_VAR_KEYWORD = /(^|[^-\w\u0080-\uFFFF])var\(/iy; const RX_END_OF_VAR = /[\s,)]|$/g; + const RX_CONSUME_PROP = /[-\w]*\s*:\s?|$/y; const originalHelper = CodeMirror.hint.css || (() => {}); const helper = cm => { @@ -372,7 +308,15 @@ CodeMirror.hint && (() => { } if (!editor || !style || !style.includes(USO_VAR)) { - return originalHelper(cm); + // add ":" after a property name + const res = originalHelper(cm); + const state = res && cm.getTokenAt(pos).state.state; + if (state === 'block' || state === 'maybeprop') { + res.list = res.list.map(str => str + ': '); + RX_CONSUME_PROP.lastIndex = res.to.ch; + res.to.ch += RX_CONSUME_PROP.exec(text)[0].length; + } + return res; } // USO vars in usercss mode editor diff --git a/edit/colorpicker-helper.js b/edit/colorpicker-helper.js index cae28510..9736ab00 100644 --- a/edit/colorpicker-helper.js +++ b/edit/colorpicker-helper.js @@ -1,4 +1,4 @@ -/* global CodeMirror showHelp cmFactory onDOMready $ $create prefs t */ +/* global CodeMirror showHelp cmFactory onDOMready $ prefs t createHotkeyInput */ 'use strict'; (() => { @@ -62,46 +62,8 @@ function configureColorpicker(event) { event.preventDefault(); - const input = $create('input', { - type: 'search', - spellcheck: false, - value: prefs.get('editor.colorpicker.hotkey'), - onkeydown(event) { - event.preventDefault(); - event.stopPropagation(); - const key = CodeMirror.keyName(event); - switch (key) { - case 'Enter': - if (this.checkValidity()) { - $('#help-popup .dismiss').onclick(); - } - return; - case 'Esc': - $('#help-popup .dismiss').onclick(); - return; - default: - // disallow: [Shift?] characters, modifiers-only, [modifiers?] + Esc, Tab, nav keys - if (!key || new RegExp('^(' + [ - '(Back)?Space', - '(Shift-)?.', // a single character - '(Shift-?|Ctrl-?|Alt-?|Cmd-?){0,2}(|Esc|Tab|(Page)?(Up|Down)|Left|Right|Home|End|Insert|Delete)', - ].join('|') + ')$', 'i').test(key)) { - this.value = key || this.value; - this.setCustomValidity('Not allowed'); - return; - } - } - this.value = key; - this.setCustomValidity(''); - prefs.set('editor.colorpicker.hotkey', key); - }, - oninput() { - // fired on pressing "x" to clear the field - prefs.set('editor.colorpicker.hotkey', ''); - }, - onpaste(event) { - event.preventDefault(); - } + const input = createHotkeyInput('editor.colorpicker.hotkey', () => { + $('#help-popup .dismiss').onclick(); }); const popup = showHelp(t('helpKeyMapHotkey'), input); if (this instanceof Element) { diff --git a/edit/edit.css b/edit/edit.css index 7b8d4bc5..3635fa61 100644 --- a/edit/edit.css +++ b/edit/edit.css @@ -267,6 +267,10 @@ input:invalid { margin-top: 4em; } /************ section editor ***********/ +.CodeMirror-vscrollbar, +.CodeMirror-hscrollbar { + pointer-events: auto !important; /* FF bug */ +} .section-editor .section { margin: 0 0.7rem; padding: 1rem; @@ -775,6 +779,11 @@ body:not(.find-open) [data-match-highlight-count="1"] .CodeMirror-selection-high padding-left: 4px; margin-left: 4px; } +.beautify-hint { + width: 0; + min-width: 100%; + font-size: 90%; +} /************ single editor **************/ .usercss body { diff --git a/edit/edit.js b/edit/edit.js index 56685eb2..7d3b49d4 100644 --- a/edit/edit.js +++ b/edit/edit.js @@ -1,7 +1,7 @@ /* global CodeMirror onDOMready prefs setupLivePrefs $ $$ $create t tHTML - createSourceEditor queryTabs sessionStorageHash getOwnTab FIREFOX API tryCatch + createSourceEditor sessionStorageHash getOwnTab FIREFOX API tryCatch closeCurrentTab messageBox debounce workerUtil - beautify ignoreChromeError + initBeautifyButton ignoreChromeError moveFocus msg createSectionsEditor rerouteHotkeys CODEMIRROR_THEMES */ /* exported showCodeMirrorPopup editorWorker toggleContextMenuDelete */ 'use strict'; @@ -170,12 +170,21 @@ preinit(); $('#heading').textContent = t(style.id ? 'editStyleHeading' : 'addStyleTitle'); $('#name').placeholder = t(usercss ? 'usercssEditorNamePlaceholder' : 'styleMissingName'); $('#name').title = usercss ? t('usercssReplaceTemplateName') : ''; - $('#preview-label').classList.toggle('hidden', !style.id); - - $('#beautify').onclick = () => beautify(editor.getEditors()); + initBeautifyButton($('#beautify'), () => editor.getEditors()); + const {onBoundsChanged} = chrome.windows || {}; + if (onBoundsChanged) { + // * movement is reported even if the window wasn't resized + // * fired just once when done so debounce is not needed + onBoundsChanged.addListener(wnd => { + // getting the current window id as it may change if the user attached/detached the tab + chrome.windows.getCurrent(ownWnd => { + if (wnd.id === ownWnd.id) rememberWindowSize(); + }); + }); + } window.addEventListener('resize', () => { - debounce(rememberWindowSize, 100); + if (!onBoundsChanged) debounce(rememberWindowSize, 100); detectLayout(); }); detectLayout(); @@ -217,7 +226,7 @@ function preinit() { }).observe(document, {subtree: true, childList: true}); if (chrome.windows) { - queryTabs({currentWindow: true}).then(tabs => { + browser.tabs.query({currentWindow: true}).then(tabs => { const windowId = tabs[0].windowId; if (prefs.get('openEditInWindow')) { if ( diff --git a/edit/global-search.css b/edit/global-search.css index 4c84c0e0..0fcd9a2d 100644 --- a/edit/global-search.css +++ b/edit/global-search.css @@ -61,7 +61,7 @@ border: none; background-color: white; font-weight: bold; - white-space: nowrap; + white-space: pre; /* issue #1000 */ color: currentColor; /* use the current theme's color instead of UserAgent's CSS */ flex: 1; } diff --git a/edit/global-search.js b/edit/global-search.js index 349b8ac1..ad46a4cc 100644 --- a/edit/global-search.js +++ b/edit/global-search.js @@ -1,4 +1,4 @@ -/* global CodeMirror focusAccessibility colorMimicry editor +/* global CodeMirror focusAccessibility colorMimicry editor chromeLocal onDOMready $ $$ $create t debounce tryRegExp stringAsRegExp template */ 'use strict'; @@ -915,7 +915,7 @@ onDOMready().then(() => { function readStorage() { - chrome.storage.local.get('editor', ({editor = {}}) => { + chromeLocal.getValue('editor').then((editor = {}) => { state.find = editor.find || ''; state.replace = editor.replace || ''; state.icase = editor.icase || state.icase; @@ -924,14 +924,12 @@ onDOMready().then(() => { function writeStorage() { - chrome.storage.local.get('editor', ({editor}) => - chrome.storage.local.set({ - editor: Object.assign(editor || {}, { - find: state.find, - replace: state.replace, - icase: state.icase, - }) - })); + chromeLocal.getValue('editor').then((editor = {}) => + chromeLocal.setValue('editor', Object.assign(editor, { + find: state.find, + replace: state.replace, + icase: state.icase, + }))); } diff --git a/edit/regexp-tester.js b/edit/regexp-tester.js index 590714d3..8f001102 100644 --- a/edit/regexp-tester.js +++ b/edit/regexp-tester.js @@ -1,4 +1,4 @@ -/* global showHelp $ $create tryRegExp queryTabs URLS t template openURL */ +/* global showHelp $ $create tryRegExp URLS t template openURL */ /* exported regExpTester */ 'use strict'; @@ -66,7 +66,7 @@ const regExpTester = (() => { return rxData; }); const getMatchInfo = m => m && {text: m[0], pos: m.index}; - queryTabs({}).then(tabs => { + browser.tabs.query({}).then(tabs => { const supported = tabs.map(tab => tab.url) .filter(url => URLS.supported(url)); const unique = [...new Set(supported).values()]; diff --git a/edit/reroute-hotkeys.js b/edit/reroute-hotkeys.js index 83f57720..8e148b73 100644 --- a/edit/reroute-hotkeys.js +++ b/edit/reroute-hotkeys.js @@ -12,6 +12,7 @@ const rerouteHotkeys = (() => { 'toggleEditorFocus', 'find', 'findNext', 'findPrev', 'replace', 'replaceAll', 'colorpicker', + 'beautify', ]); return rerouteHotkeys; diff --git a/edit/sections-editor-section.js b/edit/sections-editor-section.js index 67880a35..8885cfc6 100644 --- a/edit/sections-editor-section.js +++ b/edit/sections-editor-section.js @@ -1,5 +1,5 @@ /* global template cmFactory $ propertyToCss CssToProperty linter regExpTester - FIREFOX toggleContextMenuDelete beautify showHelp t tryRegExp */ + FIREFOX toggleContextMenuDelete initBeautifyButton showHelp t tryRegExp */ /* exported createSection */ 'use strict'; @@ -94,6 +94,7 @@ function createSection({ const cm = cmFactory.create(wrapper => { el.insertBefore(wrapper, $('.code-label', el).nextSibling); }, {value: originalSection.code}); + el.CodeMirror = cm; // used by getAssociatedEditor const changeListeners = new Set(); @@ -196,12 +197,12 @@ function createSection({ $('.clone-section', el).addEventListener('click', () => insertSectionAfter(getModel(), section)); $('.move-section-up', el).addEventListener('click', () => moveSectionUp(section)); $('.move-section-down', el).addEventListener('click', () => moveSectionDown(section)); - $('.beautify-section', el).addEventListener('click', () => beautify([cm])); $('.restore-section', el).addEventListener('click', () => restoreSection(section)); $('.test-regexp', el).addEventListener('click', () => { regExpTester.toggle(); updateRegexpTester(); }); + initBeautifyButton($('.beautify-section', el), () => [cm]); } function handleKeydown(cm, event) { diff --git a/edit/sections-editor.js b/edit/sections-editor.js index c4b7cab3..bcf95148 100644 --- a/edit/sections-editor.js +++ b/edit/sections-editor.js @@ -34,7 +34,8 @@ function createSectionsEditor({style, onTitleChanged}) { $('#from-mozilla').addEventListener('click', () => showMozillaFormatImport()); $('#save-button').addEventListener('click', saveStyle); - document.addEventListener('wheel', scrollEntirePageOnCtrlShift); + document.addEventListener('wheel', scrollEntirePageOnCtrlShift, {passive: false}); + CodeMirror.defaults.extraKeys['Shift-Ctrl-Wheel'] = 'scrollWindow'; if (!FIREFOX) { $$([ @@ -154,9 +155,7 @@ function createSectionsEditor({style, onTitleChanged}) { function closestVisible(nearbyElement) { const cm = nearbyElement instanceof CodeMirror ? nearbyElement : - nearbyElement instanceof Node && - (nearbyElement.closest('#sections > .section') || {}).CodeMirror || - getLastActivatedEditor(); + nearbyElement instanceof Node && getAssociatedEditor(nearbyElement) || getLastActivatedEditor(); if (nearbyElement instanceof Node && cm) { const {left, top} = nearbyElement.getBoundingClientRect(); const bounds = cm.display.wrapper.getBoundingClientRect(); @@ -228,6 +227,15 @@ function createSectionsEditor({style, onTitleChanged}) { } } + function getAssociatedEditor(nearbyElement) { + for (let el = nearbyElement; el; el = el.parentElement) { + // added by createSection + if (el.CodeMirror) { + return el.CodeMirror; + } + } + } + function getEditors() { return sections.filter(s => !s.isRemoved()).map(s => s.cm); } diff --git a/edit/show-keymap-help.js b/edit/show-keymap-help.js index 62481787..66cf08ea 100644 --- a/edit/show-keymap-help.js +++ b/edit/show-keymap-help.js @@ -10,7 +10,6 @@ function showKeyMapHelp() { const keyMap = mergeKeyMaps({}, prefs.get('editor.keyMap'), CodeMirror.defaults.extraKeys); const keyMapSorted = Object.keys(keyMap) .map(key => ({key, cmd: keyMap[key]})) - .concat([{key: 'Shift-Ctrl-Wheel', cmd: 'scrollWindow'}]) .sort((a, b) => (a.cmd < b.cmd || (a.cmd === b.cmd && a.key < b.key) ? -1 : 1)); const table = template.keymapHelp.cloneNode(true); const tBody = table.tBodies[0]; diff --git a/edit/util.js b/edit/util.js index cc18b515..772292fc 100644 --- a/edit/util.js +++ b/edit/util.js @@ -1,4 +1,5 @@ -/* exported dirtyReporter memoize clipString sectionsToMozFormat */ +/* global CodeMirror $create prefs */ +/* exported dirtyReporter memoize clipString sectionsToMozFormat createHotkeyInput */ 'use strict'; function dirtyReporter() { @@ -135,3 +136,52 @@ function memoize(fn) { return result; }; } + +/** + * @param {!string} prefId + * @param {?function(isEnter:boolean)} onDone + */ +function createHotkeyInput(prefId, onDone = () => {}) { + return $create('input', { + type: 'search', + spellcheck: false, + value: prefs.get(prefId), + onkeydown(event) { + const key = CodeMirror.keyName(event); + if (key === 'Tab' || key === 'Shift-Tab') { + return; + } + event.preventDefault(); + event.stopPropagation(); + switch (key) { + case 'Enter': + if (this.checkValidity()) onDone(true); + return; + case 'Esc': + onDone(false); + return; + default: + // disallow: [Shift?] characters, modifiers-only, [modifiers?] + Esc, Tab, nav keys + if (!key || new RegExp('^(' + [ + '(Back)?Space', + '(Shift-)?.', // a single character + '(Shift-?|Ctrl-?|Alt-?|Cmd-?){0,2}(|Esc|Tab|(Page)?(Up|Down)|Left|Right|Home|End|Insert|Delete)', + ].join('|') + ')$', 'i').test(key)) { + this.value = key || this.value; + this.setCustomValidity('Not allowed'); + return; + } + } + this.value = key; + this.setCustomValidity(''); + prefs.set(prefId, key); + }, + oninput() { + // fired on pressing "x" to clear the field + prefs.set(prefId, ''); + }, + onpaste(event) { + event.preventDefault(); + } + }); +} diff --git a/install-usercss.html b/install-usercss.html index 6824d571..88e1efe4 100644 --- a/install-usercss.html +++ b/install-usercss.html @@ -10,7 +10,6 @@ - diff --git a/install-usercss/install-usercss.js b/install-usercss/install-usercss.js index 57e42228..38ad86e5 100644 --- a/install-usercss/install-usercss.js +++ b/install-usercss/install-usercss.js @@ -405,13 +405,9 @@ } }); port.onDisconnect.addListener(() => { - chrome.tabs.get(tabId, tab => { - if (chrome.runtime.lastError) { - closeCurrentTab(); - } else if (tab.url === initialUrl) { - location.reload(); - } - }); + browser.tabs.get(tabId) + .then(tab => tab.url === initialUrl && location.reload()) + .catch(closeCurrentTab); }); return ({timer = true} = {}) => new Promise((resolve, reject) => { const id = performance.now(); diff --git a/js/dom.js b/js/dom.js index 293b3878..d8cf853e 100644 --- a/js/dom.js +++ b/js/dom.js @@ -85,6 +85,27 @@ onDOMready().then(() => { // set language for CSS :lang and [FF-only] hyphenation document.documentElement.setAttribute('lang', chrome.i18n.getUILanguage()); +// avoid adding # to the page URL when clicking dummy links +document.addEventListener('click', e => { + if (e.target.closest('a[href="#"]')) { + e.preventDefault(); + } +}); +// update inputs on mousewheel when focused +document.addEventListener('wheel', event => { + const el = document.activeElement; + if (!el || el !== event.target && !el.contains(event.target)) { + return; + } + if (el.tagName === 'SELECT') { + el.selectedIndex = Math.max(0, Math.min(el.length - 1, el.selectedIndex + Math.sign(event.deltaY))); + event.preventDefault(); + } + event.stopImmediatePropagation(); +}, { + capture: true, + passive: false, +}); function onDOMready() { if (document.readyState !== 'loading') { diff --git a/js/messaging.js b/js/messaging.js index 93a4e5a7..642b20dc 100644 --- a/js/messaging.js +++ b/js/messaging.js @@ -1,18 +1,16 @@ /* exported getTab getActiveTab onTabReady stringAsRegExp openURL ignoreChromeError getStyleWithNoCode tryRegExp sessionStorageHash download deepEqual closeCurrentTab capitalize CHROME_HAS_BORDER_BUG */ -/* global promisify */ +/* global promisifyChrome */ 'use strict'; -const CHROME = Boolean(chrome.app) && parseInt(navigator.userAgent.match(/Chrom\w+\/(?:\d+\.){2}(\d+)|$/)[1]); +const CHROME = Boolean(chrome.app) && parseInt(navigator.userAgent.match(/Chrom\w+\/(\d+)|$/)[1]); const OPERA = Boolean(chrome.app) && parseFloat(navigator.userAgent.match(/\bOPR\/(\d+\.\d+)|$/)[1]); const VIVALDI = Boolean(chrome.app) && navigator.userAgent.includes('Vivaldi'); -// FIXME: who use this? -// const ANDROID = !chrome.windows; let FIREFOX = !chrome.app && parseFloat(navigator.userAgent.match(/\bFirefox\/(\d+\.\d+)|$/)[1]); // see PR #781 -const CHROME_HAS_BORDER_BUG = CHROME >= 3167 && CHROME <= 3704; +const CHROME_HAS_BORDER_BUG = CHROME >= 62 && CHROME <= 74; if (!CHROME && !chrome.browserAction.openPopup) { // in FF pre-57 legacy addons can override useragent so we assume the worst @@ -62,7 +60,7 @@ const URLS = { // Chrome 61.0.3161+ doesn't run content scripts on NTP https://crrev.com/2978953002/ // TODO: remove when "minimum_chrome_version": "61" or higher - chromeProtectsNTP: CHROME >= 3161, + chromeProtectsNTP: CHROME >= 61, userstylesOrgJson: 'https://userstyles.org/styles/chrome/', @@ -95,33 +93,20 @@ if (IS_BG) { // Object.defineProperty(window, 'localStorage', {value: {}}); // Object.defineProperty(window, 'sessionStorage', {value: {}}); -const createTab = promisify(chrome.tabs.create.bind(chrome.tabs)); -const queryTabs = promisify(chrome.tabs.query.bind(chrome.tabs)); -const updateTab = promisify(chrome.tabs.update.bind(chrome.tabs)); -const moveTabs = promisify(chrome.tabs.move.bind(chrome.tabs)); - -// Android doesn't have chrome.windows -const updateWindow = chrome.windows && promisify(chrome.windows.update.bind(chrome.windows)); -const createWindow = chrome.windows && promisify(chrome.windows.create.bind(chrome.windows)); +promisifyChrome({ + tabs: ['create', 'get', 'getCurrent', 'move', 'query', 'update'], + windows: ['create', 'update'], // Android doesn't have chrome.windows +}); // FF57+ supports openerTabId, but not in Android // (detecting FF57 by the feature it added, not navigator.ua which may be spoofed in about:config) const openerTabIdSupported = (!FIREFOX || window.AbortController) && chrome.windows != null; -function getTab(id) { - return new Promise(resolve => - chrome.tabs.get(id, tab => - !chrome.runtime.lastError && resolve(tab))); -} - - function getOwnTab() { - return new Promise(resolve => - chrome.tabs.getCurrent(tab => resolve(tab))); + return browser.tabs.getCurrent(); } - function getActiveTab() { - return queryTabs({currentWindow: true, active: true}) + return browser.tabs.query({currentWindow: true, active: true}) .then(tabs => tabs[0]); } @@ -142,7 +127,7 @@ function urlToMatchPattern(url, ignoreSearch) { function findExistingTab({url, currentWindow, ignoreHash = true, ignoreSearch = false}) { url = new URL(url); - return queryTabs({url: urlToMatchPattern(url, ignoreSearch), currentWindow}) + return browser.tabs.query({url: urlToMatchPattern(url, ignoreSearch), currentWindow}) // FIXME: is tab.url always normalized? .then(tabs => tabs.find(matchTab)); @@ -193,8 +178,8 @@ function openURL({ url: url !== tab.url && url.includes('#') ? url : undefined, }); } - if (newWindow && createWindow) { - return createWindow(Object.assign({url}, windowPosition)) + if (newWindow && browser.windows) { + return browser.windows.create(Object.assign({url}, windowPosition)) .then(wnd => wnd.tabs[0]); } return getActiveTab().then((activeTab = {url: ''}) => @@ -207,7 +192,7 @@ function openURL({ if (id != null && !openerTab.incognito && openerTabIdSupported) { options.openerTabId = id; } - return createTab(options); + return browser.tabs.create(options); } } @@ -234,9 +219,9 @@ function activateTab(tab, {url, index, openerTabId} = {}) { options.openerTabId = openerTabId; } return Promise.all([ - updateTab(tab.id, options), - updateWindow && updateWindow(tab.windowId, {focused: true}), - index != null && moveTabs(tab.id, {index}) + browser.tabs.update(tab.id, options), + browser.windows && browser.windows.update(tab.windowId, {focused: true}), + index != null && browser.tabs.move(tab.id, {index}) ]) .then(() => tab); } @@ -381,7 +366,8 @@ function download(url, { body, responseType = 'text', requiredStatusCode = 200, - timeout = 10e3, + timeout = 10e3, // connection timeout + loadTimeout = 2 * 60e3, // data transfer timeout (counted from the first remote response) headers = { 'Content-type': 'application/x-www-form-urlencoded', }, @@ -398,23 +384,41 @@ function download(url, { const usoVars = []; return new Promise((resolve, reject) => { + let xhr; const u = new URL(collapseUsoVars(url)); - if (u.protocol === 'file:' && FIREFOX) { + const onTimeout = () => { + if (xhr) xhr.abort(); + reject(new Error('Timeout fetching ' + u.href)); + }; + let timer = setTimeout(onTimeout, timeout); + const switchTimer = () => { + clearTimeout(timer); + timer = loadTimeout && setTimeout(onTimeout, loadTimeout); + }; + if (u.protocol === 'file:' && FIREFOX) { // TODO: maybe remove this since FF68+ can't do it anymore // https://stackoverflow.com/questions/42108782/firefox-webextensions-get-local-files-content-by-path // FIXME: add FetchController when it is available. - const timer = setTimeout(reject, timeout, new Error('Timeout fetching ' + u.href)); fetch(u.href, {mode: 'same-origin'}) .then(r => { - clearTimeout(timer); + switchTimer(); return r.status === 200 ? r.text() : Promise.reject(r.status); }) .catch(reject) - .then(resolve); + .then(text => { + clearTimeout(timer); + resolve(text); + }); return; } - const xhr = new XMLHttpRequest(); - xhr.timeout = timeout; + xhr = new XMLHttpRequest(); + xhr.onreadystatechange = () => { + if (xhr.readyState >= XMLHttpRequest.HEADERS_RECEIVED) { + xhr.onreadystatechange = null; + switchTimer(); + } + }; xhr.onloadend = event => { + clearTimeout(timer); if (event.type !== 'error' && ( xhr.status === requiredStatusCode || !requiredStatusCode || u.protocol === 'file:')) { diff --git a/js/msg.js b/js/msg.js index f7e6bafd..d52438e4 100644 --- a/js/msg.js +++ b/js/msg.js @@ -1,12 +1,12 @@ -/* global promisify deepCopy */ +/* global promisifyChrome deepCopy */ // deepCopy is only used if the script is executed in extension pages. 'use strict'; self.msg = self.INJECTED === 1 ? self.msg : (() => { - const runtimeSend = promisify(chrome.runtime.sendMessage.bind(chrome.runtime)); - const tabSend = chrome.tabs && promisify(chrome.tabs.sendMessage.bind(chrome.tabs)); - const tabQuery = chrome.tabs && promisify(chrome.tabs.query.bind(chrome.tabs)); - + promisifyChrome({ + runtime: ['sendMessage'], + tabs: ['sendMessage', 'query'], + }); const isBg = chrome.extension.getBackgroundPage && chrome.extension.getBackgroundPage() === window; if (isBg) { window._msg = { @@ -49,19 +49,21 @@ self.msg = self.INJECTED === 1 ? self.msg : (() => { } } if (chrome.runtime.getBackgroundPage) { - return promisify(chrome.runtime.getBackgroundPage.bind(chrome.runtime))() - .catch(() => null); + promisifyChrome({ + runtime: ['getBackgroundPage'], + }); + return browser.runtime.getBackgroundPage().catch(() => null); } return Promise.resolve(null); } function send(data, target = 'extension') { const message = {data, target}; - return runtimeSend(message).then(unwrapData); + return browser.runtime.sendMessage(message).then(unwrapData); } function sendTab(tabId, data, options, target = 'tab') { - return tabSend(tabId, {data, target}, options) + return browser.tabs.sendMessage(tabId, {data, target}, options) .then(unwrapData); } @@ -99,7 +101,7 @@ self.msg = self.INJECTED === 1 ? self.msg : (() => { } function broadcastTab(data, filter, options, ignoreExtension = false, target = 'tab') { - return tabQuery({}) + return browser.tabs.query({}) // TODO: send to activated tabs first? .then(tabs => { const requests = []; @@ -123,7 +125,7 @@ self.msg = self.INJECTED === 1 ? self.msg : (() => { const message = {data: dataObj, target}; if (tab && tab.id) { requests.push( - tabSend(tab.id, message, options) + browser.tabs.sendMessage(tab.id, message, options) .then(unwrapData) .catch(ignoreError) ); diff --git a/js/polyfill.js b/js/polyfill.js index 2b95b10d..3b22c96d 100644 --- a/js/polyfill.js +++ b/js/polyfill.js @@ -3,6 +3,8 @@ // eslint-disable-next-line no-unused-expressions self.INJECTED !== 1 && (() => { + // this part runs in workers, content scripts, our extension pages + if (!Object.entries) { Object.entries = obj => Object.keys(obj).map(k => [k, obj[k]]); } @@ -10,9 +12,38 @@ self.INJECTED !== 1 && (() => { Object.values = obj => Object.keys(obj).map(k => obj[k]); } - // the above was shared by content scripts and workers, - // the rest is only needed for our extension pages - if (!self.chrome || !self.chrome.tabs) return; + // don't use self.chrome. It is undefined in Firefox + if (typeof chrome !== 'object') return; + // the rest is for content scripts and our extension pages + + self.browser = polyfillBrowser(); + + /* Promisifies the specified `chrome` methods into `browser`. + The definitions is an object like this: { + 'storage.sync': ['get', 'set'], // if deeper than one level, combine the path via `.` + windows: ['create', 'update'], // items and sub-objects will only be created if present in `chrome` + } */ + self.promisifyChrome = definitions => { + for (const [scopeName, methods] of Object.entries(definitions)) { + const path = scopeName.split('.'); + const src = path.reduce((obj, p) => obj && obj[p], chrome); + if (!src) continue; + const dst = path.reduce((obj, p) => obj[p] || (obj[p] = {}), browser); + for (const name of methods) { + const fn = src[name]; + if (!fn || dst[name] && !dst[name].isTrap) continue; + dst[name] = (...args) => new Promise((resolve, reject) => + fn.call(src, ...args, (...results) => + chrome.runtime.lastError ? + reject(chrome.runtime.lastError) : + resolve(results.length <= 1 ? results[0] : results))); + // a couple of callbacks have 2 parameters (we don't use those methods, but just in case) + } + } + }; + + if (!chrome.tabs) return; + // the rest is for our extension pages if (typeof document === 'object') { const ELEMENT_METH = { @@ -75,4 +106,27 @@ self.INJECTED !== 1 && (() => { } catch (err) { Object.defineProperty(self, 'sessionStorage', {value: {}}); } + + function polyfillBrowser() { + if (typeof browser === 'object' && browser.runtime) { + return browser; + } + return createTrap(chrome, null); + + function createTrap(base, parent) { + const target = typeof base === 'function' ? () => {} : {}; + target.isTrap = true; + return new Proxy(target, { + get: (target, prop) => { + if (target[prop]) return target[prop]; + if (base[prop] && (typeof base[prop] === 'object' || typeof base[prop] === 'function')) { + target[prop] = createTrap(base[prop], base); + return target[prop]; + } + return base[prop]; + }, + apply: (target, thisArg, args) => base.apply(parent, args) + }); + } + } })(); diff --git a/js/prefs.js b/js/prefs.js index 006dd85f..5135101d 100644 --- a/js/prefs.js +++ b/js/prefs.js @@ -1,4 +1,4 @@ -/* global promisify */ +/* global promisifyChrome */ 'use strict'; self.prefs = self.INJECTED === 1 ? self.prefs : (() => { @@ -63,6 +63,7 @@ self.prefs = self.INJECTED === 1 ? self.prefs : (() => { end_with_newline: false, indent_conditional: true, }, + 'editor.beautify.hotkey': '', 'editor.lintDelay': 300, // lint gutter marker update delay, ms 'editor.linter': 'csslint', // 'csslint' or 'stylelint' or '' 'editor.lintReportDelay': 500, // lint report update delay, ms @@ -110,10 +111,11 @@ self.prefs = self.INJECTED === 1 ? self.prefs : (() => { specific: new Map(), }; - const syncSet = promisify(chrome.storage.sync.set.bind(chrome.storage.sync)); - const syncGet = promisify(chrome.storage.sync.get.bind(chrome.storage.sync)); + promisifyChrome({ + 'storage.sync': ['get', 'set'], + }); - const initializing = syncGet('settings') + const initializing = browser.storage.sync.get('settings') .then(result => { if (result.settings) { setAll(result.settings, true); @@ -240,7 +242,7 @@ self.prefs = self.INJECTED === 1 ? self.prefs : (() => { return new Promise((resolve, reject) => { setTimeout(() => { timer = null; - syncSet({settings: values}) + browser.storage.sync.set({settings: values}) .then(resolve, reject); }); }); diff --git a/js/promisify.js b/js/promisify.js deleted file mode 100644 index 89605a37..00000000 --- a/js/promisify.js +++ /dev/null @@ -1,22 +0,0 @@ -'use strict'; -/* -Convert chrome APIs into promises. Example: - - const storageSyncGet = promisify(chrome.storage.sync.get.bind(chrome.storage.sync)); - storageSyncGet(['key']).then(result => {...}); - -*/ -self.promisify = self.INJECTED === 1 ? self.promisify : fn => - (...args) => - new Promise((resolve, reject) => { - fn(...args, (...result) => { - if (chrome.runtime.lastError) { - reject(chrome.runtime.lastError); - return; - } - resolve( - result.length === 0 ? undefined : - result.length === 1 ? result[0] : result - ); - }); - }); diff --git a/js/storage-util.js b/js/storage-util.js index 044ba56a..2e966523 100644 --- a/js/storage-util.js +++ b/js/storage-util.js @@ -1,7 +1,12 @@ -/* global loadScript tryJSONparse */ +/* global loadScript tryJSONparse promisifyChrome */ /* exported chromeLocal chromeSync */ 'use strict'; +promisifyChrome({ + 'storage.local': ['get', 'remove', 'set'], + 'storage.sync': ['get', 'remove', 'set'], +}); + const [chromeLocal, chromeSync] = (() => { return [ createWrapper('local'), @@ -9,11 +14,11 @@ const [chromeLocal, chromeSync] = (() => { ]; function createWrapper(name) { - const storage = chrome.storage[name]; + const storage = browser.storage[name]; const wrapper = { - get: data => new Promise(resolve => storage.get(data, resolve)), - set: data => new Promise(resolve => storage.set(data, () => resolve(data))), - remove: data => new Promise(resolve => storage.remove(data, resolve)), + get: storage.get.bind(storage), + set: data => storage.set(data).then(() => data), + remove: storage.remove.bind(storage), /** * @param {String} key diff --git a/js/worker-util.js b/js/worker-util.js index 4e226a27..77a2a6b6 100644 --- a/js/worker-util.js +++ b/js/worker-util.js @@ -6,7 +6,7 @@ const workerUtil = (() => { const loadedScripts = new Set(); return {createWorker, createAPI, loadScript, cloneError}; - function createWorker({url, lifeTime = 30}) { + function createWorker({url, lifeTime = 300}) { let worker; let id; let timer; diff --git a/manage.html b/manage.html index 76e0c7ce..d168af14 100644 --- a/manage.html +++ b/manage.html @@ -147,7 +147,6 @@ - diff --git a/manage/import-export.js b/manage/import-export.js index 18abd480..0c1c3bd8 100644 --- a/manage/import-export.js +++ b/manage/import-export.js @@ -1,11 +1,15 @@ /* global messageBox styleSectionsEqual API onDOMready tryJSONparse scrollElementIntoView $ $$ API $create t animateElement styleJSONseemsValid */ +/* exported bulkChangeQueue bulkChangeTime */ 'use strict'; const STYLISH_DUMP_FILE_EXT = '.txt'; const STYLUS_BACKUP_FILE_EXT = '.json'; +let bulkChangeQueue = []; +let bulkChangeTime = 0; + onDOMready().then(() => { $('#file-all-styles').onclick = event => { event.preventDefault(); @@ -136,6 +140,8 @@ function importFromString(jsonString) { items.push({info, item}); } }); + bulkChangeQueue.length = 0; + bulkChangeTime = performance.now(); return API.importManyStyles(items.map(i => i.item)) .then(styles => { for (let i = 0; i < styles.length; i++) { diff --git a/manage/incremental-search.js b/manage/incremental-search.js index 5c0201a2..293371ae 100644 --- a/manage/incremental-search.js +++ b/manage/incremental-search.js @@ -73,18 +73,22 @@ onDOMready().then(() => { } function maybeRefocus(event) { - if (event.altKey || event.ctrlKey || event.metaKey || - event.target.matches('[type="text"], [type="search"], [type="number"]') || - $('#message-box')) { + if (event.altKey || event.metaKey || $('#message-box')) { return; } + const inTextInput = event.target.matches('[type=text], [type=search], [type=number]'); const {which: k, key} = event; - // focus search field on "/" key - if (key === '/' || !key && k === 191 && !event.shiftKey) { + // focus search field on "/" or Ctrl-F key + if (event.ctrlKey + ? (event.code === 'KeyF' || !event.code && k === 70) && !event.shiftKey + : (key === '/' || !key && k === 191 && !event.shiftKey) && !inTextInput) { event.preventDefault(); $('#search').focus(); return; } + if (event.ctrlKey || inTextInput) { + return; + } const time = performance.now(); if ( // 0-9 diff --git a/manage/manage.js b/manage/manage.js index ddafe0fd..26c26c01 100644 --- a/manage/manage.js +++ b/manage/manage.js @@ -8,6 +8,7 @@ global messageBox getStyleWithNoCode URLS enforceInputRange t tWordBreak formatDate getOwnTab getActiveTab openURL animateElement sessionStorageHash debounce scrollElementIntoView CHROME VIVALDI FIREFOX router + bulkChangeTime:true bulkChangeQueue */ 'use strict'; @@ -16,6 +17,8 @@ let installed; const ENTRY_ID_PREFIX_RAW = 'style-'; const ENTRY_ID_PREFIX = '#' + ENTRY_ID_PREFIX_RAW; +const BULK_THROTTLE_MS = 100; + const newUI = { enabled: prefs.get('manage.newUI'), favicons: prefs.get('manage.newUI.favicons'), @@ -62,11 +65,13 @@ function onRuntimeMessage(msg) { switch (msg.method) { case 'styleUpdated': case 'styleAdded': - API.getStyle(msg.style.id, true) - .then(style => handleUpdate(style, msg)); - break; case 'styleDeleted': - handleDelete(msg.style.id); + bulkChangeQueue.push(msg); + if (performance.now() - bulkChangeTime < BULK_THROTTLE_MS) { + debounce(handleBulkChange, BULK_THROTTLE_MS); + } else { + handleBulkChange(); + } break; case 'styleApply': case 'styleReplaceAll': @@ -449,6 +454,8 @@ Object.assign(handleEvent, { API.deleteStyle(id); } }); + const deleteButton = $('#message-box-buttons > button'); + if (deleteButton) deleteButton.removeAttribute('data-focused-via-click'); }, external(event) { @@ -529,6 +536,26 @@ Object.assign(handleEvent, { }); +function handleBulkChange() { + for (const msg of bulkChangeQueue) { + const {id} = msg.style; + if (msg.method === 'styleDeleted') { + handleDelete(id); + bulkChangeTime = performance.now(); + } else { + handleUpdateForId(id, msg); + } + } + bulkChangeQueue.length = 0; +} + +function handleUpdateForId(id, opts) { + return API.getStyle(id, true).then(style => { + handleUpdate(style, opts); + bulkChangeTime = performance.now(); + }); +} + function handleUpdate(style, {reason, method} = {}) { if (reason === 'editPreview' || reason === 'editPreviewEnd') return; let entry; @@ -548,7 +575,7 @@ function handleUpdate(style, {reason, method} = {}) { handleUpdateInstalled(entry, reason); } filterAndAppend({entry}).then(sorter.update); - if (!entry.matches('.hidden') && reason !== 'import') { + if (!entry.matches('.hidden') && reason !== 'import' && reason !== 'sync') { animateElement(entry); requestAnimationFrame(() => scrollElementIntoView(entry)); } @@ -625,7 +652,7 @@ function switchUI({styleOnly} = {}) { filter: none; opacity: 1; } - `) + (CHROME >= 3004 ? ` + `) + (CHROME >= 58 ? ` .newUI .entry { contain: strict; } @@ -677,15 +704,14 @@ function onVisibilityChange() { // page restored without reloading via history navigation (currently only in FF) // the catch here is that DOM may be outdated so we'll at least refresh the just edited style // assuming other changes aren't important enough to justify making a complicated DOM sync - case 'visible': - if (sessionStorage.justEditedStyleId) { - API.getStyle(Number(sessionStorage.justEditedStyleId), true) - .then(style => { - handleUpdate(style, {method: 'styleUpdated'}); - }); + case 'visible': { + const id = sessionStorage.justEditedStyleId; + if (id) { + handleUpdateForId(Number(id), {method: 'styleUpdated'}); delete sessionStorage.justEditedStyleId; } break; + } // going away case 'hidden': history.replaceState({scrollY: window.scrollY}, document.title); diff --git a/manage/sort.js b/manage/sort.js index 0120f359..928e3733 100644 --- a/manage/sort.js +++ b/manage/sort.js @@ -32,7 +32,7 @@ const sorter = (() => { }, dateUpdated: { text: t('dateUpdated'), - parse: ({style}) => style.updateDate, + parse: ({style}) => style.updateDate || style.installDate, sorter: sorterType.number } }; diff --git a/manifest.json b/manifest.json index a701014c..293c0217 100644 --- a/manifest.json +++ b/manifest.json @@ -1,15 +1,15 @@ { "name": "Stylus", - "version": "1.5.10", + "version": "1.5.13", "minimum_chrome_version": "49", "description": "__MSG_description__", "homepage_url": "https://add0n.com/stylus.html", "manifest_version": 2, "icons": { - "16": "/images/icon/16.png", - "32": "/images/icon/32.png", - "48": "/images/icon/48.png", - "128": "/images/icon/128.png" + "16": "images/icon/16.png", + "32": "images/icon/32.png", + "48": "images/icon/48.png", + "128": "images/icon/128.png" }, "permissions": [ "tabs", @@ -18,6 +18,7 @@ "webRequestBlocking", "contextMenus", "storage", + "unlimitedStorage", "alarms", "identity", "" @@ -25,7 +26,6 @@ "background": { "scripts": [ "js/polyfill.js", - "js/promisify.js", "js/messaging.js", "js/msg.js", "js/storage-util.js", @@ -77,7 +77,6 @@ "match_about_blank": true, "js": [ "js/polyfill.js", - "js/promisify.js", "js/msg.js", "js/prefs.js", "content/style-injector.js", @@ -99,10 +98,10 @@ ], "browser_action": { "default_icon": { - "16": "/images/icon/16w.png", - "32": "/images/icon/32w.png", - "19": "/images/icon/19w.png", - "38": "/images/icon/38w.png" + "16": "images/icon/16w.png", + "32": "images/icon/32w.png", + "19": "images/icon/19w.png", + "38": "images/icon/38w.png" }, "default_title": "Stylus", "default_popup": "popup.html" diff --git a/msgbox/msgbox.css b/msgbox/msgbox.css index 0afaa940..32e6c865 100644 --- a/msgbox/msgbox.css +++ b/msgbox/msgbox.css @@ -134,6 +134,15 @@ text-align: center; } +.danger #message-box-buttons > button:not([data-focused-via-click]):first-child:focus { + outline: red auto 1px; +} + +/* FF ignores color with 'auto' */ +.firefox .danger #message-box-buttons > button:not([data-focused-via-click]):first-child:focus { + outline: red solid 1px; +} + .non-windows #message-box-buttons { text-align: right; direction: rtl; diff --git a/options.html b/options.html index c381eb3c..14cc888c 100644 --- a/options.html +++ b/options.html @@ -21,7 +21,6 @@ - diff --git a/options/options.js b/options/options.js index e5d02cde..17128f35 100644 --- a/options/options.js +++ b/options/options.js @@ -8,8 +8,8 @@ setupLivePrefs(); enforceInputRange($('#popupWidth')); setTimeout(splitLongTooltips); -// TODO: add max version to re-enable once crbug.com/996859 is resolved -if (!FIREFOX && CHROME >= 3809) { +// https://github.com/openstyles/stylus/issues/822 +if (!FIREFOX && CHROME >= 76 && CHROME <= 81) { const dropboxOption = $('option[value="dropbox"]'); dropboxOption.disabled = true; dropboxOption.setAttribute('title', t('hostDisabled')); @@ -23,7 +23,7 @@ if (CHROME_HAS_BORDER_BUG) { } // collapse #advanced block in Chrome pre-66 (classic chrome://extensions UI) -if (!FIREFOX && !OPERA && CHROME < 3343) { +if (!FIREFOX && !OPERA && CHROME < 66) { const block = $('#advanced'); $('h1', block).onclick = event => { event.preventDefault(); diff --git a/package-lock.json b/package-lock.json index 5538eea0..5a767709 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,27 +1,46 @@ { "name": "Stylus", - "version": "1.5.10", + "version": "1.5.13", "lockfileVersion": 1, "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", "dev": true, "requires": { - "@babel/highlight": "^7.8.3" + "@babel/highlight": "^7.10.1" } }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", + "dev": true + }, "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", "dev": true, "requires": { + "@babel/helper-validator-identifier": "^7.10.1", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } } }, "@babel/polyfill": { @@ -44,13 +63,13 @@ } }, "@babel/runtime-corejs3": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.8.4.tgz", - "integrity": "sha512-+wpLqy5+fbQhvbllvlJEVRIpYj+COUWnnsm+I4jZlA8Lo7/MJmBhGTCHyk1/RWfOqBRJ2MbadddG6QltTKTlrg==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.10.2.tgz", + "integrity": "sha512-+a2M/u7r15o3dV1NEizr9bRi+KUVnrs/qYxF0Z06DAPx/4VCWaz1WA7EcbE+uqGgt39lp5akWGmHsTseIkHkHg==", "dev": true, "requires": { "core-js-pure": "^3.0.0", - "regenerator-runtime": "^0.13.2" + "regenerator-runtime": "^0.13.4" } }, "@cliqz-oss/firefox-client": { @@ -71,21 +90,12 @@ "requires": { "@cliqz-oss/firefox-client": "0.3.1", "es6-promise": "^2.0.1" - }, - "dependencies": { - "es6-promise": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz", - "integrity": "sha1-lu258v2wGZWCKyY92KratnSBgbw=", - "dev": true - } } }, "@eight04/read-write-lock": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@eight04/read-write-lock/-/read-write-lock-0.1.0.tgz", - "integrity": "sha512-a/94gK+/GRZeTyFmJCIPlWGlgpOT3qmIRp5ByJkoxtkpspSsMbdYZKd/wNXdPYf4auRyepEM3+EkawQnscjJXQ==", - "dev": true + "integrity": "sha512-a/94gK+/GRZeTyFmJCIPlWGlgpOT3qmIRp5ByJkoxtkpspSsMbdYZKd/wNXdPYf4auRyepEM3+EkawQnscjJXQ==" }, "@sindresorhus/is": { "version": "0.14.0", @@ -102,6 +112,12 @@ "defer-to-connect": "^1.0.1" } }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -115,9 +131,9 @@ "dev": true }, "@types/node": { - "version": "13.7.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.1.tgz", - "integrity": "sha512-Zq8gcQGmn4txQEJeiXo/KiLpon8TzAl0kmKH4zdWctPj05nWwp1ClMdAVEloqrQKfaC48PNLdgN/aVaLqUrluA==", + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.6.tgz", + "integrity": "sha512-FbNmu4F67d3oZMWBV6Y4MaPER+0EpE9eIYf2yaHhCWovc1dlXCZkqGX4NLHfVVr6umt20TNBdRzrNJIzIKfdbw==", "dev": true }, "JSONSelect": { @@ -129,19 +145,18 @@ "JSV": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz", - "integrity": "sha1-0Hf2glVx+CEy+d/67Vh7QCn+/1c=", - "dev": true + "integrity": "sha1-0Hf2glVx+CEy+d/67Vh7QCn+/1c=" }, "acorn": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", - "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", + "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", "dev": true }, "acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", "dev": true }, "adbkit": { @@ -200,24 +215,25 @@ } }, "addons-linter": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/addons-linter/-/addons-linter-1.20.0.tgz", - "integrity": "sha512-EIyJnIkvXhBKgOzVFR873uGa4ny07odIl8i8qWxHAuVJWM/ZQtLouAbndA+cVRDbD66sK6HsO1oWN6WkdCr/uA==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/addons-linter/-/addons-linter-1.23.0.tgz", + "integrity": "sha512-4ozo5E+KnsU9h94J496WQs6NYSnofxtw5/Sy63PmeB5FJ3KWERx1S9D8A+ixMAIMgaSiexHpp5alp9yjE0t4gg==", "dev": true, "requires": { - "ajv": "6.10.2", + "@babel/runtime": "7.9.2", + "ajv": "6.12.0", "ajv-merge-patch": "4.1.0", "chalk": "3.0.0", "cheerio": "1.0.0-rc.3", "columnify": "1.5.4", "common-tags": "1.8.0", "deepmerge": "4.2.2", - "dispensary": "0.49.0", - "es6-promisify": "6.0.2", + "dispensary": "0.51.2", + "es6-promisify": "6.1.0", "eslint": "5.16.0", "eslint-plugin-no-unsafe-innerhtml": "1.0.16", "eslint-visitor-keys": "1.1.0", - "espree": "6.1.2", + "espree": "6.2.1", "esprima": "4.0.1", "first-chunk-stream": "3.0.0", "fluent-syntax": "0.13.0", @@ -225,36 +241,44 @@ "glob": "7.1.6", "is-mergeable-object": "1.1.1", "jed": "1.1.1", - "mdn-browser-compat-data": "1.0.3", - "os-locale": "4.0.0", - "pino": "5.15.0", - "postcss": "7.0.26", + "mdn-browser-compat-data": "1.0.15", + "os-locale": "5.0.0", + "pino": "6.0.0", + "postcss": "7.0.27", "probe-image-size": "5.0.0", - "regenerator-runtime": "0.13.3", "relaxed-json": "1.0.3", - "semver": "7.1.1", + "semver": "7.1.3", "source-map-support": "0.5.16", "strip-bom-stream": "4.0.0", "tosource": "1.0.0", "upath": "1.2.0", "whatwg-url": "8.0.0", - "yargs": "15.1.0", + "yargs": "15.3.1", "yauzl": "2.10.0" }, "dependencies": { + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "dev": true }, "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" @@ -316,10 +340,31 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "es6-promisify": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.0.2.tgz", - "integrity": "sha512-eO6vFm0JvqGzjWIQA6QVKjxpmELfhWbDUWHm1rPfIbn55mhKPiAa5xpLmQWJrNa629ZIeQ8ZvMAi13kvrjK6Mg==", + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, "eslint": { @@ -445,11 +490,33 @@ "estraverse": "^4.1.1" } }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "acorn": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", + "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", + "dev": true + } + } }, "figures": { "version": "2.0.0", @@ -566,6 +633,16 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", @@ -587,6 +664,38 @@ "mimic-fn": "^1.0.0" } }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", @@ -598,9 +707,24 @@ } }, "semver": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.1.tgz", - "integrity": "sha512-WfuG+fl6eh3eZ2qAf6goB7nhiCd7NPXhmyFxigB/TOkQyeLP8w8GsVehvtGNtnNmyboz4TgeK40B1Kbql/8c5A==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, "string-width": { @@ -636,6 +760,77 @@ "requires": { "has-flag": "^4.0.0" } + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } } } }, @@ -646,15 +841,18 @@ "dev": true }, "agent-base": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", - "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", - "dev": true + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", + "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", + "dev": true, + "requires": { + "debug": "4" + } }, "agentkeepalive": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.0.tgz", - "integrity": "sha512-CW/n1wxF8RpEuuiq6Vbn9S8m0VSYDMnZESqaJ6F2cWN9fY8rei2qaxweIaRgq+ek8TqfoFIsUjaGNKGGEHElSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.2.tgz", + "integrity": "sha512-waNHE7tQBBn+2qXucI8HY0o2Y0OBPWldWOWsZwY71JcCm4SvrPnWdceFfB5NIXSqE8Ewq6VR/Qt5b1i69P6KCQ==", "dev": true, "requires": { "debug": "^4.1.0", @@ -673,9 +871,9 @@ } }, "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -709,6 +907,12 @@ "string-width": "^3.0.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -731,16 +935,33 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } } } }, "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", "dev": true, "requires": { - "type-fest": "^0.8.1" + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } } }, "ansi-regex": { @@ -785,74 +1006,19 @@ } } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, "archiver": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-3.1.1.tgz", - "integrity": "sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-4.0.1.tgz", + "integrity": "sha512-/YV1pU4Nhpf/rJArM23W6GTUjT0l++VbjykrCRua1TSXrn+yM8Qs7XvtwSiRse0iCe49EPNf7ktXnPsWuSb91Q==", "dev": true, "requires": { "archiver-utils": "^2.1.0", "async": "^2.6.3", "buffer-crc32": "^0.2.1", - "glob": "^7.1.4", - "readable-stream": "^3.4.0", - "tar-stream": "^2.1.0", - "zip-stream": "^2.1.2" - }, - "dependencies": { - "bl": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.0.tgz", - "integrity": "sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A==", - "dev": true, - "requires": { - "readable-stream": "^3.0.1" - } - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "tar-stream": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.0.tgz", - "integrity": "sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw==", - "dev": true, - "requires": { - "bl": "^3.0.0", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - } + "glob": "^7.1.6", + "readable-stream": "^3.6.0", + "tar-stream": "^2.1.2", + "zip-stream": "^3.0.1" } }, "archiver-utils": { @@ -873,25 +1039,20 @@ "readable-stream": "^2.0.0" }, "dependencies": { - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } - }, - "graceful-fs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", - "dev": true } } }, @@ -1012,12 +1173,24 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, + "atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "dev": true + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -1025,9 +1198,9 @@ "dev": true }, "aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", "dev": true }, "babel-code-frame": { @@ -1151,9 +1324,9 @@ } }, "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", "dev": true }, "bcrypt-pbkdf": { @@ -1171,24 +1344,23 @@ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, "bl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", + "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", "dev": true, "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + } } }, "bluebird": { @@ -1311,9 +1483,9 @@ } }, "buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", "dev": true, "requires": { "base64-js": "^1.0.2", @@ -1373,43 +1545,44 @@ } }, "cacache": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-14.0.0.tgz", - "integrity": "sha512-+Nr/BnA/tjAUXza9gH8F+FSP+1HvWqCKt4c95dQr4EDVJVafbzmPZpLKCkLYexs6vSd2B/1TOXrAoNnqVPfvRA==", + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.3.tgz", + "integrity": "sha512-bc3jKYjqv7k4pWh7I/ixIjfcjPul4V4jme/WbjvwGS5LzoPL/GzXr4C5EgPNLO/QEZl9Oi61iGitYEdwcrwLCQ==", "dev": true, "requires": { - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", + "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "glob": "^7.1.4", - "graceful-fs": "^4.2.2", "infer-owner": "^1.0.4", "lru-cache": "^5.1.1", - "minipass": "^3.0.0", + "minipass": "^3.1.1", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.2", "mkdirp": "^1.0.3", - "move-concurrently": "^1.0.1", - "p-map": "^3.0.0", + "move-file": "^2.0.0", + "p-map": "^4.0.0", "promise-inflight": "^1.0.1", - "rimraf": "^2.7.1", - "ssri": "^7.0.0", - "tar": "^6.0.0", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", "unique-filename": "^1.1.1" }, "dependencies": { - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true }, - "mkdirp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", - "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==", - "dev": true + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } } } }, @@ -1445,15 +1618,6 @@ "responselike": "^1.0.2" }, "dependencies": { - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, "lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", @@ -1498,14 +1662,55 @@ "dev": true }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "chardet": { @@ -1549,561 +1754,13 @@ }, "dependencies": { "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "dev": true, "optional": true, "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.7.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "optional": true - } + "nan": "^2.12.1" } }, "glob-parent": { @@ -2130,22 +1787,33 @@ } }, "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true }, "chrome-launcher": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.12.0.tgz", - "integrity": "sha512-rBUP4tvWToiileDi3UR0SbWKoUoDCYTRmVND2sdoBL1xANBgVz8V9h1yQluj3MEQaBJg0fRw7hW82uOPrJus7A==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.13.1.tgz", + "integrity": "sha512-q8UiCNAknw6kCUvCVBTAEw1BwT0vaxabCrSjN3B/NWohp12YBD9+DalymYElSoKRD4KpVSu4CCl0us4v/J81Sg==", "dev": true, "requires": { "@types/node": "*", "is-wsl": "^2.1.0", "lighthouse-logger": "^1.0.0", - "mkdirp": "0.5.1", - "rimraf": "^2.6.1" + "mkdirp": "^0.5.3", + "rimraf": "^3.0.2" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "ci-info": { @@ -2205,9 +1873,9 @@ } }, "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", "dev": true }, "cliui": { @@ -2219,17 +1887,6 @@ "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } } }, "clone": { @@ -2260,10 +1917,9 @@ "dev": true }, "codemirror": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.51.0.tgz", - "integrity": "sha512-vyuYYRv3eXL0SCuZA4spRFlKNzQAewHcipRQCOKgRy7VNAvZxTKzbItdbCl4S5AgPZ5g3WkHp+ibWQwv9TLG7Q==", - "dev": true + "version": "5.56.0", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.56.0.tgz", + "integrity": "sha512-MfKVmYgifXjQpLSgpETuih7A7WTTIsxvKfSLGseTY5+qt0E1UD1wblZGM6WLenORo8sgmf+3X+WTe2WF7mufyw==" }, "collection-visit": { "version": "1.0.0", @@ -2351,24 +2007,30 @@ "dev": true }, "compress-commons": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", - "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-3.0.0.tgz", + "integrity": "sha512-FyDqr8TKX5/X0qo+aVfaZ+PVmNJHJeckFBlq8jZGSJOgnynhfifoyl24qaqdUdDIBe0EVTHByN6NAkqYvE/2Xg==", "dev": true, "requires": { - "buffer-crc32": "^0.2.1", - "crc32-stream": "^2.0.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" + "buffer-crc32": "^0.2.13", + "crc32-stream": "^3.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^2.3.7" }, "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { - "remove-trailing-separator": "^1.0.1" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } } } @@ -2389,15 +2051,32 @@ "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } } }, "configstore": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.0.tgz", - "integrity": "sha512-eE/hvMs7qw7DlcB5JPRnthmrITuHMmACUJAp89v6PT6iOqzoLS7HRWhBtuHMlhNHo2AhUSA/3Dh1bKNJHcublQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", "dev": true, "requires": { - "dot-prop": "^5.1.0", + "dot-prop": "^5.2.0", "graceful-fs": "^4.1.2", "make-dir": "^3.0.0", "unique-string": "^2.0.0", @@ -2405,20 +2084,6 @@ "xdg-basedir": "^4.0.0" } }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -2432,9 +2097,9 @@ "dev": true }, "core-js-pure": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.4.tgz", - "integrity": "sha512-epIhRLkXdgv32xIUFaaAry2wdxZYBi6bgM7cB136dzzXXa+dFyRLTZeLUJxnd8ShrmyVXBub63n2NHo2JAt8Cw==", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz", + "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==", "dev": true }, "core-util-is": { @@ -2453,26 +2118,24 @@ } }, "crc32-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", - "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz", + "integrity": "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==", "dev": true, "requires": { "crc": "^3.4.4", - "readable-stream": "^2.0.0" + "readable-stream": "^3.4.0" } }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "crypto-random-string": { @@ -2522,7 +2185,6 @@ "version": "0.4.5", "resolved": "https://registry.npmjs.org/db-to-cloud/-/db-to-cloud-0.4.5.tgz", "integrity": "sha512-3E5eYVIlZmX0ZRgSZ3WJF+lxs8eCFOJWruw8GLHbKDGK5tIZ13Bxsge+eFXbYBQUidzW7y3xuxD8MdpjDLY7eQ==", - "dev": true, "requires": { "@eight04/read-write-lock": "^0.1.0", "universal-base64": "^2.1.0" @@ -2679,12 +2341,6 @@ } } }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -2704,25 +2360,50 @@ "dev": true }, "dispensary": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/dispensary/-/dispensary-0.49.0.tgz", - "integrity": "sha512-szH0vDORmGWEfwQgIqrhmrMpSGU2yXL3z7oe0NGx4sCbmnJdXXr5SQvRccPNCPrRuRPn2zPIITvwD9Lf+pcOew==", + "version": "0.51.2", + "resolved": "https://registry.npmjs.org/dispensary/-/dispensary-0.51.2.tgz", + "integrity": "sha512-liUDx/g1xFEBFoOL6308Vr0aYAZlGAyXGcOvuXVa/6qVBZT4QZrv4pVNeb5QOeD5C/Flta+A+qTnLkLnhgs40g==", "dev": true, "requires": { - "async": "~3.1.0", + "async": "~3.2.0", "natural-compare-lite": "~1.4.0", - "pino": "~5.15.0", + "pino": "~6.0.0", "request": "~2.88.0", "sha.js": "~2.4.4", "source-map-support": "~0.5.4", - "yargs": "~15.1.0" + "yargs": "~15.3.0" }, "dependencies": { "async": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/async/-/async-3.1.1.tgz", - "integrity": "sha512-X5Dj8hK1pJNC2Wzo2Rcp9FBVdJMGRR/S7V+lH46s8GVFhtbo5O4Le5GECCF/8PISVdkUA6mMPvgz7qTTD1rf1g==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + } } } }, @@ -2785,15 +2466,6 @@ "is-obj": "^2.0.0" } }, - "dotignore": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", - "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", - "dev": true, - "requires": { - "minimatch": "^3.0.4" - } - }, "dtrace-provider": { "version": "0.8.8", "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", @@ -2846,23 +2518,23 @@ } }, "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { "once": "^1.4.0" } }, "endent": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/endent/-/endent-1.4.0.tgz", - "integrity": "sha512-V9cYHc4IcnE9hYCuZat9YVUxIsK3gLB3gEUnr07rqElI+3TB+yC/wmMTNZ7L4xDmDFwg4Lypl5Gc3i+23komhA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/endent/-/endent-1.4.1.tgz", + "integrity": "sha512-buHTb5c8AC9NshtP6dgmNLYkiT+olskbq1z6cEGvfGCF3Qphbu/1zz5Xu+yjTDln8RbxNhPoUyJ5H8MSrp1olQ==", "dev": true, "requires": { "dedent": "^0.7.0", "fast-json-parse": "^1.0.3", - "objectorarray": "^1.0.3" + "objectorarray": "^1.0.4" } }, "entities": { @@ -2887,9 +2559,9 @@ } }, "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", @@ -2965,19 +2637,16 @@ "dev": true }, "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz", + "integrity": "sha1-lu258v2wGZWCKyY92KratnSBgbw=", "dev": true }, "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.0.tgz", + "integrity": "sha512-jCsk2fpfEFusVv1MDkF4Uf0hAzIKNDMgR6LyOIw6a3jwkN1sCgWzuwgnsHY9YSQ8n8P31HoncvE0LC44cpWTrw==", + "dev": true }, "es6-set": { "version": "0.1.5", @@ -3045,22 +2714,22 @@ } }, "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.1.0.tgz", + "integrity": "sha512-DfS3b8iHMK5z/YLSme8K5cge168I8j8o1uiVmFCgnnjxZQbCGyraF8bMl7Ju4yfBmCuxD7shOF7eqGkcuIHfsA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", + "eslint-utils": "^2.0.0", "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", + "espree": "^7.0.0", + "esquery": "^1.2.0", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", @@ -3073,26 +2742,25 @@ "is-glob": "^4.0.0", "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", + "levn": "^0.4.1", "lodash": "^4.17.14", "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.3", + "optionator": "^0.9.1", "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", "table": "^5.2.3", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true } } @@ -3107,9 +2775,9 @@ }, "dependencies": { "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", "dev": true }, "acorn-jsx": { @@ -3324,6 +2992,16 @@ "number-is-nan": "^1.0.0" } }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -3336,6 +3014,26 @@ "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", "dev": true }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, "progress": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", @@ -3352,15 +3050,6 @@ "onetime": "^1.0.0" } }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, "run-async": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", @@ -3461,6 +3150,15 @@ } } }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, "write": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", @@ -3483,9 +3181,9 @@ } }, "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", + "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" @@ -3498,13 +3196,13 @@ "dev": true }, "espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.0.0.tgz", + "integrity": "sha512-/r2XEx5Mw4pgKdyb7GNLQNsu++asx/dltf/CI8RFi9oGHxmQFgvLbc5Op4U6i8Oaj+kdslhJtVlEZeAqH5qOTw==", "dev": true, "requires": { - "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", "eslint-visitor-keys": "^1.1.0" } }, @@ -3515,12 +3213,20 @@ "dev": true }, "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", "dev": true, "requires": { - "estraverse": "^4.0.0" + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "dev": true + } } }, "esrecurse": { @@ -3561,18 +3267,20 @@ "dev": true }, "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.2.tgz", + "integrity": "sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q==", "dev": true, "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" } }, "exit-hook": { @@ -3819,16 +3527,10 @@ "pend": "~1.2.0" } }, - "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", - "dev": true - }, "figures": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", - "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5" @@ -3843,13 +3545,6 @@ "flat-cache": "^2.0.1" } }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -3884,9 +3579,9 @@ } }, "firefox-profile": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/firefox-profile/-/firefox-profile-1.3.0.tgz", - "integrity": "sha512-3d7JPnFC3GrwGW8wonAqy2E4YCI7A8MO7yVDkqS09uQ3tLvMLCY3Ytt4ntvVXvyzjVMRmrLW9W/CubnnzrdLCA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/firefox-profile/-/firefox-profile-1.3.1.tgz", + "integrity": "sha512-8q7DnwVIXvuJuBm1shr5ivRh0Ih2ytWwOIMwHInDSlVyrjQVXy7Ik0frItDdWb/P5CIpQFcMk9fPsUwNqi2lyQ==", "dev": true, "requires": { "adm-zip": "~0.4.x", @@ -3941,6 +3636,38 @@ "lodash": "^4.14.0" } }, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "dev": true, + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "compress-commons": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", + "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", + "dev": true, + "requires": { + "buffer-crc32": "^0.2.1", + "crc32-stream": "^2.0.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + } + }, + "crc32-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", + "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", + "dev": true, + "requires": { + "crc": "^3.4.4", + "readable-stream": "^2.0.0" + } + }, "fs-extra": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", @@ -3952,6 +3679,15 @@ "universalify": "^0.1.0" } }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, "normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", @@ -3961,6 +3697,42 @@ "remove-trailing-separator": "^1.0.1" } }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -3996,17 +3768,6 @@ "flatted": "^2.0.0", "rimraf": "2.6.3", "write": "1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } } }, "flatstr": { @@ -4016,9 +3777,9 @@ "dev": true }, "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, "fluent-syntax": { @@ -4027,15 +3788,6 @@ "integrity": "sha512-0Bk1AsliuYB550zr4JV9AYhsETsD3ELXUQzdXGJfIc1Ni/ukAfBdQInDhVMYJUaT2QxoamNslwkYF7MlOrPUwg==", "dev": true }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -4075,22 +3827,15 @@ "dev": true }, "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", + "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", "dev": true, "requires": { + "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", - "dev": true - } + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" } }, "fs-minipass": { @@ -4102,18 +3847,6 @@ "minipass": "^3.0.0" } }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -4205,9 +3938,9 @@ "dev": true }, "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", "dev": true, "requires": { "pump": "^3.0.0" @@ -4239,6 +3972,12 @@ "shelljs": "0.7.7" }, "dependencies": { + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, "shelljs": { "version": "0.7.7", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.7.tgz", @@ -4267,9 +4006,9 @@ } }, "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -4285,9 +4024,9 @@ } }, "globals": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", - "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "dev": true, "requires": { "type-fest": "^0.8.1" @@ -4322,12 +4061,23 @@ "p-cancelable": "^1.0.0", "to-readable-stream": "^1.0.0", "url-parse-lax": "^3.0.0" + }, + "dependencies": { + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } } }, "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, "graceful-readlink": { @@ -4387,8 +4137,7 @@ "has-color": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", - "dev": true + "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=" }, "has-flag": { "version": "3.0.0", @@ -4452,34 +4201,22 @@ "entities": "^1.1.1", "inherits": "^2.0.1", "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz", - "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } }, "http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-Z2EICWNJou7Tr9Bd2M2UqDJq3A9F2ePG9w3lIpjoyuSyXFP9QbniJVu3XQYytuw5ebmG7dXSXO9PgAjJG8DDKA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", "dev": true }, "http-proxy-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-3.0.0.tgz", - "integrity": "sha512-uGuJaBWQWDQCJI5ip0d/VTYZW0nRrlLWXA4A7P1jrsa+f77rW2yXz315oBt6zGCF6l8C2tlMxY7ffULCj+5FhA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, "requires": { - "agent-base": "5", + "@tootallnate/once": "1", + "agent-base": "6", "debug": "4" } }, @@ -4495,15 +4232,21 @@ } }, "https-proxy-agent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", - "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "dev": true, "requires": { - "agent-base": "5", + "agent-base": "6", "debug": "4" } }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, "humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", @@ -4523,15 +4266,9 @@ } }, "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", "dev": true }, "ignore": { @@ -4597,24 +4334,76 @@ "dev": true }, "inquirer": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", - "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", + "chalk": "^3.0.0", "cli-cursor": "^3.1.0", "cli-width": "^2.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.15", "mute-stream": "0.0.8", - "run-async": "^2.2.0", + "run-async": "^2.4.0", "rxjs": "^6.5.3", "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", + "strip-ansi": "^6.0.0", "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "interpret": { @@ -4624,9 +4413,9 @@ "dev": true }, "invert-kv": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-3.0.0.tgz", - "integrity": "sha512-JzF8q2BeZA1ZkE3XROwRpoMQ9ObMgTtp0JH8EXewlbkikuOj2GPLIpUipdO+VL8QsTr2teAJD02EFGGL5cO7uw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-3.0.1.tgz", + "integrity": "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==", "dev": true }, "ip": { @@ -4751,6 +4540,12 @@ } } }, + "is-docker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", + "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", + "dev": true + }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -4779,9 +4574,9 @@ } }, "is-installed-globally": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.1.tgz", - "integrity": "sha512-oiEcGoQbGc+3/iijAijrK2qFpkNoNjsHOm/5V5iaeydyrS/hnwaRCEgH5cpW0P3T1lSjV5piB7S5b5lEugNLhg==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", "dev": true, "requires": { "global-dirs": "^2.0.1", @@ -4866,12 +4661,6 @@ "isobject": "^3.0.1" } }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, "is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", @@ -4900,9 +4689,9 @@ "dev": true }, "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "dev": true }, "is-symbol": { @@ -4933,10 +4722,13 @@ "dev": true }, "is-wsl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", - "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", - "dev": true + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } }, "is-yarn-global": { "version": "0.3.0", @@ -4997,9 +4789,9 @@ "dev": true }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -5067,12 +4859,13 @@ "dev": true }, "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", "dev": true, "requires": { - "graceful-fs": "^4.1.6" + "graceful-fs": "^4.1.6", + "universalify": "^1.0.0" } }, "jsonify": { @@ -5085,7 +4878,6 @@ "version": "1.6.3", "resolved": "https://registry.npmjs.org/jsonlint/-/jsonlint-1.6.3.tgz", "integrity": "sha512-jMVTMzP+7gU/IyC6hvKyWpUU8tmTkK5b3BPNuMI9U8Sit+YAWLlZwB6Y6YrdCxfg2kNz05p3XY3Bmm4m26Nv3A==", - "dev": true, "requires": { "JSV": "^4.0.x", "nomnom": "^1.5.x" @@ -5188,6 +4980,23 @@ "dev": true, "requires": { "readable-stream": "^2.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } } }, "lcid": { @@ -5201,17 +5010,16 @@ }, "less-bundle": { "version": "github:openstyles/less-bundle#ef6ad8536047fc391f3fb5ffe5d22fbeccf81a96", - "from": "github:openstyles/less-bundle#v0.1.0", - "dev": true + "from": "github:openstyles/less-bundle#v0.1.0" }, "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, "lighthouse-logger": { @@ -5360,13 +5168,12 @@ "lz-string-unsafe": { "version": "1.4.4-fork-1", "resolved": "https://registry.npmjs.org/lz-string-unsafe/-/lz-string-unsafe-1.4.4-fork-1.tgz", - "integrity": "sha512-b6Ixv8tfyiZ8b0wb6VdJSLDHs3E+UbeNo81n1tTOjzXWy8ys2fleV9T3buVBIeKiMnBMo8c87FvAsRilS+BQhw==", - "dev": true + "integrity": "sha512-b6Ixv8tfyiZ8b0wb6VdJSLDHs3E+UbeNo81n1tTOjzXWy8ys2fleV9T3buVBIeKiMnBMo8c87FvAsRilS+BQhw==" }, "make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { "semver": "^6.0.0" @@ -5381,26 +5188,26 @@ } }, "make-fetch-happen": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-7.1.1.tgz", - "integrity": "sha512-7fNjiOXNZhNGQzG5P15nU97aZQtzPU2GVgVd7pnqnl5gnpLzMAD8bAe5YG4iW2s0PTqaZy9xGv4Wfqe872kRNQ==", + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.7.tgz", + "integrity": "sha512-rkDA4c1nMXVqLkfOaM5RK2dxkUndjLOCrPycTDZgbkFDzhmaCO3P1dmCW//yt1I/G1EcedJqMsSjWkV79Hh4hQ==", "dev": true, "requires": { "agentkeepalive": "^4.1.0", - "cacache": "^14.0.0", - "http-cache-semantics": "^4.0.3", - "http-proxy-agent": "^3.0.0", - "https-proxy-agent": "^4.0.0", + "cacache": "^15.0.0", + "http-cache-semantics": "^4.0.4", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", "lru-cache": "^5.1.1", - "minipass": "^3.0.0", + "minipass": "^3.1.3", "minipass-collect": "^1.0.2", "minipass-fetch": "^1.1.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.2", "promise-retry": "^1.1.1", - "socks-proxy-agent": "^4.0.0", - "ssri": "^7.0.1" + "socks-proxy-agent": "^5.0.0", + "ssri": "^8.0.0" } }, "map-age-cleaner": { @@ -5434,9 +5241,9 @@ "dev": true }, "mdn-browser-compat-data": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mdn-browser-compat-data/-/mdn-browser-compat-data-1.0.3.tgz", - "integrity": "sha512-5n7c20IVrUiuOPSuhbkd5xoJPSzEEGsoMrmrdEtPHIw6gRPzonydcsguAmqGfSBd4d2DRoDQg533sijLUpeJLg==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/mdn-browser-compat-data/-/mdn-browser-compat-data-1.0.15.tgz", + "integrity": "sha512-0jxT4ZqqCzJJfktX9d4NKgfRENy60kFzhVNV0mXNHvlnw8KrMe2cKOlEKs/Bz+odlgO0rRZAxU0OKiptqVhAXg==", "dev": true, "requires": { "extend": "3.0.2" @@ -5453,6 +5260,12 @@ "p-is-promise": "^2.1.0" } }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -5475,18 +5288,18 @@ } }, "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", "dev": true }, "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "dev": true, "requires": { - "mime-db": "1.43.0" + "mime-db": "1.44.0" } }, "mimic-fn": { @@ -5517,9 +5330,9 @@ "dev": true }, "minipass": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", - "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -5557,9 +5370,9 @@ } }, "minipass-pipeline": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", - "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz", + "integrity": "sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ==", "dev": true, "requires": { "minipass": "^3.0.0" @@ -5606,41 +5419,36 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.5" }, "dependencies": { "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true } } }, "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.26.0.tgz", + "integrity": "sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw==", "dev": true, "optional": true }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "move-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/move-file/-/move-file-2.0.0.tgz", + "integrity": "sha512-cdkdhNCgbP5dvS4tlGxZbD+nloio9GIimP57EjqFhwLcMjnU+XJKAZzlmg/TN/AK1LuNAdTSvm3CPPP4Xkv0iQ==", "dev": true, "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" + "path-exists": "^4.0.0" } }, "ms": { @@ -5718,9 +5526,9 @@ } }, "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", "dev": true, "optional": true }, @@ -5821,6 +5629,15 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, @@ -5828,7 +5645,6 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", - "dev": true, "requires": { "chalk": "~0.4.0", "underscore": "~1.6.0" @@ -5837,14 +5653,12 @@ "ansi-styles": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", - "dev": true + "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=" }, "chalk": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", - "dev": true, "requires": { "ansi-styles": "~1.0.0", "has-color": "~0.1.0", @@ -5854,8 +5668,7 @@ "strip-ansi": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", - "dev": true + "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=" } } }, @@ -5872,12 +5685,12 @@ "dev": true }, "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "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, "requires": { - "path-key": "^2.0.0" + "path-key": "^3.0.0" } }, "nth-check": { @@ -5945,10 +5758,14 @@ "dev": true }, "object-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", - "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", + "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } }, "object-keys": { "version": "1.1.1", @@ -5987,13 +5804,10 @@ } }, "objectorarray": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.3.tgz", - "integrity": "sha512-kPoflSYkAf/Onvjr4ZLaq37vDuOXjVzfwLCRuORRzYGdXkHa/vacPT0RgR+KmtkwOYFcxTMM62BRrZk8GGKHjw==", - "dev": true, - "requires": { - "tape": "^4.8.0" - } + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.4.tgz", + "integrity": "sha512-91k8bjcldstRz1bG6zJo8lWD7c6QXcB4nTDUqiEvIL1xAsLoZlOOZZG+nd6YPz+V7zY1580J4Xxh1vZtyv4i/w==", + "dev": true }, "once": { "version": "1.4.0", @@ -6023,17 +5837,17 @@ } }, "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" } }, "ordered-json": { @@ -6058,12 +5872,12 @@ "dev": true }, "os-locale": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-4.0.0.tgz", - "integrity": "sha512-HsSR1+2l6as4Wp2SGZxqLnuFHxVvh1Ir9pvZxyujsC13egZVe7P0YeBLN0ijQzM/twrO5To3ia3jzBXAvpMTEA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-5.0.0.tgz", + "integrity": "sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==", "dev": true, "requires": { - "execa": "^1.0.0", + "execa": "^4.0.0", "lcid": "^3.0.0", "mem": "^5.0.0" } @@ -6092,12 +5906,6 @@ "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", "dev": true }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, "p-is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", @@ -6105,9 +5913,9 @@ "dev": true }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -6123,9 +5931,9 @@ } }, "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, "requires": { "aggregate-error": "^3.0.0" @@ -6224,9 +6032,9 @@ "dev": true }, "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { @@ -6248,17 +6056,17 @@ "dev": true }, "pino": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-5.15.0.tgz", - "integrity": "sha512-7+FXMTA3H3sNP5+2miY2K9JKnAAW5GKuhHfNWsukFCsPprGQY3ctqpwbV74wAHW3Nl93cEEQ1G82MgOLM8P7TQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-6.0.0.tgz", + "integrity": "sha512-3RfX2L76o7v230FP1fZ3Fo/WX7Su+P1Ld+pvBm2j+MyUjtA/KqDYxMkzBqzcX3R00zbC7Gf/HqIzyuu3tgvi9Q==", "dev": true, "requires": { "fast-redact": "^2.0.0", "fast-safe-stringify": "^2.0.7", "flatstr": "^1.0.12", "pino-std-serializers": "^2.4.2", - "quick-format-unescaped": "^3.0.3", - "sonic-boom": "^0.7.5" + "quick-format-unescaped": "^4.0.1", + "sonic-boom": "^1.0.0" } }, "pino-std-serializers": { @@ -6280,9 +6088,9 @@ "dev": true }, "postcss": { - "version": "7.0.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.26.tgz", - "integrity": "sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA==", + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -6290,6 +6098,28 @@ "supports-color": "^6.1.0" }, "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -6302,9 +6132,9 @@ } }, "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "prepend-http": { @@ -6327,9 +6157,9 @@ } }, "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, "progress": { @@ -6355,9 +6185,9 @@ } }, "psl": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", - "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, "pump": { @@ -6383,9 +6213,9 @@ "dev": true }, "quick-format-unescaped": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-3.0.3.tgz", - "integrity": "sha512-dy1yjycmn9blucmJLXOfZDx1ikZJUi6E8bBZLnhPG5gBrVhHXx2xVyqqgKBubVNEXmx51dBACMHpoMQK/N/AXQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.1.tgz", + "integrity": "sha512-RyYpQ6Q5/drsJyOhrWHYMWTedvjTIat+FTwv0K4yoUxzvekw2aRHMQJLlnvt8UantkZg2++bEzD9EdxXqkWf4A==", "dev": true }, "rc": { @@ -6409,18 +6239,14 @@ } }, "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, "readdirp": { @@ -6432,6 +6258,23 @@ "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } } }, "readline2": { @@ -6472,9 +6315,9 @@ } }, "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", "dev": true }, "regex-not": { @@ -6498,9 +6341,9 @@ } }, "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", "dev": true }, "registry-auth-token": { @@ -6529,6 +6372,19 @@ "requires": { "chalk": "^2.4.2", "commander": "^2.6.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } } }, "remove-trailing-separator": { @@ -6655,15 +6511,6 @@ "signal-exit": "^3.0.2" } }, - "resumer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", - "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", - "dev": true, - "requires": { - "through": "~2.3.4" - } - }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -6677,31 +6524,19 @@ "dev": true }, "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { "glob": "^7.1.3" } }, "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true }, "rx-lite": { "version": "3.1.2", @@ -6710,9 +6545,9 @@ "dev": true }, "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -6755,14 +6590,12 @@ "semver": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" }, "semver-bundle": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/semver-bundle/-/semver-bundle-0.1.1.tgz", "integrity": "sha512-AXZEjNFlP6BzqRlWQNF3NBGsDw/clPcuUAk1mUl+ypnSplG20CDLQj5ofmaj40vlUHt40duxH3d/x/RXItLAHA==", - "dev": true, "requires": { "semver": "^5.5.0" } @@ -6787,8 +6620,7 @@ "semver-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", - "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", - "dev": true + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==" }, "set-blocking": { "version": "2.0.0", @@ -6830,18 +6662,18 @@ } }, "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "shell-quote": { @@ -6959,14 +6791,6 @@ "tough-cookie": "~2.4.3", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } } }, "tough-cookie": { @@ -6978,13 +6802,19 @@ "psl": "^1.1.24", "punycode": "^1.4.1" } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true } } }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, "slice-ansi": { @@ -7151,32 +6981,23 @@ } }, "socks-proxy-agent": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", - "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", + "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", "dev": true, "requires": { - "agent-base": "~4.2.1", - "socks": "~2.3.2" - }, - "dependencies": { - "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - } + "agent-base": "6", + "debug": "4", + "socks": "^2.3.3" } }, "sonic-boom": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-0.7.6.tgz", - "integrity": "sha512-k9E2QQ4zxuVRLDW+ZW6ISzJs3wlEorVdmM7ApDgor7wsGKSDG5YGHsGmgLY4XYh4DMlr/2ap2BWAE7yTFJtWnQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.0.1.tgz", + "integrity": "sha512-o9tx+bonVEXSaPtptyXQXpP8l6UV9Bi3im2geZskvWw2a/o/hrbWI7EBbbv+rOx6Hubnzun9GgH4WfbgEA3MFQ==", "dev": true, "requires": { + "atomic-sleep": "^1.0.0", "flatstr": "^1.0.12" } }, @@ -7267,12 +7088,11 @@ } }, "ssri": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", - "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", + "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", "dev": true, "requires": { - "figgy-pudding": "^3.5.1", "minipass": "^3.1.1" } }, @@ -7372,48 +7192,48 @@ "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } } }, - "string.prototype.trim": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz", - "integrity": "sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw==", + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1" + "es-abstract": "^1.17.5" } }, "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", "dev": true, "requires": { "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" } }, "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", "dev": true, "requires": { "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, "string_decoder": { @@ -7426,20 +7246,12 @@ } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } + "ansi-regex": "^5.0.0" } }, "strip-bom": { @@ -7467,29 +7279,27 @@ "strip-bom-buf": "^2.0.0" } }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", + "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", "dev": true }, "stylelint-bundle": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/stylelint-bundle/-/stylelint-bundle-8.0.0.tgz", - "integrity": "sha512-kASuh8U4SbfDh12plCbwmIvttR8P/+Y33OwJ2t5GZuradF2Hk9dP27U5cPyqK8HAPw7wbr/LHYwkjQiSL7gh3A==", - "dev": true + "integrity": "sha512-kASuh8U4SbfDh12plCbwmIvttR8P/+Y33OwJ2t5GZuradF2Hk9dP27U5cPyqK8HAPw7wbr/LHYwkjQiSL7gh3A==" }, "stylus-lang-bundle": { "version": "0.54.5", "resolved": "https://registry.npmjs.org/stylus-lang-bundle/-/stylus-lang-bundle-0.54.5.tgz", - "integrity": "sha512-UGd0rNe1aiXAMzOUNiIoH7Y4qVN6poYHZTt/tM6vJ4UWS8negVxds4H25Rm+TDJH8clkd+R8n+3VIaa3C7LbVw==", - "dev": true + "integrity": "sha512-UGd0rNe1aiXAMzOUNiIoH7Y4qVN6poYHZTt/tM6vJ4UWS8negVxds4H25Rm+TDJH8clkd+R8n+3VIaa3C7LbVw==" }, "supports-color": { "version": "5.5.0", @@ -7521,6 +7331,12 @@ "string-width": "^3.0.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -7543,47 +7359,25 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } - } - } - }, - "tape": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/tape/-/tape-4.13.0.tgz", - "integrity": "sha512-J/hvA+GJnuWJ0Sj8Z0dmu3JgMNU+MmusvkCT7+SN4/2TklW18FNCp/UuHIEhPZwHfy4sXfKYgC7kypKg4umbOw==", - "dev": true, - "requires": { - "deep-equal": "~1.1.1", - "defined": "~1.0.0", - "dotignore": "~0.1.2", - "for-each": "~0.3.3", - "function-bind": "~1.1.1", - "glob": "~7.1.6", - "has": "~1.0.3", - "inherits": "~2.0.4", - "is-regex": "~1.0.5", - "minimist": "~1.2.0", - "object-inspect": "~1.7.0", - "resolve": "~1.14.2", - "resumer": "~0.0.0", - "string.prototype.trim": "~1.2.1", - "through": "~2.3.8" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } } } }, "tar": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.1.tgz", - "integrity": "sha512-bKhKrrz2FJJj5s7wynxy/fyxpE0CmCjmOQ1KV4KkgXFWOgoIT/NbTMnB1n+LFNrNk0SSBVGGxcK5AGsyC+pW5Q==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.2.tgz", + "integrity": "sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==", "dev": true, "requires": { - "chownr": "^1.1.3", + "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^3.0.0", "minizlib": "^2.1.0", @@ -7592,26 +7386,24 @@ }, "dependencies": { "mkdirp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", - "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true } } }, "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", + "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", "dev": true, "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", + "bl": "^4.0.1", + "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" } }, "term-size": { @@ -7740,9 +7532,9 @@ } }, "tr46": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.0.tgz", - "integrity": "sha512-LrErSqfhdUw73AC/eXV2fEmNkvgSYxfm5lvxnLvuVgoVDknvD28Pa5FeDGc8RuVouDxUD3GnHHFv7xnBp7As5w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", "dev": true, "requires": { "punycode": "^2.1.1" @@ -7755,9 +7547,9 @@ "dev": true }, "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", "dev": true }, "tunnel-agent": { @@ -7782,12 +7574,12 @@ "dev": true }, "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" } }, "type-detect": { @@ -7820,8 +7612,7 @@ "underscore": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", - "dev": true + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=" }, "union-value": { "version": "1.0.1", @@ -7865,13 +7656,12 @@ "universal-base64": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/universal-base64/-/universal-base64-2.1.0.tgz", - "integrity": "sha512-WeOkACVnIXJZr/qlv7++Rl1zuZOHN96v2yS5oleUuv8eJOs5j9M5U3xQEIoWqn1OzIuIcgw0fswxWnUVGDfW6g==", - "dev": true + "integrity": "sha512-WeOkACVnIXJZr/qlv7++Rl1zuZOHN96v2yS5oleUuv8eJOs5j9M5U3xQEIoWqn1OzIuIcgw0fswxWnUVGDfW6g==" }, "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", "dev": true }, "unset-value": { @@ -8035,7 +7825,6 @@ "version": "0.9.0", "resolved": "https://registry.npmjs.org/usercss-meta/-/usercss-meta-0.9.0.tgz", "integrity": "sha512-S6AuhI11jc2xh6DIx3xR+4EU5/YiV0lLIvDhJgE5BTJTkcBEXrScJUIKVvzApGRou3lSLV0Qi4fVbSsN9BR6Ig==", - "dev": true, "requires": { "semver-regex": "^2.0.0" } @@ -8047,15 +7836,14 @@ "dev": true }, "uuid": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.0-beta.0.tgz", - "integrity": "sha512-Am22LVM3UXB0DTzQAeDSsZwP5eyqjIhmff330hqkxGvIxX8RRrUYLtKJ0eYxiBgjeQdUaMONpBZbJachMShxBw==", - "dev": true + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.1.0.tgz", + "integrity": "sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg==" }, "v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", "dev": true }, "verror": { @@ -8070,12 +7858,12 @@ } }, "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz", + "integrity": "sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==", "dev": true, "requires": { - "chokidar": "^2.0.2", + "chokidar": "^2.1.8", "graceful-fs": "^4.1.2", "neo-async": "^2.5.0" } @@ -8090,9 +7878,9 @@ } }, "web-ext": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/web-ext/-/web-ext-4.1.0.tgz", - "integrity": "sha512-nhAeZ3BHI4rCT/J+s7JHg0U3G6qUMV8Bi44ohWm8X6GjlQV8tGcD6rkvN4Zk2zzMGaF9sHUOcRjyN79Ih8P/PQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/web-ext/-/web-ext-4.2.0.tgz", + "integrity": "sha512-WM03BEeC7CVw4PV8lwXKO6ag00MYdwMMe1SAJJfxz0uNMbTu7cYoH6Ia+e2DnAzpeOJLKCeL1IXvgxZSwVp4/Q==", "dev": true, "requires": { "@babel/polyfill": "7.7.0", @@ -8100,19 +7888,19 @@ "@cliqz-oss/firefox-client": "0.3.1", "@cliqz-oss/node-firefox-connect": "1.2.1", "adbkit": "2.11.1", - "addons-linter": "1.20.0", + "addons-linter": "1.23.0", "bunyan": "1.8.12", "camelcase": "5.3.1", - "chrome-launcher": "0.12.0", + "chrome-launcher": "0.13.1", "debounce": "1.2.0", "decamelize": "3.2.0", "es6-error": "4.1.1", "event-to-promise": "0.8.0", - "firefox-profile": "1.3.0", + "firefox-profile": "1.3.1", "fx-runner": "1.0.11", "git-rev-sync": "2.0.0", "import-fresh": "3.2.1", - "mkdirp": "0.5.1", + "mkdirp": "1.0.3", "multimatch": "4.0.0", "mz": "2.7.0", "node-notifier": "6.0.0", @@ -8125,12 +7913,24 @@ "strip-json-comments": "3.0.1", "tmp": "0.1.0", "update-notifier": "4.0.0", - "watchpack": "1.6.0", - "ws": "7.2.1", + "watchpack": "1.6.1", + "ws": "7.2.3", "yargs": "15.1.0", "zip-dir": "1.0.2" }, "dependencies": { + "mkdirp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", + "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==", + "dev": true + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true + }, "tmp": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", @@ -8177,9 +7977,9 @@ "dev": true }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -8247,15 +8047,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } } } }, @@ -8275,9 +8066,9 @@ } }, "write-file-atomic": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", - "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "requires": { "imurmurhash": "^0.1.4", @@ -8287,9 +8078,9 @@ } }, "ws": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.1.tgz", - "integrity": "sha512-sucePNSafamSKoOqoNfBd8V0StlkzJKL2ZAhGQinCfNQ+oacw+Pk7lcdAElecBF2VkLNZRiIb5Oi1Q5lVUVt2A==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", + "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", "dev": true }, "xdg-basedir": { @@ -8365,13 +8156,23 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true + }, + "yargs-parser": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", + "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, "yargs-parser": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", - "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -8415,66 +8216,14 @@ } }, "zip-stream": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-2.1.2.tgz", - "integrity": "sha512-ykebHGa2+uzth/R4HZLkZh3XFJzivhVsjJt8bN3GvBzLaqqrUdRacu+c4QtnUgjkkQfsOuNE1JgLKMCPNmkKgg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-3.0.1.tgz", + "integrity": "sha512-r+JdDipt93ttDjsOVPU5zaq5bAyY+3H19bDrThkvuVxC0xMQzU1PJcS6D+KrP3u96gH9XLomcHPb+2skoDjulQ==", "dev": true, "requires": { "archiver-utils": "^2.1.0", - "compress-commons": "^2.1.1", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "compress-commons": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-2.1.1.tgz", - "integrity": "sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q==", - "dev": true, - "requires": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^3.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^2.3.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - } - } - }, - "crc32-stream": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz", - "integrity": "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==", - "dev": true, - "requires": { - "crc": "^3.4.4", - "readable-stream": "^3.4.0" - } - }, - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } + "compress-commons": "^3.0.0", + "readable-stream": "^3.6.0" } } } diff --git a/package.json b/package.json index 3f3acd3f..f79dceca 100644 --- a/package.json +++ b/package.json @@ -1,30 +1,32 @@ { "name": "Stylus", - "version": "1.5.10", + "version": "1.5.13", "description": "Redesign the web with Stylus, a user styles manager", "license": "GPL-3.0-only", "repository": "openstyles/stylus", "author": "Stylus Team", - "devDependencies": { - "archiver": "^3.1.1", - "codemirror": "^5.51.0", + "dependencies": { + "codemirror": "^5.56.0", "db-to-cloud": "^0.4.5", - "endent": "^1.4.0", - "eslint": "^6.8.0", - "fs-extra": "^8.1.0", "jsonlint": "^1.6.3", "less-bundle": "github:openstyles/less-bundle#v0.1.0", "lz-string-unsafe": "^1.4.4-fork-1", - "make-fetch-happen": "^7.1.1", "semver-bundle": "^0.1.1", - "shx": "^0.3.2", "stylelint-bundle": "^8.0.0", "stylus-lang-bundle": "^0.54.5", + "usercss-meta": "^0.9.0", + "uuid": "^8.1.0" + }, + "devDependencies": { + "archiver": "^4.0.1", + "endent": "^1.4.0", + "eslint": "^7.1.0", + "fs-extra": "^9.0.0", + "make-fetch-happen": "^8.0.7", + "shx": "^0.3.2", "sync-version": "^1.0.1", "tiny-glob": "^0.2.6", - "usercss-meta": "^0.9.0", - "uuid": "^7.0.0-beta.0", - "web-ext": "^4.1.0", + "web-ext": "^4.2.0", "webext-tx-fix": "^0.3.3" }, "scripts": { diff --git a/popup.html b/popup.html index fd80f988..41cd7852 100644 --- a/popup.html +++ b/popup.html @@ -179,7 +179,6 @@ - diff --git a/popup/popup.css b/popup/popup.css index 9e0e509a..5706b877 100644 --- a/popup/popup.css +++ b/popup/popup.css @@ -341,6 +341,13 @@ a.configure[target="_blank"] .svg-icon.config { overflow: hidden; text-overflow: ellipsis; } +#confirm button[data-cmd="ok"]:not([data-focused-via-click]):focus { + outline: red auto 1px; +} +/* FF ignores color with 'auto' */ +.firefox #confirm button[data-cmd="ok"]:not([data-focused-via-click]):focus { + outline: red solid 1px; +} .menu-items-wrapper { width: 80%; max-height: 80%; diff --git a/popup/popup.js b/popup/popup.js index 661b8f62..e8c13b08 100644 --- a/popup/popup.js +++ b/popup/popup.js @@ -15,7 +15,7 @@ const ABOUT_BLANK = 'about:blank'; const ENTRY_ID_PREFIX_RAW = 'style-'; const ENTRY_ID_PREFIX = '#' + ENTRY_ID_PREFIX_RAW; -if (CHROME >= 3345 && CHROME < 3533) { // Chrome 66-69 adds a gap, https://crbug.com/821143 +if (CHROME >= 66 && CHROME <= 69) { // Chrome 66-69 adds a gap, https://crbug.com/821143 document.head.appendChild($create('style', 'html { overflow: overlay }')); } diff --git a/popup/search-results.js b/popup/search-results.js index 9e6cbab2..d46982ac 100755 --- a/popup/search-results.js +++ b/popup/search-results.js @@ -1,6 +1,6 @@ /* global tabURL handleEvent $ $$ prefs template FIREFOX chromeLocal debounce $create t API tWordBreak formatDate tryCatch tryJSONparse LZString - ignoreChromeError download */ + promisifyChrome download */ 'use strict'; window.addEventListener('showStyles:done', function _() { @@ -88,6 +88,9 @@ window.addEventListener('showStyles:done', function _() { return; function init() { + promisifyChrome({ + 'storage.local': ['getBytesInUse'], // FF doesn't implement it + }); setTimeout(() => document.body.classList.add(BODY_CLASS)); $('#find-styles-inline-group').classList.add('hidden'); @@ -711,7 +714,7 @@ window.addEventListener('showStyles:done', function _() { return chromeLocal.loadLZStringScript().then(() => tryJSONparse(LZString.decompressFromUTF16(item.payload))); } else if (item) { - chrome.storage.local.remove(key); + chromeLocal.remove(key); } }); } @@ -742,16 +745,8 @@ window.addEventListener('showStyles:done', function _() { function cleanupCache() { chromeLocal.remove(CACHE_CLEANUP_NEEDED); - if (chrome.storage.local.getBytesInUse) { - chrome.storage.local.getBytesInUse(null, size => { - if (size > CACHE_SIZE) { - chrome.storage.local.get(null, cleanupCacheInternal); - } - ignoreChromeError(); - }); - } else { - chrome.storage.local.get(null, cleanupCacheInternal); - } + Promise.resolve(!browser.storage.local.getBytesInUse ? 1e99 : browser.storage.local.getBytesInUse()) + .then(size => size > CACHE_SIZE && chromeLocal.get().then(cleanupCacheInternal)); } function cleanupCacheInternal(storage) { @@ -764,9 +759,8 @@ window.addEventListener('showStyles:done', function _() { sortedByTime.slice(0, sortedByTime.length / 2); const toRemove = expired.length ? expired : sortedByTime; if (toRemove.length) { - chrome.storage.local.remove(toRemove.map(item => item.key), ignoreChromeError); + chromeLocal.remove(toRemove.map(item => item.key)); } - ignoreChromeError(); } //endregion @@ -779,6 +773,7 @@ window.addEventListener('showStyles:done', function _() { return download(url, { body: null, responseType: 'json', + timeout: 60e3, headers: { 'Referrer-Policy': 'origin-when-cross-origin', [xhrSpoofTelltale]: requestId, diff --git a/vendor-overwrites/colorpicker/colorconverter.js b/vendor-overwrites/colorpicker/colorconverter.js index 17eea98a..2889ef44 100644 --- a/vendor-overwrites/colorpicker/colorconverter.js +++ b/vendor-overwrites/colorpicker/colorconverter.js @@ -106,7 +106,7 @@ const colorConverter = (() => { if (!type) return; const comma = value.includes(',') && !value.includes('/'); - const num = value.split(comma ? /\s*,\s*/ : /\s+(?!\/)|\s*\/\s*/); + const num = value.trim().split(comma ? /\s*,\s*/ : /\s+(?!\/)|\s*\/\s*/); if (num.length < 3 || num.length > 4) return; if (num[3] && !validateAlpha(num[3])) return null; diff --git a/vendor-overwrites/colorpicker/colorview.js b/vendor-overwrites/colorpicker/colorview.js index 8614b524..f88fe07b 100644 --- a/vendor-overwrites/colorpicker/colorview.js +++ b/vendor-overwrites/colorpicker/colorview.js @@ -182,12 +182,13 @@ if (viewFrom > 0 || viewTo < cm.doc.size) { clearTimeout(state.colorizeTimer); - state.colorizeTimer = setTimeout(colorizeInvisible, 100, state, viewFrom, viewTo, 0); + state.line = 0; + state.colorizeTimer = setTimeout(colorizeInvisible, 100, state, viewFrom, viewTo); } } - function colorizeInvisible(state, viewFrom, viewTo, line) { + function colorizeInvisible(state, viewFrom, viewTo) { const {cm} = state; const {curOp} = cm; if (!curOp) cm.startOperation(); @@ -197,22 +198,19 @@ state.stopped = null; // before the visible range - if (viewFrom) { - state.line = line; - cm.doc.iter(line, viewFrom, lineHandle => colorizeLine(state, lineHandle)); - } + cm.eachLine(state.line, viewFrom, lineHandle => colorizeLine(state, lineHandle)); // after the visible range if (!state.stopped && viewTo < cm.doc.size) { - state.line = viewTo; - cm.doc.iter(viewTo, cm.doc.size, lineHandle => colorizeLine(state, lineHandle)); + state.line = Math.max(viewTo, state.line); + cm.eachLine(state.line, cm.doc.size, lineHandle => colorizeLine(state, lineHandle)); } updateMarkers(state); if (!curOp) cm.endOperation(); if (state.stopped) { - state.colorizeTimer = setTimeout(colorizeInvisible, 0, state, viewFrom, viewFrom, state.line); + state.colorizeTimer = setTimeout(colorizeInvisible, 0, state, viewFrom, viewTo); } } diff --git a/vendor-overwrites/csslint/csslint.js b/vendor-overwrites/csslint/csslint.js index b57e98e2..9555890e 100644 --- a/vendor-overwrites/csslint/csslint.js +++ b/vendor-overwrites/csslint/csslint.js @@ -229,30 +229,33 @@ var CSSLint = (() => { // Example 1: - /* csslint ignore:start */ - // the chunk of code where errors won't be reported - // the chunk's start is hardwired to the line of the opening comment - // the chunk's end is hardwired to the line of the closing comment - /* csslint ignore:end */ + /* csslint ignore:start */ + /* + the chunk of code where errors won't be reported + the chunk's start is hardwired to the line of the opening comment + the chunk's end is hardwired to the line of the closing comment + */ + /* csslint ignore:end */ // Example 2: + // allow rule violations on the current line: - /* csslint allow:rulename1,rulename2,... */ - // allows to break the specified rules on the next single line of code + // foo: bar; /* csslint allow:rulename1,rulename2,... */ + /* csslint allow:rulename1,rulename2,... */ // foo: bar; // Example 3: - /* csslint rulename1 */ - /* csslint rulename2:N */ - /* csslint rulename3:N, rulename4:N */ + /* csslint rulename1 */ + /* csslint rulename2:N */ + /* csslint rulename3:N, rulename4:N */ - // entire code is affected; - // comments futher down the code extend/override previous comments of this kind - // values for N: - // "2" or "true" means "error" - // "1" or nothing means "warning" - note in this case ":" can also be omitted - // "0" or "false" means "ignore" - // (the quotes are added here for convenience, don't put them in the actual comments) + /* entire code is affected; + * comments futher down the code extend/override previous comments of this kind + * values for N (without the backquotes): + `2` or `true` means "error" + `1` or omitted means "warning" (when omitting, the colon can be omitted too) + `0` or `false` means "ignore" + */ function applyEmbeddedOverrides(text, ruleset, allow, ignore) { let ignoreStart = null; @@ -282,7 +285,7 @@ var CSSLint = (() => { allowRuleset[allowRule.trim()] = true; num++; }); - if (num) allow[lineno + 1] = allowRuleset; + if (num) allow[lineno] = allowRuleset; break; } diff --git a/vendor-overwrites/csslint/parserlib.js b/vendor-overwrites/csslint/parserlib.js index da4095ca..480aef97 100644 --- a/vendor-overwrites/csslint/parserlib.js +++ b/vendor-overwrites/csslint/parserlib.js @@ -319,7 +319,7 @@ self.parserlib = (() => { 'drop-initial-before-align': 'caps-height | baseline | use-script | before-edge | text-before-edge | ' + 'after-edge | text-after-edge | central | middle | ideographic | alphabetic | ' + 'hanging | mathematical', - 'drop-initial-size': 'auto | line | | ', + 'drop-initial-size': 'auto | line | ', 'drop-initial-value': '', // E @@ -347,19 +347,28 @@ self.parserlib = (() => { 'flood-opacity': '', 'font': ' | caption | icon | menu | message-box | small-caption | status-bar', 'font-family': '', - 'font-feature-settings': ' | normal', + 'font-feature-settings': '# | normal', 'font-kerning': 'auto | normal | none', + 'font-language-override': 'normal | ', + 'font-optical-sizing': 'auto | none', + 'font-palette': 'none | normal | light | dark | ', 'font-size': '', 'font-size-adjust': ' | none', 'font-stretch': '', 'font-style': '', + 'font-synthesis': 'none | [ weight || style ]', + 'font-synthesis-style': 'auto | none', + 'font-synthesis-weight': 'auto | none', + 'font-synthesis-small-caps': 'auto | none', 'font-variant': ' | normal | none', 'font-variant-alternates': ' | normal', 'font-variant-caps': ' | normal', 'font-variant-east-asian': ' | normal', + 'font-variant-emoji': 'auto | text | emoji | unicode', 'font-variant-ligatures': ' | normal | none', 'font-variant-numeric': ' | normal', 'font-variant-position': 'normal | sub | super', + 'font-variation-settings': 'normal | [ ]#', 'font-weight': '', '-ms-flex-align': 'start | end | center | stretch | baseline', '-ms-flex-order': '', @@ -392,7 +401,7 @@ self.parserlib = (() => { 'grid-gap': ' ?', // H - 'hanging-punctuation': 1, + 'hanging-punctuation': 'none | [ first || [ force-end | allow-end ] || last ]', 'height': 'auto | ', 'hyphenate-after': ' | auto', 'hyphenate-before': ' | auto', @@ -431,7 +440,7 @@ self.parserlib = (() => { 'left': '', 'letter-spacing': ' | normal', 'line-height': '', - 'line-break': 'auto | loose | normal | strict', + 'line-break': 'auto | loose | normal | strict | anywhere', 'line-stacking': 1, 'line-stacking-ruby': 'exclude-ruby | include-ruby', 'line-stacking-shift': 'consider-shifts | disregard-shifts', @@ -502,9 +511,14 @@ self.parserlib = (() => { 'overflow-block': '', 'overflow-inline': '', 'overflow-style': 1, - 'overflow-wrap': 'normal | break-word', + 'overflow-wrap': 'normal | break-word | anywhere', 'overflow-x': '', 'overflow-y': '', + 'overscroll-behavior': '{1,2}', + 'overscroll-behavior-block': '', + 'overscroll-behavior-inline': '', + 'overscroll-behavior-x': '', + 'overscroll-behavior-y': '', // P 'padding': '{1,4}', @@ -564,6 +578,8 @@ self.parserlib = (() => { // S 'scale': 'none | {1,3}', + 'scrollbar-color': 'auto | dark | light | {2}', + 'scrollbar-width': 'auto | thin | none', 'shape-inside': 'auto | outside-shape | [ || shape-box ] | | display', 'shape-rendering': 'auto | optimizeSpeed | crispEdges | geometricPrecision', 'size': 1, @@ -588,14 +604,14 @@ self.parserlib = (() => { // T 'table-layout': 'auto | fixed', - 'tab-size': ' | ', + 'tab-size': ' | ', 'target': 1, 'target-name': 1, 'target-new': 1, 'target-position': 1, - 'text-align': 'start | end | left | right | center | justify | match-parent | justify-all', - 'text-align-all': 'start | end | left | right | center | justify | match-parent', - 'text-align-last': 'auto | start | end | left | right | center | justify', + 'text-align': ' | justify-all', + 'text-align-all': '', + 'text-align-last': ' | auto', 'text-anchor': 'start | middle | end', 'text-decoration': ' || || ', 'text-decoration-color': '', @@ -607,13 +623,13 @@ self.parserlib = (() => { 'text-emphasis-style': '', 'text-emphasis-position': '[ over | under ] && [ right | left ]?', 'text-height': 1, - 'text-indent': ' | ', - 'text-justify': 'auto | none | inter-word | inter-ideograph | inter-cluster | distribute | kashida', + 'text-indent': ' && hanging? && each-line?', + 'text-justify': 'auto | none | inter-word | inter-character', 'text-outline': 1, 'text-overflow': 'clip | ellipsis', 'text-rendering': 'auto | optimizeSpeed | optimizeLegibility | geometricPrecision', 'text-shadow': 'none | [ ? && {2,3} ]#', - 'text-transform': 'capitalize | uppercase | lowercase | none', + 'text-transform': 'none | [ capitalize | uppercase | lowercase ] || full-width || full-size-kana', 'text-underline-position': 'auto | [ under || [ left | right ] ]', 'text-wrap': 'normal | none | avoid', 'top': '', @@ -650,15 +666,14 @@ self.parserlib = (() => { 'volume': 1, // W - 'white-space': 'normal | pre | nowrap | pre-wrap | pre-line | -pre-wrap |' + - ' -o-pre-wrap | -moz-pre-wrap | -hp-pre-wrap', + 'white-space': 'normal | pre | nowrap | pre-wrap | break-spaces | pre-line', 'white-space-collapse': 1, 'widows': '', 'width': 'auto | ', 'will-change': '', - 'word-break': 'normal | keep-all | break-all', + 'word-break': 'normal | keep-all | break-all | break-word', 'word-spacing': ' | normal', - 'word-wrap': 'normal | break-word', + 'word-wrap': 'normal | break-word | anywhere', 'writing-mode': 'horizontal-tb | vertical-rl | vertical-lr | lr-tb | rl-tb | tb-rl | ' + 'bt-rl | tb-lr | bt-lr | lr-bt | rl-bt | lr | rl | tb', @@ -711,7 +726,7 @@ self.parserlib = (() => { '': '', - '': 'normal | | ', + '': 'normal | ', '': 'space-between | space-around | space-evenly | stretch', '': 'center | start | end | flex-start | flex-end', @@ -747,17 +762,17 @@ self.parserlib = (() => { '': '', '': 'nowrap | wrap | wrap-reverse', - '': ' | | | ', - '': 'normal | ultra-condensed | extra-condensed | condensed | semi-condensed | ' + + '': ' | | ', + '': 'normal | | ultra-condensed | extra-condensed | condensed | semi-condensed | ' + 'semi-expanded | expanded | extra-expanded | ultra-expanded', - '': 'normal | italic | oblique', + '': 'normal | italic | oblique ?', '': 'small-caps | all-small-caps | petite-caps | all-petite-caps | ' + 'unicase | titling-caps', '': 'normal | small-caps', - '': 'normal | bold | bolder | lighter | ' + - '100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900', + '': 'normal | bold | bolder | lighter | ', - '': 'serif | sans-serif | cursive | fantasy | monospace', + '': 'serif | sans-serif | cursive | fantasy | monospace | system-ui | emoji | ' + + 'math | fangsong | ui-serif | ui-sans-serif | ui-monospace | ui-rounded', '': ' | fill-box | stroke-box | view-box', @@ -798,7 +813,7 @@ self.parserlib = (() => { '': part => part.type === 'integer', - '': ' | | | normal', + '': ' | | normal', '': function (part) { // eslint-disable-next-line no-use-before-define @@ -868,6 +883,8 @@ self.parserlib = (() => { '': part => part.type === 'string', + '': 'start | end | left | right | center | justify | match-parent', + '': 'solid | double | dotted | dashed | wavy', '