Welcome to mirror list, hosted at ThFree Co, Russian Federation.

override-set.js « test « arborist « workspaces - github.com/npm/cli.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: d46e212647b929b356f42d3340f76a95e4ac7ea1 (plain)
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
const t = require('tap')

const OverrideSet = require('../lib/override-set.js')

t.test('constructor', async (t) => {
  t.test('throws when adding a child rule with no name', async (t) => {
    t.throws(() => {
      new OverrideSet({
        overrides: {
          'github:npm/cli': '1.0.0',
        },
      })
    }, 'Override without name: github:npm/cli', 'threw error')
  })

  t.test('loads overrides', async (t) => {
    const overrides = new OverrideSet({
      overrides: {
        'a@1': { '.': '1.0.2' },
        b: { '.': '1.0.0' },
        'c@1.0.1': { '.': '1.0.2' },
      },
    })

    t.ok(overrides.children.has('a@1'), 'created child for a@1')
    t.ok(overrides.children.has('b'), 'created child for b')

    const missingEdgeRule = overrides.getEdgeRule({ name: 'a', spec: '^2.0.0' })
    t.equal(missingEdgeRule, overrides, 'unmatched edge returns root rules')

    const edgeRuleA = overrides.getEdgeRule({ name: 'a', spec: '^1.0.1' })
    t.ok(edgeRuleA, 'found a rule for a matching edge for a@1')
    const edgeRuleB = overrides.getEdgeRule({ name: 'b', spec: '^1.1.0' })
    t.ok(edgeRuleB, 'found a rule for a matching edge for b')
    const edgeRuleC = overrides.getEdgeRule({ name: 'c', spec: '^1.0.0' })
    t.ok(edgeRuleC, 'returned a rule for matching edge for c')

    const missingNodeRule = overrides.getNodeRule({ name: 'c', version: '1.0.0' })
    t.equal(missingNodeRule, overrides, 'getNodeRule returns root for misses')
    const matchRule = overrides.getMatchingRule({ name: 'a', version: '1.0.2' })
    t.equal(matchRule, overrides.children.get('a@1'), 'got a match for a@1')
    const unmatchedRule = overrides.getMatchingRule({ name: 'a', version: '2.0.0' })
    t.equal(unmatchedRule, null, 'got null for unmatched node')

    const keySpecRuleA = overrides.getNodeRule({ name: 'a', version: '1.0.1' })
    t.ok(keySpecRuleA, 'found a rule by keySpec for a@1')
    const keySpecRuleB = overrides.getNodeRule({ name: 'b', version: '1.1.1' })
    t.ok(keySpecRuleB, 'found a rule by keySpec for b')

    const valueRuleA = overrides.getNodeRule({ name: 'a', version: '1.0.2' })
    t.ok(valueRuleA, 'found a rule by value for a@1')
    const valueRuleB = overrides.getNodeRule({ name: 'b', version: '1.0.0' })
    t.ok(valueRuleB, 'found a rule by value for b')

    t.equal(edgeRuleA, keySpecRuleA, 'edge and node rules are identical for a@1')
    t.equal(keySpecRuleA, valueRuleA, 'both node rules are identical for a@1')
    t.equal(edgeRuleB, keySpecRuleB, 'edge and node rules are identical for b')
    t.equal(keySpecRuleB, valueRuleB, 'both node rules are identical for b')
  })

  t.test('loads child overrides as string', async (t) => {
    const overrides = new OverrideSet({
      overrides: {
        'a@1': '1.0.2',
        b: '1.0.0',
        'c@1.0.1': '1.0.2',
      },
    })

    t.ok(overrides.children.has('a@1'), 'created child for a@1')
    t.ok(overrides.children.has('b'), 'created child for b')

    const missingEdgeRule = overrides.getEdgeRule({ name: 'a', spec: '^2.0.0' })
    t.equal(missingEdgeRule, overrides, 'unmatched edge returns root rules')

    const edgeRuleA = overrides.getEdgeRule({ name: 'a', spec: '^1.0.1' })
    t.ok(edgeRuleA, 'found a rule for a matching edge for a@1')
    const edgeRuleB = overrides.getEdgeRule({ name: 'b', spec: '^1.1.0' })
    t.ok(edgeRuleB, 'found a rule for a matching edge for b')
    const edgeRuleC = overrides.getEdgeRule({ name: 'c', spec: '^1.0.0' })
    t.ok(edgeRuleC, 'returned a rule for matching edge for c')

    const missingNodeRule = overrides.getNodeRule({ name: 'c', version: '1.0.0' })
    t.equal(missingNodeRule, overrides, 'getNodeRule returns root for misses')
    const matchRule = overrides.getMatchingRule({ name: 'a', version: '1.0.2' })
    t.equal(matchRule, overrides.children.get('a@1'), 'got a match for a@1')
    const unmatchedRule = overrides.getMatchingRule({ name: 'a', version: '2.0.0' })
    t.equal(unmatchedRule, null, 'got null for unmatched node')

    const keySpecRuleA = overrides.getNodeRule({ name: 'a', version: '1.0.1' })
    t.ok(keySpecRuleA, 'found a rule by keySpec for a@1')
    const keySpecRuleB = overrides.getNodeRule({ name: 'b', version: '1.1.1' })
    t.ok(keySpecRuleB, 'found a rule by keySpec for b')

    const valueRuleA = overrides.getNodeRule({ name: 'a', version: '1.0.2' })
    t.ok(valueRuleA, 'found a rule by value for a@1')
    const valueRuleB = overrides.getNodeRule({ name: 'b', version: '1.0.0' })
    t.ok(valueRuleB, 'found a rule by value for b')

    t.equal(edgeRuleA, keySpecRuleA, 'edge and node rules are identical for a@1')
    t.equal(keySpecRuleA, valueRuleA, 'both node rules are identical for a@1')
    t.equal(edgeRuleB, keySpecRuleB, 'edge and node rules are identical for b')
    t.equal(keySpecRuleB, valueRuleB, 'both node rules are identical for b')
  })

  t.test('child rules take priority', async (t) => {
    const overrides = new OverrideSet({
      overrides: {
        foo: {
          bar: {
            '.': '2.0.0',
            baz: '3.0.0',
          },
          baz: '2.0.0',
        },
        bar: '1.0.0',
        baz: '1.0.0',
      },
    })

    const edgeRule = overrides.getEdgeRule({ name: 'foo', spec: '^1' })
    t.equal(edgeRule.name, 'foo', 'getEdgeRule returned child rule set')
    const ruleset = edgeRule.ruleset
    const fooRule = ruleset.get('foo')
    // these are both empty because the foo rule does not actually override
    // anything directly, it only carries child rules through
    t.equal(fooRule.keySpec, '', 'keySpec is empty')
    t.equal(fooRule.value, '', 'value is empty')
    const barRule = ruleset.get('bar')
    t.equal(barRule.keySpec, '', 'keySpec is empty')
    t.equal(barRule.value, '2.0.0', 'got the correct override for bar')
    const bazRule = ruleset.get('baz')
    t.equal(bazRule.keySpec, '', 'keySpec is empty')
    t.equal(bazRule.value, '2.0.0', 'got the correct override for baz')

    const childRule = edgeRule.getEdgeRule({ name: 'bar', spec: '^1.0.0' })
    const childRuleSet = childRule.ruleset
    const childBazRule = childRuleSet.get('baz')
    t.equal(childBazRule.keySpec, '', 'keySpec is empty')
    t.equal(childBazRule.value, '3.0.0', 'got the correct override for nested baz')
    const childBarRule = childRuleSet.get('bar')
    t.equal(childBarRule.keySpec, '', 'keySpec is empty')
    t.equal(childBarRule.value, '2.0.0', 'got the correct override for nested bar')
    const childFooRule = childRuleSet.get('foo')
    t.equal(childFooRule.keySpec, '', 'keySpec is empty')
    t.equal(childFooRule.value, '', 'value is empty')
  })

  t.test('coerces empty string to *', async (t) => {
    const overrides = new OverrideSet({
      overrides: {
        foo: {
          '.': '',
        },
        bar: {
        },
      },
    })

    const edgeRule = overrides.getEdgeRule({ name: 'foo', spec: '^1' })
    t.equal(edgeRule.value, '*', 'empty string was replaced with *')

    const barEdgeRule = overrides.getEdgeRule({ name: 'bar', spec: '^1' })
    t.equal(barEdgeRule.value, '', 'when rule is omitted entirely value is an empty string')
  })
})