@soda-gql/core 0.1.0 → 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.
Files changed (68) hide show
  1. package/README.md +70 -135
  2. package/dist/adapter.cjs +35 -0
  3. package/dist/adapter.cjs.map +1 -0
  4. package/dist/adapter.d.cts +35 -0
  5. package/dist/adapter.d.cts.map +1 -0
  6. package/dist/adapter.d.ts +35 -0
  7. package/dist/adapter.d.ts.map +1 -0
  8. package/dist/adapter.js +34 -0
  9. package/dist/adapter.js.map +1 -0
  10. package/dist/index-B-erotAZ.d.cts +657 -0
  11. package/dist/index-B-erotAZ.d.cts.map +1 -0
  12. package/dist/index-Djr9A4KL.d.ts +657 -0
  13. package/dist/index-Djr9A4KL.d.ts.map +1 -0
  14. package/dist/index.cjs +430 -416
  15. package/dist/index.cjs.map +1 -0
  16. package/dist/index.d.cts +88 -3
  17. package/dist/index.d.cts.map +1 -0
  18. package/dist/index.d.ts +88 -3
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +399 -386
  21. package/dist/index.js.map +1 -1
  22. package/dist/runtime.cjs +85 -0
  23. package/dist/runtime.cjs.map +1 -0
  24. package/dist/runtime.d.cts +40 -0
  25. package/dist/runtime.d.cts.map +1 -0
  26. package/dist/runtime.d.ts +40 -0
  27. package/dist/runtime.d.ts.map +1 -0
  28. package/dist/runtime.js +82 -0
  29. package/dist/runtime.js.map +1 -0
  30. package/dist/schema-Bip7o0g3.cjs +128 -0
  31. package/dist/schema-Bip7o0g3.cjs.map +1 -0
  32. package/dist/{index-zGZ61WLt.d.cts → schema-BygZwEX8.d.ts} +246 -117
  33. package/dist/schema-BygZwEX8.d.ts.map +1 -0
  34. package/dist/schema-D9wIW5Dl.js +86 -0
  35. package/dist/schema-D9wIW5Dl.js.map +1 -0
  36. package/dist/{index-Db9ogofS.d.ts → schema-DRkKucYe.d.cts} +246 -117
  37. package/dist/schema-DRkKucYe.d.cts.map +1 -0
  38. package/dist/schema-builder-8zadflz-.d.cts +40 -0
  39. package/dist/schema-builder-8zadflz-.d.cts.map +1 -0
  40. package/dist/schema-builder-vwQtCGYI.d.ts +40 -0
  41. package/dist/schema-builder-vwQtCGYI.d.ts.map +1 -0
  42. package/package.json +34 -14
  43. package/dist/index-DYwkqPzd.d.ts +0 -1015
  44. package/dist/index-DYwkqPzd.d.ts.map +0 -1
  45. package/dist/index-Db9ogofS.d.ts.map +0 -1
  46. package/dist/index-Dth0NSJt.d.cts +0 -1015
  47. package/dist/index-Dth0NSJt.d.cts.map +0 -1
  48. package/dist/index-zGZ61WLt.d.cts.map +0 -1
  49. package/dist/merge-CeMx09is.js +0 -74
  50. package/dist/merge-CeMx09is.js.map +0 -1
  51. package/dist/merge-ZxKV1syS.cjs +0 -85
  52. package/dist/metadata/index.cjs +0 -62
  53. package/dist/metadata/index.d.cts +0 -71
  54. package/dist/metadata/index.d.cts.map +0 -1
  55. package/dist/metadata/index.d.ts +0 -71
  56. package/dist/metadata/index.d.ts.map +0 -1
  57. package/dist/metadata/index.js +0 -59
  58. package/dist/metadata/index.js.map +0 -1
  59. package/dist/runtime/index.cjs +0 -107
  60. package/dist/runtime/index.d.cts +0 -72
  61. package/dist/runtime/index.d.cts.map +0 -1
  62. package/dist/runtime/index.d.ts +0 -72
  63. package/dist/runtime/index.d.ts.map +0 -1
  64. package/dist/runtime/index.js +0 -104
  65. package/dist/runtime/index.js.map +0 -1
  66. package/dist/slice-BuSNc8vw.js +0 -278
  67. package/dist/slice-BuSNc8vw.js.map +0 -1
  68. package/dist/slice-C-FIQK-f.cjs +0 -373
package/README.md CHANGED
@@ -13,21 +13,15 @@ bun add @soda-gql/core
13
13
 
