adjacent-next 0.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.
Files changed (48) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/LICENSE +21 -0
  3. package/README.md +42 -0
  4. package/dist/app-router-bridges.d.ts +11 -0
  5. package/dist/app-router-bridges.d.ts.map +1 -0
  6. package/dist/app-router-bridges.js +38 -0
  7. package/dist/app-router-bridges.js.map +1 -0
  8. package/dist/base-path.d.ts +27 -0
  9. package/dist/base-path.d.ts.map +1 -0
  10. package/dist/base-path.js +112 -0
  11. package/dist/base-path.js.map +1 -0
  12. package/dist/create-adjacent.d.ts +22 -0
  13. package/dist/create-adjacent.d.ts.map +1 -0
  14. package/dist/create-adjacent.js +31 -0
  15. package/dist/create-adjacent.js.map +1 -0
  16. package/dist/dev-channel-client.d.ts +6 -0
  17. package/dist/dev-channel-client.d.ts.map +1 -0
  18. package/dist/dev-channel-client.js +68 -0
  19. package/dist/dev-channel-client.js.map +1 -0
  20. package/dist/dev-channel.d.ts +7 -0
  21. package/dist/dev-channel.d.ts.map +1 -0
  22. package/dist/dev-channel.js +8 -0
  23. package/dist/dev-channel.js.map +1 -0
  24. package/dist/index.d.ts +9 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +9 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/proxy.d.ts +7 -0
  29. package/dist/proxy.d.ts.map +1 -0
  30. package/dist/proxy.js +13 -0
  31. package/dist/proxy.js.map +1 -0
  32. package/dist/service-worker-registration.d.ts +6 -0
  33. package/dist/service-worker-registration.d.ts.map +1 -0
  34. package/dist/service-worker-registration.js +35 -0
  35. package/dist/service-worker-registration.js.map +1 -0
  36. package/dist/service-worker.d.ts +23 -0
  37. package/dist/service-worker.d.ts.map +1 -0
  38. package/dist/service-worker.js +393 -0
  39. package/dist/service-worker.js.map +1 -0
  40. package/dist/with-adjacent-layout.d.ts +10 -0
  41. package/dist/with-adjacent-layout.d.ts.map +1 -0
  42. package/dist/with-adjacent-layout.js +11 -0
  43. package/dist/with-adjacent-layout.js.map +1 -0
  44. package/dist/with-adjacent.d.ts +17 -0
  45. package/dist/with-adjacent.d.ts.map +1 -0
  46. package/dist/with-adjacent.js +139 -0
  47. package/dist/with-adjacent.js.map +1 -0
  48. package/package.json +72 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,15 @@
