Skip to content

Commit f95d207

Browse files
MikletKent C. Dodds
authored andcommitted
feat(init): keep pre and post scripts as they work in npm (#134)
1 parent 56dc0ad commit f95d207

File tree

6 files changed

+49
-17
lines changed

6 files changed

+49
-17
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ dist
66
.opt-out
77
npm-debug.log
88
.idea/
9+
.vscode/

src/bin-utils/initialize/fixtures/_package-scripts.js

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,25 @@ module.exports = {
55
stuff: 'echo start:stuff'
66
},
77
test: 'echo test',
8+
prefoo: {
9+
default: 'echo prefoo',
10+
bar: 'echo prefoo:bar'
11+
},
812
foo: {
9-
default: 'echo foo',
13+
default: 'nps prefoo && echo foo',
1014
bar: {
11-
default: 'echo foo:bar',
15+
default: 'nps prefoo.bar && echo foo:bar && nps postfoo.bar',
1216
baz: 'echo foo:bar:baz'
1317
}
1418
},
15-
bar: 'echo bar',
16-
fooBar: 'echo foo-bar',
19+
bar: 'echo bar && nps postbar',
20+
postbar: 'echo postbar',
21+
prefooBar: 'echo prefoo-bar',
22+
fooBar: 'nps prefooBar && echo foo-bar',
1723
foobar: 'echo "foo bar"',
18-
baz: 'echo \'baz buzz\''
24+
baz: 'echo \'baz buzz\'',
25+
postfoo: {
26+
bar: 'echo postfoo:bar'
27+
}
1928
}
2029
};

src/bin-utils/initialize/fixtures/_package-scripts.yml

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,19 @@ scripts:
33
default: echo start
44
stuff: 'echo start:stuff'
55
test: echo test
6+
prefoo:
7+
default: echo prefoo
8+
bar: 'echo prefoo:bar'
69
foo:
7-
default: echo foo
10+
default: nps prefoo && echo foo
811
bar:
9-
default: 'echo foo:bar'
12+
default: 'nps prefoo.bar && echo foo:bar && nps postfoo.bar'
1013
baz: 'echo foo:bar:baz'
11-
bar: echo bar
12-
foo-bar: echo foo-bar
14+
bar: echo bar && nps postbar
15+
postbar: echo postbar
16+
prefooBar: echo prefoo-bar
17+
fooBar: nps prefooBar && echo foo-bar
1318
foobar: echo "foo bar"
1419
baz: echo 'baz buzz'
20+
postfoo:
21+
bar: 'echo postfoo:bar'

src/bin-utils/initialize/fixtures/_package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,17 @@
33
"start": "echo start",
44
"start:stuff": "echo start:stuff",
55
"test": "echo test",
6+
"prefoo": "echo prefoo",
67
"foo": "echo foo",
78
"bar": "echo bar",
9+
"postbar": "echo postbar",
10+
"prefoo-bar": "echo prefoo-bar",
811
"foo-bar": "echo foo-bar",
912
"foobar": "echo \"foo bar\"",
1013
"baz": "echo 'baz buzz'",
14+
"prefoo:bar": "echo prefoo:bar",
1115
"foo:bar": "echo foo:bar",
16+
"postfoo:bar": "echo postfoo:bar",
1217
"foo:bar:baz": "echo foo:bar:baz"
1318
}
1419
}

src/bin-utils/initialize/index.js

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,16 +57,23 @@ function structureScripts(scripts) {
5757
// start out by giving every script a `default`
5858
const defaultedScripts = Object.keys(scripts).reduce((obj, key) => {
5959
const keyParts = key.split(':')
60-
let deepKey = [...keyParts, 'default'].join('.')
60+
const isKeyScriptHook = isScriptHook(keyParts[0]);
61+
let deepKey = keyParts.map(key => camelCase(key)).join('.')
62+
let defaultDeepKey = `${deepKey}.default`
6163
if (key.indexOf('start') === 0) {
62-
deepKey = [
64+
defaultDeepKey = [
6365
'default',
6466
...keyParts.slice(1, keyParts.length),
6567
'default',
6668
].join('.')
6769
}
68-
const script = scripts[key]
69-
set(obj, deepKey, script)
70+
let script = scripts[key]
71+
if (!isKeyScriptHook) {
72+
const preHook = scripts[`pre${key}`] ? `nps pre${deepKey} && ` : ''
73+
const postHook = scripts[`post${key}`] ? ` && nps post${deepKey}` : ''
74+
script = `${preHook}${script}${postHook}`
75+
}
76+
set(obj, defaultDeepKey, script)
7077
return obj
7178
}, {})
7279
// traverse the object and replace all objects that
@@ -102,9 +109,8 @@ function jsObjectStringify(object, indent) {
102109
} else {
103110
value = `'${escapeSingleQuote(script)}'`
104111
}
105-
const camelKey = camelCase(key)
106112
const comma = isLast(object, index) ? '' : ','
107-
return `${string}\n${indent}${camelKey}: ${value}${comma}`
113+
return `${string}\n${indent}${key}: ${value}${comma}`
108114
},
109115
'',
110116
)
@@ -123,3 +129,7 @@ function escapeSingleQuote(string) {
123129
function isLast(object, index) {
124130
return Object.keys(object).length - 1 === index
125131
}
132+
133+
function isScriptHook(script) {
134+
return script.indexOf('pre') === 0 || script.indexOf('post') === 0
135+
}

src/bin-utils/initialize/index.test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ test('initialize JS normally', () => {
1414
const expectedPackageScripts = readFileSync(
1515
resolve('./src/bin-utils/initialize/fixtures/_package-scripts.js'),
1616
'utf-8',
17-
)
17+
).replace(/\r?\n/g, '\n');
1818
const mockWriteFileSync = spy()
1919
const mockFindUpSync = spy(file => {
2020
if (file === 'package.json') {
@@ -59,7 +59,7 @@ test('initialize YML normally', () => {
5959
const expectedPackageScripts = readFileSync(
6060
resolve('./src/bin-utils/initialize/fixtures/_package-scripts.yml'),
6161
'utf-8',
62-
)
62+
).replace(/\r?\n/g, '\n')
6363
const mockWriteFileSync = spy()
6464
const mockFindUpSync = spy(file => {
6565
if (file === 'package.json') {

0 commit comments

Comments
 (0)