@fragno-dev/core 0.1.11 → 0.2.2

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 (155) hide show
  1. package/.turbo/turbo-build.log +87 -69
  2. package/CHANGELOG.md +79 -0
  3. package/dist/api/api.d.ts +21 -2
  4. package/dist/api/api.d.ts.map +1 -1
  5. package/dist/api/api.js +2 -1
  6. package/dist/api/api.js.map +1 -1
  7. package/dist/api/bind-services.d.ts +0 -1
  8. package/dist/api/bind-services.d.ts.map +1 -1
  9. package/dist/api/bind-services.js.map +1 -1
  10. package/dist/api/error.d.ts.map +1 -1
  11. package/dist/api/error.js.map +1 -1
  12. package/dist/api/fragment-definition-builder.d.ts +32 -40
  13. package/dist/api/fragment-definition-builder.d.ts.map +1 -1
  14. package/dist/api/fragment-definition-builder.js +15 -21
  15. package/dist/api/fragment-definition-builder.js.map +1 -1
  16. package/dist/api/fragment-instantiator.d.ts +51 -30
  17. package/dist/api/fragment-instantiator.d.ts.map +1 -1
  18. package/dist/api/fragment-instantiator.js +201 -52
  19. package/dist/api/fragment-instantiator.js.map +1 -1
  20. package/dist/api/request-context-storage.d.ts +4 -0
  21. package/dist/api/request-context-storage.d.ts.map +1 -1
  22. package/dist/api/request-context-storage.js +6 -0
  23. package/dist/api/request-context-storage.js.map +1 -1
  24. package/dist/api/request-input-context.d.ts +57 -1
  25. package/dist/api/request-input-context.d.ts.map +1 -1
  26. package/dist/api/request-input-context.js +67 -0
  27. package/dist/api/request-input-context.js.map +1 -1
  28. package/dist/api/request-middleware.d.ts +2 -2
  29. package/dist/api/request-middleware.d.ts.map +1 -1
  30. package/dist/api/request-middleware.js.map +1 -1
  31. package/dist/api/request-output-context.d.ts +1 -1
  32. package/dist/api/request-output-context.d.ts.map +1 -1
  33. package/dist/api/request-output-context.js.map +1 -1
  34. package/dist/api/route-caller.d.ts +30 -0
  35. package/dist/api/route-caller.d.ts.map +1 -0
  36. package/dist/api/route-caller.js +63 -0
  37. package/dist/api/route-caller.js.map +1 -0
  38. package/dist/api/route-handler-input-options.d.ts.map +1 -1
  39. package/dist/api/route.d.ts +8 -8
  40. package/dist/api/route.d.ts.map +1 -1
  41. package/dist/api/route.js.map +1 -1
  42. package/dist/api/shared-types.d.ts.map +1 -1
  43. package/dist/client/client-error.d.ts.map +1 -1
  44. package/dist/client/client-error.js.map +1 -1
  45. package/dist/client/client.d.ts +90 -50
  46. package/dist/client/client.d.ts.map +1 -1
  47. package/dist/client/client.js +128 -16
  48. package/dist/client/client.js.map +1 -1
  49. package/dist/client/client.svelte.d.ts +6 -5
  50. package/dist/client/client.svelte.d.ts.map +1 -1
  51. package/dist/client/client.svelte.js +10 -2
  52. package/dist/client/client.svelte.js.map +1 -1
  53. package/dist/client/internal/ndjson-streaming.js.map +1 -1
  54. package/dist/client/react.d.ts +5 -4
  55. package/dist/client/react.d.ts.map +1 -1
  56. package/dist/client/react.js +104 -12
  57. package/dist/client/react.js.map +1 -1
  58. package/dist/client/solid.d.ts +7 -5
  59. package/dist/client/solid.d.ts.map +1 -1
  60. package/dist/client/solid.js +23 -9
  61. package/dist/client/solid.js.map +1 -1
  62. package/dist/client/vanilla.d.ts +16 -4
  63. package/dist/client/vanilla.d.ts.map +1 -1
  64. package/dist/client/vanilla.js +21 -1
  65. package/dist/client/vanilla.js.map +1 -1
  66. package/dist/client/vue.d.ts +10 -4
  67. package/dist/client/vue.d.ts.map +1 -1
  68. package/dist/client/vue.js +24 -1
  69. package/dist/client/vue.js.map +1 -1
  70. package/dist/id.d.ts +2 -0
  71. package/dist/id.js +3 -0
  72. package/dist/internal/cuid.d.ts +16 -0
  73. package/dist/internal/cuid.d.ts.map +1 -0
  74. package/dist/internal/cuid.js +82 -0
  75. package/dist/internal/cuid.js.map +1 -0
  76. package/dist/internal/trace-context.d.ts +23 -0
  77. package/dist/internal/trace-context.d.ts.map +1 -0
  78. package/dist/internal/trace-context.js +14 -0
  79. package/dist/internal/trace-context.js.map +1 -0
  80. package/dist/mod-client.d.ts +7 -20
  81. package/dist/mod-client.d.ts.map +1 -1
  82. package/dist/mod-client.js +25 -13
  83. package/dist/mod-client.js.map +1 -1
  84. package/dist/mod.d.ts +8 -6
  85. package/dist/mod.js +3 -1
  86. package/dist/runtime.d.ts +15 -0
  87. package/dist/runtime.d.ts.map +1 -0
  88. package/dist/runtime.js +33 -0
  89. package/dist/runtime.js.map +1 -0
  90. package/dist/test/test.d.ts +6 -6
  91. package/dist/test/test.d.ts.map +1 -1
  92. package/dist/test/test.js.map +1 -1
  93. package/dist/util/ssr.js.map +1 -1
  94. package/package.json +42 -52
  95. package/src/api/api.test.ts +3 -1
  96. package/src/api/api.ts +28 -0
  97. package/src/api/bind-services.ts +0 -5
  98. package/src/api/error.ts +1 -0
  99. package/src/api/fragment-definition-builder.extend.test.ts +2 -1
  100. package/src/api/fragment-definition-builder.test.ts +2 -1
  101. package/src/api/fragment-definition-builder.ts +56 -112
  102. package/src/api/fragment-instantiator.test.ts +311 -166
  103. package/src/api/fragment-instantiator.ts +470 -131
  104. package/src/api/fragment-services.test.ts +1 -0
  105. package/src/api/internal/path-runtime.test.ts +8 -0
  106. package/src/api/internal/path-type.test.ts +3 -1
  107. package/src/api/internal/route.test.ts +1 -0
  108. package/src/api/request-context-storage.ts +7 -0
  109. package/src/api/request-input-context.test.ts +156 -2
  110. package/src/api/request-input-context.ts +87 -1
  111. package/src/api/request-middleware.test.ts +43 -2
  112. package/src/api/request-middleware.ts +4 -3
  113. package/src/api/request-output-context.test.ts +3 -1
  114. package/src/api/request-output-context.ts +2 -1
  115. package/src/api/route-caller.test.ts +195 -0
  116. package/src/api/route-caller.ts +167 -0
  117. package/src/api/route-handler-input-options.ts +2 -1
  118. package/src/api/route.test.ts +4 -2
  119. package/src/api/route.ts +9 -3
  120. package/src/api/shared-types.ts +2 -1
  121. package/src/client/client-builder.test.ts +4 -2
  122. package/src/client/client-error.test.ts +2 -1
  123. package/src/client/client-error.ts +1 -1
  124. package/src/client/client-types.test.ts +19 -5
  125. package/src/client/client.ssr.test.ts +6 -4
  126. package/src/client/client.svelte.test.ts +18 -9
  127. package/src/client/client.svelte.ts +38 -13
  128. package/src/client/client.test.ts +244 -10
  129. package/src/client/client.ts +473 -148
  130. package/src/client/internal/ndjson-streaming.test.ts +6 -3
  131. package/src/client/internal/ndjson-streaming.ts +1 -0
  132. package/src/client/react.test.ts +176 -6
  133. package/src/client/react.ts +226 -31
  134. package/src/client/solid.test.ts +29 -5
  135. package/src/client/solid.ts +60 -22
  136. package/src/client/vanilla.test.ts +148 -6
  137. package/src/client/vanilla.ts +63 -9
  138. package/src/client/vue.test.ts +397 -8
  139. package/src/client/vue.ts +74 -4
  140. package/src/id.ts +1 -0
  141. package/src/internal/cuid.test.ts +164 -0
  142. package/src/internal/cuid.ts +133 -0
  143. package/src/internal/trace-context.ts +35 -0
  144. package/src/mod-client.ts +55 -9
  145. package/src/mod.ts +9 -3
  146. package/src/runtime.ts +48 -0
  147. package/src/test/test.test.ts +4 -2
  148. package/src/test/test.ts +14 -7
  149. package/src/util/async.test.ts +1 -0
  150. package/src/util/content-type.test.ts +1 -0
  151. package/src/util/nanostores.test.ts +3 -1
  152. package/src/util/ssr.ts +1 -0
  153. package/tsconfig.json +1 -1
  154. package/tsdown.config.ts +2 -0
  155. package/vitest.config.ts +2 -1