14
14
  ## Core Concepts
15
15
 
16
- soda-gql uses three main building blocks for constructing GraphQL operations:
16
+ soda-gql uses two main building blocks for constructing GraphQL operations:
17
17
 
18
- ### Models
18
+ ### Fragments
19
19
 
20
- Reusable type-safe fragments with data normalization. Models define how to select fields from a GraphQL type and optionally transform the result.
21
-
22
- ### Slices
23
-
24
- Domain-specific query/mutation/subscription pieces. Slices are reusable operation fragments that can be composed into complete operations.
20
+ Reusable type-safe field selections. Fragments define how to select fields from a GraphQL type and can be embedded in operations.
25
21
 
26
22
  ### Operations
27
23
 
28
- Complete GraphQL operations that can be executed. There are two types:
29
- - **Composed Operations**: Built by combining multiple slices
30
- - **Inline Operations**: Self-contained operations with field selections defined directly
24
+ Complete GraphQL operations (query/mutation/subscription) with field selections. Operations define variables, select fields, and can embed fragments for reusable field selections.
31
25
 
32
26
  ## Usage
33
27
 
@@ -37,83 +31,49 @@ All soda-gql definitions use the `gql.default()` pattern, which is provided by t
37
31
  import { gql } from "@/graphql-system";
38
32
  ```
39
33
 
40
- ### Writing Models
34
+ ### Writing Fragments
41
35
 
42
- Models define reusable fragments for a specific GraphQL type:
36
+ Fragments define reusable field selections for a specific GraphQL type:
43
37
 
44
38
  ```typescript
