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.
- package/dist/commands/blobs/blobs-delete.d.ts.map +1 -1
- package/dist/commands/functions/functions-create.d.ts.map +1 -1
- package/dist/commands/functions/functions-create.js +0 -3
- package/dist/commands/recipes/recipes.d.ts +1 -2
- package/dist/commands/recipes/recipes.d.ts.map +1 -1
- package/dist/commands/sites/sites-create.d.ts.map +1 -1
- package/dist/lib/edge-functions/proxy.d.ts +1 -1
- package/dist/lib/edge-functions/proxy.d.ts.map +1 -1
- package/dist/lib/functions/form-submissions-handler.d.ts +1 -1
- package/dist/lib/functions/form-submissions-handler.d.ts.map +1 -1
- package/dist/lib/functions/runtimes/js/builders/netlify-lambda.d.ts +1 -3
- package/dist/lib/functions/runtimes/js/builders/netlify-lambda.d.ts.map +1 -1
- package/dist/lib/functions/runtimes/js/index.d.ts.map +1 -1
- package/dist/lib/functions/server.d.ts +1 -1
- package/dist/lib/functions/server.d.ts.map +1 -1
- package/dist/lib/images/proxy.d.ts.map +1 -1
- package/dist/lib/spinner.d.ts +1 -1
- package/dist/lib/spinner.d.ts.map +1 -1
- package/dist/recipes/ai-context/context.d.ts +33 -0
- package/dist/recipes/ai-context/context.d.ts.map +1 -0
- package/dist/recipes/ai-context/context.js +100 -0
- package/dist/recipes/ai-context/index.d.ts +4 -0
- package/dist/recipes/ai-context/index.d.ts.map +1 -0
- package/dist/recipes/ai-context/index.js +85 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utils/build-info.d.ts +1 -1
- package/dist/utils/build-info.d.ts.map +1 -1
- package/dist/utils/command-helpers.d.ts +0 -1
- package/dist/utils/command-helpers.d.ts.map +1 -1
- package/dist/utils/copy-template-dir/copy-template-dir.js +1 -1
- package/dist/utils/create-stream-promise.d.ts.map +1 -1
- package/dist/utils/deploy/deploy-site.d.ts +10 -10
- package/dist/utils/deploy/deploy-site.d.ts.map +1 -1
- package/dist/utils/deploy/hash-config.d.ts.map +1 -1
- package/dist/utils/deploy/hash-config.js +2 -2
- package/dist/utils/deploy/hash-fns.d.ts.map +1 -1
- package/dist/utils/deploy/hasher-segments.d.ts.map +1 -1
- package/dist/utils/deploy/hasher-segments.js +9 -3
- package/dist/utils/detect-server-settings.d.ts.map +1 -1
- package/dist/utils/dev.d.ts +1 -1
- package/dist/utils/dev.d.ts.map +1 -1
- package/dist/utils/env/index.d.ts +2 -2
- package/dist/utils/env/index.d.ts.map +1 -1
- package/dist/utils/feature-flags.d.ts.map +1 -1
- package/dist/utils/framework-server.d.ts.map +1 -1
- package/dist/utils/frameworks-api.d.ts +1 -1
- package/dist/utils/functions/functions.d.ts +5 -5
- package/dist/utils/functions/functions.d.ts.map +1 -1
- package/dist/utils/get-repo-data.d.ts +1 -1
- package/dist/utils/get-repo-data.d.ts.map +1 -1
- package/dist/utils/headers.d.ts.map +1 -1
- package/dist/utils/init/utils.d.ts.map +1 -1
- package/dist/utils/prompts/blob-delete-prompts.d.ts.map +1 -1
- package/dist/utils/prompts/blob-set-prompt.d.ts.map +1 -1
- package/dist/utils/prompts/confirm-prompt.d.ts.map +1 -1
- package/dist/utils/prompts/env-set-prompts.d.ts.map +1 -1
- package/dist/utils/prompts/env-unset-prompts.d.ts.map +1 -1
- package/dist/utils/proxy-server.d.ts +7 -7
- package/dist/utils/proxy-server.d.ts.map +1 -1
- package/dist/utils/proxy.d.ts +2 -2
- package/dist/utils/proxy.d.ts.map +1 -1
- package/dist/utils/read-repo-url.js +1 -1
- package/dist/utils/rules-proxy.d.ts.map +1 -1
- package/dist/utils/run-build.d.ts +1 -8
- package/dist/utils/run-build.d.ts.map +1 -1
- package/dist/utils/sites/create-template.d.ts.map +1 -1
- package/dist/utils/sites/utils.d.ts.map +1 -1
- package/dist/utils/types.d.ts +0 -4
- package/dist/utils/types.d.ts.map +1 -1
- package/npm-shrinkwrap.json +1561 -1212
- 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,
|
|
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;
|
|
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,
|
|
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;
|
|
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
|
|
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;
|
|
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
|
|
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;
|
|
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 +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
|
|
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;
|
|
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,
|
|
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,
|
|
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;
|
|
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"}
|
package/dist/lib/spinner.d.ts
CHANGED
|
@@ -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;
|
|
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 @@
|
|
|
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
|
+
};
|