Skip to content

Commit

Permalink
feat: load command's actions async to improve performance (#6180)
Browse files Browse the repository at this point in the history
* feat: convert addon-auth

* feat: convert addons:config

* feat: convert addons:create

* feat: convert addons:delete

* feat: convert addons:list

* feat: convert api

* feat: types

* feat: convert build, and types

* feat: convert blobs:delelte

* feat: convert blobs:get

* feat: convert blobs:list

* feat: convert blobs:set

* feat: remove import

* feat: convert completion

* feat: convert deploy

* feat: convert dev

* feat: convert env:get

* feat: convert env:import

* feat: convert env:list

* feat: convert env:set

* feat: convert env:unset

* feat: convert env:clone

* feat: convert functions:build

* feat: convert functions:create

* feat: convert functions:invoke

* feat: convert functions:list

* feat: convert functions: serve

* feat: convert init

* chore: format

* feat: convert integration

* feat: convert link

* feat: convert lm:info

* feat: convert lm:install

* feat: convert lm:setup

* feat: convert lm:uninstall

* feat: convert login

* feat: convert logout

* feat: convert logs:deploy

* feat: convert logs:functions

* feat: convert open

* feat: convert recipes

* feat: convert serve

* feat: convert sites:create

* feat: convert sites:create-template

* feat: convert sites:list

* feat: convert sites:delete

* feat: convert status

* feat: convert switch

* feat: convert unlink

* feat: convert watch

* test: fix test for sites:create-template

* test: fix tests for logs:

* test: sites:create

* test: loogs

* test: integration

* chore: prettier

* chore: up timeout for start dev server in test utils

* chore: return to original value

* chore: try await execa

* feat: nope, not that

* chore: merge conflict stuff

* chore: package lock from main

* chore: merge conflict stuff

* test: fix test import

* test: fix wrong import

* chore: revert dev because dev server tests are timing out, moving to another issue

* chore: missing things
  • Loading branch information
sarahetter committed Nov 22, 2023
1 parent 5eb2133 commit 5c61169
Show file tree
Hide file tree
Showing 83 changed files with 1,465 additions and 1,936 deletions.
31 changes: 4 additions & 27 deletions src/commands/addons/addons-auth.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,11 @@

import { OptionValues } from 'commander'

import { ADDON_VALIDATION, prepareAddonCommand } from '../../utils/addons/prepare.js'
import { exit, log } from '../../utils/command-helpers.js'
import openBrowser from '../../utils/open-browser.js'
import BaseCommand from '../base-command.js'

