@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.
Files changed (54) hide show
  1. package/CHANGELOG.md +23 -1
  2. package/app.js +5 -0
  3. package/builders/_lando.js +19 -6
  4. package/builders/lando-v4.js +3 -0
  5. package/config.yml +4 -4
  6. package/hooks/app-add-init-tooling.js +21 -0
  7. package/hooks/app-run-events.js +22 -0
  8. package/hooks/lando-setup-build-engine-darwin.js +3 -0
  9. package/hooks/lando-setup-build-engine-win32.js +2 -0
  10. package/hooks/lando-setup-build-engine-wsl.js +2 -0
  11. package/hooks/lando-setup-orchestrator.js +2 -2
  12. package/lib/app.js +30 -24
  13. package/lib/daemon.js +1 -1
  14. package/lib/engine.js +1 -1
  15. package/lib/formatters.js +1 -1
  16. package/lib/router.js +1 -1
  17. package/lib/updates.js +9 -1
  18. package/netlify.toml +1 -0
  19. package/node_modules/undici/docs/docs/api/Dispatcher.md +51 -0
  20. package/node_modules/undici/index.js +2 -1
  21. package/node_modules/undici/lib/api/api-request.js +1 -1
  22. package/node_modules/undici/lib/core/connect.js +5 -0
  23. package/node_modules/undici/lib/dispatcher/client-h2.js +20 -6
  24. package/node_modules/undici/lib/handler/retry-handler.js +3 -3
  25. package/node_modules/undici/lib/interceptor/dns.js +375 -0
  26. package/node_modules/undici/lib/web/cache/cache.js +1 -0
  27. package/node_modules/undici/lib/web/cache/cachestorage.js +2 -0
  28. package/node_modules/undici/lib/web/eventsource/eventsource.js +2 -0
  29. package/node_modules/undici/lib/web/fetch/body.js +9 -1
  30. package/node_modules/undici/lib/web/fetch/formdata.js +2 -0
  31. package/node_modules/undici/lib/web/fetch/headers.js +2 -0
  32. package/node_modules/undici/lib/web/fetch/index.js +1 -1
  33. package/node_modules/undici/lib/web/fetch/request.js +1 -0
  34. package/node_modules/undici/lib/web/fetch/response.js +1 -0
  35. package/node_modules/undici/lib/web/fetch/webidl.js +2 -0
  36. package/node_modules/undici/lib/web/websocket/events.js +4 -0
  37. package/node_modules/undici/lib/web/websocket/websocket.js +2 -0
  38. package/node_modules/undici/package.json +1 -1
  39. package/node_modules/undici/types/interceptors.d.ts +14 -0
  40. package/node_modules/undici/types/retry-handler.d.ts +1 -1
  41. package/node_modules/undici/types/webidl.d.ts +6 -0
  42. package/package.json +6 -6
  43. package/release-aliases/3-EDGE +1 -1
  44. package/release-aliases/3-STABLE +1 -1
  45. package/scripts/install-docker-desktop.sh +1 -1
  46. package/scripts/install-docker-engine.sh +1 -1
  47. package/scripts/lando-entrypoint.sh +1 -1
  48. package/utils/build-tooling-task.js +2 -1
  49. package/utils/get-compose-x.js +1 -1
  50. package/utils/get-config-defaults.js +5 -5
  51. package/utils/get-tasks.js +4 -2
  52. package/utils/load-compose-files.js +2 -2
  53. package/utils/to-lando-container.js +16 -2
  54. 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
+ }
@@ -37,6 +37,7 @@ class Cache {
37
37
  webidl.illegalConstructor()
38
38
  }
39
39
 
40
+ webidl.util.markAsUncloneable(this)
40
41
  this.#relevantRequestResponseList = arguments[1]
41
42
  }
42
43
 
@@ -16,6 +16,8 @@ class CacheStorage {
16
16
  if (arguments[0] !== kConstruct) {
17
17
  webidl.illegalConstructor()
18
18
  }
19
+
20
+ webidl.util.markAsUncloneable(this)
19
21
  }
