netlify-cli 15.3.2 → 15.4.1

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.
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "netlify-cli",
3
- "version": "15.3.2",
3
+ "version": "15.4.1",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "netlify-cli",
9
- "version": "15.3.2",
9
+ "version": "15.4.1",
10
10
  "hasInstallScript": true,
11
11
  "license": "MIT",
12
12
  "dependencies": {
@@ -15,7 +15,7 @@
15
15
  "@netlify/build": "29.12.1",
16
16
  "@netlify/build-info": "7.0.5",
17
17
  "@netlify/config": "20.4.4",
18
- "@netlify/edge-bundler": "8.16.1",
18
+ "@netlify/edge-bundler": "8.16.2",
19
19
  "@netlify/framework-info": "9.8.9",
20
20
  "@netlify/local-functions-proxy": "1.1.1",
21
21
  "@netlify/zip-it-and-ship-it": "9.8.0",
@@ -806,6 +806,45 @@
806
806
  "node": ">= 14"
807
807
  }
808
808
  },
809
+ "node_modules/@netlify/build/node_modules/@netlify/edge-bundler": {
810
+ "version": "8.16.1",
811
+ "resolved": "https://registry.npmjs.org/@netlify/edge-bundler/-/edge-bundler-8.16.1.tgz",
812
+ "integrity": "sha512-nLwQchCruBwjr2bgptxisoa+i182PwNc9eu1NTqwVZCIwDJhdBPJQVH251VunT0NJEchnpqJ4nZdTce3y1G6zQ==",
813
+ "dependencies": {
814
+ "@import-maps/resolve": "^1.0.1",
815
+ "ajv": "^8.11.2",
816
+ "ajv-errors": "^3.0.0",
817
+ "better-ajv-errors": "^1.2.0",
818
+ "common-path-prefix": "^3.0.0",
819
+ "env-paths": "^3.0.0",
820
+ "execa": "^6.0.0",
821
+ "find-up": "^6.3.0",
822
+ "get-port": "^6.1.2",
823
+ "glob-to-regexp": "^0.4.1",
824
+ "is-path-inside": "^4.0.0",
825
+ "jsonc-parser": "^3.2.0",
826
+ "node-fetch": "^3.1.1",
827
+ "node-stream-zip": "^1.15.0",
828
+ "p-retry": "^5.1.1",
829
+ "p-wait-for": "^4.1.0",
830
+ "path-key": "^4.0.0",
831
+ "regexp-tree": "^0.1.24",
832
+ "semver": "^7.3.8",
833
+ "tmp-promise": "^3.0.3",
834
+ "uuid": "^9.0.0"
835
+ },
836
+ "engines": {
837
+ "node": "^14.16.0 || >=16.0.0"
838
+ }
839
+ },
840
+ "node_modules/@netlify/build/node_modules/@netlify/edge-bundler/node_modules/uuid": {
841
+ "version": "9.0.0",
842
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
843
+ "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==",
844
+ "bin": {
845
+ "uuid": "dist/bin/uuid"
846
+ }
847
+ },
809
848
  "node_modules/@netlify/build/node_modules/@sindresorhus/is": {
810
849
  "version": "5.4.1",
811
850
  "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.4.1.tgz",
@@ -828,6 +867,29 @@
828
867
  "node": ">=14.16"
829
868
  }
830
869
  },
870
+ "node_modules/@netlify/build/node_modules/ajv": {
871
+ "version": "8.12.0",
872
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
873
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
874
+ "dependencies": {
875
+ "fast-deep-equal": "^3.1.1",
876
+ "json-schema-traverse": "^1.0.0",
877
+ "require-from-string": "^2.0.2",
878
+ "uri-js": "^4.2.2"
879
+ },
880
+ "funding": {
881
+ "type": "github",
882
+ "url": "https://github.com/sponsors/epoberezkin"
883
+ }
884
+ },
885
+ "node_modules/@netlify/build/node_modules/ajv-errors": {
886
+ "version": "3.0.0",
887
+ "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz",
888
+ "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==",
889
+ "peerDependencies": {
890
+ "ajv": "^8.0.1"
891
+ }
892
+ },
831
893
  "node_modules/@netlify/build/node_modules/cacheable-lookup": {
832
894
  "version": "7.0.0",
833
895
  "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz",
@@ -917,6 +979,17 @@
917
979
  "url": "https://github.com/sponsors/sindresorhus"
918
980
  }
