netlify-cli 17.3.1 → 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 +3 -139
- package/npm-shrinkwrap.json +82 -82
- 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 -89
- 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
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { getStore } from '@netlify/blobs';
|
|
2
|
+
import { chalk, error as printError } from '../../utils/command-helpers.mjs';
|
|
3
|
+
import requiresSiteInfo from '../../utils/hooks/requires-site-info.mjs';
|
|
4
|
+
/**
|
|
5
|
+
* The blobs:delete command
|
|
6
|
+
*/
|
|
7
|
+
const blobsDelete = async (storeName, key, _options, command) => {
|
|
8
|
+
const { api, siteInfo } = command.netlify;
|
|
9
|
+
const store = getStore({
|
|
10
|
+
apiURL: `${api.scheme}://${api.host}`,
|
|
11
|
+
name: storeName,
|
|
12
|
+
siteID: siteInfo.id ?? '',
|
|
13
|
+
token: api.accessToken ?? '',
|
|
14
|
+
});
|
|
15
|
+
try {
|
|
16
|
+
await store.delete(key);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return printError(`Could not delete blob ${chalk.yellow(key)} from store ${chalk.yellow(storeName)}`);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Creates the `netlify blobs:delete` command
|
|
24
|
+
* @param {import('../base-command.mjs').default} program
|
|
25
|
+
* @returns
|
|
26
|
+
*/
|
|
27
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'program' implicitly has an 'any' type.
|
|
28
|
+
export const createBlobsDeleteCommand = (program) => program
|
|
29
|
+
.command('blobs:delete')
|
|
30
|
+
.description(`(Beta) Deletes an object with a given key, if it exists, from a Netlify Blobs store`)
|
|
31
|
+
.argument('<store>', 'Name of the store')
|
|
32
|
+
.argument('<key>', 'Object key')
|
|
33
|
+
.alias('blob:delete')
|
|
34
|
+
.hook('preAction', requiresSiteInfo)
|
|
35
|
+
.action(blobsDelete);
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import { resolve } from 'path';
|
|
3
|
+
import { getStore } from '@netlify/blobs';
|
|
4
|
+
import { chalk, error as printError } from '../../utils/command-helpers.mjs';
|
|
5
|
+
import requiresSiteInfo from '../../utils/hooks/requires-site-info.mjs';
|
|
6
|
+
const blobsGet = async (storeName, key, options, command) => {
|
|
7
|
+
const { api, siteInfo } = command.netlify;
|
|
8
|
+
const { output } = options;
|
|
9
|
+
const store = getStore({
|
|
10
|
+
apiURL: `${api.scheme}://${api.host}`,
|
|
11
|
+
name: storeName,
|
|
12
|
+
siteID: siteInfo?.id ?? '',
|
|
13
|
+
token: api.accessToken ?? '',
|
|
14
|
+
});
|
|
15
|
+
let blob;
|
|
16
|
+
try {
|
|
17
|
+
blob = await store.get(key);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return printError(`Could not retrieve blob ${chalk.yellow(key)} from store ${chalk.yellow(storeName)}`);
|
|
21
|
+
}
|
|
22
|
+
if (blob === null) {
|
|
23
|
+
return printError(`Blob ${chalk.yellow(key)} does not exist in store ${chalk.yellow(storeName)}`);
|
|
24
|
+
}
|
|
25
|
+
if (output) {
|
|
26
|
+
const path = resolve(output);
|
|
27
|
+
await fs.writeFile(path, blob);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
console.log(blob);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Creates the `netlify blobs:get` command
|
|
35
|
+
*/
|
|
36
|
+
export const createBlobsGetCommand = (program) => program
|
|
37
|
+
.command('blobs:get')
|
|
38
|
+
.description(`(Beta) Reads an object with a given key from a Netlify Blobs store and, if it exists, prints the content to the terminal or saves it to a file`)
|
|
39
|
+
.argument('<store>', 'Name of the store')
|
|
40
|
+
.argument('<key>', 'Object key')
|
|
41
|
+
.option('-o, --output <path>', 'Defines the filesystem path where the blob data should be persisted')
|
|
42
|
+
.alias('blob:get')
|
|
43
|
+
.hook('preAction', requiresSiteInfo)
|
|
44
|
+
.action(blobsGet);
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { getStore } from '@netlify/blobs';
|
|
2
|
+
import AsciiTable from 'ascii-table';
|
|
3
|
+
import { chalk, error as printError, log, logJson } from '../../utils/command-helpers.mjs';
|
|
4
|
+
import requiresSiteInfo from '../../utils/hooks/requires-site-info.mjs';
|
|
5
|
+
const blobsList = async (storeName, options, command) => {
|
|
6
|
+
const { api, siteInfo } = command.netlify;
|
|
7
|
+
const store = getStore({
|
|
8
|
+
apiURL: `${api.scheme}://${api.host}`,
|
|
9
|
+
name: storeName,
|
|
10
|
+
siteID: siteInfo?.id ?? '',
|
|
11
|
+
token: api.accessToken ?? '',
|
|
12
|
+
});
|
|
13
|
+
try {
|
|
14
|
+
const { blobs, directories } = await store.list({
|
|
15
|
+
directories: Boolean(options.directories),
|
|
16
|
+
prefix: options.prefix,
|
|
17
|
+
});
|
|
18
|
+
if (options.json) {
|
|
19
|
+
logJson({ blobs, directories });
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const table = new AsciiTable(`Netlify Blobs (${storeName})`);
|
|
23
|
+
table.setHeading('Key', 'ETag');
|
|
24
|
+
directories.forEach((directory) => {
|
|
25
|
+
table.addRow(directory, '(directory)');
|
|
26
|
+
});
|
|
27
|
+
blobs.forEach((blob) => {
|
|
28
|
+
table.addRow(blob.key, blob.etag);
|
|
29
|
+
});
|
|
30
|
+
log(table.toString());
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return printError(`Could not list blobs from store ${chalk.yellow(storeName)}`);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Creates the `netlify blobs:list` command
|
|
38
|
+
*/
|
|
39
|
+
export const createBlobsListCommand = (program) => program
|
|
40
|
+
.command('blobs:list')
|
|
41
|
+
.description(`(Beta) Lists objects in a Netlify Blobs store`)
|
|
42
|
+
.argument('<store>', 'Name of the store')
|
|
43
|
+
.option('-d, --directories', `Indicates that keys with the '/' character should be treated as directories, returning a list of sub-directories at a given level rather than all the keys inside them`)
|
|
44
|
+
.option('-p, --prefix <prefix>', `A string for filtering down the entries; when specified, only the entries whose key starts with that prefix are returned`)
|
|
45
|
+
.option('--json', `Output list contents as JSON`)
|
|
46
|
+
.alias('blob:list')
|
|
47
|
+
.hook('preAction', requiresSiteInfo)
|
|
48
|
+
.action(blobsList);
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import { resolve } from 'path';
|
|
3
|
+
import { getStore } from '@netlify/blobs';
|
|
4
|
+
import { chalk, error as printError, isNodeError } from '../../utils/command-helpers.mjs';
|
|
5
|
+
import requiresSiteInfo from '../../utils/hooks/requires-site-info.mjs';
|
|
6
|
+
// eslint-disable-next-line max-params
|
|
7
|
+
const blobsSet = async (storeName, key, valueParts, options, command) => {
|
|
8
|
+
const { api, siteInfo } = command.netlify;
|
|
9
|
+
const { input } = options;
|
|
10
|
+
const store = getStore({
|
|
11
|
+
apiURL: `${api.scheme}://${api.host}`,
|
|
12
|
+
name: storeName,
|
|
13
|
+
siteID: siteInfo.id ?? '',
|
|
14
|
+
token: api.accessToken ?? '',
|
|
15
|
+
});
|
|
16
|
+
let value = valueParts.join(' ');
|
|
17
|
+
if (input) {
|
|
18
|
+
const inputPath = resolve(input);
|
|
19
|
+
try {
|
|
20
|
+
value = await fs.readFile(inputPath, 'utf8');
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
if (isNodeError(error) && error.code === 'ENOENT') {
|
|
24
|
+
return printError(`Could not set blob ${chalk.yellow(key)} because the file ${chalk.underline(inputPath)} does not exist`);
|
|
25
|
+
}
|
|
26
|
+
if (isNodeError(error) && error.code === 'EISDIR') {
|
|
27
|
+
return printError(`Could not set blob ${chalk.yellow(key)} because the path ${chalk.underline(inputPath)} is a directory`);
|
|
28
|
+
}
|
|
29
|
+
return printError(`Could not set blob ${chalk.yellow(key)} because the path ${chalk.underline(inputPath)} could not be read`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
else if (!value) {
|
|
33
|
+
return printError(`You must provide a value as a command-line parameter (e.g. 'netlify blobs:set my-store my-key my value') or specify the path to a file from where the value should be read (e.g. 'netlify blobs:set my-store my-key --input ./my-file.txt')`);
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
await store.set(key, value);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return printError(`Could not set blob ${chalk.yellow(key)} in store ${chalk.yellow(storeName)}`);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Creates the `netlify blobs:set` command
|
|
44
|
+
*/
|
|
45
|
+
export const createBlobsSetCommand = (program) => program
|
|
46
|
+
.command('blobs:set')
|
|
47
|
+
.description(`(Beta) Writes to a Netlify Blobs store an object with the data provided in the command or the contents of a file defined by the 'input' parameter`)
|
|
48
|
+
.argument('<store>', 'Name of the store')
|
|
49
|
+
.argument('<key>', 'Object key')
|
|
50
|
+
.argument('[value...]', 'Object value')
|
|
51
|
+
.option('-i, --input <path>', 'Defines the filesystem path where the blob data should be read from')
|
|
52
|
+
.alias('blob:set')
|
|
53
|
+
.hook('preAction', requiresSiteInfo)
|
|
54
|
+
.action(blobsSet);
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { createBlobsDeleteCommand } from './blobs-delete.mjs';
|
|
2
|
+
import { createBlobsGetCommand } from './blobs-get.mjs';
|
|
3
|
+
import { createBlobsListCommand } from './blobs-list.mjs';
|
|
4
|
+
import { createBlobsSetCommand } from './blobs-set.mjs';
|
|
5
|
+
/**
|
|
6
|
+
* The blobs command
|
|
7
|
+
*/
|
|
8
|
+
const blobs = (_options, command) => {
|
|
9
|
+
command.help();
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Creates the `netlify blobs` command
|
|
13
|
+
*/
|
|
14
|
+
export const createBlobsCommand = (program) => {
|
|
15
|
+
createBlobsDeleteCommand(program);
|
|
16
|
+
createBlobsGetCommand(program);
|
|
17
|
+
createBlobsListCommand(program);
|
|
18
|
+
createBlobsSetCommand(program);
|
|
19
|
+
return program
|
|
20
|
+
.command('blobs')
|
|
21
|
+
.alias('blob')
|
|
22
|
+
.description(`(Beta) Manage objects in Netlify Blobs`)
|
|
23
|
+
.addExamples([
|
|
24
|
+
'netlify blobs:get my-store my-key',
|
|
25
|
+
'netlify blobs:set my-store my-key This will go in a blob',
|
|
26
|
+
'netlify blobs:set my-store my-key --input ./some-file.txt',
|
|
27
|
+
'netlify blobs:delete my-store my-key',
|
|
28
|
+
'netlify blobs:list my-store',
|
|
29
|
+
'netlify blobs:list my-store --json',
|
|
30
|
+
])
|
|
31
|
+
.action(blobs);
|
|
32
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createBlobsCommand } from './blobs.mjs';
|
|
@@ -1,88 +1,76 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { error, exit, getToken } from '../../utils/command-helpers.mjs'
|
|
7
|
-
import { getEnvelopeEnv, normalizeContext } from '../../utils/env/index.mjs'
|
|
8
|
-
|
|
1
|
+
import process from 'process';
|
|
2
|
+
import { getBuildOptions, runBuild } from '../../lib/build.mjs';
|
|
3
|
+
import { detectFrameworkSettings } from '../../utils/build-info.mjs';
|
|
4
|
+
import { error, exit, getToken } from '../../utils/command-helpers.mjs';
|
|
5
|
+
import { getEnvelopeEnv, normalizeContext } from '../../utils/env/index.mjs';
|
|
9
6
|
/**
|
|
10
7
|
* @param {import('../../lib/build.mjs').BuildConfig} options
|
|
11
8
|
*/
|
|
9
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'token' implicitly has an 'any' ty... Remove this comment to see the full error message
|
|
12
10
|
export const checkOptions = ({ cachedConfig: { siteInfo = {} }, token }) => {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
|
|
11
|
+
// @ts-expect-error TS(2339) FIXME: Property 'id' does not exist on type '{}'.
|
|
12
|
+
if (!siteInfo.id) {
|
|
13
|
+
error('Could not find the site ID. If your site is not on Netlify, please run `netlify init` or `netlify deploy` first. If it is, please run `netlify link`.');
|
|
14
|
+
}
|
|
15
|
+
if (!token) {
|
|
16
|
+
error('Could not find the access token. Please run netlify login.');
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'command' implicitly has an 'any' type.
|
|
24
20
|
const injectEnv = async function (command, { api, buildOptions, context, siteInfo }) {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
|
|
21
|
+
const isUsingEnvelope = siteInfo && siteInfo.use_envelope;
|
|
22
|
+
const { env } = buildOptions.cachedConfig;
|
|
23
|
+
if (isUsingEnvelope) {
|
|
24
|
+
buildOptions.cachedConfig.env = await getEnvelopeEnv({ api, context, env, siteInfo });
|
|
25
|
+
}
|
|
26
|
+
};
|
|
33
27
|
/**
|
|
34
28
|
* The build command
|
|
35
29
|
* @param {import('commander').OptionValues} options
|
|
36
30
|
* @param {import('../base-command.mjs').default} command
|
|
37
31
|
*/
|
|
32
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'options' implicitly has an 'any' type.
|
|
38
33
|
const build = async (options, command) => {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
}
|
|
69
|
-
|
|
34
|
+
const { cachedConfig, siteInfo } = command.netlify;
|
|
35
|
+
command.setAnalyticsPayload({ dry: options.dry });
|
|
36
|
+
// Retrieve Netlify Build options
|
|
37
|
+
// @ts-expect-error TS(2554) FIXME: Expected 1 arguments, but got 0.
|
|
38
|
+
const [token] = await getToken();
|
|
39
|
+
const settings = await detectFrameworkSettings(command, 'build');
|
|
40
|
+
// override the build command with the detection result if no command is specified through the config
|
|
41
|
+
if (!cachedConfig.config.build.command) {
|
|
42
|
+
cachedConfig.config.build.command = settings?.buildCommand;
|
|
43
|
+
cachedConfig.config.build.commandOrigin = 'heuristics';
|
|
44
|
+
}
|
|
45
|
+
// @ts-expect-error TS(2345) FIXME: Argument of type '{ cachedConfig: any; packagePath... Remove this comment to see the full error message
|
|
46
|
+
const buildOptions = await getBuildOptions({
|
|
47
|
+
cachedConfig,
|
|
48
|
+
packagePath: command.workspacePackage,
|
|
49
|
+
currentDir: command.workingDir,
|
|
50
|
+
token,
|
|
51
|
+
options,
|
|
52
|
+
});
|
|
53
|
+
if (!options.offline) {
|
|
54
|
+
checkOptions(buildOptions);
|
|
55
|
+
const { api, site } = command.netlify;
|
|
56
|
+
const { context } = options;
|
|
57
|
+
// @ts-expect-error TS(2345) FIXME: Argument of type '{ api: any; buildOptions: { cach... Remove this comment to see the full error message
|
|
58
|
+
await injectEnv(command, { api, buildOptions, context, site, siteInfo });
|
|
59
|
+
}
|
|
60
|
+
const { exitCode } = await runBuild(buildOptions);
|
|
61
|
+
exit(exitCode);
|
|
62
|
+
};
|
|
70
63
|
/**
|
|
71
64
|
* Creates the `netlify build` command
|
|
72
65
|
* @param {import('../base-command.mjs').default} program
|
|
73
66
|
* @returns
|
|
74
67
|
*/
|
|
75
|
-
|
|
76
|
-
|
|
68
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'program' implicitly has an 'any' type.
|
|
69
|
+
export const createBuildCommand = (program) => program
|
|
77
70
|
.command('build')
|
|
78
71
|
.description('Build on your local machine')
|
|
79
|
-
.option(
|
|
80
|
-
'--context <context>',
|
|
81
|
-
'Specify a build context or branch (contexts: "production", "deploy-preview", "branch-deploy", "dev")',
|
|
82
|
-
normalizeContext,
|
|
83
|
-
process.env.CONTEXT || 'production',
|
|
84
|
-
)
|
|
72
|
+
.option('--context <context>', 'Specify a build context or branch (contexts: "production", "deploy-preview", "branch-deploy", "dev")', normalizeContext, process.env.CONTEXT || 'production')
|
|
85
73
|
.option('--dry', 'Dry run: show instructions without running them', false)
|
|
86
74
|
.option('-o, --offline', 'disables any features that require network access', false)
|
|
87
75
|
.addExamples(['netlify build'])
|
|
88
|
-
.action(build)
|
|
76
|
+
.action(build);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { createBuildCommand } from './build.mjs'
|
|
1
|
+
export { createBuildCommand } from './build.mjs';
|
|
@@ -1,58 +1,53 @@
|
|
|
1
|
-
import { dirname, join } from 'path'
|
|
2
|
-
import { fileURLToPath } from 'url'
|
|
3
|
-
|
|
4
|
-
import { install, uninstall } from 'tabtab'
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const completer = join(dirname(fileURLToPath(import.meta.url)), '../../lib/completion/script.mjs')
|
|
9
|
-
|
|
1
|
+
import { dirname, join } from 'path';
|
|
2
|
+
import { fileURLToPath } from 'url';
|
|
3
|
+
// @ts-expect-error TS(7016) FIXME: Could not find a declaration file for module 'tabt... Remove this comment to see the full error message
|
|
4
|
+
import { install, uninstall } from 'tabtab';
|
|
5
|
+
import { generateAutocompletion } from '../../lib/completion/index.mjs';
|
|
6
|
+
const completer = join(dirname(fileURLToPath(import.meta.url)), '../../lib/completion/script.mjs');
|
|
10
7
|
/**
|
|
11
8
|
* The completion:generate command
|
|
12
9
|
* @param {import('commander').OptionValues} options
|
|
13
10
|
* @param {import('../base-command.mjs').default} command
|
|
14
11
|
*/
|
|
12
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'options' implicitly has an 'any' type.
|
|
15
13
|
const completionGenerate = async (options, command) => {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
console.log(`Completion for ${parent.name()} successful installed!`)
|
|
26
|
-
}
|
|
27
|
-
|
|
14
|
+
const { parent } = command;
|
|
15
|
+
generateAutocompletion(parent);
|
|
16
|
+
await install({
|
|
17
|
+
name: parent.name(),
|
|
18
|
+
completer,
|
|
19
|
+
});
|
|
20
|
+
console.log(`Completion for ${parent.name()} successful installed!`);
|
|
21
|
+
};
|
|
28
22
|
/**
|
|
29
23
|
* Creates the `netlify completion` command
|
|
30
24
|
* @param {import('../base-command.mjs').default} program
|
|
31
25
|
* @returns
|
|
32
26
|
*/
|
|
27
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'program' implicitly has an 'any' type.
|
|
33
28
|
export const createCompletionCommand = (program) => {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
})
|
|
58
|
-
}
|
|
29
|
+
program
|
|
30
|
+
.command('completion:install')
|
|
31
|
+
.alias('completion:generate')
|
|
32
|
+
.description('Generates completion script for your preferred shell')
|
|
33
|
+
.action(completionGenerate);
|
|
34
|
+
program
|
|
35
|
+
.command('completion:uninstall', { hidden: true })
|
|
36
|
+
.alias('completion:remove')
|
|
37
|
+
.description('Uninstalls the installed completions')
|
|
38
|
+
.addExamples(['netlify completion:uninstall'])
|
|
39
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'options' implicitly has an 'any' type.
|
|
40
|
+
.action(async (options, command) => {
|
|
41
|
+
await uninstall({
|
|
42
|
+
name: command.parent.name(),
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
return program
|
|
46
|
+
.command('completion')
|
|
47
|
+
.description('Generate shell completion script\nRun this command to see instructions for your shell.')
|
|
48
|
+
.addExamples(['netlify completion:install'])
|
|
49
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'options' implicitly has an 'any' type.
|
|
50
|
+
.action((options, command) => {
|
|
51
|
+
command.help();
|
|
52
|
+
});
|
|
53
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { createCompletionCommand } from './completion.mjs'
|
|
1
|
+
export { createCompletionCommand } from './completion.mjs';
|