@m1212e/rumble 0.16.38 → 0.16.40
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/README.md +2 -0
- package/out/client/generate.cjs +1 -1
- package/out/client/generate.mjs +1 -1
- package/out/client.cjs +46 -23
- package/out/client.cjs.map +1 -1
- package/out/client.d.cts.map +1 -1
- package/out/client.d.mts.map +1 -1
- package/out/client.mjs +47 -24
- package/out/client.mjs.map +1 -1
- package/out/{generate-kjqygrmB.cjs → generate-CqpjHD9X.cjs} +9 -3
- package/out/generate-CqpjHD9X.cjs.map +1 -0
- package/out/{generate-CwAZQRah.mjs → generate-D2VqOgQa.mjs} +9 -3
- package/out/generate-D2VqOgQa.mjs.map +1 -0
- package/out/index.cjs +2 -2
- package/out/index.mjs +2 -2
- package/package.json +1 -1
- package/out/generate-CwAZQRah.mjs.map +0 -1
- package/out/generate-kjqygrmB.cjs.map +0 -1
package/README.md
CHANGED
|
@@ -346,6 +346,8 @@ users.subscribe((s) => s?.at(0));
|
|
|
346
346
|
// you can directly access the values of an awaited result
|
|
347
347
|
console.log(users.firstName)
|
|
348
348
|
```
|
|
349
|
+
|
|
350
|
+
> **Error handling**: when the server returns a GraphQL error or a network error occurs, the returned promise rejects with the error. Use `await` (inside try/catch) or `.catch()` to handle it. If you use the fire-and-subscribe pattern (`const r = client.liveQuery.users(…); r.subscribe(…)`) without awaiting, a server error will produce an **unhandled promise rejection** — attach `.catch(() => {})` if you intentionally do not care about the promise result.
|
|
349
351
|
> As of `v0.16.12` the client has special support for the svelte reactive state system (runes). If you run a live query which deploys a subscription inside a svelte effect context, you will get reactivity without subscribing to anything right out of the box. Please see [here](https://github.com/DeutscheModelUnitedNations/munify-chase/blob/f70c4484a92551b564c70603ebfd48d5b8cac637/src/lib/api/customClient.ts#L12) and [here](https://github.com/DeutscheModelUnitedNations/munify-chase/blob/f70c4484a92551b564c70603ebfd48d5b8cac637/src/routes/app/(launcher)/%2Bpage.svelte#L9C9-L9C23) for real world examples.
|
|
350
352
|
### Alternative decoupled client generation
|
|
351
353
|
As an alternative to use the client generator with a fully instanciated rumble instance, you can also import the `generateFromSchema` function from rumble and pass it a standard `GraphQLSchema` object to generate the client:
|
package/out/client/generate.cjs
CHANGED
package/out/client/generate.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as generateFromSchema } from "../generate-
|
|
1
|
+
import { t as generateFromSchema } from "../generate-D2VqOgQa.mjs";
|
|
2
2
|
export { generateFromSchema };
|
package/out/client.cjs
CHANGED
|
@@ -37,7 +37,7 @@ function makeGraphQLQueryRequest({ queryName, schema, input, client, enableSubsc
|
|
|
37
37
|
});
|
|
38
38
|
return () => unsub.unsubscribe();
|
|
39
39
|
});
|
|
40
|
-
const
|
|
40
|
+
const sharedSource = (0, wonka.pipe)((0, wonka.merge)([client.query(makeOperationString({
|
|
41
41
|
operationVerb: "query",
|
|
42
42
|
queryName,
|
|
43
43
|
input,
|
|
@@ -49,39 +49,63 @@ function makeGraphQLQueryRequest({ queryName, schema, input, client, enableSubsc
|
|
|
49
49
|
input,
|
|
50
50
|
schema,
|
|
51
51
|
autoIncludeIdField
|
|
52
|
-
}), {}) : wonka.empty]), wonka.share
|
|
52
|
+
}), {}) : wonka.empty]), wonka.share);
|
|
53
|
+
const observable = (0, wonka.toObservable)((0, wonka.pipe)(sharedSource, (0, wonka.map)((v) => {
|
|
54
|
+
if (v.error) throw v.error;
|
|
53
55
|
const data = v.data?.[queryName];
|
|
54
|
-
if (!data && (v.error || v.errors)) throw v.error ?? v.errors.at(0);
|
|
55
56
|
currentData = data;
|
|
56
57
|
if (typeof data === "object" && data !== null) return dataProxy();
|
|
57
58
|
return data;
|
|
58
|
-
}));
|
|
59
|
-
const observable = (0, wonka.toObservable)(stream);
|
|
60
|
-
const promise = (0, wonka.toPromise)((0, wonka.pipe)(stream, (0, wonka.take)(1), (0, wonka.map)((data) => {
|
|
61
|
-
if (typeof data === "object" && data !== null) {
|
|
62
|
-
if (typeof forceReactivity === "boolean" && forceReactivity) return observable;
|
|
63
|
-
Object.assign(data, observable);
|
|
64
|
-
return data;
|
|
65
|
-
}
|
|
66
|
-
return data;
|
|
67
59
|
})));
|
|
60
|
+
const promise = new Promise((resolve, reject) => {
|
|
61
|
+
(0, wonka.pipe)(sharedSource, (0, wonka.take)(1), (0, wonka.subscribe)((v) => {
|
|
62
|
+
if (v.error) {
|
|
63
|
+
reject(v.error);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const data = v.data?.[queryName];
|
|
67
|
+
currentData = data;
|
|
68
|
+
if (typeof data !== "object" || data === null) {
|
|
69
|
+
resolve(data);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (typeof forceReactivity === "boolean" && forceReactivity) {
|
|
73
|
+
resolve(observable);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
const r = dataProxy();
|
|
78
|
+
Object.assign(r, observable);
|
|
79
|
+
resolve(r);
|
|
80
|
+
} catch (err) {
|
|
81
|
+
reject(err);
|
|
82
|
+
}
|
|
83
|
+
}));
|
|
84
|
+
});
|
|
68
85
|
Object.assign(promise, observable);
|
|
69
86
|
return promise;
|
|
70
87
|
}
|
|
71
88
|
function makeGraphQLMutationRequest({ mutationName, input, client, schema, autoIncludeIdField }) {
|
|
72
|
-
const
|
|
89
|
+
const sharedSource = (0, wonka.pipe)(client.mutation(makeOperationString({
|
|
73
90
|
operationVerb: "mutation",
|
|
74
91
|
queryName: mutationName,
|
|
75
92
|
input,
|
|
76
93
|
schema,
|
|
77
94
|
autoIncludeIdField
|
|
78
|
-
}), {}),
|
|
79
|
-
|
|
80
|
-
if (
|
|
81
|
-
return data;
|
|
82
|
-
}));
|
|
83
|
-
const
|
|
84
|
-
|
|
95
|
+
}), {}), wonka.share);
|
|
96
|
+
const observable = (0, wonka.toObservable)((0, wonka.pipe)(sharedSource, (0, wonka.map)((v) => {
|
|
97
|
+
if (v.error) throw v.error;
|
|
98
|
+
return v.data?.[mutationName];
|
|
99
|
+
})));
|
|
100
|
+
const promise = new Promise((resolve, reject) => {
|
|
101
|
+
(0, wonka.pipe)(sharedSource, (0, wonka.take)(1), (0, wonka.subscribe)((v) => {
|
|
102
|
+
if (v.error) {
|
|
103
|
+
reject(v.error);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
resolve(v.data?.[mutationName]);
|
|
107
|
+
}));
|
|
108
|
+
});
|
|
85
109
|
Object.assign(promise, observable);
|
|
86
110
|
return promise;
|
|
87
111
|
}
|
|
@@ -93,9 +117,8 @@ function makeGraphQLSubscriptionRequest({ subscriptionName, input, client, schem
|
|
|
93
117
|
schema,
|
|
94
118
|
autoIncludeIdField
|
|
95
119
|
}), {}), (0, wonka.map)((v) => {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
return data;
|
|
120
|
+
if (v.error) throw v.error;
|
|
121
|
+
return v.data?.[subscriptionName];
|
|
99
122
|
}), wonka.toObservable);
|
|
100
123
|
}
|
|
101
124
|
function stringifySelection({ field, selection, types, autoIncludeIdField }) {
|
package/out/client.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.cjs","names":["lazy","empty","share","toObservable","DateResolver","DateTimeISOResolver"],"sources":["../lib/client/request.ts","../lib/client/liveQuery.ts","../lib/client/mutation.ts","../lib/helpers/deepMap.ts","../lib/client/nativeDateExchange.ts","../lib/client/query.ts","../lib/client/subscription.ts"],"sourcesContent":["import type { Client } from \"@urql/core\";\nimport { capitalize } from \"es-toolkit\";\nimport type {\n IntrospectionField,\n IntrospectionInputValue,\n IntrospectionQuery,\n IntrospectionType,\n} from \"graphql\";\nimport { DateResolver, DateTimeISOResolver } from \"graphql-scalars\";\nimport { createSubscriber } from \"svelte/reactivity\";\nimport {\n empty,\n map,\n merge,\n pipe,\n share,\n take,\n toObservable,\n toPromise,\n} from \"wonka\";\nimport { lazy } from \"../helpers/lazy\";\n\n// TODO: this could use some refactoring and less type check disable (remove uses of any)\n// TODO: the client needs tests\n\nexport const argsKey = \"__args\";\n\nfunction makeOperationString({\n operationVerb,\n queryName,\n schema,\n input,\n autoIncludeIdField,\n}: {\n operationVerb: \"query\" | \"subscription\" | \"mutation\";\n queryName: string;\n schema: IntrospectionQuery;\n input?: Record<string, any>;\n autoIncludeIdField?: string;\n}) {\n const otwQueryName = `${capitalize(queryName)}${capitalize(operationVerb)}`;\n const field = schema.__schema.types\n .filter((t) => t.kind === \"OBJECT\")\n .find((t) => t.name === schema.__schema[`${operationVerb}Type`]!.name)!\n .fields.find((f) => f.name === queryName)!;\n const types = schema.__schema.types;\n\n const selectionString = input\n ? stringifySelection({ field, selection: input, types, autoIncludeIdField })\n : \"\";\n\n const argumentString = input?.[argsKey]\n ? stringifyArgumentObjectToGraphql({\n args: input[argsKey],\n fieldArgs: field.args,\n types,\n })\n : \"\";\n\n return `${operationVerb} ${otwQueryName} { ${queryName}${argumentString} ${selectionString}}`;\n}\n\nexport function makeGraphQLQueryRequest({\n queryName,\n schema,\n input,\n client,\n enableSubscription = false,\n forceReactivity,\n autoIncludeIdField,\n}: {\n queryName: string;\n schema: IntrospectionQuery;\n input?: Record<string, any>;\n client: Client;\n enableSubscription?: boolean;\n forceReactivity?: boolean;\n autoIncludeIdField?: string;\n}) {\n let currentData: any;\n const dataProxy = lazy(\n () =>\n new Proxy(currentData, {\n get(target, prop, receiver) {\n svelteSubscriber();\n const val = Reflect.get(currentData, prop, receiver);\n if (typeof val === \"function\") {\n return val.bind(currentData);\n }\n return val;\n },\n }),\n );\n\n const svelteSubscriber = createSubscriber((update) => {\n const unsub = observable.subscribe((d) => {\n update();\n });\n return () => unsub.unsubscribe();\n });\n\n const stream = pipe(\n merge([\n client.query(\n makeOperationString({\n operationVerb: \"query\",\n queryName,\n input,\n schema,\n autoIncludeIdField,\n }),\n {},\n ),\n enableSubscription\n ? client.subscription(\n makeOperationString({\n operationVerb: \"subscription\",\n queryName,\n input,\n schema,\n autoIncludeIdField,\n }),\n {},\n )\n : empty,\n ]),\n share,\n map((v: any) => {\n const data = v.data?.[queryName];\n if (!data && (v.error || v.errors)) {\n throw v.error ?? v.errors.at(0);\n }\n currentData = data;\n\n if (typeof data === \"object\" && data !== null) {\n return dataProxy();\n }\n\n return data;\n }),\n );\n\n const observable = toObservable(stream);\n const promise = toPromise(\n pipe(\n stream,\n take(1),\n map((data) => {\n if (typeof data === \"object\" && data !== null) {\n if (typeof forceReactivity === \"boolean\" && forceReactivity) {\n return observable;\n }\n Object.assign(data, observable);\n return data;\n }\n return data;\n }),\n ),\n );\n\n Object.assign(promise, observable);\n return promise;\n}\n\nexport function makeGraphQLMutationRequest({\n mutationName,\n input,\n client,\n schema,\n autoIncludeIdField,\n}: {\n mutationName: string;\n input: Record<string, any>;\n client: Client;\n schema: IntrospectionQuery;\n autoIncludeIdField?: string;\n}) {\n const response = pipe(\n client.mutation(\n makeOperationString({\n operationVerb: \"mutation\",\n queryName: mutationName,\n input,\n schema,\n autoIncludeIdField,\n }),\n {},\n ),\n map((v) => {\n const data = v.data?.[mutationName];\n if (!data && (v.error || (v as any).errors)) {\n throw v.error ?? (v as any).errors.at(0);\n }\n\n return data;\n }),\n );\n\n const observable = toObservable(response);\n const promise = toPromise(pipe(response, take(1)));\n Object.assign(promise, observable);\n\n return promise;\n}\n\nexport function makeGraphQLSubscriptionRequest({\n subscriptionName,\n input,\n client,\n schema,\n autoIncludeIdField,\n}: {\n subscriptionName: string;\n input: Record<string, any>;\n client: Client;\n schema: IntrospectionQuery;\n autoIncludeIdField?: string;\n}) {\n return pipe(\n client.subscription(\n makeOperationString({\n operationVerb: \"subscription\",\n queryName: subscriptionName,\n input,\n schema,\n autoIncludeIdField,\n }),\n {},\n ),\n map((v) => {\n const data = v.data?.[subscriptionName];\n if (!data && v.error) {\n throw v.error;\n }\n\n return data;\n }),\n toObservable,\n ) as any;\n}\n\nfunction stringifySelection({\n field,\n selection,\n types,\n autoIncludeIdField,\n}: {\n selection: Record<string, any>;\n field: IntrospectionField;\n types: readonly IntrospectionType[];\n autoIncludeIdField?: string;\n}) {\n if (\n autoIncludeIdField &&\n typeof selection[autoIncludeIdField] === \"undefined\"\n ) {\n selection[autoIncludeIdField] = true;\n }\n\n const ret = Object.entries(selection)\n .filter(([key]) => key !== argsKey)\n .reduce((acc, [key, value]) => {\n if (typeof value === \"object\") {\n let argsString = \"\";\n if (value[argsKey]) {\n let type = field.type;\n\n if (type.kind === \"NON_NULL\") {\n type = type.ofType;\n }\n if (type.kind === \"LIST\") {\n type = type.ofType;\n }\n if (type.kind === \"NON_NULL\") {\n type = type.ofType;\n }\n\n const referenceObject = (types as any)\n .find((t: any) => t.name === (type as any).name)\n .fields.find((f: any) => f.name === key);\n\n argsString = stringifyArgumentObjectToGraphql({\n args: value[argsKey],\n types,\n fieldArgs: referenceObject.args,\n });\n }\n\n acc += `${key}${argsString} ${stringifySelection({\n field,\n selection: value,\n types,\n })}\n`;\n } else {\n if (typeof value === \"boolean\" && value) {\n acc += `${key}\n`;\n }\n }\n return acc;\n }, \"\");\n\n return `{\n${ret} }`;\n}\n\nfunction stringifyArgumentObjectToGraphql({\n args,\n fieldArgs,\n types,\n}: {\n args: Record<any, any>;\n fieldArgs: readonly IntrospectionInputValue[];\n types: readonly IntrospectionType[];\n}) {\n const entries = Object.entries(args);\n\n if (entries.length > 0) {\n return `(${entries\n .map(([key, value]) => {\n const gqlArg = fieldArgs.find((a) => a.name === key);\n\n if (!gqlArg) {\n throw new Error(\n `Argument ${key} not found in field args list ${JSON.stringify(fieldArgs.map((a) => a.name))}`,\n );\n }\n\n return `${key}: ${stringifyArgumentValue({ arg: value, gqlArg, types })}`;\n })\n .join(\", \")})`;\n }\n\n return \"\";\n}\n\nfunction stringifyArgumentValue({\n arg,\n gqlArg,\n types,\n}: {\n arg: any;\n gqlArg: IntrospectionInputValue;\n types: readonly IntrospectionType[];\n}): string {\n if (arg === null) {\n return \"null\";\n }\n\n if (Array.isArray(arg)) {\n return `[${arg\n .map((v) => {\n return stringifyArgumentValue({\n arg: v,\n types,\n gqlArg,\n });\n })\n .join(\", \")}]`;\n }\n\n const argtype = typeof arg;\n\n if (argtype === \"object\" && !(arg instanceof Date)) {\n let type = gqlArg.type;\n\n if (type.kind === \"NON_NULL\") {\n type = type.ofType;\n }\n if (type.kind === \"LIST\") {\n type = type.ofType;\n }\n if (type.kind === \"NON_NULL\") {\n type = type.ofType;\n }\n\n // if (type.kind !== \"INPUT_OBJECT\") {\n // throw new Error(\"Expected an INPUT_OBJECT type\");\n // }\n\n const referenceInputObject = types.find(\n (t) => t.name === (type as any).name,\n );\n\n if (!referenceInputObject) {\n throw new Error(\n `Expected an INPUT_OBJECT hit in name based lookup for name ${(type as any).name} with arg ${JSON.stringify(arg)}`,\n );\n }\n\n if (referenceInputObject.kind !== \"INPUT_OBJECT\") {\n throw new Error(\"Expected an INPUT_OBJECT hit in named based lookup\");\n }\n\n return `{ ${Object.entries(arg)\n .map(([key, value]) => {\n const subArgType = referenceInputObject.inputFields.find(\n (t) => t.name === key,\n );\n\n if (!subArgType) {\n throw new Error(\n `Expected an INPUT_OBJECT hit in named based lookup for name ${key} with arg ${referenceInputObject.inputFields.map((f) => f.name).join(\", \")}`,\n );\n }\n\n return `${key}: ${stringifyArgumentValue({ arg: value, types, gqlArg: subArgType })}`;\n })\n .join(\", \")} }`;\n }\n\n let type = gqlArg.type;\n\n if (type.kind === \"NON_NULL\") {\n type = type.ofType;\n }\n\n if (arg instanceof Date) {\n const name = (type as any).name;\n let value: string;\n switch (name) {\n case \"Date\":\n value = DateResolver.serialize(arg);\n break;\n case \"DateTime\":\n value = DateTimeISOResolver.serialize(arg);\n break;\n default:\n throw new Error(\n `Unrecognized date type ${name}, expected Date or DateTime`,\n );\n }\n return `\"${value}\"`;\n }\n\n switch (typeof arg) {\n case \"string\":\n return type.kind === \"ENUM\" ? arg : `\"${arg}\"`;\n case \"number\":\n return `${arg}`;\n case \"bigint\":\n return `${arg}`;\n case \"boolean\":\n return `${arg}`;\n case \"symbol\":\n throw new Error(\"Cannot stringify a symbol to send as gql arg\");\n case \"undefined\":\n return \"null\";\n case \"function\":\n throw new Error(\"Cannot stringify a function to send as gql arg\");\n }\n\n throw new Error(\"Cannot stringify an unknown type\");\n}\n","import type { Client } from \"@urql/core\";\nimport type { IntrospectionQuery } from \"graphql\";\nimport { makeGraphQLQueryRequest } from \"./request\";\nimport type { QueryableObjectFromGeneratedTypes } from \"./types\";\n\nexport function makeLiveQuery<\n Query extends Record<string, any>,\n ForceReactivity extends boolean = false,\n>({\n urqlClient,\n availableSubscriptions,\n forceReactivity,\n schema,\n autoIncludeIdField,\n}: {\n urqlClient: Client;\n schema: IntrospectionQuery;\n availableSubscriptions: Set<string>;\n forceReactivity?: ForceReactivity;\n autoIncludeIdField?: string;\n}) {\n return new Proxy(\n {},\n {\n get: (_target, prop) => {\n return (input: Record<string, any>) => {\n return makeGraphQLQueryRequest({\n queryName: prop as string,\n input,\n client: urqlClient,\n enableSubscription: availableSubscriptions.has(prop as string),\n forceReactivity,\n schema,\n autoIncludeIdField,\n });\n };\n },\n },\n ) as QueryableObjectFromGeneratedTypes<Query, ForceReactivity>;\n}\n","import type { Client } from \"@urql/core\";\nimport type { IntrospectionQuery } from \"graphql\";\nimport { makeGraphQLMutationRequest } from \"./request\";\nimport type { QueryableObjectFromGeneratedTypes } from \"./types\";\n\nexport function makeMutation<Mutation extends Record<string, any>>({\n urqlClient,\n schema,\n autoIncludeIdField,\n}: {\n urqlClient: Client;\n schema: IntrospectionQuery;\n autoIncludeIdField?: string;\n}) {\n return new Proxy(\n {},\n {\n get: (_target, prop) => {\n return (input: Record<string, any>) => {\n return makeGraphQLMutationRequest({\n mutationName: prop as string,\n input,\n client: urqlClient,\n schema,\n autoIncludeIdField,\n });\n };\n },\n },\n ) as QueryableObjectFromGeneratedTypes<Mutation, false>;\n}\n","/**\n * Recursively applies a mapping function to every value in a nested structure.\n *\n * This helper will traverse arrays and plain objects (objects with `constructor === Object`)\n * and apply the provided `fn` to any value that is not an array or a plain object.\n * - Arrays are mapped to new arrays (a fresh array is returned).\n * - Plain objects are traversed and their own enumerable properties are replaced in-place.\n * - Non-plain objects (e.g. Date, Map, Set, class instances, functions) are treated as leaves\n * and passed directly to `fn`.\n * - `null` and `undefined` are passed to `fn`.\n * - Circular references are detected using a `WeakSet`. When a circular reference is encountered,\n * the original reference is returned unchanged (it is not re-traversed or re-mapped).\n *\n * Note: Because plain objects are mutated in-place, callers who need immutability should first\n * clone the object graph or pass a deep-cloned input to avoid modifying the original.\n *\n * @param input - The value to traverse and map. May be any value (primitive, array, object, etc.).\n * @param fn - A function invoked for every non-array, non-plain-object value encountered.\n * Receives the current value and should return the mapped value.\n * @returns The transformed structure: arrays are returned as new arrays, plain objects are the\n * same object instances with their property values replaced, and other values are the\n * result of `fn`.\n *\n * @example\n * // Map all primitive values to their string representation:\n * // const result = mapValuesDeep({ a: 1, b: [2, { c: 3 }] }, v => String(v));\n * // result => { a: \"1\", b: [\"2\", { c: \"3\" }] }\n *\n * @remarks\n * - Only plain objects (constructed by `Object`) are recursively traversed. This avoids\n * unintentionally iterating internal structure of class instances or built-in collections.\n * - Circular structures are preserved by returning the original reference when detected.\n */\nexport function mapValuesDeep(input: any, fn: (value: any) => any) {\n const seen = new WeakSet();\n\n const recurse = (value: any): any => {\n if (Array.isArray(value)) {\n return value.map(recurse);\n }\n\n if (\n value !== null &&\n value !== undefined &&\n typeof value === \"object\" &&\n value.constructor === Object\n ) {\n if (seen.has(value)) return value;\n seen.add(value);\n for (const key of Object.keys(value)) {\n value[key] = recurse(value[key]);\n }\n return value;\n }\n\n return fn(value);\n };\n\n return recurse(input);\n}\n","import type { Exchange } from \"@urql/core\";\nimport { map, pipe } from \"wonka\";\nimport { mapValuesDeep } from \"../helpers/deepMap\";\n\nconst dateIsoRegex =\n /^\\d{4}-\\d{2}-\\d{2}(?:[Tt ]\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:[Zz]|[+-]\\d{2}:\\d{2})?)?$/;\n\nexport const nativeDateExchange: Exchange = ({ client, forward }) => {\n return (operations$) => {\n const operationResult$ = forward(operations$);\n\n return pipe(\n operationResult$,\n map((r) => {\n r.data = mapValuesDeep(r.data, (value) => {\n if (typeof value !== \"string\" || !dateIsoRegex.test(value)) {\n return value;\n }\n\n const date = Date.parse(value);\n if (!Number.isNaN(date)) {\n return new Date(date);\n }\n\n return value;\n });\n return r;\n }),\n );\n };\n};\n","import type { Client } from \"@urql/core\";\nimport type { IntrospectionQuery } from \"graphql\";\nimport { makeGraphQLQueryRequest } from \"./request\";\nimport type { QueryableObjectFromGeneratedTypes } from \"./types\";\n\nexport function makeQuery<\n Query extends Record<string, any>,\n ForceReactivity extends boolean = false,\n>({\n urqlClient,\n forceReactivity,\n schema,\n autoIncludeIdField,\n}: {\n urqlClient: Client;\n forceReactivity?: ForceReactivity;\n schema: IntrospectionQuery;\n autoIncludeIdField?: string;\n}) {\n return new Proxy(\n {},\n {\n get: (_target, prop) => {\n return (input?: Record<string, any>) => {\n return makeGraphQLQueryRequest({\n queryName: prop as string,\n input,\n client: urqlClient,\n enableSubscription: false,\n forceReactivity,\n schema,\n autoIncludeIdField,\n });\n };\n },\n },\n ) as QueryableObjectFromGeneratedTypes<Query, ForceReactivity>;\n}\n","import type { Client } from \"@urql/core\";\nimport type { IntrospectionQuery } from \"graphql\";\nimport { argsKey, makeGraphQLSubscriptionRequest } from \"./request\";\nimport type {\n ApplySelection,\n ObjectFieldSelection,\n Subscribeable,\n} from \"./types\";\nimport type { UnArray } from \"./utilTypes\";\n\nexport function makeSubscription<Subscription extends Record<string, any>>({\n urqlClient,\n schema,\n autoIncludeIdField,\n}: {\n urqlClient: Client;\n schema: IntrospectionQuery;\n autoIncludeIdField?: string;\n}) {\n return new Proxy(\n {},\n {\n get: (_target, prop) => {\n return (input: Record<string, any>) => {\n return makeGraphQLSubscriptionRequest({\n subscriptionName: prop as string,\n input,\n client: urqlClient,\n schema,\n autoIncludeIdField,\n });\n };\n },\n },\n ) as SubscriptionObject<Subscription>;\n}\n\n// TODO use the query util types\n\nexport type SubscriptionObject<Q> = {\n [Key in keyof Q]: QueryableObjectField<Q[Key]>;\n};\n\ntype QueryableObjectField<T> = T extends (\n p: infer QueryArgs,\n) => infer QueryResponse\n ? <\n Selected extends QueryArgs extends Record<string, any>\n ? ObjectFieldSelection<UnArray<NonNullable<QueryResponse>>> & {\n [argsKey]: QueryArgs;\n }\n : ObjectFieldSelection<UnArray<NonNullable<QueryResponse>>>,\n >(\n s: Selected,\n ) => QueryResponse extends null\n ? Subscribeable<\n NonNullable<QueryResponse> extends Array<any>\n ? ApplySelection<UnArray<NonNullable<QueryResponse>>, Selected>[]\n : ApplySelection<UnArray<NonNullable<QueryResponse>>, Selected>\n > | null\n : Subscribeable<\n QueryResponse extends Array<any>\n ? ApplySelection<UnArray<QueryResponse>, Selected>[]\n : ApplySelection<UnArray<QueryResponse>, Selected>\n >\n : Subscribeable<T>;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.cjs","names":["lazy","empty","share","toObservable","DateResolver","DateTimeISOResolver"],"sources":["../lib/client/request.ts","../lib/client/liveQuery.ts","../lib/client/mutation.ts","../lib/helpers/deepMap.ts","../lib/client/nativeDateExchange.ts","../lib/client/query.ts","../lib/client/subscription.ts"],"sourcesContent":["import type { Client } from \"@urql/core\";\nimport { capitalize } from \"es-toolkit\";\nimport type {\n IntrospectionField,\n IntrospectionInputValue,\n IntrospectionQuery,\n IntrospectionType,\n} from \"graphql\";\nimport { DateResolver, DateTimeISOResolver } from \"graphql-scalars\";\nimport { createSubscriber } from \"svelte/reactivity\";\n\nimport {\n empty,\n map,\n merge,\n pipe,\n share,\n subscribe,\n take,\n toObservable,\n} from \"wonka\";\nimport { lazy } from \"../helpers/lazy\";\n\n// TODO: this could use some refactoring and less type check disable (remove uses of any)\n// TODO: the client needs tests\n\nexport const argsKey = \"__args\";\n\nfunction makeOperationString({\n operationVerb,\n queryName,\n schema,\n input,\n autoIncludeIdField,\n}: {\n operationVerb: \"query\" | \"subscription\" | \"mutation\";\n queryName: string;\n schema: IntrospectionQuery;\n input?: Record<string, any>;\n autoIncludeIdField?: string;\n}) {\n const otwQueryName = `${capitalize(queryName)}${capitalize(operationVerb)}`;\n const field = schema.__schema.types\n .filter((t) => t.kind === \"OBJECT\")\n .find((t) => t.name === schema.__schema[`${operationVerb}Type`]!.name)!\n .fields.find((f) => f.name === queryName)!;\n const types = schema.__schema.types;\n\n const selectionString = input\n ? stringifySelection({ field, selection: input, types, autoIncludeIdField })\n : \"\";\n\n const argumentString = input?.[argsKey]\n ? stringifyArgumentObjectToGraphql({\n args: input[argsKey],\n fieldArgs: field.args,\n types,\n })\n : \"\";\n\n return `${operationVerb} ${otwQueryName} { ${queryName}${argumentString} ${selectionString}}`;\n}\n\nexport function makeGraphQLQueryRequest({\n queryName,\n schema,\n input,\n client,\n enableSubscription = false,\n forceReactivity,\n autoIncludeIdField,\n}: {\n queryName: string;\n schema: IntrospectionQuery;\n input?: Record<string, any>;\n client: Client;\n enableSubscription?: boolean;\n forceReactivity?: boolean;\n autoIncludeIdField?: string;\n}) {\n let currentData: any;\n const dataProxy = lazy(\n () =>\n new Proxy(currentData, {\n get(target, prop, receiver) {\n svelteSubscriber();\n const val = Reflect.get(currentData, prop, receiver);\n if (typeof val === \"function\") {\n return val.bind(currentData);\n }\n return val;\n },\n }),\n );\n\n const svelteSubscriber = createSubscriber((update) => {\n const unsub = observable.subscribe((d) => {\n update();\n });\n return () => unsub.unsubscribe();\n });\n\n const sharedSource = pipe(\n merge([\n client.query(\n makeOperationString({\n operationVerb: \"query\",\n queryName,\n input,\n schema,\n autoIncludeIdField,\n }),\n {},\n ),\n enableSubscription\n ? client.subscription(\n makeOperationString({\n operationVerb: \"subscription\",\n queryName,\n input,\n schema,\n autoIncludeIdField,\n }),\n {},\n )\n : empty,\n ]),\n share,\n );\n\n const observable = toObservable(\n pipe(\n sharedSource,\n map((v: any) => {\n if (v.error) {\n throw v.error;\n }\n\n const data = v.data?.[queryName];\n currentData = data;\n if (typeof data === \"object\" && data !== null) {\n return dataProxy();\n }\n return data;\n }),\n ),\n );\n\n const promise = new Promise<any>((resolve, reject) => {\n pipe(\n sharedSource,\n take(1),\n subscribe((v: any) => {\n if (v.error) {\n reject(v.error);\n return;\n }\n\n const data = v.data?.[queryName];\n currentData = data;\n if (typeof data !== \"object\" || data === null) {\n resolve(data);\n return;\n }\n if (typeof forceReactivity === \"boolean\" && forceReactivity) {\n resolve(observable);\n return;\n }\n try {\n const r = dataProxy();\n Object.assign(r, observable);\n resolve(r);\n } catch (err) {\n reject(err);\n }\n }),\n );\n });\n\n Object.assign(promise, observable);\n return promise;\n}\n\nexport function makeGraphQLMutationRequest({\n mutationName,\n input,\n client,\n schema,\n autoIncludeIdField,\n}: {\n mutationName: string;\n input: Record<string, any>;\n client: Client;\n schema: IntrospectionQuery;\n autoIncludeIdField?: string;\n}) {\n const sharedSource = pipe(\n client.mutation(\n makeOperationString({\n operationVerb: \"mutation\",\n queryName: mutationName,\n input,\n schema,\n autoIncludeIdField,\n }),\n {},\n ),\n share,\n );\n\n const observable = toObservable(\n pipe(\n sharedSource,\n map((v) => {\n if (v.error) {\n throw v.error;\n }\n\n const data = v.data?.[mutationName];\n return data;\n }),\n ),\n );\n\n const promise = new Promise<any>((resolve, reject) => {\n pipe(\n sharedSource,\n take(1),\n subscribe((v: any) => {\n if (v.error) {\n reject(v.error);\n return;\n }\n\n resolve(v.data?.[mutationName]);\n }),\n );\n });\n\n Object.assign(promise, observable);\n return promise;\n}\n\nexport function makeGraphQLSubscriptionRequest({\n subscriptionName,\n input,\n client,\n schema,\n autoIncludeIdField,\n}: {\n subscriptionName: string;\n input: Record<string, any>;\n client: Client;\n schema: IntrospectionQuery;\n autoIncludeIdField?: string;\n}) {\n return pipe(\n client.subscription(\n makeOperationString({\n operationVerb: \"subscription\",\n queryName: subscriptionName,\n input,\n schema,\n autoIncludeIdField,\n }),\n {},\n ),\n map((v) => {\n if (v.error) {\n throw v.error;\n }\n\n return v.data?.[subscriptionName];\n }),\n toObservable,\n ) as any;\n}\n\nfunction stringifySelection({\n field,\n selection,\n types,\n autoIncludeIdField,\n}: {\n selection: Record<string, any>;\n field: IntrospectionField;\n types: readonly IntrospectionType[];\n autoIncludeIdField?: string;\n}) {\n if (\n autoIncludeIdField &&\n typeof selection[autoIncludeIdField] === \"undefined\"\n ) {\n selection[autoIncludeIdField] = true;\n }\n\n const ret = Object.entries(selection)\n .filter(([key]) => key !== argsKey)\n .reduce((acc, [key, value]) => {\n if (typeof value === \"object\") {\n let argsString = \"\";\n if (value[argsKey]) {\n let type = field.type;\n\n if (type.kind === \"NON_NULL\") {\n type = type.ofType;\n }\n if (type.kind === \"LIST\") {\n type = type.ofType;\n }\n if (type.kind === \"NON_NULL\") {\n type = type.ofType;\n }\n\n const referenceObject = (types as any)\n .find((t: any) => t.name === (type as any).name)\n .fields.find((f: any) => f.name === key);\n\n argsString = stringifyArgumentObjectToGraphql({\n args: value[argsKey],\n types,\n fieldArgs: referenceObject.args,\n });\n }\n\n acc += `${key}${argsString} ${stringifySelection({\n field,\n selection: value,\n types,\n })}\n`;\n } else {\n if (typeof value === \"boolean\" && value) {\n acc += `${key}\n`;\n }\n }\n return acc;\n }, \"\");\n\n return `{\n${ret} }`;\n}\n\nfunction stringifyArgumentObjectToGraphql({\n args,\n fieldArgs,\n types,\n}: {\n args: Record<any, any>;\n fieldArgs: readonly IntrospectionInputValue[];\n types: readonly IntrospectionType[];\n}) {\n const entries = Object.entries(args);\n\n if (entries.length > 0) {\n return `(${entries\n .map(([key, value]) => {\n const gqlArg = fieldArgs.find((a) => a.name === key);\n\n if (!gqlArg) {\n throw new Error(\n `Argument ${key} not found in field args list ${JSON.stringify(fieldArgs.map((a) => a.name))}`,\n );\n }\n\n return `${key}: ${stringifyArgumentValue({ arg: value, gqlArg, types })}`;\n })\n .join(\", \")})`;\n }\n\n return \"\";\n}\n\nfunction stringifyArgumentValue({\n arg,\n gqlArg,\n types,\n}: {\n arg: any;\n gqlArg: IntrospectionInputValue;\n types: readonly IntrospectionType[];\n}): string {\n if (arg === null) {\n return \"null\";\n }\n\n if (Array.isArray(arg)) {\n return `[${arg\n .map((v) => {\n return stringifyArgumentValue({\n arg: v,\n types,\n gqlArg,\n });\n })\n .join(\", \")}]`;\n }\n\n const argtype = typeof arg;\n\n if (argtype === \"object\" && !(arg instanceof Date)) {\n let type = gqlArg.type;\n\n if (type.kind === \"NON_NULL\") {\n type = type.ofType;\n }\n if (type.kind === \"LIST\") {\n type = type.ofType;\n }\n if (type.kind === \"NON_NULL\") {\n type = type.ofType;\n }\n\n // if (type.kind !== \"INPUT_OBJECT\") {\n // throw new Error(\"Expected an INPUT_OBJECT type\");\n // }\n\n const referenceInputObject = types.find(\n (t) => t.name === (type as any).name,\n );\n\n if (!referenceInputObject) {\n throw new Error(\n `Expected an INPUT_OBJECT hit in name based lookup for name ${(type as any).name} with arg ${JSON.stringify(arg)}`,\n );\n }\n\n if (referenceInputObject.kind !== \"INPUT_OBJECT\") {\n throw new Error(\"Expected an INPUT_OBJECT hit in named based lookup\");\n }\n\n return `{ ${Object.entries(arg)\n .map(([key, value]) => {\n const subArgType = referenceInputObject.inputFields.find(\n (t) => t.name === key,\n );\n\n if (!subArgType) {\n throw new Error(\n `Expected an INPUT_OBJECT hit in named based lookup for name ${key} with arg ${referenceInputObject.inputFields.map((f) => f.name).join(\", \")}`,\n );\n }\n\n return `${key}: ${stringifyArgumentValue({ arg: value, types, gqlArg: subArgType })}`;\n })\n .join(\", \")} }`;\n }\n\n let type = gqlArg.type;\n\n if (type.kind === \"NON_NULL\") {\n type = type.ofType;\n }\n\n if (arg instanceof Date) {\n const name = (type as any).name;\n let value: string;\n switch (name) {\n case \"Date\":\n value = DateResolver.serialize(arg);\n break;\n case \"DateTime\":\n value = DateTimeISOResolver.serialize(arg);\n break;\n default:\n throw new Error(\n `Unrecognized date type ${name}, expected Date or DateTime`,\n );\n }\n return `\"${value}\"`;\n }\n\n switch (typeof arg) {\n case \"string\":\n return type.kind === \"ENUM\" ? arg : `\"${arg}\"`;\n case \"number\":\n return `${arg}`;\n case \"bigint\":\n return `${arg}`;\n case \"boolean\":\n return `${arg}`;\n case \"symbol\":\n throw new Error(\"Cannot stringify a symbol to send as gql arg\");\n case \"undefined\":\n return \"null\";\n case \"function\":\n throw new Error(\"Cannot stringify a function to send as gql arg\");\n }\n\n throw new Error(\"Cannot stringify an unknown type\");\n}\n","import type { Client } from \"@urql/core\";\nimport type { IntrospectionQuery } from \"graphql\";\nimport { makeGraphQLQueryRequest } from \"./request\";\nimport type { QueryableObjectFromGeneratedTypes } from \"./types\";\n\nexport function makeLiveQuery<\n Query extends Record<string, any>,\n ForceReactivity extends boolean = false,\n>({\n urqlClient,\n availableSubscriptions,\n forceReactivity,\n schema,\n autoIncludeIdField,\n}: {\n urqlClient: Client;\n schema: IntrospectionQuery;\n availableSubscriptions: Set<string>;\n forceReactivity?: ForceReactivity;\n autoIncludeIdField?: string;\n}) {\n return new Proxy(\n {},\n {\n get: (_target, prop) => {\n return (input: Record<string, any>) => {\n return makeGraphQLQueryRequest({\n queryName: prop as string,\n input,\n client: urqlClient,\n enableSubscription: availableSubscriptions.has(prop as string),\n forceReactivity,\n schema,\n autoIncludeIdField,\n });\n };\n },\n },\n ) as QueryableObjectFromGeneratedTypes<Query, ForceReactivity>;\n}\n","import type { Client } from \"@urql/core\";\nimport type { IntrospectionQuery } from \"graphql\";\nimport { makeGraphQLMutationRequest } from \"./request\";\nimport type { QueryableObjectFromGeneratedTypes } from \"./types\";\n\nexport function makeMutation<Mutation extends Record<string, any>>({\n urqlClient,\n schema,\n autoIncludeIdField,\n}: {\n urqlClient: Client;\n schema: IntrospectionQuery;\n autoIncludeIdField?: string;\n}) {\n return new Proxy(\n {},\n {\n get: (_target, prop) => {\n return (input: Record<string, any>) => {\n return makeGraphQLMutationRequest({\n mutationName: prop as string,\n input,\n client: urqlClient,\n schema,\n autoIncludeIdField,\n });\n };\n },\n },\n ) as QueryableObjectFromGeneratedTypes<Mutation, false>;\n}\n","/**\n * Recursively applies a mapping function to every value in a nested structure.\n *\n * This helper will traverse arrays and plain objects (objects with `constructor === Object`)\n * and apply the provided `fn` to any value that is not an array or a plain object.\n * - Arrays are mapped to new arrays (a fresh array is returned).\n * - Plain objects are traversed and their own enumerable properties are replaced in-place.\n * - Non-plain objects (e.g. Date, Map, Set, class instances, functions) are treated as leaves\n * and passed directly to `fn`.\n * - `null` and `undefined` are passed to `fn`.\n * - Circular references are detected using a `WeakSet`. When a circular reference is encountered,\n * the original reference is returned unchanged (it is not re-traversed or re-mapped).\n *\n * Note: Because plain objects are mutated in-place, callers who need immutability should first\n * clone the object graph or pass a deep-cloned input to avoid modifying the original.\n *\n * @param input - The value to traverse and map. May be any value (primitive, array, object, etc.).\n * @param fn - A function invoked for every non-array, non-plain-object value encountered.\n * Receives the current value and should return the mapped value.\n * @returns The transformed structure: arrays are returned as new arrays, plain objects are the\n * same object instances with their property values replaced, and other values are the\n * result of `fn`.\n *\n * @example\n * // Map all primitive values to their string representation:\n * // const result = mapValuesDeep({ a: 1, b: [2, { c: 3 }] }, v => String(v));\n * // result => { a: \"1\", b: [\"2\", { c: \"3\" }] }\n *\n * @remarks\n * - Only plain objects (constructed by `Object`) are recursively traversed. This avoids\n * unintentionally iterating internal structure of class instances or built-in collections.\n * - Circular structures are preserved by returning the original reference when detected.\n */\nexport function mapValuesDeep(input: any, fn: (value: any) => any) {\n const seen = new WeakSet();\n\n const recurse = (value: any): any => {\n if (Array.isArray(value)) {\n return value.map(recurse);\n }\n\n if (\n value !== null &&\n value !== undefined &&\n typeof value === \"object\" &&\n value.constructor === Object\n ) {\n if (seen.has(value)) return value;\n seen.add(value);\n for (const key of Object.keys(value)) {\n value[key] = recurse(value[key]);\n }\n return value;\n }\n\n return fn(value);\n };\n\n return recurse(input);\n}\n","import type { Exchange } from \"@urql/core\";\nimport { map, pipe } from \"wonka\";\nimport { mapValuesDeep } from \"../helpers/deepMap\";\n\nconst dateIsoRegex =\n /^\\d{4}-\\d{2}-\\d{2}(?:[Tt ]\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:[Zz]|[+-]\\d{2}:\\d{2})?)?$/;\n\nexport const nativeDateExchange: Exchange = ({ client, forward }) => {\n return (operations$) => {\n const operationResult$ = forward(operations$);\n\n return pipe(\n operationResult$,\n map((r) => {\n r.data = mapValuesDeep(r.data, (value) => {\n if (typeof value !== \"string\" || !dateIsoRegex.test(value)) {\n return value;\n }\n\n const date = Date.parse(value);\n if (!Number.isNaN(date)) {\n return new Date(date);\n }\n\n return value;\n });\n return r;\n }),\n );\n };\n};\n","import type { Client } from \"@urql/core\";\nimport type { IntrospectionQuery } from \"graphql\";\nimport { makeGraphQLQueryRequest } from \"./request\";\nimport type { QueryableObjectFromGeneratedTypes } from \"./types\";\n\nexport function makeQuery<\n Query extends Record<string, any>,\n ForceReactivity extends boolean = false,\n>({\n urqlClient,\n forceReactivity,\n schema,\n autoIncludeIdField,\n}: {\n urqlClient: Client;\n forceReactivity?: ForceReactivity;\n schema: IntrospectionQuery;\n autoIncludeIdField?: string;\n}) {\n return new Proxy(\n {},\n {\n get: (_target, prop) => {\n return (input?: Record<string, any>) => {\n return makeGraphQLQueryRequest({\n queryName: prop as string,\n input,\n client: urqlClient,\n enableSubscription: false,\n forceReactivity,\n schema,\n autoIncludeIdField,\n });\n };\n },\n },\n ) as QueryableObjectFromGeneratedTypes<Query, ForceReactivity>;\n}\n","import type { Client } from \"@urql/core\";\nimport type { IntrospectionQuery } from \"graphql\";\nimport { argsKey, makeGraphQLSubscriptionRequest } from \"./request\";\nimport type {\n ApplySelection,\n ObjectFieldSelection,\n Subscribeable,\n} from \"./types\";\nimport type { UnArray } from \"./utilTypes\";\n\nexport function makeSubscription<Subscription extends Record<string, any>>({\n urqlClient,\n schema,\n autoIncludeIdField,\n}: {\n urqlClient: Client;\n schema: IntrospectionQuery;\n autoIncludeIdField?: string;\n}) {\n return new Proxy(\n {},\n {\n get: (_target, prop) => {\n return (input: Record<string, any>) => {\n return makeGraphQLSubscriptionRequest({\n subscriptionName: prop as string,\n input,\n client: urqlClient,\n schema,\n autoIncludeIdField,\n });\n };\n },\n },\n ) as SubscriptionObject<Subscription>;\n}\n\n// TODO use the query util types\n\nexport type SubscriptionObject<Q> = {\n [Key in keyof Q]: QueryableObjectField<Q[Key]>;\n};\n\ntype QueryableObjectField<T> = T extends (\n p: infer QueryArgs,\n) => infer QueryResponse\n ? <\n Selected extends QueryArgs extends Record<string, any>\n ? ObjectFieldSelection<UnArray<NonNullable<QueryResponse>>> & {\n [argsKey]: QueryArgs;\n }\n : ObjectFieldSelection<UnArray<NonNullable<QueryResponse>>>,\n >(\n s: Selected,\n ) => QueryResponse extends null\n ? Subscribeable<\n NonNullable<QueryResponse> extends Array<any>\n ? ApplySelection<UnArray<NonNullable<QueryResponse>>, Selected>[]\n : ApplySelection<UnArray<NonNullable<QueryResponse>>, Selected>\n > | null\n : Subscribeable<\n QueryResponse extends Array<any>\n ? ApplySelection<UnArray<QueryResponse>, Selected>[]\n : ApplySelection<UnArray<QueryResponse>, Selected>\n >\n : Subscribeable<T>;\n"],"mappings":"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"}
|
package/out/client.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.cts","names":[],"sources":["../lib/client/request.ts","../lib/client/utilTypes.ts","../lib/client/types.ts","../lib/client/liveQuery.ts","../lib/client/mutation.ts","../lib/client/nativeDateExchange.ts","../lib/client/query.ts","../lib/client/subscription.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"client.d.cts","names":[],"sources":["../lib/client/request.ts","../lib/client/utilTypes.ts","../lib/client/types.ts","../lib/client/liveQuery.ts","../lib/client/mutation.ts","../lib/client/nativeDateExchange.ts","../lib/client/query.ts","../lib/client/subscription.ts"],"mappings":"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"}
|
package/out/client.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.mts","names":[],"sources":["../lib/client/request.ts","../lib/client/utilTypes.ts","../lib/client/types.ts","../lib/client/liveQuery.ts","../lib/client/mutation.ts","../lib/client/nativeDateExchange.ts","../lib/client/query.ts","../lib/client/subscription.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"client.d.mts","names":[],"sources":["../lib/client/request.ts","../lib/client/utilTypes.ts","../lib/client/types.ts","../lib/client/liveQuery.ts","../lib/client/mutation.ts","../lib/client/nativeDateExchange.ts","../lib/client/query.ts","../lib/client/subscription.ts"],"mappings":"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"}
|
package/out/client.mjs
CHANGED
|
@@ -2,7 +2,7 @@ import { t as lazy } from "./lazy-BgeBy3-B.mjs";
|
|
|
2
2
|
import { capitalize } from "es-toolkit";
|
|
3
3
|
import { DateResolver, DateTimeISOResolver } from "graphql-scalars";
|
|
4
4
|
import { createSubscriber } from "svelte/reactivity";
|
|
5
|
-
import { empty, map, merge as merge$1, pipe, share, take, toObservable
|
|
5
|
+
import { empty, map, merge as merge$1, pipe, share, subscribe, take, toObservable } from "wonka";
|
|
6
6
|
//#region lib/client/request.ts
|
|
7
7
|
const argsKey = "__args";
|
|
8
8
|
function makeOperationString({ operationVerb, queryName, schema, input, autoIncludeIdField }) {
|
|
@@ -35,7 +35,7 @@ function makeGraphQLQueryRequest({ queryName, schema, input, client, enableSubsc
|
|
|
35
35
|
});
|
|
36
36
|
return () => unsub.unsubscribe();
|
|
37
37
|
});
|
|
38
|
-
const
|
|
38
|
+
const sharedSource = pipe(merge$1([client.query(makeOperationString({
|
|
39
39
|
operationVerb: "query",
|
|
40
40
|
queryName,
|
|
41
41
|
input,
|
|
@@ -47,39 +47,63 @@ function makeGraphQLQueryRequest({ queryName, schema, input, client, enableSubsc
|
|
|
47
47
|
input,
|
|
48
48
|
schema,
|
|
49
49
|
autoIncludeIdField
|
|
50
|
-
}), {}) : empty]), share
|
|
50
|
+
}), {}) : empty]), share);
|
|
51
|
+
const observable = toObservable(pipe(sharedSource, map((v) => {
|
|
52
|
+
if (v.error) throw v.error;
|
|
51
53
|
const data = v.data?.[queryName];
|
|
52
|
-
if (!data && (v.error || v.errors)) throw v.error ?? v.errors.at(0);
|
|
53
54
|
currentData = data;
|
|
54
55
|
if (typeof data === "object" && data !== null) return dataProxy();
|
|
55
56
|
return data;
|
|
56
|
-
}));
|
|
57
|
-
const observable = toObservable(stream);
|
|
58
|
-
const promise = toPromise(pipe(stream, take(1), map((data) => {
|
|
59
|
-
if (typeof data === "object" && data !== null) {
|
|
60
|
-
if (typeof forceReactivity === "boolean" && forceReactivity) return observable;
|
|
61
|
-
Object.assign(data, observable);
|
|
62
|
-
return data;
|
|
63
|
-
}
|
|
64
|
-
return data;
|
|
65
57
|
})));
|
|
58
|
+
const promise = new Promise((resolve, reject) => {
|
|
59
|
+
pipe(sharedSource, take(1), subscribe((v) => {
|
|
60
|
+
if (v.error) {
|
|
61
|
+
reject(v.error);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const data = v.data?.[queryName];
|
|
65
|
+
currentData = data;
|
|
66
|
+
if (typeof data !== "object" || data === null) {
|
|
67
|
+
resolve(data);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (typeof forceReactivity === "boolean" && forceReactivity) {
|
|
71
|
+
resolve(observable);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
const r = dataProxy();
|
|
76
|
+
Object.assign(r, observable);
|
|
77
|
+
resolve(r);
|
|
78
|
+
} catch (err) {
|
|
79
|
+
reject(err);
|
|
80
|
+
}
|
|
81
|
+
}));
|
|
82
|
+
});
|
|
66
83
|
Object.assign(promise, observable);
|
|
67
84
|
return promise;
|
|
68
85
|
}
|
|
69
86
|
function makeGraphQLMutationRequest({ mutationName, input, client, schema, autoIncludeIdField }) {
|
|
70
|
-
const
|
|
87
|
+
const sharedSource = pipe(client.mutation(makeOperationString({
|
|
71
88
|
operationVerb: "mutation",
|
|
72
89
|
queryName: mutationName,
|
|
73
90
|
input,
|
|
74
91
|
schema,
|
|
75
92
|
autoIncludeIdField
|
|
76
|
-
}), {}),
|
|
77
|
-
|
|
78
|
-
if (
|
|
79
|
-
return data;
|
|
80
|
-
}));
|
|
81
|
-
const
|
|
82
|
-
|
|
93
|
+
}), {}), share);
|
|
94
|
+
const observable = toObservable(pipe(sharedSource, map((v) => {
|
|
95
|
+
if (v.error) throw v.error;
|
|
96
|
+
return v.data?.[mutationName];
|
|
97
|
+
})));
|
|
98
|
+
const promise = new Promise((resolve, reject) => {
|
|
99
|
+
pipe(sharedSource, take(1), subscribe((v) => {
|
|
100
|
+
if (v.error) {
|
|
101
|
+
reject(v.error);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
resolve(v.data?.[mutationName]);
|
|
105
|
+
}));
|
|
106
|
+
});
|
|
83
107
|
Object.assign(promise, observable);
|
|
84
108
|
return promise;
|
|
85
109
|
}
|
|
@@ -91,9 +115,8 @@ function makeGraphQLSubscriptionRequest({ subscriptionName, input, client, schem
|
|
|
91
115
|
schema,
|
|
92
116
|
autoIncludeIdField
|
|
93
117
|
}), {}), map((v) => {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
return data;
|
|
118
|
+
if (v.error) throw v.error;
|
|
119
|
+
return v.data?.[subscriptionName];
|
|
97
120
|
}), toObservable);
|
|
98
121
|
}
|
|
99
122
|
function stringifySelection({ field, selection, types, autoIncludeIdField }) {
|
package/out/client.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.mjs","names":["merge"],"sources":["../lib/client/request.ts","../lib/client/liveQuery.ts","../lib/client/mutation.ts","../lib/helpers/deepMap.ts","../lib/client/nativeDateExchange.ts","../lib/client/query.ts","../lib/client/subscription.ts"],"sourcesContent":["import type { Client } from \"@urql/core\";\nimport { capitalize } from \"es-toolkit\";\nimport type {\n IntrospectionField,\n IntrospectionInputValue,\n IntrospectionQuery,\n IntrospectionType,\n} from \"graphql\";\nimport { DateResolver, DateTimeISOResolver } from \"graphql-scalars\";\nimport { createSubscriber } from \"svelte/reactivity\";\nimport {\n empty,\n map,\n merge,\n pipe,\n share,\n take,\n toObservable,\n toPromise,\n} from \"wonka\";\nimport { lazy } from \"../helpers/lazy\";\n\n// TODO: this could use some refactoring and less type check disable (remove uses of any)\n// TODO: the client needs tests\n\nexport const argsKey = \"__args\";\n\nfunction makeOperationString({\n operationVerb,\n queryName,\n schema,\n input,\n autoIncludeIdField,\n}: {\n operationVerb: \"query\" | \"subscription\" | \"mutation\";\n queryName: string;\n schema: IntrospectionQuery;\n input?: Record<string, any>;\n autoIncludeIdField?: string;\n}) {\n const otwQueryName = `${capitalize(queryName)}${capitalize(operationVerb)}`;\n const field = schema.__schema.types\n .filter((t) => t.kind === \"OBJECT\")\n .find((t) => t.name === schema.__schema[`${operationVerb}Type`]!.name)!\n .fields.find((f) => f.name === queryName)!;\n const types = schema.__schema.types;\n\n const selectionString = input\n ? stringifySelection({ field, selection: input, types, autoIncludeIdField })\n : \"\";\n\n const argumentString = input?.[argsKey]\n ? stringifyArgumentObjectToGraphql({\n args: input[argsKey],\n fieldArgs: field.args,\n types,\n })\n : \"\";\n\n return `${operationVerb} ${otwQueryName} { ${queryName}${argumentString} ${selectionString}}`;\n}\n\nexport function makeGraphQLQueryRequest({\n queryName,\n schema,\n input,\n client,\n enableSubscription = false,\n forceReactivity,\n autoIncludeIdField,\n}: {\n queryName: string;\n schema: IntrospectionQuery;\n input?: Record<string, any>;\n client: Client;\n enableSubscription?: boolean;\n forceReactivity?: boolean;\n autoIncludeIdField?: string;\n}) {\n let currentData: any;\n const dataProxy = lazy(\n () =>\n new Proxy(currentData, {\n get(target, prop, receiver) {\n svelteSubscriber();\n const val = Reflect.get(currentData, prop, receiver);\n if (typeof val === \"function\") {\n return val.bind(currentData);\n }\n return val;\n },\n }),\n );\n\n const svelteSubscriber = createSubscriber((update) => {\n const unsub = observable.subscribe((d) => {\n update();\n });\n return () => unsub.unsubscribe();\n });\n\n const stream = pipe(\n merge([\n client.query(\n makeOperationString({\n operationVerb: \"query\",\n queryName,\n input,\n schema,\n autoIncludeIdField,\n }),\n {},\n ),\n enableSubscription\n ? client.subscription(\n makeOperationString({\n operationVerb: \"subscription\",\n queryName,\n input,\n schema,\n autoIncludeIdField,\n }),\n {},\n )\n : empty,\n ]),\n share,\n map((v: any) => {\n const data = v.data?.[queryName];\n if (!data && (v.error || v.errors)) {\n throw v.error ?? v.errors.at(0);\n }\n currentData = data;\n\n if (typeof data === \"object\" && data !== null) {\n return dataProxy();\n }\n\n return data;\n }),\n );\n\n const observable = toObservable(stream);\n const promise = toPromise(\n pipe(\n stream,\n take(1),\n map((data) => {\n if (typeof data === \"object\" && data !== null) {\n if (typeof forceReactivity === \"boolean\" && forceReactivity) {\n return observable;\n }\n Object.assign(data, observable);\n return data;\n }\n return data;\n }),\n ),\n );\n\n Object.assign(promise, observable);\n return promise;\n}\n\nexport function makeGraphQLMutationRequest({\n mutationName,\n input,\n client,\n schema,\n autoIncludeIdField,\n}: {\n mutationName: string;\n input: Record<string, any>;\n client: Client;\n schema: IntrospectionQuery;\n autoIncludeIdField?: string;\n}) {\n const response = pipe(\n client.mutation(\n makeOperationString({\n operationVerb: \"mutation\",\n queryName: mutationName,\n input,\n schema,\n autoIncludeIdField,\n }),\n {},\n ),\n map((v) => {\n const data = v.data?.[mutationName];\n if (!data && (v.error || (v as any).errors)) {\n throw v.error ?? (v as any).errors.at(0);\n }\n\n return data;\n }),\n );\n\n const observable = toObservable(response);\n const promise = toPromise(pipe(response, take(1)));\n Object.assign(promise, observable);\n\n return promise;\n}\n\nexport function makeGraphQLSubscriptionRequest({\n subscriptionName,\n input,\n client,\n schema,\n autoIncludeIdField,\n}: {\n subscriptionName: string;\n input: Record<string, any>;\n client: Client;\n schema: IntrospectionQuery;\n autoIncludeIdField?: string;\n}) {\n return pipe(\n client.subscription(\n makeOperationString({\n operationVerb: \"subscription\",\n queryName: subscriptionName,\n input,\n schema,\n autoIncludeIdField,\n }),\n {},\n ),\n map((v) => {\n const data = v.data?.[subscriptionName];\n if (!data && v.error) {\n throw v.error;\n }\n\n return data;\n }),\n toObservable,\n ) as any;\n}\n\nfunction stringifySelection({\n field,\n selection,\n types,\n autoIncludeIdField,\n}: {\n selection: Record<string, any>;\n field: IntrospectionField;\n types: readonly IntrospectionType[];\n autoIncludeIdField?: string;\n}) {\n if (\n autoIncludeIdField &&\n typeof selection[autoIncludeIdField] === \"undefined\"\n ) {\n selection[autoIncludeIdField] = true;\n }\n\n const ret = Object.entries(selection)\n .filter(([key]) => key !== argsKey)\n .reduce((acc, [key, value]) => {\n if (typeof value === \"object\") {\n let argsString = \"\";\n if (value[argsKey]) {\n let type = field.type;\n\n if (type.kind === \"NON_NULL\") {\n type = type.ofType;\n }\n if (type.kind === \"LIST\") {\n type = type.ofType;\n }\n if (type.kind === \"NON_NULL\") {\n type = type.ofType;\n }\n\n const referenceObject = (types as any)\n .find((t: any) => t.name === (type as any).name)\n .fields.find((f: any) => f.name === key);\n\n argsString = stringifyArgumentObjectToGraphql({\n args: value[argsKey],\n types,\n fieldArgs: referenceObject.args,\n });\n }\n\n acc += `${key}${argsString} ${stringifySelection({\n field,\n selection: value,\n types,\n })}\n`;\n } else {\n if (typeof value === \"boolean\" && value) {\n acc += `${key}\n`;\n }\n }\n return acc;\n }, \"\");\n\n return `{\n${ret} }`;\n}\n\nfunction stringifyArgumentObjectToGraphql({\n args,\n fieldArgs,\n types,\n}: {\n args: Record<any, any>;\n fieldArgs: readonly IntrospectionInputValue[];\n types: readonly IntrospectionType[];\n}) {\n const entries = Object.entries(args);\n\n if (entries.length > 0) {\n return `(${entries\n .map(([key, value]) => {\n const gqlArg = fieldArgs.find((a) => a.name === key);\n\n if (!gqlArg) {\n throw new Error(\n `Argument ${key} not found in field args list ${JSON.stringify(fieldArgs.map((a) => a.name))}`,\n );\n }\n\n return `${key}: ${stringifyArgumentValue({ arg: value, gqlArg, types })}`;\n })\n .join(\", \")})`;\n }\n\n return \"\";\n}\n\nfunction stringifyArgumentValue({\n arg,\n gqlArg,\n types,\n}: {\n arg: any;\n gqlArg: IntrospectionInputValue;\n types: readonly IntrospectionType[];\n}): string {\n if (arg === null) {\n return \"null\";\n }\n\n if (Array.isArray(arg)) {\n return `[${arg\n .map((v) => {\n return stringifyArgumentValue({\n arg: v,\n types,\n gqlArg,\n });\n })\n .join(\", \")}]`;\n }\n\n const argtype = typeof arg;\n\n if (argtype === \"object\" && !(arg instanceof Date)) {\n let type = gqlArg.type;\n\n if (type.kind === \"NON_NULL\") {\n type = type.ofType;\n }\n if (type.kind === \"LIST\") {\n type = type.ofType;\n }\n if (type.kind === \"NON_NULL\") {\n type = type.ofType;\n }\n\n // if (type.kind !== \"INPUT_OBJECT\") {\n // throw new Error(\"Expected an INPUT_OBJECT type\");\n // }\n\n const referenceInputObject = types.find(\n (t) => t.name === (type as any).name,\n );\n\n if (!referenceInputObject) {\n throw new Error(\n `Expected an INPUT_OBJECT hit in name based lookup for name ${(type as any).name} with arg ${JSON.stringify(arg)}`,\n );\n }\n\n if (referenceInputObject.kind !== \"INPUT_OBJECT\") {\n throw new Error(\"Expected an INPUT_OBJECT hit in named based lookup\");\n }\n\n return `{ ${Object.entries(arg)\n .map(([key, value]) => {\n const subArgType = referenceInputObject.inputFields.find(\n (t) => t.name === key,\n );\n\n if (!subArgType) {\n throw new Error(\n `Expected an INPUT_OBJECT hit in named based lookup for name ${key} with arg ${referenceInputObject.inputFields.map((f) => f.name).join(\", \")}`,\n );\n }\n\n return `${key}: ${stringifyArgumentValue({ arg: value, types, gqlArg: subArgType })}`;\n })\n .join(\", \")} }`;\n }\n\n let type = gqlArg.type;\n\n if (type.kind === \"NON_NULL\") {\n type = type.ofType;\n }\n\n if (arg instanceof Date) {\n const name = (type as any).name;\n let value: string;\n switch (name) {\n case \"Date\":\n value = DateResolver.serialize(arg);\n break;\n case \"DateTime\":\n value = DateTimeISOResolver.serialize(arg);\n break;\n default:\n throw new Error(\n `Unrecognized date type ${name}, expected Date or DateTime`,\n );\n }\n return `\"${value}\"`;\n }\n\n switch (typeof arg) {\n case \"string\":\n return type.kind === \"ENUM\" ? arg : `\"${arg}\"`;\n case \"number\":\n return `${arg}`;\n case \"bigint\":\n return `${arg}`;\n case \"boolean\":\n return `${arg}`;\n case \"symbol\":\n throw new Error(\"Cannot stringify a symbol to send as gql arg\");\n case \"undefined\":\n return \"null\";\n case \"function\":\n throw new Error(\"Cannot stringify a function to send as gql arg\");\n }\n\n throw new Error(\"Cannot stringify an unknown type\");\n}\n","import type { Client } from \"@urql/core\";\nimport type { IntrospectionQuery } from \"graphql\";\nimport { makeGraphQLQueryRequest } from \"./request\";\nimport type { QueryableObjectFromGeneratedTypes } from \"./types\";\n\nexport function makeLiveQuery<\n Query extends Record<string, any>,\n ForceReactivity extends boolean = false,\n>({\n urqlClient,\n availableSubscriptions,\n forceReactivity,\n schema,\n autoIncludeIdField,\n}: {\n urqlClient: Client;\n schema: IntrospectionQuery;\n availableSubscriptions: Set<string>;\n forceReactivity?: ForceReactivity;\n autoIncludeIdField?: string;\n}) {\n return new Proxy(\n {},\n {\n get: (_target, prop) => {\n return (input: Record<string, any>) => {\n return makeGraphQLQueryRequest({\n queryName: prop as string,\n input,\n client: urqlClient,\n enableSubscription: availableSubscriptions.has(prop as string),\n forceReactivity,\n schema,\n autoIncludeIdField,\n });\n };\n },\n },\n ) as QueryableObjectFromGeneratedTypes<Query, ForceReactivity>;\n}\n","import type { Client } from \"@urql/core\";\nimport type { IntrospectionQuery } from \"graphql\";\nimport { makeGraphQLMutationRequest } from \"./request\";\nimport type { QueryableObjectFromGeneratedTypes } from \"./types\";\n\nexport function makeMutation<Mutation extends Record<string, any>>({\n urqlClient,\n schema,\n autoIncludeIdField,\n}: {\n urqlClient: Client;\n schema: IntrospectionQuery;\n autoIncludeIdField?: string;\n}) {\n return new Proxy(\n {},\n {\n get: (_target, prop) => {\n return (input: Record<string, any>) => {\n return makeGraphQLMutationRequest({\n mutationName: prop as string,\n input,\n client: urqlClient,\n schema,\n autoIncludeIdField,\n });\n };\n },\n },\n ) as QueryableObjectFromGeneratedTypes<Mutation, false>;\n}\n","/**\n * Recursively applies a mapping function to every value in a nested structure.\n *\n * This helper will traverse arrays and plain objects (objects with `constructor === Object`)\n * and apply the provided `fn` to any value that is not an array or a plain object.\n * - Arrays are mapped to new arrays (a fresh array is returned).\n * - Plain objects are traversed and their own enumerable properties are replaced in-place.\n * - Non-plain objects (e.g. Date, Map, Set, class instances, functions) are treated as leaves\n * and passed directly to `fn`.\n * - `null` and `undefined` are passed to `fn`.\n * - Circular references are detected using a `WeakSet`. When a circular reference is encountered,\n * the original reference is returned unchanged (it is not re-traversed or re-mapped).\n *\n * Note: Because plain objects are mutated in-place, callers who need immutability should first\n * clone the object graph or pass a deep-cloned input to avoid modifying the original.\n *\n * @param input - The value to traverse and map. May be any value (primitive, array, object, etc.).\n * @param fn - A function invoked for every non-array, non-plain-object value encountered.\n * Receives the current value and should return the mapped value.\n * @returns The transformed structure: arrays are returned as new arrays, plain objects are the\n * same object instances with their property values replaced, and other values are the\n * result of `fn`.\n *\n * @example\n * // Map all primitive values to their string representation:\n * // const result = mapValuesDeep({ a: 1, b: [2, { c: 3 }] }, v => String(v));\n * // result => { a: \"1\", b: [\"2\", { c: \"3\" }] }\n *\n * @remarks\n * - Only plain objects (constructed by `Object`) are recursively traversed. This avoids\n * unintentionally iterating internal structure of class instances or built-in collections.\n * - Circular structures are preserved by returning the original reference when detected.\n */\nexport function mapValuesDeep(input: any, fn: (value: any) => any) {\n const seen = new WeakSet();\n\n const recurse = (value: any): any => {\n if (Array.isArray(value)) {\n return value.map(recurse);\n }\n\n if (\n value !== null &&\n value !== undefined &&\n typeof value === \"object\" &&\n value.constructor === Object\n ) {\n if (seen.has(value)) return value;\n seen.add(value);\n for (const key of Object.keys(value)) {\n value[key] = recurse(value[key]);\n }\n return value;\n }\n\n return fn(value);\n };\n\n return recurse(input);\n}\n","import type { Exchange } from \"@urql/core\";\nimport { map, pipe } from \"wonka\";\nimport { mapValuesDeep } from \"../helpers/deepMap\";\n\nconst dateIsoRegex =\n /^\\d{4}-\\d{2}-\\d{2}(?:[Tt ]\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:[Zz]|[+-]\\d{2}:\\d{2})?)?$/;\n\nexport const nativeDateExchange: Exchange = ({ client, forward }) => {\n return (operations$) => {\n const operationResult$ = forward(operations$);\n\n return pipe(\n operationResult$,\n map((r) => {\n r.data = mapValuesDeep(r.data, (value) => {\n if (typeof value !== \"string\" || !dateIsoRegex.test(value)) {\n return value;\n }\n\n const date = Date.parse(value);\n if (!Number.isNaN(date)) {\n return new Date(date);\n }\n\n return value;\n });\n return r;\n }),\n );\n };\n};\n","import type { Client } from \"@urql/core\";\nimport type { IntrospectionQuery } from \"graphql\";\nimport { makeGraphQLQueryRequest } from \"./request\";\nimport type { QueryableObjectFromGeneratedTypes } from \"./types\";\n\nexport function makeQuery<\n Query extends Record<string, any>,\n ForceReactivity extends boolean = false,\n>({\n urqlClient,\n forceReactivity,\n schema,\n autoIncludeIdField,\n}: {\n urqlClient: Client;\n forceReactivity?: ForceReactivity;\n schema: IntrospectionQuery;\n autoIncludeIdField?: string;\n}) {\n return new Proxy(\n {},\n {\n get: (_target, prop) => {\n return (input?: Record<string, any>) => {\n return makeGraphQLQueryRequest({\n queryName: prop as string,\n input,\n client: urqlClient,\n enableSubscription: false,\n forceReactivity,\n schema,\n autoIncludeIdField,\n });\n };\n },\n },\n ) as QueryableObjectFromGeneratedTypes<Query, ForceReactivity>;\n}\n","import type { Client } from \"@urql/core\";\nimport type { IntrospectionQuery } from \"graphql\";\nimport { argsKey, makeGraphQLSubscriptionRequest } from \"./request\";\nimport type {\n ApplySelection,\n ObjectFieldSelection,\n Subscribeable,\n} from \"./types\";\nimport type { UnArray } from \"./utilTypes\";\n\nexport function makeSubscription<Subscription extends Record<string, any>>({\n urqlClient,\n schema,\n autoIncludeIdField,\n}: {\n urqlClient: Client;\n schema: IntrospectionQuery;\n autoIncludeIdField?: string;\n}) {\n return new Proxy(\n {},\n {\n get: (_target, prop) => {\n return (input: Record<string, any>) => {\n return makeGraphQLSubscriptionRequest({\n subscriptionName: prop as string,\n input,\n client: urqlClient,\n schema,\n autoIncludeIdField,\n });\n };\n },\n },\n ) as SubscriptionObject<Subscription>;\n}\n\n// TODO use the query util types\n\nexport type SubscriptionObject<Q> = {\n [Key in keyof Q]: QueryableObjectField<Q[Key]>;\n};\n\ntype QueryableObjectField<T> = T extends (\n p: infer QueryArgs,\n) => infer QueryResponse\n ? <\n Selected extends QueryArgs extends Record<string, any>\n ? ObjectFieldSelection<UnArray<NonNullable<QueryResponse>>> & {\n [argsKey]: QueryArgs;\n }\n : ObjectFieldSelection<UnArray<NonNullable<QueryResponse>>>,\n >(\n s: Selected,\n ) => QueryResponse extends null\n ? Subscribeable<\n NonNullable<QueryResponse> extends Array<any>\n ? ApplySelection<UnArray<NonNullable<QueryResponse>>, Selected>[]\n : ApplySelection<UnArray<NonNullable<QueryResponse>>, Selected>\n > | null\n : Subscribeable<\n QueryResponse extends Array<any>\n ? ApplySelection<UnArray<QueryResponse>, Selected>[]\n : ApplySelection<UnArray<QueryResponse>, Selected>\n >\n : Subscribeable<T>;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.mjs","names":["merge"],"sources":["../lib/client/request.ts","../lib/client/liveQuery.ts","../lib/client/mutation.ts","../lib/helpers/deepMap.ts","../lib/client/nativeDateExchange.ts","../lib/client/query.ts","../lib/client/subscription.ts"],"sourcesContent":["import type { Client } from \"@urql/core\";\nimport { capitalize } from \"es-toolkit\";\nimport type {\n IntrospectionField,\n IntrospectionInputValue,\n IntrospectionQuery,\n IntrospectionType,\n} from \"graphql\";\nimport { DateResolver, DateTimeISOResolver } from \"graphql-scalars\";\nimport { createSubscriber } from \"svelte/reactivity\";\n\nimport {\n empty,\n map,\n merge,\n pipe,\n share,\n subscribe,\n take,\n toObservable,\n} from \"wonka\";\nimport { lazy } from \"../helpers/lazy\";\n\n// TODO: this could use some refactoring and less type check disable (remove uses of any)\n// TODO: the client needs tests\n\nexport const argsKey = \"__args\";\n\nfunction makeOperationString({\n operationVerb,\n queryName,\n schema,\n input,\n autoIncludeIdField,\n}: {\n operationVerb: \"query\" | \"subscription\" | \"mutation\";\n queryName: string;\n schema: IntrospectionQuery;\n input?: Record<string, any>;\n autoIncludeIdField?: string;\n}) {\n const otwQueryName = `${capitalize(queryName)}${capitalize(operationVerb)}`;\n const field = schema.__schema.types\n .filter((t) => t.kind === \"OBJECT\")\n .find((t) => t.name === schema.__schema[`${operationVerb}Type`]!.name)!\n .fields.find((f) => f.name === queryName)!;\n const types = schema.__schema.types;\n\n const selectionString = input\n ? stringifySelection({ field, selection: input, types, autoIncludeIdField })\n : \"\";\n\n const argumentString = input?.[argsKey]\n ? stringifyArgumentObjectToGraphql({\n args: input[argsKey],\n fieldArgs: field.args,\n types,\n })\n : \"\";\n\n return `${operationVerb} ${otwQueryName} { ${queryName}${argumentString} ${selectionString}}`;\n}\n\nexport function makeGraphQLQueryRequest({\n queryName,\n schema,\n input,\n client,\n enableSubscription = false,\n forceReactivity,\n autoIncludeIdField,\n}: {\n queryName: string;\n schema: IntrospectionQuery;\n input?: Record<string, any>;\n client: Client;\n enableSubscription?: boolean;\n forceReactivity?: boolean;\n autoIncludeIdField?: string;\n}) {\n let currentData: any;\n const dataProxy = lazy(\n () =>\n new Proxy(currentData, {\n get(target, prop, receiver) {\n svelteSubscriber();\n const val = Reflect.get(currentData, prop, receiver);\n if (typeof val === \"function\") {\n return val.bind(currentData);\n }\n return val;\n },\n }),\n );\n\n const svelteSubscriber = createSubscriber((update) => {\n const unsub = observable.subscribe((d) => {\n update();\n });\n return () => unsub.unsubscribe();\n });\n\n const sharedSource = pipe(\n merge([\n client.query(\n makeOperationString({\n operationVerb: \"query\",\n queryName,\n input,\n schema,\n autoIncludeIdField,\n }),\n {},\n ),\n enableSubscription\n ? client.subscription(\n makeOperationString({\n operationVerb: \"subscription\",\n queryName,\n input,\n schema,\n autoIncludeIdField,\n }),\n {},\n )\n : empty,\n ]),\n share,\n );\n\n const observable = toObservable(\n pipe(\n sharedSource,\n map((v: any) => {\n if (v.error) {\n throw v.error;\n }\n\n const data = v.data?.[queryName];\n currentData = data;\n if (typeof data === \"object\" && data !== null) {\n return dataProxy();\n }\n return data;\n }),\n ),\n );\n\n const promise = new Promise<any>((resolve, reject) => {\n pipe(\n sharedSource,\n take(1),\n subscribe((v: any) => {\n if (v.error) {\n reject(v.error);\n return;\n }\n\n const data = v.data?.[queryName];\n currentData = data;\n if (typeof data !== \"object\" || data === null) {\n resolve(data);\n return;\n }\n if (typeof forceReactivity === \"boolean\" && forceReactivity) {\n resolve(observable);\n return;\n }\n try {\n const r = dataProxy();\n Object.assign(r, observable);\n resolve(r);\n } catch (err) {\n reject(err);\n }\n }),\n );\n });\n\n Object.assign(promise, observable);\n return promise;\n}\n\nexport function makeGraphQLMutationRequest({\n mutationName,\n input,\n client,\n schema,\n autoIncludeIdField,\n}: {\n mutationName: string;\n input: Record<string, any>;\n client: Client;\n schema: IntrospectionQuery;\n autoIncludeIdField?: string;\n}) {\n const sharedSource = pipe(\n client.mutation(\n makeOperationString({\n operationVerb: \"mutation\",\n queryName: mutationName,\n input,\n schema,\n autoIncludeIdField,\n }),\n {},\n ),\n share,\n );\n\n const observable = toObservable(\n pipe(\n sharedSource,\n map((v) => {\n if (v.error) {\n throw v.error;\n }\n\n const data = v.data?.[mutationName];\n return data;\n }),\n ),\n );\n\n const promise = new Promise<any>((resolve, reject) => {\n pipe(\n sharedSource,\n take(1),\n subscribe((v: any) => {\n if (v.error) {\n reject(v.error);\n return;\n }\n\n resolve(v.data?.[mutationName]);\n }),\n );\n });\n\n Object.assign(promise, observable);\n return promise;\n}\n\nexport function makeGraphQLSubscriptionRequest({\n subscriptionName,\n input,\n client,\n schema,\n autoIncludeIdField,\n}: {\n subscriptionName: string;\n input: Record<string, any>;\n client: Client;\n schema: IntrospectionQuery;\n autoIncludeIdField?: string;\n}) {\n return pipe(\n client.subscription(\n makeOperationString({\n operationVerb: \"subscription\",\n queryName: subscriptionName,\n input,\n schema,\n autoIncludeIdField,\n }),\n {},\n ),\n map((v) => {\n if (v.error) {\n throw v.error;\n }\n\n return v.data?.[subscriptionName];\n }),\n toObservable,\n ) as any;\n}\n\nfunction stringifySelection({\n field,\n selection,\n types,\n autoIncludeIdField,\n}: {\n selection: Record<string, any>;\n field: IntrospectionField;\n types: readonly IntrospectionType[];\n autoIncludeIdField?: string;\n}) {\n if (\n autoIncludeIdField &&\n typeof selection[autoIncludeIdField] === \"undefined\"\n ) {\n selection[autoIncludeIdField] = true;\n }\n\n const ret = Object.entries(selection)\n .filter(([key]) => key !== argsKey)\n .reduce((acc, [key, value]) => {\n if (typeof value === \"object\") {\n let argsString = \"\";\n if (value[argsKey]) {\n let type = field.type;\n\n if (type.kind === \"NON_NULL\") {\n type = type.ofType;\n }\n if (type.kind === \"LIST\") {\n type = type.ofType;\n }\n if (type.kind === \"NON_NULL\") {\n type = type.ofType;\n }\n\n const referenceObject = (types as any)\n .find((t: any) => t.name === (type as any).name)\n .fields.find((f: any) => f.name === key);\n\n argsString = stringifyArgumentObjectToGraphql({\n args: value[argsKey],\n types,\n fieldArgs: referenceObject.args,\n });\n }\n\n acc += `${key}${argsString} ${stringifySelection({\n field,\n selection: value,\n types,\n })}\n`;\n } else {\n if (typeof value === \"boolean\" && value) {\n acc += `${key}\n`;\n }\n }\n return acc;\n }, \"\");\n\n return `{\n${ret} }`;\n}\n\nfunction stringifyArgumentObjectToGraphql({\n args,\n fieldArgs,\n types,\n}: {\n args: Record<any, any>;\n fieldArgs: readonly IntrospectionInputValue[];\n types: readonly IntrospectionType[];\n}) {\n const entries = Object.entries(args);\n\n if (entries.length > 0) {\n return `(${entries\n .map(([key, value]) => {\n const gqlArg = fieldArgs.find((a) => a.name === key);\n\n if (!gqlArg) {\n throw new Error(\n `Argument ${key} not found in field args list ${JSON.stringify(fieldArgs.map((a) => a.name))}`,\n );\n }\n\n return `${key}: ${stringifyArgumentValue({ arg: value, gqlArg, types })}`;\n })\n .join(\", \")})`;\n }\n\n return \"\";\n}\n\nfunction stringifyArgumentValue({\n arg,\n gqlArg,\n types,\n}: {\n arg: any;\n gqlArg: IntrospectionInputValue;\n types: readonly IntrospectionType[];\n}): string {\n if (arg === null) {\n return \"null\";\n }\n\n if (Array.isArray(arg)) {\n return `[${arg\n .map((v) => {\n return stringifyArgumentValue({\n arg: v,\n types,\n gqlArg,\n });\n })\n .join(\", \")}]`;\n }\n\n const argtype = typeof arg;\n\n if (argtype === \"object\" && !(arg instanceof Date)) {\n let type = gqlArg.type;\n\n if (type.kind === \"NON_NULL\") {\n type = type.ofType;\n }\n if (type.kind === \"LIST\") {\n type = type.ofType;\n }\n if (type.kind === \"NON_NULL\") {\n type = type.ofType;\n }\n\n // if (type.kind !== \"INPUT_OBJECT\") {\n // throw new Error(\"Expected an INPUT_OBJECT type\");\n // }\n\n const referenceInputObject = types.find(\n (t) => t.name === (type as any).name,\n );\n\n if (!referenceInputObject) {\n throw new Error(\n `Expected an INPUT_OBJECT hit in name based lookup for name ${(type as any).name} with arg ${JSON.stringify(arg)}`,\n );\n }\n\n if (referenceInputObject.kind !== \"INPUT_OBJECT\") {\n throw new Error(\"Expected an INPUT_OBJECT hit in named based lookup\");\n }\n\n return `{ ${Object.entries(arg)\n .map(([key, value]) => {\n const subArgType = referenceInputObject.inputFields.find(\n (t) => t.name === key,\n );\n\n if (!subArgType) {\n throw new Error(\n `Expected an INPUT_OBJECT hit in named based lookup for name ${key} with arg ${referenceInputObject.inputFields.map((f) => f.name).join(\", \")}`,\n );\n }\n\n return `${key}: ${stringifyArgumentValue({ arg: value, types, gqlArg: subArgType })}`;\n })\n .join(\", \")} }`;\n }\n\n let type = gqlArg.type;\n\n if (type.kind === \"NON_NULL\") {\n type = type.ofType;\n }\n\n if (arg instanceof Date) {\n const name = (type as any).name;\n let value: string;\n switch (name) {\n case \"Date\":\n value = DateResolver.serialize(arg);\n break;\n case \"DateTime\":\n value = DateTimeISOResolver.serialize(arg);\n break;\n default:\n throw new Error(\n `Unrecognized date type ${name}, expected Date or DateTime`,\n );\n }\n return `\"${value}\"`;\n }\n\n switch (typeof arg) {\n case \"string\":\n return type.kind === \"ENUM\" ? arg : `\"${arg}\"`;\n case \"number\":\n return `${arg}`;\n case \"bigint\":\n return `${arg}`;\n case \"boolean\":\n return `${arg}`;\n case \"symbol\":\n throw new Error(\"Cannot stringify a symbol to send as gql arg\");\n case \"undefined\":\n return \"null\";\n case \"function\":\n throw new Error(\"Cannot stringify a function to send as gql arg\");\n }\n\n throw new Error(\"Cannot stringify an unknown type\");\n}\n","import type { Client } from \"@urql/core\";\nimport type { IntrospectionQuery } from \"graphql\";\nimport { makeGraphQLQueryRequest } from \"./request\";\nimport type { QueryableObjectFromGeneratedTypes } from \"./types\";\n\nexport function makeLiveQuery<\n Query extends Record<string, any>,\n ForceReactivity extends boolean = false,\n>({\n urqlClient,\n availableSubscriptions,\n forceReactivity,\n schema,\n autoIncludeIdField,\n}: {\n urqlClient: Client;\n schema: IntrospectionQuery;\n availableSubscriptions: Set<string>;\n forceReactivity?: ForceReactivity;\n autoIncludeIdField?: string;\n}) {\n return new Proxy(\n {},\n {\n get: (_target, prop) => {\n return (input: Record<string, any>) => {\n return makeGraphQLQueryRequest({\n queryName: prop as string,\n input,\n client: urqlClient,\n enableSubscription: availableSubscriptions.has(prop as string),\n forceReactivity,\n schema,\n autoIncludeIdField,\n });\n };\n },\n },\n ) as QueryableObjectFromGeneratedTypes<Query, ForceReactivity>;\n}\n","import type { Client } from \"@urql/core\";\nimport type { IntrospectionQuery } from \"graphql\";\nimport { makeGraphQLMutationRequest } from \"./request\";\nimport type { QueryableObjectFromGeneratedTypes } from \"./types\";\n\nexport function makeMutation<Mutation extends Record<string, any>>({\n urqlClient,\n schema,\n autoIncludeIdField,\n}: {\n urqlClient: Client;\n schema: IntrospectionQuery;\n autoIncludeIdField?: string;\n}) {\n return new Proxy(\n {},\n {\n get: (_target, prop) => {\n return (input: Record<string, any>) => {\n return makeGraphQLMutationRequest({\n mutationName: prop as string,\n input,\n client: urqlClient,\n schema,\n autoIncludeIdField,\n });\n };\n },\n },\n ) as QueryableObjectFromGeneratedTypes<Mutation, false>;\n}\n","/**\n * Recursively applies a mapping function to every value in a nested structure.\n *\n * This helper will traverse arrays and plain objects (objects with `constructor === Object`)\n * and apply the provided `fn` to any value that is not an array or a plain object.\n * - Arrays are mapped to new arrays (a fresh array is returned).\n * - Plain objects are traversed and their own enumerable properties are replaced in-place.\n * - Non-plain objects (e.g. Date, Map, Set, class instances, functions) are treated as leaves\n * and passed directly to `fn`.\n * - `null` and `undefined` are passed to `fn`.\n * - Circular references are detected using a `WeakSet`. When a circular reference is encountered,\n * the original reference is returned unchanged (it is not re-traversed or re-mapped).\n *\n * Note: Because plain objects are mutated in-place, callers who need immutability should first\n * clone the object graph or pass a deep-cloned input to avoid modifying the original.\n *\n * @param input - The value to traverse and map. May be any value (primitive, array, object, etc.).\n * @param fn - A function invoked for every non-array, non-plain-object value encountered.\n * Receives the current value and should return the mapped value.\n * @returns The transformed structure: arrays are returned as new arrays, plain objects are the\n * same object instances with their property values replaced, and other values are the\n * result of `fn`.\n *\n * @example\n * // Map all primitive values to their string representation:\n * // const result = mapValuesDeep({ a: 1, b: [2, { c: 3 }] }, v => String(v));\n * // result => { a: \"1\", b: [\"2\", { c: \"3\" }] }\n *\n * @remarks\n * - Only plain objects (constructed by `Object`) are recursively traversed. This avoids\n * unintentionally iterating internal structure of class instances or built-in collections.\n * - Circular structures are preserved by returning the original reference when detected.\n */\nexport function mapValuesDeep(input: any, fn: (value: any) => any) {\n const seen = new WeakSet();\n\n const recurse = (value: any): any => {\n if (Array.isArray(value)) {\n return value.map(recurse);\n }\n\n if (\n value !== null &&\n value !== undefined &&\n typeof value === \"object\" &&\n value.constructor === Object\n ) {\n if (seen.has(value)) return value;\n seen.add(value);\n for (const key of Object.keys(value)) {\n value[key] = recurse(value[key]);\n }\n return value;\n }\n\n return fn(value);\n };\n\n return recurse(input);\n}\n","import type { Exchange } from \"@urql/core\";\nimport { map, pipe } from \"wonka\";\nimport { mapValuesDeep } from \"../helpers/deepMap\";\n\nconst dateIsoRegex =\n /^\\d{4}-\\d{2}-\\d{2}(?:[Tt ]\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:[Zz]|[+-]\\d{2}:\\d{2})?)?$/;\n\nexport const nativeDateExchange: Exchange = ({ client, forward }) => {\n return (operations$) => {\n const operationResult$ = forward(operations$);\n\n return pipe(\n operationResult$,\n map((r) => {\n r.data = mapValuesDeep(r.data, (value) => {\n if (typeof value !== \"string\" || !dateIsoRegex.test(value)) {\n return value;\n }\n\n const date = Date.parse(value);\n if (!Number.isNaN(date)) {\n return new Date(date);\n }\n\n return value;\n });\n return r;\n }),\n );\n };\n};\n","import type { Client } from \"@urql/core\";\nimport type { IntrospectionQuery } from \"graphql\";\nimport { makeGraphQLQueryRequest } from \"./request\";\nimport type { QueryableObjectFromGeneratedTypes } from \"./types\";\n\nexport function makeQuery<\n Query extends Record<string, any>,\n ForceReactivity extends boolean = false,\n>({\n urqlClient,\n forceReactivity,\n schema,\n autoIncludeIdField,\n}: {\n urqlClient: Client;\n forceReactivity?: ForceReactivity;\n schema: IntrospectionQuery;\n autoIncludeIdField?: string;\n}) {\n return new Proxy(\n {},\n {\n get: (_target, prop) => {\n return (input?: Record<string, any>) => {\n return makeGraphQLQueryRequest({\n queryName: prop as string,\n input,\n client: urqlClient,\n enableSubscription: false,\n forceReactivity,\n schema,\n autoIncludeIdField,\n });\n };\n },\n },\n ) as QueryableObjectFromGeneratedTypes<Query, ForceReactivity>;\n}\n","import type { Client } from \"@urql/core\";\nimport type { IntrospectionQuery } from \"graphql\";\nimport { argsKey, makeGraphQLSubscriptionRequest } from \"./request\";\nimport type {\n ApplySelection,\n ObjectFieldSelection,\n Subscribeable,\n} from \"./types\";\nimport type { UnArray } from \"./utilTypes\";\n\nexport function makeSubscription<Subscription extends Record<string, any>>({\n urqlClient,\n schema,\n autoIncludeIdField,\n}: {\n urqlClient: Client;\n schema: IntrospectionQuery;\n autoIncludeIdField?: string;\n}) {\n return new Proxy(\n {},\n {\n get: (_target, prop) => {\n return (input: Record<string, any>) => {\n return makeGraphQLSubscriptionRequest({\n subscriptionName: prop as string,\n input,\n client: urqlClient,\n schema,\n autoIncludeIdField,\n });\n };\n },\n },\n ) as SubscriptionObject<Subscription>;\n}\n\n// TODO use the query util types\n\nexport type SubscriptionObject<Q> = {\n [Key in keyof Q]: QueryableObjectField<Q[Key]>;\n};\n\ntype QueryableObjectField<T> = T extends (\n p: infer QueryArgs,\n) => infer QueryResponse\n ? <\n Selected extends QueryArgs extends Record<string, any>\n ? ObjectFieldSelection<UnArray<NonNullable<QueryResponse>>> & {\n [argsKey]: QueryArgs;\n }\n : ObjectFieldSelection<UnArray<NonNullable<QueryResponse>>>,\n >(\n s: Selected,\n ) => QueryResponse extends null\n ? Subscribeable<\n NonNullable<QueryResponse> extends Array<any>\n ? ApplySelection<UnArray<NonNullable<QueryResponse>>, Selected>[]\n : ApplySelection<UnArray<NonNullable<QueryResponse>>, Selected>\n > | null\n : Subscribeable<\n QueryResponse extends Array<any>\n ? ApplySelection<UnArray<QueryResponse>, Selected>[]\n : ApplySelection<UnArray<QueryResponse>, Selected>\n >\n : Subscribeable<T>;\n"],"mappings":"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"}
|
|
@@ -5,9 +5,15 @@ let node_path = require("node:path");
|
|
|
5
5
|
let _urql_introspection = require("@urql/introspection");
|
|
6
6
|
let devalue = require("devalue");
|
|
7
7
|
//#region lib/client/generate/client.ts
|
|
8
|
+
const autoGenerationPreamble = `// This file is auto-generated. Do not edit manually.
|
|
9
|
+
// @generated
|
|
10
|
+
/* eslint-disable */
|
|
11
|
+
// biome-ignore-all lint: This file is auto-generated
|
|
12
|
+
// biome-ignore-all assist: This file is auto-generated
|
|
13
|
+
// biome-ignore-all syntax: This file is auto-generated`;
|
|
8
14
|
function generateClient({ apiUrl, rumbleImportPath, useExternalUrqlClient, availableSubscriptions, schemaPath, forceReactivity, autoIncludeId }) {
|
|
9
15
|
const imports = [];
|
|
10
|
-
let code =
|
|
16
|
+
let code = autoGenerationPreamble;
|
|
11
17
|
const idInclude = typeof autoIncludeId === "string" ? `\n autoIncludeIdField: '${autoIncludeId}'` : autoIncludeId === true ? `\n autoIncludeIdField: 'id'` : "";
|
|
12
18
|
if (typeof useExternalUrqlClient === "string") imports.push(`import { urqlClient } from "${useExternalUrqlClient}";`);
|
|
13
19
|
imports.push(`import { Client, fetchExchange } from '@urql/core';`);
|
|
@@ -206,7 +212,7 @@ export type ${key} = ${rep};
|
|
|
206
212
|
});
|
|
207
213
|
imports.push(...c.imports);
|
|
208
214
|
code += c.code;
|
|
209
|
-
await Promise.all([(0, node_fs_promises.writeFile)((0, node_path.join)(outputPath, "client.ts"), `${imports.join("\n")}\n${code}`), (0, node_fs_promises.writeFile)((0, node_path.join)(outputPath, `${schemaFileName}.ts`), `
|
|
215
|
+
await Promise.all([(0, node_fs_promises.writeFile)((0, node_path.join)(outputPath, "client.ts"), `${imports.join("\n")}\n${code}`), (0, node_fs_promises.writeFile)((0, node_path.join)(outputPath, `${schemaFileName}.ts`), autoGenerationPreamble + `
|
|
210
216
|
import type { IntrospectionQuery } from "graphql";
|
|
211
217
|
export const schema = ${(0, devalue.uneval)((0, _urql_introspection.minifyIntrospectionQuery)((0, _urql_introspection.getIntrospectedSchema)(schema), {
|
|
212
218
|
includeEnums: true,
|
|
@@ -222,4 +228,4 @@ Object.defineProperty(exports, "generateFromSchema", {
|
|
|
222
228
|
}
|
|
223
229
|
});
|
|
224
230
|
|
|
225
|
-
//# sourceMappingURL=generate-
|
|
231
|
+
//# sourceMappingURL=generate-CqpjHD9X.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-CqpjHD9X.cjs","names":["GraphQLObjectType","GraphQLScalarType","GraphQLEnumType","GraphQLInputObjectType","GraphQLList","GraphQLNonNull"],"sources":["../lib/client/generate/client.ts","../lib/client/generate/tsRepresentation.ts","../lib/client/generate/generate.ts"],"sourcesContent":["export const autoGenerationPreamble = `// This file is auto-generated. Do not edit manually.\n// @generated\n/* eslint-disable */\n// biome-ignore-all lint: This file is auto-generated\n// biome-ignore-all assist: This file is auto-generated\n// biome-ignore-all syntax: This file is auto-generated`;\n\nexport function generateClient({\n apiUrl,\n rumbleImportPath,\n useExternalUrqlClient,\n availableSubscriptions,\n schemaPath,\n forceReactivity,\n autoIncludeId,\n}: {\n rumbleImportPath: string;\n useExternalUrqlClient: string | boolean;\n apiUrl?: string;\n availableSubscriptions: Set<string>;\n schemaPath: string;\n forceReactivity?: boolean;\n autoIncludeId?: string | boolean;\n}) {\n const imports: string[] = [];\n let code: string = autoGenerationPreamble;\n\n const idInclude =\n typeof autoIncludeId === \"string\"\n ? `\\n autoIncludeIdField: '${autoIncludeId}'`\n : autoIncludeId === true\n ? `\\n autoIncludeIdField: 'id'`\n : \"\";\n\n if (typeof useExternalUrqlClient === \"string\") {\n imports.push(`import { urqlClient } from \"${useExternalUrqlClient}\";`);\n }\n\n imports.push(`import { Client, fetchExchange } from '@urql/core';`);\n imports.push(`import { cacheExchange } from '@urql/exchange-graphcache';`);\n imports.push(`import { nativeDateExchange } from '${rumbleImportPath}';`);\n imports.push(`import { schema } from '${schemaPath}';`);\n\n imports.push(\n `import { makeLiveQuery, makeMutation, makeSubscription, makeQuery } from '${rumbleImportPath}';`,\n );\n\n const forceReactivityFieldString =\n typeof forceReactivity === \"boolean\" && forceReactivity\n ? `\\n forceReactivity: true`\n : \"\";\n const forceReactivityTypeString =\n typeof forceReactivity === \"boolean\" && forceReactivity ? \", true\" : \"\";\n\n code += `\nexport const defaultOptions: ConstructorParameters<Client>[0] = {\n url: \"${apiUrl ?? \"PLEASE PROVIDE A URL WHEN GENERATING OR IMPORT AN EXTERNAL URQL CLIENT\"}\",\n fetchSubscriptions: true,\n exchanges: [cacheExchange({ schema }), nativeDateExchange, fetchExchange],\n fetchOptions: {\n credentials: \"include\",\n },\n requestPolicy: \"cache-and-network\",\n}\n`;\n\n if (!useExternalUrqlClient) {\n code += `\nconst urqlClient = new Client(defaultOptions);\n`;\n }\n\n code += `\nexport const client = {\n /**\n * A query and subscription combination. First queries and if exists, also subscribes to a subscription of the same name.\n * Combines the results of both, so the result is first the query result and then live updates from the subscription.\n * Assumes that the query and subscription return the same fields as per default when using the rumble query helpers.\n * If no subscription with the same name exists, this will just be a query.\n *\n * Internally, this does some magic to make the data reactive with Svelte's reactivity system. But it can be used with other frameworks as well.\n */\n liveQuery: makeLiveQuery<Query${forceReactivityTypeString}>({\n\t urqlClient,\n\t availableSubscriptions: new Set([${availableSubscriptions\n .values()\n .toArray()\n .map((value) => `\"${value}\"`)\n .join(\", \")}]),\n\t\tschema,${forceReactivityFieldString}${idInclude}\n }),\n /**\n * A mutation that can be used to e.g. create, update or delete data.\n */\n mutate: makeMutation<Mutation>({\n\t urqlClient,\n\t\tschema,${idInclude}\n }),\n /**\n * A continuous stream of results that updates when the server sends new data.\n */\n subscribe: makeSubscription<Subscription>({\n\t urqlClient,\n\t\tschema,${idInclude}\n }),\n /**\n * A one-time fetch of data.\n */\n query: makeQuery<Query${forceReactivityTypeString}>({\n\t urqlClient,\n\t\tschema,${forceReactivityFieldString}${idInclude}\n }),\n}`;\n\n return {\n imports,\n code,\n };\n}\n","import {\n type GraphQLArgument,\n GraphQLEnumType,\n GraphQLInputObjectType,\n type GraphQLInputType,\n GraphQLList,\n GraphQLNonNull,\n GraphQLObjectType,\n type GraphQLOutputType,\n GraphQLScalarType,\n} from \"graphql\";\n\ntype GraphQLType =\n | GraphQLObjectType<any, any>\n | GraphQLEnumType\n | GraphQLInputObjectType\n | GraphQLScalarType;\n\nexport function makeTSRepresentation(model: GraphQLType) {\n if (model instanceof GraphQLObjectType) {\n return makeTSTypeFromObject(model);\n } else if (model instanceof GraphQLScalarType) {\n return mapGraphqlScalarToTSTypeString(model);\n } else if (model instanceof GraphQLEnumType) {\n return makeStringLiteralUnionFromEnum(model);\n } else if (model instanceof GraphQLInputObjectType) {\n return makeTSTypeFromInputObject(model);\n }\n\n throw new Error(`Unknown model type: ${model}`);\n}\n\nfunction makeTSTypeFromObject(model: GraphQLObjectType) {\n const stringifiedFields = new Map<string, string>();\n for (const [key, value] of Object.entries(model.getFields())) {\n stringifiedFields.set(key, makeTSObjectTypeField(value.type, value.args));\n }\n\n return `{\n ${stringifiedFields\n .entries()\n .map(([key, value]) => `${key}: ${value}`)\n .toArray()\n .join(\",\\n \")} \n}`;\n}\n\nfunction makeTSTypeFromInputObject(model: GraphQLInputObjectType) {\n const stringifiedFields = new Map<string, string>();\n for (const [key, value] of Object.entries(model.getFields())) {\n stringifiedFields.set(key, makeTSInputObjectTypeField(value.type));\n }\n\n return `{\n ${stringifiedFields\n .entries()\n .map(\n ([key, value]) =>\n `${key}${value.includes(\"| undefined\") ? \"?\" : \"\"}: ${value}`,\n )\n .toArray()\n .join(\",\\n \")} \n}`;\n}\n\nfunction makeTSObjectTypeField(\n returnType: GraphQLOutputType,\n args?: readonly GraphQLArgument[],\n) {\n let isNonNullReturnType = false;\n let isList = false;\n\n for (let index = 0; index < 3; index++) {\n if (returnType instanceof GraphQLList) {\n isList = true;\n returnType = returnType.ofType;\n }\n\n if (returnType instanceof GraphQLNonNull) {\n isNonNullReturnType = true;\n returnType = returnType.ofType;\n }\n }\n\n let returnTypeString = (returnType as any).name;\n\n if (isList) {\n returnTypeString += \"[]\";\n }\n\n if (!isNonNullReturnType) {\n returnTypeString += \" | null\";\n }\n\n const isRelationType = returnType instanceof GraphQLObjectType;\n\n const argsStringMap = new Map<string, string>();\n\n for (const arg of args ?? []) {\n argsStringMap.set(arg.name, stringifyTSObjectArg(arg.type));\n }\n\n if (isRelationType) {\n const makePOptional = argsStringMap\n .entries()\n .every(([, value]) => value.includes(\"| undefined\"));\n const argsString =\n (args ?? []).length > 0\n ? `p${makePOptional ? \"?\" : \"\"}: {\n ${argsStringMap\n .entries()\n .map(\n ([key, value]) =>\n ` ${key}${value.includes(\"| undefined\") ? \"?\" : \"\"}: ${value}`,\n )\n .toArray()\n .join(\",\\n \")}\n }`\n : \"\";\n\n return `(${argsString}) => ${returnTypeString}`;\n } else {\n return returnTypeString;\n }\n}\n\nfunction makeTSInputObjectTypeField(returnType: GraphQLInputType) {\n let isNonNullReturnType = false;\n let isList = false;\n\n for (let index = 0; index < 3; index++) {\n if (returnType instanceof GraphQLList) {\n isList = true;\n returnType = returnType.ofType;\n }\n\n if (returnType instanceof GraphQLNonNull) {\n isNonNullReturnType = true;\n returnType = returnType.ofType;\n }\n }\n\n let returnTypeString = (returnType as any).name;\n\n if (isList) {\n returnTypeString += \"[]\";\n }\n\n if (!isNonNullReturnType) {\n returnTypeString += \" | null | undefined\";\n } else if (isList) {\n returnTypeString += \" | undefined\";\n }\n\n return returnTypeString;\n}\n\nfunction stringifyTSObjectArg(arg: any) {\n let ret = \"unknown\";\n let isNullable = true;\n\n if (arg instanceof GraphQLNonNull) {\n isNullable = false;\n arg = arg.ofType;\n }\n\n if (\n arg instanceof GraphQLInputObjectType ||\n arg instanceof GraphQLScalarType\n ) {\n ret = arg.name;\n }\n\n if (isNullable) {\n ret += \" | null | undefined\"; // we also want undefined in args\n }\n\n return ret;\n}\n\nfunction mapGraphqlScalarToTSTypeString(arg: any) {\n switch (arg.name) {\n case \"ID\":\n return \"string\";\n case \"String\":\n return \"string\";\n case \"Boolean\":\n return \"boolean\";\n case \"Int\":\n return \"number\";\n case \"Float\":\n return \"number\";\n case \"Date\":\n return \"Date\";\n case \"DateTime\":\n return \"Date\";\n case \"JSON\":\n return \"any\";\n default:\n return \"unknown\";\n }\n}\n\nfunction makeStringLiteralUnionFromEnum(enumType: GraphQLEnumType) {\n return enumType\n .getValues()\n .map((value) => `\"${value.name}\"`)\n .join(\" | \");\n}\n","import { access, mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n getIntrospectedSchema,\n minifyIntrospectionQuery,\n} from \"@urql/introspection\";\nimport { uneval } from \"devalue\";\nimport type { GraphQLSchema } from \"graphql\";\nimport { autoGenerationPreamble, generateClient } from \"./client\";\nimport { makeTSRepresentation } from \"./tsRepresentation\";\n\nexport async function generateFromSchema({\n outputPath,\n schema,\n rumbleImportPath = \"@m1212e/rumble/client\",\n apiUrl,\n useExternalUrqlClient = false,\n removeExisting = true,\n forceReactivity,\n autoIncludeIdField,\n}: {\n schema: GraphQLSchema;\n outputPath: string;\n rumbleImportPath?: string;\n apiUrl?: string;\n useExternalUrqlClient?: boolean | string;\n removeExisting?: boolean;\n forceReactivity?: boolean;\n autoIncludeIdField?: string | boolean;\n}) {\n if (removeExisting) {\n try {\n await access(outputPath);\n await rm(outputPath, { recursive: true, force: true });\n } catch (_error) {}\n }\n\n await mkdir(outputPath, { recursive: true });\n\n if (!outputPath.endsWith(\"/\")) {\n outputPath += \"/\";\n }\n\n const imports: string[] = [];\n let code = \"\";\n\n const typeMap = new Map<string, any>();\n for (const [key, object] of Object.entries(schema.getTypeMap())) {\n if (key.startsWith(\"__\")) continue;\n typeMap.set(key, object);\n }\n\n for (const [key, object] of typeMap.entries()) {\n const rep = makeTSRepresentation(object);\n\n if (rep === key) {\n continue;\n }\n\n code += `\nexport type ${key} = ${rep};\n\t\t`;\n }\n\n const schemaFileName = \"schema\";\n\n const c = generateClient({\n apiUrl,\n schemaPath: `./${schemaFileName}`,\n useExternalUrqlClient,\n rumbleImportPath,\n availableSubscriptions: new Set(\n Object.keys(schema.getSubscriptionType()?.getFields() || {}),\n ),\n forceReactivity,\n autoIncludeId: autoIncludeIdField,\n });\n\n imports.push(...c.imports);\n code += c.code;\n\n await Promise.all([\n writeFile(join(outputPath, \"client.ts\"), `${imports.join(\"\\n\")}\\n${code}`),\n writeFile(\n join(outputPath, `${schemaFileName}.ts`),\n autoGenerationPreamble +\n `\nimport type { IntrospectionQuery } from \"graphql\";\nexport const schema = ${uneval(minifyIntrospectionQuery(getIntrospectedSchema(schema), { includeEnums: true, includeScalars: true, includeInputs: true }))} as IntrospectionQuery`,\n ),\n ]);\n}\n"],"mappings":";;;;;;;AAAA,MAAa,yBAAyB;;;;;;AAOtC,SAAgB,eAAe,EAC7B,QACA,kBACA,uBACA,wBACA,YACA,iBACA,iBASC;CACD,MAAM,UAAoB,EAAE;CAC5B,IAAI,OAAe;CAEnB,MAAM,YACJ,OAAO,kBAAkB,WACrB,8BAA8B,cAAc,KAC5C,kBAAkB,OAChB,mCACA;AAER,KAAI,OAAO,0BAA0B,SACnC,SAAQ,KAAK,+BAA+B,sBAAsB,IAAI;AAGxE,SAAQ,KAAK,sDAAsD;AACnE,SAAQ,KAAK,6DAA6D;AAC1E,SAAQ,KAAK,uCAAuC,iBAAiB,IAAI;AACzE,SAAQ,KAAK,2BAA2B,WAAW,IAAI;AAEvD,SAAQ,KACN,6EAA6E,iBAAiB,IAC/F;CAED,MAAM,6BACJ,OAAO,oBAAoB,aAAa,kBACpC,gCACA;CACN,MAAM,4BACJ,OAAO,oBAAoB,aAAa,kBAAkB,WAAW;AAEvE,SAAQ;;UAEA,UAAU,yEAAyE;;;;;;;;;AAU3F,KAAI,CAAC,sBACH,SAAQ;;;AAKV,SAAQ;;;;;;;;;;kCAUwB,0BAA0B;;sCAEtB,uBAC/B,QAAQ,CACR,SAAS,CACT,KAAK,UAAU,IAAI,MAAM,GAAG,CAC5B,KAAK,KAAK,CAAC;WACP,6BAA6B,UAAU;;;;;;;WAOvC,UAAU;;;;;;;WAOV,UAAU;;;;;0BAKK,0BAA0B;;WAEzC,6BAA6B,UAAU;;;AAIhD,QAAO;EACL;EACA;EACD;;;;ACnGH,SAAgB,qBAAqB,OAAoB;AACvD,KAAI,iBAAiBA,QAAAA,kBACnB,QAAO,qBAAqB,MAAM;UACzB,iBAAiBC,QAAAA,kBAC1B,QAAO,+BAA+B,MAAM;UACnC,iBAAiBC,QAAAA,gBAC1B,QAAO,+BAA+B,MAAM;UACnC,iBAAiBC,QAAAA,uBAC1B,QAAO,0BAA0B,MAAM;AAGzC,OAAM,IAAI,MAAM,uBAAuB,QAAQ;;AAGjD,SAAS,qBAAqB,OAA0B;CACtD,MAAM,oCAAoB,IAAI,KAAqB;AACnD,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,WAAW,CAAC,CAC1D,mBAAkB,IAAI,KAAK,sBAAsB,MAAM,MAAM,MAAM,KAAK,CAAC;AAG3E,QAAO;IACL,kBACC,SAAS,CACT,KAAK,CAAC,KAAK,WAAW,GAAG,IAAI,IAAI,QAAQ,CACzC,SAAS,CACT,KAAK,QAAQ,CAAC;;;AAInB,SAAS,0BAA0B,OAA+B;CAChE,MAAM,oCAAoB,IAAI,KAAqB;AACnD,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,WAAW,CAAC,CAC1D,mBAAkB,IAAI,KAAK,2BAA2B,MAAM,KAAK,CAAC;AAGpE,QAAO;IACL,kBACC,SAAS,CACT,KACE,CAAC,KAAK,WACL,GAAG,MAAM,MAAM,SAAS,cAAc,GAAG,MAAM,GAAG,IAAI,QACzD,CACA,SAAS,CACT,KAAK,QAAQ,CAAC;;;AAInB,SAAS,sBACP,YACA,MACA;CACA,IAAI,sBAAsB;CAC1B,IAAI,SAAS;AAEb,MAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS;AACtC,MAAI,sBAAsBC,QAAAA,aAAa;AACrC,YAAS;AACT,gBAAa,WAAW;;AAG1B,MAAI,sBAAsBC,QAAAA,gBAAgB;AACxC,yBAAsB;AACtB,gBAAa,WAAW;;;CAI5B,IAAI,mBAAoB,WAAmB;AAE3C,KAAI,OACF,qBAAoB;AAGtB,KAAI,CAAC,oBACH,qBAAoB;CAGtB,MAAM,iBAAiB,sBAAsBL,QAAAA;CAE7C,MAAM,gCAAgB,IAAI,KAAqB;AAE/C,MAAK,MAAM,OAAO,QAAQ,EAAE,CAC1B,eAAc,IAAI,IAAI,MAAM,qBAAqB,IAAI,KAAK,CAAC;AAG7D,KAAI,gBAAgB;EAClB,MAAM,gBAAgB,cACnB,SAAS,CACT,OAAO,GAAG,WAAW,MAAM,SAAS,cAAc,CAAC;AAetD,SAAO,KAbJ,QAAQ,EAAE,EAAE,SAAS,IAClB,IAAI,gBAAgB,MAAM,GAAG;IACnC,cACC,SAAS,CACT,KACE,CAAC,KAAK,WACL,KAAK,MAAM,MAAM,SAAS,cAAc,GAAG,MAAM,GAAG,IAAI,QAC3D,CACA,SAAS,CACT,KAAK,QAAQ,CAAC;OAET,GAEgB,OAAO;OAE7B,QAAO;;AAIX,SAAS,2BAA2B,YAA8B;CAChE,IAAI,sBAAsB;CAC1B,IAAI,SAAS;AAEb,MAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS;AACtC,MAAI,sBAAsBI,QAAAA,aAAa;AACrC,YAAS;AACT,gBAAa,WAAW;;AAG1B,MAAI,sBAAsBC,QAAAA,gBAAgB;AACxC,yBAAsB;AACtB,gBAAa,WAAW;;;CAI5B,IAAI,mBAAoB,WAAmB;AAE3C,KAAI,OACF,qBAAoB;AAGtB,KAAI,CAAC,oBACH,qBAAoB;UACX,OACT,qBAAoB;AAGtB,QAAO;;AAGT,SAAS,qBAAqB,KAAU;CACtC,IAAI,MAAM;CACV,IAAI,aAAa;AAEjB,KAAI,eAAeA,QAAAA,gBAAgB;AACjC,eAAa;AACb,QAAM,IAAI;;AAGZ,KACE,eAAeF,QAAAA,0BACf,eAAeF,QAAAA,kBAEf,OAAM,IAAI;AAGZ,KAAI,WACF,QAAO;AAGT,QAAO;;AAGT,SAAS,+BAA+B,KAAU;AAChD,SAAQ,IAAI,MAAZ;EACE,KAAK,KACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,KAAK,UACH,QAAO;EACT,KAAK,MACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK,WACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,QACE,QAAO;;;AAIb,SAAS,+BAA+B,UAA2B;AACjE,QAAO,SACJ,WAAW,CACX,KAAK,UAAU,IAAI,MAAM,KAAK,GAAG,CACjC,KAAK,MAAM;;;;ACpMhB,eAAsB,mBAAmB,EACvC,YACA,QACA,mBAAmB,yBACnB,QACA,wBAAwB,OACxB,iBAAiB,MACjB,iBACA,sBAUC;AACD,KAAI,eACF,KAAI;AACF,SAAA,GAAA,iBAAA,QAAa,WAAW;AACxB,SAAA,GAAA,iBAAA,IAAS,YAAY;GAAE,WAAW;GAAM,OAAO;GAAM,CAAC;UAC/C,QAAQ;AAGnB,QAAA,GAAA,iBAAA,OAAY,YAAY,EAAE,WAAW,MAAM,CAAC;AAE5C,KAAI,CAAC,WAAW,SAAS,IAAI,CAC3B,eAAc;CAGhB,MAAM,UAAoB,EAAE;CAC5B,IAAI,OAAO;CAEX,MAAM,0BAAU,IAAI,KAAkB;AACtC,MAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,OAAO,YAAY,CAAC,EAAE;AAC/D,MAAI,IAAI,WAAW,KAAK,CAAE;AAC1B,UAAQ,IAAI,KAAK,OAAO;;AAG1B,MAAK,MAAM,CAAC,KAAK,WAAW,QAAQ,SAAS,EAAE;EAC7C,MAAM,MAAM,qBAAqB,OAAO;AAExC,MAAI,QAAQ,IACV;AAGF,UAAQ;cACE,IAAI,KAAK,IAAI;;;CAIzB,MAAM,iBAAiB;CAEvB,MAAM,IAAI,eAAe;EACvB;EACA,YAAY,KAAK;EACjB;EACA;EACA,wBAAwB,IAAI,IAC1B,OAAO,KAAK,OAAO,qBAAqB,EAAE,WAAW,IAAI,EAAE,CAAC,CAC7D;EACD;EACA,eAAe;EAChB,CAAC;AAEF,SAAQ,KAAK,GAAG,EAAE,QAAQ;AAC1B,SAAQ,EAAE;AAEV,OAAM,QAAQ,IAAI,EAAA,GAAA,iBAAA,YAAA,GAAA,UAAA,MACD,YAAY,YAAY,EAAE,GAAG,QAAQ,KAAK,KAAK,CAAC,IAAI,OAAO,GAAA,GAAA,iBAAA,YAAA,GAAA,UAAA,MAEnE,YAAY,GAAG,eAAe,KAAK,EACxC,yBACE;;6IAEsE,OAAO,EAAE;EAAE,cAAc;EAAM,gBAAgB;EAAM,eAAe;EAAM,CAAC,CAAC,CAAC,wBACtJ,CACF,CAAC"}
|
|
@@ -4,9 +4,15 @@ import { join } from "node:path";
|
|
|
4
4
|
import { getIntrospectedSchema, minifyIntrospectionQuery } from "@urql/introspection";
|
|
5
5
|
import { uneval } from "devalue";
|
|
6
6
|
//#region lib/client/generate/client.ts
|
|
7
|
+
const autoGenerationPreamble = `// This file is auto-generated. Do not edit manually.
|
|
8
|
+
// @generated
|
|
9
|
+
/* eslint-disable */
|
|
10
|
+
// biome-ignore-all lint: This file is auto-generated
|
|
11
|
+
// biome-ignore-all assist: This file is auto-generated
|
|
12
|
+
// biome-ignore-all syntax: This file is auto-generated`;
|
|
7
13
|
function generateClient({ apiUrl, rumbleImportPath, useExternalUrqlClient, availableSubscriptions, schemaPath, forceReactivity, autoIncludeId }) {
|
|
8
14
|
const imports = [];
|
|
9
|
-
let code =
|
|
15
|
+
let code = autoGenerationPreamble;
|
|
10
16
|
const idInclude = typeof autoIncludeId === "string" ? `\n autoIncludeIdField: '${autoIncludeId}'` : autoIncludeId === true ? `\n autoIncludeIdField: 'id'` : "";
|
|
11
17
|
if (typeof useExternalUrqlClient === "string") imports.push(`import { urqlClient } from "${useExternalUrqlClient}";`);
|
|
12
18
|
imports.push(`import { Client, fetchExchange } from '@urql/core';`);
|
|
@@ -205,7 +211,7 @@ export type ${key} = ${rep};
|
|
|
205
211
|
});
|
|
206
212
|
imports.push(...c.imports);
|
|
207
213
|
code += c.code;
|
|
208
|
-
await Promise.all([writeFile(join(outputPath, "client.ts"), `${imports.join("\n")}\n${code}`), writeFile(join(outputPath, `${schemaFileName}.ts`), `
|
|
214
|
+
await Promise.all([writeFile(join(outputPath, "client.ts"), `${imports.join("\n")}\n${code}`), writeFile(join(outputPath, `${schemaFileName}.ts`), autoGenerationPreamble + `
|
|
209
215
|
import type { IntrospectionQuery } from "graphql";
|
|
210
216
|
export const schema = ${uneval(minifyIntrospectionQuery(getIntrospectedSchema(schema), {
|
|
211
217
|
includeEnums: true,
|
|
@@ -216,4 +222,4 @@ export const schema = ${uneval(minifyIntrospectionQuery(getIntrospectedSchema(sc
|
|
|
216
222
|
//#endregion
|
|
217
223
|
export { generateFromSchema as t };
|
|
218
224
|
|
|
219
|
-
//# sourceMappingURL=generate-
|
|
225
|
+
//# sourceMappingURL=generate-D2VqOgQa.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-D2VqOgQa.mjs","names":[],"sources":["../lib/client/generate/client.ts","../lib/client/generate/tsRepresentation.ts","../lib/client/generate/generate.ts"],"sourcesContent":["export const autoGenerationPreamble = `// This file is auto-generated. Do not edit manually.\n// @generated\n/* eslint-disable */\n// biome-ignore-all lint: This file is auto-generated\n// biome-ignore-all assist: This file is auto-generated\n// biome-ignore-all syntax: This file is auto-generated`;\n\nexport function generateClient({\n apiUrl,\n rumbleImportPath,\n useExternalUrqlClient,\n availableSubscriptions,\n schemaPath,\n forceReactivity,\n autoIncludeId,\n}: {\n rumbleImportPath: string;\n useExternalUrqlClient: string | boolean;\n apiUrl?: string;\n availableSubscriptions: Set<string>;\n schemaPath: string;\n forceReactivity?: boolean;\n autoIncludeId?: string | boolean;\n}) {\n const imports: string[] = [];\n let code: string = autoGenerationPreamble;\n\n const idInclude =\n typeof autoIncludeId === \"string\"\n ? `\\n autoIncludeIdField: '${autoIncludeId}'`\n : autoIncludeId === true\n ? `\\n autoIncludeIdField: 'id'`\n : \"\";\n\n if (typeof useExternalUrqlClient === \"string\") {\n imports.push(`import { urqlClient } from \"${useExternalUrqlClient}\";`);\n }\n\n imports.push(`import { Client, fetchExchange } from '@urql/core';`);\n imports.push(`import { cacheExchange } from '@urql/exchange-graphcache';`);\n imports.push(`import { nativeDateExchange } from '${rumbleImportPath}';`);\n imports.push(`import { schema } from '${schemaPath}';`);\n\n imports.push(\n `import { makeLiveQuery, makeMutation, makeSubscription, makeQuery } from '${rumbleImportPath}';`,\n );\n\n const forceReactivityFieldString =\n typeof forceReactivity === \"boolean\" && forceReactivity\n ? `\\n forceReactivity: true`\n : \"\";\n const forceReactivityTypeString =\n typeof forceReactivity === \"boolean\" && forceReactivity ? \", true\" : \"\";\n\n code += `\nexport const defaultOptions: ConstructorParameters<Client>[0] = {\n url: \"${apiUrl ?? \"PLEASE PROVIDE A URL WHEN GENERATING OR IMPORT AN EXTERNAL URQL CLIENT\"}\",\n fetchSubscriptions: true,\n exchanges: [cacheExchange({ schema }), nativeDateExchange, fetchExchange],\n fetchOptions: {\n credentials: \"include\",\n },\n requestPolicy: \"cache-and-network\",\n}\n`;\n\n if (!useExternalUrqlClient) {\n code += `\nconst urqlClient = new Client(defaultOptions);\n`;\n }\n\n code += `\nexport const client = {\n /**\n * A query and subscription combination. First queries and if exists, also subscribes to a subscription of the same name.\n * Combines the results of both, so the result is first the query result and then live updates from the subscription.\n * Assumes that the query and subscription return the same fields as per default when using the rumble query helpers.\n * If no subscription with the same name exists, this will just be a query.\n *\n * Internally, this does some magic to make the data reactive with Svelte's reactivity system. But it can be used with other frameworks as well.\n */\n liveQuery: makeLiveQuery<Query${forceReactivityTypeString}>({\n\t urqlClient,\n\t availableSubscriptions: new Set([${availableSubscriptions\n .values()\n .toArray()\n .map((value) => `\"${value}\"`)\n .join(\", \")}]),\n\t\tschema,${forceReactivityFieldString}${idInclude}\n }),\n /**\n * A mutation that can be used to e.g. create, update or delete data.\n */\n mutate: makeMutation<Mutation>({\n\t urqlClient,\n\t\tschema,${idInclude}\n }),\n /**\n * A continuous stream of results that updates when the server sends new data.\n */\n subscribe: makeSubscription<Subscription>({\n\t urqlClient,\n\t\tschema,${idInclude}\n }),\n /**\n * A one-time fetch of data.\n */\n query: makeQuery<Query${forceReactivityTypeString}>({\n\t urqlClient,\n\t\tschema,${forceReactivityFieldString}${idInclude}\n }),\n}`;\n\n return {\n imports,\n code,\n };\n}\n","import {\n type GraphQLArgument,\n GraphQLEnumType,\n GraphQLInputObjectType,\n type GraphQLInputType,\n GraphQLList,\n GraphQLNonNull,\n GraphQLObjectType,\n type GraphQLOutputType,\n GraphQLScalarType,\n} from \"graphql\";\n\ntype GraphQLType =\n | GraphQLObjectType<any, any>\n | GraphQLEnumType\n | GraphQLInputObjectType\n | GraphQLScalarType;\n\nexport function makeTSRepresentation(model: GraphQLType) {\n if (model instanceof GraphQLObjectType) {\n return makeTSTypeFromObject(model);\n } else if (model instanceof GraphQLScalarType) {\n return mapGraphqlScalarToTSTypeString(model);\n } else if (model instanceof GraphQLEnumType) {\n return makeStringLiteralUnionFromEnum(model);\n } else if (model instanceof GraphQLInputObjectType) {\n return makeTSTypeFromInputObject(model);\n }\n\n throw new Error(`Unknown model type: ${model}`);\n}\n\nfunction makeTSTypeFromObject(model: GraphQLObjectType) {\n const stringifiedFields = new Map<string, string>();\n for (const [key, value] of Object.entries(model.getFields())) {\n stringifiedFields.set(key, makeTSObjectTypeField(value.type, value.args));\n }\n\n return `{\n ${stringifiedFields\n .entries()\n .map(([key, value]) => `${key}: ${value}`)\n .toArray()\n .join(\",\\n \")} \n}`;\n}\n\nfunction makeTSTypeFromInputObject(model: GraphQLInputObjectType) {\n const stringifiedFields = new Map<string, string>();\n for (const [key, value] of Object.entries(model.getFields())) {\n stringifiedFields.set(key, makeTSInputObjectTypeField(value.type));\n }\n\n return `{\n ${stringifiedFields\n .entries()\n .map(\n ([key, value]) =>\n `${key}${value.includes(\"| undefined\") ? \"?\" : \"\"}: ${value}`,\n )\n .toArray()\n .join(\",\\n \")} \n}`;\n}\n\nfunction makeTSObjectTypeField(\n returnType: GraphQLOutputType,\n args?: readonly GraphQLArgument[],\n) {\n let isNonNullReturnType = false;\n let isList = false;\n\n for (let index = 0; index < 3; index++) {\n if (returnType instanceof GraphQLList) {\n isList = true;\n returnType = returnType.ofType;\n }\n\n if (returnType instanceof GraphQLNonNull) {\n isNonNullReturnType = true;\n returnType = returnType.ofType;\n }\n }\n\n let returnTypeString = (returnType as any).name;\n\n if (isList) {\n returnTypeString += \"[]\";\n }\n\n if (!isNonNullReturnType) {\n returnTypeString += \" | null\";\n }\n\n const isRelationType = returnType instanceof GraphQLObjectType;\n\n const argsStringMap = new Map<string, string>();\n\n for (const arg of args ?? []) {\n argsStringMap.set(arg.name, stringifyTSObjectArg(arg.type));\n }\n\n if (isRelationType) {\n const makePOptional = argsStringMap\n .entries()\n .every(([, value]) => value.includes(\"| undefined\"));\n const argsString =\n (args ?? []).length > 0\n ? `p${makePOptional ? \"?\" : \"\"}: {\n ${argsStringMap\n .entries()\n .map(\n ([key, value]) =>\n ` ${key}${value.includes(\"| undefined\") ? \"?\" : \"\"}: ${value}`,\n )\n .toArray()\n .join(\",\\n \")}\n }`\n : \"\";\n\n return `(${argsString}) => ${returnTypeString}`;\n } else {\n return returnTypeString;\n }\n}\n\nfunction makeTSInputObjectTypeField(returnType: GraphQLInputType) {\n let isNonNullReturnType = false;\n let isList = false;\n\n for (let index = 0; index < 3; index++) {\n if (returnType instanceof GraphQLList) {\n isList = true;\n returnType = returnType.ofType;\n }\n\n if (returnType instanceof GraphQLNonNull) {\n isNonNullReturnType = true;\n returnType = returnType.ofType;\n }\n }\n\n let returnTypeString = (returnType as any).name;\n\n if (isList) {\n returnTypeString += \"[]\";\n }\n\n if (!isNonNullReturnType) {\n returnTypeString += \" | null | undefined\";\n } else if (isList) {\n returnTypeString += \" | undefined\";\n }\n\n return returnTypeString;\n}\n\nfunction stringifyTSObjectArg(arg: any) {\n let ret = \"unknown\";\n let isNullable = true;\n\n if (arg instanceof GraphQLNonNull) {\n isNullable = false;\n arg = arg.ofType;\n }\n\n if (\n arg instanceof GraphQLInputObjectType ||\n arg instanceof GraphQLScalarType\n ) {\n ret = arg.name;\n }\n\n if (isNullable) {\n ret += \" | null | undefined\"; // we also want undefined in args\n }\n\n return ret;\n}\n\nfunction mapGraphqlScalarToTSTypeString(arg: any) {\n switch (arg.name) {\n case \"ID\":\n return \"string\";\n case \"String\":\n return \"string\";\n case \"Boolean\":\n return \"boolean\";\n case \"Int\":\n return \"number\";\n case \"Float\":\n return \"number\";\n case \"Date\":\n return \"Date\";\n case \"DateTime\":\n return \"Date\";\n case \"JSON\":\n return \"any\";\n default:\n return \"unknown\";\n }\n}\n\nfunction makeStringLiteralUnionFromEnum(enumType: GraphQLEnumType) {\n return enumType\n .getValues()\n .map((value) => `\"${value.name}\"`)\n .join(\" | \");\n}\n","import { access, mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n getIntrospectedSchema,\n minifyIntrospectionQuery,\n} from \"@urql/introspection\";\nimport { uneval } from \"devalue\";\nimport type { GraphQLSchema } from \"graphql\";\nimport { autoGenerationPreamble, generateClient } from \"./client\";\nimport { makeTSRepresentation } from \"./tsRepresentation\";\n\nexport async function generateFromSchema({\n outputPath,\n schema,\n rumbleImportPath = \"@m1212e/rumble/client\",\n apiUrl,\n useExternalUrqlClient = false,\n removeExisting = true,\n forceReactivity,\n autoIncludeIdField,\n}: {\n schema: GraphQLSchema;\n outputPath: string;\n rumbleImportPath?: string;\n apiUrl?: string;\n useExternalUrqlClient?: boolean | string;\n removeExisting?: boolean;\n forceReactivity?: boolean;\n autoIncludeIdField?: string | boolean;\n}) {\n if (removeExisting) {\n try {\n await access(outputPath);\n await rm(outputPath, { recursive: true, force: true });\n } catch (_error) {}\n }\n\n await mkdir(outputPath, { recursive: true });\n\n if (!outputPath.endsWith(\"/\")) {\n outputPath += \"/\";\n }\n\n const imports: string[] = [];\n let code = \"\";\n\n const typeMap = new Map<string, any>();\n for (const [key, object] of Object.entries(schema.getTypeMap())) {\n if (key.startsWith(\"__\")) continue;\n typeMap.set(key, object);\n }\n\n for (const [key, object] of typeMap.entries()) {\n const rep = makeTSRepresentation(object);\n\n if (rep === key) {\n continue;\n }\n\n code += `\nexport type ${key} = ${rep};\n\t\t`;\n }\n\n const schemaFileName = \"schema\";\n\n const c = generateClient({\n apiUrl,\n schemaPath: `./${schemaFileName}`,\n useExternalUrqlClient,\n rumbleImportPath,\n availableSubscriptions: new Set(\n Object.keys(schema.getSubscriptionType()?.getFields() || {}),\n ),\n forceReactivity,\n autoIncludeId: autoIncludeIdField,\n });\n\n imports.push(...c.imports);\n code += c.code;\n\n await Promise.all([\n writeFile(join(outputPath, \"client.ts\"), `${imports.join(\"\\n\")}\\n${code}`),\n writeFile(\n join(outputPath, `${schemaFileName}.ts`),\n autoGenerationPreamble +\n `\nimport type { IntrospectionQuery } from \"graphql\";\nexport const schema = ${uneval(minifyIntrospectionQuery(getIntrospectedSchema(schema), { includeEnums: true, includeScalars: true, includeInputs: true }))} as IntrospectionQuery`,\n ),\n ]);\n}\n"],"mappings":"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"}
|
package/out/index.cjs
CHANGED
|
@@ -22,7 +22,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
22
22
|
}) : target, mod));
|
|
23
23
|
//#endregion
|
|
24
24
|
const require_lazy = require("./lazy-DT--QoPa.cjs");
|
|
25
|
-
const require_generate = require("./generate-
|
|
25
|
+
const require_generate = require("./generate-CqpjHD9X.cjs");
|
|
26
26
|
let graphql = require("graphql");
|
|
27
27
|
let _escape_tech_graphql_armor = require("@escape.tech/graphql-armor");
|
|
28
28
|
let _graphql_yoga_plugin_disable_introspection = require("@graphql-yoga/plugin-disable-introspection");
|
|
@@ -209,7 +209,7 @@ function mapNullFieldsToUndefined(obj) {
|
|
|
209
209
|
}
|
|
210
210
|
//#endregion
|
|
211
211
|
//#region package.json
|
|
212
|
-
var version = "0.16.
|
|
212
|
+
var version = "0.16.40";
|
|
213
213
|
//#endregion
|
|
214
214
|
//#region lib/helpers/mergeFilters.ts
|
|
215
215
|
function mergeFilters(filterA, filterB) {
|
package/out/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as lazy } from "./lazy-BgeBy3-B.mjs";
|
|
2
|
-
import { t as generateFromSchema } from "./generate-
|
|
2
|
+
import { t as generateFromSchema } from "./generate-D2VqOgQa.mjs";
|
|
3
3
|
import { GraphQLError } from "graphql";
|
|
4
4
|
import { EnvelopArmorPlugin } from "@escape.tech/graphql-armor";
|
|
5
5
|
import { useDisableIntrospection } from "@graphql-yoga/plugin-disable-introspection";
|
|
@@ -181,7 +181,7 @@ function mapNullFieldsToUndefined(obj) {
|
|
|
181
181
|
}
|
|
182
182
|
//#endregion
|
|
183
183
|
//#region package.json
|
|
184
|
-
var version = "0.16.
|
|
184
|
+
var version = "0.16.40";
|
|
185
185
|
//#endregion
|
|
186
186
|
//#region lib/helpers/mergeFilters.ts
|
|
187
187
|
function mergeFilters(filterA, filterB) {
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generate-CwAZQRah.mjs","names":[],"sources":["../lib/client/generate/client.ts","../lib/client/generate/tsRepresentation.ts","../lib/client/generate/generate.ts"],"sourcesContent":["export function generateClient({\n apiUrl,\n rumbleImportPath,\n useExternalUrqlClient,\n availableSubscriptions,\n schemaPath,\n forceReactivity,\n autoIncludeId,\n}: {\n rumbleImportPath: string;\n useExternalUrqlClient: string | boolean;\n apiUrl?: string;\n availableSubscriptions: Set<string>;\n schemaPath: string;\n forceReactivity?: boolean;\n autoIncludeId?: string | boolean;\n}) {\n const imports: string[] = [];\n let code: string = \"\";\n\n const idInclude =\n typeof autoIncludeId === \"string\"\n ? `\\n autoIncludeIdField: '${autoIncludeId}'`\n : autoIncludeId === true\n ? `\\n autoIncludeIdField: 'id'`\n : \"\";\n\n if (typeof useExternalUrqlClient === \"string\") {\n imports.push(`import { urqlClient } from \"${useExternalUrqlClient}\";`);\n }\n\n imports.push(`import { Client, fetchExchange } from '@urql/core';`);\n imports.push(`import { cacheExchange } from '@urql/exchange-graphcache';`);\n imports.push(`import { nativeDateExchange } from '${rumbleImportPath}';`);\n imports.push(`import { schema } from '${schemaPath}';`);\n\n imports.push(\n `import { makeLiveQuery, makeMutation, makeSubscription, makeQuery } from '${rumbleImportPath}';`,\n );\n\n const forceReactivityFieldString =\n typeof forceReactivity === \"boolean\" && forceReactivity\n ? `\\n forceReactivity: true`\n : \"\";\n const forceReactivityTypeString =\n typeof forceReactivity === \"boolean\" && forceReactivity ? \", true\" : \"\";\n\n code += `\nexport const defaultOptions: ConstructorParameters<Client>[0] = {\n url: \"${apiUrl ?? \"PLEASE PROVIDE A URL WHEN GENERATING OR IMPORT AN EXTERNAL URQL CLIENT\"}\",\n fetchSubscriptions: true,\n exchanges: [cacheExchange({ schema }), nativeDateExchange, fetchExchange],\n fetchOptions: {\n credentials: \"include\",\n },\n requestPolicy: \"cache-and-network\",\n}\n`;\n\n if (!useExternalUrqlClient) {\n code += `\nconst urqlClient = new Client(defaultOptions);\n`;\n }\n\n code += `\nexport const client = {\n /**\n * A query and subscription combination. First queries and if exists, also subscribes to a subscription of the same name.\n * Combines the results of both, so the result is first the query result and then live updates from the subscription.\n * Assumes that the query and subscription return the same fields as per default when using the rumble query helpers.\n * If no subscription with the same name exists, this will just be a query.\n *\n * Internally, this does some magic to make the data reactive with Svelte's reactivity system. But it can be used with other frameworks as well.\n */\n liveQuery: makeLiveQuery<Query${forceReactivityTypeString}>({\n\t urqlClient,\n\t availableSubscriptions: new Set([${availableSubscriptions\n .values()\n .toArray()\n .map((value) => `\"${value}\"`)\n .join(\", \")}]),\n\t\tschema,${forceReactivityFieldString}${idInclude}\n }),\n /**\n * A mutation that can be used to e.g. create, update or delete data.\n */\n mutate: makeMutation<Mutation>({\n\t urqlClient,\n\t\tschema,${idInclude}\n }),\n /**\n * A continuous stream of results that updates when the server sends new data.\n */\n subscribe: makeSubscription<Subscription>({\n\t urqlClient,\n\t\tschema,${idInclude}\n }),\n /**\n * A one-time fetch of data.\n */\n query: makeQuery<Query${forceReactivityTypeString}>({\n\t urqlClient,\n\t\tschema,${forceReactivityFieldString}${idInclude}\n }),\n}`;\n\n return {\n imports,\n code,\n };\n}\n","import {\n type GraphQLArgument,\n GraphQLEnumType,\n GraphQLInputObjectType,\n type GraphQLInputType,\n GraphQLList,\n GraphQLNonNull,\n GraphQLObjectType,\n type GraphQLOutputType,\n GraphQLScalarType,\n} from \"graphql\";\n\ntype GraphQLType =\n | GraphQLObjectType<any, any>\n | GraphQLEnumType\n | GraphQLInputObjectType\n | GraphQLScalarType;\n\nexport function makeTSRepresentation(model: GraphQLType) {\n if (model instanceof GraphQLObjectType) {\n return makeTSTypeFromObject(model);\n } else if (model instanceof GraphQLScalarType) {\n return mapGraphqlScalarToTSTypeString(model);\n } else if (model instanceof GraphQLEnumType) {\n return makeStringLiteralUnionFromEnum(model);\n } else if (model instanceof GraphQLInputObjectType) {\n return makeTSTypeFromInputObject(model);\n }\n\n throw new Error(`Unknown model type: ${model}`);\n}\n\nfunction makeTSTypeFromObject(model: GraphQLObjectType) {\n const stringifiedFields = new Map<string, string>();\n for (const [key, value] of Object.entries(model.getFields())) {\n stringifiedFields.set(key, makeTSObjectTypeField(value.type, value.args));\n }\n\n return `{\n ${stringifiedFields\n .entries()\n .map(([key, value]) => `${key}: ${value}`)\n .toArray()\n .join(\",\\n \")} \n}`;\n}\n\nfunction makeTSTypeFromInputObject(model: GraphQLInputObjectType) {\n const stringifiedFields = new Map<string, string>();\n for (const [key, value] of Object.entries(model.getFields())) {\n stringifiedFields.set(key, makeTSInputObjectTypeField(value.type));\n }\n\n return `{\n ${stringifiedFields\n .entries()\n .map(\n ([key, value]) =>\n `${key}${value.includes(\"| undefined\") ? \"?\" : \"\"}: ${value}`,\n )\n .toArray()\n .join(\",\\n \")} \n}`;\n}\n\nfunction makeTSObjectTypeField(\n returnType: GraphQLOutputType,\n args?: readonly GraphQLArgument[],\n) {\n let isNonNullReturnType = false;\n let isList = false;\n\n for (let index = 0; index < 3; index++) {\n if (returnType instanceof GraphQLList) {\n isList = true;\n returnType = returnType.ofType;\n }\n\n if (returnType instanceof GraphQLNonNull) {\n isNonNullReturnType = true;\n returnType = returnType.ofType;\n }\n }\n\n let returnTypeString = (returnType as any).name;\n\n if (isList) {\n returnTypeString += \"[]\";\n }\n\n if (!isNonNullReturnType) {\n returnTypeString += \" | null\";\n }\n\n const isRelationType = returnType instanceof GraphQLObjectType;\n\n const argsStringMap = new Map<string, string>();\n\n for (const arg of args ?? []) {\n argsStringMap.set(arg.name, stringifyTSObjectArg(arg.type));\n }\n\n if (isRelationType) {\n const makePOptional = argsStringMap\n .entries()\n .every(([, value]) => value.includes(\"| undefined\"));\n const argsString =\n (args ?? []).length > 0\n ? `p${makePOptional ? \"?\" : \"\"}: {\n ${argsStringMap\n .entries()\n .map(\n ([key, value]) =>\n ` ${key}${value.includes(\"| undefined\") ? \"?\" : \"\"}: ${value}`,\n )\n .toArray()\n .join(\",\\n \")}\n }`\n : \"\";\n\n return `(${argsString}) => ${returnTypeString}`;\n } else {\n return returnTypeString;\n }\n}\n\nfunction makeTSInputObjectTypeField(returnType: GraphQLInputType) {\n let isNonNullReturnType = false;\n let isList = false;\n\n for (let index = 0; index < 3; index++) {\n if (returnType instanceof GraphQLList) {\n isList = true;\n returnType = returnType.ofType;\n }\n\n if (returnType instanceof GraphQLNonNull) {\n isNonNullReturnType = true;\n returnType = returnType.ofType;\n }\n }\n\n let returnTypeString = (returnType as any).name;\n\n if (isList) {\n returnTypeString += \"[]\";\n }\n\n if (!isNonNullReturnType) {\n returnTypeString += \" | null | undefined\";\n } else if (isList) {\n returnTypeString += \" | undefined\";\n }\n\n return returnTypeString;\n}\n\nfunction stringifyTSObjectArg(arg: any) {\n let ret = \"unknown\";\n let isNullable = true;\n\n if (arg instanceof GraphQLNonNull) {\n isNullable = false;\n arg = arg.ofType;\n }\n\n if (\n arg instanceof GraphQLInputObjectType ||\n arg instanceof GraphQLScalarType\n ) {\n ret = arg.name;\n }\n\n if (isNullable) {\n ret += \" | null | undefined\"; // we also want undefined in args\n }\n\n return ret;\n}\n\nfunction mapGraphqlScalarToTSTypeString(arg: any) {\n switch (arg.name) {\n case \"ID\":\n return \"string\";\n case \"String\":\n return \"string\";\n case \"Boolean\":\n return \"boolean\";\n case \"Int\":\n return \"number\";\n case \"Float\":\n return \"number\";\n case \"Date\":\n return \"Date\";\n case \"DateTime\":\n return \"Date\";\n case \"JSON\":\n return \"any\";\n default:\n return \"unknown\";\n }\n}\n\nfunction makeStringLiteralUnionFromEnum(enumType: GraphQLEnumType) {\n return enumType\n .getValues()\n .map((value) => `\"${value.name}\"`)\n .join(\" | \");\n}\n","import { access, mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n getIntrospectedSchema,\n minifyIntrospectionQuery,\n} from \"@urql/introspection\";\nimport { uneval } from \"devalue\";\nimport type { GraphQLSchema } from \"graphql\";\nimport { generateClient } from \"./client\";\nimport { makeTSRepresentation } from \"./tsRepresentation\";\n\nexport async function generateFromSchema({\n outputPath,\n schema,\n rumbleImportPath = \"@m1212e/rumble/client\",\n apiUrl,\n useExternalUrqlClient = false,\n removeExisting = true,\n forceReactivity,\n autoIncludeIdField,\n}: {\n schema: GraphQLSchema;\n outputPath: string;\n rumbleImportPath?: string;\n apiUrl?: string;\n useExternalUrqlClient?: boolean | string;\n removeExisting?: boolean;\n forceReactivity?: boolean;\n autoIncludeIdField?: string | boolean;\n}) {\n if (removeExisting) {\n try {\n await access(outputPath);\n await rm(outputPath, { recursive: true, force: true });\n } catch (_error) {}\n }\n\n await mkdir(outputPath, { recursive: true });\n\n if (!outputPath.endsWith(\"/\")) {\n outputPath += \"/\";\n }\n\n const imports: string[] = [];\n let code = \"\";\n\n const typeMap = new Map<string, any>();\n for (const [key, object] of Object.entries(schema.getTypeMap())) {\n if (key.startsWith(\"__\")) continue;\n typeMap.set(key, object);\n }\n\n for (const [key, object] of typeMap.entries()) {\n const rep = makeTSRepresentation(object);\n\n if (rep === key) {\n continue;\n }\n\n code += `\nexport type ${key} = ${rep};\n\t\t`;\n }\n\n const schemaFileName = \"schema\";\n\n const c = generateClient({\n apiUrl,\n schemaPath: `./${schemaFileName}`,\n useExternalUrqlClient,\n rumbleImportPath,\n availableSubscriptions: new Set(\n Object.keys(schema.getSubscriptionType()?.getFields() || {}),\n ),\n forceReactivity,\n autoIncludeId: autoIncludeIdField,\n });\n\n imports.push(...c.imports);\n code += c.code;\n\n await Promise.all([\n writeFile(join(outputPath, \"client.ts\"), `${imports.join(\"\\n\")}\\n${code}`),\n writeFile(\n join(outputPath, `${schemaFileName}.ts`),\n `\nimport type { IntrospectionQuery } from \"graphql\";\nexport const schema = ${uneval(minifyIntrospectionQuery(getIntrospectedSchema(schema), { includeEnums: true, includeScalars: true, includeInputs: true }))} as IntrospectionQuery`,\n ),\n ]);\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generate-kjqygrmB.cjs","names":["GraphQLObjectType","GraphQLScalarType","GraphQLEnumType","GraphQLInputObjectType","GraphQLList","GraphQLNonNull"],"sources":["../lib/client/generate/client.ts","../lib/client/generate/tsRepresentation.ts","../lib/client/generate/generate.ts"],"sourcesContent":["export function generateClient({\n apiUrl,\n rumbleImportPath,\n useExternalUrqlClient,\n availableSubscriptions,\n schemaPath,\n forceReactivity,\n autoIncludeId,\n}: {\n rumbleImportPath: string;\n useExternalUrqlClient: string | boolean;\n apiUrl?: string;\n availableSubscriptions: Set<string>;\n schemaPath: string;\n forceReactivity?: boolean;\n autoIncludeId?: string | boolean;\n}) {\n const imports: string[] = [];\n let code: string = \"\";\n\n const idInclude =\n typeof autoIncludeId === \"string\"\n ? `\\n autoIncludeIdField: '${autoIncludeId}'`\n : autoIncludeId === true\n ? `\\n autoIncludeIdField: 'id'`\n : \"\";\n\n if (typeof useExternalUrqlClient === \"string\") {\n imports.push(`import { urqlClient } from \"${useExternalUrqlClient}\";`);\n }\n\n imports.push(`import { Client, fetchExchange } from '@urql/core';`);\n imports.push(`import { cacheExchange } from '@urql/exchange-graphcache';`);\n imports.push(`import { nativeDateExchange } from '${rumbleImportPath}';`);\n imports.push(`import { schema } from '${schemaPath}';`);\n\n imports.push(\n `import { makeLiveQuery, makeMutation, makeSubscription, makeQuery } from '${rumbleImportPath}';`,\n );\n\n const forceReactivityFieldString =\n typeof forceReactivity === \"boolean\" && forceReactivity\n ? `\\n forceReactivity: true`\n : \"\";\n const forceReactivityTypeString =\n typeof forceReactivity === \"boolean\" && forceReactivity ? \", true\" : \"\";\n\n code += `\nexport const defaultOptions: ConstructorParameters<Client>[0] = {\n url: \"${apiUrl ?? \"PLEASE PROVIDE A URL WHEN GENERATING OR IMPORT AN EXTERNAL URQL CLIENT\"}\",\n fetchSubscriptions: true,\n exchanges: [cacheExchange({ schema }), nativeDateExchange, fetchExchange],\n fetchOptions: {\n credentials: \"include\",\n },\n requestPolicy: \"cache-and-network\",\n}\n`;\n\n if (!useExternalUrqlClient) {\n code += `\nconst urqlClient = new Client(defaultOptions);\n`;\n }\n\n code += `\nexport const client = {\n /**\n * A query and subscription combination. First queries and if exists, also subscribes to a subscription of the same name.\n * Combines the results of both, so the result is first the query result and then live updates from the subscription.\n * Assumes that the query and subscription return the same fields as per default when using the rumble query helpers.\n * If no subscription with the same name exists, this will just be a query.\n *\n * Internally, this does some magic to make the data reactive with Svelte's reactivity system. But it can be used with other frameworks as well.\n */\n liveQuery: makeLiveQuery<Query${forceReactivityTypeString}>({\n\t urqlClient,\n\t availableSubscriptions: new Set([${availableSubscriptions\n .values()\n .toArray()\n .map((value) => `\"${value}\"`)\n .join(\", \")}]),\n\t\tschema,${forceReactivityFieldString}${idInclude}\n }),\n /**\n * A mutation that can be used to e.g. create, update or delete data.\n */\n mutate: makeMutation<Mutation>({\n\t urqlClient,\n\t\tschema,${idInclude}\n }),\n /**\n * A continuous stream of results that updates when the server sends new data.\n */\n subscribe: makeSubscription<Subscription>({\n\t urqlClient,\n\t\tschema,${idInclude}\n }),\n /**\n * A one-time fetch of data.\n */\n query: makeQuery<Query${forceReactivityTypeString}>({\n\t urqlClient,\n\t\tschema,${forceReactivityFieldString}${idInclude}\n }),\n}`;\n\n return {\n imports,\n code,\n };\n}\n","import {\n type GraphQLArgument,\n GraphQLEnumType,\n GraphQLInputObjectType,\n type GraphQLInputType,\n GraphQLList,\n GraphQLNonNull,\n GraphQLObjectType,\n type GraphQLOutputType,\n GraphQLScalarType,\n} from \"graphql\";\n\ntype GraphQLType =\n | GraphQLObjectType<any, any>\n | GraphQLEnumType\n | GraphQLInputObjectType\n | GraphQLScalarType;\n\nexport function makeTSRepresentation(model: GraphQLType) {\n if (model instanceof GraphQLObjectType) {\n return makeTSTypeFromObject(model);\n } else if (model instanceof GraphQLScalarType) {\n return mapGraphqlScalarToTSTypeString(model);\n } else if (model instanceof GraphQLEnumType) {\n return makeStringLiteralUnionFromEnum(model);\n } else if (model instanceof GraphQLInputObjectType) {\n return makeTSTypeFromInputObject(model);\n }\n\n throw new Error(`Unknown model type: ${model}`);\n}\n\nfunction makeTSTypeFromObject(model: GraphQLObjectType) {\n const stringifiedFields = new Map<string, string>();\n for (const [key, value] of Object.entries(model.getFields())) {\n stringifiedFields.set(key, makeTSObjectTypeField(value.type, value.args));\n }\n\n return `{\n ${stringifiedFields\n .entries()\n .map(([key, value]) => `${key}: ${value}`)\n .toArray()\n .join(\",\\n \")} \n}`;\n}\n\nfunction makeTSTypeFromInputObject(model: GraphQLInputObjectType) {\n const stringifiedFields = new Map<string, string>();\n for (const [key, value] of Object.entries(model.getFields())) {\n stringifiedFields.set(key, makeTSInputObjectTypeField(value.type));\n }\n\n return `{\n ${stringifiedFields\n .entries()\n .map(\n ([key, value]) =>\n `${key}${value.includes(\"| undefined\") ? \"?\" : \"\"}: ${value}`,\n )\n .toArray()\n .join(\",\\n \")} \n}`;\n}\n\nfunction makeTSObjectTypeField(\n returnType: GraphQLOutputType,\n args?: readonly GraphQLArgument[],\n) {\n let isNonNullReturnType = false;\n let isList = false;\n\n for (let index = 0; index < 3; index++) {\n if (returnType instanceof GraphQLList) {\n isList = true;\n returnType = returnType.ofType;\n }\n\n if (returnType instanceof GraphQLNonNull) {\n isNonNullReturnType = true;\n returnType = returnType.ofType;\n }\n }\n\n let returnTypeString = (returnType as any).name;\n\n if (isList) {\n returnTypeString += \"[]\";\n }\n\n if (!isNonNullReturnType) {\n returnTypeString += \" | null\";\n }\n\n const isRelationType = returnType instanceof GraphQLObjectType;\n\n const argsStringMap = new Map<string, string>();\n\n for (const arg of args ?? []) {\n argsStringMap.set(arg.name, stringifyTSObjectArg(arg.type));\n }\n\n if (isRelationType) {\n const makePOptional = argsStringMap\n .entries()\n .every(([, value]) => value.includes(\"| undefined\"));\n const argsString =\n (args ?? []).length > 0\n ? `p${makePOptional ? \"?\" : \"\"}: {\n ${argsStringMap\n .entries()\n .map(\n ([key, value]) =>\n ` ${key}${value.includes(\"| undefined\") ? \"?\" : \"\"}: ${value}`,\n )\n .toArray()\n .join(\",\\n \")}\n }`\n : \"\";\n\n return `(${argsString}) => ${returnTypeString}`;\n } else {\n return returnTypeString;\n }\n}\n\nfunction makeTSInputObjectTypeField(returnType: GraphQLInputType) {\n let isNonNullReturnType = false;\n let isList = false;\n\n for (let index = 0; index < 3; index++) {\n if (returnType instanceof GraphQLList) {\n isList = true;\n returnType = returnType.ofType;\n }\n\n if (returnType instanceof GraphQLNonNull) {\n isNonNullReturnType = true;\n returnType = returnType.ofType;\n }\n }\n\n let returnTypeString = (returnType as any).name;\n\n if (isList) {\n returnTypeString += \"[]\";\n }\n\n if (!isNonNullReturnType) {\n returnTypeString += \" | null | undefined\";\n } else if (isList) {\n returnTypeString += \" | undefined\";\n }\n\n return returnTypeString;\n}\n\nfunction stringifyTSObjectArg(arg: any) {\n let ret = \"unknown\";\n let isNullable = true;\n\n if (arg instanceof GraphQLNonNull) {\n isNullable = false;\n arg = arg.ofType;\n }\n\n if (\n arg instanceof GraphQLInputObjectType ||\n arg instanceof GraphQLScalarType\n ) {\n ret = arg.name;\n }\n\n if (isNullable) {\n ret += \" | null | undefined\"; // we also want undefined in args\n }\n\n return ret;\n}\n\nfunction mapGraphqlScalarToTSTypeString(arg: any) {\n switch (arg.name) {\n case \"ID\":\n return \"string\";\n case \"String\":\n return \"string\";\n case \"Boolean\":\n return \"boolean\";\n case \"Int\":\n return \"number\";\n case \"Float\":\n return \"number\";\n case \"Date\":\n return \"Date\";\n case \"DateTime\":\n return \"Date\";\n case \"JSON\":\n return \"any\";\n default:\n return \"unknown\";\n }\n}\n\nfunction makeStringLiteralUnionFromEnum(enumType: GraphQLEnumType) {\n return enumType\n .getValues()\n .map((value) => `\"${value.name}\"`)\n .join(\" | \");\n}\n","import { access, mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n getIntrospectedSchema,\n minifyIntrospectionQuery,\n} from \"@urql/introspection\";\nimport { uneval } from \"devalue\";\nimport type { GraphQLSchema } from \"graphql\";\nimport { generateClient } from \"./client\";\nimport { makeTSRepresentation } from \"./tsRepresentation\";\n\nexport async function generateFromSchema({\n outputPath,\n schema,\n rumbleImportPath = \"@m1212e/rumble/client\",\n apiUrl,\n useExternalUrqlClient = false,\n removeExisting = true,\n forceReactivity,\n autoIncludeIdField,\n}: {\n schema: GraphQLSchema;\n outputPath: string;\n rumbleImportPath?: string;\n apiUrl?: string;\n useExternalUrqlClient?: boolean | string;\n removeExisting?: boolean;\n forceReactivity?: boolean;\n autoIncludeIdField?: string | boolean;\n}) {\n if (removeExisting) {\n try {\n await access(outputPath);\n await rm(outputPath, { recursive: true, force: true });\n } catch (_error) {}\n }\n\n await mkdir(outputPath, { recursive: true });\n\n if (!outputPath.endsWith(\"/\")) {\n outputPath += \"/\";\n }\n\n const imports: string[] = [];\n let code = \"\";\n\n const typeMap = new Map<string, any>();\n for (const [key, object] of Object.entries(schema.getTypeMap())) {\n if (key.startsWith(\"__\")) continue;\n typeMap.set(key, object);\n }\n\n for (const [key, object] of typeMap.entries()) {\n const rep = makeTSRepresentation(object);\n\n if (rep === key) {\n continue;\n }\n\n code += `\nexport type ${key} = ${rep};\n\t\t`;\n }\n\n const schemaFileName = \"schema\";\n\n const c = generateClient({\n apiUrl,\n schemaPath: `./${schemaFileName}`,\n useExternalUrqlClient,\n rumbleImportPath,\n availableSubscriptions: new Set(\n Object.keys(schema.getSubscriptionType()?.getFields() || {}),\n ),\n forceReactivity,\n autoIncludeId: autoIncludeIdField,\n });\n\n imports.push(...c.imports);\n code += c.code;\n\n await Promise.all([\n writeFile(join(outputPath, \"client.ts\"), `${imports.join(\"\\n\")}\\n${code}`),\n writeFile(\n join(outputPath, `${schemaFileName}.ts`),\n `\nimport type { IntrospectionQuery } from \"graphql\";\nexport const schema = ${uneval(minifyIntrospectionQuery(getIntrospectedSchema(schema), { includeEnums: true, includeScalars: true, includeInputs: true }))} as IntrospectionQuery`,\n ),\n ]);\n}\n"],"mappings":"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"}
|