Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 1 addition & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,7 @@ Environment variables are loaded from multiple sources with specific precedence:
1. Process environment
2. `.env` files (multiple variants supported)
3. Netlify site settings (shared, project-specific)
4. Addon-provided variables
5. Build-time configuration
4. Build-time configuration

#### Function URL Routing

Expand Down
46 changes: 13 additions & 33 deletions eslint-suppressions.json
Original file line number Diff line number Diff line change
Expand Up @@ -266,12 +266,6 @@
}
},
"src/commands/functions/functions-create.ts": {
"@typescript-eslint/await-thenable": {
"count": 1
},
"@typescript-eslint/no-confusing-void-expression": {
"count": 1
},
"@typescript-eslint/no-floating-promises": {
"count": 1
},
Expand All @@ -285,13 +279,13 @@
"count": 36
},
"@typescript-eslint/no-unsafe-assignment": {
"count": 64
"count": 38
},
"@typescript-eslint/no-unsafe-call": {
"count": 11
"count": 8
},
"@typescript-eslint/no-unsafe-member-access": {
"count": 59
"count": 47
},
"@typescript-eslint/no-unsafe-return": {
"count": 11
Expand All @@ -303,7 +297,7 @@
"count": 6
},
"@typescript-eslint/restrict-template-expressions": {
"count": 29
"count": 24
},
"n/no-process-exit": {
"count": 2
Expand Down Expand Up @@ -809,20 +803,6 @@
"count": 2
}
},
"src/utils/addons/prepare.ts": {
"@typescript-eslint/no-unsafe-assignment": {
"count": 4
},
"@typescript-eslint/no-unsafe-call": {
"count": 3
},
"@typescript-eslint/no-unsafe-member-access": {
"count": 4
},
"@typescript-eslint/no-unsafe-return": {
"count": 3
}
},
"src/utils/agent-detection.ts": {
"@typescript-eslint/prefer-nullish-coalescing": {
"count": 1
Expand Down Expand Up @@ -1004,25 +984,25 @@
},
"src/utils/dev.ts": {
"@typescript-eslint/no-unsafe-argument": {
"count": 5
"count": 3
},
"@typescript-eslint/no-unsafe-assignment": {
"count": 15
"count": 9
},
"@typescript-eslint/no-unsafe-call": {
"count": 4
"count": 1
},
"@typescript-eslint/no-unsafe-member-access": {
"count": 16
"count": 7
},
"@typescript-eslint/no-unsafe-return": {
"count": 5
"count": 2
},
"@typescript-eslint/prefer-nullish-coalescing": {
"count": 2
},
"@typescript-eslint/restrict-template-expressions": {
"count": 6
"count": 4
}
},
"src/utils/dot-env.ts": {
Expand Down Expand Up @@ -1193,16 +1173,16 @@
"count": 7
},
"@typescript-eslint/no-unsafe-argument": {
"count": 38
"count": 32
},
"@typescript-eslint/no-unsafe-assignment": {
"count": 69
"count": 61
},
"@typescript-eslint/no-unsafe-call": {
"count": 28
},
"@typescript-eslint/no-unsafe-member-access": {
"count": 98
"count": 96
},
"@typescript-eslint/no-unsafe-return": {
"count": 13
Expand Down
3 changes: 1 addition & 2 deletions src/commands/dev/dev.ts
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ export const dev = async (options: OptionValues, command: BaseCommand) => {

env = await getDotEnvVariables({ devConfig, env, site })

const { accountId, addonsUrls, capabilities, siteUrl, timeouts } = await getSiteInformation({
const { accountId, capabilities, siteUrl, timeouts } = await getSiteInformation({
// inherited from base command --offline

offline: options.offline,
Expand Down Expand Up @@ -297,7 +297,6 @@ export const dev = async (options: OptionValues, command: BaseCommand) => {
const inspectSettings = generateInspectSettings(options.edgeInspect, options.edgeInspectBrk)

await startProxyServer({
addonsUrls,
aiGatewayContext,
api,
blobsContext,
Expand Down
105 changes: 3 additions & 102 deletions src/commands/functions/functions-create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,15 @@ import path, { dirname, join, relative } from 'path'
import process from 'process'
import { fileURLToPath, pathToFileURL } from 'url'

import { confirm, input, search, select, Separator } from '@inquirer/prompts'
import { input, search, select, Separator } from '@inquirer/prompts'
import { OptionValues } from 'commander'
import { findUp } from 'find-up'
import fuzzy from 'fuzzy'
import fetch from 'node-fetch'
import { createSpinner } from 'nanospinner'

import { fileExistsAsync } from '../../lib/fs.js'
import { getAddons, getCurrentAddon, getSiteData } from '../../utils/addons/prepare.js'
import {
APIError,
NETLIFYDEVERR,
NETLIFYDEVLOG,
NETLIFYDEVWARN,
Expand Down Expand Up @@ -406,10 +404,9 @@ const downloadFromURL = async function (command, options, argumentName, function
const fnTemplateFile = path.join(fnFolder, '.netlify-function-template.mjs')
if (await fileExistsAsync(fnTemplateFile)) {
const {
default: { addons = [], onComplete },
default: { onComplete },
} = await import(pathToFileURL(fnTemplateFile).href)

await installAddons(command, addons, path.resolve(fnFolder))
await handleOnComplete({ command, onComplete })
// delete
await unlink(fnTemplateFile)
Expand Down Expand Up @@ -504,7 +501,7 @@ const scaffoldFromTemplate = async function (command, options, argumentName, fun
} else if (chosenTemplate === 'report') {
log(`${NETLIFYDEVLOG} Open in browser: https://github.com/netlify/cli/issues/new`)
} else {
const { addons = [], lang, name: templateName, onComplete } = chosenTemplate
const { lang, name: templateName, onComplete } = chosenTemplate
const pathToTemplate = path.join(templatesDir, lang, templateName)
if (!fs.existsSync(pathToTemplate)) {
throw new Error(
Expand Down Expand Up @@ -551,7 +548,6 @@ const scaffoldFromTemplate = async function (command, options, argumentName, fun
await registerEFInToml(name, command.netlify)
}

await installAddons(command, addons, path.resolve(functionPath))
await handleOnComplete({ command, onComplete })

log()
Expand All @@ -561,26 +557,6 @@ const scaffoldFromTemplate = async function (command, options, argumentName, fun

const TEMPLATE_PERMISSIONS = 0o777

// @ts-expect-error TS(7031) FIXME: Binding element 'addonName' implicitly has an 'any... Remove this comment to see the full error message
const createFunctionAddon = async function ({ addonName, addons, api, siteData, siteId }) {
try {
const addon = getCurrentAddon({ addons, addonName })
if (addon?.id) {
log(`The "${addonName} add-on" already exists for ${siteData.name}`)
return false
}
await api.createServiceInstance({
siteId,
addon: addonName,
body: { config: {} },
})
log(`Add-on "${addonName}" created for ${siteData.name}`)
return true
} catch (error_) {
return logAndThrowError((error_ as APIError).message)
}
}

/**
*
* @param {object} config
Expand All @@ -601,81 +577,6 @@ const handleOnComplete = async ({ command, onComplete }) => {
await onComplete.call(command)
}
}
/**
*
* @param {object} config
* @param {*} config.addonCreated
* @param {*} config.addonDidInstall
* @param {import('../base-command.js').default} config.command
* @param {string} config.fnPath
*/
// @ts-expect-error TS(7031) FIXME: Binding element 'addonCreated' implicitly has an '... Remove this comment to see the full error message
const handleAddonDidInstall = async ({ addonCreated, addonDidInstall, command, fnPath }) => {
const { config } = command.netlify

if (!addonCreated || !addonDidInstall) {
return
}

const confirmPostInstall = await confirm({
message: `This template has an optional setup script that runs after addon install. This can be helpful for first time users to try out templates. Run the script?`,
default: false,
})

if (!confirmPostInstall) {
return
}

await injectEnvVariables({
devConfig: { ...config.dev },
env: command.netlify.cachedConfig.env,
site: command.netlify.site,
})
addonDidInstall(fnPath)
}

/**
*
* @param {import('../base-command.js').default} command
* @param {*} functionAddons
* @param {*} fnPath
* @returns
*/
// @ts-expect-error TS(7006) FIXME: Parameter 'command' implicitly has an 'any' type.
const installAddons = async function (command, functionAddons, fnPath) {
if (functionAddons.length === 0) {
return
}

const { api, site } = command.netlify
const siteId = site.id
if (!siteId) {
log('No project id found, please run inside a project directory or `netlify link`')
return false
}
log(`${NETLIFYDEVLOG} checking Netlify APIs...`)

const [siteData, siteAddons] = await Promise.all([getSiteData({ api, siteId }), getAddons({ api, siteId })])

// @ts-expect-error TS(7031) FIXME: Binding element 'addonDidInstall' implicitly has a... Remove this comment to see the full error message
const arr = functionAddons.map(async ({ addonDidInstall, addonName }) => {
log(`${NETLIFYDEVLOG} installing addon: ${chalk.yellow.inverse(addonName)}`)
try {
const addonCreated = await createFunctionAddon({
api,
addons: siteAddons,
siteId,
addonName,
siteData,
})

await handleAddonDidInstall({ addonCreated, addonDidInstall, command, fnPath })
} catch (error_) {
return logAndThrowError(`${NETLIFYDEVERR} Error installing addon: ${error_}`)
}
})
return Promise.all(arr)
}

/**
*
Expand Down
3 changes: 1 addition & 2 deletions src/commands/serve/serve.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ export const serve = async (options: OptionValues, command: BaseCommand) => {

env = await getDotEnvVariables({ devConfig, env, site })

const { accountId, addonsUrls, capabilities, siteUrl, timeouts } = await getSiteInformation({
const { accountId, capabilities, siteUrl, timeouts } = await getSiteInformation({
// inherited from base command --offline
offline: options.offline,
api,
Expand Down Expand Up @@ -190,7 +190,6 @@ export const serve = async (options: OptionValues, command: BaseCommand) => {

const inspectSettings = generateInspectSettings(options.edgeInspect, options.edgeInspectBrk)
const url = await startProxyServer({
addonsUrls,
blobsContext: runtimeBlobsContext,
command,
config: mergedConfig,
Expand Down
1 change: 0 additions & 1 deletion src/lib/edge-functions/registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -389,7 +389,6 @@ export class EdgeFunctionsRegistryImpl implements EdgeFunctionsRegistry {
if (
variable.sources.includes('ui') ||
variable.sources.includes('account') ||
variable.sources.includes('addons') ||
variable.sources.includes('internal') ||
variable.sources.some((source) => source.startsWith('.env'))
) {
Expand Down
26 changes: 0 additions & 26 deletions src/utils/addons/prepare.ts

This file was deleted.

Loading
Loading