netlify-cli 8.17.1 → 8.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -203,6 +203,7 @@ Handle various site operations
203
203
  | Subcommand | description |
204
204
  |:--------------------------- |:-----|
205
205
  | [`sites:create`](/docs/commands/sites.md#sitescreate) | Create an empty site (advanced) |
206
+ | [`sites:create-template`](/docs/commands/sites.md#sitescreate-template) | (Beta) Create a site from a starter template |
206
207
  | [`sites:delete`](/docs/commands/sites.md#sitesdelete) | Delete a site |
207
208
  | [`sites:list`](/docs/commands/sites.md#siteslist) | List all sites you have access to |
208
209
 
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "netlify-cli",
3
- "version": "8.17.1",
3
+ "version": "8.18.0",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "netlify-cli",
9
- "version": "8.17.1",
9
+ "version": "8.18.0",
10
10
  "hasInstallScript": true,
11
11
  "license": "MIT",
12
12
  "dependencies": {
@@ -14,10 +14,10 @@
14
14
  "@netlify/config": "^17.0.6",
15
15
  "@netlify/framework-info": "^9.0.0",
16
16
  "@netlify/local-functions-proxy": "^1.1.1",
17
- "@netlify/plugin-edge-handlers": "^3.0.4",
18
- "@netlify/plugins-list": "^6.7.0",
17
+ "@netlify/plugin-edge-handlers": "^3.0.5",
18
+ "@netlify/plugins-list": "^6.8.0",
19
19
  "@netlify/routing-local-proxy": "^0.34.1",
20
- "@netlify/zip-it-and-ship-it": "^5.5.2",
20
+ "@netlify/zip-it-and-ship-it": "^5.6.0",
21
21
  "@octokit/rest": "^18.0.0",
22
22
  "@sindresorhus/slugify": "^1.1.0",
23
23
  "ansi-escapes": "^5.0.0",
@@ -31,7 +31,7 @@
31
31
  "chokidar": "^3.0.2",
32
32
  "ci-info": "^3.0.0",
33
33
  "clean-deep": "^3.0.2",
34
- "commander": "^8.3.0",
34
+ "commander": "^9.0.0",
35
35
  "concordance": "^5.0.0",
36
36
  "configstore": "^5.0.0",
37
37
  "content-type": "^1.0.4",
@@ -83,7 +83,7 @@
83
83
  "netlify": "^10.1.2",
84
84
  "netlify-headers-parser": "^6.0.1",
85
85
  "netlify-onegraph-internal": "0.0.18",
86
- "netlify-redirect-parser": "^13.0.1",
86
+ "netlify-redirect-parser": "^13.0.2",
87
87
  "netlify-redirector": "^0.2.1",
88
88
  "node-fetch": "^2.6.0",
89
89
  "node-version-alias": "^1.0.1",
@@ -125,7 +125,7 @@
125
125
  },
126
126
  "devDependencies": {
127
127
  "@babel/preset-react": "^7.12.13",
128
- "@netlify/eslint-config-node": "^5.1.2",
128
+ "@netlify/eslint-config-node": "^5.1.4",
129
129
  "ava": "^4.0.0",
130
130
  "c8": "^7.11.0",
131
131
  "eslint-plugin-sort-destructure-keys": "^1.3.5",
@@ -2407,6 +2407,79 @@
2407
2407
  "node": "^12.20.0 || ^14.14.0 || >=16.0.0"
2408
2408
  }
2409
2409
  },
2410
+ "node_modules/@netlify/build/node_modules/@babel/parser": {
2411
+ "version": "7.16.8",
2412
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz",
2413
+ "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==",
2414
+ "bin": {
2415
+ "parser": "bin/babel-parser.js"
2416
+ },
2417
+ "engines": {
2418
+ "node": ">=6.0.0"
2419
+ }
2420
+ },
2421
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it": {
2422
+ "version": "5.5.2",
2423
+ "resolved": "https://registry.npmjs.org/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-5.5.2.tgz",
2424
+ "integrity": "sha512-5uBfXHYarfNeOxrW7JK4rJaq1Xk2be0Ogt/MvLDr0kuKPtPmfHyNrWmr9JlZ1qtR/SuV1t2x22Tj/mxecL8eIQ==",
2425
+ "dependencies": {
2426
+ "@babel/parser": "7.16.8",
2427
+ "@netlify/esbuild": "^0.13.6",
2428
+ "@vercel/nft": "^0.17.0",
2429
+ "archiver": "^5.3.0",
2430
+ "common-path-prefix": "^3.0.0",
2431
+ "cp-file": "^9.0.0",
2432
+ "del": "^6.0.0",
2433
+ "elf-cam": "^0.1.1",
2434
+ "end-of-stream": "^1.4.4",
2435
+ "es-module-lexer": "^0.9.0",
2436
+ "execa": "^5.0.0",
2437
+ "filter-obj": "^2.0.1",
2438
+ "find-up": "^5.0.0",
2439
+ "glob": "^7.1.6",
2440
+ "is-builtin-module": "^3.1.0",
2441
+ "junk": "^3.1.0",
2442
+ "locate-path": "^6.0.0",
2443
+ "merge-options": "^3.0.4",
2444
+ "minimatch": "^3.0.4",
2445
+ "p-map": "^4.0.0",
2446
+ "path-exists": "^4.0.0",
2447
+ "pkg-dir": "^5.0.0",
2448
+ "precinct": "^8.2.0",
2449
+ "read-package-json-fast": "^2.0.2",
2450
+ "require-package-name": "^2.0.1",
2451
+ "resolve": "^2.0.0-next.1",
2452
+ "semver": "^7.0.0",
2453
+ "tmp-promise": "^3.0.2",
2454
+ "toml": "^3.0.0",
2455
+ "typescript": "^4.4.3",
2456
+ "unixify": "^1.0.0",
2457
+ "yargs": "^16.0.0"
2458
+ },
2459
+ "bin": {
2460
+ "zip-it-and-ship-it": "dist/bin.js"
2461
+ },
2462
+ "engines": {
2463
+ "node": "^12.20.0 || ^14.14.0 || >=16.0.0"
2464
+ }
2465
+ },
2466
+ "node_modules/@netlify/build/node_modules/@netlify/zip-it-and-ship-it/node_modules/yargs": {
2467
+ "version": "16.2.0",
2468
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
2469
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
2470
+ "dependencies": {
2471
+ "cliui": "^7.0.2",
2472
+ "escalade": "^3.1.1",
2473
+ "get-caller-file": "^2.0.5",
2474
+ "require-directory": "^2.1.1",
2475
+ "string-width": "^4.2.0",
2476
+ "y18n": "^5.0.5",
2477
+ "yargs-parser": "^20.2.2"
2478
+ },
2479
+ "engines": {
2480
+ "node": ">=10"
2481
+ }
2482
+ },
2410
2483
  "node_modules/@netlify/build/node_modules/@sindresorhus/is": {
2411
2484
  "version": "2.1.1",
2412
2485
  "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.1.tgz",
@@ -2596,9 +2669,9 @@
2596
2669
  }
2597
2670
  },
2598
2671
  "node_modules/@netlify/eslint-config-node": {
2599
- "version": "5.1.2",
2600
- "resolved": "https://registry.npmjs.org/@netlify/eslint-config-node/-/eslint-config-node-5.1.2.tgz",
2601
- "integrity": "sha512-dPTL3kK31JVQtQGko3ASfQ34rSjFe+qqhXGzT0OqxYt4U0MJIBNCXMm/JtupvOU8z7+EiA1Z8ilH8MTvvNrL+g==",
2672
+ "version": "5.1.4",
2673
+ "resolved": "https://registry.npmjs.org/@netlify/eslint-config-node/-/eslint-config-node-5.1.4.tgz",
2674
+ "integrity": "sha512-T/X/T9vucUTrDZMFxqiH6sEMPK1vIJqQQo4tliL2N1g82erRNefZ3k2VS4g0SurWOJPl5Jn8qDgSUTmGCPIHNQ==",
2602
2675
  "dev": true,
2603
2676
  "dependencies": {
2604
2677
  "@babel/core": "^7.13.8",
@@ -2625,7 +2698,7 @@
2625
2698
  "eslint-plugin-react": "^7.21.5",
2626
2699
  "eslint-plugin-unicorn": "^40.0.0",
2627
2700
  "eslint-plugin-you-dont-need-lodash-underscore": "^6.10.0",
2628
- "execa": "^5.0.0",
2701
+ "execa": "^6.0.0",
2629
2702
  "husky": "^7.0.4",
2630
2703
  "is-ci": "^3.0.0",
2631
2704
  "npm-run-all": "^4.1.5",
@@ -2641,6 +2714,116 @@
2641
2714
  "node": ">=16.0.0"
2642
2715
  }
2643
2716
  },
2717
+ "node_modules/@netlify/eslint-config-node/node_modules/execa": {
2718
+ "version": "6.0.0",
2719
+ "resolved": "https://registry.npmjs.org/execa/-/execa-6.0.0.tgz",
2720
+ "integrity": "sha512-m4wU9j4Z9nXXoqT8RSfl28JSwmMNLFF69OON8H/lL3NeU0tNpGz313bcOfYoBBHokB0dC2tMl3VUcKgHELhL2Q==",
2721
+ "dev": true,
2722
+ "dependencies": {
2723
+ "cross-spawn": "^7.0.3",
2724
+ "get-stream": "^6.0.1",
2725
+ "human-signals": "^3.0.1",
2726
+ "is-stream": "^3.0.0",
2727
+ "merge-stream": "^2.0.0",
2728
+ "npm-run-path": "^5.0.1",
2729
+ "onetime": "^6.0.0",
2730
+ "signal-exit": "^3.0.5",
2731
+ "strip-final-newline": "^3.0.0"
2732
+ },
2733
+ "engines": {
2734
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
2735
+ },
2736
+ "funding": {
2737
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
2738
+ }
2739
+ },
2740
+ "node_modules/@netlify/eslint-config-node/node_modules/human-signals": {
2741
+ "version": "3.0.1",
2742
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz",
2743
+ "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==",
2744
+ "dev": true,
2745
+ "engines": {
2746
+ "node": ">=12.20.0"
2747
+ }
2748
+ },
2749
+ "node_modules/@netlify/eslint-config-node/node_modules/is-stream": {
2750
+ "version": "3.0.0",
2751
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
2752
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
2753
+ "dev": true,
2754
+ "engines": {
2755
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
2756
+ },
2757
+ "funding": {
2758
+ "url": "https://github.com/sponsors/sindresorhus"
2759
+ }
2760
+ },
2761
+ "node_modules/@netlify/eslint-config-node/node_modules/mimic-fn": {
2762
+ "version": "4.0.0",
2763
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
2764
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
2765
+ "dev": true,
2766
+ "engines": {
2767
+ "node": ">=12"
2768
+ },
2769
+ "funding": {
2770
+ "url": "https://github.com/sponsors/sindresorhus"
2771
+ }
2772
+ },
2773
+ "node_modules/@netlify/eslint-config-node/node_modules/npm-run-path": {
2774
+ "version": "5.0.1",
2775
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.0.1.tgz",
2776
+ "integrity": "sha512-ybBJQUSyFwEEhqO2lXmyKOl9ucHtyZBWVM0h0FiMfT/+WKxCUZFa95qAR2X3w/w6oigN3B0b2UNHZbD+kdfD5w==",
2777
+ "dev": true,
2778
+ "dependencies": {
2779
+ "path-key": "^4.0.0"
2780
+ },
2781
+ "engines": {
2782
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
2783
+ },
2784
+ "funding": {
2785
+ "url": "https://github.com/sponsors/sindresorhus"
2786
+ }
2787
+ },
2788
+ "node_modules/@netlify/eslint-config-node/node_modules/onetime": {
2789
+ "version": "6.0.0",
2790
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
2791
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
2792
+ "dev": true,
2793
+ "dependencies": {
2794
+ "mimic-fn": "^4.0.0"
2795
+ },
2796
+ "engines": {
2797
+ "node": ">=12"
2798
+ },
2799
+ "funding": {
2800
+ "url": "https://github.com/sponsors/sindresorhus"
2801
+ }
2802
+ },
2803
+ "node_modules/@netlify/eslint-config-node/node_modules/path-key": {
2804
+ "version": "4.0.0",
2805
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
2806
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
2807
+ "dev": true,
2808
+ "engines": {
2809
+ "node": ">=12"
2810
+ },
2811
+ "funding": {
2812
+ "url": "https://github.com/sponsors/sindresorhus"
2813
+ }
2814
+ },
2815
+ "node_modules/@netlify/eslint-config-node/node_modules/strip-final-newline": {
2816
+ "version": "3.0.0",
2817
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
2818
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
2819
+ "dev": true,
2820
+ "engines": {
2821
+ "node": ">=12"
2822
+ },
2823
+ "funding": {
2824
+ "url": "https://github.com/sponsors/sindresorhus"
2825
+ }
2826
+ },
2644
2827
  "node_modules/@netlify/framework-info": {
2645
2828
  "version": "9.0.0",
2646
2829
  "resolved": "https://registry.npmjs.org/@netlify/framework-info/-/framework-info-9.0.0.tgz",
@@ -2692,6 +2875,79 @@
2692
2875
  "node": "^12.20.0 || ^14.14.0 || >=16.0.0"
2693
2876
  }
2694
2877
  },
