netlify-cli 9.5.0 → 9.6.3

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": "9.5.0",
3
+ "version": "9.6.3",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "netlify-cli",
9
- "version": "9.5.0",
9
+ "version": "9.6.3",
10
10
  "hasInstallScript": true,
11
11
  "license": "MIT",
12
12
  "dependencies": {
@@ -17,7 +17,7 @@
17
17
  "@netlify/plugin-edge-handlers": "^3.0.6",
18
18
  "@netlify/plugins-list": "^6.11.0",
19
19
  "@netlify/routing-local-proxy": "^0.34.1",
20
- "@netlify/zip-it-and-ship-it": "^5.7.5",
20
+ "@netlify/zip-it-and-ship-it": "^5.8.0",
21
21
  "@octokit/rest": "^18.0.0",
22
22
  "@sindresorhus/slugify": "^1.1.0",
23
23
  "ansi-escapes": "^5.0.0",
@@ -2423,6 +2423,342 @@
2423
2423
  "node": "^12.20.0 || ^14.14.0 || >=16.0.0"
2424
2424
  }
2425
2425
  },
2426
+ "node_modules/@netlify/build/node_modules/@babel/parser": {
2427
+ "version": "7.16.8",
2428
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz",
2429
+ "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==",
2430
+ "bin": {
2431
+ "parser": "bin/babel-parser.js"
2432
+ },
2433
+ "engines": {
2434
+ "node": ">=6.0.0"
2435
+ }
2436
+ },
2437
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it": {
2438
+ "version": "5.7.5",
2439
+ "resolved": "https://registry.npmjs.org/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-5.7.5.tgz",
2440
+ "integrity": "sha512-v3buWIrlm0+lmDwI2qHRU4t7zR3LtfU0T2JYUPGIz0D8ezsnHihj0wbBf3lMZnQmHwrqQURQYL9nQTrpwH3YoA==",
2441
+ "dependencies": {
2442
+ "@babel/parser": "7.16.8",
2443
+ "@netlify/esbuild": "^0.13.6",
2444
+ "@vercel/nft": "^0.17.0",
2445
+ "archiver": "^5.3.0",
2446
+ "common-path-prefix": "^3.0.0",
2447
+ "cp-file": "^9.0.0",
2448
+ "del": "^6.0.0",
2449
+ "elf-cam": "^0.1.1",
2450
+ "end-of-stream": "^1.4.4",
2451
+ "es-module-lexer": "^0.9.0",
2452
+ "execa": "^5.0.0",
2453
+ "filter-obj": "^2.0.1",
2454
+ "find-up": "^5.0.0",
2455
+ "glob": "^7.1.6",
2456
+ "is-builtin-module": "^3.1.0",
2457
+ "junk": "^3.1.0",
2458
+ "locate-path": "^6.0.0",
2459
+ "merge-options": "^3.0.4",
2460
+ "minimatch": "^4.0.0",
2461
+ "p-map": "^4.0.0",
2462
+ "path-exists": "^4.0.0",
2463
+ "pkg-dir": "^5.0.0",
2464
+ "precinct": "^8.2.0",
2465
+ "read-package-json-fast": "^2.0.2",
2466
+ "require-package-name": "^2.0.1",
2467
+ "resolve": "^2.0.0-next.1",
2468
+ "semver": "^7.0.0",
2469
+ "tmp-promise": "^3.0.2",
2470
+ "toml": "^3.0.0",
2471
+ "unixify": "^1.0.0",
2472
+ "yargs": "^16.0.0"
2473
+ },
2474
+ "bin": {
2475
+ "zip-it-and-ship-it": "dist/bin.js"
2476
+ },
2477
+ "engines": {
2478
+ "node": "^12.20.0 || ^14.14.0 || >=16.0.0"
2479
+ }
2480
+ },
2481
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/aggregate-error": {
2482
+ "version": "3.1.0",
2483
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
2484
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
2485
+ "dependencies": {
2486
+ "clean-stack": "^2.0.0",
2487
+ "indent-string": "^4.0.0"
2488
+ },
2489
+ "engines": {
2490
+ "node": ">=8"
2491
+ }
2492
+ },
2493
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/ansi-regex": {
2494
+ "version": "5.0.1",
2495
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2496
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
2497
+ "engines": {
2498
+ "node": ">=8"
2499
+ }
2500
+ },
2501
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/clean-stack": {
2502
+ "version": "2.2.0",
2503
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
2504
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
2505
+ "engines": {
2506
+ "node": ">=6"
2507
+ }
2508
+ },
2509
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/emoji-regex": {
2510
+ "version": "8.0.0",
2511
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
2512
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
2513
+ },
2514
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/execa": {
2515
+ "version": "5.1.1",
2516
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
2517
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
2518
+ "dependencies": {
2519
+ "cross-spawn": "^7.0.3",
2520
+ "get-stream": "^6.0.0",
2521
+ "human-signals": "^2.1.0",
2522
+ "is-stream": "^2.0.0",
2523
+ "merge-stream": "^2.0.0",
2524
+ "npm-run-path": "^4.0.1",
2525
+ "onetime": "^5.1.2",
2526
+ "signal-exit": "^3.0.3",
2527
+ "strip-final-newline": "^2.0.0"
2528
+ },
2529
+ "engines": {
2530
+ "node": ">=10"
2531
+ },
2532
+ "funding": {
2533
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
2534
+ }
2535
+ },
2536
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/filter-obj": {
2537
+ "version": "2.0.2",
2538
+ "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-2.0.2.tgz",
2539
+ "integrity": "sha512-lO3ttPjHZRfjMcxWKb1j1eDhTFsu4meeR3lnMcnBFhk6RuLhvEiuALu2TlfL310ph4lCYYwgF/ElIjdP739tdg==",
2540
+ "engines": {
2541
+ "node": ">=8"
2542
+ }
2543
+ },
2544
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/find-up": {
2545
+ "version": "5.0.0",
2546
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
2547
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
2548
+ "dependencies": {
2549
+ "locate-path": "^6.0.0",
2550
+ "path-exists": "^4.0.0"
2551
+ },
2552
+ "engines": {
2553
+ "node": ">=10"
2554
+ },
2555
+ "funding": {
2556
+ "url": "https://github.com/sponsors/sindresorhus"
2557
+ }
2558
+ },
2559
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/human-signals": {
2560
+ "version": "2.1.0",
2561
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
2562
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
2563
+ "engines": {
2564
+ "node": ">=10.17.0"
2565
+ }
2566
+ },
2567
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/indent-string": {
2568
+ "version": "4.0.0",
2569
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
2570
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
2571
+ "engines": {
2572
+ "node": ">=8"
2573
+ }
2574
+ },
2575
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/is-stream": {
2576
+ "version": "2.0.1",
2577
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
2578
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
2579
+ "engines": {
2580
+ "node": ">=8"
2581
+ },
2582
+ "funding": {
2583
+ "url": "https://github.com/sponsors/sindresorhus"
2584
+ }
2585
+ },
2586
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/locate-path": {
2587
+ "version": "6.0.0",
2588
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
2589
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
2590
+ "dependencies": {
2591
+ "p-locate": "^5.0.0"
2592
+ },
2593
+ "engines": {
2594
+ "node": ">=10"
2595
+ },
2596
+ "funding": {
2597
+ "url": "https://github.com/sponsors/sindresorhus"
2598
+ }
2599
+ },
2600
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/mimic-fn": {
2601
+ "version": "2.1.0",
2602
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
2603
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
2604
+ "engines": {
2605
+ "node": ">=6"
2606
+ }
2607
+ },
2608
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/npm-run-path": {
2609
+ "version": "4.0.1",
2610
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
2611
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
2612
+ "dependencies": {
2613
+ "path-key": "^3.0.0"
2614
+ },
2615
+ "engines": {
2616
+ "node": ">=8"
2617
+ }
2618
+ },
2619
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/onetime": {
2620
+ "version": "5.1.2",
2621
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
2622
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
2623
+ "dependencies": {
2624
+ "mimic-fn": "^2.1.0"
2625
+ },
2626
+ "engines": {
2627
+ "node": ">=6"
2628
+ },
2629
+ "funding": {
2630
+ "url": "https://github.com/sponsors/sindresorhus"
2631
+ }
2632
+ },
2633
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/p-limit": {
2634
+ "version": "3.1.0",
2635
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
2636
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
2637
+ "dependencies": {
2638
+ "yocto-queue": "^0.1.0"
2639
+ },
2640
+ "engines": {
2641
+ "node": ">=10"
2642
+ },
2643
+ "funding": {
2644
+ "url": "https://github.com/sponsors/sindresorhus"
2645
+ }
2646
+ },
2647
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/p-locate": {
2648
+ "version": "5.0.0",
2649
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
2650
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
2651
+ "dependencies": {
2652
+ "p-limit": "^3.0.2"
2653
+ },
2654
+ "engines": {
2655
+ "node": ">=10"
2656
+ },
2657
+ "funding": {
2658
+ "url": "https://github.com/sponsors/sindresorhus"
2659
+ }
2660
+ },
2661
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/p-map": {
2662
+ "version": "4.0.0",
2663
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
2664
+ "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
2665
+ "dependencies": {
2666
+ "aggregate-error": "^3.0.0"
2667
+ },
2668
+ "engines": {
2669
+ "node": ">=10"
2670
+ },
2671
+ "funding": {
2672
+ "url": "https://github.com/sponsors/sindresorhus"
2673
+ }
2674
+ },
2675
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/path-exists": {
2676
+ "version": "4.0.0",
2677
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
2678
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
2679
+ "engines": {
2680
+ "node": ">=8"
2681
+ }
2682
+ },
2683
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/path-key": {
2684
+ "version": "3.1.1",
2685
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
2686
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
2687
+ "engines": {
2688
+ "node": ">=8"
2689
+ }
2690
+ },
2691
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/pkg-dir": {
2692
+ "version": "5.0.0",
2693
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz",
2694
+ "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==",
2695
+ "dependencies": {
2696
+ "find-up": "^5.0.0"
2697
+ },
2698
+ "engines": {
2699
+ "node": ">=10"
2700
+ }
2701
+ },
2702
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/string-width": {
2703
+ "version": "4.2.3",
2704
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
2705
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
2706
+ "dependencies": {
2707
+ "emoji-regex": "^8.0.0",
2708
+ "is-fullwidth-code-point": "^3.0.0",
2709
+ "strip-ansi": "^6.0.1"
2710
+ },
2711
+ "engines": {
2712
+ "node": ">=8"
2713
+ }
2714
+ },
2715
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/strip-ansi": {
2716
+ "version": "6.0.1",
2717
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2718
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2719
+ "dependencies": {
2720
+ "ansi-regex": "^5.0.1"
2721
+ },
2722
+ "engines": {
2723
+ "node": ">=8"
2724
+ }
2725
+ },
2726
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/strip-final-newline": {
2727
+ "version": "2.0.0",
2728
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
2729
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
2730
+ "engines": {
2731
+ "node": ">=6"
2732
+ }
2733
+ },
2734
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/yargs": {
2735
+ "version": "16.2.0",
2736
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
2737
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
2738
+ "dependencies": {
2739
+ "cliui": "^7.0.2",
2740
+ "escalade": "^3.1.1",
2741
+ "get-caller-file": "^2.0.5",
2742
+ "require-directory": "^2.1.1",
2743
+ "string-width": "^4.2.0",
2744
+ "y18n": "^5.0.5",
2745
+ "yargs-parser": "^20.2.2"
2746
+ },
2747
+ "engines": {
2748
+ "node": ">=10"
2749
+ }
2750
+ },
2751
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/yocto-queue": {
2752
+ "version": "0.1.0",
2753
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
2754
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
2755
+ "engines": {
2756
+ "node": ">=10"
2757
+ },
2758
+ "funding": {
2759
+ "url": "https://github.com/sponsors/sindresorhus"
2760
+ }
2761
+ },
2426
2762
  "node_modules/@netlify/build/node_modules/@sindresorhus/is": {
2427
2763
  "version": "2.1.1",
2428
2764
  "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.1.tgz",
@@ -2689,6 +3025,14 @@
2689
3025
  "url": "https://github.com/sponsors/sindresorhus"
2690
3026
  }
