@vercel/functions 1.3.0 → 1.4.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/README.md ADDED
@@ -0,0 +1,60 @@
1
+ <p align="center">
2
+ <a href="https://vercel.com">
3
+ <img src="https://assets.vercel.com/image/upload/v1588805858/repositories/vercel/logo.png" height="96">
4
+ <h3 align="center">Vercel</h3>
5
+ </a>
6
+ <p align="center">Develop. Preview. Ship.</p>
7
+ </p>
8
+
9
+ [![Join the community on GitHub Discussions](https://badgen.net/badge/join%20the%20discussion/on%20github/black?icon=github)](https://github.com/vercel/vercel/discussions)
10
+
11
+ ## OIDC Support Functions
12
+
13
+ ### AWS S3 Example
14
+
15
+ ```ts
16
+ import * as s3 from '@aws-sdk/client-s3';
17
+ import { awsCredentialsProvider } from '@vercel/functions/oidc';
18
+
19
+ const s3Client = new s3.S3Client({
20
+ credentials: awsCredentialsProvider({
21
+ roleArn: process.env.AWS_ROLE_ARN,
22
+ }),
23
+ });
24
+
25
+ export const GET = () => {
26
+ const result = await s3Client.send(
27
+ new s3.ListObjectsV2Command({
28
+ Bucket: process.env.BUCKET_NAME,
29
+ })
30
+ );
31
+ return Response.json({ objects: result.Contents });
32
+ };
33
+ ```
34
+
35
+ ### Azure CosmosDB Example
36
+
37
+ ```ts
38
+ import { ClientAssertionCredential } from '@azure/identity';
39
+ import { CosmosClient } from '@azure/cosmos';
40
+ import { getVercelOidcToken } from '@vercel/functions/oidc';
41
+
42
+ const credentialsProvider = new ClientAssertionCredential(
43
+ process.env.AZURE_TENANT_ID,
44
+ process.env.AZURE_CLIENT_ID,
45
+ getVercelOidcToken
46
+ );
47
+
48
+ const cosmosClient = new CosmosClient({
49
+ endpoint: process.env.COSMOS_DB_ENDPOINT,
50
+ aadCredentials: credentialsProvider,
51
+ });
52
+
53
+ export const GET = () => {
54
+ const container = cosmosClient
55
+ .database(process.env.COSMOS_DB_NAME)
56
+ .container(process.env.COSMOS_DB_CONTAINER);
57
+ const items = await container.items.query('SELECT * FROM f').fetchAll();
58
+ return Response.json({ items: items.resources });
59
+ };
60
+ ```
@@ -0,0 +1,7 @@
1
+ type Context = {
2
+ waitUntil?: (promise: Promise<unknown>) => void;
3
+ headers?: Record<string, string>;
4
+ };
5
+ export declare const SYMBOL_FOR_REQ_CONTEXT: unique symbol;
6
+ export declare function getContext(): Context;
7
+ export {};
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var get_context_exports = {};
20
+ __export(get_context_exports, {
21
+ SYMBOL_FOR_REQ_CONTEXT: () => SYMBOL_FOR_REQ_CONTEXT,
22
+ getContext: () => getContext
23
+ });
24
+ module.exports = __toCommonJS(get_context_exports);
25
+ const SYMBOL_FOR_REQ_CONTEXT = Symbol.for("@vercel/request-context");
26
+ function getContext() {
27
+ const fromSymbol = globalThis;
28
+ return fromSymbol[SYMBOL_FOR_REQ_CONTEXT]?.get?.() ?? {};
29
+ }
30
+ // Annotate the CommonJS export names for ESM import in node:
31
+ 0 && (module.exports = {
32
+ SYMBOL_FOR_REQ_CONTEXT,
33
+ getContext
34
+ });
package/dist/headers.d.ts CHANGED
@@ -36,7 +36,7 @@ export declare const EMOJI_FLAG_UNICODE_STARTING_POSITION = 127397;
36
36
  * We define a new type so this function can be reused with
37
37
  * the global `Request`, `node-fetch` and other types.
38
38
  */
39
- interface Request {
39
+ export interface Request {
40
40
  headers: {
41
41
  get(name: string): string | null;
42
42
  };
@@ -80,4 +80,3 @@ export declare function ipAddress(request: Request): string | undefined;
80
80
  * @param request The incoming request object which provides the geolocation data
81
81
  */
82
82
  export declare function geolocation(request: Request): Geo;
83
- export {};
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export type { Request, Geo } from './headers';
1
2
  export { geolocation, ipAddress } from './headers';
2
3
  export { getEnv } from './get-env';
3
4
  export { waitUntil } from './wait-until';
@@ -0,0 +1,57 @@
1
+ import type { AwsCredentialIdentityProvider } from '@smithy/types';
2
+ import type { FromWebTokenInit } from '@aws-sdk/credential-provider-web-identity';
3
+ /**
4
+ * The init object for the `awsCredentialsProvider` function.
5
+ *
6
+ * @typedef {Object} AwsCredentialsProviderInit
7
+ * @property {string} roleArn - ARN of the role that the caller is assuming.
8
+ * @property {Object} [clientConfig] - Custom STS client configurations overriding the default ones.
9
+ * @property {Array} [clientPlugins] - Custom STS client middleware plugin to modify the client default behavior.
10
+ * @property {Function} [roleAssumerWithWebIdentity] - A function that assumes a role with web identity and returns a promise fulfilled with credentials for the assumed role.
11
+ * @property {string} [roleSessionName] - An identifier for the assumed role session.
12
+ * @property {string} [providerId] - The fully qualified host component of the domain name of the identity provider.
13
+ * @property {Array} [policyArns] - ARNs of the IAM managed policies that you want to use as managed session policies.
14
+ * @property {string} [policy] - An IAM policy in JSON format that you want to use as an inline session policy.
15
+ * @property {number} [durationSeconds=3600] - The duration, in seconds, of the role session. Defaults to 3600 seconds.
16
+ */
17
+ export interface AwsCredentialsProviderInit// eslint-disable-line @typescript-eslint/no-empty-interface
18
+ extends Omit<FromWebTokenInit, 'webIdentityToken'> {
19
+ }
20
+ /**
21
+ * Obtains the Vercel OIDC token and creates an AWS credential provider function
22
+ * that gets AWS credentials by calling STS AssumeRoleWithWebIdentity API.
23
+ *
24
+ * @param {AwsCredentialsProviderInit} init - The initialization object.
25
+ * @param {string} init.roleArn - ARN of the role that the caller is assuming.
26
+ * @param {Object} [init.clientConfig] - Custom STS client configurations overriding the default ones.
27
+ * @param {Array} [init.clientPlugins] - Custom STS client middleware plugin to modify the client default behavior.
28
+ * @param {Function} [init.roleAssumerWithWebIdentity] - A function that assumes a role with web identity and returns a promise fulfilled with credentials for the assumed role.
29
+ * @param {string} [init.roleSessionName] - An identifier for the assumed role session.
30
+ * @param {string} [init.providerId] - The fully qualified host component of the domain name of the identity provider.
31
+ * @param {Array} [init.policyArns] - ARNs of the IAM managed policies that you want to use as managed session policies.
32
+ * @param {string} [init.policy] - An IAM policy in JSON format that you want to use as an inline session policy.
33
+ * @param {number} [init.durationSeconds=3600] - The duration, in seconds, of the role session. Defaults to 3600 seconds.
34
+ *
35
+ * @returns {AwsCredentialIdentityProvider} A function that provides AWS credentials.
36
+ *
37
+ * @example
38
+ * ```javascript
39
+ * import * as s3 from '@aws-sdk/client-s3';
40
+ * import { awsCredentialsProvider } from '@vercel/functions/oidc';
41
+ *
42
+ * const s3Client = new s3.S3Client({
43
+ * credentials: awsCredentialsProvider({
44
+ * roleArn: "arn:aws:iam::1234567890:role/RoleA",
45
+ * clientConfig: { region: "us-west-2" },
46
+ * clientPlugins: [addFooHeadersPlugin],
47
+ * roleAssumerWithWebIdentity: customRoleAssumer,
48
+ * roleSessionName: "session_123",
49
+ * providerId: "graph.facebook.com",
50
+ * policyArns: [{ arn: "arn:aws:iam::1234567890:policy/SomePolicy" }],
51
+ * policy: "{\"Statement\": [{\"Effect\": \"Allow\", \"Action\": \"s3:ListBucket\", \"Resource\": \"*\"}]}",
52
+ * durationSeconds: 7200
53
+ * }),
54
+ * });
55
+ * ```
56
+ */
57
+ export declare function awsCredentialsProvider(init: AwsCredentialsProviderInit): AwsCredentialIdentityProvider;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var aws_credentials_provider_exports = {};
30
+ __export(aws_credentials_provider_exports, {
31
+ awsCredentialsProvider: () => awsCredentialsProvider
32
+ });
33
+ module.exports = __toCommonJS(aws_credentials_provider_exports);
34
+ var import_get_vercel_oidc_token = require("./get-vercel-oidc-token");
35
+ function awsCredentialsProvider(init) {
36
+ return async () => {
37
+ const { fromWebToken } = await import("@aws-sdk/credential-provider-web-identity");
38
+ return fromWebToken({
39
+ ...init,
40
+ webIdentityToken: await (0, import_get_vercel_oidc_token.getVercelOidcToken)()
41
+ })();
42
+ };
43
+ }
44
+ // Annotate the CommonJS export names for ESM import in node:
45
+ 0 && (module.exports = {
46
+ awsCredentialsProvider
47
+ });
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Returns the OIDC token from the request context or the environment variable.
3
+ *
4
+ * This function first checks if the OIDC token is available in the environment variable
5
+ * `VERCEL_OIDC_TOKEN`. If it is not found there, it retrieves the token from the request
6
+ * context headers.
7
+ *
8
+ * @async
9
+ * @function
10
+ * @returns {Promise<string>} A promise that resolves to the OIDC token.
11
+ * @throws {Error} If the `x-vercel-oidc-token` header is missing from the request context and the environment variable `VERCEL_OIDC_TOKEN` is not set.
12
+ *
13
+ * @example
14
+ * // Using the OIDC token
15
+ * getVercelOidcToken().then((token) => {
16
+ * console.log('OIDC Token:', token);
17
+ * }).catch((error) => {
18
+ * console.error('Error:', error.message);
19
+ * });
20
+ */
21
+ export declare function getVercelOidcToken(): Promise<string>;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var get_vercel_oidc_token_exports = {};
20
+ __export(get_vercel_oidc_token_exports, {
21
+ getVercelOidcToken: () => getVercelOidcToken
22
+ });
23
+ module.exports = __toCommonJS(get_vercel_oidc_token_exports);
24
+ var import_get_context = require("../get-context");
25
+ async function getVercelOidcToken() {
26
+ if (process.env.VERCEL_OIDC_TOKEN)
27
+ return process.env.VERCEL_OIDC_TOKEN;
28
+ const token = (0, import_get_context.getContext)().headers?.["x-vercel-oidc-token"];
29
+ if (!token) {
30
+ throw new Error(
31
+ `The 'x-vercel-oidc-token' header is missing from the request. Do you have the OIDC option enabled in the Vercel project settings?`
32
+ );
33
+ }
34
+ return token;
35
+ }
36
+ // Annotate the CommonJS export names for ESM import in node:
37
+ 0 && (module.exports = {
38
+ getVercelOidcToken
39
+ });
@@ -0,0 +1,3 @@
1
+ export type { AwsCredentialsProviderInit } from './aws-credentials-provider';
2
+ export { awsCredentialsProvider } from './aws-credentials-provider';
3
+ export { getVercelOidcToken } from './get-vercel-oidc-token';
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var oidc_exports = {};
20
+ __export(oidc_exports, {
21
+ awsCredentialsProvider: () => import_aws_credentials_provider.awsCredentialsProvider,
22
+ getVercelOidcToken: () => import_get_vercel_oidc_token.getVercelOidcToken
23
+ });
24
+ module.exports = __toCommonJS(oidc_exports);
25
+ var import_aws_credentials_provider = require("./aws-credentials-provider");
26
+ var import_get_vercel_oidc_token = require("./get-vercel-oidc-token");
27
+ // Annotate the CommonJS export names for ESM import in node:
28
+ 0 && (module.exports = {
29
+ awsCredentialsProvider,
30
+ getVercelOidcToken
31
+ });
@@ -1,4 +1,3 @@
1
- export declare const SYMBOL_FOR_REQ_CONTEXT: unique symbol;
2
1
  /**
3
2
  * Extends the lifetime of the request handler for the lifetime of the given {@link Promise}
4
3
  * @see https://developer.mozilla.org/en-US/docs/Web/API/ExtendableEvent/waitUntil
@@ -18,25 +18,19 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var wait_until_exports = {};
20
20
  __export(wait_until_exports, {
21
- SYMBOL_FOR_REQ_CONTEXT: () => SYMBOL_FOR_REQ_CONTEXT,
22
21
  waitUntil: () => waitUntil
23
22
  });
24
23
  module.exports = __toCommonJS(wait_until_exports);
25
- const SYMBOL_FOR_REQ_CONTEXT = Symbol.for("@vercel/request-context");
24
+ var import_get_context = require("./get-context");
26
25
  const waitUntil = (promise) => {
27
26
  if (promise === null || typeof promise !== "object" || typeof promise.then !== "function") {
28
27
  throw new TypeError(
29
28
  `waitUntil can only be called with a Promise, got ${typeof promise}`
30
29
  );
31
30
  }
32
- return getContext().waitUntil?.(promise);
31
+ return (0, import_get_context.getContext)().waitUntil?.(promise);
33
32
  };
34
- function getContext() {
35
- const fromSymbol = globalThis;
36
- return fromSymbol[SYMBOL_FOR_REQ_CONTEXT]?.get?.() ?? {};
37
- }
38
33
  // Annotate the CommonJS export names for ESM import in node:
39
34
  0 && (module.exports = {
40
- SYMBOL_FOR_REQ_CONTEXT,
41
35
  waitUntil
42
36
  });
package/package.json CHANGED
@@ -3,13 +3,20 @@
3
3
  "description": "Runtime functions to be used with your Vercel Functions",
4
4
  "homepage": "https://vercel.com",
5
5
  "exports": {
6
- ".": "./dist/index.js"
6
+ ".": {
7
+ "types": "./dist/index.d.ts",
8
+ "default": "./dist/index.js"
9
+ },
10
+ "./oidc": {
11
+ "types": "./dist/oidc/index.d.ts",
12
+ "default": "./dist/oidc/index.js"
13
+ }
7
14
  },
8
15
  "files": [
9
16
  "dist"
10
17
  ],
11
18
  "types": "./dist/index.d.ts",
12
- "version": "1.3.0",
19
+ "version": "1.4.0",
13
20
  "repository": {
14
21
  "directory": "packages/functions",
15
22
  "type": "git",
@@ -19,12 +26,23 @@
19
26
  "url": "https://github.com/vercel/vercel/issues"
20
27
  },
21
28
  "devDependencies": {
29
+ "@aws-sdk/client-s3": "3.609.0",
30
+ "@aws-sdk/credential-provider-web-identity": "3.609.0",
31
+ "@smithy/types": "3.3.0",
22
32
  "tinyspawn": "1.3.1",
23
33
  "typedoc": "0.24.6",
24
- "typedoc-plugin-markdown": "3.15.2",
25
- "typedoc-plugin-mdn-links": "3.0.3",
34
+ "typedoc-plugin-markdown": "4.1.2",
35
+ "typedoc-plugin-mdn-links": "3.2.3",
26
36
  "typescript": "4.9.5",
27
- "vitest": "1.3.1"
37
+ "vitest": "2.0.1"
38
+ },
39
+ "peerDependencies": {
40
+ "@aws-sdk/credential-provider-web-identity": "*"
41
+ },
42
+ "peerDependenciesMeta": {
43
+ "@aws-sdk/credential-provider-web-identity": {
44
+ "optional": true
45
+ }
28
46
  },
29
47
  "engines": {
30
48
  "node": ">= 16"
@@ -34,9 +52,10 @@
34
52
  "access": "public"
35
53
  },
36
54
  "scripts": {
37
- "pretest": "pnpm run build",
55
+ "pretest": "pnpm run build:code",
38
56
  "test": "vitest",
39
- "build": "node ../../utils/build.mjs",
57
+ "build": "pnpm run build:code && pnpm run build:docs",
58
+ "build:code": "node ../../utils/build.mjs",
40
59
  "build:docs": "typedoc && prettier --write docs/**/*.md docs/*.md"
41
60
  }
42
61
  }