2878
+ "node_modules/@netlify/functions-utils/node_modules/@babel/parser": {
2879
+ "version": "7.16.8",
2880
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz",
2881
+ "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==",
2882
+ "bin": {
2883
+ "parser": "bin/babel-parser.js"
2884
+ },
2885
+ "engines": {
2886
+ "node": ">=6.0.0"
2887
+ }
2888
+ },
2889
+ "node_modules/@netlify/functions-utils/node_modules/@netlify/zip-it-and-ship-it": {
2890
+ "version": "5.5.2",
2891
+ "resolved": "https://registry.npmjs.org/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-5.5.2.tgz",
2892
+ "integrity": "sha512-5uBfXHYarfNeOxrW7JK4rJaq1Xk2be0Ogt/MvLDr0kuKPtPmfHyNrWmr9JlZ1qtR/SuV1t2x22Tj/mxecL8eIQ==",
2893
+ "dependencies": {
2894
+ "@babel/parser": "7.16.8",
2895
+ "@netlify/esbuild": "^0.13.6",
2896
+ "@vercel/nft": "^0.17.0",
2897
+ "archiver": "^5.3.0",
2898
+ "common-path-prefix": "^3.0.0",
2899
+ "cp-file": "^9.0.0",
2900
+ "del": "^6.0.0",
2901
+ "elf-cam": "^0.1.1",
2902
+ "end-of-stream": "^1.4.4",
2903
+ "es-module-lexer": "^0.9.0",
2904
+ "execa": "^5.0.0",
2905
+ "filter-obj": "^2.0.1",
2906
+ "find-up": "^5.0.0",
2907
+ "glob": "^7.1.6",
2908
+ "is-builtin-module": "^3.1.0",
2909
+ "junk": "^3.1.0",
2910
+ "locate-path": "^6.0.0",
2911
+ "merge-options": "^3.0.4",
2912
+ "minimatch": "^3.0.4",
2913
+ "p-map": "^4.0.0",
2914
+ "path-exists": "^4.0.0",
2915
+ "pkg-dir": "^5.0.0",
2916
+ "precinct": "^8.2.0",
2917
+ "read-package-json-fast": "^2.0.2",
2918
+ "require-package-name": "^2.0.1",
2919
+ "resolve": "^2.0.0-next.1",
2920
+ "semver": "^7.0.0",
2921
+ "tmp-promise": "^3.0.2",
2922
+ "toml": "^3.0.0",
2923
+ "typescript": "^4.4.3",
2924
+ "unixify": "^1.0.0",
2925
+ "yargs": "^16.0.0"
2926
+ },
2927
+ "bin": {
2928
+ "zip-it-and-ship-it": "dist/bin.js"
2929
+ },
2930
+ "engines": {
2931
+ "node": "^12.20.0 || ^14.14.0 || >=16.0.0"
2932
+ }
2933
+ },
2934
+ "node_modules/@netlify/functions-utils/node_modules/yargs": {
2935
+ "version": "16.2.0",
2936
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
2937
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
2938
+ "dependencies": {
2939
+ "cliui": "^7.0.2",
2940
+ "escalade": "^3.1.1",
2941
+ "get-caller-file": "^2.0.5",
2942
+ "require-directory": "^2.1.1",
2943
+ "string-width": "^4.2.0",
2944
+ "y18n": "^5.0.5",
2945
+ "yargs-parser": "^20.2.2"
2946
+ },
2947
+ "engines": {
2948
+ "node": ">=10"
2949
+ }
2950
+ },
2695
2951
  "node_modules/@netlify/git-utils": {
2696
2952
  "version": "4.1.0",
2697
2953
  "resolved": "https://registry.npmjs.org/@netlify/git-utils/-/git-utils-4.1.0.tgz",
@@ -2912,9 +3168,9 @@
2912
3168
  "integrity": "sha512-lfNB/QYDgaP07pwm/nWEaWPvRAAGyhxvJqNzvxMijc7A4uwquMjlbYve8yYyd0LJXPwgBpGobwiQj5RA76xzUQ=="
2913
3169
  },
