@aws-cdk/cloud-assembly-schema 2.20.0 → 2.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/.jsii +57 -31
  2. package/.jsii.tabl.json +68 -3
  3. package/.warnings.jsii.js +253 -147
  4. package/NOTICE +0 -17
  5. package/lib/integ-tests/test-case.d.ts +47 -42
  6. package/lib/integ-tests/test-case.js +1 -1
  7. package/lib/manifest.js +57 -8
  8. package/node_modules/lru-cache/LICENSE +1 -1
  9. package/node_modules/lru-cache/README.md +632 -99
  10. package/node_modules/lru-cache/index.js +732 -251
  11. package/node_modules/lru-cache/package.json +17 -7
  12. package/node_modules/semver/README.md +3 -1
  13. package/node_modules/semver/bin/semver.js +17 -8
  14. package/node_modules/semver/classes/comparator.js +3 -2
  15. package/node_modules/semver/classes/index.js +1 -1
  16. package/node_modules/semver/classes/range.js +31 -22
  17. package/node_modules/semver/functions/cmp.js +8 -4
  18. package/node_modules/semver/functions/coerce.js +3 -2
  19. package/node_modules/semver/functions/parse.js +1 -1
  20. package/node_modules/semver/internal/constants.js +2 -2
  21. package/node_modules/semver/internal/identifiers.js +1 -1
  22. package/node_modules/semver/internal/parse-options.js +3 -3
  23. package/node_modules/semver/internal/re.js +3 -3
  24. package/node_modules/semver/package.json +46 -13
  25. package/node_modules/semver/ranges/min-version.js +2 -1
  26. package/node_modules/semver/ranges/outside.js +1 -1
  27. package/node_modules/semver/ranges/simplify.js +15 -12
  28. package/node_modules/semver/ranges/subset.js +53 -31
  29. package/package.json +6 -5
  30. package/schema/cloud-assembly.version.json +1 -1
  31. package/schema/integ.schema.json +1 -1
  32. package/node_modules/semver/CHANGELOG.md +0 -111
  33. package/node_modules/yallist/LICENSE +0 -15
  34. package/node_modules/yallist/README.md +0 -204
  35. package/node_modules/yallist/iterator.js +0 -8
  36. package/node_modules/yallist/package.json +0 -29
  37. package/node_modules/yallist/yallist.js +0 -426
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "lru-cache",
3
3
  "description": "A cache object that deletes the least-recently-used items.",
4
- "version": "6.0.0",
4
+ "version": "7.8.0",
5
5
  "author": "Isaac Z. Schlueter <i@izs.me>",
6
6
  "keywords": [
7
7
  "mru",
@@ -9,8 +9,10 @@
9
9
  "cache"
10
10
  ],
11
11
  "scripts": {
12
+ "build": "",
12
13
  "test": "tap",
13
14
  "snap": "tap",
15
+ "size": "size-limit",
14
16
  "preversion": "npm test",
15
17
  "postversion": "npm publish",
16
18
  "prepublishOnly": "git push origin --follow-tags"
@@ -18,17 +20,25 @@
18
20
  "main": "index.js",
19
21
  "repository": "git://github.com/isaacs/node-lru-cache.git",
20
22
  "devDependencies": {
23
+ "@size-limit/preset-small-lib": "^7.0.8",
21
24
  "benchmark": "^2.1.4",
22
- "tap": "^14.10.7"
25
+ "clock-mock": "^1.0.4",
26
+ "size-limit": "^7.0.8",
27
+ "tap": "^15.1.6"
23
28
  },
24
29
  "license": "ISC",
25
- "dependencies": {
26
- "yallist": "^4.0.0"
27
- },
28
30
  "files": [
29
31
  "index.js"
30
32
  ],
31
33
  "engines": {
32
- "node": ">=10"
33
- }
34
+ "node": ">=12"
35
+ },
36
+ "tap": {
37
+ "coverage-map": "map.js"
38
+ },
39
+ "size-limit": [
40
+ {
41
+ "path": "./index.js"
42
+ }
43
+ ]
34
44
  }
