diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 476654842..be23bb1d3 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -33,4 +33,4 @@ Please describe the tests that you ran to verify your changes. Provide instructi - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] Any dependent changes have been merged and published in downstream modules -- [ ] I have updated type definitions in [DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/spectacle/index.d.ts) for any breaking API changes +- [ ] I have updated type definitions in `index.d.ts` for any breaking API changes diff --git a/LICENSE b/LICENSE index e0bb8c7df..cd46f55b2 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,9 @@ The MIT License (MIT) -Copyright (c) 2013 +Copyright (c) 2013-2018 Formidable Labs, Inc. + +Copyright (c) 2016-2018 Zachary Maybury, Kylie Stewart, and potentially other +DefinitelyTyped contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in @@ -17,4 +20,4 @@ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 000000000..390b87ac1 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,319 @@ +// Definitions by: Zachary Maybury +// Kylie Stewart + +declare module 'spectacle' { + import * as CSS from 'csstype'; + import * as React from 'react'; + + /** + * Alignment Types for Spectacle + */ + type alignType = + | 'flex-start flex-start' + | 'flex-start center' + | 'flex-start flex-end' + | 'center flex-start' + | 'center center' + | 'center flex-end' + | 'flex-end flex-start' + | 'flex-end center' + | 'flex-end flex-end'; + + /** + * Animation Types for Spectacle + */ + type easeType = + | 'back' + | 'backIn' + | 'backOut' + | 'backInOut' + | 'bounce' + | 'bounceIn' + | 'bounceOut' + | 'bounceInOut' + | 'circle' + | 'circleIn' + | 'circleOut' + | 'circleInOut' + | 'linear' + | 'linearIn' + | 'linearOut' + | 'linearInOut' + | 'cubic' + | 'cubicIn' + | 'cubicOut' + | 'cubicInOut' + | 'elastic' + | 'elasticIn' + | 'elasticOut' + | 'elasticInOut' + | 'exp' + | 'expIn' + | 'expOut' + | 'expInOut' + | 'poly' + | 'polyIn' + | 'polyOut' + | 'polyInOut' + | 'quad' + | 'quadIn' + | 'quadOut' + | 'quadInOut' + | 'sin' + | 'sinIn' + | 'sinOut' + | 'sinInOut'; + + /** + * Progress Types for Spectacle + */ + type progressType = 'pacman' | 'bar' | 'number' | 'none'; + + /** + * S Types for StyledS in Spectacle + */ + type sType = 'italic' | 'bold' | 'line-through' | 'underline'; + + /** + * Target Types for links + */ + type targetType = '_blank' | '_self' | '_parent' | '_top'; + + /** + * Theme Types for CodePane in Spectacle + */ + type themeType = 'dark' | 'light' | 'external'; + + /** + * Transition Types for Spectacle + */ + type transitionType = 'slide' | 'zoom' | 'fade' | 'spin'; + + /** + * All available DOM style properties and their types + * https://www.npmjs.com/package/csstype + */ + interface CSSProperties extends CSS.Properties {} + + interface AnimProps { + easing: easeType; + fromStyle: CSSProperties | CSSProperties[]; + onAnim?: (forwards?: boolean, animIndex?: number) => void; + order?: number; + route?: object; + style?: CSSProperties; + toStyle: CSSProperties | CSSProperties[]; + transitionDuration: number; + } + + interface AppearProps { + easing?: easeType; + endValue?: object; + fid?: string; + order?: number; + startValue?: object; + style?: BaseProps['style']; + transitionDuration?: number; + } + + /** + * Base props for many Spectacle components + */ + interface BaseProps { + bgColor?: string; + bgDarken?: number; + bgImage?: string; + bold?: boolean; + caps?: boolean; + className?: string; + italic?: boolean; + margin?: number | string; + padding?: number | string; + style?: CSSProperties; + textAlign?: string; + textColor?: string; + textFont?: string; + textSize?: string; + } + + interface CodePaneProps { + className?: BaseProps['className']; + contentEditable?: boolean; + lang?: string; + source?: string; + style?: BaseProps['style']; + theme?: themeType; + } + + interface ComponentPlaygroundProps { + code?: string; + previewBackgroundColor?: string; + scope?: object; + theme?: themeType; + transformCode?: (code: string) => string; + } + + interface DeckProps { + autoplay?: boolean; + autoplayDuration?: number; + autoplayLoop?: boolean; + controls?: boolean; + globalStyles?: boolean; + history?: any; // Needs a type, see https://github.com/ReactTraining/history + onStateChange?: (previousState?: string, nextState?: string) => void; + progress?: progressType; + theme?: Theme; + transition?: transitionType[]; + transitionDuration?: number; + } + + interface FillProps { + className?: string; + style?: CSSProperties; + } + + interface FitProps extends FillProps {} // tslint:disable-line:no-empty-interface + + interface GoToActionProps { + margin?: BaseProps['margin']; + padding?: BaseProps['padding']; + render?: (goToSlide?: (slide: number | string) => void) => void; + slide?: number | string; + style?: BaseProps['style']; + } + + interface HeadingProps extends BaseProps { + fit?: boolean; + lineHeight?: number; + size?: number; + } + + interface ImageProps { + alt?: string; + className?: BaseProps['className']; + display?: string; + height?: number | string; + margin?: BaseProps['margin']; + padding?: BaseProps['padding']; + src?: string; + width?: number | string; + } + + interface LayoutProps { + style?: CSSProperties; + } + + interface LinkProps extends BaseProps { + href?: string; + target?: targetType; + } + + interface MarkdownProps { + mdastConfig?: { [key: string]: number | string }; + source?: string; + } + + interface SlideProps extends BaseProps { + align?: alignType; + contentStyles?: CSSProperties; + controlColor?: string; + dispatch?: () => void; + hash?: number | string; + progressColor?: string; + history?: any; // Needs a type, see https://github.com/ReactTraining/history + id?: string; + lastSlideIndex?: number; + notes?: string; + onActive?: (slideIndex: string | number) => void; + slideIndex?: number; + state?: string; + transition?: transitionType[]; + transitionDuration?: number; + transitionIn?: transitionType[]; + transitionOut?: transitionType[]; + } + + interface SProps extends BaseProps { + type?: sType | sType[]; + } + + interface TextProps extends BaseProps { + fit?: boolean; + lineHeight?: number; + } + + interface Theme { + [key: string]: number | string; + } + + class Anim extends React.Component {} + + class Appear extends React.Component {} + + class BlockQuote extends React.Component {} + + class Cite extends React.Component {} + + class Code extends React.Component {} + + class CodePane extends React.Component {} + + class ComponentPlayground extends React.Component {} + + class Deck extends React.Component {} + + class Fill extends React.Component {} + + class Fit extends React.Component {} + + class GoToAction extends React.Component {} + + class Heading extends React.Component {} + + class Image extends React.Component {} + + class Layout extends React.Component {} + + class Link extends React.Component {} + + class List extends React.Component {} + + class ListItem extends React.Component {} + + class Markdown extends React.Component {} + + class Notes extends React.Component {} + + class Quote extends React.Component {} + + class S extends React.Component {} + + class Slide extends React.Component {} + + class SlideSet extends React.Component {} + + class Table extends React.Component {} + + class TableBody extends React.Component {} + + class TableHeader extends React.Component {} + + class TableHeaderItem extends React.Component {} + + class TableItem extends React.Component {} + + class TableRow extends React.Component {} + + class Text extends React.Component {} +} + +declare module 'spectacle/lib/utils/preloader' { + const preloader: (obj: object) => void; + export default preloader; +} + +declare module 'spectacle/lib/themes/default' { + import { Theme } from 'spectacle'; + const createTheme: (...args: object[]) => Theme; + export default createTheme; +} diff --git a/package.json b/package.json index 2b4d2dda7..330a2f2db 100644 --- a/package.json +++ b/package.json @@ -4,9 +4,10 @@ "description": "ReactJS Powered Presentation Framework", "main": "lib/index.js", "module": "es/index.js", + "types": "index.d.ts", "jsnext:main": "es/index.js", "scripts": { - "preversion": "npm run test && npm run lint", + "preversion": "npm run check", "version": "npm run build:publish", "clean:lib": "rimraf lib", "clean:dist": "rimraf dist", @@ -22,16 +23,19 @@ "build:dist-umd-prod": "builder run build-webpack -- --config webpack.config.umd.production.js", "build": "builder concurrent --buffer build:es build:lib build:dist build:dist-umd build:dist-umd-prod", "build:publish": "npm run clean && npm run build", - "lint": "eslint src example *.js", - "lint-fix": "npm run lint -- --fix", - "prettier": "prettier \"**/*.{js,json,css,md}\"", + "lint": "npm run lint-js && npm run lint-dts", + "lint-js": "eslint src example *.js", + "lint-fix": "npm run lint-js -- --fix && npm run lint-dts -- --fix", + "lint-dts": "tslint index.d.ts --format verbose", + "prettier": "prettier \"**/*.{js,json,ts,css,md}\"", "prettier-fix": "npm run prettier -- --write", "prettier-check": "npm run prettier -- --list-different", "deploy": "npm run build:dist && surge -p .", "start": "builder run --env \"{\\\"BABEL_ENV\\\":\\\"esm\\\"}\" build-wds-base -- --port=3000 --hot", "test": "jest --verbose", "test-debug": "node --inspect-brk node_modules/jest/bin/jest.js --runInBand", - "check": "npm run lint && npm run test", + "check-typescript": "tsc index.d.ts && npm run lint-dts", + "check": "npm run lint-js && npm run check-typescript && npm run test", "check-ci": "npm run check && npm run prettier-check" }, "author": "", @@ -41,6 +45,7 @@ "url": "https://github.com/FormidableLabs/spectacle.git" }, "dependencies": { + "csstype": "^2.6.0", "deep-object-diff": "^1.0.4", "emotion": "^8.0.8", "history": "^4.6.1", @@ -102,6 +107,8 @@ "rimraf": "^2.6.1", "style-loader": "^0.20.3", "surge": "^0.19.0", + "tslint": "^5.12.0", + "typescript": "^3.2.2", "url-loader": "^1.0.1", "webpack": "^4.26.1", "webpack-cli": "^3.1.2", diff --git a/tslint.json b/tslint.json new file mode 100644 index 000000000..9973ab424 --- /dev/null +++ b/tslint.json @@ -0,0 +1,9 @@ +{ + "defaultSeverity": "error", + "extends": ["tslint:recommended"], + "rules": { + "quotemark": false, + "interface-name": false, + "max-classes-per-file": false + } +} diff --git a/yarn.lock b/yarn.lock index 437f70edd..3458d3c69 100644 --- a/yarn.lock +++ b/yarn.lock @@ -754,6 +754,11 @@ version "10.5.5" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.5.5.tgz#8e84d24e896cd77b0d4f73df274027e3149ec2ba" +"@types/parsimmon@^1.3.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@types/parsimmon/-/parsimmon-1.10.0.tgz#ffb81cb023ff435a41d4710a29ab23c561dc9fdf" + integrity sha512-bsTIJFVQv7jnvNiC42ld2pQW2KRI+pAG243L+iATvqzy3X6+NH1obz2itRKDZZ8VVhN3wjwYax/VBGCcXzgTqQ== + "@webassemblyjs/ast@1.7.11": version "1.7.11" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace" @@ -1650,7 +1655,7 @@ builder@^4.0.0: nopt "^4.0.1" tree-kill "^1.0.0" -builtin-modules@^1.0.0: +builtin-modules@^1.0.0, builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -1780,7 +1785,7 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" dependencies: @@ -2004,6 +2009,11 @@ commander@1.1.x: dependencies: keypress "0.1.x" +commander@^2.12.1: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== + commander@^2.14.1, commander@^2.8.1, commander@^2.9.0: version "2.16.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" @@ -2335,6 +2345,11 @@ cssstyle@^1.0.0: dependencies: cssom "0.3.x" +csstype@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.0.tgz#6cf7b2fa7fc32aab3d746802c244d4eda71371a2" + integrity sha512-by8hi8BlLbowQq0qtkx54d9aN73R9oUW20HISpka5kmgsR9F7nnxgfsemuR2sdCKZh+CDNf5egW9UZMm4mgJRg== + ctype@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/ctype/-/ctype-0.5.3.tgz#82c18c2461f74114ef16c135224ad0b9144ca12f" @@ -2519,6 +2534,13 @@ defined@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" +"definitelytyped-header-parser@github:Microsoft/definitelytyped-header-parser#production": + version "0.0.0" + resolved "https://codeload.github.com/Microsoft/definitelytyped-header-parser/tar.gz/e0561530379dfa01324a89936b75d90b20df9bd2" + dependencies: + "@types/parsimmon" "^1.3.0" + parsimmon "^1.2.0" + del@^2.0.2: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" @@ -2697,6 +2719,17 @@ domutils@^1.5.1: dom-serializer "0" domelementtype "1" +dtslint@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/dtslint/-/dtslint-0.4.2.tgz#048f75d6d847215d2af8f2f54b0c3858f2db8f03" + integrity sha512-ph4GXLw3HYzlQMJOFcpCqWHuL3MxJ/344OR7wn0wlQGchQGTIVNsSUl8iKEMatpy2geNMysgA9fQa6xVhHOkTQ== + dependencies: + definitelytyped-header-parser "github:Microsoft/definitelytyped-header-parser#production" + fs-extra "^6.0.1" + strip-json-comments "^2.0.1" + tslint "^5.12.0" + typescript next + du@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/du/-/du-0.1.0.tgz#f26e340a09c7bc5b6fd69af6dbadea60fa8c6f4d" @@ -3540,6 +3573,15 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" +fs-extra@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.1.tgz#8abc128f7946e310135ddc93b98bddb410e7a34b" + integrity sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" @@ -3733,6 +3775,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" +graceful-fs@^4.1.6: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== + graceful-fs@~3.0.2: version "3.0.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" @@ -4912,6 +4959,13 @@ json5@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" @@ -6118,6 +6172,11 @@ parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" +parsimmon@^1.2.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/parsimmon/-/parsimmon-1.12.0.tgz#886a442fb30b5fc3c8e7c4994050f5cdcfe0ea90" + integrity sha512-uC/BjuSfb4jfaWajKCp1mVncXXq+V1twbcYChbTxN3GM7fn+8XoHwUdvUz+PTaFtDSCRQxU8+Rnh+iMhAkVwdw== + pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" @@ -7774,7 +7833,7 @@ strip-indent@^1.0.1: dependencies: get-stdin "^4.0.1" -strip-json-comments@~2.0.1: +strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -8063,10 +8122,35 @@ trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" -tslib@^1.9.0: +tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" +tslint@^5.12.0: + version "5.12.0" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.12.0.tgz#47f2dba291ed3d580752d109866fb640768fca36" + integrity sha512-CKEcH1MHUBhoV43SA/Jmy1l24HJJgI0eyLbBNSRyFlsQvb9v6Zdq+Nz2vEOH00nC5SUx4SneJ59PZUS/ARcokQ== + dependencies: + babel-code-frame "^6.22.0" + builtin-modules "^1.1.1" + chalk "^2.3.0" + commander "^2.12.1" + diff "^3.2.0" + glob "^7.1.1" + js-yaml "^3.7.0" + minimatch "^3.0.4" + resolve "^1.3.2" + semver "^5.3.0" + tslib "^1.8.0" + tsutils "^2.27.2" + +tsutils@^2.27.2: + version "2.29.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" + integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== + dependencies: + tslib "^1.8.1" + tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" @@ -8102,6 +8186,16 @@ typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" +typescript@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.2.2.tgz#fe8101c46aa123f8353523ebdcf5730c2ae493e5" + integrity sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg== + +typescript@next: + version "3.3.0-dev.20181222" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.3.0-dev.20181222.tgz#f877a356797f35130e7a8e31aac94f3acd58f5e7" + integrity sha512-vngsINlRTs0hQjbmlySVBb3QUH/O0Sse2hPsTGXK03KUYFyo8996IYfrnfRKthTx8tymOZ+/W1vH++o+rMhWOw== + ua-parser-js@^0.7.18: version "0.7.18" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.18.tgz#a7bfd92f56edfb117083b69e31d2aa8882d4b1ed" @@ -8175,6 +8269,11 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"