From db197967ecfcd9ad59b2f21871723cf5b3f56d26 Mon Sep 17 00:00:00 2001 From: Anton Date: Sun, 13 May 2018 18:22:19 +1000 Subject: [PATCH] feat: add TypeScript definitions (#80) --- package.json | 4 + types/TestComponent.tsx | 3 + types/index.d.ts | 56 ++++++++++++++ types/test.tsx | 27 +++++++ types/tsconfig.json | 12 +++ types/tslint.json | 8 ++ yarn.lock | 158 +++++++++++++++++++++++++++++++++++++--- 7 files changed, 259 insertions(+), 9 deletions(-) create mode 100644 types/TestComponent.tsx create mode 100644 types/index.d.ts create mode 100644 types/test.tsx create mode 100644 types/tsconfig.json create mode 100644 types/tslint.json diff --git a/package.json b/package.json index 165fc154..9536a176 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "repository": "git@github.com:smooth-code/loadable-components.git", "main": "dist/loadable-components.cjs.js", "jsnext:main": "dist/loadable-components.es.js", + "types": "types/index.d.ts", "module": "dist/loadable-components.es.js", "author": "Greg Bergé ", "keywords": [ @@ -24,6 +25,7 @@ "ci": "yarn build && yarn lint && bundlesize && yarn test --coverage && codecov", "format": "prettier --write \"src/**/*.js\" \"*.md\"", "lint": "eslint .", + "typecheck:ts": "dtslint types", "release": "yarn build && standard-version && conventional-github-releaser --preset angular", "test": "jest" }, @@ -31,6 +33,7 @@ "react": "^15.0.0 || ^16.0.0" }, "devDependencies": { + "@types/react": "^16.3.14", "babel-cli": "^6.26.0", "babel-core": "^6.26.3", "babel-eslint": "^8.2.3", @@ -44,6 +47,7 @@ "bundlesize": "^0.17.0", "codecov": "^3.0.1", "conventional-github-releaser": "^2.0.2", + "dtslint": "^0.3.0", "enzyme": "^3.3.0", "enzyme-adapter-react-16": "^1.1.1", "eslint": "^4.19.1", diff --git a/types/TestComponent.tsx b/types/TestComponent.tsx new file mode 100644 index 00000000..5015c505 --- /dev/null +++ b/types/TestComponent.tsx @@ -0,0 +1,3 @@ +import * as React from 'react'; + +export default class Test extends React.Component<{prop1: string, prop2: number}> {} diff --git a/types/index.d.ts b/types/index.d.ts new file mode 100644 index 00000000..0a1e9192 --- /dev/null +++ b/types/index.d.ts @@ -0,0 +1,56 @@ +// TypeScript Version: 2.4 +// export as namespace LoadableComponents; + +declare module 'loadable-components' { + import * as React from 'react'; + + interface DefaultImportedComponent

{ + default: React.ComponentType

; + } + + type DefaultComponent

= React.ComponentType

| DefaultImportedComponent

; + + export interface ComponentTracker { + track: (component: React.Component, modules: any, index?: number) => number; + + get: (id: number) => React.ComponentType; + getAll: () => { [key: number]: React.ComponentType }; + reset: () => void; + } + + export interface LoadableOptions { + ErrorComponent?: React.ComponentType; + LoadingComponent?: React.ComponentType; + render?: (options: { loading: boolean, error: boolean, ownProps: T, Component: React.ComponentType }) => React.ReactElement; + modules?: any; + } + + interface Loadable extends React.ComponentClass { + Component: React.ComponentClass; + loadingPromise: Promise; + load(): Promise; + } + + export const componentTracker: ComponentTracker; + export const LOADABLE: string; + + export function loadComponents(): Promise; + + export function getState(): { __LOADABLE_STATE__: { children: Array<{ id: number }> } }; + + export default function loadable( + getComponent: () => Promise>, + options?: LoadableOptions + ): Loadable; +} + +declare module 'loadable-components/server' { + import * as React from 'react'; + + export function getLoadableState( + rootElement: React.ReactElement<{}>, + rootContext?: any, + fetchRoot?: boolean, + tree?: any, + ): Promise; +} diff --git a/types/test.tsx b/types/test.tsx new file mode 100644 index 00000000..9d19b016 --- /dev/null +++ b/types/test.tsx @@ -0,0 +1,27 @@ +/* tslint-disable */ +// TypeScript Version: 2.7 + +import * as React from 'react'; +import loadableComponent, { loadComponents } from 'loadable-components'; +import { getLoadableState } from 'loadable-components/server'; + +const App = loadableComponent(() => import('./TestComponent')); + +App.load(); + +const app = ( + +); + +getLoadableState(app).then(() => { +// Load all components needed before starting rendering + loadComponents().then(() => { + // $ExpectError + const a1 = ; + + // $ExpectError + const a2 = ; + + const a3 = ; + }); +}); diff --git a/types/tsconfig.json b/types/tsconfig.json new file mode 100644 index 00000000..2ffabbb7 --- /dev/null +++ b/types/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": ["es5", "es2015", "dom"], + "jsx": "react", + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "noEmit": true, + "strictFunctionTypes": false + } +} \ No newline at end of file diff --git a/types/tslint.json b/types/tslint.json new file mode 100644 index 00000000..e716bd2f --- /dev/null +++ b/types/tslint.json @@ -0,0 +1,8 @@ +{ + "extends": "dtslint/dtslint.json", + "semicolon": [true, "always"], + "indent": [ + true, + "tabs" + ] +} diff --git a/yarn.lock b/yarn.lock index cf660574..6c282c53 100644 --- a/yarn.lock +++ b/yarn.lock @@ -98,6 +98,16 @@ version "6.0.89" resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.89.tgz#154be0e6a823760cd6083aa8c48f952e2e63e0b0" +"@types/parsimmon@^1.3.0": + version "1.6.2" + resolved "https://registry.yarnpkg.com/@types/parsimmon/-/parsimmon-1.6.2.tgz#2ecb8424e06fd8db78b6f697b635064dfa355441" + +"@types/react@^16.3.14": + version "16.3.14" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.3.14.tgz#f90ac6834de172e13ecca430dcb6814744225d36" + dependencies: + csstype "^2.2.0" + JSONStream@^1.0.4: version "1.3.1" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.1.tgz#707f761e01dae9e16f1bcf93703b78c70966579a" @@ -204,6 +214,16 @@ ansi-styles@^3.1.0, ansi-styles@^3.2.0: dependencies: color-convert "^1.9.0" +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + dependencies: + color-convert "^1.9.0" + +any-promise@^1.0.0, any-promise@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + anymatch@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" @@ -1226,7 +1246,7 @@ bser@^2.0.0: dependencies: node-int64 "^0.4.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" @@ -1335,6 +1355,14 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^4.0.0" +chalk@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + cheerio@^1.0.0-rc.2: version "1.0.0-rc.2" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db" @@ -1451,6 +1479,10 @@ commander@^2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" +commander@^2.12.1: + version "2.15.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + commander@~2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" @@ -1724,6 +1756,10 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": dependencies: cssom "0.3.x" +csstype@^2.2.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.1.tgz#654231d1ddddfc3eb93da281a1144e7c14fc0bdc" + currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -1817,6 +1853,13 @@ define-properties@^1.1.2: foreach "^2.0.5" object-keys "^1.0.8" +definitelytyped-header-parser@Microsoft/definitelytyped-header-parser#production: + version "0.0.0" + resolved "https://codeload.github.com/Microsoft/definitelytyped-header-parser/tar.gz/f074e863231ef0d79a31c0a9edaf1b82c98469ef" + 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" @@ -1923,6 +1966,16 @@ dotgitignore@^1.0.3: find-up "^2.1.0" minimatch "^3.0.4" +dtslint@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/dtslint/-/dtslint-0.3.0.tgz#918e664a6f7e1f54ba22088daa2bc6e64a6001c1" + dependencies: + definitelytyped-header-parser Microsoft/definitelytyped-header-parser#production + fs-promise "^2.0.0" + strip-json-comments "^2.0.1" + tslint "^5.9.1" + typescript next + duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -2452,6 +2505,22 @@ fs-access@^1.0.0: dependencies: null-check "^1.0.0" +fs-extra@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz#046c70163cef9aad46b0e4a7fa467fb22d71de35" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + +fs-promise@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fs-promise/-/fs-promise-2.0.3.tgz#f64e4f854bcf689aa8bddcba268916db3db46854" + dependencies: + any-promise "^1.3.0" + fs-extra "^2.0.0" + mz "^2.6.0" + thenify-all "^1.6.0" + fs-readdir-recursive@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560" @@ -2679,7 +2748,7 @@ got@^7.0.0: url-parse-lax "^1.0.0" url-to-options "^1.0.1" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -2740,6 +2809,10 @@ has-flag@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + has-symbol-support-x@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.1.tgz#66ec2e377e0c7d7ccedb07a3a84d77510ff1bc4c" @@ -3601,6 +3674,12 @@ json5@^0.5.0, json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + 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" @@ -3907,6 +3986,14 @@ mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" +mz@^2.6.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + nan@^2.3.0: version "2.6.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" @@ -4256,6 +4343,10 @@ parse5@^3.0.1: dependencies: "@types/node" "^6.0.46" +parsimmon@^1.2.0: + version "1.7.3" + resolved "https://registry.yarnpkg.com/parsimmon/-/parsimmon-1.7.3.tgz#3e8a9ae1f651077c4f6dcf9b3ade1f9e60d085df" + path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" @@ -4863,15 +4954,15 @@ resolve@^1.2.0: dependencies: path-parse "^1.0.5" -resolve@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.6.0.tgz#0fbd21278b27b4004481c395349e7aba60a9ff5c" +resolve@^1.3.2, resolve@^1.6.0: + version "1.7.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" dependencies: path-parse "^1.0.5" -resolve@^1.6.0: - version "1.7.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" +resolve@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.6.0.tgz#0fbd21278b27b4004481c395349e7aba60a9ff5c" dependencies: path-parse "^1.0.5" @@ -5293,7 +5384,7 @@ strip-indent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" -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" @@ -5313,6 +5404,12 @@ supports-color@^4.0.0: dependencies: has-flag "^2.0.0" +supports-color@^5.3.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" + dependencies: + has-flag "^3.0.0" + symbol-tree@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" @@ -5385,6 +5482,18 @@ text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" +thenify-all@^1.0.0, thenify-all@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.0" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" + dependencies: + any-promise "^1.0.0" + throat@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" @@ -5460,6 +5569,33 @@ tryit@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" +tslib@^1.8.0, tslib@^1.8.1: + version "1.9.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8" + +tslint@^5.9.1: + version "5.10.0" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.10.0.tgz#11e26bccb88afa02dd0d9956cae3d4540b5f54c3" + 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.12.1" + +tsutils@^2.12.1: + version "2.27.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.27.0.tgz#9efb252b188eaa0ca3ade41dc410d6ce7eaab816" + dependencies: + tslib "^1.8.1" + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -5480,6 +5616,10 @@ typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" +typescript@next: + version "2.9.0-dev.20180512" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.0-dev.20180512.tgz#fa4bf0c8cb42ab810d772def0b9244267bd5d80c" + ua-parser-js@^0.7.9: version "0.7.13" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.13.tgz#cd9dd2f86493b3f44dbeeef3780fda74c5ee14be"