1
+ # Changelog
2
+
3
+ ## Unpublished
4
+
5
+ ### 🛠 Breaking changes
6
+
7
+ ### 🎉 New features
8
+
9
+ ### 🐛 Bug fixes
10
+
11
+ ### 💡 Others
12
+
13
+ ## 0.1.0 - 2026-08-29
14
+
15
+ _This version does not introduce any user-facing changes._
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Eric Kweyunga
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,42 @@
1
+ # adjacent-next
2
+
3
+ Next.js App Router integration for Adjacent: metadata, manifest, service worker, and development wiring.
4
+
5
+ ## Documentation
6
+
7
+ - [Next.js integration](https://github.com/erickweyunga/adjacent-framework/blob/main/docs/nextjs.md)
8
+ - [Request proxy](https://github.com/erickweyunga/adjacent-framework/blob/main/docs/proxy.md)
9
+ - [Conventional assets](https://github.com/erickweyunga/adjacent-framework/blob/main/docs/assets.md)
10
+ - [All the documentation](https://github.com/erickweyunga/adjacent-framework/blob/main/docs/README.md)
11
+
12
+ ## Installation
13
+
14
+ ```bash
15
+ npm install adjacent-next
16
+ ```
17
+
18
+ Most projects get this through the CLI instead, which installs and wires it up:
19
+
20
+ ```bash
21
+ npx adjacent-cli init
22
+ ```
23
+
24
+ `withAdjacent()` wraps `next.config.ts`, `createAdjacent()` derives the
25
+ metadata and manifest, and `withAdjacentLayout()` injects the browser runtime
26
+ into a root layout that stays ordinary JSX. Bridge helpers cover the files Next
27
+ requires to physically exist: `app/manifest.ts` and `app/sw.js/route.ts`.
28
+
29
+ ## Issues
30
+
31
+ If you hit a problem using this package, please
32
+ [report it here](https://github.com/erickweyunga/adjacent-framework/issues/new).
33
+
34
+ ## Contributing
35
+
36
+ Issues and pull requests are welcome. Please read the
37
+ [contributing guide](https://github.com/erickweyunga/adjacent-framework/blob/main/CONTRIBUTING.md)
38
+ first.
39
+
40
+ ## License
41
+
42
+ MIT
@@ -0,0 +1,11 @@
1
+ import { type AdjacentConfig, type AdjacentConfigExport } from "adjacent-core";
2
+ import type { MetadataRoute } from "next";
3
+ import type { CreateAdjacentOptions } from "./create-adjacent.js";
4
+ export declare function resolveNextConfig(config: AdjacentConfigExport, options?: CreateAdjacentOptions): AdjacentConfig | Promise<AdjacentConfig>;
5
+ export type AdjacentManifest = () => MetadataRoute.Manifest | Promise<MetadataRoute.Manifest>;
6
+ export interface AdjacentServiceWorkerBridge {
7
+ readonly GET: () => Response | Promise<Response>;
8
+ }
9
+ export declare function createAdjacentManifest(config: AdjacentConfigExport, options?: CreateAdjacentOptions): AdjacentManifest;
10
+ export declare function createAdjacentServiceWorker(config: AdjacentConfigExport, options?: CreateAdjacentOptions): AdjacentServiceWorkerBridge;
11
+ //# sourceMappingURL=app-router-bridges.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-router-bridges.d.ts","sourceRoot":"","sources":["../src/app-router-bridges.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,oBAAoB,EAE1B,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAG1C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAmBlE,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,oBAAoB,EAC5B,OAAO,GAAE,qBAA0B,GAClC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAI1C;AAED,MAAM,MAAM,gBAAgB,GAAG,MAC3B,aAAa,CAAC,QAAQ,GACtB,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;AAEpC,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,GAAG,EAAE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CAClD;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,oBAAoB,EAC5B,OAAO,GAAE,qBAA0B,GAClC,gBAAgB,CAOlB;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,oBAAoB,EAC5B,OAAO,GAAE,qBAA0B,GAClC,2BAA2B,CAS7B"}
@@ -0,0 +1,38 @@
1
+ import { parseConfig, resolveConfig, resolveManifest, } from "adjacent-core";
2
+ import { applyBasePathToManifest } from "./base-path.js";
3
+ import { createServiceWorkerRoute } from "./service-worker.js";
4
+ function inferConfigContext(options) {
5
+ const mode = options.mode ?? (process.env.NODE_ENV === "test"
6
+ ? "test"
7
+ : process.env.NODE_ENV === "production"
8
+ ? "production"
9
+ : "development");
10
+ return {
11
+ command: options.command ?? (mode === "development" ? "dev" : "build"),
12
+ mode,
13
+ projectRoot: options.projectRoot ?? process.cwd(),
14
+ };
15
+ }
16
+ export function resolveNextConfig(config, options = {}) {
17
+ return typeof config === "function"
18
+ ? resolveConfig(config, inferConfigContext(options))
19
+ : parseConfig(config);
20
+ }
21
+ export function createAdjacentManifest(config, options = {}) {
22
+ return () => {
23
+ const resolved = resolveNextConfig(config, options);
24
+ const build = (value) => applyBasePathToManifest(resolveManifest(value));
25
+ return resolved instanceof Promise ? resolved.then(build) : build(resolved);
26
+ };
27
+ }
28
+ export function createAdjacentServiceWorker(config, options = {}) {
29
+ return {
30
+ GET() {
31
+ const resolved = resolveNextConfig(config, options);
32
+ return resolved instanceof Promise
33
+ ? resolved.then((value) => createServiceWorkerRoute(value).GET())
34
+ : createServiceWorkerRoute(resolved).GET();
35
+ },
36
+ };
37
+ }
38
+ //# sourceMappingURL=app-router-bridges.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-router-bridges.js","sourceRoot":"","sources":["../src/app-router-bridges.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,aAAa,EACb,eAAe,GAIhB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,SAAS,kBAAkB,CAAC,OAA8B;IACxD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAC3B,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM;QAC7B,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;YACrC,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,aAAa,CACpB,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;QACtE,IAAI;QACJ,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE;KAClD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,MAA4B,EAC5B,UAAiC,EAAE;IAEnC,OAAO,OAAO,MAAM,KAAK,UAAU;QACjC,CAAC,CAAC,aAAa,CAAC,MAAM,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC;AAUD,MAAM,UAAU,sBAAsB,CACpC,MAA4B,EAC5B,UAAiC,EAAE;IAEnC,OAAO,GAAG,EAAE;QACV,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,CAAC,KAAqB,EAA0B,EAAE,CAC9D,uBAAuB,CAAC,eAAe,CAAC,KAAK,CAAC,CAA2B,CAAC;QAC5E,OAAO,QAAQ,YAAY,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9E,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,MAA4B,EAC5B,UAAiC,EAAE;IAEnC,OAAO;QACL,GAAG;YACD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACpD,OAAO,QAAQ,YAAY,OAAO;gBAChC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC;gBACjE,CAAC,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC;QAC/C,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ /** The name the base path travels under, in Next's `env` and in the worker. */
2
+ export declare const BASE_PATH_ENV = "ADJACENT_BASE_PATH";
3
+ /**
4
+ * Where the application is served from, as a prefix to put in front of a
5
+ * root-relative path. Empty at the origin root, which is most applications.
6
+ *
7
+ * Read from Next's `env`, which `withAdjacent()` writes at build time, because
8
+ * `next.config.ts` is the only place that knows the base path and none of this
9
+ * code can reach it.
10
+ */
11
+ export declare function basePath(): string;
12
+ export declare function normaliseBasePath(value: string | undefined): string;
13
+ /**
14
+ * Prefixes a root-relative path. An absolute URL and a relative path are both
15
+ * left alone: one already says where it is, and the other is resolved against
16
+ * whatever is asking.
17
+ */
18
+ export declare function withBasePath(path: string, base?: string): string;
19
+ /**
20
+ * Moves every root-relative URL in a resolved manifest under the base path.
21
+ *
22
+ * Enumerated rather than walked, because one member that looks like a URL is
23
+ * not one: `share_target.params.url` names a query parameter, and prefixing it
24
+ * would break sharing while looking exactly like the fix.
25
+ */
26
+ export declare function applyBasePathToManifest<T extends Record<string, unknown>>(manifest: T, base?: string): T;
27
+ //# sourceMappingURL=base-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-path.d.ts","sourceRoot":"","sources":["../src/base-path.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,eAAO,MAAM,aAAa,uBAAuB,CAAC;AAElD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAInE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,SAAa,GAAG,MAAM,CAGpE;AAcD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvE,QAAQ,EAAE,CAAC,EACX,IAAI,SAAa,GAChB,CAAC,CA4EH"}
@@ -0,0 +1,112 @@
1
+ /** The name the base path travels under, in Next's `env` and in the worker. */
2
+ export const BASE_PATH_ENV = "ADJACENT_BASE_PATH";
3
+ /**
4
+ * Where the application is served from, as a prefix to put in front of a
5
+ * root-relative path. Empty at the origin root, which is most applications.
6
+ *
7
+ * Read from Next's `env`, which `withAdjacent()` writes at build time, because
8
+ * `next.config.ts` is the only place that knows the base path and none of this
9
+ * code can reach it.
10
+ */
11
+ export function basePath() {
12
+ return normaliseBasePath(process.env[BASE_PATH_ENV]);
13
+ }
14
+ export function normaliseBasePath(value) {
15
+ if (!value || value === "/")
16
+ return "";
17
+ const withLeading = value.startsWith("/") ? value : `/${value}`;
18
+ return withLeading.replace(/\/+$/, "");
19
+ }
20
+ /**
21
+ * Prefixes a root-relative path. An absolute URL and a relative path are both
22
+ * left alone: one already says where it is, and the other is resolved against
23
+ * whatever is asking.
24
+ */
25
+ export function withBasePath(path, base = basePath()) {
26
+ if (base === "" || !path.startsWith("/"))
27
+ return path;
28
+ return `${base}${path}`;
29
+ }
30
+ function images(value, base) {
31
+ if (!Array.isArray(value))
32
+ return value;
33
+ return value.map((image) => typeof image?.src === "string" ? { ...image, src: withBasePath(image.src, base) } : image);
34
+ }
35
+ /**
36
+ * Moves every root-relative URL in a resolved manifest under the base path.
37
+ *
38
+ * Enumerated rather than walked, because one member that looks like a URL is
39
+ * not one: `share_target.params.url` names a query parameter, and prefixing it
40
+ * would break sharing while looking exactly like the fix.
41
+ */
42
+ export function applyBasePathToManifest(manifest, base = basePath()) {
43
+ if (base === "")
44
+ return manifest;
45
+ const path = (value) => typeof value === "string" ? withBasePath(value, base) : value;
46
+ const nested = (value, map) => Array.isArray(value) ? value.map((entry) => map(entry)) : value;
47
+ return {
48
+ ...manifest,
49
+ ...(manifest["file_handlers"] === undefined
50
+ ? null
51
+ : {
52
+ file_handlers: nested(manifest["file_handlers"], (handler) => ({
53
+ ...handler,
54
+ action: path(handler["action"]),
55
+ icons: images(handler["icons"], base),
56
+ })),
57
+ }),
58
+ ...(manifest["icons"] === undefined ? null : { icons: images(manifest["icons"], base) }),
59
+ ...(manifest["id"] === undefined ? null : { id: path(manifest["id"]) }),
60
+ ...(manifest["note_taking"] === undefined
61
+ ? null
62
+ : {
63
+ note_taking: {
64
+ ...manifest["note_taking"],
65
+ new_note_url: path(manifest["note_taking"]["new_note_url"]),
66
+ },
67
+ }),
68
+ ...(manifest["protocol_handlers"] === undefined
69
+ ? null
70
+ : {
71
+ protocol_handlers: nested(manifest["protocol_handlers"], (handler) => ({ ...handler, url: path(handler["url"]) })),
72
+ }),
73
+ ...(manifest["scope"] === undefined ? null : { scope: path(manifest["scope"]) }),
74
+ ...(manifest["screenshots"] === undefined
75
+ ? null
76
+ : { screenshots: images(manifest["screenshots"], base) }),
77
+ ...(manifest["share_target"] === undefined
78
+ ? null
79
+ : {
80
+ // `action` only. `params` names query parameters, not URLs.
81
+ share_target: {
82
+ ...manifest["share_target"],
83
+ action: path(manifest["share_target"]["action"]),
84
+ },
85
+ }),
86
+ ...(manifest["shortcuts"] === undefined
87
+ ? null
88
+ : {
89
+ shortcuts: nested(manifest["shortcuts"], (shortcut) => ({
90
+ ...shortcut,
91
+ icons: images(shortcut["icons"], base),
92
+ url: path(shortcut["url"]),
93
+ })),
94
+ }),
95
+ ...(manifest["start_url"] === undefined
96
+ ? null
97
+ : { start_url: path(manifest["start_url"]) }),
98
+ ...(manifest["widgets"] === undefined
99
+ ? null
100
+ : {
101
+ widgets: nested(manifest["widgets"], (widget) => ({
102
+ ...widget,
103
+ backgrounds: images(widget["backgrounds"], base),
104
+ data: path(widget["data"]),
105
+ icons: images(widget["icons"], base),
106
+ ms_ac_template: path(widget["ms_ac_template"]),
107
+ screenshots: images(widget["screenshots"], base),
108
+ })),
109
+ }),
110
+ };
111
+ }
112
+ //# sourceMappingURL=base-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-path.js","sourceRoot":"","sources":["../src/base-path.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { type AdjacentConfig, type AdjacentConfigFactory, type ConfigContext } from "adjacent-core";
2
+ import type { Metadata, MetadataRoute, Viewport } from "next";
3
+ import { type ReactNode } from "react";
4
+ import { type AdjacentServiceWorkerRoute } from "./service-worker.js";
5
+ export interface AdjacentNextApp {
6
+ readonly devChannel: ReactNode;
7
+ readonly manifest: () => MetadataRoute.Manifest;
8
+ readonly metadata: Metadata;
9
+ readonly serviceWorker: AdjacentServiceWorkerRoute;
10
+ readonly serviceWorkerRegistration: ReactNode;
11
+ readonly viewport: Viewport;
12
+ }
13
+ export interface CreateAdjacentOptions {
14
+ readonly command?: ConfigContext["command"];
15
+ readonly metadata?: Metadata;
16
+ readonly mode?: ConfigContext["mode"];
17
+ readonly projectRoot?: string;
18
+ }
19
+ /** Creates the complete Next.js App Router integration for an Adjacent app. */
20
+ export declare function createAdjacent(config: AdjacentConfig, options?: CreateAdjacentOptions): AdjacentNextApp;
21
+ export declare function createAdjacent(config: AdjacentConfigFactory, options?: CreateAdjacentOptions): Promise<AdjacentNextApp>;
22
+ //# sourceMappingURL=create-adjacent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-adjacent.d.ts","sourceRoot":"","sources":["../src/create-adjacent.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,cAAc,EAEnB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EACnB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAC9D,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAItD,OAAO,EAAmD,KAAK,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAGvH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,aAAa,CAAC,QAAQ,CAAC;IAChD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,0BAA0B,CAAC;IACnD,QAAQ,CAAC,yBAAyB,EAAE,SAAS,CAAC;IAC9C,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAC5C,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACtC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAwBD,+EAA+E;AAC/E,wBAAgB,cAAc,CAC5B,MAAM,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,eAAe,CAAC;AACnB,wBAAgB,cAAc,CAC5B,MAAM,EAAE,qBAAqB,EAC7B,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,eAAe,CAAC,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { parseConfig, resolveManifest, resolveMetadata, resolveViewport, } from "adjacent-core";
2
+ import { createElement } from "react";
3
+ import { resolveNextConfig } from "./app-router-bridges.js";
4
+ import { DevChannel } from "./dev-channel-client.js";
5
+ import { resolveDevChannel } from "./dev-channel.js";
6
+ import { createServiceWorkerRoute, resolveOfflineRuntime } from "./service-worker.js";
7
+ import { ServiceWorkerRegistration } from "./service-worker-registration.js";
8
+ function createResolvedAdjacent(config, options = {}) {
9
+ const manifest = resolveManifest(config);
10
+ const offline = resolveOfflineRuntime(config.offline);
11
+ const development = (options.mode ?? process.env.NODE_ENV) === "development";
12
+ return {
13
+ devChannel: createElement(DevChannel, {
14
+ enabled: resolveDevChannel().enabled,
15
+ }),
16
+ manifest: () => manifest,
17
+ metadata: { ...resolveMetadata(config), ...options.metadata },
18
+ serviceWorker: createServiceWorkerRoute(config),
19
+ serviceWorkerRegistration: createElement(ServiceWorkerRegistration, {
20
+ enabled: offline.enabled && !development,
21
+ }),
22
+ viewport: resolveViewport(config),
23
+ };
24
+ }
25
+ export function createAdjacent(config, options = {}) {
26
+ if (typeof config === "function") {
27
+ return Promise.resolve(resolveNextConfig(config, options)).then((resolved) => createResolvedAdjacent(resolved, options));
28
+ }
29
+ return createResolvedAdjacent(parseConfig(config), options);
30
+ }
31
+ //# sourceMappingURL=create-adjacent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-adjacent.js","sourceRoot":"","sources":["../src/create-adjacent.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,eAAe,EACf,eAAe,EACf,eAAe,GAKhB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,aAAa,EAAkB,MAAM,OAAO,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAmC,MAAM,qBAAqB,CAAC;AACvH,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAkB7E,SAAS,sBAAsB,CAC7B,MAAsB,EACtB,UAAiC,EAAE;IAEnC,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAA2B,CAAC;IACnE,MAAM,OAAO,GAAG,qBAAqB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,aAAa,CAAC;IAE7E,OAAO;QACL,UAAU,EAAE,aAAa,CAAC,UAAU,EAAE;YACpC,OAAO,EAAE,iBAAiB,EAAE,CAAC,OAAO;SACrC,CAAC;QACF,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ;QACxB,QAAQ,EAAE,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE;QAC7D,aAAa,EAAE,wBAAwB,CAAC,MAAM,CAAC;QAC/C,yBAAyB,EAAE,aAAa,CAAC,yBAAyB,EAAE;YAClE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC,WAAW;SACzC,CAAC;QACF,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC;KAClC,CAAC;AACJ,CAAC;AAWD,MAAM,UAAU,cAAc,CAC5B,MAA4B,EAC5B,UAAiC,EAAE;IAEnC,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC3E,sBAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAC1C,CAAC;IACJ,CAAC;IACD,OAAO,sBAAsB,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface DevChannelProps {
2
+ readonly enabled: boolean;
3
+ readonly path?: string;
4
+ }
5
+ export declare function DevChannel({ enabled, path, }: DevChannelProps): null;
6
+ //# sourceMappingURL=dev-channel-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-channel-client.d.ts","sourceRoot":"","sources":["../src/dev-channel-client.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAyDD,wBAAgB,UAAU,CAAC,EACzB,OAAO,EACP,IAAuB,GACxB,EAAE,eAAe,GAAG,IAAI,CAUxB"}
@@ -0,0 +1,68 @@
1
+ "use client";
2
+ import { DEV_COMMAND, safeParseDevCommand } from "adjacent-core";
3
+ import { useEffect } from "react";
4
+ import { DEV_CHANNEL_PATH } from "./dev-channel.js";
5
+ const RETRY_DELAY_MS = 1_000;
6
+ function delay(milliseconds, signal) {
7
+ return new Promise((resolve) => {
8
+ const timer = setTimeout(resolve, milliseconds);
9
+ signal.addEventListener("abort", () => {
10
+ clearTimeout(timer);
11
+ resolve();
12
+ }, { once: true });
13
+ });
14
+ }
15
+ async function clearAdjacentRuntime() {
16
+ if ("serviceWorker" in navigator) {
17
+ const registrations = await navigator.serviceWorker.getRegistrations();
18
+ await Promise.all(registrations.map((registration) => registration.unregister()));
19
+ }
20
+ if (!("caches" in window))
21
+ return;
22
+ const names = await caches.keys();
23
+ await Promise.all(names
24
+ .filter((name) => name.startsWith("adjacent-"))
25
+ .map((name) => caches.delete(name)));
26
+ }
27
+ async function execute(command) {
28
+ if (command.type === DEV_COMMAND.navigate) {
29
+ location.assign(command.path);
30
+ return;
31
+ }
32
+ if (command.type === DEV_COMMAND.clearCache) {
33
+ await clearAdjacentRuntime();
34
+ }
35
+ location.reload();
36
+ }
37
+ async function listen(path, signal) {
38
+ while (!signal.aborted) {
39
+ try {
40
+ const response = await fetch(path, { cache: "no-store", signal });
41
+ if (response.status === 204)
42
+ continue;
43
+ if (!response.ok) {
44
+ await delay(RETRY_DELAY_MS, signal);
45
+ continue;
46
+ }
47
+ const command = safeParseDevCommand(await response.json());
48
+ if (command)
49
+ await execute(command);
50
+ }
51
+ catch {
52
+ if (signal.aborted)
53
+ return;
54
+ await delay(RETRY_DELAY_MS, signal);
55
+ }
56
+ }
57
+ }
58
+ export function DevChannel({ enabled, path = DEV_CHANNEL_PATH, }) {
59
+ useEffect(() => {
60
+ if (!enabled)
61
+ return;
62
+ const controller = new AbortController();
63
+ void listen(path, controller.signal);
64
+ return () => controller.abort();
65
+ }, [enabled, path]);
66
+ return null;
67
+ }
68
+ //# sourceMappingURL=dev-channel-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-channel-client.js","sourceRoot":"","sources":["../src/dev-channel-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare const DEV_CHANNEL_PATH = "/_adjacent/dev";
2
+ export interface ResolvedDevChannel {
3
+ readonly enabled: boolean;
4
+ readonly url?: string;
5
+ }
6
+ export declare function resolveDevChannel(channelUrl?: string | undefined, nodeEnvironment?: "development" | "production" | "test"): ResolvedDevChannel;
7
+ //# sourceMappingURL=dev-channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-channel.d.ts","sourceRoot":"","sources":["../src/dev-channel.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,mBAAmB,CAAC;AAEjD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,qBAAuC,EACjD,eAAe,wCAAuB,GACrC,kBAAkB,CAKpB"}
@@ -0,0 +1,8 @@
1
+ export const DEV_CHANNEL_PATH = "/_adjacent/dev";
2
+ export function resolveDevChannel(channelUrl = process.env.ADJACENT_DEV_CHANNEL_URL, nodeEnvironment = process.env.NODE_ENV) {
3
+ if (nodeEnvironment !== "development" || !channelUrl) {
4
+ return { enabled: false };
5
+ }
6
+ return { enabled: true, url: channelUrl };
7
+ }
8
+ //# sourceMappingURL=dev-channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-channel.js","sourceRoot":"","sources":["../src/dev-channel.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;AAOjD,MAAM,UAAU,iBAAiB,CAC/B,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,EACjD,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ;IAEtC,IAAI,eAAe,KAAK,aAAa,IAAI,CAAC,UAAU,EAAE,CAAC;QACrD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,9 @@
1
+ export { createAdjacent, type AdjacentNextApp, type CreateAdjacentOptions, } from "./create-adjacent.js";
2
+ export { withAdjacentLayout, type AdjacentLayoutProps, type AdjacentLayoutRuntime, } from "./with-adjacent-layout.js";
3
+ export { createAdjacentManifest, createAdjacentServiceWorker, resolveNextConfig, type AdjacentManifest, type AdjacentServiceWorkerBridge, } from "./app-router-bridges.js";
4
+ export { DevChannel, type DevChannelProps, } from "./dev-channel-client.js";
5
+ export { DEV_CHANNEL_PATH, resolveDevChannel, type ResolvedDevChannel, } from "./dev-channel.js";
6
+ export { createServiceWorkerRoute, createServiceWorkerSource, DEFAULT_ASSET_LIMIT, resolveOfflineRuntime, type AdjacentServiceWorkerRoute, type ResolvedOfflineRuntime, } from "./service-worker.js";
7
+ export { discoverLocalDevOrigins, shouldSendDevTunnelHeaders, BUILD_ID_ENV, withAdjacent, type AdjacentNextConfigOptions, } from "./with-adjacent.js";
8
+ export { BASE_PATH_ENV, basePath, normaliseBasePath, withBasePath, } from "./base-path.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,KAAK,eAAe,EACpB,KAAK,qBAAqB,GAC3B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,kBAAkB,EAClB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,GAC3B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,sBAAsB,EACtB,2BAA2B,EAC3B,iBAAiB,EACjB,KAAK,gBAAgB,EACrB,KAAK,2BAA2B,GACjC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,UAAU,EACV,KAAK,eAAe,GACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,kBAAkB,GACxB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,0BAA0B,EAC/B,KAAK,sBAAsB,GAC5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,uBAAuB,EACvB,0BAA0B,EAC1B,YAAY,EACZ,YAAY,EACZ,KAAK,yBAAyB,GAC/B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,aAAa,EACb,QAAQ,EACR,iBAAiB,EACjB,YAAY,GACb,MAAM,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export { createAdjacent, } from "./create-adjacent.js";
2
+ export { withAdjacentLayout, } from "./with-adjacent-layout.js";
3
+ export { createAdjacentManifest, createAdjacentServiceWorker, resolveNextConfig, } from "./app-router-bridges.js";
4
+ export { DevChannel, } from "./dev-channel-client.js";
5
+ export { DEV_CHANNEL_PATH, resolveDevChannel, } from "./dev-channel.js";
6
+ export { createServiceWorkerRoute, createServiceWorkerSource, DEFAULT_ASSET_LIMIT, resolveOfflineRuntime, } from "./service-worker.js";
7
+ export { discoverLocalDevOrigins, shouldSendDevTunnelHeaders, BUILD_ID_ENV, withAdjacent, } from "./with-adjacent.js";
8
+ export { BASE_PATH_ENV, basePath, normaliseBasePath, withBasePath, } from "./base-path.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAGf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,kBAAkB,GAGnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,sBAAsB,EACtB,2BAA2B,EAC3B,iBAAiB,GAGlB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,UAAU,GAEX,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,GAElB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,GAGtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,uBAAuB,EACvB,0BAA0B,EAC1B,YAAY,EACZ,YAAY,GAEb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,aAAa,EACb,QAAQ,EACR,iBAAiB,EACjB,YAAY,GACb,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { NextFetchEvent, NextRequest } from "next/server";
2
+ export type AdjacentProxyResult = Response | undefined | void;
3
+ export type AdjacentProxyHandler = (request: NextRequest, event: NextFetchEvent) => AdjacentProxyResult | Promise<AdjacentProxyResult>;
4
+ export type AdjacentProxy = (request: NextRequest, event: NextFetchEvent) => Promise<Response>;
5
+ /** Composes proxy handlers in order. Returning no response continues the chain. */
6
+ export declare function createAdjacentProxy(...handlers: readonly AdjacentProxyHandler[]): AdjacentProxy;
7
+ //# sourceMappingURL=proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/D,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC;AAE9D,MAAM,MAAM,oBAAoB,GAAG,CACjC,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,cAAc,KAClB,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAExD,MAAM,MAAM,aAAa,GAAG,CAC1B,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,cAAc,KAClB,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEvB,mFAAmF;AACnF,wBAAgB,mBAAmB,CACjC,GAAG,QAAQ,EAAE,SAAS,oBAAoB,EAAE,GAC3C,aAAa,CAWf"}
package/dist/proxy.js ADDED
@@ -0,0 +1,13 @@
1
+ import { NextResponse } from "next/server";
2
+ /** Composes proxy handlers in order. Returning no response continues the chain. */
3
+ export function createAdjacentProxy(...handlers) {
4
+ return async function proxy(request, event) {
5
+ for (const handler of handlers) {
6
+ const response = await handler(request, event);
7
+ if (response instanceof Response)
8
+ return response;
9
+ }
10
+ return NextResponse.next();
11
+ };
12
+ }
13
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAc3C,mFAAmF;AACnF,MAAM,UAAU,mBAAmB,CACjC,GAAG,QAAyC;IAE5C,OAAO,KAAK,UAAU,KAAK,CACzB,OAAoB,EACpB,KAAqB;QAErB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC/C,IAAI,QAAQ,YAAY,QAAQ;gBAAE,OAAO,QAAQ,CAAC;QACpD,CAAC;QACD,OAAO,YAAY,CAAC,IAAI,EAAE,CAAC;IAC7B,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface ServiceWorkerRegistrationProps {
2
+ readonly enabled: boolean;
3
+ readonly scriptUrl?: string;
4
+ }
5
+ export declare function ServiceWorkerRegistration({ enabled, scriptUrl, }: ServiceWorkerRegistrationProps): null;
6
+ //# sourceMappingURL=service-worker-registration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-worker-registration.d.ts","sourceRoot":"","sources":["../src/service-worker-registration.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,yBAAyB,CAAC,EACxC,OAAO,EACP,SAAS,GACV,EAAE,8BAA8B,GAAG,IAAI,CAoCvC"}
@@ -0,0 +1,35 @@
1
+ "use client";
2
+ import { useEffect } from "react";
3
+ import { basePath, withBasePath } from "./base-path.js";
4
+ export function ServiceWorkerRegistration({ enabled, scriptUrl, }) {
5
+ useEffect(() => {
6
+ if (!("serviceWorker" in navigator))
7
+ return;
8
+ // An application served under a base path serves its worker there too, and
9
+ // asking at the origin root would find nothing.
10
+ const script = scriptUrl ?? withBasePath("/sw.js");
11
+ const scope = `${basePath()}/`;
12
+ const operation = enabled
13
+ ? navigator.serviceWorker.register(script, {
14
+ scope,
15
+ updateViaCache: "none",
16
+ }).then(() => undefined)
17
+ : navigator.serviceWorker.getRegistrations().then(async (registrations) => {
18
+ const expectedUrl = new URL(script, location.href).href;
19
+ await Promise.all(registrations
20
+ .filter(({ active }) => active?.scriptURL === expectedUrl)
21
+ .map((registration) => registration.unregister()));
22
+ if (!("caches" in window))
23
+ return;
24
+ const cacheNames = await caches.keys();
25
+ await Promise.all(cacheNames
26
+ .filter((name) => name.startsWith("adjacent-"))
27
+ .map((name) => caches.delete(name)));
28
+ });
29
+ void operation.catch((error) => {
30
+ console.error("Adjacent could not configure its service worker.", error);
31
+ });
32
+ }, [enabled, scriptUrl]);
33
+ return null;
34
+ }
35
+ //# sourceMappingURL=service-worker-registration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-worker-registration.js","sourceRoot":"","sources":["../src/service-worker-registration.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAOxD,MAAM,UAAU,yBAAyB,CAAC,EACxC,OAAO,EACP,SAAS,GACsB;IAC/B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,CAAC,eAAe,IAAI,SAAS,CAAC;YAAE,OAAO;QAE5C,2EAA2E;QAC3E,gDAAgD;QAChD,MAAM,MAAM,GAAG,SAAS,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,GAAG,QAAQ,EAAE,GAAG,CAAC;QAE/B,MAAM,SAAS,GAAG,OAAO;YACvB,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE;gBACvC,KAAK;gBACL,cAAc,EAAE,MAAM;aACvB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;YAC1B,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE;gBACtE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;gBACxD,MAAM,OAAO,CAAC,GAAG,CACf,aAAa;qBACV,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,WAAW,CAAC;qBACzD,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,CACpD,CAAC;gBACF,IAAI,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC;oBAAE,OAAO;gBAClC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBACvC,MAAM,OAAO,CAAC,GAAG,CACf,UAAU;qBACP,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;qBAC9C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CACtC,CAAC;YACJ,CAAC,CAAC,CAAC;QAEP,KAAK,SAAS,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACtC,OAAO,CAAC,KAAK,CAAC,kDAAkD,EAAE,KAAK,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;IAEzB,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { type AdjacentConfig } from "adjacent-core";
2
+ export interface ResolvedOfflineRuntime {
3
+ /** How many entries the asset cache keeps before the oldest are dropped. */
4
+ readonly assetLimit: number;
5
+ readonly enabled: boolean;
6
+ /** Paths the worker leaves alone, normalised and in a stable order. */
7
+ readonly exclude: readonly string[];
8
+ readonly fallback?: `/${string}`;
9
+ readonly navigation: "cache-first" | "network-first";
10
+ }
11
+ /**
12
+ * Enough for an application's own scripts, styles, fonts and the images of a
13
+ * few screens, and small enough that a long session cannot fill the origin's
14
+ * storage quota with them.
15
+ */
16
+ export declare const DEFAULT_ASSET_LIMIT = 64;
17
+ export interface AdjacentServiceWorkerRoute {
18
+ readonly GET: () => Response;
19
+ }
20
+ export declare function resolveOfflineRuntime(offline: AdjacentConfig["offline"]): ResolvedOfflineRuntime;
21
+ export declare function createServiceWorkerSource(config: AdjacentConfig, development?: boolean): string;
22
+ export declare function createServiceWorkerRoute(config: AdjacentConfig): AdjacentServiceWorkerRoute;
23
+ //# sourceMappingURL=service-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-worker.d.ts","sourceRoot":"","sources":["../src/service-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAIpE,MAAM,WAAW,sBAAsB;IACrC,4EAA4E;IAC5E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,uEAAuE;IACvE,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,aAAa,GAAG,eAAe,CAAC;CACtD;AAED;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,GAAG,EAAE,MAAM,QAAQ,CAAC;CAC9B;AAsBD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,GACjC,sBAAsB,CAwBxB;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,cAAc,EACtB,WAAW,UAAyC,GACnD,MAAM,CAwUR;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,cAAc,GACrB,0BAA0B,CAe5B"}