2914
3170
  "node_modules/@netlify/plugin-edge-handlers": {
2915
- "version": "3.0.4",
2916
- "resolved": "https://registry.npmjs.org/@netlify/plugin-edge-handlers/-/plugin-edge-handlers-3.0.4.tgz",
2917
- "integrity": "sha512-w6PkvBSsmVblPBj1QVwUDJALuYeD8SyD5YMrTF5c9XrR7tjAWqtJQcw8bsuYqdDr8sEwRjUNyydPd/Zt5kEBLA==",
3171
+ "version": "3.0.5",
3172
+ "resolved": "https://registry.npmjs.org/@netlify/plugin-edge-handlers/-/plugin-edge-handlers-3.0.5.tgz",
3173
+ "integrity": "sha512-2o1kXxCrRpYKyzsRobdPqlxWZpgznO1a6e+gOsWP/p2b2NDwO/dCCkLPJk1rKZdRgE3x8fVqGOcyYx5RlxaWVg==",
2918
3174
  "dependencies": {
2919
3175
  "@babel/core": "^7.11.4",
2920
3176
  "@babel/preset-env": "^7.11.5",
@@ -2940,9 +3196,9 @@
2940
3196
  }
2941
3197
  },
2942
3198
  "node_modules/@netlify/plugins-list": {
2943
- "version": "6.7.0",
2944
- "resolved": "https://registry.npmjs.org/@netlify/plugins-list/-/plugins-list-6.7.0.tgz",
2945
- "integrity": "sha512-5+KKvsfg+lWiwQddLCNPv7pL1CiwKIT0M1GE8RuIokAq8DE+c8Ug2PC7seslRM5C5gGQiv60MfCpiFuwY6diQg==",
3199
+ "version": "6.8.0",
3200
+ "resolved": "https://registry.npmjs.org/@netlify/plugins-list/-/plugins-list-6.8.0.tgz",
3201
+ "integrity": "sha512-OwetjqXxuESgZ7ardoz07jU0xbiVl+TA+LCGU38qu0DhegyOW5tA8LIW6hxOZ/3eW+fGbNJUj0fYo3JUJLoGzg==",
2946
3202
  "engines": {
2947
3203
  "node": "^12.20.0 || ^14.14.0 || >=16.0.0"
2948
3204
  }
@@ -3018,9 +3274,9 @@
3018
3274
  }
3019
3275
  },
3020
3276
  "node_modules/@netlify/zip-it-and-ship-it": {
3021
- "version": "5.5.2",
3022
- "resolved": "https://registry.npmjs.org/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-5.5.2.tgz",
3023
- "integrity": "sha512-5uBfXHYarfNeOxrW7JK4rJaq1Xk2be0Ogt/MvLDr0kuKPtPmfHyNrWmr9JlZ1qtR/SuV1t2x22Tj/mxecL8eIQ==",
3277
+ "version": "5.6.0",
3278
+ "resolved": "https://registry.npmjs.org/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-5.6.0.tgz",
3279
+ "integrity": "sha512-NtkY5/HKB8toLVaDnizx6AQUr+Q6fNHiczQRjmM+8Xdur7BgS4sqXsiE9OKXhqAHOEhNQV9g4MCoIvHQyTbNSw==",
3024
3280
  "dependencies": {
3025
3281
  "@babel/parser": "7.16.8",
3026
3282
  "@netlify/esbuild": "^0.13.6",
@@ -6478,11 +6734,11 @@
6478
6734
  }
6479
6735
  },
6480
6736
  "node_modules/commander": {
6481
- "version": "8.3.0",
6482
- "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
6483
- "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
6737
+ "version": "9.0.0",
6738
+ "resolved": "https://registry.npmjs.org/commander/-/commander-9.0.0.tgz",
6739
+ "integrity": "sha512-JJfP2saEKbQqvW+FI93OYUB4ByV5cizMpFMiiJI8xDbBvQvSkIk0VvQdn1CZ8mqAO8Loq2h0gYTYtDFUZUeERw==",
6484
6740
  "engines": {
6485
- "node": ">= 12"
6741
+ "node": "^12.20.0 || >=14"
6486
6742
  }
6487
6743
  },
6488
6744
  "node_modules/common-path-prefix": {
@@ -13666,6 +13922,14 @@
13666
13922
  "node": ">=6"
13667
13923
  }
13668
13924
  },
13925
+ "node_modules/lambda-local/node_modules/commander": {
13926
+ "version": "8.3.0",
13927
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
13928
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
13929
+ "engines": {
13930
+ "node": ">= 12"
13931
+ }
13932
+ },
13669
13933
  "node_modules/latest-version": {
13670
13934
  "version": "5.1.0",
13671
13935
  "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
@@ -15430,19 +15694,49 @@
15430
15694
  }
15431
15695
  },
