@k2b/cloud 0.6.0-rc.0 → 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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@k2b/cloud",
3
- "version": "0.6.0-rc.0",
3
+ "version": "0.6.0",
4
4
  "description": "Modular Hono+SolidJS framework for building per-app docker services behind a dynamic gateway. Powers cloud.stuve-ulm.de.",
5
5
  "license": "AGPL-3.0-or-later",
6
6
  "repository": {
@@ -16,7 +16,9 @@
16
16
  "scripts",
17
17
  "public",
18
18
  "!src/**/*.test.ts",
19
- "!src/**/*.integration.test.ts"
19
+ "!src/**/*.test.tsx",
20
+ "!src/**/*.integration.test.ts",
21
+ "!scripts/**/*.test.ts"
20
22
  ],
21
23
  "exports": {
22
24
  ".": "./src/index.ts",
@@ -80,18 +82,18 @@
80
82
  },
81
83
  "dependencies": {
82
84
  "@firecrawl/anydoc": "0.1.9",
85
+ "@hono/standard-validator": "0.2.2",
86
+ "@simplewebauthn/server": "13.3.2",
87
+ "@tabler/icons": "3.46.0",
88
+ "@tailwindcss/typography": "0.5.20",
83
89
  "@k2b/nessi": "0.11.0",
84
90
  "@k2b/ssr": "0.12.0",
91
+ "@k2b/ui": "0.2.0",
85
92
  "@k2b/stdlib": "0.22.0",
86
93
  "@k2b/sync": "6.4.0",
87
- "@k2b/ui": "0.2.0",
88
- "@modelcontextprotocol/sdk": "1.30.0",
89
94
  "@nats-io/transport-node": "3.4.0",
90
- "@simplewebauthn/server": "13.3.2",
91
- "@tabler/icons": "3.46.0",
92
- "@tailwindcss/typography": "0.5.20",
95
+ "@modelcontextprotocol/sdk": "1.30.0",
93
96
  "bun-plugin-tailwind": "0.1.2",
94
- "hash-wasm": "4.12.0",
95
97
  "hono-openapi": "1.3.1",
96
98
  "jose": "6.2.5",
97
99
  "katex": "0.16.47",
@@ -105,15 +107,16 @@
105
107
  "seroval": "1.6.0",
106
108
  "tailwindcss": "4.3.3",
107
109
  "web-push": "3.6.7",
108
- "yaml": "2.9.0"
110
+ "yaml": "2.9.0",
111
+ "hash-wasm": "4.12.0",
112
+ "@types/nodemailer": "7.0.12",
113
+ "@types/sanitize-html": "2.16.1",
114
+ "@types/web-push": "3.6.4"
109
115
  },
110
116
  "devDependencies": {
111
117
  "@babel/core": "7.29.7",
112
118
  "@babel/preset-typescript": "7.29.7",
113
119
  "@types/bun": "1.3.14",
114
- "@types/nodemailer": "7.0.12",
115
- "@types/sanitize-html": "2.16.1",
116
- "@types/web-push": "3.6.4",
117
120
  "babel-preset-solid": "1.9.12",
118
121
  "hono": "4.12.32",
119
122
  "solid-js": "1.9.14",
@@ -1,4 +1,4 @@
1
- import { deserialize, serialize } from "seroval";
1
+ import { deserialize as deserializeProps, serialize as serializeProps } from "seroval";
2
2
  import type { Component, JSX, ParentProps } from "solid-js";
3
3
  import { children, createContext, createEffect, createMemo, createSignal, For, onCleanup, onMount, Show, useContext } from "solid-js";
4
4
  import { Dynamic, Portal } from "solid-js/web";
@@ -47,7 +47,7 @@ export const defineDesktopWindows = <Definitions extends Record<string, DesktopW
47
47
  ({
48
48
  kind: desktopWindowDescriptorKind,
49
49
  name,
50
- props: serialize(props ?? {}),
50
+ props: serializeProps(props ?? {}),
51
51
  }) satisfies DesktopWindowDescriptor as unknown as JSX.Element;
52
52
  }
53
53
 
@@ -73,7 +73,7 @@ export function DesktopWindowHost<Definitions extends Record<string, DesktopWind
73
73
  const windowProps = createMemo(() => {
74
74
  const current = descriptor();
75
75
  if (!current) return {};
76
- return deserialize<Record<string, unknown>>(current.props);
76
+ return deserializeProps<Record<string, unknown>>(current.props);
77
77
  });
78
78
 
79
79
  return createMemo(() => {
@@ -1,49 +0,0 @@
1
- import { describe, expect, test } from "bun:test";
2
- import { mkdtemp, readFile, rm } from "node:fs/promises";
3
- import { tmpdir } from "node:os";
4
- import { join } from "node:path";
5
- import { renderAppFavicon, tablerIconName, writeAppFavicon } from "./app-favicon";
6
-
7
- describe("app favicon", () => {
8
- test("extracts the documented Tabler icon class", () => {
9
- expect(tablerIconName("ti ti-mail")).toBe("mail");
10
- expect(() => tablerIconName("mail")).toThrow('such as "ti ti-mail"');
11
- expect(() => tablerIconName("ti ti-mail extra")).toThrow('such as "ti ti-mail"');
12
- });
13
-
14
- test("renders a large icon with the Cloud gradient", () => {
15
- const source = '<svg viewBox="0 0 24 24"><path d="M3 7h18" /></svg>';
16
-
17
- const svg = renderAppFavicon(source);
18
- expect(svg).toContain('<linearGradient id="cloud-icon"');
19
- expect(svg).toContain(".start { stop-color: #3b82f6; }");
20
- expect(svg).toContain(".end { stop-color: #1d4ed8; }");
21
- expect(svg).toContain("@media (prefers-color-scheme: dark)");
22
- expect(svg).toContain(".start { stop-color: #f0f6ff; }");
23
- expect(svg).toContain(".end { stop-color: #1f8bff; }");
24
- expect(svg).toContain('stroke="url(#cloud-icon)"');
25
- expect(svg).toContain('stroke-width="2"');
26
- expect(svg).not.toContain("<rect");
27
- expect(svg).not.toContain("<filter");
28
- expect(svg).toContain('<path d="M3 7h18" />');
29
- });
30
-
31
- test("writes a declared Tabler icon and rejects an unknown one", async () => {
32
- const publicDir = await mkdtemp(join(tmpdir(), "cloud-app-favicon-"));
33
- try {
34
- const target = await writeAppFavicon({ publicDir, appId: "mail", icon: "ti ti-mail" });
35
- const svg = await readFile(target, "utf8");
36
- expect(svg).toContain('stroke="url(#cloud-icon)"');
37
- expect(svg).toContain('d="M3 7l9 6l9 -6"');
38
-
39
- const tableTarget = await writeAppFavicon({ publicDir, appId: "grids", icon: "ti ti-table" });
40
- expect(await readFile(tableTarget, "utf8")).toContain('d="M3 10h18"');
41
-
42
- await expect(writeAppFavicon({ publicDir, appId: "missing", icon: "ti ti-definitely-not-real" })).rejects.toThrow(
43
- 'Unknown Tabler app icon "ti ti-definitely-not-real"',
44
- );
45
- } finally {
46
- await rm(publicDir, { recursive: true, force: true });
47
- }
48
- });
49
- });