netlify-cli 18.0.3 → 18.1.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.
Files changed (71) hide show
  1. package/dist/commands/blobs/blobs-delete.d.ts.map +1 -1
  2. package/dist/commands/functions/functions-create.d.ts.map +1 -1
  3. package/dist/commands/functions/functions-create.js +0 -3
  4. package/dist/commands/recipes/recipes.d.ts +1 -2
  5. package/dist/commands/recipes/recipes.d.ts.map +1 -1
  6. package/dist/commands/sites/sites-create.d.ts.map +1 -1
  7. package/dist/lib/edge-functions/proxy.d.ts +1 -1
  8. package/dist/lib/edge-functions/proxy.d.ts.map +1 -1
  9. package/dist/lib/functions/form-submissions-handler.d.ts +1 -1
  10. package/dist/lib/functions/form-submissions-handler.d.ts.map +1 -1
  11. package/dist/lib/functions/runtimes/js/builders/netlify-lambda.d.ts +1 -3
  12. package/dist/lib/functions/runtimes/js/builders/netlify-lambda.d.ts.map +1 -1
  13. package/dist/lib/functions/runtimes/js/index.d.ts.map +1 -1
  14. package/dist/lib/functions/server.d.ts +1 -1
  15. package/dist/lib/functions/server.d.ts.map +1 -1
  16. package/dist/lib/images/proxy.d.ts.map +1 -1
  17. package/dist/lib/spinner.d.ts +1 -1
  18. package/dist/lib/spinner.d.ts.map +1 -1
  19. package/dist/recipes/ai-context/context.d.ts +33 -0
  20. package/dist/recipes/ai-context/context.d.ts.map +1 -0
  21. package/dist/recipes/ai-context/context.js +100 -0
  22. package/dist/recipes/ai-context/index.d.ts +4 -0
  23. package/dist/recipes/ai-context/index.d.ts.map +1 -0
  24. package/dist/recipes/ai-context/index.js +85 -0
  25. package/dist/tsconfig.tsbuildinfo +1 -1
  26. package/dist/utils/build-info.d.ts +1 -1
  27. package/dist/utils/build-info.d.ts.map +1 -1
  28. package/dist/utils/command-helpers.d.ts +0 -1
  29. package/dist/utils/command-helpers.d.ts.map +1 -1
  30. package/dist/utils/copy-template-dir/copy-template-dir.js +1 -1
  31. package/dist/utils/create-stream-promise.d.ts.map +1 -1
  32. package/dist/utils/deploy/deploy-site.d.ts +10 -10
  33. package/dist/utils/deploy/deploy-site.d.ts.map +1 -1
  34. package/dist/utils/deploy/hash-config.d.ts.map +1 -1
  35. package/dist/utils/deploy/hash-config.js +2 -2
  36. package/dist/utils/deploy/hash-fns.d.ts.map +1 -1
  37. package/dist/utils/deploy/hasher-segments.d.ts.map +1 -1
  38. package/dist/utils/deploy/hasher-segments.js +9 -3
  39. package/dist/utils/detect-server-settings.d.ts.map +1 -1
  40. package/dist/utils/dev.d.ts +1 -1
  41. package/dist/utils/dev.d.ts.map +1 -1
  42. package/dist/utils/env/index.d.ts +2 -2
  43. package/dist/utils/env/index.d.ts.map +1 -1
  44. package/dist/utils/feature-flags.d.ts.map +1 -1
  45. package/dist/utils/framework-server.d.ts.map +1 -1
  46. package/dist/utils/frameworks-api.d.ts +1 -1
  47. package/dist/utils/functions/functions.d.ts +5 -5
  48. package/dist/utils/functions/functions.d.ts.map +1 -1
  49. package/dist/utils/get-repo-data.d.ts +1 -1
  50. package/dist/utils/get-repo-data.d.ts.map +1 -1
  51. package/dist/utils/headers.d.ts.map +1 -1
  52. package/dist/utils/init/utils.d.ts.map +1 -1
  53. package/dist/utils/prompts/blob-delete-prompts.d.ts.map +1 -1
  54. package/dist/utils/prompts/blob-set-prompt.d.ts.map +1 -1
  55. package/dist/utils/prompts/confirm-prompt.d.ts.map +1 -1
  56. package/dist/utils/prompts/env-set-prompts.d.ts.map +1 -1
  57. package/dist/utils/prompts/env-unset-prompts.d.ts.map +1 -1
  58. package/dist/utils/proxy-server.d.ts +7 -7
  59. package/dist/utils/proxy-server.d.ts.map +1 -1
  60. package/dist/utils/proxy.d.ts +2 -2
  61. package/dist/utils/proxy.d.ts.map +1 -1
  62. package/dist/utils/read-repo-url.js +1 -1
  63. package/dist/utils/rules-proxy.d.ts.map +1 -1
  64. package/dist/utils/run-build.d.ts +1 -8
  65. package/dist/utils/run-build.d.ts.map +1 -1
  66. package/dist/utils/sites/create-template.d.ts.map +1 -1
  67. package/dist/utils/sites/utils.d.ts.map +1 -1
  68. package/dist/utils/types.d.ts +0 -4
  69. package/dist/utils/types.d.ts.map +1 -1
  70. package/npm-shrinkwrap.json +1561 -1212
  71. package/package.json +19 -20