15432
15696
  "node_modules/netlify-redirect-parser": {
15433
- "version": "13.0.1",
15434
- "resolved": "https://registry.npmjs.org/netlify-redirect-parser/-/netlify-redirect-parser-13.0.1.tgz",
15435
- "integrity": "sha512-TnEafRUQajzpe9s/k5eHjpcIOPydumS2DCxaf+ltnNBSk4KGkphy5srvQdm16YADeTtcnsQ4NQjnjm7VAu+oHg==",
15697
+ "version": "13.0.2",
15698
+ "resolved": "https://registry.npmjs.org/netlify-redirect-parser/-/netlify-redirect-parser-13.0.2.tgz",
15699
+ "integrity": "sha512-mrPx+pSaPv3HCJzCcAsQikNaa1/3gIe6NwOCd7qUAej9g8iiy0P2D4X0AGTPgqbbGz4xZN1azier46S8QIdn+A==",
15436
15700
  "dependencies": {
15437
- "filter-obj": "^2.0.2",
15438
- "is-plain-obj": "^3.0.0",
15439
- "path-exists": "^4.0.0",
15701
+ "filter-obj": "^3.0.0",
15702
+ "is-plain-obj": "^4.0.0",
15703
+ "path-exists": "^5.0.0",
15440
15704
  "toml": "^3.0.0"
15441
15705
  },
15442
15706
  "engines": {
15443
15707
  "node": "^12.20.0 || ^14.14.0 || >=16.0.0"
15444
15708
  }
15445
15709
  },
15710
+ "node_modules/netlify-redirect-parser/node_modules/filter-obj": {
15711
+ "version": "3.0.0",
15712
+ "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-3.0.0.tgz",
15713
+ "integrity": "sha512-oQZM+QmVni8MsYzcq9lgTHD/qeLqaG8XaOPOW7dzuSafVxSUlH1+1ZDefj2OD9f2XsmG5lFl2Euc9NI4jgwFWg==",
15714
+ "engines": {
15715
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
15716
+ },
15717
+ "funding": {
15718
+ "url": "https://github.com/sponsors/sindresorhus"
15719
+ }
15720
+ },
15721
+ "node_modules/netlify-redirect-parser/node_modules/is-plain-obj": {
15722
+ "version": "4.0.0",
15723
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.0.0.tgz",
15724
+ "integrity": "sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw==",
15725
+ "engines": {
15726
+ "node": ">=12"
15727
+ },
15728
+ "funding": {
15729
+ "url": "https://github.com/sponsors/sindresorhus"
15730
+ }
15731
+ },
15732
+ "node_modules/netlify-redirect-parser/node_modules/path-exists": {
15733
+ "version": "5.0.0",
15734
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
15735
+ "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
15736
+ "engines": {
15737
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
15738
+ }
15739
+ },
15446
15740
  "node_modules/netlify-redirector": {
15447
15741
  "version": "0.2.1",
15448
15742
  "resolved": "https://registry.npmjs.org/netlify-redirector/-/netlify-redirector-0.2.1.tgz",
@@ -24130,6 +24424,66 @@
24130
24424
  "yargs": "^17.3.1"
24131
24425
  },
