-
-
Notifications
You must be signed in to change notification settings - Fork 427
Expand file tree
/
Copy pathparse-package-param.spec.ts
More file actions
126 lines (113 loc) · 3.56 KB
/
parse-package-param.spec.ts
File metadata and controls
126 lines (113 loc) · 3.56 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
import { describe, expect, it } from 'vitest'
import { parsePackageParam } from '../../../../shared/utils/parse-package-param'
describe('parsePackageParam', () => {
describe('unscoped packages', () => {
it('parses package name without version', () => {
const result = parsePackageParam('vue')
expect(result).toEqual({
packageName: 'vue',
version: undefined,
rest: [],
})
})
it('parses package name with version', () => {
const result = parsePackageParam('vue/v/3.4.0')
expect(result).toEqual({
packageName: 'vue',
version: '3.4.0',
rest: [],
})
})
it('parses package name with prerelease version', () => {
const result = parsePackageParam('nuxt/v/4.0.0-rc.1')
expect(result).toEqual({
packageName: 'nuxt',
version: '4.0.0-rc.1',
rest: [],
})
})
it('parses package name with version and file path', () => {
const result = parsePackageParam('vue/v/3.4.0/src/index.ts')
expect(result).toEqual({
packageName: 'vue',
version: '3.4.0',
rest: ['src', 'index.ts'],
})
})
it('parses package name with version and nested file path', () => {
const result = parsePackageParam('lodash/v/4.17.21/lib/fp/map.js')
expect(result).toEqual({
packageName: 'lodash',
version: '4.17.21',
rest: ['lib', 'fp', 'map.js'],
})
})
})
describe('scoped packages', () => {
it('parses scoped package name without version', () => {
const result = parsePackageParam('@nuxt/kit')
expect(result).toEqual({
packageName: '@nuxt/kit',
version: undefined,
rest: [],
})
})
it('parses scoped package name with version', () => {
const result = parsePackageParam('@nuxt/kit/v/1.0.0')
expect(result).toEqual({
packageName: '@nuxt/kit',
version: '1.0.0',
rest: [],
})
})
it('parses scoped package name with version and file path', () => {
const result = parsePackageParam('@vue/compiler-sfc/v/3.5.0/dist/index.d.ts')
expect(result).toEqual({
packageName: '@vue/compiler-sfc',
version: '3.5.0',
rest: ['dist', 'index.d.ts'],
})
})
it('parses deeply nested scoped packages', () => {
const result = parsePackageParam('@types/node/v/22.0.0')
expect(result).toEqual({
packageName: '@types/node',
version: '22.0.0',
rest: [],
})
})
})
describe('edge cases', () => {
it('handles package name that looks like a version marker', () => {
// Package named "v" shouldn't be confused with version separator
const result = parsePackageParam('v')
expect(result).toEqual({
packageName: 'v',
version: undefined,
rest: [],
})
})
it('handles version segment without actual version', () => {
// "v" at the end without a version after it
const result = parsePackageParam('vue/v')
expect(result).toEqual({
packageName: 'vue/v',
version: undefined,
rest: [],
})
})
it('handles package with "v" in the name followed by version', () => {
const result = parsePackageParam('vueuse/v/12.0.0')
expect(result).toEqual({
packageName: 'vueuse',
version: '12.0.0',
rest: [],
})
})
it('handles empty rest when file path is empty', () => {
const result = parsePackageParam('react/v/18.2.0')
expect(result.rest).toEqual([])
expect(result.rest.length).toBe(0)
})
})
})