cdk-nextjs 0.5.15 → 0.6.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 (53) hide show
  1. package/.jsii +821 -253
  2. package/.jsii.tabl.json +1 -1
  3. package/API.md +787 -18
  4. package/README.md +3 -3
  5. package/docs/breaking-changes.md +86 -0
  6. package/docs/caching-guide.md +6 -0
  7. package/docs/plans/adapter-runtime-release.md +362 -0
  8. package/docs/plans/phase-0-image-function-opt-in.md +295 -0
  9. package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +13 -0
  10. package/lib/generated-structs/OptionalNextjsDistributionProps.js +1 -1
  11. package/lib/image-optimization/handler-utils.d.ts +34 -0
  12. package/lib/image-optimization/handler-utils.js +83 -0
  13. package/lib/image-optimization/handler-utils.test.d.ts +1 -0
  14. package/lib/image-optimization/handler-utils.test.js +178 -0
  15. package/lib/image-optimization/handler.mjs +56126 -0
  16. package/lib/index.d.ts +2 -1
  17. package/lib/index.js +4 -2
  18. package/lib/nextjs-api.d.ts +44 -0
  19. package/lib/nextjs-api.js +64 -20
  20. package/lib/nextjs-api.test.d.ts +1 -0
  21. package/lib/nextjs-api.test.js +144 -0
  22. package/lib/nextjs-build/nextjs-build.d.ts +60 -0
  23. package/lib/nextjs-build/nextjs-build.js +184 -27
  24. package/lib/nextjs-cache.js +1 -1
  25. package/lib/nextjs-compute/nextjs-containers.js +1 -1
  26. package/lib/nextjs-compute/nextjs-functions.js +1 -1
  27. package/lib/nextjs-compute/nextjs-image-function.d.ts +53 -0
  28. package/lib/nextjs-compute/nextjs-image-function.js +59 -0
  29. package/lib/nextjs-distribution.d.ts +33 -0
  30. package/lib/nextjs-distribution.js +39 -11
  31. package/lib/nextjs-post-deploy.js +1 -1
  32. package/lib/nextjs-static-assets.d.ts +18 -0
  33. package/lib/nextjs-static-assets.js +33 -6
  34. package/lib/nextjs-static-assets.test.d.ts +1 -0
  35. package/lib/nextjs-static-assets.test.js +58 -0
  36. package/lib/root-constructs/nextjs-base-construct.d.ts +62 -2
  37. package/lib/root-constructs/nextjs-base-construct.js +81 -3
  38. package/lib/root-constructs/nextjs-global-containers.d.ts +6 -1
  39. package/lib/root-constructs/nextjs-global-containers.js +11 -5
  40. package/lib/root-constructs/nextjs-global-functions.d.ts +16 -5
  41. package/lib/root-constructs/nextjs-global-functions.js +23 -21
  42. package/lib/root-constructs/nextjs-regional-containers.js +1 -1
  43. package/lib/root-constructs/nextjs-regional-functions.d.ts +11 -5
  44. package/lib/root-constructs/nextjs-regional-functions.js +17 -21
  45. package/lib/utils/base-path.d.ts +40 -0
  46. package/lib/utils/base-path.js +123 -0
  47. package/lib/utils/base-path.test.d.ts +1 -0
  48. package/lib/utils/base-path.test.js +163 -0
  49. package/lib/utils/experimental-flags.d.ts +24 -0
  50. package/lib/utils/experimental-flags.js +30 -0
  51. package/lib/utils/get-architecture.d.ts +10 -0
  52. package/lib/utils/get-architecture.js +17 -2
  53. package/package.json +3 -1
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const node_fs_1 = require("node:fs");
4
+ const node_os_1 = require("node:os");
5
+ const node_path_1 = require("node:path");
6
+ const constants_1 = require("../constants");
7
+ const base_path_1 = require("./base-path");
8
+ const GLOBAL = [constants_1.NextjsType.GLOBAL_FUNCTIONS, constants_1.NextjsType.GLOBAL_CONTAINERS];
9
+ describe("normalizeBasePath", () => {
10
+ it("reduces values addressing the same path to the same segment", () => {
11
+ expect((0, base_path_1.normalizeBasePath)("/base")).toBe("base");
12
+ expect((0, base_path_1.normalizeBasePath)("base")).toBe("base");
13
+ expect((0, base_path_1.normalizeBasePath)("/base/")).toBe("base");
14
+ expect((0, base_path_1.normalizeBasePath)("//base//")).toBe("base");
15
+ });
16
+ it("maps undefined and empty values to an empty string", () => {
17
+ expect((0, base_path_1.normalizeBasePath)(undefined)).toBe("");
18
+ expect((0, base_path_1.normalizeBasePath)("")).toBe("");
19
+ expect((0, base_path_1.normalizeBasePath)("/")).toBe("");
20
+ });
21
+ it("keeps interior slashes of a nested basePath", () => {
22
+ expect((0, base_path_1.normalizeBasePath)("/team/app/")).toBe("team/app");
23
+ });
24
+ });
25
+ describe("joinPath", () => {
26
+ const origin = "https://d111111abcdef8.cloudfront.net";
27
+ it("drops empty parts", () => {
28
+ expect((0, base_path_1.joinPath)(origin)).toBe(origin);
29
+ expect((0, base_path_1.joinPath)(origin, "")).toBe(origin);
30
+ expect((0, base_path_1.joinPath)(origin, undefined)).toBe(origin);
31
+ expect((0, base_path_1.joinPath)(origin, "/")).toBe(origin);
32
+ expect((0, base_path_1.joinPath)("", "base", undefined, "_next/static")).toBe("base/_next/static");
33
+ });
34
+ it("joins with exactly one slash regardless of each part's slashes", () => {
35
+ expect((0, base_path_1.joinPath)(origin, "/base")).toBe(`${origin}/base`);
36
+ expect((0, base_path_1.joinPath)(origin, "base/")).toBe(`${origin}/base`);
37
+ expect((0, base_path_1.joinPath)(origin, "/team/app/")).toBe(`${origin}/team/app`);
38
+ expect((0, base_path_1.joinPath)("/base/", "/_next/static/{key}")).toBe("base/_next/static/{key}");
39
+ });
40
+ it("returns an empty string when every part is empty", () => {
41
+ expect((0, base_path_1.joinPath)()).toBe("");
42
+ expect((0, base_path_1.joinPath)(undefined, "", "/")).toBe("");
43
+ });
44
+ });
45
+ describe("readNextConfigBasePath", () => {
46
+ let dotNextPath;
47
+ let warn;
48
+ beforeEach(() => {
49
+ dotNextPath = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), "base-path-"));
50
+ warn = jest.spyOn(console, "warn").mockImplementation(() => { });
51
+ });
52
+ afterEach(() => {
53
+ warn.mockRestore();
54
+ (0, node_fs_1.rmSync)(dotNextPath, { recursive: true, force: true });
55
+ });
56
+ function writeRequiredServerFiles(contents) {
57
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(dotNextPath, "required-server-files.json"), contents);
58
+ }
59
+ it("reads the app's basePath and strips the leading slash", () => {
60
+ writeRequiredServerFiles(JSON.stringify({ config: { basePath: "/prod" } }));
61
+ expect((0, base_path_1.readNextConfigBasePath)(dotNextPath)).toBe("prod");
62
+ expect(warn).not.toHaveBeenCalled();
63
+ });
64
+ it("returns an empty string when the app sets no basePath", () => {
65
+ // `next build` writes basePath: "" rather than omitting it.
66
+ writeRequiredServerFiles(JSON.stringify({ config: { basePath: "" } }));
67
+ expect((0, base_path_1.readNextConfigBasePath)(dotNextPath)).toBe("");
68
+ expect(warn).not.toHaveBeenCalled();
69
+ });
70
+ // Degrading to "" is deliberate, but it's indistinguishable from an app that
71
+ // sets no basePath, so it has to be visible: the Global constructs derive
72
+ // their basePath from this value and would otherwise 404 every static asset
73
+ // with nothing but a silent fallback to explain it.
74
+ it("warns when required-server-files.json is missing", () => {
75
+ expect((0, base_path_1.readNextConfigBasePath)(dotNextPath)).toBe("");
76
+ expect(warn).toHaveBeenCalledWith(expect.stringContaining("required-server-files.json"));
77
+ });
78
+ it("warns when the file isn't valid JSON", () => {
79
+ writeRequiredServerFiles("not json");
80
+ expect((0, base_path_1.readNextConfigBasePath)(dotNextPath)).toBe("");
81
+ expect(warn).toHaveBeenCalledWith(expect.stringContaining("Could not read basePath"));
82
+ });
83
+ it("returns an empty string when the file has no config key", () => {
84
+ writeRequiredServerFiles(JSON.stringify({ files: [] }));
85
+ expect((0, base_path_1.readNextConfigBasePath)(dotNextPath)).toBe("");
86
+ });
87
+ });
88
+ describe("resolveBasePath", () => {
89
+ describe.each(Object.values(constants_1.NextjsType))("%s", (nextjsType) => {
90
+ it("resolves to undefined when both are unset", () => {
91
+ expect((0, base_path_1.resolveBasePath)(nextjsType)).toBeUndefined();
92
+ expect((0, base_path_1.resolveBasePath)(nextjsType, "", "")).toBeUndefined();
93
+ // Normalizes to empty, so it's the same as unset rather than a prefix.
94
+ expect((0, base_path_1.resolveBasePath)(nextjsType, "/")).toBeUndefined();
95
+ });
96
+ // One shape out, whatever shape came in: consumers that need a leading
97
+ // slash (only `NextjsDistribution`'s path patterns) add their own, so
98
+ // nothing downstream has to re-normalize.
99
+ it("normalizes the prop when it matches the app", () => {
100
+ expect((0, base_path_1.resolveBasePath)(nextjsType, "/base", "/base")).toBe("base");
101
+ expect((0, base_path_1.resolveBasePath)(nextjsType, "base", "/base")).toBe("base");
102
+ expect((0, base_path_1.resolveBasePath)(nextjsType, "/base/", "/base")).toBe("base");
103
+ expect((0, base_path_1.resolveBasePath)(nextjsType, "base//", "/base")).toBe("base");
104
+ });
105
+ });
106
+ describe.each(GLOBAL)("%s", (nextjsType) => {
107
+ // CloudFront uses the request path verbatim as the S3 object key, so the
108
+ // prop has to be the prefix the app emits — there's exactly one valid value,
109
+ // which makes the app's config the source of truth.
110
+ it("derives the prop from the app's basePath", () => {
111
+ expect((0, base_path_1.resolveBasePath)(nextjsType, undefined, "/base")).toBe("base");
112
+ expect((0, base_path_1.resolveBasePath)(nextjsType, "", "base")).toBe("base");
113
+ expect((0, base_path_1.resolveBasePath)(nextjsType, undefined, "/team/app/")).toBe("team/app");
114
+ });
115
+ it("rejects the prop setting a basePath the app doesn't", () => {
116
+ expect(() => (0, base_path_1.resolveBasePath)(nextjsType, "/base")).toThrow(/CloudFront serves static assets straight from S3/);
117
+ });
118
+ it("rejects two different values", () => {
119
+ expect(() => (0, base_path_1.resolveBasePath)(nextjsType, "/a", "/b")).toThrow('prop is "/a" but your Next.js app\'s config sets `basePath` to "/b"');
120
+ });
121
+ });
122
+ describe(constants_1.NextjsType.REGIONAL_FUNCTIONS, () => {
123
+ // API Gateway strips the stage before matching resources, so an app served
124
+ // at the default `prod` stage sets basePath: "/prod" and leaves the prop
125
+ // unset. Same shape as a custom domain base path mapping. Deriving here
126
+ // would nest every resource under a path the stage already consumed.
127
+ it("does not derive the app's basePath", () => {
128
+ expect((0, base_path_1.resolveBasePath)(constants_1.NextjsType.REGIONAL_FUNCTIONS, undefined, "/prod")).toBeUndefined();
129
+ });
130
+ // The stripped prefix is part of what the app emits but never part of the
131
+ // resource path, so an app at the `prod` stage nested under "/base" sets
132
+ // basePath: "/prod/base" and the prop to "/base".
133
+ it("accepts an app basePath that ends with the prop", () => {
134
+ expect((0, base_path_1.resolveBasePath)(constants_1.NextjsType.REGIONAL_FUNCTIONS, "/base", "/prod/base")).toBe("base");
135
+ });
136
+ it("only accepts the prop as a whole trailing path segment", () => {
137
+ expect(() => (0, base_path_1.resolveBasePath)(constants_1.NextjsType.REGIONAL_FUNCTIONS, "/se", "/prod/base")).toThrow(/nests every API Gateway resource under that path/);
138
+ // Leading, not trailing: API Gateway strips the stage, so the app would
139
+ // emit "/prod/..." while the resources live under "/prod/base/...".
140
+ expect(() => (0, base_path_1.resolveBasePath)(constants_1.NextjsType.REGIONAL_FUNCTIONS, "/prod", "/prod/base")).toThrow(/nests every API Gateway resource under that path/);
141
+ });
142
+ // The reverse is never right: the prop nests every resource, including the
143
+ // catch-all, under a path the app never links to.
144
+ it("rejects the prop setting a basePath the app doesn't", () => {
145
+ expect(() => (0, base_path_1.resolveBasePath)(constants_1.NextjsType.REGIONAL_FUNCTIONS, "/base")).toThrow(/nests every API Gateway resource under that path/);
146
+ });
147
+ it("rejects two different values", () => {
148
+ expect(() => (0, base_path_1.resolveBasePath)(constants_1.NextjsType.REGIONAL_FUNCTIONS, "/a", "/b")).toThrow(/nests every API Gateway resource under that path/);
149
+ });
150
+ });
151
+ describe(constants_1.NextjsType.REGIONAL_CONTAINERS, () => {
152
+ // basePath only namespaces the S3 bucket here: the ALB forwards every path
153
+ // to the container, which serves its own static assets. So any combination
154
+ // is valid, and the app's basePath is never derived into the bucket prefix.
155
+ it("accepts any combination, always keeping the prop", () => {
156
+ const nextjsType = constants_1.NextjsType.REGIONAL_CONTAINERS;
157
+ expect((0, base_path_1.resolveBasePath)(nextjsType, "/a", "/b")).toBe("a");
158
+ expect((0, base_path_1.resolveBasePath)(nextjsType, "/a")).toBe("a");
159
+ expect((0, base_path_1.resolveBasePath)(nextjsType, undefined, "/b")).toBeUndefined();
160
+ });
161
+ });
162
+ });
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1wYXRoLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvYmFzZS1wYXRoLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxQ0FBNkQ7QUFDN0QscUNBQWlDO0FBQ2pDLHlDQUFpQztBQUNqQyw0Q0FBMEM7QUFDMUMsMkNBS3FCO0FBRXJCLE1BQU0sTUFBTSxHQUFHLENBQUMsc0JBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxzQkFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFM0UsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUNqQyxFQUFFLENBQUMsNkRBQTZELEVBQUUsR0FBRyxFQUFFO1FBQ3JFLE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLEdBQUcsRUFBRTtRQUM1RCxNQUFNLENBQUMsSUFBQSw2QkFBaUIsRUFBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QyxNQUFNLENBQUMsSUFBQSw2QkFBaUIsRUFBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QyxNQUFNLENBQUMsSUFBQSw2QkFBaUIs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LHNCQUFVLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUMzRCxDQUFDLE9BQU8sQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsc0JBQVUsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLEVBQUU7UUFDNUMsMkVBQTJFO1FBQzNFLDJFQUEyRTtRQUMzRSw0RUFBNEU7UUFDNUUsRUFBRSxDQUFDLGtEQUFrRCxFQUFFLEdBQUcsRUFBRTtZQUMxRCxNQUFNLFVBQVUsR0FBRyxzQkFBVSxDQUFDLG1CQUFtQixDQUFDO1lBQ2xELE1BQU0sQ0FBQyxJQUFBLDJCQUFlLEVBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxRCxNQUFNLENBQUMsSUFBQSwyQkFBZSxFQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwRCxNQUFNLENBQUMsSUFBQSwyQkFBZSxFQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2RSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBta2R0ZW1wU3luYywgcm1TeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgTmV4dGpzVHlwZSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIGpvaW5QYXRoLFxuICBub3JtYWxpemVCYXNlUGF0aCxcbiAgcmVhZE5leHRDb25maWdCYXNlUGF0aCxcbiAgcmVzb2x2ZUJhc2VQYXRoLFxufSBmcm9tIFwiLi9iYXNlLXBhdGhcIjtcblxuY29uc3QgR0xPQkFMID0gW05leHRqc1R5cGUuR0xPQkFMX0ZVTkNUSU9OUywgTmV4dGpzVHlwZS5HTE9CQUxfQ09OVEFJTkVSU107XG5cbmRlc2NyaWJlKFwibm9ybWFsaXplQmFzZVBhdGhcIiwgKCkgPT4ge1xuICBpdChcInJlZHVjZXMgdmFsdWVzIGFkZHJlc3NpbmcgdGhlIHNhbWUgcGF0aCB0byB0aGUgc2FtZSBzZWdtZW50XCIsICgpID0+IHtcbiAgICBleHBlY3Qobm9ybWFsaXplQmFzZVBhdGgoXCIvYmFzZVwiKSkudG9CZShcImJhc2VcIik7XG4gICAgZXhwZWN0KG5vcm1hbGl6ZUJhc2VQYXRoKFwiYmFzZVwiKSkudG9CZShcImJhc2VcIik7XG4gICAgZXhwZWN0KG5vcm1hbGl6ZUJhc2VQYXRoKFwiL2Jhc2UvXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICBleHBlY3Qobm9ybWFsaXplQmFzZVBhdGgoXCIvL2Jhc2UvL1wiKSkudG9CZShcImJhc2VcIik7XG4gIH0pO1xuXG4gIGl0KFwibWFwcyB1bmRlZmluZWQgYW5kIGVtcHR5IHZhbHVlcyB0byBhbiBlbXB0eSBzdHJpbmdcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChub3JtYWxpemVCYXNlUGF0aCh1bmRlZmluZWQpKS50b0JlKFwiXCIpO1xuICAgIGV4cGVjdChub3JtYWxpemVCYXNlUGF0aChcIlwiKSkudG9CZShcIlwiKTtcbiAgICBleHBlY3Qobm9ybWFsaXplQmFzZVBhdGgoXCIvXCIpKS50b0JlKFwiXCIpO1xuICB9KTtcblxuICBpdChcImtlZXBzIGludGVyaW9yIHNsYXNoZXMgb2YgYSBuZXN0ZWQgYmFzZVBhdGhcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChub3JtYWxpemVCYXNlUGF0aChcIi90ZWFtL2FwcC9cIikpLnRvQmUoXCJ0ZWFtL2FwcFwiKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJqb2luUGF0aFwiLCAoKSA9PiB7XG4gIGNvbnN0IG9yaWdpbiA9IFwiaHR0cHM6Ly9kMTExMTExYWJjZGVmOC5jbG91ZGZyb250Lm5ldFwiO1xuXG4gIGl0KFwiZHJvcHMgZW1wdHkgcGFydHNcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChqb2luUGF0aChvcmlnaW4pKS50b0JlKG9yaWdpbik7XG4gICAgZXhwZWN0KGpvaW5QYXRoKG9yaWdpbiwgXCJcIikpLnRvQmUob3JpZ2luKTtcbiAgICBleHBlY3Qoam9pblBhdGgob3JpZ2luLCB1bmRlZmluZWQpKS50b0JlKG9yaWdpbik7XG4gICAgZXhwZWN0KGpvaW5QYXRoKG9yaWdpbiwgXCIvXCIpKS50b0JlKG9yaWdpbik7XG4gICAgZXhwZWN0KGpvaW5QYXRoKFwiXCIsIFwiYmFzZVwiLCB1bmRlZmluZWQsIFwiX25leHQvc3RhdGljXCIpKS50b0JlKFxuICAgICAgXCJiYXNlL19uZXh0L3N0YXRpY1wiLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwiam9pbnMgd2l0aCBleGFjdGx5IG9uZSBzbGFzaCByZWdhcmRsZXNzIG9mIGVhY2ggcGFydCdzIHNsYXNoZXNcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChqb2luUGF0aChvcmlnaW4sIFwiL2Jhc2VcIikpLnRvQmUoYCR7b3JpZ2lufS9iYXNlYCk7XG4gICAgZXhwZWN0KGpvaW5QYXRoKG9yaWdpbiwgXCJiYXNlL1wiKSkudG9CZShgJHtvcmlnaW59L2Jhc2VgKTtcbiAgICBleHBlY3Qoam9pblBhdGgob3JpZ2luLCBcIi90ZWFtL2FwcC9cIikpLnRvQmUoYCR7b3JpZ2lufS90ZWFtL2FwcGApO1xuICAgIGV4cGVjdChqb2luUGF0aChcIi9iYXNlL1wiLCBcIi9fbmV4dC9zdGF0aWMve2tleX1cIikpLnRvQmUoXG4gICAgICBcImJhc2UvX25leHQvc3RhdGljL3trZXl9XCIsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJyZXR1cm5zIGFuIGVtcHR5IHN0cmluZyB3aGVuIGV2ZXJ5IHBhcnQgaXMgZW1wdHlcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChqb2luUGF0aCgpKS50b0JlKFwiXCIpO1xuICAgIGV4cGVjdChqb2luUGF0aCh1bmRlZmluZWQsIFwiXCIsIFwiL1wiKSkudG9CZShcIlwiKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJyZWFkTmV4dENvbmZpZ0Jhc2VQYXRoXCIsICgpID0+IHtcbiAgbGV0IGRvdE5leHRQYXRoOiBzdHJpbmc7XG4gIGxldCB3YXJuOiBqZXN0LlNweUluc3RhbmNlO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGRvdE5leHRQYXRoID0gbWtkdGVtcFN5bmMoam9pbih0bXBkaXIoKSwgXCJiYXNlLXBhdGgtXCIpKTtcbiAgICB3YXJuID0gamVzdC5zcHlPbihjb25zb2xlLCBcIndhcm5cIikubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHt9KTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICB3YXJuLm1vY2tSZXN0b3JlKCk7XG4gICAgcm1TeW5jKGRvdE5leHRQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHdyaXRlUmVxdWlyZWRTZXJ2ZXJGaWxlcyhjb250ZW50czogc3RyaW5nKSB7XG4gICAgd3JpdGVGaWxlU3luYyhqb2luKGRvdE5leHRQYXRoLCBcInJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uXCIpLCBjb250ZW50cyk7XG4gIH1cblxuICBpdChcInJlYWRzIHRoZSBhcHAncyBiYXNlUGF0aCBhbmQgc3RyaXBzIHRoZSBsZWFkaW5nIHNsYXNoXCIsICgpID0+IHtcbiAgICB3cml0ZVJlcXVpcmVkU2VydmVyRmlsZXMoSlNPTi5zdHJpbmdpZnkoeyBjb25maWc6IHsgYmFzZVBhdGg6IFwiL3Byb2RcIiB9IH0pKTtcblxuICAgIGV4cGVjdChyZWFkTmV4dENvbmZpZ0Jhc2VQYXRoKGRvdE5leHRQYXRoKSkudG9CZShcInByb2RcIik7XG4gICAgZXhwZWN0KHdhcm4pLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KFwicmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgd2hlbiB0aGUgYXBwIHNldHMgbm8gYmFzZVBhdGhcIiwgKCkgPT4ge1xuICAgIC8vIGBuZXh0IGJ1aWxkYCB3cml0ZXMgYmFzZVBhdGg6IFwiXCIgcmF0aGVyIHRoYW4gb21pdHRpbmcgaXQuXG4gICAgd3JpdGVSZXF1aXJlZFNlcnZlckZpbGVzKEpTT04uc3RyaW5naWZ5KHsgY29uZmlnOiB7IGJhc2VQYXRoOiBcIlwiIH0gfSkpO1xuXG4gICAgZXhwZWN0KHJlYWROZXh0Q29uZmlnQmFzZVBhdGgoZG90TmV4dFBhdGgpKS50b0JlKFwiXCIpO1xuICAgIGV4cGVjdCh3YXJuKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICB9KTtcblxuICAvLyBEZWdyYWRpbmcgdG8gXCJcIiBpcyBkZWxpYmVyYXRlLCBidXQgaXQncyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGFuIGFwcCB0aGF0XG4gIC8vIHNldHMgbm8gYmFzZVBhdGgsIHNvIGl0IGhhcyB0byBiZSB2aXNpYmxlOiB0aGUgR2xvYmFsIGNvbnN0cnVjdHMgZGVyaXZlXG4gIC8vIHRoZWlyIGJhc2VQYXRoIGZyb20gdGhpcyB2YWx1ZSBhbmQgd291bGQgb3RoZXJ3aXNlIDQwNCBldmVyeSBzdGF0aWMgYXNzZXRcbiAgLy8gd2l0aCBub3RoaW5nIGJ1dCBhIHNpbGVudCBmYWxsYmFjayB0byBleHBsYWluIGl0LlxuICBpdChcIndhcm5zIHdoZW4gcmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb24gaXMgbWlzc2luZ1wiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHJlYWROZXh0Q29uZmlnQmFzZVBhdGgoZG90TmV4dFBhdGgpKS50b0JlKFwiXCIpO1xuICAgIGV4cGVjdCh3YXJuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgIGV4cGVjdC5zdHJpbmdDb250YWluaW5nKFwicmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25cIiksXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJ3YXJucyB3aGVuIHRoZSBmaWxlIGlzbid0IHZhbGlkIEpTT05cIiwgKCkgPT4ge1xuICAgIHdyaXRlUmVxdWlyZWRTZXJ2ZXJGaWxlcyhcIm5vdCBqc29uXCIpO1xuXG4gICAgZXhwZWN0KHJlYWROZXh0Q29uZmlnQmFzZVBhdGgoZG90TmV4dFBhdGgpKS50b0JlKFwiXCIpO1xuICAgIGV4cGVjdCh3YXJuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgIGV4cGVjdC5zdHJpbmdDb250YWluaW5nKFwiQ291bGQgbm90IHJlYWQgYmFzZVBhdGhcIiksXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJyZXR1cm5zIGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZSBmaWxlIGhhcyBubyBjb25maWcga2V5XCIsICgpID0+IHtcbiAgICB3cml0ZVJlcXVpcmVkU2VydmVyRmlsZXMoSlNPTi5zdHJpbmdpZnkoeyBmaWxlczogW10gfSkpO1xuXG4gICAgZXhwZWN0KHJlYWROZXh0Q29uZmlnQmFzZVBhdGgoZG90TmV4dFBhdGgpKS50b0JlKFwiXCIpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcInJlc29sdmVCYXNlUGF0aFwiLCAoKSA9PiB7XG4gIGRlc2NyaWJlLmVhY2goT2JqZWN0LnZhbHVlcyhOZXh0anNUeXBlKSkoXCIlc1wiLCAobmV4dGpzVHlwZSkgPT4ge1xuICAgIGl0KFwicmVzb2x2ZXMgdG8gdW5kZWZpbmVkIHdoZW4gYm90aCBhcmUgdW5zZXRcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcIlwiLCBcIlwiKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgLy8gTm9ybWFsaXplcyB0byBlbXB0eSwgc28gaXQncyB0aGUgc2FtZSBhcyB1bnNldCByYXRoZXIgdGhhbiBhIHByZWZpeC5cbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCIvXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICAvLyBPbmUgc2hhcGUgb3V0LCB3aGF0ZXZlciBzaGFwZSBjYW1lIGluOiBjb25zdW1lcnMgdGhhdCBuZWVkIGEgbGVhZGluZ1xuICAgIC8vIHNsYXNoIChvbmx5IGBOZXh0anNEaXN0cmlidXRpb25gJ3MgcGF0aCBwYXR0ZXJucykgYWRkIHRoZWlyIG93biwgc29cbiAgICAvLyBub3RoaW5nIGRvd25zdHJlYW0gaGFzIHRvIHJlLW5vcm1hbGl6ZS5cbiAgICBpdChcIm5vcm1hbGl6ZXMgdGhlIHByb3Agd2hlbiBpdCBtYXRjaGVzIHRoZSBhcHBcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcIi9iYXNlXCIsIFwiL2Jhc2VcIikpLnRvQmUoXCJiYXNlXCIpO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcImJhc2VcIiwgXCIvYmFzZVwiKSkudG9CZShcImJhc2VcIik7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKG5leHRqc1R5cGUsIFwiL2Jhc2UvXCIsIFwiL2Jhc2VcIikpLnRvQmUoXCJiYXNlXCIpO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcImJhc2UvL1wiLCBcIi9iYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUuZWFjaChHTE9CQUwpKFwiJXNcIiwgKG5leHRqc1R5cGUpID0+IHtcbiAgICAvLyBDbG91ZEZyb250IHVzZXMgdGhlIHJlcXVlc3QgcGF0aCB2ZXJiYXRpbSBhcyB0aGUgUzMgb2JqZWN0IGtleSwgc28gdGhlXG4gICAgLy8gcHJvcCBoYXMgdG8gYmUgdGhlIHByZWZpeCB0aGUgYXBwIGVtaXRzIOKAlCB0aGVyZSdzIGV4YWN0bHkgb25lIHZhbGlkIHZhbHVlLFxuICAgIC8vIHdoaWNoIG1ha2VzIHRoZSBhcHAncyBjb25maWcgdGhlIHNvdXJjZSBvZiB0cnV0aC5cbiAgICBpdChcImRlcml2ZXMgdGhlIHByb3AgZnJvbSB0aGUgYXBwJ3MgYmFzZVBhdGhcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCB1bmRlZmluZWQsIFwiL2Jhc2VcIikpLnRvQmUoXCJiYXNlXCIpO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcIlwiLCBcImJhc2VcIikpLnRvQmUoXCJiYXNlXCIpO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCB1bmRlZmluZWQsIFwiL3RlYW0vYXBwL1wiKSkudG9CZShcbiAgICAgICAgXCJ0ZWFtL2FwcFwiLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwicmVqZWN0cyB0aGUgcHJvcCBzZXR0aW5nIGEgYmFzZVBhdGggdGhlIGFwcCBkb2Vzbid0XCIsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PiByZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCIvYmFzZVwiKSkudG9UaHJvdyhcbiAgICAgICAgL0Nsb3VkRnJvbnQgc2VydmVzIHN0YXRpYyBhc3NldHMgc3RyYWlnaHQgZnJvbSBTMy8sXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoXCJyZWplY3RzIHR3byBkaWZmZXJlbnQgdmFsdWVzXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PiByZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCIvYVwiLCBcIi9iXCIpKS50b1Rocm93KFxuICAgICAgICAncHJvcCBpcyBcIi9hXCIgYnV0IHlvdXIgTmV4dC5qcyBhcHBcXCdzIGNvbmZpZyBzZXRzIGBiYXNlUGF0aGAgdG8gXCIvYlwiJyxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKE5leHRqc1R5cGUuUkVHSU9OQUxfRlVOQ1RJT05TLCAoKSA9PiB7XG4gICAgLy8gQVBJIEdhdGV3YXkgc3RyaXBzIHRoZSBzdGFnZSBiZWZvcmUgbWF0Y2hpbmcgcmVzb3VyY2VzLCBzbyBhbiBhcHAgc2VydmVkXG4gICAgLy8gYXQgdGhlIGRlZmF1bHQgYHByb2RgIHN0YWdlIHNldHMgYmFzZVBhdGg6IFwiL3Byb2RcIiBhbmQgbGVhdmVzIHRoZSBwcm9wXG4gICAgLy8gdW5zZXQuIFNhbWUgc2hhcGUgYXMgYSBjdXN0b20gZG9tYWluIGJhc2UgcGF0aCBtYXBwaW5nLiBEZXJpdmluZyBoZXJlXG4gICAgLy8gd291bGQgbmVzdCBldmVyeSByZXNvdXJjZSB1bmRlciBhIHBhdGggdGhlIHN0YWdlIGFscmVhZHkgY29uc3VtZWQuXG4gICAgaXQoXCJkb2VzIG5vdCBkZXJpdmUgdGhlIGFwcCdzIGJhc2VQYXRoXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUJhc2VQYXRoKE5leHRqc1R5cGUuUkVHSU9OQUxfRlVOQ1RJT05TLCB1bmRlZmluZWQsIFwiL3Byb2RcIiksXG4gICAgICApLnRvQmVVbmRlZmluZWQoKTtcbiAgICB9KTtcblxuICAgIC8vIFRoZSBzdHJpcHBlZCBwcmVmaXggaXMgcGFydCBvZiB3aGF0IHRoZSBhcHAgZW1pdHMgYnV0IG5ldmVyIHBhcnQgb2YgdGhlXG4gICAgLy8gcmVzb3VyY2UgcGF0aCwgc28gYW4gYXBwIGF0IHRoZSBgcHJvZGAgc3RhZ2UgbmVzdGVkIHVuZGVyIFwiL2Jhc2VcIiBzZXRzXG4gICAgLy8gYmFzZVBhdGg6IFwiL3Byb2QvYmFzZVwiIGFuZCB0aGUgcHJvcCB0byBcIi9iYXNlXCIuXG4gICAgaXQoXCJhY2NlcHRzIGFuIGFwcCBiYXNlUGF0aCB0aGF0IGVuZHMgd2l0aCB0aGUgcHJvcFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVCYXNlUGF0aChOZXh0anNUeXBlLlJFR0lPTkFMX0ZVTkNUSU9OUywgXCIvYmFzZVwiLCBcIi9wcm9kL2Jhc2VcIiksXG4gICAgICApLnRvQmUoXCJiYXNlXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJvbmx5IGFjY2VwdHMgdGhlIHByb3AgYXMgYSB3aG9sZSB0cmFpbGluZyBwYXRoIHNlZ21lbnRcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KCgpID0+XG4gICAgICAgIHJlc29sdmVCYXNlUGF0aChOZXh0anNUeXBlLlJFR0lPTkFMX0ZVTkNUSU9OUywgXCIvc2VcIiwgXCIvcHJvZC9iYXNlXCIpLFxuICAgICAgKS50b1Rocm93KC9uZXN0cyBldmVyeSBBUEkgR2F0ZXdheSByZXNvdXJjZSB1bmRlciB0aGF0IHBhdGgvKTtcbiAgICAgIC8vIExlYWRpbmcsIG5vdCB0cmFpbGluZzogQVBJIEdhdGV3YXkgc3RyaXBzIHRoZSBzdGFnZSwgc28gdGhlIGFwcCB3b3VsZFxuICAgICAgLy8gZW1pdCBcIi9wcm9kLy4uLlwiIHdoaWxlIHRoZSByZXNvdXJjZXMgbGl2ZSB1bmRlciBcIi9wcm9kL2Jhc2UvLi4uXCIuXG4gICAgICBleHBlY3QoKCkgPT5cbiAgICAgICAgcmVzb2x2ZUJhc2VQYXRoKE5leHRqc1R5cGUuUkVHSU9OQUxfRlVOQ1RJT05TLCBcIi9wcm9kXCIsIFwiL3Byb2QvYmFzZVwiKSxcbiAgICAgICkudG9UaHJvdygvbmVzdHMgZXZlcnkgQVBJIEdhdGV3YXkgcmVzb3VyY2UgdW5kZXIgdGhhdCBwYXRoLyk7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgcmV2ZXJzZSBpcyBuZXZlciByaWdodDogdGhlIHByb3AgbmVzdHMgZXZlcnkgcmVzb3VyY2UsIGluY2x1ZGluZyB0aGVcbiAgICAvLyBjYXRjaC1hbGwsIHVuZGVyIGEgcGF0aCB0aGUgYXBwIG5ldmVyIGxpbmtzIHRvLlxuICAgIGl0KFwicmVqZWN0cyB0aGUgcHJvcCBzZXR0aW5nIGEgYmFzZVBhdGggdGhlIGFwcCBkb2Vzbid0XCIsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PlxuICAgICAgICByZXNvbHZlQmFzZVBhdGgoTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlMsIFwiL2Jhc2VcIiksXG4gICAgICApLnRvVGhyb3coL25lc3RzIGV2ZXJ5IEFQSSBHYXRld2F5IHJlc291cmNlIHVuZGVyIHRoYXQgcGF0aC8pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJyZWplY3RzIHR3byBkaWZmZXJlbnQgdmFsdWVzXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PlxuICAgICAgICByZXNvbHZlQmFzZVBhdGgoTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlMsIFwiL2FcIiwgXCIvYlwiKSxcbiAgICAgICkudG9UaHJvdygvbmVzdHMgZXZlcnkgQVBJIEdhdGV3YXkgcmVzb3VyY2UgdW5kZXIgdGhhdCBwYXRoLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKE5leHRqc1R5cGUuUkVHSU9OQUxfQ09OVEFJTkVSUywgKCkgPT4ge1xuICAgIC8vIGJhc2VQYXRoIG9ubHkgbmFtZXNwYWNlcyB0aGUgUzMgYnVja2V0IGhlcmU6IHRoZSBBTEIgZm9yd2FyZHMgZXZlcnkgcGF0aFxuICAgIC8vIHRvIHRoZSBjb250YWluZXIsIHdoaWNoIHNlcnZlcyBpdHMgb3duIHN0YXRpYyBhc3NldHMuIFNvIGFueSBjb21iaW5hdGlvblxuICAgIC8vIGlzIHZhbGlkLCBhbmQgdGhlIGFwcCdzIGJhc2VQYXRoIGlzIG5ldmVyIGRlcml2ZWQgaW50byB0aGUgYnVja2V0IHByZWZpeC5cbiAgICBpdChcImFjY2VwdHMgYW55IGNvbWJpbmF0aW9uLCBhbHdheXMga2VlcGluZyB0aGUgcHJvcFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBuZXh0anNUeXBlID0gTmV4dGpzVHlwZS5SRUdJT05BTF9DT05UQUlORVJTO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcIi9hXCIsIFwiL2JcIikpLnRvQmUoXCJhXCIpO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcIi9hXCIpKS50b0JlKFwiYVwiKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgdW5kZWZpbmVkLCBcIi9iXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Undocumented, unsupported gates for work in progress.
3
+ *
4
+ * These are deliberately env vars rather than construct props: they select
5
+ * between an existing code path and one that is still being built, so they
6
+ * carry no JSII public surface to document, deprecate, or remove. Each one is
7
+ * deleted in the PR that makes its new path the only path.
8
+ *
9
+ * Not part of this package's public API. Do not reference them from README or
10
+ * `docs/`, and do not use them in a real deployment.
11
+ */
12
+ /**
13
+ * Serve `_next/image` from a dedicated image optimization Lambda
14
+ * (`NextjsImageFunction`) instead of the Next.js server function, for the two
15
+ * Functions `NextjsType`s.
16
+ *
17
+ * Off by default because the dedicated Lambda is not the Next.js server, so
18
+ * Next.js middleware does not run for image requests — Next's default matcher
19
+ * (`/:path*`) covers `/_next/image`. The adapter runtime release
20
+ * (`docs/plans/adapter-runtime-release.md`) resolves that by dispatching
21
+ * `_next/image` in-process after middleware, at which point the separate
22
+ * Lambda and this flag both go away.
23
+ */
24
+ export declare function useDedicatedImageFunction(): boolean;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ /**
3
+ * Undocumented, unsupported gates for work in progress.
4
+ *
5
+ * These are deliberately env vars rather than construct props: they select
6
+ * between an existing code path and one that is still being built, so they
7
+ * carry no JSII public surface to document, deprecate, or remove. Each one is
8
+ * deleted in the PR that makes its new path the only path.
9
+ *
10
+ * Not part of this package's public API. Do not reference them from README or
11
+ * `docs/`, and do not use them in a real deployment.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.useDedicatedImageFunction = useDedicatedImageFunction;
15
+ /**
16
+ * Serve `_next/image` from a dedicated image optimization Lambda
17
+ * (`NextjsImageFunction`) instead of the Next.js server function, for the two
18
+ * Functions `NextjsType`s.
19
+ *
20
+ * Off by default because the dedicated Lambda is not the Next.js server, so
21
+ * Next.js middleware does not run for image requests — Next's default matcher
22
+ * (`/:path*`) covers `/_next/image`. The adapter runtime release
23
+ * (`docs/plans/adapter-runtime-release.md`) resolves that by dispatching
24
+ * `_next/image` in-process after middleware, at which point the separate
25
+ * Lambda and this flag both go away.
26
+ */
27
+ function useDedicatedImageFunction() {
28
+ return process.env.CDK_NEXTJS_EXPERIMENTAL_DEDICATED_IMAGE_FUNCTION === "1";
29
+ }
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwZXJpbWVudGFsLWZsYWdzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2V4cGVyaW1lbnRhbC1mbGFncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7R0FVRzs7QUFjSCw4REFFQztBQWREOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBZ0IseUJBQXlCO0lBQ3ZDLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxnREFBZ0QsS0FBSyxHQUFHLENBQUM7QUFDOUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVW5kb2N1bWVudGVkLCB1bnN1cHBvcnRlZCBnYXRlcyBmb3Igd29yayBpbiBwcm9ncmVzcy5cbiAqXG4gKiBUaGVzZSBhcmUgZGVsaWJlcmF0ZWx5IGVudiB2YXJzIHJhdGhlciB0aGFuIGNvbnN0cnVjdCBwcm9wczogdGhleSBzZWxlY3RcbiAqIGJldHdlZW4gYW4gZXhpc3RpbmcgY29kZSBwYXRoIGFuZCBvbmUgdGhhdCBpcyBzdGlsbCBiZWluZyBidWlsdCwgc28gdGhleVxuICogY2Fycnkgbm8gSlNJSSBwdWJsaWMgc3VyZmFjZSB0byBkb2N1bWVudCwgZGVwcmVjYXRlLCBvciByZW1vdmUuIEVhY2ggb25lIGlzXG4gKiBkZWxldGVkIGluIHRoZSBQUiB0aGF0IG1ha2VzIGl0cyBuZXcgcGF0aCB0aGUgb25seSBwYXRoLlxuICpcbiAqIE5vdCBwYXJ0IG9mIHRoaXMgcGFja2FnZSdzIHB1YmxpYyBBUEkuIERvIG5vdCByZWZlcmVuY2UgdGhlbSBmcm9tIFJFQURNRSBvclxuICogYGRvY3MvYCwgYW5kIGRvIG5vdCB1c2UgdGhlbSBpbiBhIHJlYWwgZGVwbG95bWVudC5cbiAqL1xuXG4vKipcbiAqIFNlcnZlIGBfbmV4dC9pbWFnZWAgZnJvbSBhIGRlZGljYXRlZCBpbWFnZSBvcHRpbWl6YXRpb24gTGFtYmRhXG4gKiAoYE5leHRqc0ltYWdlRnVuY3Rpb25gKSBpbnN0ZWFkIG9mIHRoZSBOZXh0LmpzIHNlcnZlciBmdW5jdGlvbiwgZm9yIHRoZSB0d29cbiAqIEZ1bmN0aW9ucyBgTmV4dGpzVHlwZWBzLlxuICpcbiAqIE9mZiBieSBkZWZhdWx0IGJlY2F1c2UgdGhlIGRlZGljYXRlZCBMYW1iZGEgaXMgbm90IHRoZSBOZXh0LmpzIHNlcnZlciwgc29cbiAqIE5leHQuanMgbWlkZGxld2FyZSBkb2VzIG5vdCBydW4gZm9yIGltYWdlIHJlcXVlc3RzIOKAlCBOZXh0J3MgZGVmYXVsdCBtYXRjaGVyXG4gKiAoYC86cGF0aCpgKSBjb3ZlcnMgYC9fbmV4dC9pbWFnZWAuIFRoZSBhZGFwdGVyIHJ1bnRpbWUgcmVsZWFzZVxuICogKGBkb2NzL3BsYW5zL2FkYXB0ZXItcnVudGltZS1yZWxlYXNlLm1kYCkgcmVzb2x2ZXMgdGhhdCBieSBkaXNwYXRjaGluZ1xuICogYF9uZXh0L2ltYWdlYCBpbi1wcm9jZXNzIGFmdGVyIG1pZGRsZXdhcmUsIGF0IHdoaWNoIHBvaW50IHRoZSBzZXBhcmF0ZVxuICogTGFtYmRhIGFuZCB0aGlzIGZsYWcgYm90aCBnbyBhd2F5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRGVkaWNhdGVkSW1hZ2VGdW5jdGlvbigpOiBib29sZWFuIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52LkNES19ORVhUSlNfRVhQRVJJTUVOVEFMX0RFRElDQVRFRF9JTUFHRV9GVU5DVElPTiA9PT0gXCIxXCI7XG59XG4iXX0=
@@ -1,2 +1,12 @@
1
1
  import { Architecture } from "aws-cdk-lib/aws-lambda";
