@netlify/headers 1.0.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/main.d.ts ADDED
@@ -0,0 +1,25 @@
1
+ import { Logger } from '@netlify/dev-utils';
2
+ import { MinimalHeader } from '@netlify/headers-parser';
3
+
4
+ interface HeadersHandlerOptions {
5
+ configPath?: string | undefined;
6
+ configHeaders?: MinimalHeader[] | undefined;
7
+ /**
8
+ * Base directory of the project. This can be absolute or relative
9
+ * to the current working directory.
10
+ */
11
+ projectDir: string;
12
+ /**
13
+ * Publish directory of the project, relative to the `projectDir`.
14
+ */
15
+ publishDir?: string | undefined;
16
+ logger: Logger;
17
+ }
18
+ declare class HeadersHandler {
19
+ #private;
20
+ constructor({ configPath, configHeaders, projectDir, publishDir, logger }: HeadersHandlerOptions);
21
+ get headersFiles(): string[];
22
+ handle(request: Request, response: Response): Promise<Response>;
23
+ }
24
+
25
+ export { HeadersHandler };
package/dist/main.js ADDED
@@ -0,0 +1,72 @@
1
+ // src/main.ts
2
+ import path from "path";
3
+
4
+ // src/lib/parseHeaders.ts
5
+ import { parseAllHeaders } from "@netlify/headers-parser";
6
+ var parseHeaders = async function({
7
+ configHeaders,
8
+ configPath,
9
+ headersFiles,
10
+ logger
11
+ }) {
12
+ const { errors, headers } = await parseAllHeaders({
13
+ headersFiles,
14
+ netlifyConfigPath: configPath,
15
+ minimal: false,
16
+ configHeaders: configHeaders ?? []
17
+ });
18
+ handleHeadersErrors(errors, logger);
19
+ return headers;
20
+ };
21
+ var handleHeadersErrors = function(errors, logger) {
22
+ if (errors.length === 0) {
23
+ return;
24
+ }
25
+ const errorMessage = errors.map(({ message }) => message).join("\n\n");
26
+ logger.error(`Headers syntax errors:
27
+ ${errorMessage}`);
28
+ };
29
+
30
+ // src/lib/headersForPath.ts
31
+ var headersForPath = function(headerRules, path2) {
32
+ const matchingHeaderRules = headerRules.filter(({ forRegExp }) => forRegExp.test(path2)).map(({ values }) => values);
33
+ return matchingHeaderRules.reduce((acc, val) => ({ ...acc, ...val }), {});
34
+ };
35
+
36
+ // src/main.ts
37
+ var HEADERS_FILE_NAME = "_headers";
38
+ var HeadersHandler = class {
39
+ #configHeaders;
40
+ #configPath;
41
+ #headersFiles;
42
+ #logger;
43
+ constructor({ configPath, configHeaders, projectDir, publishDir, logger }) {
44
+ this.#configHeaders = configHeaders;
45
+ this.#configPath = configPath;
46
+ this.#logger = logger;
47
+ const projectDirHeadersFile = path.resolve(projectDir, HEADERS_FILE_NAME);
48
+ const publishDirHeadersFile = publishDir ? path.resolve(projectDir, publishDir, HEADERS_FILE_NAME) : void 0;
49
+ this.#headersFiles = [
50
+ .../* @__PURE__ */ new Set([projectDirHeadersFile, ...publishDirHeadersFile ? [publishDirHeadersFile] : []])
51
+ ];
52
+ }
53
+ get headersFiles() {
54
+ return this.#headersFiles;
55
+ }
56
+ async handle(request, response) {
57
+ const headerRules = await parseHeaders({
58
+ headersFiles: this.#headersFiles,
59
+ configPath: this.#configPath,
60
+ configHeaders: this.#configHeaders,
61
+ logger: this.#logger
62
+ });
63
+ const matchingHeaderRules = headersForPath(headerRules, new URL(request.url).pathname);
64
+ for (const [key, value] of Object.entries(matchingHeaderRules)) {
65
+ response.headers.set(key, value);
66
+ }
67
+ return response;
68
+ }
69
+ };
70
+ export {
71
+ HeadersHandler
72
+ };
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@netlify/headers",
3
+ "version": "1.0.0",
4
+ "description": "TypeScript implementation of Netlify's headers engine",
5
+ "type": "module",
6
+ "engines": {
7
+ "node": "^18.14.0 || >=20"
8
+ },
9
+ "main": "./dist/main.js",
10
+ "exports": "./dist/main.js",
11
+ "types": "./dist/main.d.ts",
12
+ "files": [
13
+ "dist/**/*"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsup-node",
17
+ "dev": "tsup-node --watch",
18
+ "prepack": "npm run build",
19
+ "publint": "npx -y publint --strict",
20
+ "test": "vitest run",
21
+ "test:ci": "npm run build && vitest run",
22
+ "test:dev": "vitest"
23
+ },
24
+ "keywords": [
25
+ "netlify",
26
+ "headers"
27
+ ],
28
+ "license": "MIT",
29
+ "repository": "netlify/primitives",
30
+ "bugs": {
31
+ "url": "https://github.com/netlify/primitives/issues"
32
+ },
33
+ "author": "Netlify Inc.",
34
+ "devDependencies": {
35
+ "@netlify/dev-utils": "^3.0.0",
36
+ "@types/node": "^18.19.103",
37
+ "vitest": "^3.1.4"
38
+ },
39
+ "dependencies": {
40
+ "@netlify/headers-parser": "^9.0.0"
41
+ }
42
+ }