2691
3027
  },
3028
+ "node_modules/@netlify/build/node_modules/is-fullwidth-code-point": {
3029
+ "version": "3.0.0",
3030
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
3031
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
3032
+ "engines": {
3033
+ "node": ">=8"
3034
+ }
3035
+ },
2692
3036
  "node_modules/@netlify/build/node_modules/is-plain-obj": {
2693
3037
  "version": "4.0.0",
2694
3038
  "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.0.0.tgz",
@@ -2758,6 +3102,17 @@
2758
3102
  "url": "https://github.com/sponsors/sindresorhus"
2759
3103
  }
2760
3104
  },
3105
+ "node_modules/@netlify/build/node_modules/minimatch": {
3106
+ "version": "4.1.1",
3107
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.1.1.tgz",
3108
+ "integrity": "sha512-9ObkVPP8aM2KWHw1RMAaOoEzHjcqzE1dmEQHAOq9ySRhvVMru1VKqniUs/g6Us4KSwXKk0+uLko6caynDcWEWQ==",
3109
+ "dependencies": {
3110
+ "brace-expansion": "^1.1.7"
3111
+ },
3112
+ "engines": {
3113
+ "node": ">=10"
3114
+ }
3115
+ },
2761
3116
  "node_modules/@netlify/build/node_modules/npm-run-path": {
2762
3117
  "version": "5.1.0",
2763
3118
  "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz",
@@ -4301,9 +4656,9 @@
4301
4656
  }