package/package.json CHANGED
@@ -1,124 +1,121 @@
1
1
  {
2
2
  "name": "@fragno-dev/core",
3
- "version": "0.1.11",
3
+ "version": "0.2.2",
4
+ "homepage": "https://fragno.dev",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/rejot-dev/fragno.git",
9
+ "directory": "packages/fragno"
10
+ },
11
+ "type": "module",
12
+ "sideEffects": false,
13
+ "main": "./dist/mod.js",
14
+ "module": "./dist/mod.js",
15
+ "types": "./dist/mod.d.ts",
4
16
  "exports": {
5
17
  ".": {
6
18
  "workerd": {
7
- "development": "./src/mod.ts",
8
19
  "default": "./dist/mod.js"
9
20
  },
10
- "development": {
11
- "browser": "./src/mod-client.ts",
12
- "default": "./src/mod.ts"
13
- },
14
21
  "browser": "./dist/mod-client.js",
15
22
  "types": "./dist/mod.d.ts",
16
23
  "default": "./dist/mod.js"
17
24
  },
18
25
  "./api": {
19
- "development": "./src/api/api.ts",
20
26
  "types": "./dist/api/api.d.ts",
21
27
  "default": "./dist/api/api.js"
22
28
  },
23
29
  "./test": {
24
- "development": "./src/test/test.ts",
25
30
  "types": "./dist/test/test.d.ts",
26
31
  "default": "./dist/test/test.js"
27
32
  },
28
33
  "./route": {
29
- "development": "./src/api/route.ts",
30
34
  "types": "./dist/api/route.d.ts",
31
35
  "default": "./dist/api/route.js"
32
36
  },
33
37
  "./request": {
34
- "development": "./src/request/request.ts",
35
38
  "types": "./dist/request/request.d.ts",
36
39
  "default": "./dist/request/request.js"
37
40
  },
38
41
  "./internal/request-context-storage": {
39
- "development": "./src/api/request-context-storage.ts",
40
42
  "types": "./dist/api/request-context-storage.d.ts",
41
43
  "default": "./dist/api/request-context-storage.js"
42
44
  },
45
+ "./internal/trace-context": {
46
+ "types": "./dist/internal/trace-context.d.ts",
47
+ "default": "./dist/internal/trace-context.js"
48
+ },
43
49
  "./internal/symbols": {
44
- "development": "./src/internal/symbols.ts",
45
50
  "types": "./dist/internal/symbols.d.ts",
46
51
  "default": "./dist/internal/symbols.js"
47
52
  },
48
53
  "./client": {
49
- "development": "./src/client/client.ts",
50
54
  "types": "./dist/client/client.d.ts",
51
55
  "default": "./dist/client/client.js"
52
56
  },
57
+ "./id": {
58
+ "types": "./dist/id.d.ts",
59
+ "default": "./dist/id.js"
60
+ },
53
61
  "./react": {
54
- "development": "./src/client/react.ts",
55
62
  "types": "./dist/client/react.d.ts",
56
63
  "default": "./dist/client/react.js"
57
64
  },
58
65
  "./vanilla": {
59
- "development": "./src/client/vanilla.ts",
60
66
  "types": "./dist/client/vanilla.d.ts",
61
67
  "default": "./dist/client/vanilla.js"
62
68
  },
63
69
  "./vue": {
64
- "development": "./src/client/vue.ts",
65
70
  "types": "./dist/client/vue.d.ts",
66
71
  "default": "./dist/client/vue.js"
67
72
  },
68
73
  "./svelte": {
69
- "development": "./src/client/client.svelte.ts",
70
74
  "types": "./dist/client/client.svelte.d.ts",
71
75
  "default": "./dist/client/client.svelte.js"
72
76
  },
73
77
  "./solid": {
74
- "development": "./src/client/solid.ts",
75
78
  "types": "./dist/client/solid.d.ts",
76
79
  "default": "./dist/client/solid.js"
77
80
  },
78
81
  "./react-ssr": {
79
- "development": "./src/integrations/react-ssr.ts",
80
82
  "types": "./dist/integrations/react-ssr.d.ts",
81
83
  "default": "./dist/integrations/react-ssr.js"
82
84
  },
83
85
  "./package.json": "./package.json"
84
86
  },