20
22
 
21
23
  async match (request, options = {}) {
@@ -105,6 +105,8 @@ class EventSource extends EventTarget {
105
105
  // 1. Let ev be a new EventSource object.
106
106
  super()
107
107
 
108
+ webidl.util.markAsUncloneable(this)
109
+
108
110
  const prefix = 'EventSource constructor'
109
111
  webidl.argumentLengthCheck(arguments, 1, prefix)
110
112
 
@@ -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${`${Math.floor(Math.random() * 1e11)}`.padStart(11, '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',
@@ -359,6 +359,8 @@ class Headers {
359
359
  #headersList
360
360
 
361
361
  constructor (init = undefined) {
362
+ webidl.util.markAsUncloneable(this)
363
+
362
364
  if (init === kConstruct) {
363
365
  return
364
366
  }
@@ -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 = 0; i < codings.length; ++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') {
@@ -82,6 +82,7 @@ let patchMethodWarning = false
82
82
  class Request {
83
83
  // https://fetch.spec.whatwg.org/#dom-request
84
84
  constructor (input, init = {}) {
85
+ webidl.util.markAsUncloneable(this)
85
86
  if (input === kConstruct) {
86
87
  return
87
88
  }
@@ -110,6 +110,7 @@ class Response {
110
110
 
111
111
  // https://fetch.spec.whatwg.org/#dom-response
112
112
  constructor (body = null, init = {}) {
113
+ webidl.util.markAsUncloneable(this)
113
114
  if (body === kConstruct) {
114
115
  return
115
116
  }
@@ -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 ?? {})
@@ -51,6 +51,8 @@ class WebSocket extends EventTarget {
51
51
  constructor (url, protocols = []) {
52
52
  super()
53
53
 
54
+ webidl.util.markAsUncloneable(this)
55
+
54
56
  const prefix = 'WebSocket constructor'
55
57
  webidl.argumentLengthCheck(arguments, 1, prefix)
56
58
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "undici",
3
- "version": "6.20.1",
3
+ "version": "6.21.1",
4
4
  "description": "An HTTP/1.1 client, written from scratch for Node.js",
5
5
  "homepage": "https://undici.nodejs.org",
6
6
  "bugs": {
@@ -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
@@ -32,7 +32,7 @@ declare namespace RetryHandler {
32
32
  };
33
33
  },
34
34
  callback: OnRetryCallback
35
- ) => number | null;
35
+ ) => void
36
36
 
37
37
  export interface RetryOptions {
38
38
  /**
@@ -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.22",
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": "github:lando/vitepress-theme-default-plus#main",
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-7Ak4ffLOApUfus6mu06+SGYIHKtpDFx45ACv5gQhuNtY8JgE/xyPL5EwCabkQXkZhwHKkN8nQXRUdFk9d7Tq/w==",
251
- "shasum": "1f59804c71e8e5ddad072d8fa102ad50d6f3d956",
252
- "filename": "florianpat-lando-core-3.23.22.tgz",
253
- "unpackedSize": 60948228
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
  }
@@ -1 +1 @@
1
- v3.24.0-beta.8
1
+ v3.24.0-beta.12
@@ -1 +1 @@
1
- v3.23.22
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 [ "${DEBUG}" == 1 ]; then OPTS="$OPTS --accept-license"; fi
62
+ if [ "${ACCEPT_LICENSE}" == 1 ]; then OPTS="$OPTS --accept-license"; fi
63
63
 
64
64
  # run
65
65
  hdiutil attach "$INSTALLER"
@@ -3,7 +3,7 @@ set -eo pipefail
3
3
 
4
4
  DEBUG=0
5
5
  INSTALLER="get-docker.sh"
6
- VERSION="27.3.1"
6
+ VERSION="27.5.0"
7
7
  OPTS=
8
8
 
9
9
  debug() {
@@ -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
  };