@@ -264,7 +264,9 @@ provided tuple parts.
264
264
  Any of `X`, `x`, or `*` may be used to "stand in" for one of the
265
265
  numeric values in the `[major, minor, patch]` tuple.
266
266
 
267
- * `*` := `>=0.0.0` (Any version satisfies)
267
+ * `*` := `>=0.0.0` (Any non-prerelease version satisfies, unless
268
+ `includePrerelease` is specified, in which case any version at all
269
+ satisfies)
268
270
  * `1.x` := `>=1.0.0 <2.0.0-0` (Matching major version)
269
271
  * `1.2.x` := `>=1.2.0 <1.3.0-0` (Matching major and minor versions)
270
272
 
@@ -27,10 +27,12 @@ const semver = require('../')
27
27
 
28
28
  let reverse = false
29
29
 
30
- const options = {}
30
+ let options = {}
31
31
 
32
32
  const main = () => {
33
- if (!argv.length) return help()
33
+ if (!argv.length) {
34
+ return help()
35
+ }
34
36
  while (argv.length) {
35
37
  let a = argv.shift()
36
38
  const indexOfEqualSign = a.indexOf('=')
@@ -85,26 +87,31 @@ const main = () => {
85
87
  }
86
88
  }
87
89
 
88
- const options = { loose: loose, includePrerelease: includePrerelease, rtl: rtl }
90
+ options = { loose: loose, includePrerelease: includePrerelease, rtl: rtl }
89
91
 
90
92
  versions = versions.map((v) => {
91
93
  return coerce ? (semver.coerce(v, options) || { version: v }).version : v
92
94
  }).filter((v) => {
93
95
  return semver.valid(v)
94
96
  })
95
- if (!versions.length) return fail()
96
- if (inc && (versions.length !== 1 || range.length)) { return failInc() }
97
+ if (!versions.length) {
98
+ return fail()
99
+ }
100
+ if (inc && (versions.length !== 1 || range.length)) {
101
+ return failInc()
102
+ }
97
103
 
98
104
  for (let i = 0, l = range.length; i < l; i++) {
99
105
  versions = versions.filter((v) => {
100
106
  return semver.satisfies(v, range[i], options)
101
107
  })
102
- if (!versions.length) return fail()
108
+ if (!versions.length) {
109
+ return fail()
110
+ }
103
111
  }
104
112
  return success(versions)
105
113
  }
106
114
 
107
-
108
115
  const failInc = () => {
109
116
  console.error('--inc can only be used on a single version with no range')
110
117
  fail()
@@ -120,7 +127,9 @@ const success = () => {
120
127
  return semver.clean(v, options)
121
128
  }).map((v) => {
122
129
  return inc ? semver.inc(v, inc, options, identifier) : v
123
- }).forEach((v, i, _) => { console.log(v) })
130
+ }).forEach((v, i, _) => {
131
+ console.log(v)
132
+ })
124
133
  }
125
134
 
