cdk-nextjs 0.7.6 → 0.7.7

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 (43) hide show
  1. package/.jsii +3 -3
  2. package/.jsii.tabl.json +1 -1
  3. package/README.md +12 -3
  4. package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +31 -13
  5. package/docs/caching-guide.md +11 -1
  6. package/docs/harness-coverage.md +2 -1
  7. package/lib/adapter/aws-cache-store.d.ts +214 -3
  8. package/lib/adapter/aws-cache-store.js +470 -35
  9. package/lib/adapter/aws-cache-store.test.js +675 -3
  10. package/lib/adapter/cache-handler.mjs +421 -30
  11. package/lib/adapter/use-cache-common.d.ts +53 -1
  12. package/lib/adapter/use-cache-common.js +121 -14
  13. package/lib/adapter/use-cache-common.test.js +138 -1
  14. package/lib/adapter/use-cache-default-handler.js +36 -6
  15. package/lib/adapter/use-cache-default-handler.mjs +525 -42
  16. package/lib/adapter/use-cache-handlers.test.js +247 -7
  17. package/lib/adapter/use-cache-remote-handler.js +9 -7
  18. package/lib/adapter/use-cache-remote-handler.mjs +516 -40
  19. package/lib/lambdas/post-deploy/prune-revalidation-table.d.ts +2 -1
  20. package/lib/lambdas/post-deploy/prune-revalidation-table.js +35 -13
  21. package/lib/lambdas/post-deploy/prune-revalidation-table.test.js +19 -1
  22. package/lib/nextjs-api.js +1 -1
  23. package/lib/nextjs-build/nextjs-build.js +1 -1
  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-distribution.js +1 -1
  28. package/lib/nextjs-post-deploy.js +1 -1
  29. package/lib/nextjs-static-assets.js +1 -1
  30. package/lib/root-constructs/nextjs-base-construct.js +1 -1
  31. package/lib/root-constructs/nextjs-global-containers.js +1 -1
  32. package/lib/root-constructs/nextjs-global-functions.js +1 -1
  33. package/lib/root-constructs/nextjs-regional-containers.js +1 -1
  34. package/lib/root-constructs/nextjs-regional-functions.js +1 -1
  35. package/lib/runtime/core.js +18 -4
  36. package/lib/runtime/core.test.js +17 -1
  37. package/lib/runtime/lambda.mjs +16 -3
  38. package/lib/runtime/server.mjs +16 -3
  39. package/lib/runtime/tag-manifest.d.ts +15 -0
  40. package/lib/runtime/tag-manifest.js +24 -0
  41. package/lib/runtime/tag-manifest.test.d.ts +1 -0
  42. package/lib/runtime/tag-manifest.test.js +21 -0
  43. package/package.json +1 -1
@@ -38647,6 +38647,16 @@ function httpDate(value) {
38647
38647
  return date2 && !Number.isNaN(date2.getTime()) ? date2 : void 0;
38648
38648
  }
38649
38649
 
38650
+ // src/runtime/tag-manifest.ts
38651
+ var TAG_MANIFEST_SYMBOL = /* @__PURE__ */ Symbol.for(
38652
+ "cdk-nextjs.use-cache.tag-manifest"
38653
+ );
38654
+ async function catchUpTags(render) {
38655
+ const global = globalThis;
38656
+ const manifest = global[TAG_MANIFEST_SYMBOL];
38657
+ return manifest ? manifest.catchUp(render) : render();
38658
+ }
38659
+
38650
38660
  // src/runtime/core.ts