919
981
  },
982
+ "node_modules/@netlify/build/node_modules/get-port": {
983
+ "version": "6.1.2",
984
+ "resolved": "https://registry.npmjs.org/get-port/-/get-port-6.1.2.tgz",
985
+ "integrity": "sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==",
986
+ "engines": {
987
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
988
+ },
989
+ "funding": {
990
+ "url": "https://github.com/sponsors/sindresorhus"
991
+ }
992
+ },
920
993
  "node_modules/@netlify/build/node_modules/got": {
921
994
  "version": "12.6.1",
922
995
  "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz",
@@ -972,6 +1045,22 @@
972
1045
  "url": "https://github.com/sponsors/sindresorhus"
973
1046
  }
974
1047
  },
1048
+ "node_modules/@netlify/build/node_modules/is-path-inside": {
1049
+ "version": "4.0.0",
1050
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz",
1051
+ "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==",
1052
+ "engines": {
1053
+ "node": ">=12"
1054
+ },
1055
+ "funding": {
1056
+ "url": "https://github.com/sponsors/sindresorhus"
1057
+ }
1058
+ },
1059
+ "node_modules/@netlify/build/node_modules/json-schema-traverse": {
1060
+ "version": "1.0.0",
1061
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
1062
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
1063
+ },
975
1064
  "node_modules/@netlify/build/node_modules/lowercase-keys": {
976
1065
  "version": "3.0.0",
977
1066
  "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz",
@@ -1005,6 +1094,23 @@
1005
1094
  "url": "https://github.com/sponsors/sindresorhus"
1006
1095
  }
1007
1096
  },
1097
+ "node_modules/@netlify/build/node_modules/node-fetch": {
1098
+ "version": "3.3.1",
1099
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz",
1100
+ "integrity": "sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==",
1101
+ "dependencies": {
1102
+ "data-uri-to-buffer": "^4.0.0",
1103
+ "fetch-blob": "^3.1.4",
1104
+ "formdata-polyfill": "^4.0.10"
1105
+ },
1106
+ "engines": {
1107
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
1108
+ },
1109
+ "funding": {
1110
+ "type": "opencollective",
1111
+ "url": "https://opencollective.com/node-fetch"
1112
+ }
1113
+ },
1008
1114
  "node_modules/@netlify/build/node_modules/normalize-url": {
1009
1115
  "version": "8.0.0",
1010
1116
  "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz",
@@ -1080,6 +1186,31 @@
1080
1186
  "url": "https://github.com/sponsors/sindresorhus"
1081
1187
  }
1082
1188
  },
1189
+ "node_modules/@netlify/build/node_modules/p-timeout": {
1190
+ "version": "5.1.0",
1191
+ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz",
1192
+ "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==",
1193
+ "engines": {
1194
+ "node": ">=12"
1195
+ },
1196
+ "funding": {
1197
+ "url": "https://github.com/sponsors/sindresorhus"
1198
+ }
1199
+ },
1200
+ "node_modules/@netlify/build/node_modules/p-wait-for": {
1201
+ "version": "4.1.0",
1202
+ "resolved": "https://registry.npmjs.org/p-wait-for/-/p-wait-for-4.1.0.tgz",
1203
+ "integrity": "sha512-i8nE5q++9h8oaQHWltS1Tnnv4IoMDOlqN7C0KFG2OdbK0iFJIt6CROZ8wfBM+K4Pxqfnq4C4lkkpXqTEpB5DZw==",
1204
+ "dependencies": {
1205
+ "p-timeout": "^5.0.0"
1206
+ },
1207
+ "engines": {
1208
+ "node": ">=12"
1209
+ },
1210
+ "funding": {
1211
+ "url": "https://github.com/sponsors/sindresorhus"
1212
+ }
1213
+ },
1083
1214
  "node_modules/@netlify/build/node_modules/parse-ms": {
1084
1215
  "version": "3.0.0",
1085
1216
  "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-3.0.0.tgz",
@@ -1468,9 +1599,9 @@
1468
1599
  }
1469
1600
  },