4302
4657
  },
4303
4658
  "node_modules/@netlify/zip-it-and-ship-it": {
4304
- "version": "5.7.5",
4305
- "resolved": "https://registry.npmjs.org/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-5.7.5.tgz",
4306
- "integrity": "sha512-v3buWIrlm0+lmDwI2qHRU4t7zR3LtfU0T2JYUPGIz0D8ezsnHihj0wbBf3lMZnQmHwrqQURQYL9nQTrpwH3YoA==",
4659
+ "version": "5.8.0",
4660
+ "resolved": "https://registry.npmjs.org/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-5.8.0.tgz",
4661
+ "integrity": "sha512-Tr6/x19us7xCuHHHdZxKzAyR2jPLBCgHwmNvRsv1WWyptElm+srd0Xku5RzK1P/FdOySkub2d5iy+NHeSrbLLQ==",
4307
4662
  "dependencies": {
4308
4663
  "@babel/parser": "7.16.8",
4309
4664
  "@netlify/esbuild": "^0.13.6",
@@ -25555,6 +25910,233 @@
25555
25910
  "yargs": "^17.3.1"
25556
25911
  },
25557
25912
  "dependencies": {
25913
+ "@babel/parser": {
25914
+ "version": "7.16.8",
25915
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz",
25916
+ "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw=="
25917
+ },
25918
+ "@netlify/zip-it-and-ship-it": {
25919
+ "version": "5.7.5",
25920
+ "resolved": "https://registry.npmjs.org/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-5.7.5.tgz",
25921
+ "integrity": "sha512-v3buWIrlm0+lmDwI2qHRU4t7zR3LtfU0T2JYUPGIz0D8ezsnHihj0wbBf3lMZnQmHwrqQURQYL9nQTrpwH3YoA==",
25922
+ "requires": {
25923
+ "@babel/parser": "7.16.8",
25924
+ "@netlify/esbuild": "^0.13.6",
25925
+ "@vercel/nft": "^0.17.0",
25926
+ "archiver": "^5.3.0",
25927
+ "common-path-prefix": "^3.0.0",
25928
+ "cp-file": "^9.0.0",
25929
+ "del": "^6.0.0",
25930
+ "elf-cam": "^0.1.1",
25931
+ "end-of-stream": "^1.4.4",
25932
+ "es-module-lexer": "^0.9.0",
25933
+ "execa": "^5.0.0",
25934
+ "filter-obj": "^2.0.1",
25935
+ "find-up": "^5.0.0",
25936
+ "glob": "^7.1.6",
25937
+ "is-builtin-module": "^3.1.0",
25938
+ "junk": "^3.1.0",
25939
+ "locate-path": "^6.0.0",
25940
+ "merge-options": "^3.0.4",
25941
+ "minimatch": "^4.0.0",
25942
+ "p-map": "^4.0.0",
25943
+ "path-exists": "^4.0.0",
25944
+ "pkg-dir": "^5.0.0",
25945
+ "precinct": "^8.2.0",
25946
+ "read-package-json-fast": "^2.0.2",
25947
+ "require-package-name": "^2.0.1",
25948
+ "resolve": "^2.0.0-next.1",
25949
+ "semver": "^7.0.0",
25950
+ "tmp-promise": "^3.0.2",
25951
+ "toml": "^3.0.0",
25952
+ "unixify": "^1.0.0",
25953
+ "yargs": "^16.0.0"
25954
+ },
25955
+ "dependencies": {
25956
+ "aggregate-error": {
25957
+ "version": "3.1.0",
25958
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
25959
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
25960
+ "requires": {
25961
+ "clean-stack": "^2.0.0",
25962
+ "indent-string": "^4.0.0"
25963
+ }
25964
+ },
25965
+ "ansi-regex": {
25966
+ "version": "5.0.1",
25967
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
25968
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
25969
+ },
25970
+ "clean-stack": {
25971
+ "version": "2.2.0",
25972
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
25973
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="
25974
+ },
25975
+ "emoji-regex": {
25976
+ "version": "8.0.0",
25977
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
25978
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
25979
+ },
25980
+ "execa": {
25981
+ "version": "5.1.1",
25982
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
25983
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
25984
+ "requires": {
25985
+ "cross-spawn": "^7.0.3",
25986
+ "get-stream": "^6.0.0",
25987
+ "human-signals": "^2.1.0",
25988
+ "is-stream": "^2.0.0",
25989
+ "merge-stream": "^2.0.0",
25990
+ "npm-run-path": "^4.0.1",
25991
+ "onetime": "^5.1.2",
25992
+ "signal-exit": "^3.0.3",
25993
+ "strip-final-newline": "^2.0.0"
25994
+ }
25995
+ },
25996
+ "filter-obj": {
25997
+ "version": "2.0.2",
25998
+ "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-2.0.2.tgz",
25999
+ "integrity": "sha512-lO3ttPjHZRfjMcxWKb1j1eDhTFsu4meeR3lnMcnBFhk6RuLhvEiuALu2TlfL310ph4lCYYwgF/ElIjdP739tdg=="
26000
+ },
26001
+ "find-up": {
26002
+ "version": "5.0.0",
26003
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
26004
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
26005
+ "requires": {
26006
+ "locate-path": "^6.0.0",
26007
+ "path-exists": "^4.0.0"
26008
+ }
26009
+ },
26010
+ "human-signals": {
26011
+ "version": "2.1.0",
26012
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
26013
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="
26014
+ },
26015
+ "indent-string": {
26016
+ "version": "4.0.0",
26017
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
26018
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="
26019
+ },
26020
+ "is-stream": {
26021
+ "version": "2.0.1",
26022
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
26023
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="
26024
+ },
26025
+ "locate-path": {
26026
+ "version": "6.0.0",
26027
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
26028
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
26029
+ "requires": {
26030
+ "p-locate": "^5.0.0"
26031
+ }
26032
+ },
26033
+ "mimic-fn": {
26034
+ "version": "2.1.0",
26035
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
26036
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
26037
+ },
26038
+ "npm-run-path": {
26039
+ "version": "4.0.1",
26040
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
26041
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
26042
+ "requires": {
26043
+ "path-key": "^3.0.0"
26044
+ }
26045
+ },
26046
+ "onetime": {
26047
+ "version": "5.1.2",
26048
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
26049
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
26050
+ "requires": {
26051
+ "mimic-fn": "^2.1.0"
26052
+ }
26053
+ },
26054
+ "p-limit": {
26055
+ "version": "3.1.0",
26056
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
26057
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
26058
+ "requires": {
26059
+ "yocto-queue": "^0.1.0"
26060
+ }
26061
+ },
26062
+ "p-locate": {
26063
+ "version": "5.0.0",
26064
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
26065
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
26066
+ "requires": {
26067
+ "p-limit": "^3.0.2"
26068
+ }
26069
+ },
26070
+ "p-map": {
26071
+ "version": "4.0.0",
26072
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
26073
+ "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
26074
+ "requires": {
26075
+ "aggregate-error": "^3.0.0"
26076
+ }
26077
+ },
26078
+ "path-exists": {
26079
+ "version": "4.0.0",
26080
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
26081
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
26082
+ },
26083
+ "path-key": {
26084
+ "version": "3.1.1",
26085
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
26086
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
26087
+ },
26088
+ "pkg-dir": {
26089
+ "version": "5.0.0",
26090
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz",
26091
+ "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==",
26092
+ "requires": {
26093
+ "find-up": "^5.0.0"
26094
+ }
26095
+ },
26096
+ "string-width": {
26097
+ "version": "4.2.3",
26098
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
26099
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
26100
+ "requires": {
26101
+ "emoji-regex": "^8.0.0",
26102
+ "is-fullwidth-code-point": "^3.0.0",
26103
+ "strip-ansi": "^6.0.1"
26104
+ }
26105
+ },
26106
+ "strip-ansi": {
26107
+ "version": "6.0.1",
26108
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
26109
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
26110
+ "requires": {
26111
+ "ansi-regex": "^5.0.1"
26112
+ }
26113
+ },
26114
+ "strip-final-newline": {
26115
+ "version": "2.0.0",
26116
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
26117
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="
26118
+ },
26119
+ "yargs": {
26120
+ "version": "16.2.0",
26121
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
26122
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
26123
+ "requires": {
26124
+ "cliui": "^7.0.2",
26125
+ "escalade": "^3.1.1",
26126
+ "get-caller-file": "^2.0.5",
26127
+ "require-directory": "^2.1.1",
26128
+ "string-width": "^4.2.0",
26129
+ "y18n": "^5.0.5",
26130
+ "yargs-parser": "^20.2.2"
26131
+ }
26132
+ },
26133
+ "yocto-queue": {
26134
+ "version": "0.1.0",
26135
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
26136
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
26137
+ }
26138
+ }
26139
+ },
25558
26140
  "@sindresorhus/is": {
25559
26141
  "version": "2.1.1",
25560
26142
  "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.1.tgz",
@@ -25721,6 +26303,11 @@
25721
26303
  "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz",
25722
26304
  "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg=="
25723
26305
  },
26306
+ "is-fullwidth-code-point": {
26307
+ "version": "3.0.0",
26308
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
26309
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
26310
+ },
25724
26311
  "is-plain-obj": {
25725
26312
  "version": "4.0.0",
25726
26313
  "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.0.0.tgz",
@@ -25754,6 +26341,14 @@
25754
26341
  "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
25755
26342
  "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA=="
25756
26343
  },
26344
+ "minimatch": {
26345
+ "version": "4.1.1",
26346
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.1.1.tgz",
26347
+ "integrity": "sha512-9ObkVPP8aM2KWHw1RMAaOoEzHjcqzE1dmEQHAOq9ySRhvVMru1VKqniUs/g6Us4KSwXKk0+uLko6caynDcWEWQ==",
26348
+ "requires": {
26349
+ "brace-expansion": "^1.1.7"
26350
+ }
26351
+ },
25757
26352
  "npm-run-path": {
25758
26353
  "version": "5.1.0",
25759
26354
  "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz",
@@ -26688,9 +27283,9 @@
26688
27283
  }
26689
27284
  },
26690
27285
  "@netlify/zip-it-and-ship-it": {
26691
- "version": "5.7.5",
26692
- "resolved": "https://registry.npmjs.org/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-5.7.5.tgz",
26693
- "integrity": "sha512-v3buWIrlm0+lmDwI2qHRU4t7zR3LtfU0T2JYUPGIz0D8ezsnHihj0wbBf3lMZnQmHwrqQURQYL9nQTrpwH3YoA==",
27286
+ "version": "5.8.0",
27287
+ "resolved": "https://registry.npmjs.org/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-5.8.0.tgz",
27288
+ "integrity": "sha512-Tr6/x19us7xCuHHHdZxKzAyR2jPLBCgHwmNvRsv1WWyptElm+srd0Xku5RzK1P/FdOySkub2d5iy+NHeSrbLLQ==",
26694
27289
  "requires": {
26695
27290
  "@babel/parser": "7.16.8",
26696
27291
  "@netlify/esbuild": "^0.13.6",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "netlify-cli",
3
3
  "description": "Netlify command line tool",
4
- "version": "9.5.0",
4
+ "version": "9.6.3",
5
5
  "author": "Netlify Inc.",
6
6
  "contributors": [
7
7
  "Abraham Schilling <AbrahamSchilling@gmail.com> (https://gitlab.com/n4bb12)",
@@ -206,7 +206,7 @@
206
206
  "@netlify/plugin-edge-handlers": "^3.0.6",
207
207
  "@netlify/plugins-list": "^6.11.0",
208
208
  "@netlify/routing-local-proxy": "^0.34.1",
209
- "@netlify/zip-it-and-ship-it": "^5.7.5",
209
+ "@netlify/zip-it-and-ship-it": "^5.8.0",
210
210
  "@octokit/rest": "^18.0.0",
211
211
  "@sindresorhus/slugify": "^1.1.0",
212
212
  "ansi-escapes": "^5.0.0",
@@ -1,4 +1,5 @@
1
1
  // @ts-check
2
+ const events = require('events')
2
3
  const process = require('process')
3
4
  const { format } = require('util')
4
5
 
@@ -28,6 +29,7 @@ const {
28
29
  pollForToken,
29
30
  sortOptions,
30
31
  track,
32
+ watchDebounced,
31
33
  } = require('../utils')
32
34
 
33
35
  // Netlify CLI client id. Lives in bot@netlify.com
@@ -119,6 +121,11 @@ class BaseCommand extends Command {
119
121
  await this.init(actionCommand)
120
122
  debug(`${name}:preAction`)('end')
121
123
  })
124
+ .hook('postAction', async () => {
125
+ if (this.configWatcherHandle) {
126
+ await this.configWatcherHandle.close()
127
+ }
128
+ })
122
129
  )
123
130
  }
124
131
 
@@ -430,6 +437,24 @@ class BaseCommand extends Command {
430
437
  const globalConfig = await getGlobalConfig()
431
438
  const { NetlifyAPI } = await jsClient
432
439
 
440
+ const configWatcher = new events.EventEmitter()
441
+
442
+ // Only set up a watcher if we know the config path.
443
+ if (configPath) {
444
+ const configWatcherHandle = await watchDebounced(configPath, {
445
+ depth: 1,
446
+ onChange: async () => {
447
+ const { config: newConfig } = await actionCommand.getConfig({ cwd, state, token, ...apiUrlOpts })
448
+
449
+ const normalizedNewConfig = normalizeConfig(newConfig)
450
+ configWatcher.emit('change', normalizedNewConfig)
451
+ },
452
+ })
453
+
454
+ // chokidar handler
455
+ this.configWatcherHandle = configWatcherHandle
456
+ }
457
+
433
458
  actionCommand.netlify = {
434
459
  // api methods
435
460
  api: new NetlifyAPI(token || '', apiOpts),
@@ -455,6 +480,8 @@ class BaseCommand extends Command {
455
480
  globalConfig,
456
481
  // state of current site dir
457
482
  state,
483
+ // netlify.toml file watcher
484
+ configWatcher,
458
485
  }
459
486
  debug(`${this.name()}:init`)('end')
460
487
  }
@@ -33,6 +33,7 @@ const {
33
33
  detectServerSettings,
34
34
  error,
35
35
  exit,
36
+ generateNetlifyGraphJWT,
36
37
  getSiteInformation,
37
38
  injectEnvVariables,
38
39
  log,
@@ -262,6 +263,44 @@ const printBanner = ({ url }) => {
262
263
  )
263
264
  }
264
265
 
266
+ const startPollingForAPIAuthentication = async function (options) {
267
+ const { api, command, config, site, siteInfo } = options
268
+ const frequency = 5000
269
+
270
+ const helper = async (maybeSiteData) => {
271
+ const siteData = await (maybeSiteData || api.getSite({ siteId: site.id }))
272
+ const authlifyTokenId = siteData && siteData.authlify_token_id
273
+
274
+ const existingAuthlifyTokenId = config && config.netlifyGraphConfig && config.netlifyGraphConfig.authlifyTokenId
275
+ if (authlifyTokenId && authlifyTokenId !== existingAuthlifyTokenId) {
276
+ const netlifyToken = await command.authenticate()
277
+ // Only inject the authlify config if a token ID exists. This prevents
278
+ // calling command.authenticate() (which opens a browser window) if the
279
+ // user hasn't enabled API Authentication
280
+ const netlifyGraphConfig = {
281
+ netlifyToken,
282
+ authlifyTokenId: siteData.authlify_token_id,
283
+ siteId: site.id,
284
+ }
285
+ config.netlifyGraphConfig = netlifyGraphConfig
286
+
287
+ const netlifyGraphJWT = generateNetlifyGraphJWT(netlifyGraphConfig)
288
+
289
+ if (netlifyGraphJWT != null) {
290
+ // XXX(anmonteiro): this name is deprecated. Delete after 3/31/2022
291
+ process.env.ONEGRAPH_AUTHLIFY_TOKEN = netlifyGraphJWT
292
+ process.env.NETLIFY_GRAPH_TOKEN = netlifyGraphJWT
293
+ }
294
+ } else {
295
+ delete config.netlifyGraphConfig
296
+ }
297
+
298
+ setTimeout(helper, frequency)
299
+ }
300
+
301
+ await helper(siteInfo)
302
+ }
303
+
265
304
  /**
266
305
  * The dev command
267
306
  * @param {import('commander').OptionValues} options
@@ -287,7 +326,6 @@ const dev = async (options, command) => {
287
326
  )
288
327
  }
289
328
 
290
- const startNetlifyGraphWatcher = Boolean(options.graph)
291
329
  await injectEnvVariables({ env: command.netlify.cachedConfig.env, site })
292
330
 
293
331
  const { addonsUrls, capabilities, siteUrl, timeouts } = await getSiteInformation({
@@ -309,11 +347,15 @@ const dev = async (options, command) => {
309
347
 
310
348
  command.setAnalyticsPayload({ projectType: settings.framework || 'custom', live: options.live })
311
349
 
350
+ const startNetlifyGraphWatcher = Boolean(options.graph)
351
+ if (startNetlifyGraphWatcher) {
352
+ startPollingForAPIAuthentication({ api, command, config, site, siteInfo })
353
+ }
354
+
312
355
  await startFunctionsServer({
313
356
  api,
314
357
  command,
315
358
  config,
316
- isGraphEnabled: startNetlifyGraphWatcher,
317
359
  settings,
318
360
  site,
319
361
  siteInfo,
@@ -346,28 +388,44 @@ const dev = async (options, command) => {
346
388
  } else if (startNetlifyGraphWatcher) {
347
389
  const netlifyToken = await command.authenticate()
348
390
  await OneGraphCliClient.ensureAppForSite(netlifyToken, site.id)
349
- const netlifyGraphConfig = await getNetlifyGraphConfig({ command, options, settings })
350
391
 
351
- let graphqlDocument = readGraphQLOperationsSourceFile(netlifyGraphConfig)
392
+ let stopWatchingCLISessions
352
393
 
353
- if (!graphqlDocument || graphqlDocument.trim().length === 0) {
354
- graphqlDocument = defaultExampleOperationsDoc
355
- }
394
+ const createOrResumeSession = async function () {
395
+ const netlifyGraphConfig = await getNetlifyGraphConfig({ command, options, settings })
356
396
 
357
- await startOneGraphCLISession({ netlifyGraphConfig, netlifyToken, site, state })
397
+ let graphqlDocument = readGraphQLOperationsSourceFile(netlifyGraphConfig)
358
398
 
359
- // Should be created by startOneGraphCLISession
360
- const oneGraphSessionId = loadCLISession(state)
399
+ if (!graphqlDocument || graphqlDocument.trim().length === 0) {
400
+ graphqlDocument = defaultExampleOperationsDoc
401
+ }
361
402
 
362
- await persistNewOperationsDocForSession({
363
- netlifyGraphConfig,
364
- netlifyToken,
365
- oneGraphSessionId,
366
- operationsDoc: graphqlDocument,
367
- siteId: site.id,
368
- siteRoot: site.root,
403
+ stopWatchingCLISessions = await startOneGraphCLISession({ netlifyGraphConfig, netlifyToken, site, state })
404
+
405
+ // Should be created by startOneGraphCLISession
406
+ const oneGraphSessionId = loadCLISession(state)
407
+
408
+ await persistNewOperationsDocForSession({
409
+ netlifyGraphConfig,
410
+ netlifyToken,
411
+ oneGraphSessionId,
412
+ operationsDoc: graphqlDocument,
413
+ siteId: site.id,
414
+ siteRoot: site.root,
415
+ })
416
+
417
+ return oneGraphSessionId
418
+ }
419
+
420
+ //
421
+ // Set up a handler for config changes.
422
+ command.netlify.configWatcher.on('change', (newConfig) => {
423
+ command.netlify.config = newConfig
424
+ stopWatchingCLISessions()
425
+ createOrResumeSession()
369
426
  })
370
427
 
428
+ const oneGraphSessionId = await createOrResumeSession()
371
429
  const cleanupSession = () => markCliSessionInactive({ netlifyToken, sessionId: oneGraphSessionId, siteId: site.id })
372
430
 
373
431
  cleanupWork.push(cleanupSession)
@@ -39,8 +39,8 @@ const graphHandler = async (userOperationName, options, command) => {
39
39
  error(`Failed to parse Netlify GraphQL schema`)
40
40
  }
41
41
 
42
- let operationName
43
- if (!userOperationName) {
42
+ let operationName = userOperationName
43
+ if (!operationName) {
44
44
  try {
45
45
  let currentOperationsDoc = readGraphQLOperationsSourceFile(netlifyGraphConfig)
46
46
  if (currentOperationsDoc.trim().length === 0) {
@@ -15,6 +15,6 @@
15
15
  "author": "Netlify",
16
16
  "license": "MIT",
17
17
  "dependencies": {
18
- "@netlify/functions": "^0.11.0"
18
+ "@netlify/functions": "^1.0.0"
19
19
  }
20
20
  }
@@ -9,15 +9,15 @@
9
9
  "version": "1.0.0",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
- "@netlify/functions": "^0.11.0",
13
- "@types/node": "^14.18.11",
12
+ "@netlify/functions": "^1.0.0",
13
+ "@types/node": "^14.0.0",
14
14
  "typescript": "^4.0.0"
15
15
  }
16
16
  },
17
17
  "node_modules/@netlify/functions": {
18
- "version": "0.11.0",
19
- "resolved": "https://registry.npmjs.org/@netlify/functions/-/functions-0.11.0.tgz",
20
- "integrity": "sha512-+WWX081UCkLZYkfh1Ru+PH5HTujNXugeskATGhZLTyS1U3Cqh2gYLArdG1a/vU8WWopu/wjpxEOdWq8/T5Nw5Q==",
18
+ "version": "1.0.0",
19
+ "resolved": "https://registry.npmjs.org/@netlify/functions/-/functions-1.0.0.tgz",
20
+ "integrity": "sha512-7fnJv3vr8uyyyOYPChwoec6MjzsCw1CoRUO2DhQ1BD6bOyJRlD4DUaOOGlMILB2LCT8P24p5LexEGx8AJb7xdA==",
21
21
  "dependencies": {
22
22
  "is-promise": "^4.0.0"
23
23
  },
@@ -50,9 +50,9 @@
50
50
  },
51
51
  "dependencies": {
52
52
  "@netlify/functions": {
53
- "version": "0.11.0",
54
- "resolved": "https://registry.npmjs.org/@netlify/functions/-/functions-0.11.0.tgz",
55
- "integrity": "sha512-+WWX081UCkLZYkfh1Ru+PH5HTujNXugeskATGhZLTyS1U3Cqh2gYLArdG1a/vU8WWopu/wjpxEOdWq8/T5Nw5Q==",
53
+ "version": "1.0.0",
54
+ "resolved": "https://registry.npmjs.org/@netlify/functions/-/functions-1.0.0.tgz",
55
+ "integrity": "sha512-7fnJv3vr8uyyyOYPChwoec6MjzsCw1CoRUO2DhQ1BD6bOyJRlD4DUaOOGlMILB2LCT8P24p5LexEGx8AJb7xdA==",
56
56
  "requires": {
57
57
  "is-promise": "^4.0.0"
58
58
  }
@@ -14,7 +14,7 @@
14
14
  "author": "Netlify",
15
15
  "license": "MIT",
16
16
  "dependencies": {
17
- "@netlify/functions": "^0.11.0",
17
+ "@netlify/functions": "^1.0.0",
18
18
  "@types/node": "^14.0.0",
19
19
  "typescript": "^4.0.0"
20
20
  }
@@ -15,7 +15,7 @@
15
15
  "author": "Netlify",
16
16
  "license": "MIT",
17
17
  "dependencies": {
18
- "@netlify/functions": "^0.11.0",
18
+ "@netlify/functions": "^1.0.0",
19
19
  "@types/node": "^14.18.9",
20
20
  "typescript": "^4.5.5"
21
21
  }
@@ -5,12 +5,11 @@ const { env } = require('process')
5
5
 
6
6
  const terminalLink = require('terminal-link')
7
7
 
8
- const { NETLIFYDEVERR, NETLIFYDEVLOG, NETLIFYDEVWARN, chalk, log, warn } = require('../../utils')
8
+ const { NETLIFYDEVERR, NETLIFYDEVLOG, NETLIFYDEVWARN, chalk, log, warn, watchDebounced } = require('../../utils')
9
9
  const { getLogMessage } = require('../log')
10
10
 
11
11
  const { NetlifyFunction } = require('./netlify-function')
12
12
  const runtimes = require('./runtimes')
13
- const { watchDebounced } = require('./watcher')
14
13
 
15
14
  const ZIP_EXTENSION = '.zip'
16
15
 
@@ -1,6 +1,4 @@
1
1
  // @ts-check
2
- const process = require('process')
3
-
4
2
  const jwtDecode = require('jwt-decode')
5
3
 
6
4
  const {
@@ -47,51 +45,9 @@ const buildClientContext = function (headers) {
47
45
  }
48
46
  }
49
47
 
50
- const startPollingForAPIAuthentication = async function (options) {
51
- const { api, command, config, site, siteInfo } = options
52
- const frequency = 5000
53
-
54
- const helper = async (maybeSiteData) => {
55
- const siteData = await (maybeSiteData || api.getSite({ siteId: site.id }))
56
- const authlifyTokenId = siteData && siteData.authlify_token_id
57
-
58
- const existingAuthlifyTokenId = config && config.netlifyGraphConfig && config.netlifyGraphConfig.authlifyTokenId
59
- if (authlifyTokenId && authlifyTokenId !== existingAuthlifyTokenId) {
60
- const netlifyToken = await command.authenticate()
61
- // Only inject the authlify config if a token ID exists. This prevents
62
- // calling command.authenticate() (which opens a browser window) if the
63
- // user hasn't enabled API Authentication
64
- const netlifyGraphConfig = {
65
- netlifyToken,
66
- authlifyTokenId: siteData.authlify_token_id,
67
- siteId: site.id,
68
- }
69
- config.netlifyGraphConfig = netlifyGraphConfig
70
-
71
- const netlifyGraphJWT = generateNetlifyGraphJWT(netlifyGraphConfig)
72
-
73
- if (netlifyGraphJWT != null) {
74
- // XXX(anmonteiro): this name is deprecated. Delete after 3/31/2022
75
- process.env.ONEGRAPH_AUTHLIFY_TOKEN = netlifyGraphJWT
76
- process.env.NETLIFY_GRAPH_TOKEN = netlifyGraphJWT
77
- }
78
- } else {
79
- delete config.authlify
80
- }
81
-
82
- setTimeout(helper, frequency)
83
- }
84
-
85
- await helper(siteInfo)
86
- }
87
-
88
48
  const createHandler = function (options) {
89
49
  const { config, functionsRegistry } = options
90
50
 
91
- if (options.isGraphEnabled) {
92
- startPollingForAPIAuthentication(options)
93
- }
94
-
95
51
  return async function handler(request, response) {
96
52
  // handle proxies without path re-writes (http-servr)
97
53
  const cleanPath = request.path.replace(/^\/.netlify\/(functions|builders)/, '')
@@ -152,7 +108,7 @@ const createHandler = function (options) {
152
108
  rawQuery,
153
109
  }
154
110
 
155
- if (config && config.authlify && config.authlify.authlifyTokenId != null) {
111
+ if (config && config.netlifyGraphConfig && config.netlifyGraphConfig.authlifyTokenId != null) {
156
112
  // XXX(anmonteiro): this name is deprecated. Delete after 3/31/2022
157
113
  const jwt = generateNetlifyGraphJWT(config.netlifyGraphConfig)
158
114
  event.authlifyToken = jwt
@@ -10,8 +10,7 @@ const { GraphQL, InternalConsole, OneGraphClient } = require('netlify-onegraph-i
10
10
  const { NetlifyGraph } = require('netlify-onegraph-internal')
11
11
 
12
12
  // eslint-disable-next-line no-unused-vars
13
- const { StateConfig, USER_AGENT, chalk, error, log, warn } = require('../../utils')
14
- const { watchDebounced } = require('../functions/watcher')
13
+ const { StateConfig, USER_AGENT, chalk, error, log, warn, watchDebounced } = require('../../utils')
15
14
 
16
15
  const {
17
16
  generateFunctionsFile,
@@ -114,7 +113,7 @@ const monitorCLISessionEvents = (input) => {
114
113
  const helper = async () => {
115
114
  if (shouldClose) {
116
115
  clearTimeout(handle)
117
- onClose()
116
+ onClose && onClose()
118
117
  }
119
118
 
120
119
  const next = await OneGraphClient.fetchCliSessionEvents({ appId, authToken: netlifyToken, sessionId })
@@ -465,7 +464,7 @@ const startOneGraphCLISession = async (input) => {
465
464
  const enabledServices = []
466
465
  const schema = await OneGraphClient.fetchOneGraphSchema(site.id, enabledServices)
467
466
 
468
- monitorOperationFile({
467
+ const opsFileWatcher = monitorOperationFile({
469
468
  netlifyGraphConfig,
470
469
  onChange: async (filePath) => {
471
470
  log('NetlifyGraph operation file changed at', filePath, 'updating function library...')
@@ -495,7 +494,7 @@ const startOneGraphCLISession = async (input) => {
495
494
  },
496
495
  })
497
496
 
498
- monitorCLISessionEvents({
497
+ const cliEventsCloseFn = monitorCLISessionEvents({
499
498
  appId: site.id,
500
499
  netlifyToken,
501
500
  netlifyGraphConfig,
@@ -514,10 +513,13 @@ const startOneGraphCLISession = async (input) => {
514
513
  onError: (fetchEventError) => {
515
514
  error(`Netlify Graph upstream error: ${fetchEventError}`)
516
515
  },
517
- onClose: () => {
518
- log('Netlify Graph upstream closed')
519
- },
520
516
  })
517
+
518
+ return async function unregisterWatchers() {
519
+ const watcher = await opsFileWatcher
520
+ watcher.close()
521
+ cliEventsCloseFn()
522
+ }
521
523
  }
522
524
 
523
525
  /**
@@ -217,8 +217,7 @@ const getNetlifyGraphConfig = async ({ command, options, settings }) => {
217
217
  const moduleType =
218
218
  (userSpecifiedConfig.moduleType && userSpecifiedConfig.moduleType.split(path.sep)) ||
219
219
  defaultFrameworkConfig.moduleType
220
- const language =
221
- (userSpecifiedConfig.language && userSpecifiedConfig.language.split(path.sep)) || autodetectedLanguage
220
+ const language = userSpecifiedConfig.language || autodetectedLanguage
222
221
  const webhookBasePath =
223
222
  (userSpecifiedConfig.webhookBasePath && userSpecifiedConfig.webhookBasePath.split(path.sep)) ||
224
223
  defaultFrameworkConfig.webhookBasePath
@@ -4,8 +4,12 @@ const process = require('process')
4
4
  const { format, inspect } = require('util')
5
5
 
6
6
  const { Instance: ChalkInstance } = require('chalk')
7
+ const chokidar = require('chokidar')
8
+ const decache = require('decache')
7
9
  const WSL = require('is-wsl')
10
+ const debounce = require('lodash/debounce')
8
11
  const { default: omit } = require('omit.js')
12
+ const pEvent = require('p-event')
9
13
 
10
14
  const { name, version } = require('../../package.json')
11
15
  const { clearSpinner, startSpinner } = require('../lib/spinner')
@@ -198,6 +202,34 @@ const normalizeConfig = (config) =>
198
202
  ? { ...config, build: omit(config.build, ['publish', 'publishOrigin']) }
199
203
  : config
200
204
 
205
+ const DEBOUNCE_WAIT = 100
206
+
207
+ const watchDebounced = async (target, { depth, onAdd = () => {}, onChange = () => {}, onUnlink = () => {} }) => {
208
+ const watcher = chokidar.watch(target, { depth, ignored: /node_modules/, ignoreInitial: true })
209
+
210
+ await pEvent(watcher, 'ready')
211
+
212
+ const debouncedOnChange = debounce(onChange, DEBOUNCE_WAIT)
213
+ const debouncedOnUnlink = debounce(onUnlink, DEBOUNCE_WAIT)
214
+ const debouncedOnAdd = debounce(onAdd, DEBOUNCE_WAIT)
215
+
216
+ watcher
217
+ .on('change', (path) => {
218
+ decache(path)
219
+ debouncedOnChange(path)
220
+ })
221
+ .on('unlink', (path) => {
222
+ decache(path)
223
+ debouncedOnUnlink(path)
224
+ })
225
+ .on('add', (path) => {
226
+ decache(path)
227
+ debouncedOnAdd(path)
228
+ })
229
+
230
+ return watcher
231
+ }
232
+
201
233
  module.exports = {
202
234
  BANG,
203
235
  chalk,
@@ -217,4 +249,5 @@ module.exports = {
217
249
  sortOptions,
218
250
  USER_AGENT,
219
251
  warn,
252
+ watchDebounced,
220
253
  }
@@ -1,35 +0,0 @@
1
- // @ts-check
2
- const chokidar = require('chokidar')
3
- const decache = require('decache')
4
- const debounce = require('lodash/debounce')
5
- const pEvent = require('p-event')
6
-
7
- const DEBOUNCE_WAIT = 100
8
-
9
- const watchDebounced = async (target, { depth, onAdd = () => {}, onChange = () => {}, onUnlink = () => {} }) => {
10
- const watcher = chokidar.watch(target, { depth, ignored: /node_modules/, ignoreInitial: true })
11
-
12
- await pEvent(watcher, 'ready')
13
-
14
- const debouncedOnChange = debounce(onChange, DEBOUNCE_WAIT)
15
- const debouncedOnUnlink = debounce(onUnlink, DEBOUNCE_WAIT)
16
- const debouncedOnAdd = debounce(onAdd, DEBOUNCE_WAIT)
17
-
18
- watcher
19
- .on('change', (path) => {
20
- decache(path)
21
- debouncedOnChange(path)
22
- })
23
- .on('unlink', (path) => {
24
- decache(path)
25
- debouncedOnUnlink(path)
26
- })
27
- .on('add', (path) => {
28
- decache(path)
29
- debouncedOnAdd(path)
30
- })
31
-
32
- return watcher
33
- }
34
-
35
- module.exports = { watchDebounced }