85
- "main": "./dist/mod.js",
86
- "module": "./dist/mod.js",
87
- "types": "./dist/mod.d.ts",
88
- "type": "module",
89
- "sideEffects": false,
90
87
  "dependencies": {
91
88
  "@nanostores/query": "^0.3.4",
92
89
  "@nanostores/solid": "^1.1.1",
93
- "@standard-schema/spec": "^1.0.0",
94
- "nanostores": "^1.0.1",
95
- "rou3": "^0.7.3"
90
+ "@standard-schema/spec": "^1.1.0",
91
+ "nanostores": "^1.2.0",
92
+ "rou3": "^0.7.12"
96
93
  },
97
94
  "devDependencies": {
98
- "@sveltejs/vite-plugin-svelte": "^6.2.0",
99
- "@testing-library/react": "^16.3.0",
100
- "@testing-library/svelte": "^5.2.8",
95
+ "@sveltejs/vite-plugin-svelte": "^7.0.0",
96
+ "@testing-library/react": "^16.3.2",
97
+ "@testing-library/svelte": "^5.3.1",
101
98
  "@testing-library/vue": "^8.1.0",
102
- "@types/node": "^22",
103
- "@types/react": "^19.0.0",
104
- "@types/react-dom": "^19.0.0",
105
- "@vitest/coverage-istanbul": "^3.2.4",
106
- "happy-dom": "^20.0.0",
107
- "react": "^19.0.0",
108
- "react-dom": "^19.0.0",
109
- "svelte": "^5.1.0",
110
- "solid-js": "^1.9.3",
111
- "vitest": "^3.2.4",
112
- "vue": "^3",
113
- "zod": "^4.0.5",
99
+ "@types/node": "^22.19.7",
100
+ "@types/react": "^19.2.8",
101
+ "@types/react-dom": "^19.2.3",
102
+ "@vitest/coverage-istanbul": "^4.1.0",
103
+ "happy-dom": "^20.3.3",
104
+ "react": "^19.0.3",
105
+ "react-dom": "^19.0.3",
106
+ "solid-js": "^1.9.10",
107
+ "svelte": "^5.47.0",
108
+ "vitest": "^4.1.4",
109
+ "vue": "^3.5.27",
110
+ "zod": "^4.3.5",
114
111
  "@fragno-private/typescript-config": "0.0.1",
115
112
  "@fragno-private/vitest-config": "0.0.0"
116
113
  },