126
135
  const help = () => console.log(
@@ -4,6 +4,7 @@ class Comparator {
4
4
  static get ANY () {
5
5
  return ANY
6
6
  }
7
+
7
8
  constructor (comp, options) {
8
9
  options = parseOptions(options)
9
10
 
@@ -80,7 +81,7 @@ class Comparator {
80
81
  if (!options || typeof options !== 'object') {
81
82
  options = {
82
83
  loose: !!options,
83
- includePrerelease: false
84
+ includePrerelease: false,
84
85
  }
85
86
  }
86
87
 
@@ -128,7 +129,7 @@ class Comparator {
128
129
  module.exports = Comparator
129
130
 
130
131
  const parseOptions = require('../internal/parse-options')
131
- const {re, t} = require('../internal/re')
132
+ const { re, t } = require('../internal/re')
132
133
  const cmp = require('../functions/cmp')
133
134
  const debug = require('../internal/debug')
134
135
  const SemVer = require('./semver')
@@ -1,5 +1,5 @@
1
1
  module.exports = {
2
2
  SemVer: require('./semver.js'),
3
3
  Range: require('./range.js'),
4
- Comparator: require('./comparator.js')
4
+ Comparator: require('./comparator.js'),
5
5
  }
@@ -29,9 +29,9 @@ class Range {
29
29
  // First, split based on boolean or ||
30
30
  this.raw = range
31
31
  this.set = range
32
- .split(/\s*\|\|\s*/)
32
+ .split('||')
33
33
  // map the range to a 2d array of comparators
34
- .map(range => this.parseRange(range.trim()))
34
+ .map(r => this.parseRange(r.trim()))
35
35
  // throw out any comparator lists that are empty
36
36
  // this generally means that it was not a valid range, which is allowed
37
37
  // in loose mode, but will still throw if the WHOLE range is invalid.
@@ -46,9 +46,9 @@ class Range {
46
46
  // keep the first one, in case they're all null sets
47
47
  const first = this.set[0]
48
48
  this.set = this.set.filter(c => !isNullSet(c[0]))
49
- if (this.set.length === 0)
49
+ if (this.set.length === 0) {
50
50
  this.set = [first]
51
- else if (this.set.length > 1) {
51
+ } else if (this.set.length > 1) {
52
52
  // if we have any that are *, then the range is just *
53
53
  for (const c of this.set) {
54
54
  if (c.length === 1 && isAny(c[0])) {
@@ -84,8 +84,9 @@ class Range {
84
84
  const memoOpts = Object.keys(this.options).join(',')
85
85
  const memoKey = `parseRange:${memoOpts}:${range}`
86
86
  const cached = cache.get(memoKey)
87
- if (cached)
87
+ if (cached) {
88
88
  return cached
89
+ }
89
90
 
90
91
  const loose = this.options.loose
91
92
  // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
@@ -94,7 +95,7 @@ class Range {
94
95
  debug('hyphen replace', range)
95
96
  // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
96
97
  range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)
97
- debug('comparator trim', range, re[t.COMPARATORTRIM])
98
+ debug('comparator trim', range)
98
99
 
99
100
  // `~ 1.2.3` => `~1.2.3`
100
101
  range = range.replace(re[t.TILDETRIM], tildeTrimReplace)
@@ -108,30 +109,37 @@ class Range {
108
109
  // At this point, the range is completely trimmed and
109
110
  // ready to be split into comparators.
110
111
 
111
- const compRe = loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]
112
- const rangeList = range
112
+ let rangeList = range
113
113
  .split(' ')
114
114
  .map(comp => parseComparator(comp, this.options))
115
115
  .join(' ')
116
116
  .split(/\s+/)
117
117
  // >=0.0.0 is equivalent to *
118
118
  .map(comp => replaceGTE0(comp, this.options))
119
+
120
+ if (loose) {
119
121
  // in loose mode, throw out any that are not valid comparators
120
- .filter(this.options.loose ? comp => !!comp.match(compRe) : () => true)
121
- .map(comp => new Comparator(comp, this.options))
122
+ rangeList = rangeList.filter(comp => {
123
+ debug('loose invalid filter', comp, this.options)
124
+ return !!comp.match(re[t.COMPARATORLOOSE])
125
+ })
126
+ }
127
+ debug('range list', rangeList)
122
128
 
123
129
  // if any comparators are the null set, then replace with JUST null set
124
130
  // if more than one comparator, remove any * comparators
125
131
  // also, don't include the same comparator more than once
126
- const l = rangeList.length
127
132
  const rangeMap = new Map()
128
- for (const comp of rangeList) {
129
- if (isNullSet(comp))
133
+ const comparators = rangeList.map(comp => new Comparator(comp, this.options))
134
+ for (const comp of comparators) {
135
+ if (isNullSet(comp)) {
130
136
  return [comp]
137
+ }
131
138
  rangeMap.set(comp.value, comp)
132
139
  }
133
- if (rangeMap.size > 1 && rangeMap.has(''))
140
+ if (rangeMap.size > 1 && rangeMap.has('')) {
134
141
  rangeMap.delete('')
142
+ }
135
143
 
136
144
  const result = [...rangeMap.values()]
137
145
  cache.set(memoKey, result)
@@ -196,7 +204,7 @@ const {
196
204
  t,
197
205
  comparatorTrimReplace,
198
206
  tildeTrimReplace,
199
- caretTrimReplace
207
+ caretTrimReplace,
200
208
  } = require('../internal/re')
201
209
 
202
210
  const isNullSet = c => c.value === '<0.0.0-0'
@@ -245,8 +253,8 @@ const isX = id => !id || id.toLowerCase() === 'x' || id === '*'
245
253
  // ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0
246
254
  // ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0
247
255
  const replaceTildes = (comp, options) =>
248
- comp.trim().split(/\s+/).map((comp) => {
249
- return replaceTilde(comp, options)
256
+ comp.trim().split(/\s+/).map((c) => {
257
+ return replaceTilde(c, options)
250
258
  }).join(' ')
251
259
 
252
260
  const replaceTilde = (comp, options) => {
@@ -284,8 +292,8 @@ const replaceTilde = (comp, options) => {
284
292
  // ^1.2.3 --> >=1.2.3 <2.0.0-0
285
293
  // ^1.2.0 --> >=1.2.0 <2.0.0-0
286
294
  const replaceCarets = (comp, options) =>
287
- comp.trim().split(/\s+/).map((comp) => {
288
- return replaceCaret(comp, options)
295
+ comp.trim().split(/\s+/).map((c) => {
296
+ return replaceCaret(c, options)
289
297
  }).join(' ')
290
298
 
291
299
  const replaceCaret = (comp, options) => {
@@ -343,8 +351,8 @@ const replaceCaret = (comp, options) => {
343
351
 
344
352
  const replaceXRanges = (comp, options) => {
345
353
  debug('replaceXRanges', comp, options)
346
- return comp.split(/\s+/).map((comp) => {
347
- return replaceXRange(comp, options)
354
+ return comp.split(/\s+/).map((c) => {
355
+ return replaceXRange(c, options)
348
356
  }).join(' ')
349
357
  }
350
358
 
@@ -405,8 +413,9 @@ const replaceXRange = (comp, options) => {
405
413
  }
406
414
  }
407
415
 
408
- if (gtlt === '<')
416
+ if (gtlt === '<') {
409
417
  pr = '-0'
418
+ }
410
419
 
411
420
  ret = `${gtlt + M}.${m}.${p}${pr}`
412
421
  } else if (xm) {
@@ -8,17 +8,21 @@ const lte = require('./lte')
8
8
  const cmp = (a, op, b, loose) => {
9
9
  switch (op) {
10
10
  case '===':
11
- if (typeof a === 'object')
11
+ if (typeof a === 'object') {
12
12
  a = a.version
13
- if (typeof b === 'object')
13
+ }
14
+ if (typeof b === 'object') {
14
15
  b = b.version
16
+ }
15
17
  return a === b
16
18
 
17
19
  case '!==':
18
- if (typeof a === 'object')
20
+ if (typeof a === 'object') {
19
21
  a = a.version
20
- if (typeof b === 'object')
22
+ }
23
+ if (typeof b === 'object') {
21
24
  b = b.version
25
+ }
22
26
  return a !== b
23
27
 
24
28
  case '':
@@ -1,6 +1,6 @@
1
1
  const SemVer = require('../classes/semver')
2
2
  const parse = require('./parse')
3
- const {re, t} = require('../internal/re')
3
+ const { re, t } = require('../internal/re')
4
4
 
5
5
  const coerce = (version, options) => {
6
6
  if (version instanceof SemVer) {
@@ -43,8 +43,9 @@ const coerce = (version, options) => {
43
43
  re[t.COERCERTL].lastIndex = -1
44
44
  }
45
45
 
46
- if (match === null)
46
+ if (match === null) {
47
47
  return null
48
+ }
48
49
 
49
50
  return parse(`${match[2]}.${match[3] || '0'}.${match[4] || '0'}`, options)
50
51
  }
@@ -1,4 +1,4 @@
1
- const {MAX_LENGTH} = require('../internal/constants')
1
+ const { MAX_LENGTH } = require('../internal/constants')
2
2
  const { re, t } = require('../internal/re')
3
3
  const SemVer = require('../classes/semver')
4
4
 
@@ -4,7 +4,7 @@ const SEMVER_SPEC_VERSION = '2.0.0'
4
4
 
5
5
  const MAX_LENGTH = 256
6
6
  const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||
7
- /* istanbul ignore next */ 9007199254740991
7
+ /* istanbul ignore next */ 9007199254740991
8
8
 
9
9
  // Max safe segment length for coercion.
10
10
  const MAX_SAFE_COMPONENT_LENGTH = 16
@@ -13,5 +13,5 @@ module.exports = {
13
13
  SEMVER_SPEC_VERSION,
14
14
  MAX_LENGTH,
15
15
  MAX_SAFE_INTEGER,
16
- MAX_SAFE_COMPONENT_LENGTH
16
+ MAX_SAFE_COMPONENT_LENGTH,
17
17
  }
@@ -19,5 +19,5 @@ const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)
19
19
 
20
20
  module.exports = {
21
21
  compareIdentifiers,
22
- rcompareIdentifiers
22
+ rcompareIdentifiers,
23
23
  }
@@ -4,8 +4,8 @@ const opts = ['includePrerelease', 'loose', 'rtl']
4
4
  const parseOptions = options =>
5
5
  !options ? {}
6
6
  : typeof options !== 'object' ? { loose: true }
7
- : opts.filter(k => options[k]).reduce((options, k) => {
8
- options[k] = true
9
- return options
7
+ : opts.filter(k => options[k]).reduce((o, k) => {
8
+ o[k] = true
9
+ return o
10
10
  }, {})
11
11
  module.exports = parseOptions
@@ -10,7 +10,7 @@ let R = 0
10
10
 
11
11
  const createToken = (name, value, isGlobal) => {
12
12
  const index = R++
13
- debug(index, value)
13
+ debug(name, index, value)
14
14
  t[name] = index
15
15
  src[index] = value
16
16
  re[index] = new RegExp(value, isGlobal ? 'g' : undefined)
@@ -178,5 +178,5 @@ createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` +
178
178
  // Star ranges basically just allow anything at all.
179
179
  createToken('STAR', '(<|>)?=?\\s*\\*')
180
180
  // >=0.0.0 is like a star
181
- createToken('GTE0', '^\\s*>=\\s*0\.0\.0\\s*$')
182
- createToken('GTE0PRE', '^\\s*>=\\s*0\.0\.0-0\\s*$')
181
+ createToken('GTE0', '^\\s*>=\\s*0\\.0\\.0\\s*$')
182
+ createToken('GTE0PRE', '^\\s*>=\\s*0\\.0\\.0-0\\s*$')
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "semver",
3
- "version": "7.3.5",
3
+ "version": "7.3.6",
4
4
  "description": "The semantic version parser used by npm.",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -8,34 +8,67 @@
8
8
  "snap": "tap",
9
9
  "preversion": "npm test",
10
10
  "postversion": "npm publish",
11
- "postpublish": "git push origin --follow-tags"
11
+ "postpublish": "git push origin --follow-tags",
12
+ "lint": "eslint \"**/*.js\"",
13
+ "postlint": "template-oss-check",
14
+ "lintfix": "npm run lint -- --fix",
15
+ "prepublishOnly": "git push origin --follow-tags",
16
+ "posttest": "npm run lint",
17
+ "template-oss-apply": "template-oss-apply --force"
12
18
  },
13
19
  "devDependencies": {
14
- "tap": "^14.10.7"
20
+ "@npmcli/eslint-config": "^3.0.1",
21
+ "@npmcli/template-oss": "3.2.2",
22
+ "tap": "^16.0.0"
15
23
  },
16
24
  "license": "ISC",
17
- "repository": "https://github.com/npm/node-semver",
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "https://github.com/npm/node-semver.git"
28
+ },
18
29
  "bin": {
19
30
  "semver": "bin/semver.js"
20
31
  },
21
32
  "files": [
22
- "bin/**/*.js",
23
- "range.bnf",
24
- "classes/**/*.js",
25
- "functions/**/*.js",
26
- "internal/**/*.js",
27
- "ranges/**/*.js",
33
+ "bin/",
34
+ "classes/",
35
+ "functions/",
36
+ "internal/",
37
+ "ranges/",
28
38
  "index.js",
29
- "preload.js"
39
+ "preload.js",
40
+ "range.bnf"
30
41
  ],
31
42
  "tap": {
32
43
  "check-coverage": true,
33
44
  "coverage-map": "map.js"
34
45
  },
35
46
  "engines": {
36
- "node": ">=10"
47
+ "node": "^10.0.0 || ^12.0.0 || ^14.0.0 || >=16.0.0"
37
48
  },
38
49
  "dependencies": {
39
- "lru-cache": "^6.0.0"
50
+ "lru-cache": "^7.4.0"
51
+ },
52
+ "author": "GitHub Inc.",
53
+ "templateOSS": {
54
+ "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
55
+ "version": "3.2.2",
56
+ "ciVersions": [
57
+ "10.0.0",
58
+ "10.x",
59
+ "12.x",
60
+ "14.x",
61
+ "16.x"
62
+ ],
63
+ "distPaths": [
64
+ "bin/",
65
+ "classes/",
66
+ "functions/",
67
+ "internal/",
68
+ "ranges/",
69
+ "index.js",
70
+ "preload.js",
71
+ "range.bnf"
72
+ ]
40
73
  }
41
74
  }
@@ -47,8 +47,9 @@ const minVersion = (range, loose) => {
47
47
  throw new Error(`Unexpected operation: ${comparator.operator}`)
48
48
  }
49
49
  })
50
- if (setMin && (!minver || gt(minver, setMin)))
50
+ if (setMin && (!minver || gt(minver, setMin))) {
51
51
  minver = setMin
52
+ }
52
53
  }
53
54
 
54
55
  if (minver && range.test(minver)) {
@@ -1,6 +1,6 @@
1
1
  const SemVer = require('../classes/semver')
2
2
  const Comparator = require('../classes/comparator')
3
- const {ANY} = Comparator
3
+ const { ANY } = Comparator
4
4
  const Range = require('../classes/range')
5
5
  const satisfies = require('../functions/satisfies')
6
6
  const gt = require('../functions/gt')
@@ -5,38 +5,41 @@ const satisfies = require('../functions/satisfies.js')
5
5
  const compare = require('../functions/compare.js')
6
6
  module.exports = (versions, range, options) => {
7
7
  const set = []
8
- let min = null
8
+ let first = null
9
9
  let prev = null
10
10
  const v = versions.sort((a, b) => compare(a, b, options))
11
11
  for (const version of v) {
12
12
  const included = satisfies(version, range, options)
13
13
  if (included) {
14
14
  prev = version
15
- if (!min)
16
- min = version
15
+ if (!first) {
16
+ first = version
17
+ }
17
18
  } else {
18
19
  if (prev) {
19
- set.push([min, prev])
20
+ set.push([first, prev])
20
21
  }
21
22
  prev = null
22
- min = null
23
+ first = null
23
24
  }
24
25
  }
25
- if (min)
26
- set.push([min, null])
26
+ if (first) {
27
+ set.push([first, null])
28
+ }
27
29
 
28
30
  const ranges = []
29
31
  for (const [min, max] of set) {
30
- if (min === max)
32
+ if (min === max) {
31
33
  ranges.push(min)
32
- else if (!max && min === v[0])
34
+ } else if (!max && min === v[0]) {
33
35
  ranges.push('*')
34
- else if (!max)
36
+ } else if (!max) {
35
37
  ranges.push(`>=${min}`)
36
- else if (min === v[0])
38
+ } else if (min === v[0]) {
37
39
  ranges.push(`<=${max}`)
38
- else
40
+ } else {
39
41
  ranges.push(`${min} - ${max}`)
42
+ }
40
43
  }
41
44
  const simplified = ranges.join(' || ')
42
45
  const original = typeof range.raw === 'string' ? range.raw : String(range)