netlify-cli 17.30.0 → 17.32.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.
@@ -1 +1 @@
1
- {"version":3,"file":"base-command.d.ts","sourceRoot":"","sources":["../../src/commands/base-command.ts"],"names":[],"mappings":"AAOA,OAAO,EAAiB,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAE5D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAU,MAAM,WAAW,CAAA;AA0BjD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAOxD,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD,KAAK,SAAS,GAAG;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC,CAAA;AAuGD,0EAA0E;AAC1E,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,OAAO;;IAC9C,4DAA4D;IAE5D,OAAO,EAAE,cAAc,CAAA;IACvB,SAAS,EAAE,SAAS,CAAyC;IAE7D,OAAO,EAAE,OAAO,CAAA;IAEhB;;;;OAIG;IAGH,UAAU,SAAgB;IAE1B;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAEzB,YAAY,EAAE,YAAY,CAAK;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB;;;OAGG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;IAqDxC,mIAAmI;IACnI,aAAa;IAKb,mFAAmF;IACnF,QAAQ,EAAE,MAAM,EAAE,CAAK;IACvB,oCAAoC;IACpC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE;IAK9B,iEAAiE;IACjE,UAAU,IAAI,IAAI;IAgIlB,kEAAkE;IAC5D,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO;IAwBtB,YAAY,CAAC,aAAa,CAAC,EAAE,MAAM;IAQnC,uBAAuB;IA4D7B,8CAA8C;IAC9C,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAOpD;;OAEG;YACW,IAAI;IA0LlB,iDAAiD;IAC3C,SAAS,CAAC,MAAM,EAAE;QACtB,GAAG,EAAE,MAAM,CAAA;QACX,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACrB,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,2EAA2E;QAC3E,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC;IAiDpC;;OAEG;IACH,gBAAgB,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM;IAI5C;;;;OAIG;IACH,iBAAiB,IAAI,YAAY,GAAG,KAAK;IAIzC;;OAEG;IACH,cAAc,CAAC,CAAC,GAAG,IAAI,GAAG,OAAO,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC;CAGjE"}
1
+ {"version":3,"file":"base-command.d.ts","sourceRoot":"","sources":["../../src/commands/base-command.ts"],"names":[],"mappings":"AAOA,OAAO,EAAiB,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAE5D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAU,MAAM,WAAW,CAAA;AA0BjD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAQxD,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD,KAAK,SAAS,GAAG;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC,CAAA;AAuGD,0EAA0E;AAC1E,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,OAAO;;IAC9C,4DAA4D;IAE5D,OAAO,EAAE,cAAc,CAAA;IACvB,SAAS,EAAE,SAAS,CAAyC;IAE7D,OAAO,EAAE,OAAO,CAAA;IAEhB;;;;OAIG;IAGH,UAAU,SAAgB;IAE1B;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAEzB,YAAY,EAAE,YAAY,CAAK;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB;;;OAGG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;IAqDxC,mIAAmI;IACnI,aAAa;IAKb,mFAAmF;IACnF,QAAQ,EAAE,MAAM,EAAE,CAAK;IACvB,oCAAoC;IACpC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE;IAK9B,iEAAiE;IACjE,UAAU,IAAI,IAAI;IAgIlB,kEAAkE;IAC5D,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO;IAwBtB,YAAY,CAAC,aAAa,CAAC,EAAE,MAAM;IAQnC,uBAAuB;IA4D7B,8CAA8C;IAC9C,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAOpD;;OAEG;YACW,IAAI;IAkMlB,iDAAiD;IAC3C,SAAS,CAAC,MAAM,EAAE;QACtB,GAAG,EAAE,MAAM,CAAA;QACX,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACrB,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,2EAA2E;QAC3E,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC;IAiDpC;;OAEG;IACH,gBAAgB,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM;IAI5C;;;;OAIG;IACH,iBAAiB,IAAI,YAAY,GAAG,KAAK;IAIzC;;OAEG;IACH,cAAc,CAAC,CAAC,GAAG,IAAI,GAAG,OAAO,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC;CAGjE"}
@@ -29,6 +29,7 @@ import merge from 'lodash/merge.js';
29
29
  import { NetlifyAPI } from 'netlify';
