forked from npmx-dev/npmx.dev
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstall-scripts.spec.ts
More file actions
134 lines (119 loc) · 4.35 KB
/
install-scripts.spec.ts
File metadata and controls
134 lines (119 loc) · 4.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import { describe, expect, it } from 'vitest'
import {
extractInstallScriptsInfo,
getInstallScriptFilePath,
parseNodeScript,
} from '../../../../app/utils/install-scripts'
describe('extractInstallScriptsInfo', () => {
it('returns null when no install scripts exist', () => {
expect(extractInstallScriptsInfo(undefined)).toBeNull()
expect(extractInstallScriptsInfo({})).toBeNull()
expect(extractInstallScriptsInfo({ build: 'vite build', test: 'vitest' })).toBeNull()
})
it('detects all install script types with content', () => {
const scripts = {
preinstall: 'node check.js',
install: 'node-gyp rebuild',
postinstall: 'node setup.js',
build: 'vite build', // should be ignored
}
const result = extractInstallScriptsInfo(scripts)
expect(result).toEqual({
scripts: ['preinstall', 'install', 'postinstall'],
content: {
preinstall: 'node check.js',
install: 'node-gyp rebuild',
postinstall: 'node setup.js',
},
npxDependencies: {},
})
})
it('extracts npx packages with versions and flags', () => {
const scripts = {
preinstall: 'npx only-allow pnpm',
postinstall: 'npx -y [email protected] generate && npx --yes @scope/pkg db push',
}
const result = extractInstallScriptsInfo(scripts)
expect(result).toEqual({
scripts: ['preinstall', 'postinstall'],
content: {
preinstall: 'npx only-allow pnpm',
postinstall: 'npx -y [email protected] generate && npx --yes @scope/pkg db push',
},
npxDependencies: {
'only-allow': 'latest',
'prisma': '5.0.0',
'@scope/pkg': 'latest',
},
})
})
it('ignores npx in non-install scripts and built-in commands', () => {
const scripts = {
prepare: 'npx husky install', // ignored - not install script
postinstall: 'npx node script.js', // node is filtered as builtin
}
const result = extractInstallScriptsInfo(scripts)
expect(result).toEqual({
scripts: ['postinstall'],
content: { postinstall: 'npx node script.js' },
npxDependencies: {},
})
})
it('extracts npx packages with dots in names', () => {
const scripts = {
postinstall: 'npx [email protected] && npx @scope/pkg.name generate',
}
const result = extractInstallScriptsInfo(scripts)
expect(result).toEqual({
scripts: ['postinstall'],
content: { postinstall: 'npx [email protected] && npx @scope/pkg.name generate' },
npxDependencies: {
'vue.js': '3.0.0',
'@scope/pkg.name': 'latest',
},
})
})
})
describe('getInstallScriptFilePath', () => {
it('returns file path when script is `node <file-path>`', () => {
expect(getInstallScriptFilePath('node scripts/postinstall.js')).toBe('scripts/postinstall.js')
})
it('returns package.json when script is not a simple node command', () => {
expect(getInstallScriptFilePath('npx prisma generate')).toBe('package.json')
})
it('strips leading ./ from relative paths', () => {
expect(getInstallScriptFilePath('node ./scripts/setup.js')).toBe('scripts/setup.js')
})
it('falls back to package.json for parent directory references', () => {
expect(getInstallScriptFilePath('node ../scripts/setup.js')).toBe('package.json')
expect(getInstallScriptFilePath('node ./scripts/../lib/setup.js')).toBe('package.json')
})
it('returns package.json for bare node command without arguments', () => {
expect(getInstallScriptFilePath('node')).toBe('package.json')
expect(getInstallScriptFilePath('node ')).toBe('package.json')
})
})
describe('parseNodeScript', () => {
it('returns prefix and filePath for node scripts', () => {
expect(parseNodeScript('node scripts/postinstall.js')).toEqual({
prefix: 'node ',
filePath: 'scripts/postinstall.js',
})
})
it('strips leading ./ from file path', () => {
expect(parseNodeScript('node ./scripts/setup.js')).toEqual({
prefix: 'node ',
filePath: 'scripts/setup.js',
})
})
it('returns null for non-node scripts', () => {
expect(parseNodeScript('npx prisma generate')).toBeNull()
})
it('returns null for bare node command', () => {
expect(parseNodeScript('node')).toBeNull()
expect(parseNodeScript('node ')).toBeNull()
})
it('returns null for parent directory references', () => {
expect(parseNodeScript('node ../scripts/setup.js')).toBeNull()
})
})