Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
895cf9c
link: prerelease binaries
jsoref Apr 26, 2026
1b92140
spelling: ; otherwise,
jsoref Apr 26, 2026
81b79d4
spelling: a
jsoref Apr 26, 2026
cfdaf1a
spelling: access
jsoref Apr 26, 2026
1c2ad4a
spelling: an
jsoref Apr 26, 2026
46b5909
spelling: and are not
jsoref Apr 26, 2026
4df030e
spelling: anonymization
jsoref Apr 26, 2026
65be067
spelling: anymore
jsoref Apr 26, 2026
ab09204
spelling: descending
jsoref Apr 26, 2026
31d54c0
spelling: fall back
jsoref Apr 26, 2026
3d3ef99
spelling: from which
jsoref Apr 26, 2026
ed9b4f1
spelling: github
jsoref Apr 26, 2026
8c0886e
spelling: grafana
jsoref Apr 26, 2026
84f41bb
spelling: happens
jsoref Apr 26, 2026
2dd49ea
spelling: log file size
jsoref Apr 26, 2026
e36f367
spelling: missing
jsoref Apr 26, 2026
7d38944
spelling: mutually
jsoref Apr 26, 2026
082c53b
spelling: nonexistent
jsoref Apr 26, 2026
1285eef
spelling: permission
jsoref Apr 26, 2026
f19ee9a
spelling: please
jsoref Apr 26, 2026
744d9a8
spelling: preexisting
jsoref Apr 26, 2026
97849cc
spelling: prioritize
jsoref Apr 26, 2026
cc2a0e5
spelling: run
jsoref Apr 26, 2026
6833df3
spelling: set up
jsoref Apr 26, 2026
32ffaa2
spelling: suppress
jsoref Apr 26, 2026
bfa771b
spelling: test-rate-limit
jsoref Apr 26, 2026
0bede0c
spelling: that
jsoref Apr 26, 2026
b89b67a
spelling: they
jsoref Apr 26, 2026
a8cfebd
spelling: to
jsoref Apr 26, 2026
0ba3347
spelling: update
jsoref Apr 26, 2026
9d5a13b
spelling: validate
jsoref Apr 26, 2026
18a93f0
spelling: whether or not
jsoref Apr 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/feature_request.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ assignees: ''
**Note**: Please keep in mind that if your feature request discusses any details that you aren't comfortable disclosing in this public forum (such as service IDs), you will need to open a Fastly support ticket instead: https://support.fastly.com.

Feature requests opened here:
- Do not have an SLA nor are guaranteed to be implemented
- Do not have an SLA and are not guaranteed to be implemented
- Should not be a duplicate of an existing support ticket that you have already created, or vice versa

