@soda-gql/core 0.0.9 → 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 (56) hide show
  1. package/README.md +247 -0
  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 +450 -348
  15. package/dist/index.cjs.map +1 -0
  16. package/dist/index.d.cts +88 -2
  17. package/dist/index.d.cts.map +1 -0
  18. package/dist/index.d.ts +88 -2
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +420 -323
  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/schema-BygZwEX8.d.ts +494 -0
  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/schema-DRkKucYe.d.cts +494 -0
  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 -7
  43. package/dist/index-CFNJ_Aa6.d.ts +0 -1185
  44. package/dist/index-CFNJ_Aa6.d.ts.map +0 -1
  45. package/dist/index-DHh8XRal.d.cts +0 -1185
  46. package/dist/index-DHh8XRal.d.cts.map +0 -1
  47. package/dist/runtime/index.cjs +0 -105
  48. package/dist/runtime/index.d.cts +0 -71
  49. package/dist/runtime/index.d.cts.map +0 -1
  50. package/dist/runtime/index.d.ts +0 -71
  51. package/dist/runtime/index.d.ts.map +0 -1
  52. package/dist/runtime/index.js +0 -102
  53. package/dist/runtime/index.js.map +0 -1
  54. package/dist/slice-DlVY4UJG.cjs +0 -333
  55. package/dist/slice-ua5mSfhV.js +0 -256
  56. package/dist/slice-ua5mSfhV.js.map +0 -1