24132
24426
  "dependencies": {
24427
+ "@babel/parser": {
24428
+ "version": "7.16.8",
24429
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz",
24430
+ "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw=="
24431
+ },
24432
+ "@netlify/zip-it-and-ship-it": {
24433
+ "version": "5.5.2",
24434
+ "resolved": "https://registry.npmjs.org/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-5.5.2.tgz",
24435
+ "integrity": "sha512-5uBfXHYarfNeOxrW7JK4rJaq1Xk2be0Ogt/MvLDr0kuKPtPmfHyNrWmr9JlZ1qtR/SuV1t2x22Tj/mxecL8eIQ==",
24436
+ "requires": {
24437
+ "@babel/parser": "7.16.8",
24438
+ "@netlify/esbuild": "^0.13.6",
24439
+ "@vercel/nft": "^0.17.0",
24440
+ "archiver": "^5.3.0",
24441
+ "common-path-prefix": "^3.0.0",
24442
+ "cp-file": "^9.0.0",
24443
+ "del": "^6.0.0",
24444
+ "elf-cam": "^0.1.1",
24445
+ "end-of-stream": "^1.4.4",
24446
+ "es-module-lexer": "^0.9.0",
24447
+ "execa": "^5.0.0",
24448
+ "filter-obj": "^2.0.1",
24449
+ "find-up": "^5.0.0",
24450
+ "glob": "^7.1.6",
24451
+ "is-builtin-module": "^3.1.0",
24452
+ "junk": "^3.1.0",
24453
+ "locate-path": "^6.0.0",
24454
+ "merge-options": "^3.0.4",
24455
+ "minimatch": "^3.0.4",
24456
+ "p-map": "^4.0.0",
24457
+ "path-exists": "^4.0.0",
24458
+ "pkg-dir": "^5.0.0",
24459
+ "precinct": "^8.2.0",
24460
+ "read-package-json-fast": "^2.0.2",
24461
+ "require-package-name": "^2.0.1",
24462
+ "resolve": "^2.0.0-next.1",
24463
+ "semver": "^7.0.0",
24464
+ "tmp-promise": "^3.0.2",
24465
+ "toml": "^3.0.0",
24466
+ "typescript": "^4.4.3",
24467
+ "unixify": "^1.0.0",
24468
+ "yargs": "^16.0.0"
24469
+ },
24470
+ "dependencies": {
24471
+ "yargs": {
24472
+ "version": "16.2.0",
24473
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
24474
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
24475
+ "requires": {
24476
+ "cliui": "^7.0.2",
24477
+ "escalade": "^3.1.1",
24478
+ "get-caller-file": "^2.0.5",
24479
+ "require-directory": "^2.1.1",
24480
+ "string-width": "^4.2.0",
24481
+ "y18n": "^5.0.5",
24482
+ "yargs-parser": "^20.2.2"
24483
+ }
24484
+ }
24485
+ }
24486
+ },
24133
24487
  "@sindresorhus/is": {
24134
24488
  "version": "2.1.1",
24135
24489
  "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.1.tgz",
@@ -24262,9 +24616,9 @@
24262
24616
  "integrity": "sha512-tiKmDcHM2riSVN79c0mJY/67EBDafXQAMitHuLiCDAMdtz3kfv+NqdVG5krgf5lWR8Uf8AeZrUW5Q9RP25REvw=="
24263
24617
  },
24264
24618
  "@netlify/eslint-config-node": {
24265
- "version": "5.1.2",
24266
- "resolved": "https://registry.npmjs.org/@netlify/eslint-config-node/-/eslint-config-node-5.1.2.tgz",
24267
- "integrity": "sha512-dPTL3kK31JVQtQGko3ASfQ34rSjFe+qqhXGzT0OqxYt4U0MJIBNCXMm/JtupvOU8z7+EiA1Z8ilH8MTvvNrL+g==",
24619
+ "version": "5.1.4",
24620
+ "resolved": "https://registry.npmjs.org/@netlify/eslint-config-node/-/eslint-config-node-5.1.4.tgz",
24621
+ "integrity": "sha512-T/X/T9vucUTrDZMFxqiH6sEMPK1vIJqQQo4tliL2N1g82erRNefZ3k2VS4g0SurWOJPl5Jn8qDgSUTmGCPIHNQ==",
24268
24622
  "dev": true,
24269
24623
  "requires": {
24270
24624
  "@babel/core": "^7.13.8",
@@ -24291,12 +24645,79 @@
24291
24645
  "eslint-plugin-react": "^7.21.5",
24292
24646
  "eslint-plugin-unicorn": "^40.0.0",
24293
24647
  "eslint-plugin-you-dont-need-lodash-underscore": "^6.10.0",
24294
- "execa": "^5.0.0",
24648
+ "execa": "^6.0.0",
24295
24649
  "husky": "^7.0.4",
24296
24650
  "is-ci": "^3.0.0",
24297
24651
  "npm-run-all": "^4.1.5",
24298
24652
  "prettier": "^2.1.2",
24299
24653
  "statuses": "^2.0.1"
24654
+ },
24655
+ "dependencies": {
24656
+ "execa": {
24657
+ "version": "6.0.0",
24658
+ "resolved": "https://registry.npmjs.org/execa/-/execa-6.0.0.tgz",
24659
+ "integrity": "sha512-m4wU9j4Z9nXXoqT8RSfl28JSwmMNLFF69OON8H/lL3NeU0tNpGz313bcOfYoBBHokB0dC2tMl3VUcKgHELhL2Q==",
24660
+ "dev": true,
24661
+ "requires": {
24662
+ "cross-spawn": "^7.0.3",
24663
+ "get-stream": "^6.0.1",
24664
+ "human-signals": "^3.0.1",
24665
+ "is-stream": "^3.0.0",
24666
+ "merge-stream": "^2.0.0",
24667
+ "npm-run-path": "^5.0.1",
24668
+ "onetime": "^6.0.0",
24669
+ "signal-exit": "^3.0.5",
24670
+ "strip-final-newline": "^3.0.0"
24671
+ }
24672
+ },
24673
+ "human-signals": {
24674
+ "version": "3.0.1",
24675
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz",
24676
+ "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==",
24677
+ "dev": true
24678
+ },
24679
+ "is-stream": {
24680
+ "version": "3.0.0",
24681
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
24682
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
24683
+ "dev": true
24684
+ },
24685
+ "mimic-fn": {
24686
+ "version": "4.0.0",
24687
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
24688
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
24689
+ "dev": true
24690
+ },
24691
+ "npm-run-path": {
24692
+ "version": "5.0.1",
24693
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.0.1.tgz",
24694
+ "integrity": "sha512-ybBJQUSyFwEEhqO2lXmyKOl9ucHtyZBWVM0h0FiMfT/+WKxCUZFa95qAR2X3w/w6oigN3B0b2UNHZbD+kdfD5w==",
24695
+ "dev": true,
24696
+ "requires": {
24697
+ "path-key": "^4.0.0"
24698
+ }
24699
+ },
24700
+ "onetime": {
24701
+ "version": "6.0.0",
24702
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
24703
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
24704
+ "dev": true,
24705
+ "requires": {
24706
+ "mimic-fn": "^4.0.0"
24707
+ }
24708
+ },
24709
+ "path-key": {
24710
+ "version": "4.0.0",
24711
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
24712
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
24713
+ "dev": true
24714
+ },
24715
+ "strip-final-newline": {
24716
+ "version": "3.0.0",
24717
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
24718
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
24719
+ "dev": true
24720
+ }
24300
24721
  }
24301
24722
  },
24302
24723
  "@netlify/framework-info": {
@@ -24340,6 +24761,66 @@
24340
24761
  "@netlify/zip-it-and-ship-it": "5.5.2",
24341
24762
  "cpy": "^8.1.0",
24342
24763
  "path-exists": "^4.0.0"
24764
+ },
24765
+ "dependencies": {
24766
+ "@babel/parser": {
24767
+ "version": "7.16.8",
24768
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz",
24769
+ "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw=="
24770
+ },
24771
+ "@netlify/zip-it-and-ship-it": {
24772
+ "version": "5.5.2",
24773
+ "resolved": "https://registry.npmjs.org/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-5.5.2.tgz",
24774
+ "integrity": "sha512-5uBfXHYarfNeOxrW7JK4rJaq1Xk2be0Ogt/MvLDr0kuKPtPmfHyNrWmr9JlZ1qtR/SuV1t2x22Tj/mxecL8eIQ==",
24775
+ "requires": {
24776
+ "@babel/parser": "7.16.8",
24777
+ "@netlify/esbuild": "^0.13.6",
24778
+ "@vercel/nft": "^0.17.0",
24779
+ "archiver": "^5.3.0",
24780
+ "common-path-prefix": "^3.0.0",
24781
+ "cp-file": "^9.0.0",
24782
+ "del": "^6.0.0",
24783
+ "elf-cam": "^0.1.1",
24784
+ "end-of-stream": "^1.4.4",
24785
+ "es-module-lexer": "^0.9.0",
24786
+ "execa": "^5.0.0",
24787
+ "filter-obj": "^2.0.1",
24788
+ "find-up": "^5.0.0",
24789
+ "glob": "^7.1.6",
24790
+ "is-builtin-module": "^3.1.0",
24791
+ "junk": "^3.1.0",
24792
+ "locate-path": "^6.0.0",
24793
+ "merge-options": "^3.0.4",
24794
+ "minimatch": "^3.0.4",
24795
+ "p-map": "^4.0.0",
24796
+ "path-exists": "^4.0.0",
24797
+ "pkg-dir": "^5.0.0",
24798
+ "precinct": "^8.2.0",
24799
+ "read-package-json-fast": "^2.0.2",
24800
+ "require-package-name": "^2.0.1",
24801
+ "resolve": "^2.0.0-next.1",
24802
+ "semver": "^7.0.0",
24803
+ "tmp-promise": "^3.0.2",
24804
+ "toml": "^3.0.0",
24805
+ "typescript": "^4.4.3",
24806
+ "unixify": "^1.0.0",
24807
+ "yargs": "^16.0.0"
24808
+ }
24809
+ },
24810
+ "yargs": {
24811
+ "version": "16.2.0",
24812
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
24813
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
24814
+ "requires": {
24815
+ "cliui": "^7.0.2",
24816
+ "escalade": "^3.1.1",
24817
+ "get-caller-file": "^2.0.5",
24818
+ "require-directory": "^2.1.1",
24819
+ "string-width": "^4.2.0",
24820
+ "y18n": "^5.0.5",
24821
+ "yargs-parser": "^20.2.2"
24822
+ }
24823
+ }
24343
24824
  }
24344
24825
  },
24345
24826
  "@netlify/git-utils": {
@@ -24451,9 +24932,9 @@
24451
24932
  "integrity": "sha512-lfNB/QYDgaP07pwm/nWEaWPvRAAGyhxvJqNzvxMijc7A4uwquMjlbYve8yYyd0LJXPwgBpGobwiQj5RA76xzUQ=="
24452
24933
  },
24453
24934
  "@netlify/plugin-edge-handlers": {
24454
- "version": "3.0.4",
24455
- "resolved": "https://registry.npmjs.org/@netlify/plugin-edge-handlers/-/plugin-edge-handlers-3.0.4.tgz",
24456
- "integrity": "sha512-w6PkvBSsmVblPBj1QVwUDJALuYeD8SyD5YMrTF5c9XrR7tjAWqtJQcw8bsuYqdDr8sEwRjUNyydPd/Zt5kEBLA==",
24935
+ "version": "3.0.5",
24936
+ "resolved": "https://registry.npmjs.org/@netlify/plugin-edge-handlers/-/plugin-edge-handlers-3.0.5.tgz",
24937
+ "integrity": "sha512-2o1kXxCrRpYKyzsRobdPqlxWZpgznO1a6e+gOsWP/p2b2NDwO/dCCkLPJk1rKZdRgE3x8fVqGOcyYx5RlxaWVg==",
24457
24938
  "requires": {
24458
24939
  "@babel/core": "^7.11.4",
24459
24940
  "@babel/preset-env": "^7.11.5",
@@ -24473,9 +24954,9 @@
24473
24954
  }
24474
24955
  },