@@ -1 +1 @@
1
- {"version":3,"file":"blobs-delete.d.ts","sourceRoot":"","sources":["../../../src/commands/blobs/blobs-delete.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,eAAO,MAAM,WAAW,cAAqB,MAAM,OAAO,MAAM,YAAY,OAAO,MAAM,EAAE,OAAO,CAAC,WAAW,GAAG,kBAsBhH,CAAA"}
1
+ {"version":3,"file":"blobs-delete.d.ts","sourceRoot":"","sources":["../../../src/commands/blobs/blobs-delete.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,eAAO,MAAM,WAAW,cAAqB,MAAM,OAAO,MAAM,YAAY,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,GAAG,kBAsBhH,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"functions-create.d.ts","sourceRoot":"","sources":["../../../src/commands/functions/functions-create.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAsBxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAotB5C,eAAO,MAAM,eAAe,SAAgB,MAAM,WAAW,YAAY,WAAW,WAAW,kBAQ9F,CAAA"}
1
+ {"version":3,"file":"functions-create.d.ts","sourceRoot":"","sources":["../../../src/commands/functions/functions-create.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAsBxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAitB5C,eAAO,MAAM,eAAe,SAAgB,MAAM,WAAW,YAAY,WAAW,WAAW,kBAQ9F,CAAA"}
@@ -158,7 +158,6 @@ const pickTemplate = async function ({ language: languageFromFlag }, funcType) {
158
158
  });
159
159
  language = languageFromPrompt;
160
160
  }
161
- // @ts-expect-error TS(7034) FIXME: Variable 'templatesForLanguage' implicitly has typ... Remove this comment to see the full error message
162
161
  let templatesForLanguage;
163
162
  try {
164
163
  templatesForLanguage = await formatRegistryArrayForInquirer(language, funcType);
@@ -179,11 +178,9 @@ const pickTemplate = async function ({ language: languageFromFlag }, funcType) {
179
178
  const parsedSpecialCommands = funcType === 'edge' ? edgeCommands : specialCommands;
180
179
  if (!input || input === '') {
181
180
  // show separators
182
- // @ts-expect-error TS(7005) FIXME: Variable 'templatesForLanguage' implicitly has an ... Remove this comment to see the full error message
183
181
  return [...templatesForLanguage, ...parsedSpecialCommands];
184
182
  }
185
183
  // only show filtered results sorted by score
186
- // @ts-expect-error TS(7005) FIXME: Variable 'templatesForLanguage' implicitly has an ... Remove this comment to see the full error message
187
184
  const answers = [...filterRegistry(templatesForLanguage, input), ...parsedSpecialCommands].sort((answerA, answerB) => answerB.score - answerA.score);
188
185
  return answers;
189
186
  },
@@ -1,6 +1,6 @@
1
1
  import { OptionValues } from 'commander';
2
2
  import BaseCommand from '../base-command.js';
3
- interface RunRecipeOptions {
3
+ export interface RunRecipeOptions {
4
4
  args: string[];
5
5
  command?: BaseCommand;
6
6
  config: unknown;
@@ -9,5 +9,4 @@ interface RunRecipeOptions {
9
9
  }
10
10
  export declare const runRecipe: ({ args, command, config, recipeName, repositoryRoot }: RunRecipeOptions) => Promise<any>;
11
11
  export declare const recipesCommand: (recipeName: string, options: OptionValues, command: BaseCommand) => Promise<any>;
12
- export {};
13
12
  //# sourceMappingURL=recipes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"recipes.d.ts","sourceRoot":"","sources":["../../../src/commands/recipes/recipes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAKxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAM5C,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB,MAAM,EAAE,OAAO,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,eAAO,MAAM,SAAS,0DAAiE,gBAAgB,iBAItG,CAAA;AAED,eAAO,MAAM,cAAc,eAAsB,MAAM,WAAW,YAAY,WAAW,WAAW,KAAG,QAAQ,GAAG,CAgDjH,CAAA"}
1
+ {"version":3,"file":"recipes.d.ts","sourceRoot":"","sources":["../../../src/commands/recipes/recipes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAKxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAM5C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB,MAAM,EAAE,OAAO,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,eAAO,MAAM,SAAS,0DAAiE,gBAAgB,iBAItG,CAAA;AAED,eAAO,MAAM,cAAc,eAAsB,MAAM,WAAW,YAAY,WAAW,WAAW,KAAG,OAAO,CAAC,GAAG,CAgDjH,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"sites-create.d.ts","sourceRoot":"","sources":["../../../src/commands/sites/sites-create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAUxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAG5C,eAAO,MAAM,gBAAgB,SAAgB,MAAM,GAAG,SAAS;UAAmB,MAAM;EAevF,CAAA;AAED,eAAO,MAAM,WAAW,YAAmB,YAAY,WAAW,WAAW,uBAqH5E,CAAA"}
1
+ {"version":3,"file":"sites-create.d.ts","sourceRoot":"","sources":["../../../src/commands/sites/sites-create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAUxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAG5C,eAAO,MAAM,gBAAgB,SAAgB,MAAM,GAAG,SAAS,KAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAezF,CAAA;AAED,eAAO,MAAM,WAAW,YAAmB,YAAY,WAAW,WAAW,uBAqH5E,CAAA"}
@@ -27,7 +27,7 @@ export declare const initializeProxy: ({ accountId, blobsContext, command, confi
27
27
  mainPort: $TSFixMe;
28
28
  passthroughPort: $TSFixMe;
29
29
  projectDir: string;
30
- repositoryRoot?: string | undefined;
30
+ repositoryRoot?: string;
31
31
  settings: $TSFixMe;
32
32
  siteInfo: $TSFixMe;
33
33
  state: $TSFixMe;
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../../src/lib/edge-functions/proxy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AAM3C,OAAO,WAAW,MAAM,gCAAgC,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAGlD,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAA;AAU9D,QAAA,MAAM,aAAa,eAAmC,CAAA;AAsBtD,eAAO,MAAM,kBAAkB,mCAI9B,CAAA;AAKD,UAAU,QAAQ;IAChB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,eAAO,MAAM,oBAAoB,aAAc,QAAQ,YAAY,MAAM,WAKxE,CAAA;AAED,eAAO,MAAM,uBAAuB,8BAMnC,CAAA;AAED,eAAO,MAAM,eAAe;eAqBf,MAAM;kBACH,0BAA0B;aAC/B,WAAW;YACZ,QAAQ;gBACJ,MAAM;WACX,OAAO;SACT,QAAQ;aACJ,QAAQ;gBACL,QAAQ;qBACH,QAAQ;sBACP,QAAQ;qBACT,QAAQ;cACf,QAAQ;qBACD,QAAQ;gBACb,MAAM;;cAER,QAAQ;cACR,QAAQ;WACX,QAAQ;oBAyBI,eAAe,GAAG;IAAE,eAAe,EAAE,OAAO,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,iCAmDjF,CAAA;AAGD,eAAO,MAAM,sBAAsB,uBAA4C,CAAA"}
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../../src/lib/edge-functions/proxy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AAM3C,OAAO,WAAW,MAAM,gCAAgC,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAGlD,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAA;AAU9D,QAAA,MAAM,aAAa,eAAmC,CAAA;AAsBtD,eAAO,MAAM,kBAAkB,mCAI9B,CAAA;AAKD,UAAU,QAAQ;IAChB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,eAAO,MAAM,oBAAoB,aAAc,QAAQ,YAAY,MAAM,WAKxE,CAAA;AAED,eAAO,MAAM,uBAAuB,8BAMnC,CAAA;AAED,eAAO,MAAM,eAAe,gPAoBzB;IACD,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,0BAA0B,CAAA;IACxC,OAAO,EAAE,WAAW,CAAA;IACpB,MAAM,EAAE,QAAQ,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,OAAO,CAAA;IACd,GAAG,EAAE,QAAQ,CAAA;IACb,OAAO,EAAE,QAAQ,CAAA;IACjB,UAAU,EAAE,QAAQ,CAAA;IACpB,eAAe,EAAE,QAAQ,CAAA;IACzB,gBAAgB,EAAE,QAAQ,CAAA;IAC1B,eAAe,EAAE,QAAQ,CAAA;IACzB,QAAQ,EAAE,QAAQ,CAAA;IAClB,eAAe,EAAE,QAAQ,CAAA;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,EAAE,QAAQ,CAAA;IAClB,KAAK,EAAE,QAAQ,CAAA;CAChB,mBAwBoB,eAAe,GAAG;IAAE,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,iCAmDjF,CAAA;AAGD,eAAO,MAAM,sBAAsB,uBAA4C,CAAA"}
@@ -2,7 +2,7 @@ import type { RequestHandler } from 'express';
2
2
  import type { FunctionsRegistry } from './registry.js';
3
3
  export declare const getFormHandler: ({ functionsRegistry, logWarning, }: {
4
4
  functionsRegistry: FunctionsRegistry;
5
- logWarning?: boolean | undefined;
5
+ logWarning?: boolean;
6
6
  }) => string | undefined;
7
7
  export declare const createFormSubmissionHandler: ({ functionsRegistry, siteUrl, }: {
8
8
  functionsRegistry: FunctionsRegistry;
@@ -1 +1 @@
1
- {"version":3,"file":"form-submissions-handler.d.ts","sourceRoot":"","sources":["../../../src/lib/functions/form-submissions-handler.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAU7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEtD,eAAO,MAAM,cAAc;uBAIN,iBAAiB;;wBAqBrC,CAAA;AAED,eAAO,MAAM,2BAA2B;uBAInB,iBAAiB;aAC3B,MAAM;MACb,cAwIH,CAAA"}
1
+ {"version":3,"file":"form-submissions-handler.d.ts","sourceRoot":"","sources":["../../../src/lib/functions/form-submissions-handler.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAU7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEtD,eAAO,MAAM,cAAc,uCAGxB;IACD,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,uBAmBA,CAAA;AAED,eAAO,MAAM,2BAA2B,oCAGrC;IACD,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,OAAO,EAAE,MAAM,CAAA;CAChB,KAAG,cAwIH,CAAA"}
@@ -1,6 +1,4 @@
1
- export declare const detectNetlifyLambda: ({ packageJson }?: {
2
- packageJson: any;
3
- }) => Promise<false | {
1
+ export declare const detectNetlifyLambda: ({ packageJson }?: {}) => Promise<false | {
4
2
  build: ({ cache }?: {
5
3
  cache?: {} | undefined;
6
4
  }) => Promise<{
@@ -1 +1 @@
1
- {"version":3,"file":"netlify-lambda.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/functions/runtimes/js/builders/netlify-lambda.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,mBAAmB;;;;;;;;;;EAqD/B,CAAA;AAED,wBAA8B,OAAO;;;;;;;;GASpC"}
1
+ {"version":3,"file":"netlify-lambda.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/functions/runtimes/js/builders/netlify-lambda.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,mBAAmB;;;;;;;;EAqD/B,CAAA;AAED,wBAA8B,OAAO;;;;;;;;GASpC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lib/functions/runtimes/js/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,eAAe,MAAM,2BAA2B,CAAA;AAK5D,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAA;AAExD,eAAO,MAAM,IAAI,OAAO,CAAA;AAqBxB,eAAO,MAAM,gBAAgB;;;;;;kBAsB5B,CAAA;AAKD,eAAO,MAAM,cAAc;;;;;;sBAsC1B,CAAA;AAED,eAAO,MAAM,sBAAsB;aAMxB,QAAQ;WACV,QAAQ;UACT,eAAe;aACZ,MAAM;sBAwBhB,CAAA;AAED,eAAO,MAAM,eAAe,qBAS3B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lib/functions/runtimes/js/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,eAAe,MAAM,2BAA2B,CAAA;AAK5D,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAA;AAExD,eAAO,MAAM,IAAI,OAAO,CAAA;AAqBxB,eAAO,MAAM,gBAAgB;;;;;;kBAsB5B,CAAA;AAKD,eAAO,MAAM,cAAc;;;;;;sBAsC1B,CAAA;AAED,eAAO,MAAM,sBAAsB,uCAKhC;IACD,OAAO,EAAE,QAAQ,CAAA;IACjB,KAAK,EAAE,QAAQ,CAAA;IACf,IAAI,EAAE,eAAe,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;CAChB,qBAuBA,CAAA;AAED,eAAO,MAAM,eAAe,qBAS3B,CAAA"}
@@ -26,6 +26,6 @@ export declare const startFunctionsServer: (options: {
26
26
  site: $TSFixMe;
27
27
  siteInfo: $TSFixMe;
28
28
  timeouts: $TSFixMe;
29
- } & Omit<GetFunctionsServerOptions, 'functionsRegistry'>) => Promise<FunctionsRegistry | undefined>;
29
+ } & Omit<GetFunctionsServerOptions, "functionsRegistry">) => Promise<FunctionsRegistry | undefined>;
30
30
  export {};
31
31
  //# sourceMappingURL=server.d.ts.map
@@ -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,CAsFvC,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,IAAI,CAAC,yBAAyB,EAAE,mBAAmB,CAAC,KACvD,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAsFvC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../../src/lib/images/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAM9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAE5D,eAAO,MAAM,iBAAiB,qBAAqB,CAAA;AAEnD,UAAU,WAAW;IACnB,CAAC,CAAC,EAAE,MAAM,CAAA;IACV,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,CAAC,CAAC,EAAE,MAAM,CAAA;IACV,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,CAAC,CAAC,EAAE,MAAM,CAAA;IACV,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAaD,eAAO,MAAM,oBAAoB;YAAgC,WAAW,EAAE;oBAAkB,MAAM,EAAE;CAqBvG,CAAA;AAED,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAA;CAChB;AAMD,eAAO,MAAM,wBAAwB,WAA2B,WAAW,EAAE,kBAO5E,CAAA;AAGD,eAAO,MAAM,iBAAiB;;uBAS7B,CAAA;AAED,eAAO,MAAM,cAAc,QAAkB,eAAe,KAAG,OAE9D,CAAA;AAED,eAAO,MAAM,oBAAoB,UAAoB,WAAW,KAAG,MA4BlE,CAAA;AAED,eAAO,MAAM,eAAe;YAIlB,aAAa;cACX,cAAc;0DA4DzB,CAAA"}
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../../src/lib/images/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAM9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAE5D,eAAO,MAAM,iBAAiB,qBAAqB,CAAA;AAEnD,UAAU,WAAW;IACnB,CAAC,CAAC,EAAE,MAAM,CAAA;IACV,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,CAAC,CAAC,EAAE,MAAM,CAAA;IACV,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,CAAC,CAAC,EAAE,MAAM,CAAA;IACV,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAaD,eAAO,MAAM,oBAAoB,mBAAsB;IAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAAC,cAAc,EAAE,MAAM,EAAE,CAAA;CAqBvG,CAAA;AAED,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAA;CAChB;AAMD,eAAO,MAAM,wBAAwB,WAA2B,WAAW,EAAE,kBAO5E,CAAA;AAGD,eAAO,MAAM,iBAAiB;;uBAS7B,CAAA;AAED,eAAO,MAAM,cAAc,QAAkB,eAAe,KAAG,OAE9D,CAAA;AAED,eAAO,MAAM,oBAAoB,UAAoB,WAAW,KAAG,MA4BlE,CAAA;AAED,eAAO,MAAM,eAAe,0BAGzB;IACD,MAAM,EAAE,aAAa,CAAA;IACrB,QAAQ,EAAE,cAAc,CAAA;CACzB,yDA2DA,CAAA"}
@@ -11,7 +11,7 @@ export declare const startSpinner: ({ text }: {
11
11
  export declare const stopSpinner: ({ error, spinner, text }: {
12
12
  error: boolean;
13
13
  spinner: Ora;
14
- text?: string | undefined;
14
+ text?: string;
15
15
  }) => void;
16
16
  /**
17
17
  * Clears the spinner
@@ -1 +1 @@
1
- {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/lib/spinner.ts"],"names":[],"mappings":"AACA,OAAY,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAE9B;;GAEG;AACH,eAAO,MAAM,YAAY;UAAsB,MAAM;SAGzC,CAAA;AAEZ;;GAEG;AACH,eAAO,MAAM,WAAW;WAAuC,OAAO;aAAW,GAAG;;UAUnF,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,YAAY;aAA4B,GAAG;UAIvD,CAAA"}
1
+ {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/lib/spinner.ts"],"names":[],"mappings":"AACA,OAAY,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAE9B;;GAEG;AACH,eAAO,MAAM,YAAY,aAAc;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,QAG3C,CAAA;AAEZ;;GAEG;AACH,eAAO,MAAM,WAAW,6BAA8B;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,SAUpG,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,gBAAiB;IAAE,OAAO,EAAE,GAAG,CAAA;CAAE,SAIzD,CAAA"}
@@ -0,0 +1,33 @@
1
+ export declare const FILE_NAME = "netlify-development.mdc";
2
+ export declare const NETLIFY_PROVIDER = "netlify";
3
+ export declare const downloadFile: (cliVersion: string) => Promise<{
4
+ contents: string;
5
+ minimumCLIVersion: string | undefined;
6
+ } | null>;
7
+ interface ParsedContextFile {
8
+ contents: string;
9
+ innerContents?: string;
10
+ overrides?: {
11
+ contents?: string;
12
+ innerContents?: string;
13
+ };
14
+ provider?: string;
15
+ version?: string;
16
+ }
17
+ /**
18
+ * Parses the `<ProviderContext>` and `<ProviderContextOverrides>` blocks in
19
+ * a context file.
20
+ */
21
+ export declare const parseContextFile: (contents: string) => ParsedContextFile;
22
+ /**
23
+ * Takes a context file (a template) and injects a string in an overrides block
24
+ * if one is found. Returns the resulting context file.
25
+ */
26
+ export declare const applyOverrides: (template: string, overrides?: string) => string;
27
+ /**
28
+ * Reads a file on disk and tries to parse it as a context file.
29
+ */
30
+ export declare const getExistingContext: (path: string) => Promise<ParsedContextFile | null>;
31
+ export declare const writeFile: (path: string, contents: string) => Promise<void>;
32
+ export {};
33
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/recipes/ai-context/context.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,SAAS,4BAA4B,CAAA;AAElD,eAAO,MAAM,gBAAgB,YAAY,CAAA;AAKzC,eAAO,MAAM,YAAY,eAAsB,MAAM;;;SAmBpD,CAAA;AAED,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,SAAS,CAAC,EAAE;QACV,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,aAAa,CAAC,EAAE,MAAM,CAAA;KACvB,CAAA;IACD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,aAAc,MAAM,sBA0ChD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,aAAc,MAAM,cAAc,MAAM,WASlE,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,SAAgB,MAAM,sCAqBpD,CAAA;AAED,eAAO,MAAM,SAAS,SAAgB,MAAM,YAAY,MAAM,kBAK7D,CAAA"}
@@ -0,0 +1,100 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import { dirname } from 'node:path';
3
+ const ATTRIBUTES_REGEX = /(\S*)="([^\s"]*)"/gim;
4
+ const BASE_URL = 'https://docs.netlify.com/ai-context';
5
+ export const FILE_NAME = 'netlify-development.mdc';
6
+ const MINIMUM_CLI_VERSION_HEADER = 'x-cli-min-ver';
7
+ export const NETLIFY_PROVIDER = 'netlify';
8
+ const PROVIDER_CONTEXT_REGEX = /<providercontext ([^>]*)>(.*)<\/providercontext>/ims;
9
+ const PROVIDER_CONTEXT_OVERRIDES_REGEX = /<providercontextoverrides([^>]*)>(.*)<\/providercontextoverrides>/ims;
10
+ const PROVIDER_CONTEXT_OVERRIDES_TAG = 'ProviderContextOverrides';
11
+ export const downloadFile = async (cliVersion) => {
12
+ try {
13
+ const res = await fetch(`${BASE_URL}/${FILE_NAME}`, {
14
+ headers: {
15
+ 'user-agent': `NetlifyCLI ${cliVersion}`,
16
+ },
17
+ });
18
+ const contents = await res.text();
19
+ const minimumCLIVersion = res.headers.get(MINIMUM_CLI_VERSION_HEADER) ?? undefined;
20
+ return {
21
+ contents,
22
+ minimumCLIVersion,
23
+ };
24
+ }
25
+ catch {
26
+ // no-op
27
+ }
28
+ return null;
29
+ };
30
+ /**
31
+ * Parses the `<ProviderContext>` and `<ProviderContextOverrides>` blocks in
32
+ * a context file.
33
+ */
34
+ export const parseContextFile = (contents) => {
35
+ const result = {
36
+ contents,
37
+ };
38
+ const providerContext = contents.match(PROVIDER_CONTEXT_REGEX);
39
+ if (providerContext) {
40
+ const [, attributes, innerContents] = providerContext;
41
+ result.innerContents = innerContents;
42
+ for (const [, name, value] of attributes.matchAll(ATTRIBUTES_REGEX)) {
43
+ switch (name.toLowerCase()) {
44
+ case 'provider':
45
+ result.provider = value;
46
+ break;
47
+ case 'version':
48
+ result.version = value;
49
+ break;
50
+ default:
51
+ continue;
52
+ }
53
+ }
54
+ }
55
+ const contextOverrides = contents.match(PROVIDER_CONTEXT_OVERRIDES_REGEX);
56
+ if (contextOverrides) {
57
+ const [overrideContents, , innerContents] = contextOverrides;
58
+ result.overrides = {
59
+ contents: overrideContents,
60
+ innerContents,
61
+ };
62
+ }
63
+ return result;
64
+ };
65
+ /**
66
+ * Takes a context file (a template) and injects a string in an overrides block
67
+ * if one is found. Returns the resulting context file.
68
+ */
69
+ export const applyOverrides = (template, overrides) => {
70
+ if (!overrides) {
71
+ return template;
72
+ }
73
+ return template.replace(PROVIDER_CONTEXT_OVERRIDES_REGEX, `<${PROVIDER_CONTEXT_OVERRIDES_TAG}>${overrides}</${PROVIDER_CONTEXT_OVERRIDES_TAG}>`);
74
+ };
75
+ /**
76
+ * Reads a file on disk and tries to parse it as a context file.
77
+ */
78
+ export const getExistingContext = async (path) => {
79
+ try {
80
+ const stats = await fs.stat(path);
81
+ if (!stats.isFile()) {
82
+ throw new Error(`${path} already exists but is not a file. Please remove it or rename it and try again.`);
83
+ }
84
+ const file = await fs.readFile(path, 'utf8');
85
+ const parsedFile = parseContextFile(file);
86
+ return parsedFile;
87
+ }
88
+ catch (error) {
89
+ const exception = error;
90
+ if (exception.code !== 'ENOENT') {
91
+ throw new Error(`Could not open context file at ${path}: ${exception.message}`);
92
+ }
93
+ return null;
94
+ }
95
+ };
96
+ export const writeFile = async (path, contents) => {
97
+ const directory = dirname(path);
98
+ await fs.mkdir(directory, { recursive: true });
99
+ await fs.writeFile(path, contents);
100
+ };
@@ -0,0 +1,4 @@
1
+ import type { RunRecipeOptions } from '../../commands/recipes/recipes.js';
2
+ export declare const description = "Manage context files for AI tools";
3
+ export declare const run: ({ args, command }: RunRecipeOptions) => Promise<void>;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/recipes/ai-context/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AAazE,eAAO,MAAM,WAAW,sCAAsC,CAAA;AAuC9D,eAAO,MAAM,GAAG,sBAA6B,gBAAgB,kBAuE5D,CAAA"}
@@ -0,0 +1,85 @@
1
+ import { resolve } from 'node:path';
2
+ import inquirer from 'inquirer';
3
+ import semver from 'semver';
4
+ import { chalk, error, log, version } from '../../utils/command-helpers.js';
5
+ import { applyOverrides, downloadFile, getExistingContext, parseContextFile, writeFile, FILE_NAME, NETLIFY_PROVIDER, } from './context.js';
6
+ export const description = 'Manage context files for AI tools';
7
+ const presets = [
8
+ { name: 'Cursor rules (.cursor/rules/)', value: '.cursor/rules' },
9
+ { name: 'Custom location', value: '' },
10
+ ];
11
+ const promptForPath = async () => {
12
+ const { presetPath } = await inquirer.prompt([
13
+ {
14
+ name: 'presetPath',
15
+ message: 'Where should we put the context files?',
16
+ type: 'list',
17
+ choices: presets,
18
+ },
19
+ ]);
20
+ if (presetPath) {
21
+ return presetPath;
22
+ }
23
+ const { customPath } = await inquirer.prompt([
24
+ {
25
+ type: 'input',
26
+ name: 'customPath',
27
+ message: 'Enter the path, relative to the project root, where the context files should be placed',
28
+ default: './ai-context',
29
+ },
30
+ ]);
31
+ if (customPath) {
32
+ return customPath;
33
+ }
34
+ log('You must select a path.');
35
+ return promptForPath();
36
+ };
37
+ export const run = async ({ args, command }) => {
38
+ // Start the download in the background while we wait for the prompts.
39
+ // eslint-disable-next-line promise/prefer-await-to-then
40
+ const download = downloadFile(version).catch(() => null);
41
+ const filePath = args[0] || (await promptForPath());
42
+ const { contents: downloadedFile, minimumCLIVersion } = (await download) ?? {};
43
+ if (!downloadedFile) {
44
+ error('An error occurred when pulling the latest context files. Please try again.');
45
+ return;
46
+ }
47
+ if (minimumCLIVersion && semver.lt(version, minimumCLIVersion)) {
48
+ error(`This command requires version ${minimumCLIVersion} or above of the Netlify CLI. Refer to ${chalk.underline('https://ntl.fyi/update-cli')} for information on how to update.`);
49
+ return;
50
+ }
51
+ const absoluteFilePath = resolve(command?.workingDir ?? '', filePath, FILE_NAME);
52
+ const existing = await getExistingContext(absoluteFilePath);
53
+ const remote = parseContextFile(downloadedFile);
54
+ let { contents } = remote;
55
+ // Does a file already exist at this path?
56
+ if (existing) {
57
+ // If it's a file we've created, let's check the version and bail if we're
58
+ // already on the latest, otherwise rewrite it with the latest version.
59
+ if (existing.provider?.toLowerCase() === NETLIFY_PROVIDER) {
60
+ if (remote?.version === existing.version) {
61
+ log(`You're all up to date! ${chalk.underline(absoluteFilePath)} contains the latest version of the context files.`);
62
+ return;
63
+ }
64
+ // We must preserve any overrides found in the existing file.
65
+ contents = applyOverrides(remote.contents, existing.overrides?.innerContents);
66
+ }
67
+ else {
68
+ // If this is not a file we've created, we can offer to overwrite it and
69
+ // preserve the existing contents by moving it to the overrides slot.
70
+ const { confirm } = await inquirer.prompt({
71
+ type: 'confirm',
72
+ name: 'confirm',
73
+ message: `A context file already exists at ${chalk.underline(absoluteFilePath)}. It has not been created by the Netlify CLI, but we can update it while preserving its existing content. Can we proceed?`,
74
+ default: true,
75
+ });
76
+ if (!confirm) {
77
+ return;
78
+ }
79
+ // Whatever exists in the file goes in the overrides block.
80
+ contents = applyOverrides(remote.contents, existing.contents);
81
+ }
82
+ }
83
+ await writeFile(absoluteFilePath, contents);
84
+ log(`${existing ? 'Updated' : 'Created'} context files at ${chalk.underline(absoluteFilePath)}`);
85
+ };