package/README.md ADDED
@@ -0,0 +1,247 @@
1
+ # @soda-gql/core
2
+
3
+ [![npm version](https://img.shields.io/npm/v/@soda-gql/core.svg)](https://www.npmjs.com/package/@soda-gql/core)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
+
6
+ Core GraphQL types and utilities for the soda-gql ecosystem. This package provides the foundational building blocks for writing type-safe GraphQL operations.
7
+
8
+ ## Installation
9
+
10
+ ```bash
11
+ bun add @soda-gql/core
12
+ ```
13
+
14
+ ## Core Concepts
15
+
16
+ soda-gql uses two main building blocks for constructing GraphQL operations:
17
+
18
+ ### Fragments
19
+
20
+ Reusable type-safe field selections. Fragments define how to select fields from a GraphQL type and can be embedded in operations.
21
+
22
+ ### Operations
23
+
24
+ Complete GraphQL operations (query/mutation/subscription) with field selections. Operations define variables, select fields, and can embed fragments for reusable field selections.
25
+
26
+ ## Usage
27
+
28
+ All soda-gql definitions use the `gql.default()` pattern, which is provided by the generated GraphQL system:
29
+
30
+ ```typescript
31
+ import { gql } from "@/graphql-system";
32
+ ```
33
+
34
+ ### Writing Fragments
35
+
36
+ Fragments define reusable field selections for a specific GraphQL type:
37
+
38
+ ```typescript
39
+ export const userFragment = gql.default(({ fragment }, { $var }) =>
40
+ fragment.User(
41
+ { variables: [$var("includeEmail").scalar("Boolean:?")] },
42
+ ({ f, $ }) => [
43
+ f.id(),
44
+ f.name(),
45
+ f.email({ if: $.includeEmail }),
46
+ ],
47
+ ),
48
+ );
49
+ ```
50
+
51
+ ### Writing Operations
52
+
53
+ Operations define complete GraphQL queries, mutations, or subscriptions:
54
+
55
+ ```typescript
56
+ export const getUserQuery = gql.default(({ query }, { $var }) =>
57
+ query.operation(
58
+ {
59
+ name: "GetUser",
60
+ variables: [$var("id").scalar("ID:!")],
61
+ },
62
+ ({ f, $ }) => [
63
+ f.user({ id: $.id })(({ f }) => [f.id(), f.name()]),
64
+ ],
65
+ ),
66
+ );
67
+
68
+ // Operation with embedded fragment
69
+ export const getUserWithFragment = gql.default(({ query }, { $var }) =>
70
+ query.operation(
71
+ {
72
+ name: "GetUserWithFragment",
73
+ variables: [$var("id").scalar("ID:!"), $var("includeEmail").scalar("Boolean:?")],
74
+ },
75
+ ({ f, $ }) => [
76
+ f.user({ id: $.id })(({ f }) => [userFragment.embed({ includeEmail: $.includeEmail })]),
77
+ ],
78
+ ),
79
+ );
80
+ ```
81
+
82
+ ## Variable Type Syntax
83
+
84
+ Variables are declared using a string-based type syntax:
85
+
86
+ | Syntax | Meaning | GraphQL Equivalent |
87
+ |--------|---------|-------------------|
88
+ | `"ID:!"` | Required ID | `ID!` |
89
+ | `"String:?"` | Optional String | `String` |
90
+ | `"Int:![]!"` | Required list of required Int | `[Int!]!` |
91
+ | `"String:![]?"` | Optional list of required Strings | `[String!]` |
92
+ | `"MyInput:!"` | Required custom input type | `MyInput!` |
93
+
94
+ ## Field Selection Patterns
95
+
96
+ | Pattern | Description |
97
+ |---------|-------------|
98
+ | `f.id()` | Basic field selection |
99
+ | `f.posts({ limit: 10 })` | Field with arguments |
100
+ | `f.posts()(({ f }) => [...])` | Nested selection (curried) |
101
+ | `f.id(null, { alias: "uuid" })` | Field with alias |
102
+ | `f.email({ if: $.includeEmail })` | Conditional field |
103
+ | `userFragment.embed({})` | Use fragment fields |
104
+
105
+ ## Defining Custom Scalars
106
+
107
+ Scalars define the TypeScript types for GraphQL scalar values:
108
+
109
+ ```typescript
110
+ import { defineScalar } from "@soda-gql/core";
111
+
112
+ export const scalar = {
113
+ // Built-in scalars
114
+ ...defineScalar<"ID", string, string>("ID"),
115
+ ...defineScalar<"String", string, string>("String"),
116
+ ...defineScalar<"Int", number, number>("Int"),
117
+ ...defineScalar<"Float", number, number>("Float"),
118
+ ...defineScalar<"Boolean", boolean, boolean>("Boolean"),
119
+
120
+ // Custom scalars - defineScalar<Name, InputType, OutputType>(name)
121
+ ...defineScalar<"DateTime", string, Date>("DateTime"),
122
+ ...defineScalar<"JSON", Record<string, unknown>, Record<string, unknown>>("JSON"),
123
+ } as const;
124
+ ```
125
+
126
+ Alternative callback syntax:
127
+
128
+ ```typescript
129
+ export const scalar = {
130
+ ...defineScalar("DateTime", ({ type }) => ({
131
+ input: type<string>(),
132
+ output: type<Date>(),
133
+ directives: {},
134
+ })),
135
+ } as const;
136
+ ```
137
+
138
+ ## Type Inference
139
+
140
+ Extract TypeScript types from soda-gql elements using `$infer`:
141
+
142
+ ```typescript
143
+ // Fragment types
144
+ type UserInput = typeof userFragment.$infer.input;
145
+ type UserOutput = typeof userFragment.$infer.output;
146
+
147
+ // Operation types
148
+ type QueryVariables = typeof getUserQuery.$infer.input;
149
+ type QueryResult = typeof getUserQuery.$infer.output.projected;
150
+ ```
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
+
185
+ ## Metadata
186
+
187
+ Metadata allows you to attach runtime information to operations. This is useful for HTTP headers and application-specific values.
188
+
189
+ ### Metadata Structure
190
+
191
+ All metadata types share two base properties:
192
+
193
+ | Property | Type | Purpose |
194
+ |----------|------|---------|
195
+ | `headers` | `Record<string, string>` | HTTP headers to include with the GraphQL request |
196
+ | `custom` | `Record<string, unknown>` | Application-specific values (auth requirements, cache settings, etc.) |
197
+
198
+ ### Defining Metadata
199
+
200
+ Metadata is defined on operations:
201
+
202
+ ```typescript
203
+ // Operation with metadata
204
+ export const getUserQuery = gql.default(({ query }, { $var }) =>
205
+ query.operation(
206
+ {
207
+ name: "GetUser",
208
+ variables: [$var("id").scalar("ID:!")],
209
+ metadata: ({ $, document }) => ({
210
+ headers: { "X-Request-ID": "user-query" },
211
+ custom: {
212
+ requiresAuth: true,
213
+ cacheTtl: 300,
214
+ trackedVariables: [$var.getInner($.id)],
215
+ },
216
+ }),
217
+ },
218
+ ({ f, $ }) => [f.user({ id: $.id })(({ f }) => [f.id(), f.name()])],
219
+ ),
220
+ );
221
+ ```
222
+
223
+ ## Runtime Exports
224
+
225
+ The `/runtime` subpath provides utilities for operation registration and retrieval:
226
+
227
+ ```typescript
228
+ import { gqlRuntime } from "@soda-gql/core/runtime";
229
+
230
+ // Retrieve registered operations (typically handled by build plugins)
231
+ const operation = gqlRuntime.getOperation("canonicalId");
232
+ ```
233
+
234
+ ## TypeScript Support
235
+
236
+ This package requires TypeScript 5.x or later for full type inference support.
237
+
238
+ ## Related Packages
239
+
240
+ - [@soda-gql/cli](../cli) - Command-line interface for code generation
241
+ - [@soda-gql/config](../config) - Configuration management
242
+ - [@soda-gql/runtime](../runtime) - Runtime utilities for operation execution
243
+ - [@soda-gql/tsc-plugin](../tsc-plugin) - TypeScript compiler plugin
244
+
245
+ ## License
246
+
247
+ MIT
@@ -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"}