24475
24956
  "@netlify/plugins-list": {
24476
- "version": "6.7.0",
24477
- "resolved": "https://registry.npmjs.org/@netlify/plugins-list/-/plugins-list-6.7.0.tgz",
24478
- "integrity": "sha512-5+KKvsfg+lWiwQddLCNPv7pL1CiwKIT0M1GE8RuIokAq8DE+c8Ug2PC7seslRM5C5gGQiv60MfCpiFuwY6diQg=="
24957
+ "version": "6.8.0",
24958
+ "resolved": "https://registry.npmjs.org/@netlify/plugins-list/-/plugins-list-6.8.0.tgz",
24959
+ "integrity": "sha512-OwetjqXxuESgZ7ardoz07jU0xbiVl+TA+LCGU38qu0DhegyOW5tA8LIW6hxOZ/3eW+fGbNJUj0fYo3JUJLoGzg=="
24479
24960
  },
24480
24961
  "@netlify/routing-local-proxy": {
24481
24962
  "version": "0.34.1",
@@ -24521,9 +25002,9 @@
24521
25002
  }
24522
25003
  },
24523
25004
  "@netlify/zip-it-and-ship-it": {
24524
- "version": "5.5.2",
24525
- "resolved": "https://registry.npmjs.org/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-5.5.2.tgz",
24526
- "integrity": "sha512-5uBfXHYarfNeOxrW7JK4rJaq1Xk2be0Ogt/MvLDr0kuKPtPmfHyNrWmr9JlZ1qtR/SuV1t2x22Tj/mxecL8eIQ==",
25005
+ "version": "5.6.0",
25006
+ "resolved": "https://registry.npmjs.org/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-5.6.0.tgz",
25007
+ "integrity": "sha512-NtkY5/HKB8toLVaDnizx6AQUr+Q6fNHiczQRjmM+8Xdur7BgS4sqXsiE9OKXhqAHOEhNQV9g4MCoIvHQyTbNSw==",
24527
25008
  "requires": {
24528
25009
  "@babel/parser": "7.16.8",
24529
25010
  "@netlify/esbuild": "^0.13.6",
@@ -27162,9 +27643,9 @@
27162
27643
  }
27163
27644
  },
27164
27645
  "commander": {
27165
- "version": "8.3.0",
27166
- "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
27167
- "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="
27646
+ "version": "9.0.0",
27647
+ "resolved": "https://registry.npmjs.org/commander/-/commander-9.0.0.tgz",
27648
+ "integrity": "sha512-JJfP2saEKbQqvW+FI93OYUB4ByV5cizMpFMiiJI8xDbBvQvSkIk0VvQdn1CZ8mqAO8Loq2h0gYTYtDFUZUeERw=="
27168
27649
  },
27169
27650
  "common-path-prefix": {
27170
27651
  "version": "3.0.0",
@@ -32641,6 +33122,13 @@
32641
33122
  "commander": "^8.3.0",
32642
33123
  "dotenv": "^10.0.0",
32643
33124
  "winston": "^3.3.3"
33125
+ },
33126
+ "dependencies": {
33127
+ "commander": {
33128
+ "version": "8.3.0",
33129
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
33130
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="
33131
+ }
32644
33132
  }
32645
33133
  },
32646
33134
  "latest-version": {
@@ -34018,14 +34506,31 @@
34018
34506
  }
34019
34507
  },
34020
34508
  "netlify-redirect-parser": {
34021
- "version": "13.0.1",
34022
- "resolved": "https://registry.npmjs.org/netlify-redirect-parser/-/netlify-redirect-parser-13.0.1.tgz",
34023
- "integrity": "sha512-TnEafRUQajzpe9s/k5eHjpcIOPydumS2DCxaf+ltnNBSk4KGkphy5srvQdm16YADeTtcnsQ4NQjnjm7VAu+oHg==",
34509
+ "version": "13.0.2",
34510
+ "resolved": "https://registry.npmjs.org/netlify-redirect-parser/-/netlify-redirect-parser-13.0.2.tgz",
34511
+ "integrity": "sha512-mrPx+pSaPv3HCJzCcAsQikNaa1/3gIe6NwOCd7qUAej9g8iiy0P2D4X0AGTPgqbbGz4xZN1azier46S8QIdn+A==",
34024
34512
  "requires": {
34025
- "filter-obj": "^2.0.2",
34026
- "is-plain-obj": "^3.0.0",
34027
- "path-exists": "^4.0.0",
34513
+ "filter-obj": "^3.0.0",
34514
+ "is-plain-obj": "^4.0.0",
34515
+ "path-exists": "^5.0.0",
34028
34516
  "toml": "^3.0.0"
34517
+ },
34518
+ "dependencies": {
34519
+ "filter-obj": {
34520
+ "version": "3.0.0",
34521
+ "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-3.0.0.tgz",
34522
+ "integrity": "sha512-oQZM+QmVni8MsYzcq9lgTHD/qeLqaG8XaOPOW7dzuSafVxSUlH1+1ZDefj2OD9f2XsmG5lFl2Euc9NI4jgwFWg=="
34523
+ },
34524
+ "is-plain-obj": {
34525
+ "version": "4.0.0",
34526
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.0.0.tgz",
34527
+ "integrity": "sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw=="
34528
+ },
34529
+ "path-exists": {
34530
+ "version": "5.0.0",
34531
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
34532
+ "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ=="
34533
+ }
34029
34534
  }
34030
34535
  },