1470
1601
  "node_modules/@netlify/edge-bundler": {
1471
- "version": "8.16.1",
1472
- "resolved": "https://registry.npmjs.org/@netlify/edge-bundler/-/edge-bundler-8.16.1.tgz",
1473
- "integrity": "sha512-nLwQchCruBwjr2bgptxisoa+i182PwNc9eu1NTqwVZCIwDJhdBPJQVH251VunT0NJEchnpqJ4nZdTce3y1G6zQ==",
1602
+ "version": "8.16.2",
1603
+ "resolved": "https://registry.npmjs.org/@netlify/edge-bundler/-/edge-bundler-8.16.2.tgz",
1604
+ "integrity": "sha512-/deN9mBWXqm5s7SCYsdQCy95VgPeg16tw8Lm6buUoOxFThX9WLOf3+5YOiwjxTvzqpbMvO4ALmXn7pdXvuWCtQ==",
1474
1605
  "dependencies": {
1475
1606
  "@import-maps/resolve": "^1.0.1",
1476
1607
  "ajv": "^8.11.2",
@@ -5631,9 +5762,9 @@
5631
5762
  }
5632
5763
  },
5633
5764
  "node_modules/detective-typescript/node_modules/@typescript-eslint/types": {
5634
- "version": "5.59.8",
5635
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz",
5636
- "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==",
5765
+ "version": "5.59.9",
5766
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz",
5767
+ "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==",
5637
5768
  "engines": {
5638
5769
  "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
5639
5770
  },
@@ -5643,12 +5774,12 @@
5643
5774
  }
5644
5775
  },
5645
5776
  "node_modules/detective-typescript/node_modules/@typescript-eslint/typescript-estree": {
5646
- "version": "5.59.8",
5647
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz",
5648
- "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==",
5777
+ "version": "5.59.9",
5778
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz",
5779
+ "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==",
5649
5780
  "dependencies": {
5650
- "@typescript-eslint/types": "5.59.8",
5651
- "@typescript-eslint/visitor-keys": "5.59.8",
5781
+ "@typescript-eslint/types": "5.59.9",
5782
+ "@typescript-eslint/visitor-keys": "5.59.9",
5652
5783
  "debug": "^4.3.4",
5653
5784
  "globby": "^11.1.0",
5654
5785
  "is-glob": "^4.0.3",
@@ -5669,11 +5800,11 @@
5669
5800
  }
5670
5801
  },