2
+ /**
3
+ * Host architecture normalized to the two Lambda supports, spelled the way
4
+ * Sharp's `@img/sharp-<platform>-<arch>` packages spell it.
5
+ *
6
+ * The Lambda's architecture and the Sharp binaries bundled into its asset must
7
+ * come from this one value: deriving them separately lets them disagree on a
8
+ * host that is neither x64 nor arm (e.g. s390x), which produces a Lambda that
9
+ * fails to load its own bindings.
10
+ */
11
+ export declare function getNodeArchitecture(): string;
2
12
  export declare function getLambdaArchitecture(): Architecture;
@@ -1,8 +1,23 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getNodeArchitecture = getNodeArchitecture;
3
4
  exports.getLambdaArchitecture = getLambdaArchitecture;
4
5
  const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
6
+ /**
7
+ * Host architecture normalized to the two Lambda supports, spelled the way
8
+ * Sharp's `@img/sharp-<platform>-<arch>` packages spell it.
9
+ *
10
+ * The Lambda's architecture and the Sharp binaries bundled into its asset must
11
+ * come from this one value: deriving them separately lets them disagree on a
12
+ * host that is neither x64 nor arm (e.g. s390x), which produces a Lambda that
13
+ * fails to load its own bindings.
14
+ */
15
+ function getNodeArchitecture() {
16
+ return process.arch.startsWith("arm") ? "arm64" : "x64";
17
+ }
5
18
  function getLambdaArchitecture() {
6
- return process.arch === "x64" ? aws_lambda_1.Architecture.X86_64 : aws_lambda_1.Architecture.ARM_64;
19
+ return getNodeArchitecture() === "arm64"
20
+ ? aws_lambda_1.Architecture.ARM_64
21
+ : aws_lambda_1.Architecture.X86_64;
7
22
  }
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWFyY2hpdGVjdHVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9nZXQtYXJjaGl0ZWN0dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsc0RBRUM7QUFKRCx1REFBc0Q7QUFFdEQsU0FBZ0IscUJBQXFCO0lBQ25DLE9BQU8sT0FBTyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLHlCQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyx5QkFBWSxDQUFDLE1BQU0sQ0FBQztBQUM1RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXJjaGl0ZWN0dXJlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhbWJkYUFyY2hpdGVjdHVyZSgpOiBBcmNoaXRlY3R1cmUge1xuICByZXR1cm4gcHJvY2Vzcy5hcmNoID09PSBcIng2NFwiID8gQXJjaGl0ZWN0dXJlLlg4Nl82NCA6IEFyY2hpdGVjdHVyZS5BUk1fNjQ7XG59XG4iXX0=
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWFyY2hpdGVjdHVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9nZXQtYXJjaGl0ZWN0dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBV0Esa0RBRUM7QUFFRCxzREFJQztBQW5CRCx1REFBc0Q7QUFFdEQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixtQkFBbUI7SUFDakMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDMUQsQ0FBQztBQUVELFNBQWdCLHFCQUFxQjtJQUNuQyxPQUFPLG1CQUFtQixFQUFFLEtBQUssT0FBTztRQUN0QyxDQUFDLENBQUMseUJBQVksQ0FBQyxNQUFNO1FBQ3JCLENBQUMsQ0FBQyx5QkFBWSxDQUFDLE1BQU0sQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXJjaGl0ZWN0dXJlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcblxuLyoqXG4gKiBIb3N0IGFyY2hpdGVjdHVyZSBub3JtYWxpemVkIHRvIHRoZSB0d28gTGFtYmRhIHN1cHBvcnRzLCBzcGVsbGVkIHRoZSB3YXlcbiAqIFNoYXJwJ3MgYEBpbWcvc2hhcnAtPHBsYXRmb3JtPi08YXJjaD5gIHBhY2thZ2VzIHNwZWxsIGl0LlxuICpcbiAqIFRoZSBMYW1iZGEncyBhcmNoaXRlY3R1cmUgYW5kIHRoZSBTaGFycCBiaW5hcmllcyBidW5kbGVkIGludG8gaXRzIGFzc2V0IG11c3RcbiAqIGNvbWUgZnJvbSB0aGlzIG9uZSB2YWx1ZTogZGVyaXZpbmcgdGhlbSBzZXBhcmF0ZWx5IGxldHMgdGhlbSBkaXNhZ3JlZSBvbiBhXG4gKiBob3N0IHRoYXQgaXMgbmVpdGhlciB4NjQgbm9yIGFybSAoZS5nLiBzMzkweCksIHdoaWNoIHByb2R1Y2VzIGEgTGFtYmRhIHRoYXRcbiAqIGZhaWxzIHRvIGxvYWQgaXRzIG93biBiaW5kaW5ncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5vZGVBcmNoaXRlY3R1cmUoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHByb2Nlc3MuYXJjaC5zdGFydHNXaXRoKFwiYXJtXCIpID8gXCJhcm02NFwiIDogXCJ4NjRcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhbWJkYUFyY2hpdGVjdHVyZSgpOiBBcmNoaXRlY3R1cmUge1xuICByZXR1cm4gZ2V0Tm9kZUFyY2hpdGVjdHVyZSgpID09PSBcImFybTY0XCJcbiAgICA/IEFyY2hpdGVjdHVyZS5BUk1fNjRcbiAgICA6IEFyY2hpdGVjdHVyZS5YODZfNjQ7XG59XG4iXX0=
package/package.json CHANGED
@@ -81,7 +81,7 @@
81
81
  "publishConfig": {
82
82
  "access": "public"
83
83
  },
