args.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', {
  3. value: true
  4. });
  5. exports.check = check;
  6. exports.usage = exports.options = exports.docs = void 0;
  7. function _jestConfig() {
  8. const data = require('jest-config');
  9. _jestConfig = function () {
  10. return data;
  11. };
  12. return data;
  13. }
  14. /**
  15. * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
  16. *
  17. * This source code is licensed under the MIT license found in the
  18. * LICENSE file in the root directory of this source tree.
  19. */
  20. function check(argv) {
  21. if (argv.runInBand && argv.hasOwnProperty('maxWorkers')) {
  22. throw new Error(
  23. 'Both --runInBand and --maxWorkers were specified, but these two ' +
  24. 'options do not make sense together. Which is it?'
  25. );
  26. }
  27. for (const key of [
  28. 'onlyChanged',
  29. 'lastCommit',
  30. 'changedFilesWithAncestor',
  31. 'changedSince'
  32. ]) {
  33. if (argv[key] && argv.watchAll) {
  34. throw new Error(
  35. `Both --${key} and --watchAll were specified, but these two ` +
  36. 'options do not make sense together. Try the --watch option which ' +
  37. 'reruns only tests related to changed files.'
  38. );
  39. }
  40. }
  41. if (argv.onlyFailures && argv.watchAll) {
  42. throw new Error(
  43. 'Both --onlyFailures and --watchAll were specified, but these two ' +
  44. 'options do not make sense together.'
  45. );
  46. }
  47. if (argv.findRelatedTests && argv._.length === 0) {
  48. throw new Error(
  49. 'The --findRelatedTests option requires file paths to be specified.\n' +
  50. 'Example usage: jest --findRelatedTests ./src/source.js ' +
  51. './src/index.js.'
  52. );
  53. }
  54. if (argv.hasOwnProperty('maxWorkers') && argv.maxWorkers === undefined) {
  55. throw new Error(
  56. 'The --maxWorkers (-w) option requires a number or string to be specified.\n' +
  57. 'Example usage: jest --maxWorkers 2\n' +
  58. 'Example usage: jest --maxWorkers 50%\n' +
  59. 'Or did you mean --watch?'
  60. );
  61. }
  62. if (argv.selectProjects && argv.selectProjects.length === 0) {
  63. throw new Error(
  64. 'The --selectProjects option requires the name of at least one project to be specified.\n' +
  65. 'Example usage: jest --selectProjects my-first-project my-second-project'
  66. );
  67. }
  68. if (
  69. argv.config &&
  70. !(0, _jestConfig().isJSONString)(argv.config) &&
  71. !argv.config.match(
  72. new RegExp(
  73. `\\.(${_jestConfig()
  74. .constants.JEST_CONFIG_EXT_ORDER.map(e => e.substring(1))
  75. .join('|')})$`,
  76. 'i'
  77. )
  78. )
  79. ) {
  80. throw new Error(
  81. `The --config option requires a JSON string literal, or a file path with one of these extensions: ${_jestConfig().constants.JEST_CONFIG_EXT_ORDER.join(
  82. ', '
  83. )}.\nExample usage: jest --config ./jest.config.js`
  84. );
  85. }
  86. return true;
  87. }
  88. const usage = 'Usage: $0 [--config=<pathToConfigFile>] [TestPathPattern]';
  89. exports.usage = usage;
  90. const docs = 'Documentation: https://jestjs.io/'; // The default values are all set in jest-config
  91. exports.docs = docs;
  92. const options = {
  93. all: {
  94. description:
  95. 'The opposite of `onlyChanged`. If `onlyChanged` is set by ' +
  96. 'default, running jest with `--all` will force Jest to run all tests ' +
  97. 'instead of running only tests related to changed files.',
  98. type: 'boolean'
  99. },
  100. automock: {
  101. description: 'Automock all files by default.',
  102. type: 'boolean'
  103. },
  104. bail: {
  105. alias: 'b',
  106. description:
  107. 'Exit the test suite immediately after `n` number of failing tests.',
  108. type: 'boolean'
  109. },
  110. cache: {
  111. description:
  112. 'Whether to use the transform cache. Disable the cache ' +
  113. 'using --no-cache.',
  114. type: 'boolean'
  115. },
  116. cacheDirectory: {
  117. description:
  118. 'The directory where Jest should store its cached ' +
  119. ' dependency information.',
  120. type: 'string'
  121. },
  122. changedFilesWithAncestor: {
  123. description:
  124. 'Runs tests related to the current changes and the changes made in the ' +
  125. 'last commit. Behaves similarly to `--onlyChanged`.',
  126. type: 'boolean'
  127. },
  128. changedSince: {
  129. description:
  130. 'Runs tests related to the changes since the provided branch. If the ' +
  131. 'current branch has diverged from the given branch, then only changes ' +
  132. 'made locally will be tested. Behaves similarly to `--onlyChanged`.',
  133. nargs: 1,
  134. type: 'string'
  135. },
  136. ci: {
  137. description:
  138. 'Whether to run Jest in continuous integration (CI) mode. ' +
  139. 'This option is on by default in most popular CI environments. It will ' +
  140. 'prevent snapshots from being written unless explicitly requested.',
  141. type: 'boolean'
  142. },
  143. clearCache: {
  144. description:
  145. 'Clears the configured Jest cache directory and then exits. ' +
  146. 'Default directory can be found by calling jest --showConfig',
  147. type: 'boolean'
  148. },
  149. clearMocks: {
  150. description:
  151. 'Automatically clear mock calls, instances and results before every test. ' +
  152. 'Equivalent to calling jest.clearAllMocks() before each test.',
  153. type: 'boolean'
  154. },
  155. collectCoverage: {
  156. description: 'Alias for --coverage.',
  157. type: 'boolean'
  158. },
  159. collectCoverageFrom: {
  160. description:
  161. 'A glob pattern relative to <rootDir> matching the files that coverage ' +
  162. 'info needs to be collected from.',
  163. type: 'string'
  164. },
  165. collectCoverageOnlyFrom: {
  166. description: 'Explicit list of paths coverage will be restricted to.',
  167. string: true,
  168. type: 'array'
  169. },
  170. color: {
  171. description:
  172. 'Forces test results output color highlighting (even if ' +
  173. 'stdout is not a TTY). Set to false if you would like to have no colors.',
  174. type: 'boolean'
  175. },
  176. colors: {
  177. description: 'Alias for `--color`.',
  178. type: 'boolean'
  179. },
  180. config: {
  181. alias: 'c',
  182. description:
  183. 'The path to a jest config file specifying how to find ' +
  184. 'and execute tests. If no rootDir is set in the config, the directory ' +
  185. 'containing the config file is assumed to be the rootDir for the project.' +
  186. 'This can also be a JSON encoded value which Jest will use as configuration.',
  187. type: 'string'
  188. },
  189. coverage: {
  190. description:
  191. 'Indicates that test coverage information should be ' +
  192. 'collected and reported in the output.',
  193. type: 'boolean'
  194. },
  195. coverageDirectory: {
  196. description: 'The directory where Jest should output its coverage files.',
  197. type: 'string'
  198. },
  199. coveragePathIgnorePatterns: {
  200. description:
  201. 'An array of regexp pattern strings that are matched ' +
  202. 'against all file paths before executing the test. If the file path' +
  203. 'matches any of the patterns, coverage information will be skipped.',
  204. string: true,
  205. type: 'array'
  206. },
  207. coverageProvider: {
  208. choices: ['babel', 'v8'],
  209. description: 'Select between Babel and V8 to collect coverage'
  210. },
  211. coverageReporters: {
  212. description:
  213. 'A list of reporter names that Jest uses when writing ' +
  214. 'coverage reports. Any istanbul reporter can be used.',
  215. string: true,
  216. type: 'array'
  217. },
  218. coverageThreshold: {
  219. description:
  220. 'A JSON string with which will be used to configure ' +
  221. 'minimum threshold enforcement for coverage results',
  222. type: 'string'
  223. },
  224. debug: {
  225. description: 'Print debugging info about your jest config.',
  226. type: 'boolean'
  227. },
  228. detectLeaks: {
  229. description:
  230. '**EXPERIMENTAL**: Detect memory leaks in tests. After executing a ' +
  231. 'test, it will try to garbage collect the global object used, and fail ' +
  232. 'if it was leaked',
  233. type: 'boolean'
  234. },
  235. detectOpenHandles: {
  236. description:
  237. 'Print out remaining open handles preventing Jest from exiting at the ' +
  238. 'end of a test run. Implies `runInBand`.',
  239. type: 'boolean'
  240. },
  241. env: {
  242. description:
  243. 'The test environment used for all tests. This can point to ' +
  244. 'any file or node module. Examples: `jsdom`, `node` or ' +
  245. '`path/to/my-environment.js`',
  246. type: 'string'
  247. },
  248. errorOnDeprecated: {
  249. description: 'Make calling deprecated APIs throw helpful error messages.',
  250. type: 'boolean'
  251. },
  252. expand: {
  253. alias: 'e',
  254. description: 'Use this flag to show full diffs instead of a patch.',
  255. type: 'boolean'
  256. },
  257. filter: {
  258. description:
  259. 'Path to a module exporting a filtering function. This method receives ' +
  260. 'a list of tests which can be manipulated to exclude tests from ' +
  261. 'running. Especially useful when used in conjunction with a testing ' +
  262. 'infrastructure to filter known broken tests.',
  263. type: 'string'
  264. },
  265. findRelatedTests: {
  266. description:
  267. 'Find related tests for a list of source files that were ' +
  268. 'passed in as arguments. Useful for pre-commit hook integration to run ' +
  269. 'the minimal amount of tests necessary.',
  270. type: 'boolean'
  271. },
  272. forceExit: {
  273. description:
  274. 'Force Jest to exit after all tests have completed running. ' +
  275. 'This is useful when resources set up by test code cannot be ' +
  276. 'adequately cleaned up.',
  277. type: 'boolean'
  278. },
  279. globalSetup: {
  280. description: 'The path to a module that runs before All Tests.',
  281. type: 'string'
  282. },
  283. globalTeardown: {
  284. description: 'The path to a module that runs after All Tests.',
  285. type: 'string'
  286. },
  287. globals: {
  288. description:
  289. 'A JSON string with map of global variables that need ' +
  290. 'to be available in all test environments.',
  291. type: 'string'
  292. },
  293. haste: {
  294. description:
  295. 'A JSON string with map of variables for the haste module system',
  296. type: 'string'
  297. },
  298. init: {
  299. description: 'Generate a basic configuration file',
  300. type: 'boolean'
  301. },
  302. injectGlobals: {
  303. description: 'Should Jest inject global variables or not',
  304. type: 'boolean'
  305. },
  306. json: {
  307. description:
  308. 'Prints the test results in JSON. This mode will send all ' +
  309. 'other test output and user messages to stderr.',
  310. type: 'boolean'
  311. },
  312. lastCommit: {
  313. description:
  314. 'Run all tests affected by file changes in the last commit made. ' +
  315. 'Behaves similarly to `--onlyChanged`.',
  316. type: 'boolean'
  317. },
  318. listTests: {
  319. description:
  320. 'Lists all tests Jest will run given the arguments and ' +
  321. 'exits. Most useful in a CI system together with `--findRelatedTests` ' +
  322. 'to determine the tests Jest will run based on specific files',
  323. type: 'boolean'
  324. },
  325. logHeapUsage: {
  326. description:
  327. 'Logs the heap usage after every test. Useful to debug ' +
  328. 'memory leaks. Use together with `--runInBand` and `--expose-gc` in ' +
  329. 'node.',
  330. type: 'boolean'
  331. },
  332. maxConcurrency: {
  333. description:
  334. 'Specifies the maximum number of tests that are allowed to run' +
  335. 'concurrently. This only affects tests using `test.concurrent`.',
  336. type: 'number'
  337. },
  338. maxWorkers: {
  339. alias: 'w',
  340. description:
  341. 'Specifies the maximum number of workers the worker-pool ' +
  342. 'will spawn for running tests. This defaults to the number of the ' +
  343. 'cores available on your machine. (its usually best not to override ' +
  344. 'this default)',
  345. type: 'string'
  346. },
  347. moduleDirectories: {
  348. description:
  349. 'An array of directory names to be searched recursively ' +
  350. "up from the requiring module's location.",
  351. string: true,
  352. type: 'array'
  353. },
  354. moduleFileExtensions: {
  355. description:
  356. 'An array of file extensions your modules use. If you ' +
  357. 'require modules without specifying a file extension, these are the ' +
  358. 'extensions Jest will look for. ',
  359. string: true,
  360. type: 'array'
  361. },
  362. moduleNameMapper: {
  363. description:
  364. 'A JSON string with a map from regular expressions to ' +
  365. 'module names or to arrays of module names that allow to stub ' +
  366. 'out resources, like images or styles with a single module',
  367. type: 'string'
  368. },
  369. modulePathIgnorePatterns: {
  370. description:
  371. 'An array of regexp pattern strings that are matched ' +
  372. 'against all module paths before those paths are to be considered ' +
  373. '"visible" to the module loader.',
  374. string: true,
  375. type: 'array'
  376. },
  377. modulePaths: {
  378. description:
  379. 'An alternative API to setting the NODE_PATH env variable, ' +
  380. 'modulePaths is an array of absolute paths to additional locations to ' +
  381. 'search when resolving modules.',
  382. string: true,
  383. type: 'array'
  384. },
  385. noStackTrace: {
  386. description: 'Disables stack trace in test results output',
  387. type: 'boolean'
  388. },
  389. notify: {
  390. description: 'Activates notifications for test results.',
  391. type: 'boolean'
  392. },
  393. notifyMode: {
  394. description: 'Specifies when notifications will appear for test results.',
  395. type: 'string'
  396. },
  397. onlyChanged: {
  398. alias: 'o',
  399. description:
  400. 'Attempts to identify which tests to run based on which ' +
  401. "files have changed in the current repository. Only works if you're " +
  402. 'running tests in a git or hg repository at the moment.',
  403. type: 'boolean'
  404. },
  405. onlyFailures: {
  406. alias: 'f',
  407. description: 'Run tests that failed in the previous execution.',
  408. type: 'boolean'
  409. },
  410. outputFile: {
  411. description:
  412. 'Write test results to a file when the --json option is ' +
  413. 'also specified.',
  414. type: 'string'
  415. },
  416. passWithNoTests: {
  417. description:
  418. 'Will not fail if no tests are found (for example while using `--testPathPattern`.)',
  419. type: 'boolean'
  420. },
  421. preset: {
  422. description: "A preset that is used as a base for Jest's configuration.",
  423. type: 'string'
  424. },
  425. prettierPath: {
  426. description: 'The path to the "prettier" module used for inline snapshots.',
  427. type: 'string'
  428. },
  429. projects: {
  430. description:
  431. 'A list of projects that use Jest to run all tests of all ' +
  432. 'projects in a single instance of Jest.',
  433. string: true,
  434. type: 'array'
  435. },
  436. reporters: {
  437. description: 'A list of custom reporters for the test suite.',
  438. string: true,
  439. type: 'array'
  440. },
  441. resetMocks: {
  442. description:
  443. 'Automatically reset mock state before every test. ' +
  444. 'Equivalent to calling jest.resetAllMocks() before each test.',
  445. type: 'boolean'
  446. },
  447. resetModules: {
  448. description:
  449. 'If enabled, the module registry for every test file will ' +
  450. 'be reset before running each individual test.',
  451. type: 'boolean'
  452. },
  453. resolver: {
  454. description: 'A JSON string which allows the use of a custom resolver.',
  455. type: 'string'
  456. },
  457. restoreMocks: {
  458. description:
  459. 'Automatically restore mock state and implementation before every test. ' +
  460. 'Equivalent to calling jest.restoreAllMocks() before each test.',
  461. type: 'boolean'
  462. },
  463. rootDir: {
  464. description:
  465. 'The root directory that Jest should scan for tests and ' +
  466. 'modules within.',
  467. type: 'string'
  468. },
  469. roots: {
  470. description:
  471. 'A list of paths to directories that Jest should use to ' +
  472. 'search for files in.',
  473. string: true,
  474. type: 'array'
  475. },
  476. runInBand: {
  477. alias: 'i',
  478. description:
  479. 'Run all tests serially in the current process (rather than ' +
  480. 'creating a worker pool of child processes that run tests). This ' +
  481. 'is sometimes useful for debugging, but such use cases are pretty ' +
  482. 'rare.',
  483. type: 'boolean'
  484. },
  485. runTestsByPath: {
  486. description:
  487. 'Used when provided patterns are exact file paths. This avoids ' +
  488. 'converting them into a regular expression and matching it against ' +
  489. 'every single file.',
  490. type: 'boolean'
  491. },
  492. runner: {
  493. description:
  494. "Allows to use a custom runner instead of Jest's default test runner.",
  495. type: 'string'
  496. },
  497. selectProjects: {
  498. description:
  499. 'Run only the tests of the specified projects.' +
  500. 'Jest uses the attribute `displayName` in the configuration to identify each project.',
  501. string: true,
  502. type: 'array'
  503. },
  504. setupFiles: {
  505. description:
  506. 'A list of paths to modules that run some code to configure or ' +
  507. 'set up the testing environment before each test. ',
  508. string: true,
  509. type: 'array'
  510. },
  511. setupFilesAfterEnv: {
  512. description:
  513. 'A list of paths to modules that run some code to configure or ' +
  514. 'set up the testing framework before each test ',
  515. string: true,
  516. type: 'array'
  517. },
  518. showConfig: {
  519. description: 'Print your jest config and then exits.',
  520. type: 'boolean'
  521. },
  522. silent: {
  523. description: 'Prevent tests from printing messages through the console.',
  524. type: 'boolean'
  525. },
  526. skipFilter: {
  527. description:
  528. 'Disables the filter provided by --filter. Useful for CI jobs, or ' +
  529. 'local enforcement when fixing tests.',
  530. type: 'boolean'
  531. },
  532. snapshotSerializers: {
  533. description:
  534. 'A list of paths to snapshot serializer modules Jest should ' +
  535. 'use for snapshot testing.',
  536. string: true,
  537. type: 'array'
  538. },
  539. testEnvironment: {
  540. description: 'Alias for --env',
  541. type: 'string'
  542. },
  543. testEnvironmentOptions: {
  544. description:
  545. 'A JSON string with options that will be passed to the `testEnvironment`. ' +
  546. 'The relevant options depend on the environment.',
  547. type: 'string'
  548. },
  549. testFailureExitCode: {
  550. description: 'Exit code of `jest` command if the test run failed',
  551. type: 'string' // number
  552. },
  553. testLocationInResults: {
  554. description: 'Add `location` information to the test results',
  555. type: 'boolean'
  556. },
  557. testMatch: {
  558. description: 'The glob patterns Jest uses to detect test files.',
  559. string: true,
  560. type: 'array'
  561. },
  562. testNamePattern: {
  563. alias: 't',
  564. description: 'Run only tests with a name that matches the regex pattern.',
  565. type: 'string'
  566. },
  567. testPathIgnorePatterns: {
  568. description:
  569. 'An array of regexp pattern strings that are matched ' +
  570. 'against all test paths before executing the test. If the test path ' +
  571. 'matches any of the patterns, it will be skipped.',
  572. string: true,
  573. type: 'array'
  574. },
  575. testPathPattern: {
  576. description:
  577. 'A regexp pattern string that is matched against all tests ' +
  578. 'paths before executing the test.',
  579. string: true,
  580. type: 'array'
  581. },
  582. testRegex: {
  583. description:
  584. 'A string or array of string regexp patterns that Jest uses to detect test files.',
  585. string: true,
  586. type: 'array'
  587. },
  588. testResultsProcessor: {
  589. description:
  590. 'Allows the use of a custom results processor. ' +
  591. 'This processor must be a node module that exports ' +
  592. 'a function expecting as the first argument the result object.',
  593. type: 'string'
  594. },
  595. testRunner: {
  596. description:
  597. 'Allows to specify a custom test runner. The default is' +
  598. ' `jest-circus/runner`. A path to a custom test runner can be provided:' +
  599. ' `<rootDir>/path/to/testRunner.js`.',
  600. type: 'string'
  601. },
  602. testSequencer: {
  603. description:
  604. 'Allows to specify a custom test sequencer. The default is ' +
  605. '`@jest/test-sequencer`. A path to a custom test sequencer can be ' +
  606. 'provided: `<rootDir>/path/to/testSequencer.js`',
  607. type: 'string'
  608. },
  609. testTimeout: {
  610. description: 'This option sets the default timeouts of test cases.',
  611. type: 'number'
  612. },
  613. testURL: {
  614. description: 'This option sets the URL for the jsdom environment.',
  615. type: 'string'
  616. },
  617. timers: {
  618. description:
  619. 'Setting this value to fake allows the use of fake timers ' +
  620. 'for functions such as setTimeout.',
  621. type: 'string'
  622. },
  623. transform: {
  624. description:
  625. 'A JSON string which maps from regular expressions to paths ' +
  626. 'to transformers.',
  627. type: 'string'
  628. },
  629. transformIgnorePatterns: {
  630. description:
  631. 'An array of regexp pattern strings that are matched ' +
  632. 'against all source file paths before transformation.',
  633. string: true,
  634. type: 'array'
  635. },
  636. unmockedModulePathPatterns: {
  637. description:
  638. 'An array of regexp pattern strings that are matched ' +
  639. 'against all modules before the module loader will automatically ' +
  640. 'return a mock for them.',
  641. string: true,
  642. type: 'array'
  643. },
  644. updateSnapshot: {
  645. alias: 'u',
  646. description:
  647. 'Use this flag to re-record snapshots. ' +
  648. 'Can be used together with a test suite pattern or with ' +
  649. '`--testNamePattern` to re-record snapshot for test matching ' +
  650. 'the pattern',
  651. type: 'boolean'
  652. },
  653. useStderr: {
  654. description: 'Divert all output to stderr.',
  655. type: 'boolean'
  656. },
  657. verbose: {
  658. description:
  659. 'Display individual test results with the test suite hierarchy.',
  660. type: 'boolean'
  661. },
  662. version: {
  663. alias: 'v',
  664. description: 'Print the version and exit',
  665. type: 'boolean'
  666. },
  667. watch: {
  668. description:
  669. 'Watch files for changes and rerun tests related to ' +
  670. 'changed files. If you want to re-run all tests when a file has ' +
  671. 'changed, use the `--watchAll` option.',
  672. type: 'boolean'
  673. },
  674. watchAll: {
  675. description:
  676. 'Watch files for changes and rerun all tests. If you want ' +
  677. 'to re-run only the tests related to the changed files, use the ' +
  678. '`--watch` option.',
  679. type: 'boolean'
  680. },
  681. watchPathIgnorePatterns: {
  682. description:
  683. 'An array of regexp pattern strings that are matched ' +
  684. 'against all paths before trigger test re-run in watch mode. ' +
  685. 'If the test path matches any of the patterns, it will be skipped.',
  686. string: true,
  687. type: 'array'
  688. },
  689. watchman: {
  690. description:
  691. 'Whether to use watchman for file crawling. Disable using ' +
  692. '--no-watchman.',
  693. type: 'boolean'
  694. }
  695. };
  696. exports.options = options;