30
30
  import { getAgent } from '../lib/http-agent.js';
31
31
  import { NETLIFY_CYAN, USER_AGENT, chalk, error, exit, getToken, log, version, normalizeConfig, padLeft, pollForToken, sortOptions, warn, } from '../utils/command-helpers.js';
32
+ import { getFrameworksAPIPaths } from '../utils/frameworks-api.js';
32
33
  import getGlobalConfig from '../utils/get-global-config.js';
33
34
  import { getSiteByName } from '../utils/get-site.js';
34
35
  import openBrowser from '../utils/open-browser.js';
@@ -468,7 +469,11 @@ class BaseCommand extends Command {
468
469
  token,
469
470
  ...apiUrlOpts,
470
471
  });
471
- const { buildDir, config, configPath, env, repositoryRoot, siteInfo } = cachedConfig;
472
+ const { buildDir, config, configPath, repositoryRoot, siteInfo } = cachedConfig;
473
+ let { env } = cachedConfig;
474
+ if (flags.offlineEnv) {
475
+ env = {};
476
+ }
472
477
  env.NETLIFY_CLI_VERSION = { sources: ['internal'], value: version };
473
478
  const normalizedConfig = normalizeConfig(config);
474
479
  // If a user passes a site name as an option instead of a site ID to options.site, the siteInfo object
@@ -527,11 +532,15 @@ class BaseCommand extends Command {
527
532
  // Configuration from netlify.[toml/yml]
528
533
  config: normalizedConfig,
529
534
  // Used to avoid calling @netlify/config again
530
- cachedConfig,
535
+ cachedConfig: {
536
+ ...cachedConfig,
537
+ env,
538
+ },
531
539
  // global cli config
532
540
  globalConfig,
533
541
  // state of current site dir
534
542
  state,
543
+ frameworksAPIPaths: getFrameworksAPIPaths(buildDir, this.workspacePackage),
535
544
  };
536
545
  debug(`${this.name()}:init`)('end');