/**
* The addons:auth command
* @param {string} addonName
* @param {import('commander').OptionValues} options
* @param {import('../base-command.js').default} command
* @returns {Promise<boolean>}
*/
// @ts-expect-error TS(7006) FIXME: Parameter 'addonName' implicitly has an 'any' type... Remove this comment to see the full error message
const addonsAuth = async (addonName, options, command) => {
export const addonsAuth = async (addonName: string, options: OptionValues, command: BaseCommand) => {
const { addon } = await prepareAddonCommand({
command,
addonName,
Expand All @@ -32,20 +26,3 @@ const addonsAuth = async (addonName, options, command) => {
await openBrowser({ url: addon.auth_url })
exit()
}

/**
* Creates the `netlify addons:auth` command
* @param {import('../base-command.js').default} program
* @returns
*/
// @ts-expect-error TS(7006) FIXME: Parameter 'program' implicitly has an 'any' type.
export const createAddonsAuthCommand = (program) =>
program
.command('addons:auth', { hidden: true })
.alias('addon:auth')
.argument('<name>', 'Add-on slug')
.description('Login to add-on provider')
// @ts-expect-error TS(7006) FIXME: Parameter 'addonName' implicitly has an 'any' type... Remove this comment to see the full error message
.action(async (addonName, options, command) => {
await addonsAuth(addonName, options, command)
})
31 changes: 3 additions & 28 deletions src/commands/addons/addons-config.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { OptionValues } from 'commander'
import inquirer from 'inquirer'
import isEmpty from 'lodash/isEmpty.js'

Expand All @@ -9,6 +10,7 @@ import { renderConfigValues } from '../../utils/addons/render.js'
import { missingConfigValues, requiredConfigValues, updateConfigValues } from '../../utils/addons/validation.js'
import { chalk, error, log } from '../../utils/command-helpers.js'
import { parseRawFlags } from '../../utils/parse-raw-flags.js'
import BaseCommand from '../base-command.js'

// @ts-expect-error TS(7031) FIXME: Binding element 'addonName' implicitly has an 'any... Remove this comment to see the full error message
const update = async function ({ addonName, api, currentConfig, instanceId, newConfig, siteId }) {
Expand Down Expand Up @@ -38,15 +40,7 @@ const update = async function ({ addonName, api, currentConfig, instanceId, newC
}
}

/**
* The addons:config command
* @param {string} addonName
* @param {import('commander').OptionValues} options
* @param {import('../base-command.js').default} command
* @returns {Promise<boolean>}
*/
// @ts-expect-error TS(7006) FIXME: Parameter 'addonName' implicitly has an 'any' type... Remove this comment to see the full error message
const addonsConfig = async (addonName, options, command) => {
export const addonsConfig = async (addonName: string, options: OptionValues, command: BaseCommand) => {
const { addon, manifest, siteData } = await prepareAddonCommand({
command,
addonName,
Expand Down Expand Up @@ -164,22 +158,3 @@ const addonsConfig = async (addonName, options, command) => {
})
}
}

/**
* Creates the `netlify addons:config` command
* @param {import('../base-command.js').default} program
* @returns
*/
// @ts-expect-error TS(7006) FIXME: Parameter 'program' implicitly has an 'any' type.
export const createAddonsConfigCommand = (program) =>
program
.command('addons:config', { hidden: true })
.alias('addon:config')
.argument('<name>', 'Add-on namespace')
.description('Configure add-on settings')
// allow for any flags. Handy for variadic configuration options
.allowUnknownOption(true)
// @ts-expect-error TS(7006) FIXME: Parameter 'addonName' implicitly has an 'any' type... Remove this comment to see the full error message
.action(async (addonName, options, command) => {
await addonsConfig(addonName, options, command)
})
35 changes: 3 additions & 32 deletions src/commands/addons/addons-create.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { OptionValues } from 'commander'
import inquirer from 'inquirer'
import isEmpty from 'lodash/isEmpty.js'

Expand All @@ -7,7 +8,7 @@ import { renderConfigValues, renderMissingValues } from '../../utils/addons/rend
import { missingConfigValues, requiredConfigValues, updateConfigValues } from '../../utils/addons/validation.js'
import { chalk, error, log } from '../../utils/command-helpers.js'
import { parseRawFlags } from '../../utils/parse-raw-flags.js'

import BaseCommand from '../base-command.js'
// @ts-expect-error TS(7031) FIXME: Binding element 'addonName' implicitly has an 'any... Remove this comment to see the full error message
const createAddon = async ({ addonName, api, config, siteData, siteId }) => {
try {
Expand All @@ -27,15 +28,7 @@ const createAddon = async ({ addonName, api, config, siteData, siteId }) => {
}
}

/**
* The addons:create command
* @param {string} addonName
* @param {import('commander').OptionValues} options
* @param {import('../base-command.js').default} command
* @returns {Promise<boolean>}
*/
// @ts-expect-error TS(7006) FIXME: Parameter 'addonName' implicitly has an 'any' type... Remove this comment to see the full error message
const addonsCreate = async (addonName, options, command) => {
export const addonsCreate = async (addonName: string, options: OptionValues, command: BaseCommand) => {
const { manifest, siteData } = await prepareAddonCommand({
command,
addonName,
Expand Down Expand Up @@ -111,25 +104,3 @@ const addonsCreate = async (addonName, options, command) => {

await createAddon({ api, siteId, addonName, config: configValues, siteData })
}

/**
* Creates the `netlify addons:create` command
* @param {import('../base-command.js').default} program
* @returns
*/
// @ts-expect-error TS(7006) FIXME: Parameter 'program' implicitly has an 'any' type.
export const createAddonsCreateCommand = (program) =>
program
.command('addons:create', { hidden: true })
.alias('addon:create')
.argument('<name>', 'Add-on namespace')
.description(
`Add an add-on extension to your site
Add-ons are a way to extend the functionality of your Netlify site`,
)
// allow for any flags. Handy for variadic configuration options
.allowUnknownOption(true)
// @ts-expect-error TS(7006) FIXME: Parameter 'addonName' implicitly has an 'any' type... Remove this comment to see the full error message
.action(async (addonName, options, command) => {
await addonsCreate(addonName, options, command)
})
28 changes: 3 additions & 25 deletions src/commands/addons/addons-delete.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,11 @@
import { OptionValues } from 'commander'
import inquirer from 'inquirer'

import { ADDON_VALIDATION, prepareAddonCommand } from '../../utils/addons/prepare.js'
import { error, exit, log } from '../../utils/command-helpers.js'
import BaseCommand from '../base-command.js'

/**
* The addons:delete command
* @param {string} addonName
* @param {import('commander').OptionValues} options
* @param {import('../base-command.js').default} command
*/
// @ts-expect-error TS(7006) FIXME: Parameter 'addonName' implicitly has an 'any' type... Remove this comment to see the full error message
const addonsDelete = async (addonName, options, command) => {
export const addonsDelete = async (addonName: string, options: OptionValues, command: BaseCommand) => {
const { addon } = await prepareAddonCommand({
command,
addonName,
Expand Down Expand Up @@ -40,20 +35,3 @@ const addonsDelete = async (addonName, options, command) => {
error(error_.message)
}
}

/**
* Creates the `netlify addons:delete` command
* @param {import('../base-command.js').default} program
* @returns
*/
// @ts-expect-error TS(7006) FIXME: Parameter 'program' implicitly has an 'any' type.
export const createAddonsDeleteCommand = (program) =>
program
.command('addons:delete', { hidden: true })
.alias('addon:delete')
.argument('<name>', 'Add-on namespace')
.description(
`Remove an add-on extension to your site\nAdd-ons are a way to extend the functionality of your Netlify site`,
)
.option('-f, --force', 'delete without prompting (useful for CI)')
.action(addonsDelete)
28 changes: 3 additions & 25 deletions src/commands/addons/addons-list.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,11 @@
import AsciiTable from 'ascii-table'
import { OptionValues } from 'commander'

import { prepareAddonCommand } from '../../utils/addons/prepare.js'
import { log, logJson } from '../../utils/command-helpers.js'
import BaseCommand from '../base-command.js'

/**
* The addons:list command
* @param {import('commander').OptionValues} options
* @param {import('../base-command.js').default} command
* @returns {Promise<boolean>}
*/
// @ts-expect-error TS(7006) FIXME: Parameter 'options' implicitly has an 'any' type.
const addonsList = async (options, command) => {
export const addonsList = async (options: OptionValues, command: BaseCommand) => {
// @ts-expect-error TS(2345) FIXME: Argument of type '{ command: any; }' is not assign... Remove this comment to see the full error message
const { addons, siteData } = await prepareAddonCommand({ command })
// Return json response for piping commands
Expand Down Expand Up @@ -45,20 +40,3 @@ const addonsList = async (options, command) => {
// Log da addons
log(table.toString())
}

/**
* Creates the `netlify addons:list` command
* @param {import('../base-command.js').default} program
* @returns
*/
// @ts-expect-error TS(7006) FIXME: Parameter 'program' implicitly has an 'any' type.
export const createAddonsListCommand = (program) =>
program
.command('addons:list', { hidden: true })
.alias('addon:list')
.description(`List currently installed add-ons for site`)
.option('--json', 'Output add-on data as JSON')
// @ts-expect-error TS(7006) FIXME: Parameter 'options' implicitly has an 'any' type.
.action(async (options, command) => {
await addonsList(options, command)
})
91 changes: 65 additions & 26 deletions src/commands/addons/addons.ts
Original file line number Diff line number Diff line change
@@ -1,32 +1,71 @@

import { createAddonsAuthCommand } from './addons-auth.js'
import { createAddonsConfigCommand } from './addons-config.js'
import { createAddonsCreateCommand } from './addons-create.js'
import { createAddonsDeleteCommand } from './addons-delete.js'
import { createAddonsListCommand } from './addons-list.js'

/**
* The addons command
* @param {import('commander').OptionValues} options
* @param {import('../base-command.js').default} command
*/
// @ts-expect-error TS(7006) FIXME: Parameter 'options' implicitly has an 'any' type.
const addons = (options, command) => {
import { OptionValues } from 'commander'

import BaseCommand from '../base-command.js'

const addons = (options: OptionValues, command: BaseCommand) => {
command.help()
}

/**
* Creates the `netlify addons` command
* @param {import('../base-command.js').default} program
* @returns
*/
// @ts-expect-error TS(7006) FIXME: Parameter 'program' implicitly has an 'any' type.
export const createAddonsCommand = (program) => {
createAddonsAuthCommand(program)
createAddonsConfigCommand(program)
createAddonsCreateCommand(program)
createAddonsDeleteCommand(program)
createAddonsListCommand(program)
export const createAddonsCommand = (program: BaseCommand) => {
program
.command('addons:auth', { hidden: true })
.alias('addon:auth')
.argument('<name>', 'Add-on slug')
.description('Login to add-on provider')
.action(async (addonName: string, options: OptionValues, command: BaseCommand) => {
const { addonsAuth } = await import('./addons-auth.js')
await addonsAuth(addonName, options, command)
})

program
.command('addons:config', { hidden: true })
.alias('addon:config')
.argument('<name>', 'Add-on namespace')
.description('Configure add-on settings')
// allow for any flags. Handy for variadic configuration options
.allowUnknownOption(true)
.action(async (addonName: string, options: OptionValues, command: BaseCommand) => {
const { addonsConfig } = await import('./addons-config.js')
await addonsConfig(addonName, options, command)
})

program
.command('addons:create', { hidden: true })
.alias('addon:create')
.argument('<name>', 'Add-on namespace')
.description(
`Add an add-on extension to your site
Add-ons are a way to extend the functionality of your Netlify site`,
)
// allow for any flags. Handy for variadic configuration options
.allowUnknownOption(true)
.action(async (addonName: string, options: OptionValues, command: BaseCommand) => {
const { addonsCreate } = await import('./addons-create.js')
await addonsCreate(addonName, options, command)
})

program
.command('addons:delete', { hidden: true })
.alias('addon:delete')
.argument('<name>', 'Add-on namespace')
.description(
`Remove an add-on extension to your site\nAdd-ons are a way to extend the functionality of your Netlify site`,
)
.option('-f, --force', 'delete without prompting (useful for CI)')
.action(async (addonName: string, options: OptionValues, command: BaseCommand) => {
const { addonsDelete } = await import('./addons-delete.js')
await addonsDelete(addonName, options, command)
})

program
.command('addons:list', { hidden: true })
.alias('addon:list')
.description(`List currently installed add-ons for site`)
.option('--json', 'Output add-on data as JSON')
.action(async (options: OptionValues, command: BaseCommand) => {
const { addonsList } = await import('./addons-list.js')
await addonsList(options, command)
})

return program
.command('addons', { hidden: true })
Expand Down
32 changes: 3 additions & 29 deletions src/commands/api/api.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,11 @@
import AsciiTable from 'ascii-table'
import { OptionValues } from 'commander'
import { methods } from 'netlify'

import { chalk, error, exit, log, logJson } from '../../utils/command-helpers.js'
import BaseCommand from '../base-command.js'

/**
* The api command
* @param {string} apiMethod
* @param {import('commander').OptionValues} options
* @param {import('../base-command.js').default} command
*/
// @ts-expect-error TS(7006) FIXME: Parameter 'apiMethod' implicitly has an 'any' type... Remove this comment to see the full error message
const apiCommand = async (apiMethod, options, command) => {
export const apiCommand = async (apiMethod: string, options: OptionValues, command: BaseCommand) => {
const { api } = command.netlify

if (options.list) {
Expand Down Expand Up @@ -49,24 +44,3 @@ const apiCommand = async (apiMethod, options, command) => {
error(error_)
}
}

/**
* Creates the `netlify api` command
* @param {import('../base-command.js').default} program
* @returns
*/
// @ts-expect-error TS(7006) FIXME: Parameter 'program' implicitly has an 'any' type.
export const createApiCommand = (program) =>
program
.command('api')
.argument('[apiMethod]', 'Open API method to run')
.description(
`Run any Netlify API method
For more information on available methods checkout https://open-api.netlify.com/ or run '${chalk.grey(
'netlify api --list',
)}'`,
)
.option('-d, --data <data>', 'Data to use')
.option('--list', 'List out available API methods', false)
.addExamples(['netlify api --list', `netlify api getSite --data '{ "site_id": "123456" }'`])
.action(apiCommand)
21 changes: 20 additions & 1 deletion src/commands/api/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,20 @@
export { createApiCommand } from './api.js'
import { chalk } from '../../utils/command-helpers.js'
import BaseCommand from '../base-command.js'

export const createApiCommand = (program: BaseCommand) =>
program
.command('api')
.argument('[apiMethod]', 'Open API method to run')
.description(
`Run any Netlify API method
For more information on available methods checkout https://open-api.netlify.com/ or run '${chalk.grey(
'netlify api --list',
)}'`,
)
.option('-d, --data <data>', 'Data to use')
.option('--list', 'List out available API methods', false)
.addExamples(['netlify api --list', `netlify api getSite --data '{ "site_id": "123456" }'`])
.action(async (apiMethod, options, command) => {
const { apiCommand } = await import('./api.js')
await apiCommand(apiMethod, options, command)
})
Loading

2 comments on commit 5c61169

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📊 Benchmark results

  • Dependency count: 1,396
  • Package size: 404 MB
  • Number of ts-expect-error directives: 0

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📊 Benchmark results

  • Dependency count: 1,396
  • Package size: 404 MB
  • Number of ts-expect-error directives: 0

Please sign in to comment.