84
- "version": "0.5.15",
84
+ "version": "0.6.0",
85
85
  "jest": {
86
86
  "coverageProvider": "v8",
87
87
  "testPathIgnorePatterns": [
@@ -161,6 +161,8 @@
161
161
  "bundle:adapter/adapter:watch": "pnpm dlx projen bundle:adapter/adapter:watch",
162
162
  "bundle:adapter/cache-handler": "pnpm dlx projen bundle:adapter/cache-handler",
163
163
  "bundle:adapter/cache-handler:watch": "pnpm dlx projen bundle:adapter/cache-handler:watch",
164
+ "bundle:image-optimization/handler": "pnpm dlx projen bundle:image-optimization/handler",
165
+ "bundle:image-optimization/handler:watch": "pnpm dlx projen bundle:image-optimization/handler:watch",
164
166
  "bundle:lambdas/post-deploy/post-deploy.lambda": "pnpm dlx projen bundle:lambdas/post-deploy/post-deploy.lambda",
165
167
  "bundle:lambdas/post-deploy/post-deploy.lambda:watch": "pnpm dlx projen bundle:lambdas/post-deploy/post-deploy.lambda:watch",
166
168
  "bundle:nextjs-build/patch-fetch": "pnpm dlx projen bundle:nextjs-build/patch-fetch",