34031
34536
  "netlify-redirector": {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "netlify-cli",
3
3
  "description": "Netlify command line tool",
4
- "version": "8.17.1",
4
+ "version": "8.18.0",
5
5
  "author": "Netlify Inc.",
6
6
  "contributors": [
7
7
  "Mathias Biilmann <matt@netlify.com> (https://twitter.com/biilmann)",
@@ -81,10 +81,10 @@
81
81
  "@netlify/config": "^17.0.6",
82
82
  "@netlify/framework-info": "^9.0.0",
83
83
  "@netlify/local-functions-proxy": "^1.1.1",
84
- "@netlify/plugin-edge-handlers": "^3.0.4",
85
- "@netlify/plugins-list": "^6.7.0",
84
+ "@netlify/plugin-edge-handlers": "^3.0.5",
85
+ "@netlify/plugins-list": "^6.8.0",
86
86
  "@netlify/routing-local-proxy": "^0.34.1",
87
- "@netlify/zip-it-and-ship-it": "^5.5.2",
87
+ "@netlify/zip-it-and-ship-it": "^5.6.0",
88
88
  "@octokit/rest": "^18.0.0",
89
89
  "@sindresorhus/slugify": "^1.1.0",
90
90
  "ansi-escapes": "^5.0.0",
@@ -98,7 +98,7 @@
98
98
  "chokidar": "^3.0.2",
99
99
  "ci-info": "^3.0.0",
100
100
  "clean-deep": "^3.0.2",
101
- "commander": "^8.3.0",
101
+ "commander": "^9.0.0",
102
102
  "concordance": "^5.0.0",
103
103
  "configstore": "^5.0.0",
104
104
  "content-type": "^1.0.4",
@@ -150,7 +150,7 @@
150
150
  "netlify": "^10.1.2",
151
151
  "netlify-headers-parser": "^6.0.1",
152
152
  "netlify-onegraph-internal": "0.0.18",
153
- "netlify-redirect-parser": "^13.0.1",
153
+ "netlify-redirect-parser": "^13.0.2",
154
154
  "netlify-redirector": "^0.2.1",
155
155
  "node-fetch": "^2.6.0",
156
156
  "node-version-alias": "^1.0.1",
@@ -188,7 +188,7 @@
188
188
  },
189
189
  "devDependencies": {
190
190
  "@babel/preset-react": "^7.12.13",
191
- "@netlify/eslint-config-node": "^5.1.2",
191
+ "@netlify/eslint-config-node": "^5.1.4",
192
192
  "ava": "^4.0.0",
193
193
  "c8": "^7.11.0",
194
194
  "eslint-plugin-sort-destructure-keys": "^1.3.5",
@@ -0,0 +1,212 @@
1
+ // @ts-check
2
+
3
+ const inquirer = require('inquirer')
4
+ const pick = require('lodash/pick')
5
+ const prettyjson = require('prettyjson')
6
+
7
+ const { chalk, error, getRepoData, log, logJson, track, warn } = require('../../utils')
8
+ const { configureRepo } = require('../../utils/init/config')
9
+ const { getGitHubToken } = require('../../utils/init/config-github')
10
+ const { createRepo, getTemplatesFromGitHub } = require('../../utils/sites/utils')
11
+
12
+ const { getSiteNameInput } = require('./sites-create')
13
+
14
+ const fetchTemplates = async (token) => {
15
+ const templatesFromGithubOrg = await getTemplatesFromGitHub(token)
16
+
17
+ return templatesFromGithubOrg
18
+ .filter((repo) => !repo.archived && !repo.private && !repo.disabled)
19
+ .map((template) => ({
20
+ name: template.name,
21
+ sourceCodeUrl: template.html_url,
22
+ slug: template.full_name,
23
+ }))
24
+ }
25
+
26
+ /**
27
+ * The sites:create-template command
28
+ * @param {import('commander').OptionValues} options
29
+ * @param {import('../base-command').BaseCommand} command
30
+ */
31
+ const sitesCreateTemplate = async (options, command) => {
32
+ const { api } = command.netlify
33
+
34
+ await command.authenticate()
35
+
36
+ const { globalConfig } = command.netlify
37
+ const ghToken = await getGitHubToken({ globalConfig })
38
+
39
+ let { url: templateUrl } = options
40
+
41
+ if (templateUrl) {
42
+ const urlFromOptions = new URL(templateUrl)
43
+ templateUrl = { templateName: urlFromOptions.pathname.slice(1) }
44
+ } else {
45
+ const templates = await fetchTemplates(ghToken)
46
+
47
+ log(`Choose one of our starter templates. Netlify will create a new repo for this template in your GitHub account.`)
48
+
49
+ templateUrl = await inquirer.prompt([
50
+ {
51
+ type: 'list',
52
+ name: 'templateName',
53
+ message: 'Template:',
54
+ choices: templates.map((template) => ({
55
+ value: template.slug,
56
+ name: template.name,
57
+ })),
58
+ },
59
+ ])
60
+ }
61
+
62
+ const accounts = await api.listAccountsForUser()
63
+
64
+ let { accountSlug } = options
65
+
66
+ if (!accountSlug) {
67
+ const { accountSlug: accountSlugInput } = await inquirer.prompt([
68
+ {
69
+ type: 'list',
70
+ name: 'accountSlug',
71
+ message: 'Team:',
72
+ choices: accounts.map((account) => ({
73
+ value: account.slug,
74
+ name: account.name,
75
+ })),
76
+ },
77
+ ])
78
+ accountSlug = accountSlugInput
79
+ }
80
+
81
+ const { name: nameFlag } = options
82
+ let user
83
+ let site
84
+
85
+ // Allow the user to reenter site name if selected one isn't available
86
+ const inputSiteName = async (name) => {
87
+ const { name: inputName, siteSuggestion } = await getSiteNameInput(name, user, api)
88
+
89
+ try {
90
+ const siteName = inputName ? inputName.trim() : siteSuggestion
91
+
92
+ // Create new repo from template
93
+ const repoResp = await createRepo(templateUrl, ghToken, siteName)
94
+
95
+ if (repoResp.errors) {
96
+ if (repoResp.errors[0].includes('Name already exists on this account')) {
97
+ warn(
98
+ `Oh no! We found already a repository with this name. It seems you have already created a template with the name ${templateUrl.templateName}. Please try to run the command again and provide a different name.`,
99
+ )
100
+ await inputSiteName()
101
+ } else {
102
+ throw new Error(
103
+ `Oops! Seems like something went wrong trying to create the repository. We're getting the following error: '${repoResp.errors[0]}'. You can try to re-run this command again or open an issue in our repository: https://github.com/netlify/cli/issues`,
104
+ )
105
+ }
106
+ } else {
107
+ site = await api.createSiteInTeam({
108
+ accountSlug,
109
+ body: {
110
+ repo: {
111
+ provider: 'github',
112
+ repo: repoResp.full_name,
113
+ private: repoResp.private,
114
+ branch: repoResp.default_branch,
115
+ },
116
+ name: siteName,
117
+ },
118
+ })
119
+ }
120
+ } catch (error_) {
121
+ if (error_.status === 422 || error_.message === 'Duplicate repo') {
122
+ warn(
123
+ `${name}.netlify.app already exists or a repository named ${name} already exists on this account. Please try a different slug.`,
124
+ )
125
+ await inputSiteName()
126
+ } else {
127
+ error(`createSiteInTeam error: ${error_.status}: ${error_.message}`)
128
+ }
129
+ }
130
+ }
131
+
132
+ await inputSiteName(nameFlag)
133
+
134
+ log()
135
+ log(chalk.greenBright.bold.underline(`Site Created`))
136
+ log()
137
+
138
+ const siteUrl = site.ssl_url || site.url
139
+ log(
140
+ prettyjson.render({
141
+ 'Admin URL': site.admin_url,
142
+ URL: siteUrl,
143
+ 'Site ID': site.id,
144
+ 'Repo URL': site.build_settings.repo_url,
145
+ }),
146
+ )
147
+
148
+ track('sites_createdFromTemplate', {
149
+ siteId: site.id,
150
+ adminUrl: site.admin_url,
151
+ siteUrl,
152
+ })
153
+
154
+ if (options.withCi) {
155
+ log('Configuring CI')
156
+ const repoData = await getRepoData()
157
+ await configureRepo({ command, siteId: site.id, repoData, manual: options.manual })
158
+ }
159
+
160
+ if (options.json) {
161
+ logJson(
162
+ pick(site, [
163
+ 'id',
164
+ 'state',
165
+ 'plan',
166
+ 'name',
167
+ 'custom_domain',
168
+ 'domain_aliases',
169
+ 'url',
170
+ 'ssl_url',
171
+ 'admin_url',
172
+ 'screenshot_url',
173
+ 'created_at',
174
+ 'updated_at',
175
+ 'user_id',
176
+ 'ssl',
177
+ 'force_ssl',
178
+ 'managed_dns',
179
+ 'deploy_url',
180
+ 'account_name',
181
+ 'account_slug',
182
+ 'git_provider',
183
+ 'deploy_hook',
184
+ 'capabilities',
185
+ 'id_domain',
186
+ ]),
187
+ )
188
+ }
189
+
190
+ return site
191
+ }
192
+
193
+ /**
194
+ * Creates the `netlify sites:create-template` command
195
+ * @param {import('../base-command').BaseCommand} program
196
+ * @returns
197
+ */
198
+ const createSitesFromTemplateCommand = (program) =>
199
+ program
200
+ .command('sites:create-template')
201
+ .description(
202
+ `(Beta) Create a site from a starter template
203
+ Create a site from a starter template.`,
204
+ )
205
+ .option('-n, --name [name]', 'name of site')
206
+ .option('-u, --url [url]', 'template url')
207
+ .option('-a, --account-slug [slug]', 'account slug to create the site under')
208
+ .option('-c, --with-ci', 'initialize CI hooks during site creation')
209
+ .addHelpText('after', `(Beta) Create a site from starter template.`)
210
+ .action(sitesCreateTemplate)
211
+
212
+ module.exports = { createSitesFromTemplateCommand, fetchTemplates }
@@ -13,6 +13,49 @@ const { link } = require('../link')
13
13
 
14
14
  const SITE_NAME_SUGGESTION_SUFFIX_LENGTH = 5
15
15
 
16
+ const getSiteNameInput = async (name, user, api) => {
17
+ let siteSuggestion
18
+ if (!user) user = await api.getCurrentUser()
19
+
20
+ if (!name) {
21
+ let { slug } = user
22
+ let suffix = ''
23
+
24
+ // If the user doesn't have a slug, we'll compute one. Because `full_name` is not guaranteed to be unique, we
25
+ // append a short randomly-generated ID to reduce the likelihood of a conflict.
26
+ if (!slug) {
27
+ slug = slugify(user.full_name || user.email)
28
+ suffix = `-${uuidv4().slice(0, SITE_NAME_SUGGESTION_SUFFIX_LENGTH)}`
29
+ }
30
+
31
+ const suggestions = [
32
+ `super-cool-site-by-${slug}${suffix}`,
33
+ `the-awesome-${slug}-site${suffix}`,
34
+ `${slug}-makes-great-sites${suffix}`,
35
+ `netlify-thinks-${slug}-is-great${suffix}`,
36
+ `the-great-${slug}-site${suffix}`,
37
+ `isnt-${slug}-awesome${suffix}`,
38
+ ]
39
+ siteSuggestion = sample(suggestions)
40
+
41
+ console.log(
42
+ `Choose a unique site name (e.g. ${siteSuggestion}.netlify.app) or leave it blank for a random name. You can update the site name later.`,
43
+ )
44
+ const { name: nameInput } = await inquirer.prompt([
45
+ {
46
+ type: 'input',
47
+ name: 'name',
48
+ message: 'Site name (optional):',
49
+ filter: (val) => (val === '' ? undefined : val),
50
+ validate: (input) => /^[a-zA-Z\d-]+$/.test(input) || 'Only alphanumeric characters and hyphens are allowed',
51
+ },
52
+ ])
53
+ name = nameInput
54
+ }
55
+
56
+ return { name, siteSuggestion }
57
+ }
58
+
16
59
  /**
17
60
  * The sites:create command
18
61
  * @param {import('commander').OptionValues} options
@@ -47,47 +90,11 @@ const sitesCreate = async (options, command) => {
47
90
 
48
91
  // Allow the user to reenter site name if selected one isn't available
49
92
  const inputSiteName = async (name) => {
50
- if (!user) user = await api.getCurrentUser()
51
-
52
- if (!name) {
53
- let { slug } = user
54
- let suffix = ''
55
-
56
- // If the user doesn't have a slug, we'll compute one. Because `full_name` is not guaranteed to be unique, we
57
- // append a short randomly-generated ID to reduce the likelihood of a conflict.
58
- if (!slug) {
59
- slug = slugify(user.full_name || user.email)
60
- suffix = `-${uuidv4().slice(0, SITE_NAME_SUGGESTION_SUFFIX_LENGTH)}`
61
- }
62
-
63
- const suggestions = [
64
- `super-cool-site-by-${slug}${suffix}`,
65
- `the-awesome-${slug}-site${suffix}`,
66
- `${slug}-makes-great-sites${suffix}`,
67
- `netlify-thinks-${slug}-is-great${suffix}`,
68
- `the-great-${slug}-site${suffix}`,
69
- `isnt-${slug}-awesome${suffix}`,
70
- ]
71
- const siteSuggestion = sample(suggestions)
72
-
73
- console.log(
74
- `Choose a unique site name (e.g. ${siteSuggestion}.netlify.app) or leave it blank for a random name. You can update the site name later.`,
75
- )
76
- const { name: nameInput } = await inquirer.prompt([
77
- {
78
- type: 'input',
79
- name: 'name',
80
- message: 'Site name (optional):',
81
- filter: (val) => (val === '' ? undefined : val),
82
- validate: (input) => /^[a-zA-Z\d-]+$/.test(input) || 'Only alphanumeric characters and hyphens are allowed',
83
- },
84
- ])
85
- name = nameInput
86
- }
93
+ const { name: siteName } = await getSiteNameInput(name, user, api)
87
94
 
88
95
  const body = {}
89
- if (typeof name === 'string') {
90
- body.name = name.trim()
96
+ if (typeof siteName === 'string') {
97
+ body.name = siteName.trim()
91
98
  }
92
99
  try {
93
100
  site = await api.createSiteInTeam({
@@ -96,7 +103,7 @@ const sitesCreate = async (options, command) => {
96
103
  })
97
104
  } catch (error_) {
98
105
  if (error_.status === 422) {
99
- warn(`${name}.netlify.app already exists. Please try a different slug.`)
106
+ warn(`${siteName}.netlify.app already exists. Please try a different slug.`)
100
107
  await inputSiteName()
101
108
  } else {
102
109
  error(`createSiteInTeam error: ${error_.status}: ${error_.message}`)
@@ -191,4 +198,4 @@ Create a blank site that isn't associated with any git remote. Will link the sit
191
198
  )
192
199
  .action(sitesCreate)
193
200
 
194
- module.exports = { createSitesCreateCommand, sitesCreate }
201
+ module.exports = { createSitesCreateCommand, sitesCreate, getSiteNameInput }
@@ -1,5 +1,6 @@
1
1
  // @ts-check
2
2
  const { createSitesCreateCommand } = require('./sites-create')
3
+ const { createSitesFromTemplateCommand } = require('./sites-create-template')
3
4
  const { createSitesDeleteCommand } = require('./sites-delete')
4
5
  const { createSitesListCommand } = require('./sites-list')
5
6
 
@@ -19,6 +20,7 @@ const sites = (options, command) => {
19
20
  */
20
21
  const createSitesCommand = (program) => {
21
22
  createSitesCreateCommand(program)
23
+ createSitesFromTemplateCommand(program)
22
24
  createSitesListCommand(program)
23
25
  createSitesDeleteCommand(program)
24
26
 
@@ -0,0 +1,30 @@
1
+ const fetch = require('node-fetch')
2
+
3
+ const getTemplatesFromGitHub = async (token) => {
4
+ const templates = await fetch(`https://api.github.com/orgs/netlify-templates/repos`, {
5
+ method: 'GET',
6
+ headers: {
7
+ Authorization: `token ${token}`,
8
+ },
9
+ })
10
+ const allTemplates = await templates.json()
11
+
12
+ return allTemplates
13
+ }
14
+
15
+ const createRepo = async (templateUrl, ghToken, siteName) => {
16
+ const resp = await fetch(`https://api.github.com/repos/${templateUrl.templateName}/generate`, {
17
+ method: 'POST',
18
+ headers: {
19
+ Authorization: `token ${ghToken}`,
20
+ },
21
+ body: JSON.stringify({
22
+ name: siteName,
23
+ }),
24
+ })
25
+
26
+ const data = await resp.json()
27
+ return data
28
+ }
29
+
30
+ module.exports = { getTemplatesFromGitHub, createRepo }