537
546
  }
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/commands/deploy/deploy.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAgCxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAouB5C,eAAO,MAAM,MAAM,YAAmB,YAAY,WAAW,WAAW,kBAmHvE,CAAA"}
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/commands/deploy/deploy.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAiCxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAwuB5C,eAAO,MAAM,MAAM,YAAmB,YAAY,WAAW,WAAW,kBAmHvE,CAAA"}
@@ -356,10 +356,15 @@ title, }) => {
356
356
  results = await api.createSiteDeploy({ siteId, title, body: { draft, branch: alias } });
357
357
  deployId = results.id;
358
358
  const internalFunctionsFolder = await getInternalFunctionsDir({ base: site.root, packagePath, ensureExists: true });
359
+ await command.netlify.frameworksAPIPaths.functions.ensureExists();
359
360
  // The order of the directories matter: zip-it-and-ship-it will prioritize
360
361
  // functions from the rightmost directories. In this case, we want user
361
362
  // functions to take precedence over internal functions.
362
- const functionDirectories = [internalFunctionsFolder, functionsFolder].filter((folder) => Boolean(folder));
363
+ const functionDirectories = [
364
+ internalFunctionsFolder,
365
+ command.netlify.frameworksAPIPaths.functions.path,
366
+ functionsFolder,
367
+ ].filter((folder) => Boolean(folder));
363
368
  const manifestPath = skipFunctionsCache ? null : await getFunctionsManifestPath({ base: site.root, packagePath });
364
369
  const redirectsPath = `${deployFolder}/_redirects`;
365
370
  const headersPath = `${deployFolder}/_headers`;
@@ -1 +1 @@
1
- {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../src/commands/dev/dev.ts"],"names":[],"mappings":"AAGA,OAAO,EAAU,YAAY,EAAE,MAAM,WAAW,CAAA;AA0BhD,OAAO,WAAW,MAAM,oBAAoB,CAAA;AA4D5C,eAAO,MAAM,GAAG,YAAmB,YAAY,WAAW,WAAW,kBA8JpE,CAAA;AAED,eAAO,MAAM,gBAAgB,YAAa,WAAW,gBA8GpD,CAAA"}
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../src/commands/dev/dev.ts"],"names":[],"mappings":"AAGA,OAAO,EAAU,YAAY,EAAE,MAAM,WAAW,CAAA;AA0BhD,OAAO,WAAW,MAAM,oBAAoB,CAAA;AA4D5C,eAAO,MAAM,GAAG,YAAmB,YAAY,WAAW,WAAW,kBA8JpE,CAAA;AAED,eAAO,MAAM,gBAAgB,YAAa,WAAW,gBAiHpD,CAAA"}
@@ -87,7 +87,7 @@ export const dev = async (options, command) => {
87
87
  siteID: site.id ?? UNLINKED_SITE_MOCK_ID,
88
88
  });
89
89
  env[BLOBS_CONTEXT_VARIABLE] = { sources: ['internal'], value: encodeBlobsContext(blobsContext) };
90
- if (!options.offline) {
90
+ if (!options.offline && !options.offlineEnv) {
91
91
  env = await getEnvelopeEnv({ api, context: options.context, env, siteInfo });
92
92
  log(`${NETLIFYDEVLOG} Injecting environment variable values for ${chalk.yellow('all scopes')}`);
93
93
  }
@@ -217,6 +217,7 @@ export const createDevCommand = (program) => {
217
217
  .option('-d ,--dir <path>', 'dir with static files')
218
218
  .option('-f ,--functions <folder>', 'specify a functions folder to serve')
219
219
  .option('-o ,--offline', 'disables any features that require network access')
220
+ .addOption(new Option('--offline-env', 'disables fetching environment variables from the Netlify API').hideHelp(true))
220
221
  .addOption(new Option('--internal-disable-edge-functions', "disables edge functions. use this if your environment doesn't support Deno. This option is internal and should not be used by end users.").hideHelp(true))
221
222
  .option('-l, --live [subdomain]', 'start a public live session; optionally, supply a subdomain to generate a custom URL', false)
222
223
  .addOption(new Option('--functionsPort <port>', 'Old, prefer --functions-port. Port of functions server')
@@ -1 +1 @@
1
- {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../src/commands/serve/serve.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AA6BxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAG5C,eAAO,MAAM,KAAK,YAAmB,YAAY,WAAW,WAAW,uBA0JtE,CAAA"}
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../src/commands/serve/serve.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AA8BxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAG5C,eAAO,MAAM,KAAK,YAAmB,YAAY,WAAW,WAAW,uBA8JtE,CAAA"}
@@ -7,13 +7,14 @@ import { NETLIFYDEVERR, NETLIFYDEVLOG, NETLIFYDEVWARN, chalk, exit, log, normali
7
7
  import detectServerSettings, { getConfigWithPlugins } from '../../utils/detect-server-settings.js';
8
8
  import { UNLINKED_SITE_MOCK_ID, getDotEnvVariables, getSiteInformation, injectEnvVariables } from '../../utils/dev.js';
9
9
  import { getEnvelopeEnv } from '../../utils/env/index.js';
10
+ import { getFrameworksAPIConfig } from '../../utils/frameworks-api.js';
10
11
  import { getInternalFunctionsDir } from '../../utils/functions/functions.js';
11
12
  import { ensureNetlifyIgnore } from '../../utils/gitignore.js';
12
13
  import openBrowser from '../../utils/open-browser.js';
13
14
  import { generateInspectSettings, startProxyServer } from '../../utils/proxy-server.js';
14
15
  import { runBuildTimeline } from '../../utils/run-build.js';
15
16
  export const serve = async (options, command) => {
16
- const { api, cachedConfig, config, repositoryRoot, site, siteInfo, state } = command.netlify;
17
+ const { api, cachedConfig, config, frameworksAPIPaths, repositoryRoot, site, siteInfo, state } = command.netlify;
17
18
  config.dev = { ...config.dev };
18
19
  config.build = { ...config.build };
19
20
  const devConfig = {
@@ -51,6 +52,7 @@ export const serve = async (options, command) => {
51
52
  ensureExists: true,
52
53
  packagePath: command.workspacePackage,
53
54
  });
55
+ await frameworksAPIPaths.functions.ensureExists();
54
56
  let settings;
55
57
  try {
56
58
  settings = await detectServerSettings(devConfig, options, command);
@@ -78,6 +80,7 @@ export const serve = async (options, command) => {
78
80
  options,
79
81
  env: {},
80
82
  });
83
+ const mergedConfig = await getFrameworksAPIConfig(config, frameworksAPIPaths.config.path);
81
84
  // Now we generate a second Blobs context object, this time with edge access
82
85
  // for runtime access (i.e. from functions and edge functions).
83
86
  const runtimeBlobsContext = await getBlobsContextWithEdgeAccess(blobsOptions);
@@ -85,7 +88,7 @@ export const serve = async (options, command) => {
85
88
  const functionsRegistry = await startFunctionsServer({
86
89
  blobsContext: runtimeBlobsContext,
87
90
  command,
88
- config,
91
+ config: mergedConfig,
89
92
  debug: options.debug,
90
93
  loadDistFunctions: true,
91
94
  settings,
@@ -118,7 +121,7 @@ export const serve = async (options, command) => {
118
121
  addonsUrls,
119
122
  blobsContext: runtimeBlobsContext,
120
123
  command,
121
- config,
124
+ config: mergedConfig,
122
125
  configPath: configPathOverride,
123
126
  debug: options.debug,
124
127
  disableEdgeFunctions: options.internalDisableEdgeFunctions,
@@ -101,6 +101,7 @@ export declare class EdgeFunctionsRegistry {
101
101
  private scanForFunctions;
102
102
  private setupWatchers;
103
103
  private setupWatcherForDirectory;
104
+ private get usesFrameworksAPI();
104
105
  }
105
106
  export {};
106
107
  //# sourceMappingURL=registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/lib/edge-functions/registry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAuD,MAAM,uBAAuB,CAAA;AAE7G,OAAO,WAAW,MAAM,gCAAgC,CAAA;AAYxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAOhE,MAAM,WAAW,MAAM;IACrB,cAAc,CAAC,EAAE,WAAW,EAAE,CAAA;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAKD,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,cAAc,uBAAuB,EAAE,KAAK,CAAC,CAAC,CAAA;AAInF,UAAU,4BAA4B;IACpC,OAAO,EAAE,WAAW,CAAA;IACpB,OAAO,EAAE,cAAc,uBAAuB,CAAC,CAAA;IAC/C,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,OAAO,CAAA;IACd,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACzD,YAAY,EAAE,YAAY,CAAA;IAC1B,gBAAgB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;IACvC,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,UAAU,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AA6CD,qBAAa,qBAAqB;IACzB,yBAAyB,CAAC,EAAE,MAAM,CAAA;IAEzC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,OAAO,CAAwC;IACvD,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,iBAAiB,CAAC,CAAQ;IAClC,OAAO,CAAC,4BAA4B,CAAoB;IACxD,OAAO,CAAC,oBAAoB,CAAe;IAG3C,OAAO,CAAC,eAAe,CAAiC;IAExD,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,iBAAiB,CAAkD;IAC3E,OAAO,CAAC,GAAG,CAAwB;IACnC,OAAO,CAAC,YAAY,CAAc;IAElC,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,iBAAiB,CAAqB;IAK9C,OAAO,CAAC,aAAa,CAA4B;IAEjD,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,OAAO,CAAa;gBAEhB,EACV,OAAO,EACP,OAAO,EACP,MAAM,EACN,UAAU,EACV,WAAW,EACX,GAAG,EACH,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,UAAU,EACV,SAAS,GACV,EAAE,4BAA4B;YAoBjB,aAAa;IAc3B,OAAO,KAAK,SAAS,GAEpB;YAEa,KAAK;IAmEnB;;;;;OAKG;IACH,OAAO,CAAC,WAAW;YA0BL,+BAA+B;IAsB7C,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAMtC,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,MAAM,CAAC,uBAAuB;YAoBxB,gBAAgB;IAoCxB,UAAU;IAIhB;;OAEG;IACH,OAAO,CAAC,QAAQ;IA2ChB;;;OAGG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;;;;;;;;;IA2C5C;;;OAGG;IACH,OAAO,CAAC,YAAY;IA4CpB;;;OAGG;YACW,QAAQ;IAqBtB,OAAO,KAAK,iBAAiB,GAE5B;YAEa,gBAAgB;YAShB,mBAAmB;YAgBnB,gBAAgB;YA+BhB,aAAa;YAwBb,wBAAwB;CAWvC"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/lib/edge-functions/registry.ts"],"names":[],"mappings":"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"}
@@ -338,9 +338,16 @@ export class EdgeFunctionsRegistry {
338
338
  success: true,
339
339
  };
340
340
  }
341
+ const importMapPaths = [this.importMapFromTOML, this.importMapFromDeployConfig];
342
+ if (this.usesFrameworksAPI) {
343
+ const { edgeFunctionsImportMap } = this.command.netlify.frameworksAPIPaths;
344
+ if (await edgeFunctionsImportMap.exists()) {
345
+ importMapPaths.push(edgeFunctionsImportMap.path);
346
+ }
347
+ }
341
348
  const { functionsConfig, graph, npmSpecifiersWithExtraneousFiles, success } = await this.runIsolate(this.functions, this.env, {
342
349
  getFunctionsConfig: true,
343
- importMapPaths: [this.importMapFromTOML, this.importMapFromDeployConfig].filter(nonNullable),
350
+ importMapPaths: importMapPaths.filter(nonNullable),
344
351
  });
345
352
  return { functionsConfig, graph, npmSpecifiersWithExtraneousFiles, success };
346
353
  }
@@ -370,11 +377,13 @@ export class EdgeFunctionsRegistry {
370
377
  : undefined;
371
378
  }
372
379
  async scanForFunctions() {
373
- const [internalFunctions, userFunctions] = await Promise.all([
380
+ const [frameworkFunctions, integrationFunctions, userFunctions] = await Promise.all([
381
+ this.usesFrameworksAPI ? this.bundler.find([this.command.netlify.frameworksAPIPaths.edgeFunctions.path]) : [],
374
382
  this.bundler.find([this.internalDirectory]),
375
383
  this.bundler.find(this.directories),
376
384
  this.scanForDeployConfig(),
377
385
  ]);
386
+ const internalFunctions = [...frameworkFunctions, ...integrationFunctions];
378
387
  const functions = [...internalFunctions, ...userFunctions];
379
388
  const newFunctions = functions.filter((func) => {
380
389
  const functionExists = this.functions.some((existingFunc) => func.name === existingFunc.name && func.path === existingFunc.path);
@@ -419,4 +428,9 @@ export class EdgeFunctionsRegistry {
419
428
  });
420
429
  this.directoryWatchers.set(this.projectDir, watcher);
421
430
  }
431
+ // We only take into account edge functions from the Frameworks API in
432
+ // the `serve` command, since we don't run the build command in `dev`.
433
+ get usesFrameworksAPI() {
434
+ return this.command.name() === 'serve';
435
+ }
422
436
  }
@@ -1,4 +1,5 @@
1
1
  import { ListedFunction, listFunctions } from '@netlify/zip-it-and-ship-it';
2
+ import { getFrameworksAPIPaths } from '../../utils/frameworks-api.js';
2
3
  import type { BlobsContext } from '../blobs/blobs.js';
3
4
  import NetlifyFunction from './netlify-function.js';
4
5
  export declare const DEFAULT_FUNCTION_URL_EXPRESSION: RegExp;
@@ -27,9 +28,11 @@ export declare class FunctionsRegistry {
27
28
  private projectRoot;
28
29
  private isConnected;
29
30
  private debug;
30
- constructor({ blobsContext, capabilities, config, debug, isConnected, logLambdaCompat, manifest, projectRoot, settings, timeouts, }: {
31
+ private frameworksAPIPaths;
32
+ constructor({ blobsContext, capabilities, config, debug, frameworksAPIPaths, isConnected, logLambdaCompat, manifest, projectRoot, settings, timeouts, }: {
31
33
  projectRoot: string;
32
34
  debug?: boolean;
35
+ frameworksAPIPaths: ReturnType<typeof getFrameworksAPIPaths>;
33
36
  isConnected?: boolean;
34
37
  blobsContext: BlobsContext;
35
38
  } & object);
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/lib/functions/registry.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAc3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAIrD,OAAO,eAAe,MAAM,uBAAuB,CAAA;AAGnD,eAAO,MAAM,+BAA+B,QAAiD,CAAA;AAO7F;;GAEG;AAEH,qBAAa,iBAAiB;IAC5B;;OAEG;IACH,OAAO,CAAC,SAAS,CAAqC;IAEtD;;;OAGG;IACH,OAAO,CAAC,gBAAgB,CAAgE;IAExF;;;OAGG;IACH,OAAO,CAAC,sBAAsB,CAAQ;IAEtC;;OAEG;IACH,OAAO,CAAC,YAAY,CAAc;IAElC,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAS;gBAEV,EACV,YAAY,EAEZ,YAAY,EAEZ,MAAM,EACN,KAAa,EACb,WAAmB,EAEnB,eAAe,EAEf,QAAQ,EACR,WAAW,EAEX,QAAQ,EAER,QAAQ,GACT,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,YAAY,CAAA;KAAE,GAAG,MAAM;IAoDvG,iBAAiB;IAoBjB;;;;OAIG;WACU,oBAAoB,CAAC,SAAS,EAAE,MAAM;IAmBnD;;;OAGG;IACG,0BAA0B,CAAC,IAAI,EAAE,eAAe,EAAE,SAAS,UAAQ;IAsEzE;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM;IAIhB;;;;;;OAMG;IACG,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC;;;;;;;IAyClG;;OAEG;IACH,MAAM,CAAC,QAAQ,CACb,KAAK,EAAE,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,uBAAuB,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,EAC7G,EAAE,IAAI,EAAE,QAAa,EAAE,EAAE;QAAE,IAAI,EAAE,eAAe,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE;IAoEzE;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,QAAQ,UAAQ;IA+DtF;;;OAGG;IAEG,aAAa,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC;IAI7D;;;;OAIG;IACG,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE;IAkH/C;;;;OAIG;IACG,qBAAqB,CAAC,SAAS,EAAE,MAAM;IAoB7C;;OAEG;IACG,kBAAkB,CAAC,IAAI,EAAE,eAAe;IAc9C;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,eAAe;CAU1C"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/lib/functions/registry.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAa3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAA;AAErE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAIrD,OAAO,eAAe,MAAM,uBAAuB,CAAA;AAGnD,eAAO,MAAM,+BAA+B,QAAiD,CAAA;AAQ7F;;GAEG;AAEH,qBAAa,iBAAiB;IAC5B;;OAEG;IACH,OAAO,CAAC,SAAS,CAAqC;IAEtD;;;OAGG;IACH,OAAO,CAAC,gBAAgB,CAAgE;IAExF;;;OAGG;IACH,OAAO,CAAC,sBAAsB,CAAQ;IAEtC;;OAEG;IACH,OAAO,CAAC,YAAY,CAAc;IAElC,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,kBAAkB,CAA0C;gBAExD,EACV,YAAY,EAEZ,YAAY,EAEZ,MAAM,EACN,KAAa,EACb,kBAAkB,EAClB,WAAmB,EAEnB,eAAe,EAEf,QAAQ,EACR,WAAW,EAEX,QAAQ,EAER,QAAQ,GACT,EAAE;QACD,WAAW,EAAE,MAAM,CAAA;QACnB,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,kBAAkB,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAA;QAC5D,WAAW,CAAC,EAAE,OAAO,CAAA;QACrB,YAAY,EAAE,YAAY,CAAA;KAC3B,GAAG,MAAM;IAqDV,iBAAiB;IAoBjB;;;;OAIG;WACU,oBAAoB,CAAC,SAAS,EAAE,MAAM;IAmBnD;;;OAGG;IACG,0BAA0B,CAAC,IAAI,EAAE,eAAe,EAAE,SAAS,UAAQ;IAsEzE;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM;IAIhB;;;;;;OAMG;IACG,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC;;;;;;;IAyClG;;OAEG;IACH,MAAM,CAAC,QAAQ,CACb,KAAK,EAAE,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,uBAAuB,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,EAC7G,EAAE,IAAI,EAAE,QAAa,EAAE,EAAE;QAAE,IAAI,EAAE,eAAe,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE;IAoEzE;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,QAAQ,UAAQ;IAsEtF;;;OAGG;IAEG,aAAa,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC;IAI7D;;;;OAIG;IACG,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE;IAkH/C;;;;OAIG;IACG,qBAAqB,CAAC,SAAS,EAAE,MAAM;IAoB7C;;OAEG;IACG,kBAAkB,CAAC,IAAI,EAAE,eAAe;IAc9C;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,eAAe;CAU1C"}
@@ -13,7 +13,8 @@ import runtimes from './runtimes/index.js';
13
13
  export const DEFAULT_FUNCTION_URL_EXPRESSION = /^\/.netlify\/(functions|builders)\/([^/]+).*/;
14
14
  const TYPES_PACKAGE = '@netlify/functions';
15
15
  const ZIP_EXTENSION = '.zip';
16
- const isInternalFunction = (func) => func.mainFile.includes(getPathInProject([INTERNAL_FUNCTIONS_FOLDER]));
16
+ const isInternalFunction = (func, frameworksAPIFunctionsPath) => func.mainFile.includes(getPathInProject([INTERNAL_FUNCTIONS_FOLDER])) ||
17
+ func.mainFile.includes(frameworksAPIFunctionsPath);
17
18
  /**
18
19
  * @typedef {"buildError" | "extracted" | "loaded" | "missing-types-package" | "reloaded" | "reloading" | "removed"} FunctionEvent
19
20
  */
@@ -22,7 +23,7 @@ export class FunctionsRegistry {
22
23
  // @ts-expect-error TS(7031) FIXME: Binding element 'capabilities' implicitly has an '... Remove this comment to see the full error message
23
24
  capabilities,
24
25
  // @ts-expect-error TS(7031) FIXME: Binding element 'config' implicitly has an 'any' t... Remove this comment to see the full error message
25
- config, debug = false, isConnected = false,
26
+ config, debug = false, frameworksAPIPaths, isConnected = false,
26
27
  // @ts-expect-error TS(7031) FIXME: Binding element 'logLambdaCompat' implicitly has a... Remove this comment to see the full error message
27
28
  logLambdaCompat,
28
29
  // @ts-expect-error TS(7031) FIXME: Binding element 'manifest' implicitly has an 'any'... Remove this comment to see the full error message
@@ -50,6 +51,7 @@ export class FunctionsRegistry {
50
51
  // @ts-expect-error TS(2339) FIXME: Property 'config' does not exist on type 'Function... Remove this comment to see the full error message
51
52
  this.config = config;
52
53
  this.debug = debug;
54
+ this.frameworksAPIPaths = frameworksAPIPaths;
53
55
  this.isConnected = isConnected;
54
56
  this.projectRoot = projectRoot;
55
57
  // @ts-expect-error TS(2339) FIXME: Property 'timeouts' does not exist on type 'Functi... Remove this comment to see the full error message
@@ -295,13 +297,19 @@ export class FunctionsRegistry {
295
297
  // the new location.
296
298
  if (extname(func.mainFile) === ZIP_EXTENSION) {
297
299
  const unzippedDirectory = await this.unzipFunction(func);
298
- if (this.debug) {
299
- FunctionsRegistry.logEvent('extracted', { func });
300
- }
301
300
  // If there's a manifest file, look up the function in order to extract
302
301
  // the build data.
303
302
  // @ts-expect-error TS(2339) FIXME: Property 'manifest' does not exist on type 'Functi... Remove this comment to see the full error message
304
303
  const manifestEntry = (this.manifest?.functions || []).find((manifestFunc) => manifestFunc.name === func.name);
304
+ // We found a zipped function that does not have a corresponding entry in
305
+ // the manifest. This shouldn't happen, but we ignore the function in
306
+ // this case.
307
+ if (!manifestEntry) {
308
+ return;
309
+ }
310
+ if (this.debug) {
311
+ FunctionsRegistry.logEvent('extracted', { func });
312
+ }
305
313
  func.buildData = {
306
314
  ...manifestEntry?.buildData,
307
315
  routes: manifestEntry?.routes,
@@ -357,9 +365,9 @@ export class FunctionsRegistry {
357
365
  // user-defined functions take precedence over internal functions,
358
366
  // so we want to ignore any internal functions where there's a user-defined one with the same name
359
367
  const ignoredFunctions = new Set(functions
360
- .filter((func) => isInternalFunction(func) &&
368
+ .filter((func) => isInternalFunction(func, this.frameworksAPIPaths.functions.path) &&
361
369
  this.functions.has(func.name) &&
362
- !isInternalFunction(this.functions.get(func.name)))
370
+ !isInternalFunction(this.functions.get(func.name), this.frameworksAPIPaths.functions.path))
363
371
  .map((func) => func.name));
364
372
  // Before registering any functions, we look for any functions that were on
365
373
  // the previous list but are missing from the new one. We unregister them.
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/lib/functions/server.ts"],"names":[],"mappings":"AAIA,OAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAA;AAKtD,OAAO,KAAK,WAAW,MAAM,gCAAgC,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAWvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAMrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAuDjD,eAAO,MAAM,aAAa,YAAsB,yBAAyB,KAAG,cA6K3E,CAAA;AAED,UAAU,yBAAyB;IACjC,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,QAAQ,CAAA;IACf,MAAM,EAAE,QAAQ,CAAA;IAChB,eAAe,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAA;CAC7C;AA4BD,eAAO,MAAM,oBAAoB,YACtB;IACP,YAAY,EAAE,YAAY,CAAA;IAC1B,OAAO,EAAE,WAAW,CAAA;IACpB,MAAM,EAAE,QAAQ,CAAA;IAChB,YAAY,EAAE,QAAQ,CAAA;IACtB,KAAK,EAAE,OAAO,CAAA;IACd,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,QAAQ,EAAE,QAAQ,CAAA;IAClB,IAAI,EAAE,QAAQ,CAAA;IACd,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,EAAE,QAAQ,CAAA;CACnB,GAAG,KAAK,yBAAyB,EAAE,mBAAmB,CAAC,KACvD,QAAQ,iBAAiB,GAAG,SAAS,CAiFvC,CAAA"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/lib/functions/server.ts"],"names":[],"mappings":"AAIA,OAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAA;AAKtD,OAAO,KAAK,WAAW,MAAM,gCAAgC,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAWvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAMrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAuDjD,eAAO,MAAM,aAAa,YAAsB,yBAAyB,KAAG,cA6K3E,CAAA;AAED,UAAU,yBAAyB;IACjC,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,QAAQ,CAAA;IACf,MAAM,EAAE,QAAQ,CAAA;IAChB,eAAe,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAA;CAC7C;AA4BD,eAAO,MAAM,oBAAoB,YACtB;IACP,YAAY,EAAE,YAAY,CAAA;IAC1B,OAAO,EAAE,WAAW,CAAA;IACpB,MAAM,EAAE,QAAQ,CAAA;IAChB,YAAY,EAAE,QAAQ,CAAA;IACtB,KAAK,EAAE,OAAO,CAAA;IACd,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,QAAQ,EAAE,QAAQ,CAAA;IAClB,IAAI,EAAE,QAAQ,CAAA;IACd,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,EAAE,QAAQ,CAAA;CACnB,GAAG,KAAK,yBAAyB,EAAE,mBAAmB,CAAC,KACvD,QAAQ,iBAAiB,GAAG,SAAS,CAsFvC,CAAA"}
@@ -249,7 +249,11 @@ export const startFunctionsServer = async (options) => {
249
249
  else {
250
250
  // The order of the function directories matters. Rightmost directories take
251
251
  // precedence.
252
- const sourceDirectories = [internalFunctionsDir, settings.functions].filter(Boolean);
252
+ const sourceDirectories = [
253
+ internalFunctionsDir,
254
+ command.netlify.frameworksAPIPaths.functions.path,
255
+ settings.functions,
256
+ ].filter(Boolean);
253
257
  functionsDirectories.push(...sourceDirectories);
254
258
  }
255
259
  try {
@@ -268,6 +272,7 @@ export const startFunctionsServer = async (options) => {
268
272
  capabilities,
269
273
  config,
270
274
  debug,
275
+ frameworksAPIPaths: command.netlify.frameworksAPIPaths,
271
276
  isConnected: Boolean(siteUrl),
272
277
  logLambdaCompat: isFeatureFlagEnabled('cli_log_lambda_compat', siteInfo),
273
278
  manifest,