More details on submitting issues can be found here: https://github.com/fastly/cli/blob/main/ISSUES.md
Expand Down
4 changes: 2 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -206,13 +206,13 @@ both the old and new forms are:
- feat(compute/hashfiles): remove hashsum subcommand ([#1608](https://github.com/fastly/cli/pull/1608))
- feat(ngwaf/rules): add support for CRUD operations for NGWAF rules ([#1605](https://github.com/fastly/cli/pull/1605))
- feat(compute/deploy): added the `--no-default-domain` flag to allow for the skipping of automatic domain creation when deploying a Compute service([#1610](https://github.com/fastly/cli/pull/1610))
- refactor(argparser/flags.go): add flag conversion utilities for converting string flags to bools and checking ascending and desecnding flags ([#1611](https://github.com/fastly/cli/pull/1611))
- refactor(argparser/flags.go): add flag conversion utilities for converting string flags to bools and checking ascending and descending flags ([#1611](https://github.com/fastly/cli/pull/1611))
- feat(service/purge): Add 'service purge' command as replacement for 'purge', with an unlisted and deprecated alias of 'purge'. ([#1612](https://github.com/fastly/cli/pull/1612))
- feat(service/version): Add 'service version ...' commands as replacements for 'service-version ...', with unlisted and deprecated aliases of 'service-version ...'. ([#1614](https://github.com/fastly/cli/pull/1614))
- feat(service/vcl): moved the `vcl` command under the `service` command, with an unlisted and deprecated alias of `vcl` ([#1616](https://github.com/fastly/cli/pull/1616))
- feat(service/healthcheck): moved the `healthcheck` command under the `service` command, with an unlisted and deprecated alias of `healthcheck` ([#1619](https://github.com/fastly/cli/pull/1619))
- feat(service/backend): moved the `backend` command under the `service` command, with an unlisted and deprecated alias of `backend` ([#1621](https://github.com/fastly/cli/pull/1621))
- feat(service/acl): moved the `acl` and `aclentry` commands under the `service` command, with a unlisted and deprecated aliases of `acl` and `aclentry` ([#1621](https://github.com/fastly/cli/pull/1624))
- feat(service/acl): moved the `acl` and `aclentry` commands under the `service` command, with an unlisted and deprecated aliases of `acl` and `aclentry` ([#1621](https://github.com/fastly/cli/pull/1624))
- feat(version): If the latest version is at least one major version higher than the current version, provide links to the release notes for the major version(s) so the user can review them before upgrading. ([#1623](https://github.com/fastly/cli/pull/1623))
- feat(service/imageoptimizerdefaults): moved the `imageoptimizerdefaults` commands under the `service` command, with an unlisted and deprecated alias of `imageoptimizerdefaults` ([#1627](https://github.com/fastly/cli/pull/1627))
- feat(service/alert): moved the `alerts` command to the `service alert` command, with an unlisted and deprecated alias of `alerts` ([#1616](https://github.com/fastly/cli/pull/1626))
Expand Down
2 changes: 1 addition & 1 deletion DEVELOPMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ The resulting configuration is then saved to disk at `./pkg/config/config.toml`

When a user installs the CLI for the first time, they'll have no existing config and so the embedded config will be used. In the future, when the user updates their CLI, the existing config they have will be used.

If the config has changed in any way, then you (the CLI developer) should ensure the `config_version` number is bumped before publishing a new CLI release. This is because when the user updates to that new CLI version and the invoke the CLI, the CLI will identify a mismatch between the user's local config version and the embedded config version. This will cause the embedded config to be merged with the local config and consequently the user's config will be updated to include the new fields.
If the config has changed in any way, then you (the CLI developer) should ensure the `config_version` number is bumped before publishing a new CLI release. This is because when the user updates to that new CLI version and they invoke the CLI, the CLI will identify a mismatch between the user's local config version and the embedded config version. This will cause the embedded config to be merged with the local config and consequently the user's config will be updated to include the new fields.

> **NOTE:** The CLI does provide a `fastly config --reset` option that resets the config to a version compatible with the user's current CLI version. This is fallback for users who run into issues for whatever reason.

Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,15 +57,15 @@ Refer to [CONTRIBUTING.md](https://github.com/fastly/cli/blob/main/CONTRIBUTING.
If you encounter any non-security-related bug or unexpected behavior, please [file an issue][bug]
using the bug report template.

Please also check the [CHANGELOG](https://github.com/fastly/cli/blob/main/CHANGELOG.md) for any breaking-changes or migration guidance.
Please check the [CHANGELOG](https://github.com/fastly/cli/blob/main/CHANGELOG.md) for any breaking-changes or migration guidance.

### Security issues

Please see our [SECURITY.md](SECURITY.md) for guidance on reporting security-related issues.

## Binaries with unreleased changes

Binaries containing merged changes that are planned for the next release are available [here](https://github.com/fastly/cli/actions/workflows/merge_to_main.yml).
There are [prerelease binaries](https://github.com/fastly/cli/actions/workflows/merge_to_main.yml) containing merged changes.
Use at your own risk.
Updating will revert the binary to the latest released version.

Expand Down
2 changes: 1 addition & 1 deletion SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ The fastly/cli project team welcomes security reports and is committed to provid

## Security advisories

Remediation of security vulnerabilities is prioritized by the project team. The project team endeavors to coordinate remediation with third-party stakeholders, and is committed to transparency in the disclosure process. The fastly/cli team announces security issues in release notes as well as Github Security Advisories on a best-effort basis.
Remediation of security vulnerabilities is prioritized by the project team. The project team endeavors to coordinate remediation with third-party stakeholders, and is committed to transparency in the disclosure process. The fastly/cli team announces security issues in release notes as well as GitHub Security Advisories on a best-effort basis.

Note that communications related to security issues in Fastly-maintained OSS as described here are distinct from [Fastly Security Advisories](https://www.fastly.com/security-advisories).
2 changes: 1 addition & 1 deletion TESTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ When running the tests locally, if you don't have the relevant language ecosyste

> **NOTE**: you might notice a discrepancy between CI and your local environment which is caused by the difference in Rust toolchain versions as defined in .github/workflows/pr_test.yml which specifies the version required to be tested for in CI. Running `rustup toolchain install <version>` and `rustup target add wasm32-wasip1 --toolchain <version>` will resolve any failing integration tests you may be running locally.

To the run the full test suite:
To run the full test suite:

```sh
TEST_COMPUTE_INIT=1 TEST_COMPUTE_BUILD=1 TEST_COMPUTE_DEPLOY=1 TEST_COMMAND=gotest make all
Expand Down
2 changes: 1 addition & 1 deletion pkg/app/run.go
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ func Exec(data *global.Data) error {
}

// User can set env.DebugMode env var or the --debug-mode boolean flag.
// This will prioritise the flag over the env var.
// This will prioritize the flag over the env var.
if data.Flags.Debug {
data.Env.DebugMode = "true"
}
Expand Down
8 changes: 4 additions & 4 deletions pkg/argparser/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ type OptionalCustomerID struct {
// Parse returns a customer ID either from a flag or from a user defined
// environment variable (see pkg/env/env.go).
//
// NOTE: Will fallback to FASTLY_CUSTOMER_ID environment variable if no flag value set.
// NOTE: Will fall back to FASTLY_CUSTOMER_ID environment variable if no flag value set.
func (sv *OptionalCustomerID) Parse() error {
if sv.Value == "" {
if e := os.Getenv(env.CustomerID); e != "" {
Expand All @@ -206,7 +206,7 @@ type OptionalWorkspaceID struct {
// Parse returns a workspace ID either from a flag or from a user defined
// environment variable (see pkg/env/env.go).
//
// NOTE: Will fallback to FASTLY_WORKSPACE_ID environment variable if no flag value set.
// NOTE: Will fall back to FASTLY_WORKSPACE_ID environment variable if no flag value set.
func (sv *OptionalWorkspaceID) Parse() error {
if sv.Value == "" {
if e := os.Getenv(env.WorkspaceID); e != "" {
Expand Down Expand Up @@ -296,7 +296,7 @@ func GetSpecifiedVersion(vs []*fastly.Version, version string) (*fastly.Version,
}

// Content determines if the given flag value is a file path, and if so read
// the contents from disk, otherwise presume the given value is the content.
// the contents from disk; otherwise, presume the given value is the content.
func Content(flagval string) string {
content := flagval
if path, err := filepath.Abs(flagval); err == nil {
Expand Down Expand Up @@ -362,7 +362,7 @@ func (j *JSONOutput) JSONFlag() BoolFlagOpts {
}
}

// WriteJSON checks whether the enabled flag is set or not. If set,
// WriteJSON checks whether or not the enabled flag is set. If set,
// then the given value is written as JSON to out. Otherwise, false is returned.
func (j *JSONOutput) WriteJSON(out io.Writer, value any) (bool, error) {
if !j.Enabled {
Expand Down
2 changes: 1 addition & 1 deletion pkg/auth/auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ const ClientID = "fastly-cli"
// redirectPath is the path in the internal webserver which will receive the authorization code.
const redirectPath = "/callback"

// redirectURL is the endpoint the auth provider will pass an authorization code to.
// redirectURL is the endpoint to which the auth provider will pass an authorization code.
const redirectURL = "http://localhost:8080" + redirectPath

// OIDCMetadata is OpenID Connect's metadata discovery mechanism.
Expand Down
2 changes: 1 addition & 1 deletion pkg/commands/compute/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -672,7 +672,7 @@ func updateWasmtools(

// identifyToolchain determines the programming language.
//
// It prioritises the --language flag over the manifest field.
// It prioritizes the --language flag over the manifest field.
// Will error if neither are provided.
// Lastly, it will normalise with a trim and lowercase.
func identifyToolchain(c *BuildCommand) (string, error) {
Expand Down
8 changes: 4 additions & 4 deletions pkg/commands/compute/build_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ func TestBuildRust(t *testing.T) {
// `wasmtoolsBinName` and used that for both `tmpBin` and `binPath` and
// this works fine on *nix systems. But once Windows did `os.Rename()` and
// move tmpBin to binPath it would no longer be able to set permissions on
// the binPath because it didn't think the file existed any more. My guess
// the binPath because it didn't think the file existed anymore. My guess
// is that moving a file over itself causes Windows to remove the file.
//
// So to work around that issue I just create two separate files because
Expand Down Expand Up @@ -394,7 +394,7 @@ func TestBuildGo(t *testing.T) {
// `wasmtoolsBinName` and used that for both `tmpBin` and `binPath` and
// this works fine on *nix systems. But once Windows did `os.Rename()` and
// move tmpBin to binPath it would no longer be able to set permissions on
// the binPath because it didn't think the file existed any more. My guess
// the binPath because it didn't think the file existed anymore. My guess
// is that moving a file over itself causes Windows to remove the file.
//
// So to work around that issue I just create two separate files because
Expand Down Expand Up @@ -576,7 +576,7 @@ func TestBuildJavaScript(t *testing.T) {
// `wasmtoolsBinName` and used that for both `tmpBin` and `binPath` and
// this works fine on *nix systems. But once Windows did `os.Rename()` and
// move tmpBin to binPath it would no longer be able to set permissions on
// the binPath because it didn't think the file existed any more. My guess
// the binPath because it didn't think the file existed anymore. My guess
// is that moving a file over itself causes Windows to remove the file.
//
// So to work around that issue I just create two separate files because
Expand Down Expand Up @@ -766,7 +766,7 @@ func TestBuildOther(t *testing.T) {
// `wasmtoolsBinName` and used that for both `tmpBin` and `binPath` and
// this works fine on *nix systems. But once Windows did `os.Rename()` and
// move tmpBin to binPath it would no longer be able to set permissions on
// the binPath because it didn't think the file existed any more. My guess
// the binPath because it didn't think the file existed anymore. My guess
// is that moving a file over itself causes Windows to remove the file.
//
// So to work around that issue I just create two separate files because
Expand Down
2 changes: 1 addition & 1 deletion pkg/commands/compute/deploy.go
Original file line number Diff line number Diff line change
Expand Up @@ -505,7 +505,7 @@ func (c *DeployCommand) NewService(manifestFilename string, spinner text.Spinner
)

if !c.Globals.Flags.AutoYes && !c.Globals.Flags.NonInteractive {
text.Output(out, "There is no Fastly service associated with this package. To connect to an existing service add the Service ID to the %s file, otherwise follow the prompts to create a service now.\n\n", manifestFilename)
text.Output(out, "There is no Fastly service associated with this package. To connect to an existing service add the Service ID to the %s file; otherwise, follow the prompts to create a service now.\n\n", manifestFilename)
text.Output(out, "Press ^C at any time to quit.")

if c.Globals.Manifest.File.Setup.Defined() {
Expand Down
6 changes: 3 additions & 3 deletions pkg/commands/compute/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -606,7 +606,7 @@ func validateDirectoryPermissions(dst string) text.SpinnerProcess {
}

// PromptOrReturn will prompt the user for information missing from the
// fastly.toml manifest file, otherwise if it already exists then the value is
// fastly.toml manifest file; otherwise, if it already exists then the value is
// returned as is.
func (c *InitCommand) PromptOrReturn(email string, in io.Reader, out io.Writer) (name, description string, authors []string, err error) {
flags := c.Globals.Flags
Expand Down Expand Up @@ -690,7 +690,7 @@ func promptPackageDescription(flags global.Flags, desc string, in io.Reader, out
// either via the corresponding CLI flag or the manifest file.
//
// It will use a default of the user's email found within the manifest, if set
// there, otherwise the value will be an empty slice.
// there; otherwise, the value will be an empty slice.
//
// FIXME: Handle prompting for multiple authors.
func promptPackageAuthors(flags global.Flags, authors []string, manifestEmail string, in io.Reader, out io.Writer) ([]string, error) {
Expand Down Expand Up @@ -1015,7 +1015,7 @@ mimes:
}

if archive != nil {
// Ensure there is a file extension on our filename, otherwise we won't
// Ensure there is a file extension on our filename; otherwise, we won't
// know what type of archive format we're dealing with when we come to call
// the archive.Extract() method.
if ext == "" {
Expand Down
8 changes: 4 additions & 4 deletions pkg/commands/compute/init_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -468,7 +468,7 @@ func TestInit(t *testing.T) {

// we need to define stdin as the init process prompts the user multiple
// times, but we don't need to provide any values as all our prompts will
// fallback to default values if the input is unrecognised.
// fall back to default values if the input is unrecognised.
opts.Input = strings.NewReader(testcase.stdin)
return opts, nil
}
Expand Down Expand Up @@ -515,7 +515,7 @@ func TestInit_ExistingService(t *testing.T) {
expectInManifest []string
expectNoManifest bool
expectInError string
suppresBeacon bool
suppressBeacon bool
}{
{
name: "when the service exists",
Expand Down Expand Up @@ -624,7 +624,7 @@ func TestInit_ExistingService(t *testing.T) {
args: testutil.SplitArgs("compute init --from LsyQ2UXDGk6d4EN"),
expectInError: "--from url seems invalid",
// Not a valid URL OR Service ID
suppresBeacon: true,
suppressBeacon: true,
},
{
name: "service has a cloned_from value",
Expand Down Expand Up @@ -778,7 +778,7 @@ func TestInit_ExistingService(t *testing.T) {

t.Log(stdout.String())

if testcase.suppresBeacon {
if testcase.suppressBeacon {
testutil.AssertLength(t, 0, httpClient.Requests)
} else {
testutil.AssertLength(t, 1, httpClient.Requests)
Expand Down
2 changes: 1 addition & 1 deletion pkg/commands/compute/language_go.go
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ func (g *Go) Build() error {
// We do this because the 0.2.0 release of the compute-sdk-go bumps the TinyGo
// version requirement to 0.28.1 and we want to avoid any scenarios where a
// bump in SDK version causes the user's build to break (which would happen for
// users with a pre-existing project who happen to update their CLI version: the
// users with a preexisting project who happen to update their CLI version: the
// new CLI version would have a TinyGo constraint that would be higher than
// before and would stop their build from working).
//
Expand Down
2 changes: 1 addition & 1 deletion pkg/commands/compute/language_toolchain.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ type BuildToolchain struct {

// Build compiles the user's source code into a Wasm binary.
func (bt BuildToolchain) Build() error {
// Make sure to delete any pre-existing binary otherwise prior metadata will
// Make sure to delete any preexisting binary otherwise prior metadata will
// continue to be persisted.
if _, err := os.Stat(binWasmPath); err == nil {
os.Remove(binWasmPath)
Expand Down
4 changes: 2 additions & 2 deletions pkg/commands/compute/publish.go
Original file line number Diff line number Diff line change
Expand Up @@ -178,10 +178,10 @@ func (c *PublishCommand) Deploy(in io.Reader, out io.Writer) error {
c.deploy.PackagePath = c.pkg.Value
}
if c.serviceName.WasSet {
c.deploy.ServiceName = c.serviceName // deploy's field is a argparser.OptionalServiceNameID
c.deploy.ServiceName = c.serviceName // deploy's field is an argparser.OptionalServiceNameID
}
if c.serviceVersion.WasSet {
c.deploy.ServiceVersion = c.serviceVersion // deploy's field is a argparser.OptionalServiceVersion
c.deploy.ServiceVersion = c.serviceVersion // deploy's field is an argparser.OptionalServiceVersion
}
if c.domain.WasSet {
c.deploy.Domain = c.domain.Value
Expand Down
6 changes: 3 additions & 3 deletions pkg/commands/compute/serve.go
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,7 @@ func (c *ServeCommand) setBackendsWithDefaultOverrideHostIfMissing(out io.Writer
// in the fastly.toml [viceroy.viceroy_version]. Otherwise, if not installed, we
// install it in the same directory as the application configuration data.
//
// In the case of a network failure we fallback to the latest installed version of the
// In the case of a network failure we fall back to the latest installed version of the
// Viceroy binary as long as one is installed and has the correct permissions.
func (c *ServeCommand) GetViceroy(spinner text.Spinner, out io.Writer, manifestPath string) (bin string, err error) {
if c.ViceroyBinPath != "" {
Expand Down Expand Up @@ -928,7 +928,7 @@ func (c *ServeCommand) startPushpin(spinner text.Spinner, out io.Writer) (pushpi
// - path to the routes file to use
// - A routes file that sets up the routes. In our case, we:
// - wires up a backend name (id) to the server host
// - if the backend sets an override host, then we set thatt
// - if the backend sets an override host, then we set that
// - if the backend enables HTTPS, then we enable that
// - if the backend has a path prefix, then we set that up
// - enables WebSocket-over-HTTP
Expand Down Expand Up @@ -1253,7 +1253,7 @@ func watchFiles(root string, gi *ignore.GitIgnore, verbose bool, s *fstexec.Stre
// We do this because if we didn't, then we'd get an error after one
// restart of the viceroy executable: "os: process already finished".
//
// This error happens happens because the compute.watchFiles() function is
// This error happens because the compute.watchFiles() function is
// run in a goroutine and so it will keep running with a copy of the
// fstexec.Streaming command instance that wraps a process which has
// already been terminated.
Expand Down
Loading
Loading