5671
5802
  "node_modules/detective-typescript/node_modules/@typescript-eslint/visitor-keys": {
5672
- "version": "5.59.8",
5673
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz",
5674
- "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==",
5803
+ "version": "5.59.9",
5804
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz",
5805
+ "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==",
5675
5806
  "dependencies": {
5676
- "@typescript-eslint/types": "5.59.8",
5807
+ "@typescript-eslint/types": "5.59.9",
5677
5808
  "eslint-visitor-keys": "^3.3.0"
5678
5809
  },
5679
5810
  "engines": {
@@ -14245,6 +14376,41 @@
14245
14376
  "yargs": "^17.6.0"
14246
14377
  },
14247
14378
  "dependencies": {
14379
+ "@netlify/edge-bundler": {
14380
+ "version": "8.16.1",
14381
+ "resolved": "https://registry.npmjs.org/@netlify/edge-bundler/-/edge-bundler-8.16.1.tgz",
14382
+ "integrity": "sha512-nLwQchCruBwjr2bgptxisoa+i182PwNc9eu1NTqwVZCIwDJhdBPJQVH251VunT0NJEchnpqJ4nZdTce3y1G6zQ==",
14383
+ "requires": {
14384
+ "@import-maps/resolve": "^1.0.1",
14385
+ "ajv": "^8.11.2",
14386
+ "ajv-errors": "^3.0.0",
14387
+ "better-ajv-errors": "^1.2.0",
14388
+ "common-path-prefix": "^3.0.0",
14389
+ "env-paths": "^3.0.0",
14390
+ "execa": "^6.0.0",
14391
+ "find-up": "^6.3.0",
14392
+ "get-port": "^6.1.2",
14393
+ "glob-to-regexp": "^0.4.1",
14394
+ "is-path-inside": "^4.0.0",
14395
+ "jsonc-parser": "^3.2.0",
14396
+ "node-fetch": "^3.1.1",
14397
+ "node-stream-zip": "^1.15.0",
14398
+ "p-retry": "^5.1.1",
14399
+ "p-wait-for": "^4.1.0",
14400
+ "path-key": "^4.0.0",
14401
+ "regexp-tree": "^0.1.24",
14402
+ "semver": "^7.3.8",
14403
+ "tmp-promise": "^3.0.3",
14404
+ "uuid": "^9.0.0"
14405
+ },
14406
+ "dependencies": {
14407
+ "uuid": {
14408
+ "version": "9.0.0",
14409
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
14410
+ "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg=="
14411
+ }
14412
+ }
14413
+ },
14248
14414
  "@sindresorhus/is": {
14249
14415
  "version": "5.4.1",
14250
14416
  "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.4.1.tgz",
@@ -14258,6 +14424,23 @@
14258
14424
  "defer-to-connect": "^2.0.1"
14259
14425
  }
14260
14426
  },
14427
+ "ajv": {
14428
+ "version": "8.12.0",
14429
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
14430
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
14431
+ "requires": {
14432
+ "fast-deep-equal": "^3.1.1",
14433
+ "json-schema-traverse": "^1.0.0",
14434
+ "require-from-string": "^2.0.2",
14435
+ "uri-js": "^4.2.2"
14436
+ }
14437
+ },
14438
+ "ajv-errors": {
14439
+ "version": "3.0.0",
14440
+ "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz",
14441
+ "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==",
14442
+ "requires": {}
14443
+ },
14261
14444
  "cacheable-lookup": {
14262
14445
  "version": "7.0.0",
14263
14446
  "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz",
@@ -14317,6 +14500,11 @@
14317
14500
  "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-3.0.0.tgz",
14318
14501
  "integrity": "sha512-oQZM+QmVni8MsYzcq9lgTHD/qeLqaG8XaOPOW7dzuSafVxSUlH1+1ZDefj2OD9f2XsmG5lFl2Euc9NI4jgwFWg=="
14319
14502
  },
14503
+ "get-port": {
14504
+ "version": "6.1.2",
14505
+ "resolved": "https://registry.npmjs.org/get-port/-/get-port-6.1.2.tgz",
14506
+ "integrity": "sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw=="
14507
+ },
14320
14508
  "got": {
14321
14509
  "version": "12.6.1",
14322
14510
  "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz",
@@ -14354,6 +14542,16 @@
14354
14542
  "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz",
14355
14543
  "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg=="
14356
14544
  },
14545
+ "is-path-inside": {
14546
+ "version": "4.0.0",
14547
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz",
14548
+ "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA=="
14549
+ },
14550
+ "json-schema-traverse": {
14551
+ "version": "1.0.0",
14552
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
14553
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
14554
+ },
14357
14555
  "lowercase-keys": {
14358
14556
  "version": "3.0.0",
14359
14557
  "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz",
@@ -14369,6 +14567,16 @@
14369
14567
  "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz",
14370
14568
  "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg=="
14371
14569
  },
14570
+ "node-fetch": {
14571
+ "version": "3.3.1",
14572
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz",
14573
+ "integrity": "sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==",
14574
+ "requires": {
14575
+ "data-uri-to-buffer": "^4.0.0",
14576
+ "fetch-blob": "^3.1.4",
14577
+ "formdata-polyfill": "^4.0.10"
14578
+ }
14579
+ },
14372
14580
  "normalize-url": {
14373
14581
  "version": "8.0.0",
14374
14582
  "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz",
@@ -14411,6 +14619,19 @@
14411
14619
  "p-limit": "^4.0.0"
14412
14620
  }
14413
14621
  },
14622
+ "p-timeout": {
14623
+ "version": "5.1.0",
14624
+ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz",
14625
+ "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew=="
14626
+ },
14627
+ "p-wait-for": {
14628
+ "version": "4.1.0",
14629
+ "resolved": "https://registry.npmjs.org/p-wait-for/-/p-wait-for-4.1.0.tgz",
14630
+ "integrity": "sha512-i8nE5q++9h8oaQHWltS1Tnnv4IoMDOlqN7C0KFG2OdbK0iFJIt6CROZ8wfBM+K4Pxqfnq4C4lkkpXqTEpB5DZw==",
14631
+ "requires": {
14632
+ "p-timeout": "^5.0.0"
14633
+ }
14634
+ },
14414
14635
  "parse-ms": {
14415
14636
  "version": "3.0.0",
14416
14637
  "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-3.0.0.tgz",
@@ -14700,9 +14921,9 @@
14700
14921
  }
