@florianpat/lando-core 3.23.22 → 3.23.27-2florianPat.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.
- package/CHANGELOG.md +23 -1
- package/app.js +5 -0
- package/builders/_lando.js +19 -6
- package/builders/lando-v4.js +3 -0
- package/config.yml +4 -4
- package/hooks/app-add-init-tooling.js +21 -0
- package/hooks/app-run-events.js +22 -0
- package/hooks/lando-setup-build-engine-darwin.js +3 -0
- package/hooks/lando-setup-build-engine-win32.js +2 -0
- package/hooks/lando-setup-build-engine-wsl.js +2 -0
- package/hooks/lando-setup-orchestrator.js +2 -2
- package/lib/app.js +30 -24
- package/lib/daemon.js +1 -1
- package/lib/engine.js +1 -1
- package/lib/formatters.js +1 -1
- package/lib/router.js +1 -1
- package/lib/updates.js +9 -1
- package/netlify.toml +1 -0
- package/node_modules/undici/docs/docs/api/Dispatcher.md +51 -0
- package/node_modules/undici/index.js +2 -1
- package/node_modules/undici/lib/api/api-request.js +1 -1
- package/node_modules/undici/lib/core/connect.js +5 -0
- package/node_modules/undici/lib/dispatcher/client-h2.js +20 -6
- package/node_modules/undici/lib/handler/retry-handler.js +3 -3
- package/node_modules/undici/lib/interceptor/dns.js +375 -0
- package/node_modules/undici/lib/web/cache/cache.js +1 -0
- package/node_modules/undici/lib/web/cache/cachestorage.js +2 -0
- package/node_modules/undici/lib/web/eventsource/eventsource.js +2 -0
- package/node_modules/undici/lib/web/fetch/body.js +9 -1
- package/node_modules/undici/lib/web/fetch/formdata.js +2 -0
- package/node_modules/undici/lib/web/fetch/headers.js +2 -0
- package/node_modules/undici/lib/web/fetch/index.js +1 -1
- package/node_modules/undici/lib/web/fetch/request.js +1 -0
- package/node_modules/undici/lib/web/fetch/response.js +1 -0
- package/node_modules/undici/lib/web/fetch/webidl.js +2 -0
- package/node_modules/undici/lib/web/websocket/events.js +4 -0
- package/node_modules/undici/lib/web/websocket/websocket.js +2 -0
- package/node_modules/undici/package.json +1 -1
- package/node_modules/undici/types/interceptors.d.ts +14 -0
- package/node_modules/undici/types/retry-handler.d.ts +1 -1
- package/node_modules/undici/types/webidl.d.ts +6 -0
- package/package.json +6 -6
- package/release-aliases/3-EDGE +1 -1
- package/release-aliases/3-STABLE +1 -1
- package/scripts/install-docker-desktop.sh +1 -1
- package/scripts/install-docker-engine.sh +1 -1
- package/scripts/lando-entrypoint.sh +1 -1
- package/utils/build-tooling-task.js +2 -1
- package/utils/get-compose-x.js +1 -1
- package/utils/get-config-defaults.js +5 -5
- package/utils/get-tasks.js +4 -2
- package/utils/load-compose-files.js +2 -2
- package/utils/to-lando-container.js +16 -2
- package/checksums.txt +0 -0
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
const { isIP } = require('node:net')
|
|
3
|
+
const { lookup } = require('node:dns')
|
|
4
|
+
const DecoratorHandler = require('../handler/decorator-handler')
|
|
5
|
+
const { InvalidArgumentError, InformationalError } = require('../core/errors')
|
|
6
|
+
const maxInt = Math.pow(2, 31) - 1
|
|
7
|
+
|
|
8
|
+
class DNSInstance {
|
|
9
|
+
#maxTTL = 0
|
|
10
|
+
#maxItems = 0
|
|
11
|
+
#records = new Map()
|
|
12
|
+
dualStack = true
|
|
13
|
+
affinity = null
|
|
14
|
+
lookup = null
|
|
15
|
+
pick = null
|
|
16
|
+
|
|
17
|
+
constructor (opts) {
|
|
18
|
+
this.#maxTTL = opts.maxTTL
|
|
19
|
+
this.#maxItems = opts.maxItems
|
|
20
|
+
this.dualStack = opts.dualStack
|
|
21
|
+
this.affinity = opts.affinity
|
|
22
|
+
this.lookup = opts.lookup ?? this.#defaultLookup
|
|
23
|
+
this.pick = opts.pick ?? this.#defaultPick
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
get full () {
|
|
27
|
+
return this.#records.size === this.#maxItems
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
runLookup (origin, opts, cb) {
|
|
31
|
+
const ips = this.#records.get(origin.hostname)
|
|
32
|
+
|
|
33
|
+
// If full, we just return the origin
|
|
34
|
+
if (ips == null && this.full) {
|
|
35
|
+
cb(null, origin.origin)
|
|
36
|
+
return
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const newOpts = {
|
|
40
|
+
affinity: this.affinity,
|
|
41
|
+
dualStack: this.dualStack,
|
|
42
|
+
lookup: this.lookup,
|
|
43
|
+
pick: this.pick,
|
|
44
|
+
...opts.dns,
|
|
45
|
+
maxTTL: this.#maxTTL,
|
|
46
|
+
maxItems: this.#maxItems
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// If no IPs we lookup
|
|
50
|
+
if (ips == null) {
|
|
51
|
+
this.lookup(origin, newOpts, (err, addresses) => {
|
|
52
|
+
if (err || addresses == null || addresses.length === 0) {
|
|
53
|
+
cb(err ?? new InformationalError('No DNS entries found'))
|
|
54
|
+
return
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
this.setRecords(origin, addresses)
|
|
58
|
+
const records = this.#records.get(origin.hostname)
|
|
59
|
+
|
|
60
|
+
const ip = this.pick(
|
|
61
|
+
origin,
|
|
62
|
+
records,
|
|
63
|
+
newOpts.affinity
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
let port
|
|
67
|
+
if (typeof ip.port === 'number') {
|
|
68
|
+
port = `:${ip.port}`
|
|
69
|
+
} else if (origin.port !== '') {
|
|
70
|
+
port = `:${origin.port}`
|
|
71
|
+
} else {
|
|
72
|
+
port = ''
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
cb(
|
|
76
|
+
null,
|
|
77
|
+
`${origin.protocol}//${
|
|
78
|
+
ip.family === 6 ? `[${ip.address}]` : ip.address
|
|
79
|
+
}${port}`
|
|
80
|
+
)
|
|
81
|
+
})
|
|
82
|
+
} else {
|
|
83
|
+
// If there's IPs we pick
|
|
84
|
+
const ip = this.pick(
|
|
85
|
+
origin,
|
|
86
|
+
ips,
|
|
87
|
+
newOpts.affinity
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
// If no IPs we lookup - deleting old records
|
|
91
|
+
if (ip == null) {
|
|
92
|
+
this.#records.delete(origin.hostname)
|
|
93
|
+
this.runLookup(origin, opts, cb)
|
|
94
|
+
return
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
let port
|
|
98
|
+
if (typeof ip.port === 'number') {
|
|
99
|
+
port = `:${ip.port}`
|
|
100
|
+
} else if (origin.port !== '') {
|
|
101
|
+
port = `:${origin.port}`
|
|
102
|
+
} else {
|
|
103
|
+
port = ''
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
cb(
|
|
107
|
+
null,
|
|
108
|
+
`${origin.protocol}//${
|
|
109
|
+
ip.family === 6 ? `[${ip.address}]` : ip.address
|
|
110
|
+
}${port}`
|
|
111
|
+
)
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
#defaultLookup (origin, opts, cb) {
|
|
116
|
+
lookup(
|
|
117
|
+
origin.hostname,
|
|
118
|
+
{
|
|
119
|
+
all: true,
|
|
120
|
+
family: this.dualStack === false ? this.affinity : 0,
|
|
121
|
+
order: 'ipv4first'
|
|
122
|
+
},
|
|
123
|
+
(err, addresses) => {
|
|
124
|
+
if (err) {
|
|
125
|
+
return cb(err)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const results = new Map()
|
|
129
|
+
|
|
130
|
+
for (const addr of addresses) {
|
|
131
|
+
// On linux we found duplicates, we attempt to remove them with
|
|
132
|
+
// the latest record
|
|
133
|
+
results.set(`${addr.address}:${addr.family}`, addr)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
cb(null, results.values())
|
|
137
|
+
}
|
|
138
|
+
)
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
#defaultPick (origin, hostnameRecords, affinity) {
|
|
142
|
+
let ip = null
|
|
143
|
+
const { records, offset } = hostnameRecords
|
|
144
|
+
|
|
145
|
+
let family
|
|
146
|
+
if (this.dualStack) {
|
|
147
|
+
if (affinity == null) {
|
|
148
|
+
// Balance between ip families
|
|
149
|
+
if (offset == null || offset === maxInt) {
|
|
150
|
+
hostnameRecords.offset = 0
|
|
151
|
+
affinity = 4
|
|
152
|
+
} else {
|
|
153
|
+
hostnameRecords.offset++
|
|
154
|
+
affinity = (hostnameRecords.offset & 1) === 1 ? 6 : 4
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
if (records[affinity] != null && records[affinity].ips.length > 0) {
|
|
159
|
+
family = records[affinity]
|
|
160
|
+
} else {
|
|
161
|
+
family = records[affinity === 4 ? 6 : 4]
|
|
162
|
+
}
|
|
163
|
+
} else {
|
|
164
|
+
family = records[affinity]
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// If no IPs we return null
|
|
168
|
+
if (family == null || family.ips.length === 0) {
|
|
169
|
+
return ip
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if (family.offset == null || family.offset === maxInt) {
|
|
173
|
+
family.offset = 0
|
|
174
|
+
} else {
|
|
175
|
+
family.offset++
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const position = family.offset % family.ips.length
|
|
179
|
+
ip = family.ips[position] ?? null
|
|
180
|
+
|
|
181
|
+
if (ip == null) {
|
|
182
|
+
return ip
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if (Date.now() - ip.timestamp > ip.ttl) { // record TTL is already in ms
|
|
186
|
+
// We delete expired records
|
|
187
|
+
// It is possible that they have different TTL, so we manage them individually
|
|
188
|
+
family.ips.splice(position, 1)
|
|
189
|
+
return this.pick(origin, hostnameRecords, affinity)
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return ip
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
setRecords (origin, addresses) {
|
|
196
|
+
const timestamp = Date.now()
|
|
197
|
+
const records = { records: { 4: null, 6: null } }
|
|
198
|
+
for (const record of addresses) {
|
|
199
|
+
record.timestamp = timestamp
|
|
200
|
+
if (typeof record.ttl === 'number') {
|
|
201
|
+
// The record TTL is expected to be in ms
|
|
202
|
+
record.ttl = Math.min(record.ttl, this.#maxTTL)
|
|
203
|
+
} else {
|
|
204
|
+
record.ttl = this.#maxTTL
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
const familyRecords = records.records[record.family] ?? { ips: [] }
|
|
208
|
+
|
|
209
|
+
familyRecords.ips.push(record)
|
|
210
|
+
records.records[record.family] = familyRecords
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
this.#records.set(origin.hostname, records)
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
getHandler (meta, opts) {
|
|
217
|
+
return new DNSDispatchHandler(this, meta, opts)
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
class DNSDispatchHandler extends DecoratorHandler {
|
|
222
|
+
#state = null
|
|
223
|
+
#opts = null
|
|
224
|
+
#dispatch = null
|
|
225
|
+
#handler = null
|
|
226
|
+
#origin = null
|
|
227
|
+
|
|
228
|
+
constructor (state, { origin, handler, dispatch }, opts) {
|
|
229
|
+
super(handler)
|
|
230
|
+
this.#origin = origin
|
|
231
|
+
this.#handler = handler
|
|
232
|
+
this.#opts = { ...opts }
|
|
233
|
+
this.#state = state
|
|
234
|
+
this.#dispatch = dispatch
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
onError (err) {
|
|
238
|
+
switch (err.code) {
|
|
239
|
+
case 'ETIMEDOUT':
|
|
240
|
+
case 'ECONNREFUSED': {
|
|
241
|
+
if (this.#state.dualStack) {
|
|
242
|
+
// We delete the record and retry
|
|
243
|
+
this.#state.runLookup(this.#origin, this.#opts, (err, newOrigin) => {
|
|
244
|
+
if (err) {
|
|
245
|
+
return this.#handler.onError(err)
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const dispatchOpts = {
|
|
249
|
+
...this.#opts,
|
|
250
|
+
origin: newOrigin
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
this.#dispatch(dispatchOpts, this)
|
|
254
|
+
})
|
|
255
|
+
|
|
256
|
+
// if dual-stack disabled, we error out
|
|
257
|
+
return
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
this.#handler.onError(err)
|
|
261
|
+
return
|
|
262
|
+
}
|
|
263
|
+
case 'ENOTFOUND':
|
|
264
|
+
this.#state.deleteRecord(this.#origin)
|
|
265
|
+
// eslint-disable-next-line no-fallthrough
|
|
266
|
+
default:
|
|
267
|
+
this.#handler.onError(err)
|
|
268
|
+
break
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
module.exports = interceptorOpts => {
|
|
274
|
+
if (
|
|
275
|
+
interceptorOpts?.maxTTL != null &&
|
|
276
|
+
(typeof interceptorOpts?.maxTTL !== 'number' || interceptorOpts?.maxTTL < 0)
|
|
277
|
+
) {
|
|
278
|
+
throw new InvalidArgumentError('Invalid maxTTL. Must be a positive number')
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
if (
|
|
282
|
+
interceptorOpts?.maxItems != null &&
|
|
283
|
+
(typeof interceptorOpts?.maxItems !== 'number' ||
|
|
284
|
+
interceptorOpts?.maxItems < 1)
|
|
285
|
+
) {
|
|
286
|
+
throw new InvalidArgumentError(
|
|
287
|
+
'Invalid maxItems. Must be a positive number and greater than zero'
|
|
288
|
+
)
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
if (
|
|
292
|
+
interceptorOpts?.affinity != null &&
|
|
293
|
+
interceptorOpts?.affinity !== 4 &&
|
|
294
|
+
interceptorOpts?.affinity !== 6
|
|
295
|
+
) {
|
|
296
|
+
throw new InvalidArgumentError('Invalid affinity. Must be either 4 or 6')
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
if (
|
|
300
|
+
interceptorOpts?.dualStack != null &&
|
|
301
|
+
typeof interceptorOpts?.dualStack !== 'boolean'
|
|
302
|
+
) {
|
|
303
|
+
throw new InvalidArgumentError('Invalid dualStack. Must be a boolean')
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (
|
|
307
|
+
interceptorOpts?.lookup != null &&
|
|
308
|
+
typeof interceptorOpts?.lookup !== 'function'
|
|
309
|
+
) {
|
|
310
|
+
throw new InvalidArgumentError('Invalid lookup. Must be a function')
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
if (
|
|
314
|
+
interceptorOpts?.pick != null &&
|
|
315
|
+
typeof interceptorOpts?.pick !== 'function'
|
|
316
|
+
) {
|
|
317
|
+
throw new InvalidArgumentError('Invalid pick. Must be a function')
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
const dualStack = interceptorOpts?.dualStack ?? true
|
|
321
|
+
let affinity
|
|
322
|
+
if (dualStack) {
|
|
323
|
+
affinity = interceptorOpts?.affinity ?? null
|
|
324
|
+
} else {
|
|
325
|
+
affinity = interceptorOpts?.affinity ?? 4
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
const opts = {
|
|
329
|
+
maxTTL: interceptorOpts?.maxTTL ?? 10e3, // Expressed in ms
|
|
330
|
+
lookup: interceptorOpts?.lookup ?? null,
|
|
331
|
+
pick: interceptorOpts?.pick ?? null,
|
|
332
|
+
dualStack,
|
|
333
|
+
affinity,
|
|
334
|
+
maxItems: interceptorOpts?.maxItems ?? Infinity
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
const instance = new DNSInstance(opts)
|
|
338
|
+
|
|
339
|
+
return dispatch => {
|
|
340
|
+
return function dnsInterceptor (origDispatchOpts, handler) {
|
|
341
|
+
const origin =
|
|
342
|
+
origDispatchOpts.origin.constructor === URL
|
|
343
|
+
? origDispatchOpts.origin
|
|
344
|
+
: new URL(origDispatchOpts.origin)
|
|
345
|
+
|
|
346
|
+
if (isIP(origin.hostname) !== 0) {
|
|
347
|
+
return dispatch(origDispatchOpts, handler)
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
instance.runLookup(origin, origDispatchOpts, (err, newOrigin) => {
|
|
351
|
+
if (err) {
|
|
352
|
+
return handler.onError(err)
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
let dispatchOpts = null
|
|
356
|
+
dispatchOpts = {
|
|
357
|
+
...origDispatchOpts,
|
|
358
|
+
servername: origin.hostname, // For SNI on TLS
|
|
359
|
+
origin: newOrigin,
|
|
360
|
+
headers: {
|
|
361
|
+
host: origin.hostname,
|
|
362
|
+
...origDispatchOpts.headers
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
dispatch(
|
|
367
|
+
dispatchOpts,
|
|
368
|
+
instance.getHandler({ origin, dispatch, handler }, origDispatchOpts)
|
|
369
|
+
)
|
|
370
|
+
})
|
|
371
|
+
|
|
372
|
+
return true
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
@@ -20,6 +20,14 @@ const { isErrored, isDisturbed } = require('node:stream')
|
|
|
20
20
|
const { isArrayBuffer } = require('node:util/types')
|
|
21
21
|
const { serializeAMimeType } = require('./data-url')
|
|
22
22
|
const { multipartFormDataParser } = require('./formdata-parser')
|
|
23
|
+
let random
|
|
24
|
+
|
|
25
|
+
try {
|
|
26
|
+
const crypto = require('node:crypto')
|
|
27
|
+
random = (max) => crypto.randomInt(0, max)
|
|
28
|
+
} catch {
|
|
29
|
+
random = (max) => Math.floor(Math.random(max))
|
|
30
|
+
}
|
|
23
31
|
|
|
24
32
|
const textEncoder = new TextEncoder()
|
|
25
33
|
function noop () {}
|
|
@@ -113,7 +121,7 @@ function extractBody (object, keepalive = false) {
|
|
|
113
121
|
// Set source to a copy of the bytes held by object.
|
|
114
122
|
source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength))
|
|
115
123
|
} else if (util.isFormDataLike(object)) {
|
|
116
|
-
const boundary = `----formdata-undici-0${`${
|
|
124
|
+
const boundary = `----formdata-undici-0${`${random(1e11)}`.padStart(11, '0')}`
|
|
117
125
|
const prefix = `--${boundary}\r\nContent-Disposition: form-data`
|
|
118
126
|
|
|
119
127
|
/*! formdata-polyfill. MIT License. Jimmy Wärting <https://jimmy.warting.se/opensource> */
|
|
@@ -14,6 +14,8 @@ const File = globalThis.File ?? NativeFile
|
|
|
14
14
|
// https://xhr.spec.whatwg.org/#formdata
|
|
15
15
|
class FormData {
|
|
16
16
|
constructor (form) {
|
|
17
|
+
webidl.util.markAsUncloneable(this)
|
|
18
|
+
|
|
17
19
|
if (form !== undefined) {
|
|
18
20
|
throw webidl.errors.conversionFailed({
|
|
19
21
|
prefix: 'FormData constructor',
|
|
@@ -2137,7 +2137,7 @@ async function httpNetworkFetch (
|
|
|
2137
2137
|
|
|
2138
2138
|
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding
|
|
2139
2139
|
if (codings.length !== 0 && request.method !== 'HEAD' && request.method !== 'CONNECT' && !nullBodyStatus.includes(status) && !willFollow) {
|
|
2140
|
-
for (let i =
|
|
2140
|
+
for (let i = codings.length - 1; i >= 0; --i) {
|
|
2141
2141
|
const coding = codings[i]
|
|
2142
2142
|
// https://www.rfc-editor.org/rfc/rfc9112.html#section-7.2
|
|
2143
2143
|
if (coding === 'x-gzip' || coding === 'gzip') {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
const { types, inspect } = require('node:util')
|
|
4
|
+
const { markAsUncloneable } = require('node:worker_threads')
|
|
4
5
|
const { toUSVString } = require('../../core/util')
|
|
5
6
|
|
|
6
7
|
/** @type {import('../../../types/webidl').Webidl} */
|
|
@@ -86,6 +87,7 @@ webidl.util.Type = function (V) {
|
|
|
86
87
|
}
|
|
87
88
|
}
|
|
88
89
|
|
|
90
|
+
webidl.util.markAsUncloneable = markAsUncloneable || (() => {})
|
|
89
91
|
// https://webidl.spec.whatwg.org/#abstract-opdef-converttoint
|
|
90
92
|
webidl.util.ConvertToInt = function (V, bitLength, signedness, opts) {
|
|
91
93
|
let upperBound
|
|
@@ -14,6 +14,7 @@ class MessageEvent extends Event {
|
|
|
14
14
|
constructor (type, eventInitDict = {}) {
|
|
15
15
|
if (type === kConstruct) {
|
|
16
16
|
super(arguments[1], arguments[2])
|
|
17
|
+
webidl.util.markAsUncloneable(this)
|
|
17
18
|
return
|
|
18
19
|
}
|
|
19
20
|
|
|
@@ -26,6 +27,7 @@ class MessageEvent extends Event {
|
|
|
26
27
|
super(type, eventInitDict)
|
|
27
28
|
|
|
28
29
|
this.#eventInit = eventInitDict
|
|
30
|
+
webidl.util.markAsUncloneable(this)
|
|
29
31
|
}
|
|
30
32
|
|
|
31
33
|
get data () {
|
|
@@ -112,6 +114,7 @@ class CloseEvent extends Event {
|
|
|
112
114
|
super(type, eventInitDict)
|
|
113
115
|
|
|
114
116
|
this.#eventInit = eventInitDict
|
|
117
|
+
webidl.util.markAsUncloneable(this)
|
|
115
118
|
}
|
|
116
119
|
|
|
117
120
|
get wasClean () {
|
|
@@ -142,6 +145,7 @@ class ErrorEvent extends Event {
|
|
|
142
145
|
webidl.argumentLengthCheck(arguments, 1, prefix)
|
|
143
146
|
|
|
144
147
|
super(type, eventInitDict)
|
|
148
|
+
webidl.util.markAsUncloneable(this)
|
|
145
149
|
|
|
146
150
|
type = webidl.converters.DOMString(type, prefix, 'type')
|
|
147
151
|
eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {})
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { LookupOptions } from 'node:dns'
|
|
2
|
+
|
|
1
3
|
import Dispatcher from "./dispatcher";
|
|
2
4
|
import RetryHandler from "./retry-handler";
|
|
3
5
|
|
|
@@ -9,6 +11,18 @@ declare namespace Interceptors {
|
|
|
9
11
|
export type RedirectInterceptorOpts = { maxRedirections?: number }
|
|
10
12
|
export type ResponseErrorInterceptorOpts = { throwOnError: boolean }
|
|
11
13
|
|
|
14
|
+
// DNS interceptor
|
|
15
|
+
export type DNSInterceptorRecord = { address: string, ttl: number, family: 4 | 6 }
|
|
16
|
+
export type DNSInterceptorOriginRecords = { 4: { ips: DNSInterceptorRecord[] } | null, 6: { ips: DNSInterceptorRecord[] } | null }
|
|
17
|
+
export type DNSInterceptorOpts = {
|
|
18
|
+
maxTTL?: number
|
|
19
|
+
maxItems?: number
|
|
20
|
+
lookup?: (hostname: string, options: LookupOptions, callback: (err: NodeJS.ErrnoException | null, addresses: DNSInterceptorRecord[]) => void) => void
|
|
21
|
+
pick?: (origin: URL, records: DNSInterceptorOriginRecords, affinity: 4 | 6) => DNSInterceptorRecord
|
|
22
|
+
dualStack?: boolean
|
|
23
|
+
affinity?: 4 | 6
|
|
24
|
+
}
|
|
25
|
+
|
|
12
26
|
export function createRedirectInterceptor(opts: RedirectInterceptorOpts): Dispatcher.DispatcherComposeInterceptor
|
|
13
27
|
export function dump(opts?: DumpInterceptorOpts): Dispatcher.DispatcherComposeInterceptor
|
|
14
28
|
export function retry(opts?: RetryInterceptorOpts): Dispatcher.DispatcherComposeInterceptor
|
|
@@ -67,6 +67,12 @@ interface WebidlUtil {
|
|
|
67
67
|
* Stringifies {@param V}
|
|
68
68
|
*/
|
|
69
69
|
Stringify (V: any): string
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Mark a value as uncloneable for Node.js.
|
|
73
|
+
* This is only effective in some newer Node.js versions.
|
|
74
|
+
*/
|
|
75
|
+
markAsUncloneable (V: any): void
|
|
70
76
|
}
|
|
71
77
|
|
|
72
78
|
interface WebidlConverters {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@florianpat/lando-core",
|
|
3
3
|
"description": "The libraries that power all of Lando. Fork by flo for compose integration",
|
|
4
|
-
"version": "3.23.
|
|
4
|
+
"version": "3.23.27-2florianPat.0",
|
|
5
5
|
"author": "Florian Patruck @florianPat",
|
|
6
6
|
"license": "GPL-3.0",
|
|
7
7
|
"repository": "florianPat/lando-core",
|
|
@@ -168,7 +168,7 @@
|
|
|
168
168
|
"devDependencies": {
|
|
169
169
|
"@babel/eslint-parser": "^7.16.0",
|
|
170
170
|
"@lando/leia": "^1.0.0-beta.4",
|
|
171
|
-
"@lando/vitepress-theme-default-plus": "
|
|
171
|
+
"@lando/vitepress-theme-default-plus": "^1.1.1",
|
|
172
172
|
"@yao-pkg/pkg": "^5.16.1",
|
|
173
173
|
"chai": "^4.3.4",
|
|
174
174
|
"chai-as-promised": "^7.1.1",
|
|
@@ -247,9 +247,9 @@
|
|
|
247
247
|
"yargs-parser"
|
|
248
248
|
],
|
|
249
249
|
"dist": {
|
|
250
|
-
"integrity": "sha512-
|
|
251
|
-
"shasum": "
|
|
252
|
-
"filename": "florianpat-lando-core-3.23.
|
|
253
|
-
"unpackedSize":
|
|
250
|
+
"integrity": "sha512-nJ+omUdEgvWWSzY820agmarvTKCfYXYkslyaSNxCZOtyctgzRioHpx4qXRvYnoaHS6q6zjCwSShslZAGwPyyyw==",
|
|
251
|
+
"shasum": "864b2749e3dd4bf4691b29fd9aeb45046c61f402",
|
|
252
|
+
"filename": "florianpat-lando-core-3.23.27-2florianPat.0.tgz",
|
|
253
|
+
"unpackedSize": 60967423
|
|
254
254
|
}
|
|
255
255
|
}
|
package/release-aliases/3-EDGE
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
v3.24.0-beta.
|
|
1
|
+
v3.24.0-beta.12
|
package/release-aliases/3-STABLE
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
v3.23.
|
|
1
|
+
v3.23.26
|
|
@@ -59,7 +59,7 @@ debug "INSTALLER: $INSTALLER"
|
|
|
59
59
|
debug "USER: $USER"
|
|
60
60
|
|
|
61
61
|
# add accept license if set
|
|
62
|
-
if [ "${
|
|
62
|
+
if [ "${ACCEPT_LICENSE}" == 1 ]; then OPTS="$OPTS --accept-license"; fi
|
|
63
63
|
|
|
64
64
|
# run
|
|
65
65
|
hdiutil attach "$INSTALLER"
|
|
@@ -62,7 +62,7 @@ if [ -d "/scripts" ] && [ -z ${LANDO_NO_SCRIPTS+x} ]; then
|
|
|
62
62
|
|
|
63
63
|
# Keep this for backwards compat and fallback opts
|
|
64
64
|
chmod +x /scripts/* || true
|
|
65
|
-
find /scripts/ -type f -name "*.sh" -exec {} \;
|
|
65
|
+
find /scripts/ -type f \( -name "*.sh" -o ! -name "*.*" \) -exec {} \;
|
|
66
66
|
fi;
|
|
67
67
|
|
|
68
68
|
# Run any bash scripts that we've loaded into the mix for autorun unless we've
|
|
@@ -23,7 +23,7 @@ module.exports = (config, injected) => {
|
|
|
23
23
|
const run = answers => {
|
|
24
24
|
let initToolingRunner = null;
|
|
25
25
|
|
|
26
|
-
return injected.Promise.try(() => (_.isEmpty(app.compose)) ? app.init() : true)
|
|
26
|
+
return injected.Promise.try(() => (_.isEmpty(app.compose) && '_init' !== service) ? app.init() : true)
|
|
27
27
|
// Kick off the pre event wrappers
|
|
28
28
|
.then(() => app.events.emit(`pre-${eventName}`, config, answers))
|
|
29
29
|
// Get an interable of our commandz
|
|
@@ -74,5 +74,6 @@ module.exports = (config, injected) => {
|
|
|
74
74
|
describe,
|
|
75
75
|
run,
|
|
76
76
|
options,
|
|
77
|
+
service,
|
|
77
78
|
};
|
|
78
79
|
};
|