38651
38661
  var NextjsRuntime = class {
38652
38662
  constructor(options) {
@@ -38794,7 +38804,7 @@ var NextjsRuntime = class {
38794
38804
  const search = toSearch(invocationQuery);
38795
38805
  req.url = search ? `${pathname}?${search}` : pathname;
38796
38806
  req.headers = toIncomingHttpHeaders(result.requestHeaders);
38797
- await handler2(req, asServerResponse(res), {
38807
+ const options = {
38798
38808
  waitUntil,
38799
38809
  requestMeta: {
38800
38810
  // The resolved query, stated rather than left to be re-derived.
@@ -38869,7 +38879,9 @@ var NextjsRuntime = class {
38869
38879
  // mocked `req`/`res`).
38870
38880
  revalidate: (config) => this.revalidate(config, request)
38871
38881
  }
38872
- });
38882
+ };
38883
+ const render = () => handler2(req, asServerResponse(res), options);
38884
+ await (result.entrypoint.type === "app-page" ? catchUpTags(render) : render());
38873
38885
  if (!res.writableEnded && result.entrypoint.type !== "page-api") {
38874
38886
  res.end();
38875
38887
  }
@@ -39156,7 +39168,8 @@ var NextjsRuntime = class {
39156
39168
  if (target.kind === "entrypoint") {
39157
39169
  const handler2 = await this.entrypoints.load(target.entrypoint);
39158
39170
  req.url = requestedUrl ?? req.url;
39159
- await handler2(req, asServerResponse(res), { waitUntil });
39171
+ const render = () => handler2(req, asServerResponse(res), { waitUntil });
39172
+ await (target.entrypoint.type === "app-page" ? catchUpTags(render) : render());
39160
39173
  if (!res.writableEnded) {
39161
39174
  res.end();
39162
39175
  }
@@ -38647,6 +38647,16 @@ function httpDate(value) {
38647
38647
  return date2 && !Number.isNaN(date2.getTime()) ? date2 : void 0;
38648
38648
  }
38649
38649
 
38650
+ // src/runtime/tag-manifest.ts
38651
+ var TAG_MANIFEST_SYMBOL = /* @__PURE__ */ Symbol.for(
38652
+ "cdk-nextjs.use-cache.tag-manifest"
38653
+ );
38654
+ async function catchUpTags(render) {
38655
+ const global = globalThis;
38656
+ const manifest = global[TAG_MANIFEST_SYMBOL];
38657
+ return manifest ? manifest.catchUp(render) : render();
38658
+ }
38659
+
38650
38660
  // src/runtime/core.ts
38651
38661
  var NextjsRuntime = class {
38652
38662
  constructor(options) {
@@ -38794,7 +38804,7 @@ var NextjsRuntime = class {
38794
38804
  const search = toSearch(invocationQuery);
38795
38805
  req.url = search ? `${pathname}?${search}` : pathname;
38796
38806
  req.headers = toIncomingHttpHeaders(result.requestHeaders);
38797
- await handler(req, asServerResponse(res), {
38807
+ const options = {
38798
38808
  waitUntil,
38799
38809
  requestMeta: {
38800
38810
  // The resolved query, stated rather than left to be re-derived.
@@ -38869,7 +38879,9 @@ var NextjsRuntime = class {
38869
38879
  // mocked `req`/`res`).
38870
38880
  revalidate: (config) => this.revalidate(config, request)
38871
38881
  }
38872
- });
38882
+ };
38883
+ const render = () => handler(req, asServerResponse(res), options);
38884
+ await (result.entrypoint.type === "app-page" ? catchUpTags(render) : render());
38873
38885
  if (!res.writableEnded && result.entrypoint.type !== "page-api") {
38874
38886
  res.end();
38875
38887
  }
@@ -39156,7 +39168,8 @@ var NextjsRuntime = class {
39156
39168
  if (target.kind === "entrypoint") {
39157
39169
  const handler = await this.entrypoints.load(target.entrypoint);
39158
39170
  req.url = requestedUrl ?? req.url;
39159
- await handler(req, asServerResponse(res), { waitUntil });
39171
+ const render = () => handler(req, asServerResponse(res), { waitUntil });
39172
+ await (target.entrypoint.type === "app-page" ? catchUpTags(render) : render());
39160
39173
  if (!res.writableEnded) {
39161
39174
  res.end();
39162
39175
  }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * The key the process's tag manifest (`TrackedTagMarkers`, from the adapter's
3
+ * `sharedTagManifest`) is kept under on `globalThis`, since the runtime and the
4
+ * cache handlers are separate bundles.
5
+ */
6
+ export declare const TAG_MANIFEST_SYMBOL: unique symbol;
7
+ /**
8
+ * Render a page, after waiting for the revalidation log query if the instance
9
+ * has fallen behind on it (sat idle, or thawed): here, before Next.js starts
10
+ * rendering, rather than inside the first `'use cache'` lookup, where the wait
11
+ * cuts a staged render's static stage short. Just `render` until a cache
12
+ * handler first creates the manifest, and then there is nothing to catch up
13
+ * on. Rejects only as `render` does.
14
+ */
15
+ export declare function catchUpTags<T>(render: () => Promise<T>): Promise<T>;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TAG_MANIFEST_SYMBOL = void 0;
4
+ exports.catchUpTags = catchUpTags;
5
+ /**
6
+ * The key the process's tag manifest (`TrackedTagMarkers`, from the adapter's
7
+ * `sharedTagManifest`) is kept under on `globalThis`, since the runtime and the
8
+ * cache handlers are separate bundles.
9
+ */
10
+ exports.TAG_MANIFEST_SYMBOL = Symbol.for("cdk-nextjs.use-cache.tag-manifest");
11
+ /**
12
+ * Render a page, after waiting for the revalidation log query if the instance
13
+ * has fallen behind on it (sat idle, or thawed): here, before Next.js starts
14
+ * rendering, rather than inside the first `'use cache'` lookup, where the wait
15
+ * cuts a staged render's static stage short. Just `render` until a cache
16
+ * handler first creates the manifest, and then there is nothing to catch up
17
+ * on. Rejects only as `render` does.
18
+ */
19
+ async function catchUpTags(render) {
20
+ const global = globalThis;
21
+ const manifest = global[exports.TAG_MANIFEST_SYMBOL];
22
+ return manifest ? manifest.catchUp(render) : render();
23
+ }
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnLW1hbmlmZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvdGFnLW1hbmlmZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQW1CQSxrQ0FNQztBQXZCRDs7OztHQUlHO0FBQ1UsUUFBQSxtQkFBbUIsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUMzQyxtQ0FBbUMsQ0FDcEMsQ0FBQztBQUVGOzs7Ozs7O0dBT0c7QUFDSSxLQUFLLFVBQVUsV0FBVyxDQUFJLE1BQXdCO0lBQzNELE1BQU0sTUFBTSxHQUFHLFVBRWQsQ0FBQztJQUNGLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQywyQkFBbUIsQ0FBQyxDQUFDO0lBQzdDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUN4RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBUcmFja2VkVGFnTWFya2VycyB9IGZyb20gXCIuLi9hZGFwdGVyL2F3cy1jYWNoZS1zdG9yZVwiO1xuXG4vKipcbiAqIFRoZSBrZXkgdGhlIHByb2Nlc3MncyB0YWcgbWFuaWZlc3QgKGBUcmFja2VkVGFnTWFya2Vyc2AsIGZyb20gdGhlIGFkYXB0ZXInc1xuICogYHNoYXJlZFRhZ01hbmlmZXN0YCkgaXMga2VwdCB1bmRlciBvbiBgZ2xvYmFsVGhpc2AsIHNpbmNlIHRoZSBydW50aW1lIGFuZCB0aGVcbiAqIGNhY2hlIGhhbmRsZXJzIGFyZSBzZXBhcmF0ZSBidW5kbGVzLlxuICovXG5leHBvcnQgY29uc3QgVEFHX01BTklGRVNUX1NZTUJPTCA9IFN5bWJvbC5mb3IoXG4gIFwiY2RrLW5leHRqcy51c2UtY2FjaGUudGFnLW1hbmlmZXN0XCIsXG4pO1xuXG4vKipcbiAqIFJlbmRlciBhIHBhZ2UsIGFmdGVyIHdhaXRpbmcgZm9yIHRoZSByZXZhbGlkYXRpb24gbG9nIHF1ZXJ5IGlmIHRoZSBpbnN0YW5jZVxuICogaGFzIGZhbGxlbiBiZWhpbmQgb24gaXQgKHNhdCBpZGxlLCBvciB0aGF3ZWQpOiBoZXJlLCBiZWZvcmUgTmV4dC5qcyBzdGFydHNcbiAqIHJlbmRlcmluZywgcmF0aGVyIHRoYW4gaW5zaWRlIHRoZSBmaXJzdCBgJ3VzZSBjYWNoZSdgIGxvb2t1cCwgd2hlcmUgdGhlIHdhaXRcbiAqIGN1dHMgYSBzdGFnZWQgcmVuZGVyJ3Mgc3RhdGljIHN0YWdlIHNob3J0LiBKdXN0IGByZW5kZXJgIHVudGlsIGEgY2FjaGVcbiAqIGhhbmRsZXIgZmlyc3QgY3JlYXRlcyB0aGUgbWFuaWZlc3QsIGFuZCB0aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gY2F0Y2ggdXBcbiAqIG9uLiBSZWplY3RzIG9ubHkgYXMgYHJlbmRlcmAgZG9lcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhdGNoVXBUYWdzPFQ+KHJlbmRlcjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICBjb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzIGFzIHtcbiAgICBbVEFHX01BTklGRVNUX1NZTUJPTF0/OiBQaWNrPFRyYWNrZWRUYWdNYXJrZXJzLCBcImNhdGNoVXBcIj47XG4gIH07XG4gIGNvbnN0IG1hbmlmZXN0ID0gZ2xvYmFsW1RBR19NQU5JRkVTVF9TWU1CT0xdO1xuICByZXR1cm4gbWFuaWZlc3QgPyBtYW5pZmVzdC5jYXRjaFVwKHJlbmRlcikgOiByZW5kZXIoKTtcbn1cbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tag_manifest_1 = require("./tag-manifest");
4
+ const global = globalThis;
5
+ afterEach(() => {
6
+ delete global[tag_manifest_1.TAG_MANIFEST_SYMBOL];
7
+ });
8
+ describe("catchUpTags", () => {
9
+ it("just renders before a cache handler creates the manifest", async () => {
10
+ await expect((0, tag_manifest_1.catchUpTags)(async () => "page")).resolves.toBe("page");
11
+ });
12
+ it("renders through the manifest the cache handlers share", async () => {
13
+ const manifest = {
14
+ catchUp: jest.fn(async (render) => render()),
15
+ };
16
+ global[tag_manifest_1.TAG_MANIFEST_SYMBOL] = manifest;
17
+ await expect((0, tag_manifest_1.catchUpTags)(async () => "page")).resolves.toBe("page");
18
+ expect(manifest.catchUp).toHaveBeenCalledTimes(1);
19
+ });
20
+ });
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnLW1hbmlmZXN0LnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS90YWctbWFuaWZlc3QudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGlEQUFrRTtBQUVsRSxNQUFNLE1BQU0sR0FBRyxVQUFpRCxDQUFDO0FBRWpFLFNBQVMsQ0FBQyxHQUFHLEVBQUU7SUFDYixPQUFPLE1BQU0sQ0FBQyxrQ0FBbUIsQ0FBQyxDQUFDO0FBQ3JDLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUU7SUFDM0IsRUFBRSxDQUFDLDBEQUEwRCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3hFLE1BQU0sTUFBTSxDQUFDLElBQUEsMEJBQVcsRUFBQyxLQUFLLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0RSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx1REFBdUQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNyRSxNQUFNLFFBQVEsR0FBRztZQUNmLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxNQUE2QixFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNwRSxDQUFDO1FBQ0YsTUFBTSxDQUFDLGtDQUFtQixDQUFDLEdBQUcsUUFBUSxDQUFDO1FBQ3ZDLE1BQU0sTUFBTSxDQUFDLElBQUEsMEJBQVcsRUFBQyxLQUFLLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwRSxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjYXRjaFVwVGFncywgVEFHX01BTklGRVNUX1NZTUJPTCB9IGZyb20gXCIuL3RhZy1tYW5pZmVzdFwiO1xuXG5jb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzIGFzIHsgW1RBR19NQU5JRkVTVF9TWU1CT0xdPzogdW5rbm93biB9O1xuXG5hZnRlckVhY2goKCkgPT4ge1xuICBkZWxldGUgZ2xvYmFsW1RBR19NQU5JRkVTVF9TWU1CT0xdO1xufSk7XG5cbmRlc2NyaWJlKFwiY2F0Y2hVcFRhZ3NcIiwgKCkgPT4ge1xuICBpdChcImp1c3QgcmVuZGVycyBiZWZvcmUgYSBjYWNoZSBoYW5kbGVyIGNyZWF0ZXMgdGhlIG1hbmlmZXN0XCIsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBleHBlY3QoY2F0Y2hVcFRhZ3MoYXN5bmMgKCkgPT4gXCJwYWdlXCIpKS5yZXNvbHZlcy50b0JlKFwicGFnZVwiKTtcbiAgfSk7XG5cbiAgaXQoXCJyZW5kZXJzIHRocm91Z2ggdGhlIG1hbmlmZXN0IHRoZSBjYWNoZSBoYW5kbGVycyBzaGFyZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSB7XG4gICAgICBjYXRjaFVwOiBqZXN0LmZuKGFzeW5jIChyZW5kZXI6ICgpID0+IFByb21pc2U8c3RyaW5nPikgPT4gcmVuZGVyKCkpLFxuICAgIH07XG4gICAgZ2xvYmFsW1RBR19NQU5JRkVTVF9TWU1CT0xdID0gbWFuaWZlc3Q7XG4gICAgYXdhaXQgZXhwZWN0KGNhdGNoVXBUYWdzKGFzeW5jICgpID0+IFwicGFnZVwiKSkucmVzb2x2ZXMudG9CZShcInBhZ2VcIik7XG4gICAgZXhwZWN0KG1hbmlmZXN0LmNhdGNoVXApLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgfSk7XG59KTtcbiJdfQ==
package/package.json CHANGED
@@ -84,7 +84,7 @@
84
84
  "publishConfig": {
85
85
  "access": "public"
86
86
  },
87
- "version": "0.7.6",
87
+ "version": "0.7.7",
88
88
  "jest": {
89
89
  "coverageProvider": "v8",
90
90
  "testPathIgnorePatterns": [