@coffre/core 0.1.18 → 0.2.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.
@@ -0,0 +1,19 @@
1
+ //#region src/pages.d.ts
2
+ /**
3
+ * How the visitor has coffre's pages drawn: the theme they chose, `system`
4
+ * when none, and whether the sidebar is folded.
5
+ */
6
+ export type Preferences = {
7
+ theme: 'system' | 'light' | 'dark';
8
+ sidebar: 'expanded' | 'collapsed';
9
+ };
10
+ /** The cookies that hold them. */
11
+ export declare const PREFERENCE_COOKIES: {
12
+ readonly theme: "coffre-theme";
13
+ readonly sidebar: "coffre-sidebar";
14
+ };
15
+ /** The preferences in a `Cookie` header, or in `document.cookie`, which reads the same. */
16
+ export declare function preferencesIn(cookies: string | null): Preferences;
17
+ /** What a server route or a page says, rendered without coffre's request middleware. */
18
+ export declare const NO_MIDDLEWARE: string;
19
+ //#endregion
package/dist/pages.js ADDED
@@ -0,0 +1,24 @@
1
+ //#region src/pages.ts
2
+ /** The cookies that hold them. */
3
+ const PREFERENCE_COOKIES = {
4
+ theme: "coffre-theme",
5
+ sidebar: "coffre-sidebar"
6
+ };
7
+ /** The preferences in a `Cookie` header, or in `document.cookie`, which reads the same. */
8
+ function preferencesIn(cookies) {
9
+ const value = (name) => {
10
+ for (const pair of (cookies ?? "").split(";")) {
11
+ const at = pair.indexOf("=");
12
+ if (at !== -1 && pair.slice(0, at).trim() === name) return pair.slice(at + 1).trim();
13
+ }
14
+ };
15
+ const theme = value(PREFERENCE_COOKIES.theme);
16
+ return {
17
+ theme: theme === "light" || theme === "dark" ? theme : "system",
18
+ sidebar: value(PREFERENCE_COOKIES.sidebar) === "collapsed" ? "collapsed" : "expanded"
19
+ };
20
+ }
21
+ /** What a server route or a page says, rendered without coffre's request middleware. */
22
+ const NO_MIDDLEWARE = "coffre's request middleware is not installed: add coffreMiddleware, from @coffre/server/start, to createStart(() => ({ requestMiddleware: [coffreMiddleware] })) in the app's src/start.ts";
23
+ //#endregion
24
+ export { NO_MIDDLEWARE, PREFERENCE_COOKIES, preferencesIn };
package/dist/schemas.d.ts CHANGED
@@ -9,8 +9,8 @@ export declare const principalType: z.ZodEnum<{
9
9
  }>;
10
10
  export declare const principalId: z.ZodString;
11
11
  export declare const instanceRole: z.ZodEnum<{
12
- user: "user";
13
12
  owner: "owner";
13
+ user: "user";
14
14
  }>;
15
15
  export declare const grantId: z.ZodString;
16
16
  export declare const emailAddress: z.ZodString;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coffre/core",
3
- "version": "0.1.18",
3
+ "version": "0.2.0",
4
4
  "description": "What coffre's packages share: roles, envelopes, identity, the audit chain and the vault's contract.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -62,6 +62,11 @@
62
62
  "types": "./dist/workloads.d.ts",
63
63
  "default": "./dist/workloads.js"
64
64
  },
65
+ "./pages": {
66
+ "coffre:source": "./src/pages.ts",
67
+ "types": "./dist/pages.d.ts",
68
+ "default": "./dist/pages.js"
69
+ },
65
70
  "./package.json": "./package.json"
66
71
  },
67
72
  "dependencies": {
@@ -74,7 +79,7 @@
74
79
  "@types/node": "26.1.1",
75
80
  "tsdown": "0.23.0",
76
81
  "typescript": "5.9.3",
77
- "@coffre/conformance": "0.1.18"
82
+ "@coffre/conformance": "0.2.0"
78
83
  },
79
84
  "scripts": {
80
85
  "build": "tsdown",
package/src/pages.ts ADDED
@@ -0,0 +1,34 @@
1
+ // What coffre's server and its pages agree on outside the API: the
2
+ // visitor's preferences, which the server reads from a request's cookies
3
+ // and the browser from its own, to draw the same page; and what either says
4
+ // when coffre's request middleware is missing.
5
+
6
+ /**
7
+ * How the visitor has coffre's pages drawn: the theme they chose, `system`
8
+ * when none, and whether the sidebar is folded.
9
+ */
10
+ export type Preferences = { theme: 'system' | 'light' | 'dark'; sidebar: 'expanded' | 'collapsed' };
11
+
12
+ /** The cookies that hold them. */
13
+ export const PREFERENCE_COOKIES = { theme: 'coffre-theme', sidebar: 'coffre-sidebar' } as const;
14
+
15
+ /** The preferences in a `Cookie` header, or in `document.cookie`, which reads the same. */
16
+ export function preferencesIn(cookies: string | null): Preferences {
17
+ const value = (name: string) => {
18
+ for (const pair of (cookies ?? '').split(';')) {
19
+ const at = pair.indexOf('=');
20
+ if (at !== -1 && pair.slice(0, at).trim() === name) return pair.slice(at + 1).trim();
21
+ }
22
+ return undefined;
23
+ };
24
+ const theme = value(PREFERENCE_COOKIES.theme);
25
+ return {
26
+ theme: theme === 'light' || theme === 'dark' ? theme : 'system',
27
+ sidebar: value(PREFERENCE_COOKIES.sidebar) === 'collapsed' ? 'collapsed' : 'expanded',
28
+ };
29
+ }
30
+
31
+ /** What a server route or a page says, rendered without coffre's request middleware. */
32
+ export const NO_MIDDLEWARE =
33
+ "coffre's request middleware is not installed: add coffreMiddleware, from @coffre/server/start, to " +
34
+ "createStart(() => ({ requestMiddleware: [coffreMiddleware] })) in the app's src/start.ts";