diff --git a/.circleci/config.yml b/.circleci/config.yml index 54793168f..d61a0218d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -41,11 +41,6 @@ commands: - attach_workspace: at: ~/react-native-cli - run: yarn lint - run-typecheck: - steps: - - attach_workspace: - at: ~/react-native-cli - - run: yarn flow-check run-cocoa-pods-tests: steps: - attach_workspace: @@ -74,10 +69,6 @@ jobs: executor: node8 steps: - run-lint - typecheck: - executor: node8 - steps: - - run-typecheck cocoa-pods: executor: noderuby steps: @@ -95,7 +86,6 @@ jobs: steps: - install-dependencies - run-lint - - run-typecheck - run-unit-tests # TODO: figure out why e2e tests fail even though not interfering with # other tests @@ -108,9 +98,6 @@ workflows: - lint: requires: - setup - - typecheck: - requires: - - setup - unit-tests: requires: - setup diff --git a/.eslintignore b/.eslintignore index 865405ded..e994a244e 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,5 +2,4 @@ node_modules/ debugger-ui/ templates/ global-cli/ -flow-typed/ build/ diff --git a/.flowconfig b/.flowconfig deleted file mode 100644 index 028f9aaac..000000000 --- a/.flowconfig +++ /dev/null @@ -1,68 +0,0 @@ -[ignore] - -; Ignore templates for 'react-native init' -.*/templates/.* - -; Ignore "BUCK" generated dirs -/\.buckd/ - -; Ignore unexpected extra "@providesModule" -.*/node_modules/.*/node_modules/fbjs/.* - -; These should not be required directly -; require from fbjs/lib instead: require('fbjs/lib/invariant') -.*/node_modules/invariant/.* -.*/node_modules/warning/.* - -[untyped] -.*/node_modules/metro.*/.* - -[include] -flow-typed - -[options] -emoji=true - -esproposal.export_star_as=enable -esproposal.optional_chaining=enable -esproposal.nullish_coalescing=enable -module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub' -module.name_mapper='^types' -> '/types/index.js' - -suppress_type=$FlowIssue -suppress_type=$FlowFixMe -suppress_type=$FlowFixMeProps -suppress_type=$FlowFixMeState - -suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(\\)? *\\(site=[a-z,_]*react_native\\(_ios\\)?_\\(oss\\|fb\\)[a-z,_]*\\)?)\\) -suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\($\\|[^(]\\|(\\(\\)? *\\(site=[a-z,_]*react_native\\(_ios\\)?_\\(oss\\|fb\\)[a-z,_]*\\)?)\\) -suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy -suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError - -module.ignore_non_literal_requires=true - -[lints] -all=warn -unnecessary-optional-chain=off -dynamic-export=off -unsafe-getters-setters=off - -# There is an ESLint rule for this -unclear-type=off - -sketchy-null=off -sketchy-null-number=warn -sketchy-null-mixed=warn - -# This is noisy for now. We *do* still want to warn on importing types -# from untyped files, which is covered by untyped-type-import -untyped-import=off - -[strict] -deprecated-type -nonstrict-import -sketchy-null -unclear-type -unsafe-getters-setters -untyped-import -untyped-type-import diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2277a11c8..9d24774a4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,7 +4,7 @@ All work on React Native CLI happens directly on GitHub. Contributors send pull requests which go through review process. -> **Working on your first pull request?** You can learn how from this *free* series: [How to Contribute to an Open Source Project on GitHub](https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github). +> **Working on your first pull request?** You can learn how from this _free_ series: [How to Contribute to an Open Source Project on GitHub](https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github). 1. Fork the repo and create your branch from `master` (a guide on [how to fork a repository](https://help.github.com/articles/fork-a-repo/)). 1. Run `yarn` or `npm install` to install all required dependencies. @@ -15,8 +15,8 @@ All work on React Native CLI happens directly on GitHub. Contributors send pull Repository is splitted into two packages: -* `cli` - Historically, it was included in `react-native` package. Contains all the commands code. -* `global-cli` - Historically, it was a `react-native-cli` package and the only reason this package existed was to initialize an empty project. +- `cli` - Historically, it was included in `react-native` package. Contains all the commands code. +- `global-cli` - Historically, it was a `react-native-cli` package and the only reason this package existed was to initialize an empty project. ## Testing your changes @@ -30,34 +30,47 @@ node /path/to/cloned/project/packages/cli/build/index.js You can test your changes by installing local npm proxy - `verdaccio`, and publishing custom versions of `@react-native-community/cli` and `react-native`. -* Install `verdaccio` +- Install `verdaccio` + ```sh yarn global add verdaccio ``` -* Run verdaccio + +- Run verdaccio + ```sh verdaccio ``` -* Set npm registry to `verdaccio` proxy server + +- Set npm registry to `verdaccio` proxy server + ```sh npm set registry http://localhost:4873/ ``` -* Clone `react-native` and `@react-native-community/cli` -* Release new version of `@react-native-community/cli` to local npm proxy. If you have any issues, head over to [verdaccio](https://github.com/verdaccio/verdaccio) and check out the docs. + +- Clone `react-native` and `@react-native-community/cli` +- Release new version of `@react-native-community/cli` to local npm proxy. If you have any issues, head over to [verdaccio](https://github.com/verdaccio/verdaccio) and check out the docs. + ``` cd /path/to/cli/packages/cli && npm publish ``` -* Install new version of `@react-native-community/cli` in `react-native` and publish new version of it. + +- Install new version of `@react-native-community/cli` in `react-native` and publish new version of it. + ```sh # RN_CLI_VERSION is the version of localy released cli cd /path/to/react-native && yarn add @react-native-community/cli@${RN_CLI_VERSION} && npm publish ``` -* You are ready to go + +- You are ready to go + ```sh # RN_VERSION is the version of localy released react-native react-native init --version ${RN_VERSION} ``` -* Cleanup + +- Cleanup + ```sh npm config set registry https://registry.npmjs.org/ ``` @@ -84,34 +97,33 @@ First make sure you have RN repo checked out and CLI repo checked out and built. ## Typechecking, linting and testing -Currently we use `flow` for typechecking, `eslint` with `prettier` for linting and formatting the code and `jest` for testing. +Currently we use TypeScript for typechecking, `eslint` with `prettier` for linting and formatting the code and `jest` for testing. -* `yarn flow`: run `flow` -* `yarn lint`: run `eslint` and `prettier` -* `yarn test`: run unit tests +- `yarn lint`: run `eslint` and `prettier` +- `yarn test`: run unit tests ## Commit message convention We prefix our commit messages with one of the following to signify the kind of change: -* **build**: Changes that affect the build system or external dependencies -* **ci**, **chore**: Changes to our CI configuration files and scripts -* **docs**: Documentation only changes -* **feat**: A new feature -* **fix**: A bug fix -* **perf**: A code change that improves performance -* **refactor**: A code change that neither fixes a bug nor adds a feature -* **style**: Changes that do not affect the meaning of the code -* **test**: Adding missing tests or correcting existing tests +- **build**: Changes that affect the build system or external dependencies +- **ci**, **chore**: Changes to our CI configuration files and scripts +- **docs**: Documentation only changes +- **feat**: A new feature +- **fix**: A bug fix +- **perf**: A code change that improves performance +- **refactor**: A code change that neither fixes a bug nor adds a feature +- **style**: Changes that do not affect the meaning of the code +- **test**: Adding missing tests or correcting existing tests ## Sending a pull request When you're sending a pull request: -* Prefer small pull requests focused on one change. -* Verify that `flow`, `eslint` and all tests are passing. -* Preview the documentation to make sure it looks good. -* Follow the pull request template when opening a pull request. +- Prefer small pull requests focused on one change. +- Verify that TypeScript, `eslint` and all tests are passing. +- Preview the documentation to make sure it looks good. +- Follow the pull request template when opening a pull request. ## Reporting issues diff --git a/__e2e__/init.test.ts b/__e2e__/init.test.ts index b39e1af35..518b22c71 100644 --- a/__e2e__/init.test.ts +++ b/__e2e__/init.test.ts @@ -1,4 +1,3 @@ -// @flow import fs from 'fs'; import path from 'path'; import {run, getTempDirectory, cleanup, writeFiles} from '../jest/helpers'; diff --git a/__e2e__/install.test.ts b/__e2e__/install.test.ts index 5f8c1f63c..d46ac7559 100644 --- a/__e2e__/install.test.ts +++ b/__e2e__/install.test.ts @@ -1,4 +1,3 @@ -// @flow import path from 'path'; import {run, getTempDirectory, cleanup, writeFiles} from '../jest/helpers'; diff --git a/__e2e__/legacyInit.test.ts b/__e2e__/legacyInit.test.ts index 834de2e84..8529ef7fb 100644 --- a/__e2e__/legacyInit.test.ts +++ b/__e2e__/legacyInit.test.ts @@ -1,4 +1,3 @@ -// @flow import fs from 'fs'; import path from 'path'; // @ts-ignore diff --git a/__e2e__/uninstall.test.ts b/__e2e__/uninstall.test.ts index 5103aeede..748d46f5e 100644 --- a/__e2e__/uninstall.test.ts +++ b/__e2e__/uninstall.test.ts @@ -1,4 +1,3 @@ -// @flow import {run, getTempDirectory, cleanup, writeFiles} from '../jest/helpers'; const DIR = getTempDirectory('command-uninstall-test'); diff --git a/babel.config.js b/babel.config.js index 1356ac09e..d590727a4 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,10 +1,6 @@ module.exports = { babelrcRoots: ['packages/*'], overrides: [ - { - presets: ['@babel/preset-flow'], - test: '**/*.js', - }, { presets: ['@babel/preset-typescript'], test: '**/*.ts', diff --git a/flow-typed/npm/execa_v1.0.x.js b/flow-typed/npm/execa_v1.0.x.js deleted file mode 100644 index d49b7a7b0..000000000 --- a/flow-typed/npm/execa_v1.0.x.js +++ /dev/null @@ -1,103 +0,0 @@ -// flow-typed signature: 613ee1ec7d728b6a312fcff21a7b2669 -// flow-typed version: 3163f7a6e3/execa_v1.0.x/flow_>=v0.75.x - -declare module 'execa' { - - declare type StdIoOption = - | 'pipe' - | 'ipc' - | 'ignore' - | 'inherit' - | stream$Stream - | number; - - declare type CommonOptions = {| - argv0?: string, - cleanup?: boolean, - cwd?: string, - detached?: boolean, - encoding?: string, - env?: {[string]: string}, - extendEnv?: boolean, - gid?: number, - killSignal?: string | number, - localDir?: string, - maxBuffer?: number, - preferLocal?: boolean, - reject?: boolean, - shell?: boolean | string, - stderr?: ?StdIoOption, - stdin?: ?StdIoOption, - stdio?: 'pipe' | 'ignore' | 'inherit' | $ReadOnlyArray, - stdout?: ?StdIoOption, - stripEof?: boolean, - timeout?: number, - uid?: number, - windowsVerbatimArguments?: boolean, - |}; - - declare type SyncOptions = {| - ...CommonOptions, - input?: string | Buffer, - |}; - - declare type Options = {| - ...CommonOptions, - input?: string | Buffer | stream$Readable, - |}; - - declare type SyncResult = {| - stdout: string, - stderr: string, - code: number, - failed: boolean, - signal: ?string, - cmd: string, - timedOut: boolean, - |}; - - declare type Result = {| - ...SyncResult, - killed: boolean, - |}; - - declare interface ThenableChildProcess extends child_process$ChildProcess { - then( - onfulfilled?: ?((value: Result) => R | Promise), - onrejected?: ?((reason: ExecaError) => E | Promise), - ): Promise; - - catch( - onrejected?: ?((reason: ExecaError) => E | Promise) - ): Promise; - } - - declare interface ExecaError extends ErrnoError { - stdout: string; - stderr: string; - failed: boolean; - signal: ?string; - cmd: string; - timedOut: boolean; - } - - declare interface Execa { - (file: string, args?: $ReadOnlyArray, options?: $ReadOnly): ThenableChildProcess; - (file: string, options?: $ReadOnly): ThenableChildProcess; - - stdout(file: string, args?: $ReadOnlyArray, options?: $ReadOnly): Promise; - stdout(file: string, options?: $ReadOnly): Promise; - - stderr(file: string, args?: $ReadOnlyArray, options?: $ReadOnly): Promise; - stderr(file: string, options?: $ReadOnly): Promise; - - shell(command: string, options?: $ReadOnly): ThenableChildProcess; - - sync(file: string, args?: $ReadOnlyArray, options?: $ReadOnly): SyncResult; - sync(file: string, options?: $ReadOnly): SyncResult; - - shellSync(command: string, options?: $ReadOnly): SyncResult; - } - - declare module.exports: Execa; -} diff --git a/flow-typed/npm/jest_v24.x.x.js b/flow-typed/npm/jest_v24.x.x.js deleted file mode 100644 index 1c1d6d9a2..000000000 --- a/flow-typed/npm/jest_v24.x.x.js +++ /dev/null @@ -1,1186 +0,0 @@ -// flow-typed signature: 833075a5cefc49eb523160a5fca9d8b6 -// flow-typed version: 325925f1b7/jest_v24.x.x/flow_>=v0.39.x - -type JestMockFn, TReturn> = { - (...args: TArguments): TReturn, - /** - * An object for introspecting mock calls - */ - mock: { - /** - * An array that represents all calls that have been made into this mock - * function. Each call is represented by an array of arguments that were - * passed during the call. - */ - calls: Array, - /** - * An array that contains all the object instances that have been - * instantiated from this mock function. - */ - instances: Array, - /** - * An array that contains all the object results that have been - * returned by this mock function call - */ - results: Array<{ isThrow: boolean, value: TReturn }>, - }, - /** - * Resets all information stored in the mockFn.mock.calls and - * mockFn.mock.instances arrays. Often this is useful when you want to clean - * up a mock's usage data between two assertions. - */ - mockClear(): void, - /** - * Resets all information stored in the mock. This is useful when you want to - * completely restore a mock back to its initial state. - */ - mockReset(): void, - /** - * Removes the mock and restores the initial implementation. This is useful - * when you want to mock functions in certain test cases and restore the - * original implementation in others. Beware that mockFn.mockRestore only - * works when mock was created with jest.spyOn. Thus you have to take care of - * restoration yourself when manually assigning jest.fn(). - */ - mockRestore(): void, - /** - * Accepts a function that should be used as the implementation of the mock. - * The mock itself will still record all calls that go into and instances - * that come from itself -- the only difference is that the implementation - * will also be executed when the mock is called. - */ - mockImplementation( - fn: (...args: TArguments) => TReturn - ): JestMockFn, - /** - * Accepts a function that will be used as an implementation of the mock for - * one call to the mocked function. Can be chained so that multiple function - * calls produce different results. - */ - mockImplementationOnce( - fn: (...args: TArguments) => TReturn - ): JestMockFn, - /** - * Accepts a string to use in test result output in place of "jest.fn()" to - * indicate which mock function is being referenced. - */ - mockName(name: string): JestMockFn, - /** - * Just a simple sugar function for returning `this` - */ - mockReturnThis(): void, - /** - * Accepts a value that will be returned whenever the mock function is called. - */ - mockReturnValue(value: TReturn): JestMockFn, - /** - * Sugar for only returning a value once inside your mock - */ - mockReturnValueOnce(value: TReturn): JestMockFn, - /** - * Sugar for jest.fn().mockImplementation(() => Promise.resolve(value)) - */ - mockResolvedValue(value: TReturn): JestMockFn>, - /** - * Sugar for jest.fn().mockImplementationOnce(() => Promise.resolve(value)) - */ - mockResolvedValueOnce( - value: TReturn - ): JestMockFn>, - /** - * Sugar for jest.fn().mockImplementation(() => Promise.reject(value)) - */ - mockRejectedValue(value: TReturn): JestMockFn>, - /** - * Sugar for jest.fn().mockImplementationOnce(() => Promise.reject(value)) - */ - mockRejectedValueOnce(value: TReturn): JestMockFn>, -}; - -type JestAsymmetricEqualityType = { - /** - * A custom Jasmine equality tester - */ - asymmetricMatch(value: mixed): boolean, -}; - -type JestCallsType = { - allArgs(): mixed, - all(): mixed, - any(): boolean, - count(): number, - first(): mixed, - mostRecent(): mixed, - reset(): void, -}; - -type JestClockType = { - install(): void, - mockDate(date: Date): void, - tick(milliseconds?: number): void, - uninstall(): void, -}; - -type JestMatcherResult = { - message?: string | (() => string), - pass: boolean, -}; - -type JestMatcher = ( - actual: any, - expected: any -) => JestMatcherResult | Promise; - -type JestPromiseType = { - /** - * Use rejects to unwrap the reason of a rejected promise so any other - * matcher can be chained. If the promise is fulfilled the assertion fails. - */ - rejects: JestExpectType, - /** - * Use resolves to unwrap the value of a fulfilled promise so any other - * matcher can be chained. If the promise is rejected the assertion fails. - */ - resolves: JestExpectType, -}; - -/** - * Jest allows functions and classes to be used as test names in test() and - * describe() - */ -type JestTestName = string | Function; - -/** - * Plugin: jest-styled-components - */ - -type JestStyledComponentsMatcherValue = - | string - | JestAsymmetricEqualityType - | RegExp - | typeof undefined; - -type JestStyledComponentsMatcherOptions = { - media?: string, - modifier?: string, - supports?: string, -}; - -type JestStyledComponentsMatchersType = { - toHaveStyleRule( - property: string, - value: JestStyledComponentsMatcherValue, - options?: JestStyledComponentsMatcherOptions - ): void, -}; - -/** - * Plugin: jest-enzyme - */ -type EnzymeMatchersType = { - // 5.x - toBeEmpty(): void, - toBePresent(): void, - // 6.x - toBeChecked(): void, - toBeDisabled(): void, - toBeEmptyRender(): void, - toContainMatchingElement(selector: string): void, - toContainMatchingElements(n: number, selector: string): void, - toContainExactlyOneMatchingElement(selector: string): void, - toContainReact(element: React$Element): void, - toExist(): void, - toHaveClassName(className: string): void, - toHaveHTML(html: string): void, - toHaveProp: ((propKey: string, propValue?: any) => void) & - ((props: {}) => void), - toHaveRef(refName: string): void, - toHaveState: ((stateKey: string, stateValue?: any) => void) & - ((state: {}) => void), - toHaveStyle: ((styleKey: string, styleValue?: any) => void) & - ((style: {}) => void), - toHaveTagName(tagName: string): void, - toHaveText(text: string): void, - toHaveValue(value: any): void, - toIncludeText(text: string): void, - toMatchElement( - element: React$Element, - options?: {| ignoreProps?: boolean, verbose?: boolean |} - ): void, - toMatchSelector(selector: string): void, - // 7.x - toHaveDisplayName(name: string): void, -}; - -// DOM testing library extensions https://github.com/kentcdodds/dom-testing-library#custom-jest-matchers -type DomTestingLibraryType = { - toBeDisabled(): void, - toBeEmpty(): void, - toBeInTheDocument(): void, - toBeVisible(): void, - toContainElement(element: HTMLElement | null): void, - toContainHTML(htmlText: string): void, - toHaveAttribute(name: string, expectedValue?: string): void, - toHaveClass(...classNames: string[]): void, - toHaveFocus(): void, - toHaveFormValues(expectedValues: { [name: string]: any }): void, - toHaveStyle(css: string): void, - toHaveTextContent( - content: string | RegExp, - options?: { normalizeWhitespace: boolean } - ): void, - toBeInTheDOM(): void, -}; - -// Jest JQuery Matchers: https://github.com/unindented/custom-jquery-matchers -type JestJQueryMatchersType = { - toExist(): void, - toHaveLength(len: number): void, - toHaveId(id: string): void, - toHaveClass(className: string): void, - toHaveTag(tag: string): void, - toHaveAttr(key: string, val?: any): void, - toHaveProp(key: string, val?: any): void, - toHaveText(text: string | RegExp): void, - toHaveData(key: string, val?: any): void, - toHaveValue(val: any): void, - toHaveCss(css: { [key: string]: any }): void, - toBeChecked(): void, - toBeDisabled(): void, - toBeEmpty(): void, - toBeHidden(): void, - toBeSelected(): void, - toBeVisible(): void, - toBeFocused(): void, - toBeInDom(): void, - toBeMatchedBy(sel: string): void, - toHaveDescendant(sel: string): void, - toHaveDescendantWithText(sel: string, text: string | RegExp): void, -}; - -// Jest Extended Matchers: https://github.com/jest-community/jest-extended -type JestExtendedMatchersType = { - /** - * Note: Currently unimplemented - * Passing assertion - * - * @param {String} message - */ - // pass(message: string): void; - - /** - * Note: Currently unimplemented - * Failing assertion - * - * @param {String} message - */ - // fail(message: string): void; - - /** - * Use .toBeEmpty when checking if a String '', Array [] or Object {} is empty. - */ - toBeEmpty(): void, - - /** - * Use .toBeOneOf when checking if a value is a member of a given Array. - * @param {Array.<*>} members - */ - toBeOneOf(members: any[]): void, - - /** - * Use `.toBeNil` when checking a value is `null` or `undefined`. - */ - toBeNil(): void, - - /** - * Use `.toSatisfy` when you want to use a custom matcher by supplying a predicate function that returns a `Boolean`. - * @param {Function} predicate - */ - toSatisfy(predicate: (n: any) => boolean): void, - - /** - * Use `.toBeArray` when checking if a value is an `Array`. - */ - toBeArray(): void, - - /** - * Use `.toBeArrayOfSize` when checking if a value is an `Array` of size x. - * @param {Number} x - */ - toBeArrayOfSize(x: number): void, - - /** - * Use `.toIncludeAllMembers` when checking if an `Array` contains all of the same members of a given set. - * @param {Array.<*>} members - */ - toIncludeAllMembers(members: any[]): void, - - /** - * Use `.toIncludeAnyMembers` when checking if an `Array` contains any of the members of a given set. - * @param {Array.<*>} members - */ - toIncludeAnyMembers(members: any[]): void, - - /** - * Use `.toSatisfyAll` when you want to use a custom matcher by supplying a predicate function that returns a `Boolean` for all values in an array. - * @param {Function} predicate - */ - toSatisfyAll(predicate: (n: any) => boolean): void, - - /** - * Use `.toBeBoolean` when checking if a value is a `Boolean`. - */ - toBeBoolean(): void, - - /** - * Use `.toBeTrue` when checking a value is equal (===) to `true`. - */ - toBeTrue(): void, - - /** - * Use `.toBeFalse` when checking a value is equal (===) to `false`. - */ - toBeFalse(): void, - - /** - * Use .toBeDate when checking if a value is a Date. - */ - toBeDate(): void, - - /** - * Use `.toBeFunction` when checking if a value is a `Function`. - */ - toBeFunction(): void, - - /** - * Use `.toHaveBeenCalledBefore` when checking if a `Mock` was called before another `Mock`. - * - * Note: Required Jest version >22 - * Note: Your mock functions will have to be asynchronous to cause the timestamps inside of Jest to occur in a differentJS event loop, otherwise the mock timestamps will all be the same - * - * @param {Mock} mock - */ - toHaveBeenCalledBefore(mock: JestMockFn): void, - - /** - * Use `.toBeNumber` when checking if a value is a `Number`. - */ - toBeNumber(): void, - - /** - * Use `.toBeNaN` when checking a value is `NaN`. - */ - toBeNaN(): void, - - /** - * Use `.toBeFinite` when checking if a value is a `Number`, not `NaN` or `Infinity`. - */ - toBeFinite(): void, - - /** - * Use `.toBePositive` when checking if a value is a positive `Number`. - */ - toBePositive(): void, - - /** - * Use `.toBeNegative` when checking if a value is a negative `Number`. - */ - toBeNegative(): void, - - /** - * Use `.toBeEven` when checking if a value is an even `Number`. - */ - toBeEven(): void, - - /** - * Use `.toBeOdd` when checking if a value is an odd `Number`. - */ - toBeOdd(): void, - - /** - * Use `.toBeWithin` when checking if a number is in between the given bounds of: start (inclusive) and end (exclusive). - * - * @param {Number} start - * @param {Number} end - */ - toBeWithin(start: number, end: number): void, - - /** - * Use `.toBeObject` when checking if a value is an `Object`. - */ - toBeObject(): void, - - /** - * Use `.toContainKey` when checking if an object contains the provided key. - * - * @param {String} key - */ - toContainKey(key: string): void, - - /** - * Use `.toContainKeys` when checking if an object has all of the provided keys. - * - * @param {Array.} keys - */ - toContainKeys(keys: string[]): void, - - /** - * Use `.toContainAllKeys` when checking if an object only contains all of the provided keys. - * - * @param {Array.} keys - */ - toContainAllKeys(keys: string[]): void, - - /** - * Use `.toContainAnyKeys` when checking if an object contains at least one of the provided keys. - * - * @param {Array.} keys - */ - toContainAnyKeys(keys: string[]): void, - - /** - * Use `.toContainValue` when checking if an object contains the provided value. - * - * @param {*} value - */ - toContainValue(value: any): void, - - /** - * Use `.toContainValues` when checking if an object contains all of the provided values. - * - * @param {Array.<*>} values - */ - toContainValues(values: any[]): void, - - /** - * Use `.toContainAllValues` when checking if an object only contains all of the provided values. - * - * @param {Array.<*>} values - */ - toContainAllValues(values: any[]): void, - - /** - * Use `.toContainAnyValues` when checking if an object contains at least one of the provided values. - * - * @param {Array.<*>} values - */ - toContainAnyValues(values: any[]): void, - - /** - * Use `.toContainEntry` when checking if an object contains the provided entry. - * - * @param {Array.} entry - */ - toContainEntry(entry: [string, string]): void, - - /** - * Use `.toContainEntries` when checking if an object contains all of the provided entries. - * - * @param {Array.>} entries - */ - toContainEntries(entries: [string, string][]): void, - - /** - * Use `.toContainAllEntries` when checking if an object only contains all of the provided entries. - * - * @param {Array.>} entries - */ - toContainAllEntries(entries: [string, string][]): void, - - /** - * Use `.toContainAnyEntries` when checking if an object contains at least one of the provided entries. - * - * @param {Array.>} entries - */ - toContainAnyEntries(entries: [string, string][]): void, - - /** - * Use `.toBeExtensible` when checking if an object is extensible. - */ - toBeExtensible(): void, - - /** - * Use `.toBeFrozen` when checking if an object is frozen. - */ - toBeFrozen(): void, - - /** - * Use `.toBeSealed` when checking if an object is sealed. - */ - toBeSealed(): void, - - /** - * Use `.toBeString` when checking if a value is a `String`. - */ - toBeString(): void, - - /** - * Use `.toEqualCaseInsensitive` when checking if a string is equal (===) to another ignoring the casing of both strings. - * - * @param {String} string - */ - toEqualCaseInsensitive(string: string): void, - - /** - * Use `.toStartWith` when checking if a `String` starts with a given `String` prefix. - * - * @param {String} prefix - */ - toStartWith(prefix: string): void, - - /** - * Use `.toEndWith` when checking if a `String` ends with a given `String` suffix. - * - * @param {String} suffix - */ - toEndWith(suffix: string): void, - - /** - * Use `.toInclude` when checking if a `String` includes the given `String` substring. - * - * @param {String} substring - */ - toInclude(substring: string): void, - - /** - * Use `.toIncludeRepeated` when checking if a `String` includes the given `String` substring the correct number of times. - * - * @param {String} substring - * @param {Number} times - */ - toIncludeRepeated(substring: string, times: number): void, - - /** - * Use `.toIncludeMultiple` when checking if a `String` includes all of the given substrings. - * - * @param {Array.} substring - */ - toIncludeMultiple(substring: string[]): void, -}; - -interface JestExpectType { - not: JestExpectType & - EnzymeMatchersType & - DomTestingLibraryType & - JestJQueryMatchersType & - JestStyledComponentsMatchersType & - JestExtendedMatchersType; - /** - * If you have a mock function, you can use .lastCalledWith to test what - * arguments it was last called with. - */ - lastCalledWith(...args: Array): void; - /** - * toBe just checks that a value is what you expect. It uses === to check - * strict equality. - */ - toBe(value: any): void; - /** - * Use .toBeCalledWith to ensure that a mock function was called with - * specific arguments. - */ - toBeCalledWith(...args: Array): void; - /** - * Using exact equality with floating point numbers is a bad idea. Rounding - * means that intuitive things fail. - */ - toBeCloseTo(num: number, delta: any): void; - /** - * Use .toBeDefined to check that a variable is not undefined. - */ - toBeDefined(): void; - /** - * Use .toBeFalsy when you don't care what a value is, you just want to - * ensure a value is false in a boolean context. - */ - toBeFalsy(): void; - /** - * To compare floating point numbers, you can use toBeGreaterThan. - */ - toBeGreaterThan(number: number): void; - /** - * To compare floating point numbers, you can use toBeGreaterThanOrEqual. - */ - toBeGreaterThanOrEqual(number: number): void; - /** - * To compare floating point numbers, you can use toBeLessThan. - */ - toBeLessThan(number: number): void; - /** - * To compare floating point numbers, you can use toBeLessThanOrEqual. - */ - toBeLessThanOrEqual(number: number): void; - /** - * Use .toBeInstanceOf(Class) to check that an object is an instance of a - * class. - */ - toBeInstanceOf(cls: Class<*>): void; - /** - * .toBeNull() is the same as .toBe(null) but the error messages are a bit - * nicer. - */ - toBeNull(): void; - /** - * Use .toBeTruthy when you don't care what a value is, you just want to - * ensure a value is true in a boolean context. - */ - toBeTruthy(): void; - /** - * Use .toBeUndefined to check that a variable is undefined. - */ - toBeUndefined(): void; - /** - * Use .toContain when you want to check that an item is in a list. For - * testing the items in the list, this uses ===, a strict equality check. - */ - toContain(item: any): void; - /** - * Use .toContainEqual when you want to check that an item is in a list. For - * testing the items in the list, this matcher recursively checks the - * equality of all fields, rather than checking for object identity. - */ - toContainEqual(item: any): void; - /** - * Use .toEqual when you want to check that two objects have the same value. - * This matcher recursively checks the equality of all fields, rather than - * checking for object identity. - */ - toEqual(value: any): void; - /** - * Use .toHaveBeenCalled to ensure that a mock function got called. - */ - toHaveBeenCalled(): void; - toBeCalled(): void; - /** - * Use .toHaveBeenCalledTimes to ensure that a mock function got called exact - * number of times. - */ - toHaveBeenCalledTimes(number: number): void; - toBeCalledTimes(number: number): void; - /** - * - */ - toHaveBeenNthCalledWith(nthCall: number, ...args: Array): void; - nthCalledWith(nthCall: number, ...args: Array): void; - /** - * - */ - toHaveReturned(): void; - toReturn(): void; - /** - * - */ - toHaveReturnedTimes(number: number): void; - toReturnTimes(number: number): void; - /** - * - */ - toHaveReturnedWith(value: any): void; - toReturnWith(value: any): void; - /** - * - */ - toHaveLastReturnedWith(value: any): void; - lastReturnedWith(value: any): void; - /** - * - */ - toHaveNthReturnedWith(nthCall: number, value: any): void; - nthReturnedWith(nthCall: number, value: any): void; - /** - * Use .toHaveBeenCalledWith to ensure that a mock function was called with - * specific arguments. - */ - toHaveBeenCalledWith(...args: Array): void; - toBeCalledWith(...args: Array): void; - /** - * Use .toHaveBeenLastCalledWith to ensure that a mock function was last called - * with specific arguments. - */ - toHaveBeenLastCalledWith(...args: Array): void; - lastCalledWith(...args: Array): void; - /** - * Check that an object has a .length property and it is set to a certain - * numeric value. - */ - toHaveLength(number: number): void; - /** - * - */ - toHaveProperty(propPath: string, value?: any): void; - /** - * Use .toMatch to check that a string matches a regular expression or string. - */ - toMatch(regexpOrString: RegExp | string): void; - /** - * Use .toMatchObject to check that a javascript object matches a subset of the properties of an object. - */ - toMatchObject(object: Object | Array): void; - /** - * Use .toStrictEqual to check that a javascript object matches a subset of the properties of an object. - */ - toStrictEqual(value: any): void; - /** - * This ensures that an Object matches the most recent snapshot. - */ - toMatchSnapshot(propertyMatchers?: any, name?: string): void; - /** - * This ensures that an Object matches the most recent snapshot. - */ - toMatchSnapshot(name: string): void; - - toMatchInlineSnapshot(snapshot?: string): void; - toMatchInlineSnapshot(propertyMatchers?: any, snapshot?: string): void; - /** - * Use .toThrow to test that a function throws when it is called. - * If you want to test that a specific error gets thrown, you can provide an - * argument to toThrow. The argument can be a string for the error message, - * a class for the error, or a regex that should match the error. - * - * Alias: .toThrowError - */ - toThrow(message?: string | Error | Class | RegExp): void; - toThrowError(message?: string | Error | Class | RegExp): void; - /** - * Use .toThrowErrorMatchingSnapshot to test that a function throws a error - * matching the most recent snapshot when it is called. - */ - toThrowErrorMatchingSnapshot(): void; - toThrowErrorMatchingInlineSnapshot(snapshot?: string): void; -} - -type JestObjectType = { - /** - * Disables automatic mocking in the module loader. - * - * After this method is called, all `require()`s will return the real - * versions of each module (rather than a mocked version). - */ - disableAutomock(): JestObjectType, - /** - * An un-hoisted version of disableAutomock - */ - autoMockOff(): JestObjectType, - /** - * Enables automatic mocking in the module loader. - */ - enableAutomock(): JestObjectType, - /** - * An un-hoisted version of enableAutomock - */ - autoMockOn(): JestObjectType, - /** - * Clears the mock.calls and mock.instances properties of all mocks. - * Equivalent to calling .mockClear() on every mocked function. - */ - clearAllMocks(): JestObjectType, - /** - * Resets the state of all mocks. Equivalent to calling .mockReset() on every - * mocked function. - */ - resetAllMocks(): JestObjectType, - /** - * Restores all mocks back to their original value. - */ - restoreAllMocks(): JestObjectType, - /** - * Removes any pending timers from the timer system. - */ - clearAllTimers(): void, - /** - * Returns the number of fake timers still left to run. - */ - getTimerCount(): number, - /** - * The same as `mock` but not moved to the top of the expectation by - * babel-jest. - */ - doMock(moduleName: string, moduleFactory?: any): JestObjectType, - /** - * The same as `unmock` but not moved to the top of the expectation by - * babel-jest. - */ - dontMock(moduleName: string): JestObjectType, - /** - * Returns a new, unused mock function. Optionally takes a mock - * implementation. - */ - fn, TReturn>( - implementation?: (...args: TArguments) => TReturn - ): JestMockFn, - /** - * Determines if the given function is a mocked function. - */ - isMockFunction(fn: Function): boolean, - /** - * Given the name of a module, use the automatic mocking system to generate a - * mocked version of the module for you. - */ - genMockFromModule(moduleName: string): any, - /** - * Mocks a module with an auto-mocked version when it is being required. - * - * The second argument can be used to specify an explicit module factory that - * is being run instead of using Jest's automocking feature. - * - * The third argument can be used to create virtual mocks -- mocks of modules - * that don't exist anywhere in the system. - */ - mock( - moduleName: string, - moduleFactory?: any, - options?: Object - ): JestObjectType, - /** - * Returns the actual module instead of a mock, bypassing all checks on - * whether the module should receive a mock implementation or not. - */ - requireActual(moduleName: string): any, - /** - * Returns a mock module instead of the actual module, bypassing all checks - * on whether the module should be required normally or not. - */ - requireMock(moduleName: string): any, - /** - * Resets the module registry - the cache of all required modules. This is - * useful to isolate modules where local state might conflict between tests. - */ - resetModules(): JestObjectType, - - /** - * Creates a sandbox registry for the modules that are loaded inside the - * callback function. This is useful to isolate specific modules for every - * test so that local module state doesn't conflict between tests. - */ - isolateModules(fn: () => void): JestObjectType, - - /** - * Exhausts the micro-task queue (usually interfaced in node via - * process.nextTick). - */ - runAllTicks(): void, - /** - * Exhausts the macro-task queue (i.e., all tasks queued by setTimeout(), - * setInterval(), and setImmediate()). - */ - runAllTimers(): void, - /** - * Exhausts all tasks queued by setImmediate(). - */ - runAllImmediates(): void, - /** - * Executes only the macro task queue (i.e. all tasks queued by setTimeout() - * or setInterval() and setImmediate()). - */ - advanceTimersByTime(msToRun: number): void, - /** - * Executes only the macro task queue (i.e. all tasks queued by setTimeout() - * or setInterval() and setImmediate()). - * - * Renamed to `advanceTimersByTime`. - */ - runTimersToTime(msToRun: number): void, - /** - * Executes only the macro-tasks that are currently pending (i.e., only the - * tasks that have been queued by setTimeout() or setInterval() up to this - * point) - */ - runOnlyPendingTimers(): void, - /** - * Explicitly supplies the mock object that the module system should return - * for the specified module. Note: It is recommended to use jest.mock() - * instead. - */ - setMock(moduleName: string, moduleExports: any): JestObjectType, - /** - * Indicates that the module system should never return a mocked version of - * the specified module from require() (e.g. that it should always return the - * real module). - */ - unmock(moduleName: string): JestObjectType, - /** - * Instructs Jest to use fake versions of the standard timer functions - * (setTimeout, setInterval, clearTimeout, clearInterval, nextTick, - * setImmediate and clearImmediate). - */ - useFakeTimers(): JestObjectType, - /** - * Instructs Jest to use the real versions of the standard timer functions. - */ - useRealTimers(): JestObjectType, - /** - * Creates a mock function similar to jest.fn but also tracks calls to - * object[methodName]. - */ - spyOn( - object: Object, - methodName: string, - accessType?: 'get' | 'set' - ): JestMockFn, - /** - * Set the default timeout interval for tests and before/after hooks in milliseconds. - * Note: The default timeout interval is 5 seconds if this method is not called. - */ - setTimeout(timeout: number): JestObjectType, -}; - -type JestSpyType = { - calls: JestCallsType, -}; - -/** Runs this function after every test inside this context */ -declare function afterEach( - fn: (done: () => void) => ?Promise, - timeout?: number -): void; -/** Runs this function before every test inside this context */ -declare function beforeEach( - fn: (done: () => void) => ?Promise, - timeout?: number -): void; -/** Runs this function after all tests have finished inside this context */ -declare function afterAll( - fn: (done: () => void) => ?Promise, - timeout?: number -): void; -/** Runs this function before any tests have started inside this context */ -declare function beforeAll( - fn: (done: () => void) => ?Promise, - timeout?: number -): void; - -/** A context for grouping tests together */ -declare var describe: { - /** - * Creates a block that groups together several related tests in one "test suite" - */ - (name: JestTestName, fn: () => void): void, - - /** - * Only run this describe block - */ - only(name: JestTestName, fn: () => void): void, - - /** - * Skip running this describe block - */ - skip(name: JestTestName, fn: () => void): void, - - /** - * each runs this test against array of argument arrays per each run - * - * @param {table} table of Test - */ - each( - ...table: Array | mixed> | [Array, string] - ): ( - name: JestTestName, - fn?: (...args: Array) => ?Promise, - timeout?: number - ) => void, -}; - -/** An individual test unit */ -declare var it: { - /** - * An individual test unit - * - * @param {JestTestName} Name of Test - * @param {Function} Test - * @param {number} Timeout for the test, in milliseconds. - */ - ( - name: JestTestName, - fn?: (done: () => void) => ?Promise, - timeout?: number - ): void, - - /** - * Only run this test - * - * @param {JestTestName} Name of Test - * @param {Function} Test - * @param {number} Timeout for the test, in milliseconds. - */ - only( - name: JestTestName, - fn?: (done: () => void) => ?Promise, - timeout?: number - ): { - each( - ...table: Array | mixed> | [Array, string] - ): ( - name: JestTestName, - fn?: (...args: Array) => ?Promise, - timeout?: number - ) => void, - }, - - /** - * Skip running this test - * - * @param {JestTestName} Name of Test - * @param {Function} Test - * @param {number} Timeout for the test, in milliseconds. - */ - skip( - name: JestTestName, - fn?: (done: () => void) => ?Promise, - timeout?: number - ): void, - - /** - * Highlight planned tests in the summary output - * - * @param {String} Name of Test to do - */ - todo(name: string): void, - - /** - * Run the test concurrently - * - * @param {JestTestName} Name of Test - * @param {Function} Test - * @param {number} Timeout for the test, in milliseconds. - */ - concurrent( - name: JestTestName, - fn?: (done: () => void) => ?Promise, - timeout?: number - ): void, - - /** - * each runs this test against array of argument arrays per each run - * - * @param {table} table of Test - */ - each( - ...table: Array | mixed> | [Array, string] - ): ( - name: JestTestName, - fn?: (...args: Array) => ?Promise, - timeout?: number - ) => void, -}; - -declare function fit( - name: JestTestName, - fn: (done: () => void) => ?Promise, - timeout?: number -): void; -/** An individual test unit */ -declare var test: typeof it; -/** A disabled group of tests */ -declare var xdescribe: typeof describe; -/** A focused group of tests */ -declare var fdescribe: typeof describe; -/** A disabled individual test */ -declare var xit: typeof it; -/** A disabled individual test */ -declare var xtest: typeof it; - -type JestPrettyFormatColors = { - comment: { close: string, open: string }, - content: { close: string, open: string }, - prop: { close: string, open: string }, - tag: { close: string, open: string }, - value: { close: string, open: string }, -}; - -type JestPrettyFormatIndent = string => string; -type JestPrettyFormatRefs = Array; -type JestPrettyFormatPrint = any => string; -type JestPrettyFormatStringOrNull = string | null; - -type JestPrettyFormatOptions = {| - callToJSON: boolean, - edgeSpacing: string, - escapeRegex: boolean, - highlight: boolean, - indent: number, - maxDepth: number, - min: boolean, - plugins: JestPrettyFormatPlugins, - printFunctionName: boolean, - spacing: string, - theme: {| - comment: string, - content: string, - prop: string, - tag: string, - value: string, - |}, -|}; - -type JestPrettyFormatPlugin = { - print: ( - val: any, - serialize: JestPrettyFormatPrint, - indent: JestPrettyFormatIndent, - opts: JestPrettyFormatOptions, - colors: JestPrettyFormatColors - ) => string, - test: any => boolean, -}; - -type JestPrettyFormatPlugins = Array; - -/** The expect function is used every time you want to test a value */ -declare var expect: { - /** The object that you want to make assertions against */ - ( - value: any - ): JestExpectType & - JestPromiseType & - EnzymeMatchersType & - DomTestingLibraryType & - JestJQueryMatchersType & - JestStyledComponentsMatchersType & - JestExtendedMatchersType, - - /** Add additional Jasmine matchers to Jest's roster */ - extend(matchers: { [name: string]: JestMatcher }): void, - /** Add a module that formats application-specific data structures. */ - addSnapshotSerializer(pluginModule: JestPrettyFormatPlugin): void, - assertions(expectedAssertions: number): void, - hasAssertions(): void, - any(value: mixed): JestAsymmetricEqualityType, - anything(): any, - arrayContaining(value: Array): Array, - objectContaining(value: Object): Object, - /** Matches any received string that contains the exact expected string. */ - stringContaining(value: string): string, - stringMatching(value: string | RegExp): string, - not: { - arrayContaining: (value: $ReadOnlyArray) => Array, - objectContaining: (value: {}) => Object, - stringContaining: (value: string) => string, - stringMatching: (value: string | RegExp) => string, - }, -}; - -// TODO handle return type -// http://jasmine.github.io/2.4/introduction.html#section-Spies -declare function spyOn(value: mixed, method: string): Object; - -/** Holds all functions related to manipulating test runner */ -declare var jest: JestObjectType; - -/** - * The global Jasmine object, this is generally not exposed as the public API, - * using features inside here could break in later versions of Jest. - */ -declare var jasmine: { - DEFAULT_TIMEOUT_INTERVAL: number, - any(value: mixed): JestAsymmetricEqualityType, - anything(): any, - arrayContaining(value: Array): Array, - clock(): JestClockType, - createSpy(name: string): JestSpyType, - createSpyObj( - baseName: string, - methodNames: Array - ): { [methodName: string]: JestSpyType }, - objectContaining(value: Object): Object, - stringMatching(value: string): string, -}; diff --git a/jest/helpers.ts b/jest/helpers.ts index c17b17b15..42148a9f9 100644 --- a/jest/helpers.ts +++ b/jest/helpers.ts @@ -1,4 +1,3 @@ -// @flow import fs from 'fs'; import os from 'os'; import path from 'path'; diff --git a/jest/setupUnitTests.js b/jest/setupUnitTests.js index a48825526..074e38aa0 100644 --- a/jest/setupUnitTests.js +++ b/jest/setupUnitTests.js @@ -1,7 +1,3 @@ -/** - * @flow - */ - jest.mock('@react-native-community/cli-tools', () => { return { ...jest.requireActual('@react-native-community/cli-tools'), diff --git a/package.json b/package.json index 9d5b3baad..11c3597cb 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,6 @@ "test:ci:e2e": "jest e2e --ci -i", "lint": "eslint --ext .js,.ts . --cache --report-unused-disable-directives", "test:ci:cocoapods": "ruby packages/platform-ios/native_modules.rb", - "flow-check": "flow check", "postinstall": "yarn build", "publish": "yarn build-clean-all && yarn install && lerna publish" }, @@ -24,7 +23,6 @@ "@babel/plugin-transform-modules-commonjs": "^7.2.0", "@babel/plugin-transform-strict-mode": "^7.0.0", "@babel/preset-env": "^7.0.0", - "@babel/preset-flow": "^7.0.0", "@babel/preset-typescript": "^7.3.3", "@react-native-community/eslint-config": "^0.0.5", "@types/jest": "^24.0.11", @@ -38,8 +36,6 @@ "eslint-import-resolver-typescript": "^1.1.1", "eslint-plugin-import": "^2.17.0", "execa": "^1.0.0", - "flow-bin": "^0.107.0", - "flow-typed": "^2.5.1", "glob": "^7.1.3", "jest": "^24.6.0", "lerna": "^3.14.0", diff --git a/packages/cli/src/commands/info/__tests__/info.test.ts b/packages/cli/src/commands/info/__tests__/info.test.ts index a888126d1..28ba358b0 100644 --- a/packages/cli/src/commands/info/__tests__/info.test.ts +++ b/packages/cli/src/commands/info/__tests__/info.test.ts @@ -1,4 +1,3 @@ -// @flow import info from '../info'; import {logger} from '@react-native-community/cli-tools'; import loadConfig from '../../../tools/config'; diff --git a/packages/cli/src/tools/__tests__/copyFiles.test.ts b/packages/cli/src/tools/__tests__/copyFiles.test.ts index cc6394f0a..e60493e62 100644 --- a/packages/cli/src/tools/__tests__/copyFiles.test.ts +++ b/packages/cli/src/tools/__tests__/copyFiles.test.ts @@ -1,4 +1,3 @@ -// @flow import fs from 'fs'; import path from 'path'; import copyFiles from '../copyFiles'; diff --git a/packages/cli/src/tools/config/__tests__/findDependencies-test.ts b/packages/cli/src/tools/config/__tests__/findDependencies-test.ts index 818643ca9..2062a20ad 100644 --- a/packages/cli/src/tools/config/__tests__/findDependencies-test.ts +++ b/packages/cli/src/tools/config/__tests__/findDependencies-test.ts @@ -1,7 +1,3 @@ -/** - * @flow - */ - import findDependencies from '../findDependencies'; import { cleanup, diff --git a/packages/cli/src/tools/config/__tests__/index-test.ts b/packages/cli/src/tools/config/__tests__/index-test.ts index 015012c45..8ac8f66f2 100644 --- a/packages/cli/src/tools/config/__tests__/index-test.ts +++ b/packages/cli/src/tools/config/__tests__/index-test.ts @@ -1,6 +1,3 @@ -/** - * @flow - */ import path from 'path'; import slash from 'slash'; import loadConfig from '..'; diff --git a/packages/cli/src/tools/generator/templates.ts b/packages/cli/src/tools/generator/templates.ts index c538944fb..1458b729c 100644 --- a/packages/cli/src/tools/generator/templates.ts +++ b/packages/cli/src/tools/generator/templates.ts @@ -3,9 +3,6 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - * - * @format - * @flow */ import {execSync} from 'child_process'; diff --git a/packages/cli/src/tools/loadMetroConfig.ts b/packages/cli/src/tools/loadMetroConfig.ts index 3d5ab90f0..7e4609007 100644 --- a/packages/cli/src/tools/loadMetroConfig.ts +++ b/packages/cli/src/tools/loadMetroConfig.ts @@ -135,16 +135,6 @@ export default function load( ): Promise { const defaultConfig = getDefaultConfig(ctx); if (options && options.reporter) { - /** - * $FlowIssue: Metro doesn't accept `reporter` to be passed along other options - * and will ignore the value, if provided. - * - * We explicitly read `reporter` value and set it on a default configuration. Note - * that all other options described in the `ConfigOptionsT` are handled by Metro - * automatically. - * - * This is a temporary workaround. - */ defaultConfig.reporter = options.reporter; } return loadConfig({cwd: ctx.root, ...options}, defaultConfig); diff --git a/packages/platform-ios/src/commands/runIOS/index.ts b/packages/platform-ios/src/commands/runIOS/index.ts index eeae9a28f..3d8d12e48 100644 --- a/packages/platform-ios/src/commands/runIOS/index.ts +++ b/packages/platform-ios/src/commands/runIOS/index.ts @@ -77,7 +77,6 @@ function runIOS(_: Array, ctx: Config, args: FlagsT) { } const devices = parseIOSDevicesList( - // $FlowExpectedError https://github.com/facebook/flow/issues/5675 child_process.execFileSync('xcrun', ['instruments', '-s'], { encoding: 'utf8', }), @@ -156,7 +155,6 @@ async function runOnSimulator( */ const activeDeveloperDir = child_process .execFileSync('xcode-select', ['-p'], {encoding: 'utf8'}) - // $FlowExpectedError https://github.com/facebook/flow/issues/5675 .trim(); child_process.execFileSync('open', [ @@ -193,7 +191,6 @@ async function runOnSimulator( ['-c', 'Print:CFBundleIdentifier', path.join(appPath, 'Info.plist')], {encoding: 'utf8'}, ) - // $FlowExpectedError https://github.com/facebook/flow/issues/5675 .trim(); logger.info(`Launching "${chalk.bold(bundleID)}"`); diff --git a/types/index.js b/types/index.js deleted file mode 100644 index 025d2ef11..000000000 --- a/types/index.js +++ /dev/null @@ -1,263 +0,0 @@ -/** - * @flow - */ -export type CommandT = { - name: string, - description?: string, - detached?: boolean, - func: (argv: Array, ctx: ConfigT, args: Object) => ?Promise, - options?: Array<{ - name: string, - description?: string, - parse?: (val: string) => any, - default?: - | string - | boolean - | number - | ((ctx: ConfigT) => string | boolean | number), - }>, - examples?: Array<{ - desc: string, - cmd: string, - }>, -}; - -/** - * Opaque type that describes the Inquirer question format. Not typed, since we just - * pass it directly to Inquirer. Validation is done with Joi in `schema.js` - */ -export type InquirerPromptT = any; - -/** - * Settings that a library author can define in the configuration bundled with - * dependency for Android - * - * See UserDependencyConfigT for details - */ -type DependencyParamsAndroidT = { - sourceDir?: string, - manifestPath?: string, - packageImportPath?: string, - packageInstance?: string, -}; - -/** - * Settings that user can define in the project configuration for Android - * - * See UserConfigT for details - */ -type ProjectParamsAndroidT = { - sourceDir?: string, - manifestPath?: string, - packageName?: string, - packageFolder?: string, - mainFilePath?: string, - stringsPath?: string, - settingsGradlePath?: string, - assetsPath?: string, - buildGradlePath?: string, - packageName?: string, -}; - -/** - * Settings that user can define in the project configuration for iOS. - * Same for dependency - we share the type. - * - * See UserDependencyConfigT and UserConfigT for details - */ -type ProjectParamsIOST = { - project?: string, - podspecPath?: string, - sharedLibraries?: string[], - libraryFolder?: string, - plist: any[], - scriptPhases: Array<{ - name?: string, - path?: string, - [key: string]: string, - }>, -}; - -type PlatformConfig< - ProjectParams, - DependencyParams, - ProjectConfig, - DependencyConfig, -> = { - projectConfig: (string, ?ProjectParams) => ?ProjectConfig, - dependencyConfig: (string, ?DependencyParams) => ?DependencyConfig, - linkConfig: () => { - isInstalled: (ProjectConfig, string, DependencyConfig) => boolean, - register: (string, DependencyConfig, Object, ProjectConfig) => void, - unregister: ( - string, - DependencyConfig, - ProjectConfig, - Array, - ) => void, - copyAssets: (string[], ProjectConfig) => void, - unlinkAssets: (string[], ProjectConfig) => void, - }, -}; - -/** - * Final configuration object - */ -export type ConfigT = {| - // Root where the configuration has been resolved from - root: string, - - // Path to React Native source - reactNativePath: string, - - // Object that contains configuration for a project (null, when platform not available) - project: { - android?: ProjectConfigAndroidT, - ios?: ?ProjectConfigIOST, - [key: string]: ?Object, - }, - - // An array of assets as defined by the user - assets: string[], - - // Map of the dependencies that are present in the project - dependencies: { - [key: string]: { - name: string, - root: string, - platforms: { - android?: DependencyConfigAndroidT | null, - ios?: DependencyConfigIOST | null, - [key: string]: any, - }, - assets: string[], - hooks: { - [key: string]: string, - prelink?: string, - postlink?: string, - }, - params: InquirerPromptT[], - }, - }, - - // Map of available platforms (built-ins and dynamically loaded) - platforms: { - [name: string]: PlatformConfig, - ios?: PlatformConfig< - ProjectParamsIOST, - ProjectParamsIOST, // DependencyParams are the same as ProjectParams on iOS - ProjectConfigIOST, - DependencyConfigIOST, - >, - android?: PlatformConfig< - ProjectParamsAndroidT, - DependencyParamsAndroidT, - ProjectConfigAndroidT, - DependencyConfigAndroidT, - >, - }, - - // An array of commands that are present in 3rd party packages - commands: CommandT[], - - // Haste configuration resolved based on available plugins - haste: { - platforms: Array, - providesModuleNodeModules: Array, - }, -|}; - -/** - * Aliases - */ -export type DependencyConfigT = $PropertyType< - $PropertyType, - '[key: string]', ->; -export type HooksT = $PropertyType; -export type ProjectConfigT = $PropertyType; -export type PlatformsT = $PropertyType; - -/** - * Config defined by a developer for a library - */ -export type UserDependencyConfigT = { - // Additional dependency settings - dependency: { - platforms: { - android?: DependencyParamsAndroidT, - ios?: ProjectParamsIOST, - [key: string]: any, - }, - assets: string[], - hooks: HooksT, - params: InquirerPromptT[], - }, - - // An array of commands that ship with the dependency - commands: CommandT[], - - // An array of extra platforms to load - platforms: { - [name: string]: any, - }, - - // Haste config defined by legacy `rnpm` - haste?: { - platforms: string[], - providesModuleNodeModules: string[], - }, -}; - -/** - * Config defined by a developer for the project - */ -export type UserConfigT = { - /** - * Shares some structure with ConfigT, except that haste and root - * are calculated and can't be defined - */ - ...$Diff, - reactNativePath: ?string, - - // Additional project settings - project: { - android?: ProjectParamsAndroidT, - ios?: ProjectParamsIOST, - [key: string]: any, - }, -}; - -// The following types are used in untyped-parts of the codebase, so I am leaving them -// until we actually need them. -export type ProjectConfigIOST = { - sourceDir: string, - folder: string, - pbxprojPath: string, - podfile: null, - podspecPath: null | string, - projectPath: string, - projectName: string, - libraryFolder: string, - sharedLibraries: Array, - plist: Array, -}; -export type DependencyConfigIOST = ProjectConfigIOST; -type ProjectConfigAndroidT = { - sourceDir: string, - isFlat: boolean, - folder: string, - stringsPath: string, - manifestPath: string, - buildGradlePath: string, - settingsGradlePath: string, - assetsPath: string, - mainFilePath: string, - packageName: string, -}; -type DependencyConfigAndroidT = { - sourceDir: string, - folder: string, - packageImportPath: string, - packageInstance: string, -};