14701
14922
  },
14702
14923
  "@netlify/edge-bundler": {
14703
- "version": "8.16.1",
14704
- "resolved": "https://registry.npmjs.org/@netlify/edge-bundler/-/edge-bundler-8.16.1.tgz",
14705
- "integrity": "sha512-nLwQchCruBwjr2bgptxisoa+i182PwNc9eu1NTqwVZCIwDJhdBPJQVH251VunT0NJEchnpqJ4nZdTce3y1G6zQ==",
14924
+ "version": "8.16.2",
14925
+ "resolved": "https://registry.npmjs.org/@netlify/edge-bundler/-/edge-bundler-8.16.2.tgz",
14926
+ "integrity": "sha512-/deN9mBWXqm5s7SCYsdQCy95VgPeg16tw8Lm6buUoOxFThX9WLOf3+5YOiwjxTvzqpbMvO4ALmXn7pdXvuWCtQ==",
14706
14927
  "requires": {
14707
14928
  "@import-maps/resolve": "^1.0.1",
14708
14929
  "ajv": "^8.11.2",
@@ -17637,17 +17858,17 @@
17637
17858
  },
17638
17859
  "dependencies": {
17639
17860
  "@typescript-eslint/types": {
17640
- "version": "5.59.8",
17641
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz",
17642
- "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w=="
17861
+ "version": "5.59.9",
17862
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz",
17863
+ "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw=="
17643
17864
  },
17644
17865
  "@typescript-eslint/typescript-estree": {
17645
- "version": "5.59.8",
17646
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz",
17647
- "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==",
17866
+ "version": "5.59.9",
17867
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz",
17868
+ "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==",
17648
17869
  "requires": {
17649
- "@typescript-eslint/types": "5.59.8",
17650
- "@typescript-eslint/visitor-keys": "5.59.8",
17870
+ "@typescript-eslint/types": "5.59.9",
17871
+ "@typescript-eslint/visitor-keys": "5.59.9",
17651
17872
  "debug": "^4.3.4",
17652
17873
  "globby": "^11.1.0",
17653
17874
  "is-glob": "^4.0.3",
@@ -17656,11 +17877,11 @@
17656
17877
  }
17657
17878
  },
17658
17879
  "@typescript-eslint/visitor-keys": {
17659
- "version": "5.59.8",
17660
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz",
17661
- "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==",
17880
+ "version": "5.59.9",
17881
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz",
17882
+ "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==",
17662
17883
  "requires": {
17663
- "@typescript-eslint/types": "5.59.8",
17884
+ "@typescript-eslint/types": "5.59.9",
17664
17885
  "eslint-visitor-keys": "^3.3.0"
17665
17886
  }
17666
17887
  },
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "netlify-cli",
3
3
  "description": "Netlify command line tool",
4
- "version": "15.3.2",
4
+ "version": "15.4.1",
5
5
  "author": "Netlify Inc.",
6
6
  "type": "module",
7
7
  "engines": {
@@ -47,7 +47,7 @@
47
47
  "@netlify/build": "29.12.1",
48
48
  "@netlify/build-info": "7.0.5",
49
49
  "@netlify/config": "20.4.4",
50
- "@netlify/edge-bundler": "8.16.1",
50
+ "@netlify/edge-bundler": "8.16.2",
51
51
  "@netlify/framework-info": "9.8.9",
52
52
  "@netlify/local-functions-proxy": "1.1.1",
53
53
  "@netlify/zip-it-and-ship-it": "9.8.0",
@@ -21,7 +21,7 @@ import detectServerSettings, { getConfigWithPlugins } from '../../utils/detect-s
21
21
  import { getDotEnvVariables, getSiteInformation, injectEnvVariables } from '../../utils/dev.mjs'
22
22
  import { getEnvelopeEnv, normalizeContext } from '../../utils/env/index.mjs'
23
23
  import { ensureNetlifyIgnore } from '../../utils/gitignore.mjs'
24
- import { startLiveTunnel } from '../../utils/live-tunnel.mjs'
24
+ import { getLiveTunnelSlug, startLiveTunnel } from '../../utils/live-tunnel.mjs'
25
25
  import openBrowser from '../../utils/open-browser.mjs'
26
26
  import { generateInspectSettings, startProxyServer } from '../../utils/proxy-server.mjs'
27
27
  import { getProxyUrl } from '../../utils/proxy.mjs'
@@ -37,16 +37,33 @@ import { createDevExecCommand } from './dev-exec.mjs'
37
37
  * @param {import('commander').OptionValues} config.options
38
38
  * @param {*} config.settings
39
39
  * @param {*} config.site
40
+ * @param {*} config.state
40
41
  * @returns
41
42
  */
42
- const handleLiveTunnel = async ({ api, options, settings, site }) => {
43
- if (options.live) {
43
+ const handleLiveTunnel = async ({ api, options, settings, site, state }) => {
44
+ const { live } = options
45
+
46
+ if (live) {
47
+ const customSlug = typeof live === 'string' && live.length !== 0 ? live : undefined
48
+ const slug = getLiveTunnelSlug(state, customSlug)
49
+
50
+ let message = `${NETLIFYDEVWARN} Creating live URL with ID ${chalk.yellow(slug)}`
51
+
52
+ if (!customSlug) {
53
+ message += ` (to generate a custom URL, use ${chalk.magenta('--live=<subdomain>')})`
54
+ }
55
+
56
+ log(message)
57
+
44
58
  const sessionUrl = await startLiveTunnel({
45
59
  siteId: site.id,
46
60
  netlifyApiToken: api.accessToken,
47
61
  localPort: settings.port,
62
+ slug,
48
63
  })
64
+
49
65
  process.env.BASE_URL = sessionUrl
66
+
50
67
  return sessionUrl
51
68
  }
52
69
  }
@@ -125,8 +142,9 @@ const dev = async (options, command) => {
125
142
 
126
143
  command.setAnalyticsPayload({ live: options.live })
127
144
 
128
- const liveTunnelUrl = await handleLiveTunnel({ options, site, api, settings })
145
+ const liveTunnelUrl = await handleLiveTunnel({ options, site, api, settings, state })
129
146
  const url = liveTunnelUrl || getProxyUrl(settings)
147
+
130
148
  process.env.URL = url
131
149
  process.env.DEPLOY_URL = url
132
150
 
@@ -229,7 +247,11 @@ export const createDevCommand = (program) => {
229
247
  .option('-d ,--dir <path>', 'dir with static files')
230
248
  .option('-f ,--functions <folder>', 'specify a functions folder to serve')
231
249
  .option('-o ,--offline', 'disables any features that require network access')
232
- .option('-l, --live', 'start a public live session', false)
250
+ .option(
251
+ '-l, --live [subdomain]',
252
+ 'start a public live session; optionally, supply a subdomain to generate a custom URL',
253
+ false,
254
+ )
233
255
  .addOption(
234
256
  new Option('--functionsPort <port>', 'Old, prefer --functions-port. Port of functions server')
235
257
  .argParser((value) => Number.parseInt(value))
@@ -139,6 +139,7 @@ export const createFormSubmissionHandler = function ({ functionsRegistry, siteUr
139
139
  'content-length': data.length,
140
140
  'content-type': 'application/json',
141
141
  'x-netlify-original-pathname': originalUrl.pathname,
142
+ 'x-netlify-original-search': originalUrl.search,
142
143
  }
143
144
 
144
145
  next()
@@ -84,7 +84,14 @@ export const createHandler = function (options) {
84
84
  requestPath = request.header('x-netlify-original-pathname')
85
85
  delete request.headers['x-netlify-original-pathname']
86
86
  }
87
- const queryParams = Object.entries(request.query).reduce(
87
+
88
+ let requestQuery = request.query
89
+ if (request.header('x-netlify-original-search')) {
90
+ requestQuery = Object.fromEntries(new URLSearchParams(request.header('x-netlify-original-search')))
91
+ delete request.headers['x-netlify-original-search']
92
+ }
93
+
94
+ const queryParams = Object.entries(requestQuery).reduce(
88
95
  (prev, [key, value]) => ({ ...prev, [key]: Array.isArray(value) ? value : [value] }),
89
96
  {},
90
97
  )
@@ -92,7 +99,7 @@ export const createHandler = function (options) {
92
99
  (prev, [key, value]) => ({ ...prev, [key]: Array.isArray(value) ? value : [value] }),
93
100
  {},
94
101
  )
95
- const rawQuery = new URLSearchParams(request.query).toString()
102
+ const rawQuery = new URLSearchParams(requestQuery).toString()
96
103
  const protocol = options.config?.dev?.https ? 'https' : 'http'
97
104
  const url = new URL(requestPath, `${protocol}://${request.get('host') || 'localhost'}`)
98
105
  url.search = rawQuery
@@ -3,6 +3,7 @@ import process from 'process'
3
3
 
4
4
  import fetch from 'node-fetch'
5
5
  import pWaitFor from 'p-wait-for'
6
+ import { v4 as uuidv4 } from 'uuid'
6
7
 
7
8
  import { fetchLatestVersion, shouldFetchLatestVersion } from '../lib/exec-fetcher.mjs'
8
9
  import { getPathInHome } from '../lib/settings.mjs'
@@ -12,13 +13,14 @@ import execa from './execa.mjs'
12
13
 
13
14
  const PACKAGE_NAME = 'live-tunnel-client'
14
15
  const EXEC_NAME = PACKAGE_NAME
16
+ const SLUG_LOCAL_STATE_KEY = 'liveTunnelSlug'
15
17
 
16
18
  // 1 second
17
19
  const TUNNEL_POLL_INTERVAL = 1e3
18
20
  // 5 minutes
19
21
  const TUNNEL_POLL_TIMEOUT = 3e5
20
22
 
21
- const createTunnel = async function ({ netlifyApiToken, siteId }) {
23
+ const createTunnel = async function ({ netlifyApiToken, siteId, slug }) {
22
24
  await installTunnelClient()
23
25
 
24
26
  if (!siteId) {
@@ -29,9 +31,8 @@ const createTunnel = async function ({ netlifyApiToken, siteId }) {
29
31
  )
30
32
  process.exit(1)
31
33
  }
32
- log(`${NETLIFYDEVLOG} Creating Live Tunnel for ${siteId}`)
33
- const url = `https://api.netlify.com/api/v1/live_sessions?site_id=${siteId}`
34
34
 
35
+ const url = `https://api.netlify.com/api/v1/live_sessions?site_id=${siteId}&slug=${slug}`
35
36
  const response = await fetch(url, {
36
37
  method: 'POST',
37
38
  headers: {
@@ -87,10 +88,11 @@ const installTunnelClient = async function () {
87
88
  })
88
89
  }
89
90
 
90
- export const startLiveTunnel = async ({ localPort, netlifyApiToken, siteId }) => {
91
+ export const startLiveTunnel = async ({ localPort, netlifyApiToken, siteId, slug }) => {
91
92
  const session = await createTunnel({
92
93
  siteId,
93
94
  netlifyApiToken,
95
+ slug,
94
96
  })
95
97
 
96
98
  const isLiveTunnelReady = async function () {
@@ -121,3 +123,27 @@ export const startLiveTunnel = async ({ localPort, netlifyApiToken, siteId }) =>
121
123
 
122
124
  return session.session_url
123
125
  }
126
+
127
+ export const getLiveTunnelSlug = (state, override) => {
128
+ if (override !== undefined) {
129
+ return override
130
+ }
131
+
132
+ const newSlug = generateRandomSlug()
133
+
134
+ try {
135
+ const existingSlug = state.get(SLUG_LOCAL_STATE_KEY)
136
+
137
+ if (existingSlug !== undefined) {
138
+ return existingSlug
139
+ }
140
+
141
+ state.set(SLUG_LOCAL_STATE_KEY, newSlug)
142
+ } catch (error) {
143
+ log(`${NETLIFYDEVERR} Could not read or write local state file: ${error.message}`)
144
+ }
145
+
146
+ return newSlug
147
+ }
148
+
149
+ const generateRandomSlug = () => uuidv4().slice(0, 8)
@@ -301,7 +301,10 @@ const serveRedirect = async function ({ env, match, options, proxy, req, res, si
301
301
  }
302
302
 
303
303
  if (isFunction(options.functionsPort, req.url)) {
304
- req.headers['x-netlify-original-pathname'] = reqToURL(req, originalURL).pathname
304
+ const url = reqToURL(req, originalURL)
305
+ req.headers['x-netlify-original-pathname'] = url.pathname
306
+ req.headers['x-netlify-original-search'] = url.search
307
+
305
308
  return proxy.web(req, res, { target: options.functionsServer })
306
309
  }
307
310
  const addonUrl = getAddonUrl(options.addonsUrls, req)