netlify-cli 17.3.2 → 17.4.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 +2 -138
- package/npm-shrinkwrap.json +76 -76
- package/package.json +16 -15
- package/src/commands/addons/addons-auth.mjs +27 -30
- package/src/commands/addons/addons-config.mjs +145 -154
- package/src/commands/addons/addons-create.mjs +94 -108
- package/src/commands/addons/addons-delete.mjs +36 -41
- package/src/commands/addons/addons-list.mjs +38 -42
- package/src/commands/addons/addons.mjs +26 -28
- package/src/commands/addons/index.mjs +1 -1
- package/src/commands/api/api.mjs +45 -53
- package/src/commands/api/index.mjs +1 -1
- package/src/commands/base-command.mjs +597 -684
- package/src/commands/blobs/blobs-delete.mjs +35 -0
- package/src/commands/blobs/blobs-get.mjs +44 -0
- package/src/commands/blobs/blobs-list.mjs +48 -0
- package/src/commands/blobs/blobs-set.mjs +54 -0
- package/src/commands/blobs/blobs.mjs +32 -0
- package/src/commands/blobs/index.mjs +1 -0
- package/src/commands/build/build.mjs +55 -67
- package/src/commands/build/index.mjs +1 -1
- package/src/commands/completion/completion.mjs +41 -46
- package/src/commands/completion/index.mjs +1 -1
- package/src/commands/deploy/deploy.mjs +675 -710
- package/src/commands/deploy/index.mjs +1 -1
- package/src/commands/dev/dev-exec.mjs +20 -32
- package/src/commands/dev/dev.mjs +217 -302
- package/src/commands/dev/index.mjs +1 -1
- package/src/commands/dev/types.d.ts +30 -0
- package/src/commands/env/env-clone.mjs +157 -184
- package/src/commands/env/env-get.mjs +49 -68
- package/src/commands/env/env-import.mjs +100 -119
- package/src/commands/env/env-list.mjs +104 -129
- package/src/commands/env/env-set.mjs +160 -185
- package/src/commands/env/env-unset.mjs +104 -122
- package/src/commands/env/env.mjs +28 -30
- package/src/commands/env/index.mjs +1 -1
- package/src/commands/functions/functions-build.mjs +29 -41
- package/src/commands/functions/functions-create.mjs +533 -601
- package/src/commands/functions/functions-invoke.mjs +193 -216
- package/src/commands/functions/functions-list.mjs +45 -55
- package/src/commands/functions/functions-serve.mjs +51 -61
- package/src/commands/functions/functions.mjs +26 -32
- package/src/commands/functions/index.mjs +1 -1
- package/src/commands/index.mjs +2 -2
- package/src/commands/init/index.mjs +1 -1
- package/src/commands/init/init.mjs +138 -167
- package/src/commands/integration/deploy.mjs +337 -399
- package/src/commands/integration/index.mjs +12 -13
- package/src/commands/link/index.mjs +1 -1
- package/src/commands/link/link.mjs +298 -317
- package/src/commands/lm/index.mjs +1 -1
- package/src/commands/lm/lm-info.mjs +23 -31
- package/src/commands/lm/lm-install.mjs +13 -17
- package/src/commands/lm/lm-setup.mjs +80 -84
- package/src/commands/lm/lm-uninstall.mjs +7 -12
- package/src/commands/lm/lm.mjs +18 -22
- package/src/commands/login/index.mjs +1 -1
- package/src/commands/login/login.mjs +35 -41
- package/src/commands/logout/index.mjs +1 -1
- package/src/commands/logout/logout.mjs +25 -31
- package/src/commands/main.mjs +166 -201
- package/src/commands/open/index.mjs +1 -1
- package/src/commands/open/open-admin.mjs +15 -18
- package/src/commands/open/open-site.mjs +16 -19
- package/src/commands/open/open.mjs +24 -27
- package/src/commands/recipes/common.mjs +23 -34
- package/src/commands/recipes/index.mjs +1 -1
- package/src/commands/recipes/recipes-list.mjs +13 -20
- package/src/commands/recipes/recipes.mjs +59 -72
- package/src/commands/serve/index.mjs +1 -1
- package/src/commands/serve/serve.mjs +142 -189
- package/src/commands/sites/index.mjs +2 -2
- package/src/commands/sites/sites-create-template.mjs +214 -236
- package/src/commands/sites/sites-create.mjs +145 -157
- package/src/commands/sites/sites-delete.mjs +75 -81
- package/src/commands/sites/sites-list.mjs +63 -66
- package/src/commands/sites/sites.mjs +18 -20
- package/src/commands/status/index.mjs +1 -1
- package/src/commands/status/status-hooks.mjs +32 -34
- package/src/commands/status/status.mjs +99 -106
- package/src/commands/switch/index.mjs +1 -1
- package/src/commands/switch/switch.mjs +32 -37
- package/src/commands/types.d.ts +31 -0
- package/src/commands/unlink/index.mjs +1 -1
- package/src/commands/unlink/unlink.mjs +23 -29
- package/src/commands/watch/index.mjs +1 -1
- package/src/commands/watch/watch.mjs +91 -105
- package/src/functions-templates/javascript/hello/{{name}}.js +2 -3
- package/src/lib/account.mjs +4 -5
- package/src/lib/api.mjs +22 -20
- package/src/lib/blobs/blobs.mjs +36 -45
- package/src/lib/build.mjs +82 -85
- package/src/lib/completion/constants.mjs +2 -4
- package/src/lib/completion/generate-autocompletion.mjs +33 -36
- package/src/lib/completion/get-autocompletion.mjs +31 -35
- package/src/lib/completion/index.mjs +1 -1
- package/src/lib/completion/script.mjs +12 -19
- package/src/lib/edge-functions/bootstrap.mjs +3 -5
- package/src/lib/edge-functions/consts.mjs +9 -10
- package/src/lib/edge-functions/deploy.mjs +28 -34
- package/src/lib/edge-functions/editor-helper.mjs +29 -42
- package/src/lib/edge-functions/headers.mjs +24 -26
- package/src/lib/edge-functions/internal.mjs +38 -44
- package/src/lib/edge-functions/proxy.mjs +229 -228
- package/src/lib/edge-functions/registry.mjs +473 -574
- package/src/lib/exec-fetcher.mjs +115 -122
- package/src/lib/fs.mjs +28 -27
- package/src/lib/functions/background.mjs +16 -20
- package/src/lib/functions/config.mjs +12 -9
- package/src/lib/functions/form-submissions-handler.mjs +143 -149
- package/src/lib/functions/local-proxy.mjs +40 -44
- package/src/lib/functions/memoized-build.mjs +19 -21
- package/src/lib/functions/netlify-function.mjs +269 -249
- package/src/lib/functions/registry.mjs +509 -568
- package/src/lib/functions/runtimes/go/index.mjs +62 -71
- package/src/lib/functions/runtimes/index.mjs +8 -15
- package/src/lib/functions/runtimes/js/builders/netlify-lambda.mjs +55 -64
- package/src/lib/functions/runtimes/js/builders/zisi.mjs +135 -154
- package/src/lib/functions/runtimes/js/constants.mjs +1 -1
- package/src/lib/functions/runtimes/js/index.mjs +92 -109
- package/src/lib/functions/runtimes/js/worker.mjs +43 -45
- package/src/lib/functions/runtimes/rust/index.mjs +64 -73
- package/src/lib/functions/scheduled.mjs +70 -88
- package/src/lib/functions/server.mjs +269 -327
- package/src/lib/functions/synchronous.mjs +118 -147
- package/src/lib/functions/utils.mjs +38 -46
- package/src/lib/geo-location.mjs +69 -81
- package/src/lib/http-agent.mjs +87 -90
- package/src/lib/images/proxy.mjs +97 -99
- package/src/lib/log.mjs +6 -9
- package/src/lib/path.mjs +2 -1
- package/src/lib/render-error-template.mjs +19 -20
- package/src/lib/settings.mjs +17 -19
- package/src/lib/spinner.mjs +21 -23
- package/src/lib/string.mjs +4 -2
- package/src/recipes/vscode/index.mjs +69 -85
- package/src/recipes/vscode/settings.mjs +53 -58
- package/src/utils/addons/compare.mjs +31 -32
- package/src/utils/addons/diffs/index.mjs +16 -17
- package/src/utils/addons/diffs/options.mjs +99 -101
- package/src/utils/addons/prepare.mjs +100 -97
- package/src/utils/addons/prompts.mjs +73 -76
- package/src/utils/addons/render.mjs +33 -36
- package/src/utils/addons/validation.mjs +19 -15
- package/src/utils/banner.mjs +11 -16
- package/src/utils/build-info.mjs +65 -66
- package/src/utils/command-helpers.mjs +185 -199
- package/src/utils/create-deferred.mjs +9 -12
- package/src/utils/create-stream-promise.mjs +54 -47
- package/src/utils/deploy/constants.mjs +9 -11
- package/src/utils/deploy/deploy-site.mjs +162 -182
- package/src/utils/deploy/hash-config.mjs +21 -21
- package/src/utils/deploy/hash-files.mjs +34 -38
- package/src/utils/deploy/hash-fns.mjs +149 -154
- package/src/utils/deploy/hasher-segments.mjs +58 -52
- package/src/utils/deploy/upload-files.mjs +99 -113
- package/src/utils/deploy/util.mjs +85 -91
- package/src/utils/detect-server-settings.mjs +236 -268
- package/src/utils/dev.mjs +163 -178
- package/src/utils/dot-env.mjs +37 -42
- package/src/utils/env/index.mjs +148 -148
- package/src/utils/execa.mjs +9 -13
- package/src/utils/feature-flags.mjs +6 -5
- package/src/utils/framework-server.mjs +43 -52
- package/src/utils/functions/constants.mjs +1 -1
- package/src/utils/functions/functions.mjs +30 -40
- package/src/utils/functions/get-functions.mjs +28 -29
- package/src/utils/functions/index.mjs +3 -3
- package/src/utils/get-global-config.mjs +33 -36
- package/src/utils/get-package-json.mjs +14 -15
- package/src/utils/get-repo-data.mjs +54 -64
- package/src/utils/get-site.mjs +14 -14
- package/src/utils/gh-auth.mjs +79 -100
- package/src/utils/gitignore.mjs +37 -40
- package/src/utils/headers.mjs +33 -35
- package/src/utils/hooks/requires-site-info.mjs +26 -22
- package/src/utils/init/config-github.mjs +207 -219
- package/src/utils/init/config-manual.mjs +83 -100
- package/src/utils/init/config.mjs +25 -26
- package/src/utils/init/node-version.mjs +23 -30
- package/src/utils/init/plugins.mjs +12 -8
- package/src/utils/init/utils.mjs +152 -172
- package/src/utils/live-tunnel.mjs +118 -141
- package/src/utils/lm/install.mjs +220 -259
- package/src/utils/lm/requirements.mjs +54 -63
- package/src/utils/lm/steps.mjs +31 -31
- package/src/utils/lm/ui.mjs +13 -20
- package/src/utils/open-browser.mjs +31 -32
- package/src/utils/parse-raw-flags.mjs +39 -35
- package/src/utils/proxy-server.mjs +84 -71
- package/src/utils/proxy.mjs +696 -750
- package/src/utils/read-repo-url.mjs +48 -47
- package/src/utils/redirects.mjs +49 -49
- package/src/utils/request-id.mjs +2 -4
- package/src/utils/rules-proxy.mjs +96 -100
- package/src/utils/run-build.mjs +109 -132
- package/src/utils/shell.mjs +99 -106
- package/src/utils/sign-redirect.mjs +14 -14
- package/src/utils/sites/utils.mjs +48 -55
- package/src/utils/state-config.mjs +101 -101
- package/src/utils/static-server.mjs +28 -34
- package/src/utils/telemetry/index.mjs +2 -2
- package/src/utils/telemetry/report-error.mjs +45 -49
- package/src/utils/telemetry/request.mjs +36 -43
- package/src/utils/telemetry/telemetry.mjs +90 -105
- package/src/utils/telemetry/utils.mjs +5 -6
- package/src/utils/telemetry/validation.mjs +55 -53
- package/src/utils/types.d.ts +46 -0
- package/src/utils/validation.mjs +10 -13
|
@@ -1,85 +1,90 @@
|
|
|
1
|
-
|
|
2
|
-
import { chalk, error, exit, log, warn } from '../command-helpers.mjs'
|
|
3
|
-
|
|
1
|
+
import { chalk, error, exit, log, warn } from '../command-helpers.mjs';
|
|
4
2
|
export const ADDON_VALIDATION = {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
|
|
3
|
+
EXISTS: 'EXISTS',
|
|
4
|
+
NOT_EXISTS: 'NOT_EXISTS',
|
|
5
|
+
};
|
|
6
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'addon' implicitly has an 'any' ty... Remove this comment to see the full error message
|
|
9
7
|
const validateExists = ({ addon, addonName, siteData }) => {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
const validateNotExists = ({ addon, addonName, siteData }) => {
|
|
18
|
-
if (addon && addon.id) {
|
|
19
|
-
log(`The "${addonName} add-on" already exists for ${siteData.name}`)
|
|
20
|
-
log()
|
|
21
|
-
const cmd = chalk.cyan(`\`netlify addons:config ${addonName}\``)
|
|
22
|
-
log(`- To update this add-on run: ${cmd}`)
|
|
23
|
-
const deleteCmd = chalk.cyan(`\`netlify addons:delete ${addonName}\``)
|
|
24
|
-
log(`- To remove this add-on run: ${deleteCmd}`)
|
|
25
|
-
log()
|
|
26
|
-
exit(1)
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export const getCurrentAddon = ({ addonName, addons }) => addons.find((addon) => addon.service_slug === addonName)
|
|
31
|
-
|
|
32
|
-
const validateCurrentAddon = ({ addon, addonName, siteData, validation }) => {
|
|
33
|
-
switch (validation) {
|
|
34
|
-
case ADDON_VALIDATION.EXISTS: {
|
|
35
|
-
validateExists({ addon, addonName, siteData })
|
|
36
|
-
break
|
|
8
|
+
if (!addon || !addon.id) {
|
|
9
|
+
log(`Add-on ${addonName} doesn't exist for ${siteData.name}`);
|
|
10
|
+
log(`> Run \`netlify addons:create ${addonName}\` to create an instance for this site`);
|
|
11
|
+
exit(1);
|
|
37
12
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
13
|
+
};
|
|
14
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'addon' implicitly has an 'any' ty... Remove this comment to see the full error message
|
|
15
|
+
const validateNotExists = ({ addon, addonName, siteData }) => {
|
|
16
|
+
if (addon && addon.id) {
|
|
17
|
+
log(`The "${addonName} add-on" already exists for ${siteData.name}`);
|
|
18
|
+
log();
|
|
19
|
+
const cmd = chalk.cyan(`\`netlify addons:config ${addonName}\``);
|
|
20
|
+
log(`- To update this add-on run: ${cmd}`);
|
|
21
|
+
const deleteCmd = chalk.cyan(`\`netlify addons:delete ${addonName}\``);
|
|
22
|
+
log(`- To remove this add-on run: ${deleteCmd}`);
|
|
23
|
+
log();
|
|
24
|
+
exit(1);
|
|
41
25
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
26
|
+
};
|
|
27
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'addonName' implicitly has an 'any... Remove this comment to see the full error message
|
|
28
|
+
export const getCurrentAddon = ({ addonName, addons }) => addons.find((addon) => addon.service_slug === addonName);
|
|
29
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'addon' implicitly has an 'any' ty... Remove this comment to see the full error message
|
|
30
|
+
const validateCurrentAddon = ({ addon, addonName, siteData, validation }) => {
|
|
31
|
+
switch (validation) {
|
|
32
|
+
case ADDON_VALIDATION.EXISTS: {
|
|
33
|
+
validateExists({ addon, addonName, siteData });
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
case ADDON_VALIDATION.NOT_EXISTS: {
|
|
37
|
+
validateNotExists({ addon, addonName, siteData });
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
default: {
|
|
41
|
+
warn(`Unknown addons validation: ${validation}`);
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
45
44
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
45
|
+
};
|
|
46
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'addonName' implicitly has an 'any... Remove this comment to see the full error message
|
|
49
47
|
export const getAddonManifest = async ({ addonName, api }) => {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
48
|
+
let manifest;
|
|
49
|
+
try {
|
|
50
|
+
manifest = await api.showServiceManifest({ addonName });
|
|
51
|
+
}
|
|
52
|
+
catch (error_) {
|
|
53
|
+
// @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
|
|
54
|
+
if (typeof error_.message === 'string' && error_.message.includes('Not Found')) {
|
|
55
|
+
error(`No add-on "${addonName}" found. Please double check your add-on name and try again`);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
// @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
|
|
59
|
+
error(error_.message);
|
|
60
|
+
}
|
|
58
61
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
62
|
+
return manifest;
|
|
63
|
+
};
|
|
64
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'api' implicitly has an 'any' type... Remove this comment to see the full error message
|
|
63
65
|
export const getSiteData = async ({ api, siteId }) => {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
72
|
-
|
|
66
|
+
let siteData;
|
|
67
|
+
try {
|
|
68
|
+
siteData = await api.getSite({ siteId });
|
|
69
|
+
}
|
|
70
|
+
catch (error_) {
|
|
71
|
+
// @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
|
|
72
|
+
error(`Failed getting list of site data: ${error_.message}`);
|
|
73
|
+
}
|
|
74
|
+
return siteData;
|
|
75
|
+
};
|
|
76
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'api' implicitly has an 'any' type... Remove this comment to see the full error message
|
|
73
77
|
export const getAddons = async ({ api, siteId }) => {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}
|
|
82
|
-
|
|
78
|
+
let addons;
|
|
79
|
+
try {
|
|
80
|
+
addons = await api.listServiceInstancesForSite({ siteId });
|
|
81
|
+
}
|
|
82
|
+
catch (error_) {
|
|
83
|
+
// @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
|
|
84
|
+
error(`Failed getting list of addons: ${error_.message}`);
|
|
85
|
+
}
|
|
86
|
+
return addons;
|
|
87
|
+
};
|
|
83
88
|
/**
|
|
84
89
|
*
|
|
85
90
|
* @param {object} config
|
|
@@ -87,28 +92,26 @@ export const getAddons = async ({ api, siteId }) => {
|
|
|
87
92
|
* @param {string} [config.addonName]
|
|
88
93
|
* @param {keyof ADDON_VALIDATION} [config.validation]
|
|
89
94
|
*/
|
|
95
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'addonName' implicitly has an 'any... Remove this comment to see the full error message
|
|
90
96
|
export const prepareAddonCommand = async ({ addonName, command, validation }) => {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
return { manifest, addons, addon, siteData }
|
|
114
|
-
}
|
|
97
|
+
const { netlify } = command;
|
|
98
|
+
const { api, site } = netlify;
|
|
99
|
+
const siteId = site.id;
|
|
100
|
+
if (!siteId) {
|
|
101
|
+
error('No site id found, please run inside a site folder or `netlify link`');
|
|
102
|
+
}
|
|
103
|
+
await command.authenticate();
|
|
104
|
+
const [manifest, siteData, addons] = await Promise.all([
|
|
105
|
+
// TODO: check as `getAddonManifest` did not accept a parameter error
|
|
106
|
+
// @ts-expect-error TS(2345) FIXME: Argument of type '{ api: any; addonName: any; erro... Remove this comment to see the full error message
|
|
107
|
+
addonName ? getAddonManifest({ api, addonName, error }) : Promise.resolve(),
|
|
108
|
+
getSiteData({ api, siteId }),
|
|
109
|
+
getAddons({ api, siteId }),
|
|
110
|
+
]);
|
|
111
|
+
let addon;
|
|
112
|
+
if (addonName) {
|
|
113
|
+
addon = getCurrentAddon({ addons, addonName });
|
|
114
|
+
validateCurrentAddon({ addon, validation, addonName, siteData });
|
|
115
|
+
}
|
|
116
|
+
return { manifest, addons, addon, siteData };
|
|
117
|
+
};
|
|
@@ -1,78 +1,74 @@
|
|
|
1
|
-
|
|
2
|
-
import { chalk } from '../command-helpers.mjs'
|
|
3
|
-
|
|
1
|
+
import { chalk } from '../command-helpers.mjs';
|
|
4
2
|
/* programmatically generate CLI prompts */
|
|
3
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'settings' implicitly has an 'any' type.
|
|
5
4
|
export default function generatePrompts(settings) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
`It's highly recommended that you type your configuration values. It will help with automatic documentation, sharing of your services, and make your services configurable through a GUI`,
|
|
19
|
-
)
|
|
20
|
-
console.log('')
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// Handle shorthand config. Probably will be removed. Severely limited + not great UX
|
|
24
|
-
if (typeof setting === 'string' || typeof setting === 'boolean') {
|
|
25
|
-
if (typeof setting === 'string') {
|
|
26
|
-
prompt = {
|
|
27
|
-
type: 'input',
|
|
28
|
-
name: key,
|
|
29
|
-
message: `Enter string value for '${key}':`,
|
|
30
|
-
}
|
|
31
|
-
// if current stage value set show as default
|
|
32
|
-
if (configValues[key]) {
|
|
33
|
-
prompt.default = configValues[key]
|
|
34
|
-
}
|
|
35
|
-
} else if (typeof setting === 'boolean') {
|
|
36
|
-
prompt = {
|
|
37
|
-
type: 'confirm',
|
|
38
|
-
name: key,
|
|
39
|
-
message: `Do you want '${key}':`,
|
|
40
|
-
}
|
|
5
|
+
const { config, configValues } = settings;
|
|
6
|
+
const configItems = Object.keys(config);
|
|
7
|
+
return configItems
|
|
8
|
+
.map((key, index) => {
|
|
9
|
+
const setting = config[key];
|
|
10
|
+
// const { type, displayName } = setting
|
|
11
|
+
let prompt;
|
|
12
|
+
// Tell user to use types
|
|
13
|
+
if (!setting.type) {
|
|
14
|
+
console.log(`⚠️ ${chalk.yellowBright(`Warning: no \`type\` is set for config key: ${configItems[index]}`)}`);
|
|
15
|
+
console.log(`It's highly recommended that you type your configuration values. It will help with automatic documentation, sharing of your services, and make your services configurable through a GUI`);
|
|
16
|
+
console.log('');
|
|
41
17
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
18
|
+
// Handle shorthand config. Probably will be removed. Severely limited + not great UX
|
|
19
|
+
if (typeof setting === 'string' || typeof setting === 'boolean') {
|
|
20
|
+
if (typeof setting === 'string') {
|
|
21
|
+
prompt = {
|
|
22
|
+
type: 'input',
|
|
23
|
+
name: key,
|
|
24
|
+
message: `Enter string value for '${key}':`,
|
|
25
|
+
};
|
|
26
|
+
// if current stage value set show as default
|
|
27
|
+
if (configValues[key]) {
|
|
28
|
+
// @ts-expect-error TS(2339) FIXME: Property 'default' does not exist on type '{ type:... Remove this comment to see the full error message
|
|
29
|
+
prompt.default = configValues[key];
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
else if (typeof setting === 'boolean') {
|
|
33
|
+
prompt = {
|
|
34
|
+
type: 'confirm',
|
|
35
|
+
name: key,
|
|
36
|
+
message: `Do you want '${key}':`,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return prompt;
|
|
56
40
|
}
|
|
57
|
-
//
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
41
|
+
// For future use. Once UX is decided
|
|
42
|
+
// const defaultValidation = (setting.required) ? validateRequired : noValidate
|
|
43
|
+
const defaultValidation = noValidate;
|
|
44
|
+
const validateFunction = setting.pattern ? validate(setting.pattern) : defaultValidation;
|
|
45
|
+
const isRequiredText = setting.required ? ` (${chalk.yellow('required')})` : '';
|
|
46
|
+
if (setting.type === 'string' || /string/.test(setting.type)) {
|
|
47
|
+
prompt = {
|
|
48
|
+
type: 'input',
|
|
49
|
+
name: key,
|
|
50
|
+
message: `${chalk.white(key)}${isRequiredText} - ${setting.displayName}` || `Please enter value for ${key}`,
|
|
51
|
+
validate: validateFunction,
|
|
52
|
+
};
|
|
53
|
+
// if value previously set show it
|
|
54
|
+
if (configValues[key]) {
|
|
55
|
+
// @ts-expect-error TS(2339) FIXME: Property 'default' does not exist on type '{ type:... Remove this comment to see the full error message
|
|
56
|
+
prompt.default = configValues[key];
|
|
57
|
+
// else show default value if provided
|
|
58
|
+
}
|
|
59
|
+
else if (setting.default) {
|
|
60
|
+
// @ts-expect-error TS(2339) FIXME: Property 'default' does not exist on type '{ type:... Remove this comment to see the full error message
|
|
61
|
+
prompt.default = setting.default;
|
|
62
|
+
}
|
|
63
|
+
return prompt;
|
|
63
64
|
}
|
|
64
|
-
return
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
return false
|
|
65
|
+
return false;
|
|
68
66
|
})
|
|
69
|
-
|
|
67
|
+
.filter(Boolean);
|
|
70
68
|
}
|
|
71
|
-
|
|
72
69
|
const noValidate = function () {
|
|
73
|
-
|
|
74
|
-
}
|
|
75
|
-
|
|
70
|
+
return true;
|
|
71
|
+
};
|
|
76
72
|
// Will use this soon
|
|
77
73
|
// function validateRequired(value) {
|
|
78
74
|
// // eslint-disable-line
|
|
@@ -81,13 +77,14 @@ const noValidate = function () {
|
|
|
81
77
|
// }
|
|
82
78
|
// return `Please enter a value this field is required`
|
|
83
79
|
// }
|
|
84
|
-
|
|
80
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'pattern' implicitly has an 'any' type.
|
|
85
81
|
const validate = function (pattern) {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
}
|
|
82
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'value' implicitly has an 'any' type.
|
|
83
|
+
return function validateValue(value) {
|
|
84
|
+
const regex = new RegExp(pattern);
|
|
85
|
+
if (regex.test(value)) {
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
return `Please enter a value matching regex pattern: /${chalk.yellowBright(pattern)}/`;
|
|
89
|
+
};
|
|
90
|
+
};
|
|
@@ -1,39 +1,36 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
import { chalk } from '../command-helpers.mjs'
|
|
5
|
-
|
|
1
|
+
import AsciiTable from 'ascii-table';
|
|
2
|
+
import { chalk } from '../command-helpers.mjs';
|
|
3
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'values' implicitly has an 'any' type.
|
|
6
4
|
export const renderMissingValues = function (values, manifest) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
5
|
+
const display = values
|
|
6
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'item' implicitly has an 'any' type.
|
|
7
|
+
.map((item) => {
|
|
8
|
+
const itemDisplay = chalk.redBright.bold(`${item}`);
|
|
9
|
+
const niceNameDisplay = manifest.config[item].displayName;
|
|
10
|
+
return ` - ${itemDisplay} ${niceNameDisplay}`;
|
|
12
11
|
})
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
|
|
12
|
+
.join('\n');
|
|
13
|
+
console.log(display);
|
|
14
|
+
};
|
|
15
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'addonName' implicitly has an 'any' type... Remove this comment to see the full error message
|
|
17
16
|
export const renderConfigValues = function (addonName, values, currentValue) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
console.log(table.toString())
|
|
39
|
-
}
|
|
17
|
+
const table = new AsciiTable(`${addonName} add-on settings`);
|
|
18
|
+
const tableHeader = currentValue
|
|
19
|
+
? ['Setting Name', 'Current Value', 'Description']
|
|
20
|
+
: ['Setting Name', 'Description', 'Type', 'Required'];
|
|
21
|
+
table.setHeading(...tableHeader);
|
|
22
|
+
Object.keys(values).forEach((key) => {
|
|
23
|
+
const { displayName, required, type } = values[key];
|
|
24
|
+
const requiredText = required ? `true` : `false`;
|
|
25
|
+
const typeInfo = type || '';
|
|
26
|
+
const description = displayName || '';
|
|
27
|
+
if (currentValue) {
|
|
28
|
+
const value = currentValue[key] || 'Not supplied';
|
|
29
|
+
table.addRow(key, value, description);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
table.addRow(key, description, typeInfo, requiredText);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
console.log(table.toString());
|
|
36
|
+
};
|
|
@@ -1,18 +1,22 @@
|
|
|
1
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'config' implicitly has an 'any' type.
|
|
1
2
|
export const requiredConfigValues = function (config) {
|
|
2
|
-
|
|
3
|
-
}
|
|
4
|
-
|
|
3
|
+
return Object.keys(config).filter((key) => config[key].required);
|
|
4
|
+
};
|
|
5
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'requiredConfig' implicitly has an 'any'... Remove this comment to see the full error message
|
|
5
6
|
export const missingConfigValues = function (requiredConfig, providedConfig) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'key' implicitly has an 'any' type.
|
|
8
|
+
return requiredConfig.filter((key) => !providedConfig[key]);
|
|
9
|
+
};
|
|
10
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'allowedConfig' implicitly has an 'any' ... Remove this comment to see the full error message
|
|
9
11
|
export const updateConfigValues = function (allowedConfig, currentConfig, newConfig) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
12
|
+
return Object.keys(allowedConfig).reduce((acc, key) => {
|
|
13
|
+
if (newConfig[key]) {
|
|
14
|
+
// @ts-expect-error TS(7053) FIXME: Element implicitly has an 'any' type because expre... Remove this comment to see the full error message
|
|
15
|
+
acc[key] = newConfig[key];
|
|
16
|
+
return acc;
|
|
17
|
+
}
|
|
18
|
+
// @ts-expect-error TS(7053) FIXME: Element implicitly has an 'any' type because expre... Remove this comment to see the full error message
|
|
19
|
+
acc[key] = currentConfig[key];
|
|
20
|
+
return acc;
|
|
21
|
+
}, {});
|
|
22
|
+
};
|
package/src/utils/banner.mjs
CHANGED
|
@@ -1,17 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
import { chalk, log, NETLIFYDEVLOG } from './command-helpers.mjs'
|
|
5
|
-
|
|
1
|
+
import boxen from 'boxen';
|
|
2
|
+
import { chalk, log, NETLIFYDEVLOG } from './command-helpers.mjs';
|
|
3
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'url' implicitly has an 'any' type... Remove this comment to see the full error message
|
|
6
4
|
export const printBanner = ({ url }) => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}),
|
|
16
|
-
)
|
|
17
|
-
}
|
|
5
|
+
const banner = chalk.bold(`${NETLIFYDEVLOG} Server now ready on ${url}`);
|
|
6
|
+
log(boxen(banner, {
|
|
7
|
+
padding: 1,
|
|
8
|
+
margin: 1,
|
|
9
|
+
align: 'center',
|
|
10
|
+
borderColor: '#00c7b7',
|
|
11
|
+
}));
|
|
12
|
+
};
|