1 | const path = require('path')
|
2 | const fs = require('fs')
|
3 | const debug = require('debug')('spdt')
|
4 |
|
5 | const STORYBOOK_PORT = 9009
|
6 |
|
7 | const SPDT_DIR = './.spdt'
|
8 |
|
9 | const DEFAULT_CONFIG = {
|
10 | pathToSrc: './src',
|
11 | pathToStories: SPDT_DIR,
|
12 | pathToTestIndex: SPDT_DIR,
|
13 | testIndexName: 'test-index.generated.js',
|
14 | }
|
15 |
|
16 | const PACKAGE_SCRIPTS = {
|
17 | 'spdt:generate-story-index': './node_modules/.bin/spdt:generate-story-index',
|
18 | 'spdt:generate-test-index': './node_modules/.bin/spdt:generate-test-index',
|
19 | 'spdt:generate-tests': './node_modules/.bin/spdt:generate-tests',
|
20 | 'spdt:test': `jest --detectOpenHandles --config ${SPDT_DIR}/jest.spdt.config.js`,
|
21 | 'spdt:test:chrome': `HEADLESS=false jest --detectOpenHandles --config ${SPDT_DIR}/jest.spdt.config.js`,
|
22 | 'spdt:test:chrome:slow': `SLOWMO=1000 HEADLESS=false jest --detectOpenHandles --config ${SPDT_DIR}/jest.spdt.config.js`,
|
23 | 'spdt:storybook': `start-storybook -p ${STORYBOOK_PORT} -c ${SPDT_DIR}`,
|
24 | spdt:
|
25 | 'npm run spdt:generate-story-index && npm run spdt:generate-test-index && npm run spdt:generate-tests && npm run spdt:storybook',
|
26 | }
|
27 |
|
28 | const PACKAGE_JSON_CONFIG_KEY = 'spdt'
|
29 |
|
30 | function findPackageJson(startDir) {
|
31 | let dir = path.resolve(startDir || process.cwd())
|
32 |
|
33 | do {
|
34 | const pkgFile = path.join(dir, 'package.json')
|
35 |
|
36 | if (!fs.existsSync(pkgFile) || !fs.statSync(pkgFile).isFile()) {
|
37 | dir = path.join(dir, '..')
|
38 | } else {
|
39 | return pkgFile
|
40 | }
|
41 | } while (dir !== path.resolve(dir, '..'))
|
42 | return null
|
43 | }
|
44 |
|
45 | function getConfig(configPath) {
|
46 |
|
47 | const packagePath = configPath === null
|
48 | ? configPath
|
49 | : configPath || findPackageJson()
|
50 | try {
|
51 | const packageJsonConfig = (packagePath && require(packagePath)) || {}
|
52 | const projectRoot = packagePath && { projectRoot: path.dirname(packagePath) }
|
53 | return Object.assign({}, DEFAULT_CONFIG, packageJsonConfig[PACKAGE_JSON_CONFIG_KEY], projectRoot)
|
54 | } catch (e) {
|
55 | debug(`error: ${e.code} ${e.message}`)
|
56 | }
|
57 | return DEFAULT_CONFIG
|
58 | }
|
59 |
|
60 | function generateScriptsForPackageJson() {
|
61 | const content = ` "scripts": {\n ...\n`
|
62 | .concat(
|
63 | Object.keys(PACKAGE_SCRIPTS)
|
64 | .map((key) => ` "${key}": "${PACKAGE_SCRIPTS[key]}"`)
|
65 | .join(',\n'),
|
66 | )
|
67 | .concat('\n }')
|
68 | return content
|
69 | }
|
70 |
|
71 | function generateConfigForPackageJson() {
|
72 | const content = ` "${PACKAGE_JSON_CONFIG_KEY}": {\n`
|
73 | .concat(
|
74 | Object.keys(DEFAULT_CONFIG)
|
75 | .map((key) => ` "${key}": "${DEFAULT_CONFIG[key]}"`)
|
76 | .join(',\n'),
|
77 | )
|
78 | .concat('\n }')
|
79 | return content
|
80 | }
|
81 |
|
82 | module.exports = {
|
83 | getConfig,
|
84 | findPackageJson,
|
85 | generateScriptsForPackageJson,
|
86 | generateConfigForPackageJson,
|
87 | PACKAGE_JSON_CONFIG_KEY,
|
88 | DEFAULT_CONFIG,
|
89 | PACKAGE_SCRIPTS,
|
90 | STORYBOOK_PORT,
|
91 | SPDT_DIR,
|
92 | }
|