117
114
  "peerDependencies": {
118
115
  "react": "^19.0.0",
119
- "vue": "^3",
116
+ "solid-js": "^1.0.0",
120
117
  "svelte": "^5",
121
- "solid-js": "^1.0.0"
118
+ "vue": "^3"
122
119
  },
123
120
  "peerDependenciesMeta": {
124
121
  "react": {
@@ -134,17 +131,10 @@
134
131
  "optional": true
135
132
  }
136
133
  },
137
- "repository": {
138
- "type": "git",
139
- "url": "https://github.com/rejot-dev/fragno.git",
140
- "directory": "packages/fragno"
141
- },
142
- "homepage": "https://fragno.dev",
143
- "license": "MIT",
144
134
  "scripts": {
145
135
  "build": "tsdown",
146
136
  "build:watch": "tsdown --watch",
147
- "types:check": "tsc --noEmit",
137
+ "types:check": "tsgo --noEmit",
148
138
  "test": "vitest run",
149
139
  "test:watch": "vitest --watch"
150
140
  }
@@ -1,7 +1,9 @@
1
1
  import { test, expect, expectTypeOf, describe } from "vitest";
2
- import { addRoute, type ValidPath } from "./api";
2
+
3
3
  import { z } from "zod";
4
4
 
5
+ import { addRoute, type ValidPath } from "./api";
6
+
5
7
  describe("addRoute", () => {
6
8
  test("addRoute no inputSchema", () => {
7
9
  addRoute({
package/src/api/api.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type { StandardSchemaV1 } from "@standard-schema/spec";
2
+
2
3
  import type { RequestInputContext } from "./request-input-context";
3
4
  import type { RequestOutputContext } from "./request-output-context";
4
5
 
@@ -27,6 +28,17 @@ export type ValidPath<T extends string = string> = T extends `/${infer Rest}`
27
28
 
28
29
  export interface RequestThisContext {}
29
30
 
31
+ /**
32
+ * Content types that can be accepted by a route.
33
+ *
34
+ * - `"application/json"` (default): JSON request body, validated against inputSchema
35
+ * - `"multipart/form-data"`: FormData request body (file uploads), no schema validation
36
+ */
37
+ export type RouteContentType =
38
+ | "application/json"
39
+ | "multipart/form-data"
40
+ | "application/octet-stream";
41
+
30
42
  export interface FragnoRouteConfig<
31
43
  TMethod extends HTTPMethod,
32
44
  TPath extends string,
@@ -38,6 +50,17 @@ export interface FragnoRouteConfig<
38
50
  > {
39
51
  method: TMethod;
40
52
  path: TPath;
53
+ /**
54
+ * The expected content type for this route's request body.
55
+ *
56
+ * - `"application/json"` (default): Expects JSON body, will be validated against inputSchema
57
+ * - `"multipart/form-data"`: Expects FormData body (for file uploads), use `ctx.formData()` in handler
58
+ *
59
+ * The server will reject requests with mismatched Content-Type headers.
60
+ *
61
+ * @default "application/json"
62
+ */
63
+ contentType?: RouteContentType;
41
64
  inputSchema?: TInputSchema;
42
65
  outputSchema?: TOutputSchema;
43
66
  errorCodes?: readonly TErrorCode[];
@@ -140,5 +163,10 @@ export function addRoute<
140
163
  }
141
164
 
142
165
  export { FragnoApiError, FragnoApiValidationError } from "./error";
166
+ export {
167
+ createRouteCaller,
168
+ type RouteCallerConfig,
169
+ type RouteCallerForFragment,
170
+ } from "./route-caller";
143
171
  export type { RouteHandlerInputOptions } from "./route-handler-input-options";
144
172
  export type { FragnoPublicConfig } from "./shared-types";
@@ -1,8 +1,3 @@
1
- // Type helper to remove 'this' parameter from functions
2
- type OmitThisParameter<T> = T extends (this: infer _This, ...args: infer A) => infer R
3
- ? (...args: A) => R
4
- : T;
5
-
6
1
  // Recursively remove 'this' parameter from all functions in an object
7
2
  export type BoundServices<T> = {
8
3
  [K in keyof T]: T[K] extends (...args: never[]) => unknown
package/src/api/error.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type { StandardSchemaV1 } from "@standard-schema/spec";
2
+
2
3
  import type { StatusCode } from "../http/http-status";
3
4
 
4
5
  export class FragnoApiError extends Error {
@@ -1,7 +1,8 @@
1
1
  import { describe, it, expect } from "vitest";
2
+
3
+ import type { RequestThisContext } from "./api";
2
4
  import { defineFragment, FragmentDefinitionBuilder } from "./fragment-definition-builder";
3
5
  import type { FragnoPublicConfig } from "./shared-types";
4
- import type { RequestThisContext } from "./api";
5
6
 
6
7
  describe("FragmentDefinitionBuilder.extend()", () => {
7
8
  describe("basic functionality", () => {
@@ -1,7 +1,8 @@
1
1
  import { describe, it, expect, expectTypeOf, vi } from "vitest";
2
+
3
+ import type { RequestThisContext } from "./api";
2
4
  import { defineFragment, type FragmentDefinition } from "./fragment-definition-builder";
3
5
  import type { FragnoPublicConfig } from "./shared-types";
4
- import type { RequestThisContext } from "./api";
5
6
 
6
7
  describe("FragmentDefinitionBuilder", () => {
7
8
  describe("defineFragment", () => {