45
- export const userModel = gql.default(({ model }, { $var }) =>
46
- model.User(
39
+ export const userFragment = gql.default(({ fragment }, { $var }) =>
40
+ fragment.User(
47
41
  { variables: [$var("includeEmail").scalar("Boolean:?")] },
48
42
  ({ f, $ }) => [
49
43
  f.id(),
50
44
  f.name(),
51
45
  f.email({ if: $.includeEmail }),
52
46
  ],
53
- (selection) => ({
54
- id: selection.id,
55
- name: selection.name,
56
- email: selection.email,
57
- }),
58
47
  ),
59
48
  );
60
49
  ```
61
50
 
62
- ### Writing Slices
51
+ ### Writing Operations
63
52
 
64
- Slices define reusable operation fragments:
65
-
66
- ```typescript
67
- export const userSlice = gql.default(({ query }, { $var }) =>
68
- query.slice(
69
- { variables: [$var("userId").scalar("ID:!")] },
70
- ({ f, $ }) => [
71
- f.user({ id: $.userId })(() => [
72
- userModel.fragment({}),
73
- ]),
74
- ],
75
- ({ select }) =>
76
- select(["$.user"], (result) =>
77
- result.safeUnwrap(([user]) => userModel.normalize(user)),
78
- ),
79
- ),
80
- );
81
- ```
82
-
83
- ### Writing Operations (Composed)
84
-
85
- Composed operations combine multiple slices:
53
+ Operations define complete GraphQL queries, mutations, or subscriptions:
86
54
 
87
55
  ```typescript
88
56
  export const getUserQuery = gql.default(({ query }, { $var }) =>
89
- query.composed(
57
+ query.operation(
90
58
  {
91
- operationName: "GetUser",
59
+ name: "GetUser",
92
60
  variables: [$var("id").scalar("ID:!")],
93
61
  },
94
- ({ $ }) => ({
95
- user: userSlice.embed({ userId: $.id }),
96
- }),
62
+ ({ f, $ }) => [
63
+ f.user({ id: $.id })(({ f }) => [f.id(), f.name()]),
64
+ ],
97
65
  ),
98
66
  );
99
- ```
100
-
101
- ### Writing Operations (Inline)
102
-
103
- Inline operations define field selections directly:
104
67
 
105
- ```typescript
106
- export const getUserInline = gql.default(({ query }, { $var }) =>
107
- query.inline(
68
+ // Operation with embedded fragment
69
+ export const getUserWithFragment = gql.default(({ query }, { $var }) =>
70
+ query.operation(
108
71
  {
109
- operationName: "GetUserInline",
110
- variables: [$var("id").scalar("ID:!")],
72
+ name: "GetUserWithFragment",
73
+ variables: [$var("id").scalar("ID:!"), $var("includeEmail").scalar("Boolean:?")],
111
74
  },
112
75
  ({ f, $ }) => [
113
- f.user({ id: $.id })(({ f }) => [
114
- f.id(),
115
- f.name(),
116
- ]),
76
+ f.user({ id: $.id })(({ f }) => [userFragment.embed({ includeEmail: $.includeEmail })]),
117
77
  ],
118
78
  ),
119
79
  );
@@ -140,7 +100,7 @@ Variables are declared using a string-based type syntax:
140
100
  | `f.posts()(({ f }) => [...])` | Nested selection (curried) |
141
101
  | `f.id(null, { alias: "uuid" })` | Field with alias |
142
102
  | `f.email({ if: $.includeEmail })` | Conditional field |
143
- | `userModel.fragment({})` | Use model fragment |
103
+ | `userFragment.embed({})` | Use fragment fields |
144
104
 
145
105
  ## Defining Custom Scalars
146
106
 
@@ -180,111 +140,86 @@ export const scalar = {
180
140
  Extract TypeScript types from soda-gql elements using `$infer`:
181
141
 
182
142
  ```typescript
183
- // Model types
184
- type UserInput = typeof userModel.$infer.input;
185
- type UserOutputRaw = typeof userModel.$infer.output.raw;
186
- type UserOutputNormalized = typeof userModel.$infer.output.normalized;
143
+ // Fragment types
144
+ type UserInput = typeof userFragment.$infer.input;
145
+ type UserOutput = typeof userFragment.$infer.output;
187
146
 
188
147
  // Operation types
189
148
  type QueryVariables = typeof getUserQuery.$infer.input;
190
149
  type QueryResult = typeof getUserQuery.$infer.output.projected;
191
150
  ```
192
151
 
152
+ ## Element Extensions
153
+
154
+ The `attach()` method allows extending gql elements with custom properties. This is useful for colocating related functionality with fragment or operation definitions.
155
+
156
+ ### Basic Usage
157
+
158
+ ```typescript
159
+ import type { GqlElementAttachment } from "@soda-gql/core";
160
+
161
+ // Define an attachment
162
+ const myAttachment: GqlElementAttachment<typeof userFragment, "custom", { value: number }> = {
163
+ name: "custom",
164
+ createValue: (element) => ({ value: 42 }),
165
+ };
166
+
167
+ // Attach to a fragment
168
+ export const userFragment = gql
169
+ .default(({ fragment }) => fragment.User({}, ({ f }) => [f.id(), f.name()]))
170
+ .attach(myAttachment);
171
+
172
+ // Access the attached property
173
+ userFragment.custom.value; // 42
174
+ ```
175
+
176
+ ### Type Safety
177
+
178
+ Attachments are fully typed. The returned element includes the new property in its type:
179
+
180
+ ```typescript
181
+ const fragment = gql.default(...).attach({ name: "foo", createValue: () => ({ bar: 1 }) });
182
+ // Type: Fragment<...> & { foo: { bar: number } }
183
+ ```
184
+
193
185
  ## Metadata
194
186
 
195
- Metadata allows you to attach runtime information to operations and slices. This is useful for HTTP headers, GraphQL extensions, and application-specific values.
187
+ Metadata allows you to attach runtime information to operations. This is useful for HTTP headers and application-specific values.
196
188
 
197
189
  ### Metadata Structure
198
190
 
199
- All metadata types share three base properties:
191
+ All metadata types share two base properties:
200
192
 
201
193
  | Property | Type | Purpose |
202
194
  |----------|------|---------|
203
195
  | `headers` | `Record<string, string>` | HTTP headers to include with the GraphQL request |
204
- | `extensions` | `Record<string, unknown>` | GraphQL extensions in the request payload |
205
196
  | `custom` | `Record<string, unknown>` | Application-specific values (auth requirements, cache settings, etc.) |
206
197
 
207
198
  ### Defining Metadata
208
199
 
209
- Metadata can be defined on both slices and operations:
200
+ Metadata is defined on operations:
210
201
 
211
202
  ```typescript
212
- // Slice with metadata
213
- export const userSlice = gql.default(({ query }, { $var }) =>
214
- query.slice(
215
- {
216
- variables: [$var("userId").scalar("ID:!")],
217
- metadata: ({ $ }) => ({
218
- headers: { "X-Request-ID": "user-query" },
219
- custom: { requiresAuth: true, cacheTtl: 300 },
220
- }),
221
- },
222
- ({ f, $ }) => [f.user({ id: $.userId })(({ f }) => [f.id()])],
223
- ({ select }) => select(["$.user"], (user) => user),
224
- ),
225
- );
226
-
227
- // Operation with metadata (can reference variables and document)
203
+ // Operation with metadata
228
204
  export const getUserQuery = gql.default(({ query }, { $var }) =>
229
- query.composed(
205
+ query.operation(
230
206
  {
231
- operationName: "GetUser",
207
+ name: "GetUser",
232
208
  variables: [$var("id").scalar("ID:!")],
233
209
  metadata: ({ $, document }) => ({
234
- extensions: {
210
+ headers: { "X-Request-ID": "user-query" },
211
+ custom: {
212
+ requiresAuth: true,
213
+ cacheTtl: 300,
235
214
  trackedVariables: [$var.getInner($.id)],
236
215
  },
237
216
  }),
238
217
  },
239
- ({ $ }) => ({
240
- user: userSlice.embed({ userId: $.id }),
241
- }),
218
+ ({ f, $ }) => [f.user({ id: $.id })(({ f }) => [f.id(), f.name()])],
242
219
  ),
243
220
  );
244
221
  ```
245
222
 
246
- ### MetadataAdapter
247
-
248
- Use `createMetadataAdapter` to customize metadata behavior at the schema level:
249
-
250
- ```typescript
251
- import { createMetadataAdapter } from "@soda-gql/core/metadata";
252
- import { createHash } from "crypto";
253
-
254
- export const metadataAdapter = createMetadataAdapter({
255
- // Default metadata applied to all operations
256
- defaults: {
257
- headers: { "X-GraphQL-Client": "soda-gql" },
258
- },
259
-
260
- // Transform metadata at build time (e.g., add persisted query hash)
261
- transform: ({ document, metadata }) => ({
262
- ...metadata,
263
- extensions: {
264
- ...metadata.extensions,
265
- persistedQuery: {
266
- version: 1,
267
- sha256Hash: createHash("sha256").update(document).digest("hex"),
268
- },
269
- },
270
- }),
271
-
272
- // Custom merge strategy for slice metadata (optional)
273
- mergeSliceMetadata: (operationMetadata, sliceMetadataList) => {
274
- // Default: shallow merge where operation takes precedence
275
- return { ...sliceMetadataList.reduce((acc, s) => ({ ...acc, ...s }), {}), ...operationMetadata };
276
- },
277
- });
278
- ```
279
-
280
- ### Metadata Merging
281
-
282
- When an operation includes multiple slices, metadata is merged in this order:
283
-
284
- 1. **Slice metadata** - Merged together (later slices override earlier ones)
285
- 2. **Operation metadata** - Takes precedence over slice metadata
286
- 3. **Schema defaults** - Applied first, overridden by operation/slice values
287
-
288
223
  ## Runtime Exports
289
224
 
290
225
  The `/runtime` subpath provides utilities for operation registration and retrieval:
@@ -293,7 +228,7 @@ The `/runtime` subpath provides utilities for operation registration and retriev
293
228
  import { gqlRuntime } from "@soda-gql/core/runtime";
294
229
 
295
230
  // Retrieve registered operations (typically handled by build plugins)
296
- const operation = gqlRuntime.getComposedOperation("canonicalId");
231
+ const operation = gqlRuntime.getOperation("canonicalId");
297
232
  ```
298
233
 
299
234
  ## TypeScript Support
@@ -0,0 +1,35 @@
1
+ const require_schema = require('./schema-Bip7o0g3.cjs');
2
+
3
+ //#region packages/core/src/adapter/define-adapter.ts
4
+ /**
5
+ * Helper function for defining a unified adapter with helpers and metadata.
6
+ * Provides type inference for helpers, aggregateFragmentMetadata and schemaLevel.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import { defineAdapter } from "@soda-gql/core/adapter";
11
+ * import type { FragmentMetaInfo, OperationMetadata } from "@soda-gql/core";
12
+ *
13
+ * export const adapter = defineAdapter({
14
+ * helpers: {
15
+ * auth: {
16
+ * requiresLogin: () => ({ requiresAuth: true }),
17
+ * adminOnly: () => ({ requiresAuth: true, role: "admin" }),
18
+ * },
19
+ * },
20
+ * metadata: {
21
+ * aggregateFragmentMetadata: (fragments: readonly FragmentMetaInfo<OperationMetadata>[]) =>
22
+ * fragments.map((m) => m.metadata),
23
+ * schemaLevel: {
24
+ * apiVersion: "v2",
25
+ * },
26
+ * },
27
+ * });
28
+ * ```
29
+ */
30
+ const defineAdapter = (adapter) => adapter;
31
+
32
+ //#endregion
33
+ exports.defineAdapter = defineAdapter;
34
+ exports.defineScalar = require_schema.defineScalar;
35
+ //# sourceMappingURL=adapter.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.cjs","names":[],"sources":["../src/adapter/define-adapter.ts"],"sourcesContent":["import type { Adapter } from \"../types/metadata\";\n\n/**\n * Helper function for defining a unified adapter with helpers and metadata.\n * Provides type inference for helpers, aggregateFragmentMetadata and schemaLevel.\n *\n * @example\n * ```typescript\n * import { defineAdapter } from \"@soda-gql/core/adapter\";\n * import type { FragmentMetaInfo, OperationMetadata } from \"@soda-gql/core\";\n *\n * export const adapter = defineAdapter({\n * helpers: {\n * auth: {\n * requiresLogin: () => ({ requiresAuth: true }),\n * adminOnly: () => ({ requiresAuth: true, role: \"admin\" }),\n * },\n * },\n * metadata: {\n * aggregateFragmentMetadata: (fragments: readonly FragmentMetaInfo<OperationMetadata>[]) =>\n * fragments.map((m) => m.metadata),\n * schemaLevel: {\n * apiVersion: \"v2\",\n * },\n * },\n * });\n * ```\n */\nexport const defineAdapter = <\n THelpers extends object = object,\n TFragmentMetadata = unknown,\n TAggregatedFragmentMetadata = unknown,\n TSchemaLevel = unknown,\n>(\n adapter: Adapter<THelpers, TFragmentMetadata, TAggregatedFragmentMetadata, TSchemaLevel>,\n): Adapter<THelpers, TFragmentMetadata, TAggregatedFragmentMetadata, TSchemaLevel> => adapter;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,MAAa,iBAMX,YACoF"}
@@ -0,0 +1,35 @@
1
+ import { I as Adapter } from "./schema-DRkKucYe.cjs";
2
+ import { r as defineScalar } from "./schema-builder-8zadflz-.cjs";
3
+
4
+ //#region packages/core/src/adapter/define-adapter.d.ts
5
+
6
+ /**
7
+ * Helper function for defining a unified adapter with helpers and metadata.
8
+ * Provides type inference for helpers, aggregateFragmentMetadata and schemaLevel.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * import { defineAdapter } from "@soda-gql/core/adapter";
13
+ * import type { FragmentMetaInfo, OperationMetadata } from "@soda-gql/core";
14
+ *
15
+ * export const adapter = defineAdapter({
16
+ * helpers: {
17
+ * auth: {
18
+ * requiresLogin: () => ({ requiresAuth: true }),
19
+ * adminOnly: () => ({ requiresAuth: true, role: "admin" }),
20
+ * },
21
+ * },
22
+ * metadata: {
23
+ * aggregateFragmentMetadata: (fragments: readonly FragmentMetaInfo<OperationMetadata>[]) =>
24
+ * fragments.map((m) => m.metadata),
25
+ * schemaLevel: {
26
+ * apiVersion: "v2",
27
+ * },
28
+ * },
29
+ * });
30
+ * ```
31
+ */
32
+ declare const defineAdapter: <THelpers extends object = object, TFragmentMetadata = unknown, TAggregatedFragmentMetadata = unknown, TSchemaLevel = unknown>(adapter: Adapter<THelpers, TFragmentMetadata, TAggregatedFragmentMetadata, TSchemaLevel>) => Adapter<THelpers, TFragmentMetadata, TAggregatedFragmentMetadata, TSchemaLevel>;
33
+ //#endregion
34
+ export { defineAdapter, defineScalar };
35
+ //# sourceMappingURL=adapter.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.cts","names":[],"sources":["../src/adapter/define-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;;AA4BA;;;;;;;;;;;;;;;;;;;;;;;cAAa,uJAMF,QAAQ,UAAU,mBAAmB,6BAA6B,kBAC1E,QAAQ,UAAU,mBAAmB,6BAA6B"}
@@ -0,0 +1,35 @@
1
+ import { I as Adapter } from "./schema-BygZwEX8.js";
2
+ import { r as defineScalar } from "./schema-builder-vwQtCGYI.js";
3
+
4
+ //#region packages/core/src/adapter/define-adapter.d.ts
5
+
6
+ /**
7
+ * Helper function for defining a unified adapter with helpers and metadata.
8
+ * Provides type inference for helpers, aggregateFragmentMetadata and schemaLevel.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * import { defineAdapter } from "@soda-gql/core/adapter";
13
+ * import type { FragmentMetaInfo, OperationMetadata } from "@soda-gql/core";
14
+ *
15
+ * export const adapter = defineAdapter({
16
+ * helpers: {
17
+ * auth: {
18
+ * requiresLogin: () => ({ requiresAuth: true }),
19
+ * adminOnly: () => ({ requiresAuth: true, role: "admin" }),
20
+ * },
21
+ * },
22
+ * metadata: {
23
+ * aggregateFragmentMetadata: (fragments: readonly FragmentMetaInfo<OperationMetadata>[]) =>
24
+ * fragments.map((m) => m.metadata),
25
+ * schemaLevel: {
26
+ * apiVersion: "v2",
27
+ * },
28
+ * },
29
+ * });
30
+ * ```
31
+ */
32
+ declare const defineAdapter: <THelpers extends object = object, TFragmentMetadata = unknown, TAggregatedFragmentMetadata = unknown, TSchemaLevel = unknown>(adapter: Adapter<THelpers, TFragmentMetadata, TAggregatedFragmentMetadata, TSchemaLevel>) => Adapter<THelpers, TFragmentMetadata, TAggregatedFragmentMetadata, TSchemaLevel>;
33
+ //#endregion
34
+ export { defineAdapter, defineScalar };
35
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","names":[],"sources":["../src/adapter/define-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;;AA4BA;;;;;;;;;;;;;;;;;;;;;;;cAAa,uJAMF,QAAQ,UAAU,mBAAmB,6BAA6B,kBAC1E,QAAQ,UAAU,mBAAmB,6BAA6B"}
@@ -0,0 +1,34 @@
1
+ import { r as defineScalar } from "./schema-D9wIW5Dl.js";
2
+
3
+ //#region packages/core/src/adapter/define-adapter.ts
4
+ /**
5
+ * Helper function for defining a unified adapter with helpers and metadata.
6
+ * Provides type inference for helpers, aggregateFragmentMetadata and schemaLevel.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import { defineAdapter } from "@soda-gql/core/adapter";
11
+ * import type { FragmentMetaInfo, OperationMetadata } from "@soda-gql/core";
12
+ *
13
+ * export const adapter = defineAdapter({
14
+ * helpers: {
15
+ * auth: {
16
+ * requiresLogin: () => ({ requiresAuth: true }),
17
+ * adminOnly: () => ({ requiresAuth: true, role: "admin" }),
18
+ * },
19
+ * },
20
+ * metadata: {
21
+ * aggregateFragmentMetadata: (fragments: readonly FragmentMetaInfo<OperationMetadata>[]) =>
22
+ * fragments.map((m) => m.metadata),
23
+ * schemaLevel: {
24
+ * apiVersion: "v2",
25
+ * },
26
+ * },
27
+ * });
28
+ * ```
29
+ */
30
+ const defineAdapter = (adapter) => adapter;
31
+
32
+ //#endregion
33
+ export { defineAdapter, defineScalar };
34
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","names":[],"sources":["../src/adapter/define-adapter.ts"],"sourcesContent":["import type { Adapter } from \"../types/metadata\";\n\n/**\n * Helper function for defining a unified adapter with helpers and metadata.\n * Provides type inference for helpers, aggregateFragmentMetadata and schemaLevel.\n *\n * @example\n * ```typescript\n * import { defineAdapter } from \"@soda-gql/core/adapter\";\n * import type { FragmentMetaInfo, OperationMetadata } from \"@soda-gql/core\";\n *\n * export const adapter = defineAdapter({\n * helpers: {\n * auth: {\n * requiresLogin: () => ({ requiresAuth: true }),\n * adminOnly: () => ({ requiresAuth: true, role: \"admin\" }),\n * },\n * },\n * metadata: {\n * aggregateFragmentMetadata: (fragments: readonly FragmentMetaInfo<OperationMetadata>[]) =>\n * fragments.map((m) => m.metadata),\n * schemaLevel: {\n * apiVersion: \"v2\",\n * },\n * },\n * });\n * ```\n */\nexport const defineAdapter = <\n THelpers extends object = object,\n TFragmentMetadata = unknown,\n TAggregatedFragmentMetadata = unknown,\n TSchemaLevel = unknown,\n>(\n adapter: Adapter<THelpers, TFragmentMetadata, TAggregatedFragmentMetadata, TSchemaLevel>,\n): Adapter<THelpers, TFragmentMetadata, TAggregatedFragmentMetadata, TSchemaLevel> => adapter;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,MAAa,iBAMX,YACoF"}