@m1212e/rumble 0.23.24 → 0.24.1
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 +9 -5
- package/out/client/generate.d.cts +1 -12
- package/out/client/generate.d.cts.map +1 -1
- package/out/client/generate.d.mts +1 -12
- package/out/client/generate.d.mts.map +1 -1
- package/out/client.cjs +26 -2
- package/out/client.cjs.map +1 -1
- package/out/client.d.cts +17 -38
- package/out/client.d.cts.map +1 -1
- package/out/client.d.mts +17 -38
- package/out/client.d.mts.map +1 -1
- package/out/client.mjs +28 -4
- package/out/client.mjs.map +1 -1
- package/out/generate-CM3XjmlO.cjs.map +1 -1
- package/out/index.cjs +78 -53
- package/out/index.cjs.map +1 -1
- package/out/index.d.cts +233 -244
- package/out/index.d.cts.map +1 -1
- package/out/index.d.mts +234 -244
- package/out/index.d.mts.map +1 -1
- package/out/index.mjs +77 -52
- package/out/index.mjs.map +1 -1
- package/package.json +32 -32
package/out/client.mjs
CHANGED
|
@@ -1,12 +1,35 @@
|
|
|
1
1
|
import { t as lazy } from "./lazy-C7IyM4M4.mjs";
|
|
2
|
-
import { capitalize } from "es-toolkit";
|
|
2
|
+
import { capitalize, isEqual } from "es-toolkit";
|
|
3
3
|
import { DateResolver, DateTimeISOResolver } from "graphql-scalars";
|
|
4
|
-
import { fromValue, map, merge as merge$1, pipe, share, subscribe, take, toObservable } from "wonka";
|
|
4
|
+
import { filter, fromValue, map, merge as merge$1, onStart, pipe, share, subscribe, take, toObservable } from "wonka";
|
|
5
5
|
//#region lib/client/request.ts
|
|
6
6
|
let createSubscriber = () => () => {};
|
|
7
7
|
const svelteReactivityReady = import("svelte/reactivity").then((m) => {
|
|
8
8
|
createSubscriber = m.createSubscriber;
|
|
9
9
|
}).catch(() => {});
|
|
10
|
+
/**
|
|
11
|
+
* Drops results whose data is deeply equal to the previously emitted one, so
|
|
12
|
+
* observers are only notified when something actually changed. Errors always pass.
|
|
13
|
+
* State is reset on every (re)start of the pipeline so new subscriptions still
|
|
14
|
+
* receive their initial value.
|
|
15
|
+
*/
|
|
16
|
+
function dedupeResults(queryName) {
|
|
17
|
+
return (source) => {
|
|
18
|
+
let hasLast = false;
|
|
19
|
+
let last;
|
|
20
|
+
return pipe(source, onStart(() => {
|
|
21
|
+
hasLast = false;
|
|
22
|
+
last = void 0;
|
|
23
|
+
}), filter((v) => {
|
|
24
|
+
if (v.error) return true;
|
|
25
|
+
const data = v.data?.[queryName];
|
|
26
|
+
if (hasLast && isEqual(last, data)) return false;
|
|
27
|
+
hasLast = true;
|
|
28
|
+
last = data;
|
|
29
|
+
return true;
|
|
30
|
+
}));
|
|
31
|
+
};
|
|
32
|
+
}
|
|
10
33
|
function typeToString(type) {
|
|
11
34
|
if (type.kind === "NON_NULL") return `${typeToString(type.ofType)}!`;
|
|
12
35
|
if (type.kind === "LIST") return `[${typeToString(type.ofType)}]`;
|
|
@@ -87,7 +110,7 @@ function makeGraphQLQueryRequest({ queryName, schema, input, client, enableSubsc
|
|
|
87
110
|
});
|
|
88
111
|
observableSources.push(client.subscription(subOpString, subVars));
|
|
89
112
|
}
|
|
90
|
-
const observable = toObservable(pipe(merge$1(observableSources), share, map((v) => {
|
|
113
|
+
const observable = toObservable(pipe(merge$1(observableSources), dedupeResults(queryName), share, map((v) => {
|
|
91
114
|
if (v.error) throw v.error;
|
|
92
115
|
const data = v.data?.[queryName];
|
|
93
116
|
if (typeof data === "object" && data !== null) {
|
|
@@ -358,7 +381,8 @@ function mapValuesDeep(input, fn) {
|
|
|
358
381
|
const dateIsoRegex = /^\d{4}-\d{2}-\d{2}(?:[Tt ]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:[Zz]|[+-]\d{2}:\d{2})?)?$/;
|
|
359
382
|
const nativeDateExchange = ({ client: _client, forward }) => {
|
|
360
383
|
return (operations$) => {
|
|
361
|
-
|
|
384
|
+
const operationResult$ = forward(operations$);
|
|
385
|
+
return pipe(operationResult$, map((r) => {
|
|
362
386
|
r.data = mapValuesDeep(r.data, (value) => {
|
|
363
387
|
if (typeof value !== "string" || !dateIsoRegex.test(value)) return value;
|
|
364
388
|
const date = Date.parse(value);
|
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 IntrospectionInputValue,\n IntrospectionQuery,\n IntrospectionType,\n} from \"graphql\";\nimport { DateResolver, DateTimeISOResolver } from \"graphql-scalars\";\n\n// since svelte is optional, dub this in case the import is not available, but if it is, use the real one\nlet createSubscriber: typeof import(\"svelte/reactivity\").createSubscriber =\n () => () => {};\n\nconst svelteReactivityReady: Promise<void> = import(\"svelte/reactivity\")\n .then((m) => {\n createSubscriber = m.createSubscriber;\n })\n .catch(() => {});\n\nimport {\n fromValue,\n map,\n merge,\n pipe,\n type Source,\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\nfunction typeToString(type: any): string {\n if (type.kind === \"NON_NULL\") return `${typeToString(type.ofType)}!`;\n if (type.kind === \"LIST\") return `[${typeToString(type.ofType)}]`;\n return type.name;\n}\n\nfunction unwrapNamedType(\n typeRef: any,\n types: readonly IntrospectionType[],\n): IntrospectionType | undefined {\n let t = typeRef;\n while (t && (t.kind === \"NON_NULL\" || t.kind === \"LIST\")) t = t.ofType;\n return types.find((x) => x.name === t?.name);\n}\n\nfunction isCompositeKind(kind: string | undefined) {\n return kind === \"OBJECT\" || kind === \"INTERFACE\" || kind === \"UNION\";\n}\n\ntype VarContext = {\n variables: Record<string, any>;\n declarations: string[];\n usedNames: Set<string>;\n};\n\nfunction allocateVarName(ctx: VarContext, baseName: string): string {\n if (!ctx.usedNames.has(baseName)) {\n ctx.usedNames.add(baseName);\n return baseName;\n }\n let i = 1;\n while (ctx.usedNames.has(`${baseName}${i}`)) i++;\n const name = `${baseName}${i}`;\n ctx.usedNames.add(name);\n return name;\n}\n\nexport const argsKey = \"__args\";\n\nfunction makeOperation({\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 varCtx: VarContext = {\n variables: {},\n declarations: [],\n usedNames: new Set(),\n };\n\n const returnTypeIsComposite = isCompositeKind(\n unwrapNamedType(field.type, types)?.kind,\n );\n\n const selectionString =\n input && returnTypeIsComposite\n ? stringifySelection({\n parentTypeName: unwrapNamedType(field.type, types)!.name,\n selection: input,\n types,\n autoIncludeIdField,\n varCtx,\n })\n : \"\";\n\n const argumentString = input?.[argsKey]\n ? serializeArguments({\n args: input[argsKey],\n fieldArgs: field.args,\n types,\n varCtx,\n })\n : \"\";\n\n const varDecl = varCtx.declarations.length\n ? `(${varCtx.declarations.join(\", \")})`\n : \"\";\n\n return {\n operationString: `${operationVerb} ${otwQueryName}${varDecl} { ${queryName}${argumentString} ${selectionString}}`,\n variables: varCtx.variables,\n };\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 let svelteSubscriber: () => void = () => {};\n\n const { operationString, variables } = makeOperation({\n operationVerb: \"query\",\n queryName,\n input,\n schema,\n autoIncludeIdField,\n });\n\n const observableSources: Source<any>[] = [\n client.query(operationString, variables),\n // client.read\n ];\n if (enableSubscription) {\n const { operationString: subOpString, variables: subVars } = makeOperation({\n operationVerb: \"subscription\",\n queryName,\n input,\n schema,\n autoIncludeIdField,\n });\n observableSources.push(client.subscription(subOpString, subVars));\n }\n const observable = toObservable(\n pipe(\n merge(observableSources),\n share,\n map((v: any) => {\n if (v.error) {\n throw v.error;\n }\n\n const data = v.data?.[queryName];\n if (typeof data === \"object\" && data !== null) {\n currentData = data;\n return dataProxy();\n }\n return data;\n }),\n ),\n );\n\n const subscriberReady = svelteReactivityReady.then(() => {\n svelteSubscriber = createSubscriber((update) => {\n const unsub = observable.subscribe((_d) => {\n update();\n });\n return () => unsub.unsubscribe();\n });\n });\n\n const promise = new Promise<any>((resolve, reject) => {\n pipe(\n client.query(operationString, variables) as any,\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 if (typeof data !== \"object\" || data === null) {\n resolve(data);\n return;\n }\n if (typeof forceReactivity === \"boolean\" && forceReactivity) {\n subscriberReady.then(() => resolve(observable));\n return;\n }\n\n currentData = data;\n observableSources.push(fromValue(data));\n\n subscriberReady.then(() => {\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\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 { operationString, variables } = makeOperation({\n operationVerb: \"mutation\",\n queryName: mutationName,\n input,\n schema,\n autoIncludeIdField,\n });\n\n const observable = toObservable(\n pipe(\n pipe(client.mutation(operationString, variables) as any, share),\n map((v: any) => {\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 client.mutation(operationString, variables) as any,\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 const { operationString, variables } = makeOperation({\n operationVerb: \"subscription\",\n queryName: subscriptionName,\n input,\n schema,\n autoIncludeIdField,\n });\n\n return pipe(\n client.subscription(operationString, variables) as any,\n map((v: any) => {\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 parentTypeName,\n selection,\n types,\n autoIncludeIdField,\n varCtx,\n}: {\n selection: Record<string, any>;\n parentTypeName: string;\n types: readonly IntrospectionType[];\n autoIncludeIdField?: string;\n varCtx: VarContext;\n}) {\n if (\n autoIncludeIdField &&\n typeof selection[autoIncludeIdField] === \"undefined\"\n ) {\n selection[autoIncludeIdField] = true;\n }\n\n const parentType = types.find((t) => t.name === parentTypeName);\n\n const ret = Object.entries(selection)\n .filter(([key]) => key !== argsKey)\n .reduce((acc, [key, value]) => {\n if (typeof value === \"object\") {\n const subField =\n parentType && \"fields\" in parentType\n ? parentType.fields.find((f) => f.name === key)\n : undefined;\n\n let argsString = \"\";\n if (value[argsKey] && subField) {\n argsString = serializeArguments({\n args: value[argsKey],\n types,\n fieldArgs: subField.args,\n varCtx,\n });\n }\n\n const subNamedType = subField\n ? unwrapNamedType(subField.type, types)\n : undefined;\n\n if (isCompositeKind(subNamedType?.kind)) {\n acc += `${key}${argsString} ${stringifySelection({\n parentTypeName: subNamedType!.name,\n selection: value,\n types,\n varCtx,\n })}\n`;\n } else {\n acc += `${key}${argsString}\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 serializeArguments({\n args,\n fieldArgs,\n types,\n varCtx,\n}: {\n args: Record<any, any>;\n fieldArgs: readonly IntrospectionInputValue[];\n types: readonly IntrospectionType[];\n varCtx: VarContext;\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 const varName = allocateVarName(varCtx, key);\n varCtx.declarations.push(`$${varName}: ${typeToString(gqlArg.type)}`);\n varCtx.variables[varName] = serializeArgValue({\n arg: value,\n gqlArg,\n types,\n });\n\n return `${key}: $${varName}`;\n })\n .join(\", \")})`;\n }\n\n return \"\";\n}\n\nfunction serializeArgValue({\n arg,\n gqlArg,\n types,\n}: {\n arg: any;\n gqlArg: IntrospectionInputValue;\n types: readonly IntrospectionType[];\n}): any {\n if (arg === null) {\n return null;\n }\n\n if (Array.isArray(arg)) {\n return arg.map((v) => {\n return serializeArgValue({\n arg: v,\n types,\n gqlArg,\n });\n });\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 const referenceInputObject = types.find(\n (t) => t.name === (type as any).name,\n );\n\n if (referenceInputObject?.kind !== \"INPUT_OBJECT\") {\n return arg;\n }\n\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(arg)) {\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 result[key] = serializeArgValue({\n arg: value,\n types,\n gqlArg: subArgType,\n });\n }\n return result;\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 case \"number\":\n case \"bigint\":\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: _client, forward }) => {\n return (operations$) => {\n const operationResult$ = forward(operations$);\n\n return pipe(\n operationResult$ as any,\n map((r: any) => {\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 ) as any;\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, isEqual } from \"es-toolkit\";\nimport type {\n IntrospectionInputValue,\n IntrospectionQuery,\n IntrospectionType,\n} from \"graphql\";\nimport { DateResolver, DateTimeISOResolver } from \"graphql-scalars\";\n\n// since svelte is optional, dub this in case the import is not available, but if it is, use the real one\nlet createSubscriber: typeof import(\"svelte/reactivity\").createSubscriber =\n () => () => {};\n\nconst svelteReactivityReady: Promise<void> = import(\"svelte/reactivity\")\n .then((m) => {\n createSubscriber = m.createSubscriber;\n })\n .catch(() => {});\n\nimport {\n filter,\n fromValue,\n map,\n merge,\n onStart,\n pipe,\n type Source,\n share,\n subscribe,\n take,\n toObservable,\n} from \"wonka\";\nimport { lazy } from \"../helpers/lazy\";\n\n/**\n * Drops results whose data is deeply equal to the previously emitted one, so\n * observers are only notified when something actually changed. Errors always pass.\n * State is reset on every (re)start of the pipeline so new subscriptions still\n * receive their initial value.\n */\nfunction dedupeResults(queryName: string) {\n return (source: Source<any>): Source<any> => {\n let hasLast = false;\n let last: unknown;\n return pipe(\n source,\n onStart(() => {\n hasLast = false;\n last = undefined;\n }),\n filter((v: any) => {\n if (v.error) return true;\n const data = v.data?.[queryName];\n if (hasLast && isEqual(last, data)) return false;\n hasLast = true;\n last = data;\n return true;\n }),\n );\n };\n}\n\n// TODO: this could use some refactoring and less type check disable (remove uses of any)\n// TODO: the client needs tests\n\nfunction typeToString(type: any): string {\n if (type.kind === \"NON_NULL\") return `${typeToString(type.ofType)}!`;\n if (type.kind === \"LIST\") return `[${typeToString(type.ofType)}]`;\n return type.name;\n}\n\nfunction unwrapNamedType(\n typeRef: any,\n types: readonly IntrospectionType[],\n): IntrospectionType | undefined {\n let t = typeRef;\n while (t && (t.kind === \"NON_NULL\" || t.kind === \"LIST\")) t = t.ofType;\n return types.find((x) => x.name === t?.name);\n}\n\nfunction isCompositeKind(kind: string | undefined) {\n return kind === \"OBJECT\" || kind === \"INTERFACE\" || kind === \"UNION\";\n}\n\ntype VarContext = {\n variables: Record<string, any>;\n declarations: string[];\n usedNames: Set<string>;\n};\n\nfunction allocateVarName(ctx: VarContext, baseName: string): string {\n if (!ctx.usedNames.has(baseName)) {\n ctx.usedNames.add(baseName);\n return baseName;\n }\n let i = 1;\n while (ctx.usedNames.has(`${baseName}${i}`)) i++;\n const name = `${baseName}${i}`;\n ctx.usedNames.add(name);\n return name;\n}\n\nexport const argsKey = \"__args\";\n\nfunction makeOperation({\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 varCtx: VarContext = {\n variables: {},\n declarations: [],\n usedNames: new Set(),\n };\n\n const returnTypeIsComposite = isCompositeKind(\n unwrapNamedType(field.type, types)?.kind,\n );\n\n const selectionString =\n input && returnTypeIsComposite\n ? stringifySelection({\n parentTypeName: unwrapNamedType(field.type, types)!.name,\n selection: input,\n types,\n autoIncludeIdField,\n varCtx,\n })\n : \"\";\n\n const argumentString = input?.[argsKey]\n ? serializeArguments({\n args: input[argsKey],\n fieldArgs: field.args,\n types,\n varCtx,\n })\n : \"\";\n\n const varDecl = varCtx.declarations.length\n ? `(${varCtx.declarations.join(\", \")})`\n : \"\";\n\n return {\n operationString: `${operationVerb} ${otwQueryName}${varDecl} { ${queryName}${argumentString} ${selectionString}}`,\n variables: varCtx.variables,\n };\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 let svelteSubscriber: () => void = () => {};\n\n const { operationString, variables } = makeOperation({\n operationVerb: \"query\",\n queryName,\n input,\n schema,\n autoIncludeIdField,\n });\n\n const observableSources: Source<any>[] = [\n client.query(operationString, variables),\n // client.read\n ];\n if (enableSubscription) {\n const { operationString: subOpString, variables: subVars } = makeOperation({\n operationVerb: \"subscription\",\n queryName,\n input,\n schema,\n autoIncludeIdField,\n });\n observableSources.push(client.subscription(subOpString, subVars));\n }\n const observable = toObservable(\n pipe(\n merge(observableSources),\n dedupeResults(queryName),\n share,\n map((v: any) => {\n if (v.error) {\n throw v.error;\n }\n\n const data = v.data?.[queryName];\n if (typeof data === \"object\" && data !== null) {\n currentData = data;\n return dataProxy();\n }\n return data;\n }),\n ),\n );\n\n const subscriberReady = svelteReactivityReady.then(() => {\n svelteSubscriber = createSubscriber((update) => {\n const unsub = observable.subscribe((_d) => {\n update();\n });\n return () => unsub.unsubscribe();\n });\n });\n\n const promise = new Promise<any>((resolve, reject) => {\n pipe(\n client.query(operationString, variables) as any,\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 if (typeof data !== \"object\" || data === null) {\n resolve(data);\n return;\n }\n if (typeof forceReactivity === \"boolean\" && forceReactivity) {\n subscriberReady.then(() => resolve(observable));\n return;\n }\n\n currentData = data;\n observableSources.push(fromValue(data));\n\n subscriberReady.then(() => {\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\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 { operationString, variables } = makeOperation({\n operationVerb: \"mutation\",\n queryName: mutationName,\n input,\n schema,\n autoIncludeIdField,\n });\n\n const observable = toObservable(\n pipe(\n pipe(client.mutation(operationString, variables) as any, share),\n map((v: any) => {\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 client.mutation(operationString, variables) as any,\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 const { operationString, variables } = makeOperation({\n operationVerb: \"subscription\",\n queryName: subscriptionName,\n input,\n schema,\n autoIncludeIdField,\n });\n\n return pipe(\n client.subscription(operationString, variables) as any,\n map((v: any) => {\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 parentTypeName,\n selection,\n types,\n autoIncludeIdField,\n varCtx,\n}: {\n selection: Record<string, any>;\n parentTypeName: string;\n types: readonly IntrospectionType[];\n autoIncludeIdField?: string;\n varCtx: VarContext;\n}) {\n if (\n autoIncludeIdField &&\n typeof selection[autoIncludeIdField] === \"undefined\"\n ) {\n selection[autoIncludeIdField] = true;\n }\n\n const parentType = types.find((t) => t.name === parentTypeName);\n\n const ret = Object.entries(selection)\n .filter(([key]) => key !== argsKey)\n .reduce((acc, [key, value]) => {\n if (typeof value === \"object\") {\n const subField =\n parentType && \"fields\" in parentType\n ? parentType.fields.find((f) => f.name === key)\n : undefined;\n\n let argsString = \"\";\n if (value[argsKey] && subField) {\n argsString = serializeArguments({\n args: value[argsKey],\n types,\n fieldArgs: subField.args,\n varCtx,\n });\n }\n\n const subNamedType = subField\n ? unwrapNamedType(subField.type, types)\n : undefined;\n\n if (isCompositeKind(subNamedType?.kind)) {\n acc += `${key}${argsString} ${stringifySelection({\n parentTypeName: subNamedType!.name,\n selection: value,\n types,\n varCtx,\n })}\n`;\n } else {\n acc += `${key}${argsString}\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 serializeArguments({\n args,\n fieldArgs,\n types,\n varCtx,\n}: {\n args: Record<any, any>;\n fieldArgs: readonly IntrospectionInputValue[];\n types: readonly IntrospectionType[];\n varCtx: VarContext;\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 const varName = allocateVarName(varCtx, key);\n varCtx.declarations.push(`$${varName}: ${typeToString(gqlArg.type)}`);\n varCtx.variables[varName] = serializeArgValue({\n arg: value,\n gqlArg,\n types,\n });\n\n return `${key}: $${varName}`;\n })\n .join(\", \")})`;\n }\n\n return \"\";\n}\n\nfunction serializeArgValue({\n arg,\n gqlArg,\n types,\n}: {\n arg: any;\n gqlArg: IntrospectionInputValue;\n types: readonly IntrospectionType[];\n}): any {\n if (arg === null) {\n return null;\n }\n\n if (Array.isArray(arg)) {\n return arg.map((v) => {\n return serializeArgValue({\n arg: v,\n types,\n gqlArg,\n });\n });\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 const referenceInputObject = types.find(\n (t) => t.name === (type as any).name,\n );\n\n if (referenceInputObject?.kind !== \"INPUT_OBJECT\") {\n return arg;\n }\n\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(arg)) {\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 result[key] = serializeArgValue({\n arg: value,\n types,\n gqlArg: subArgType,\n });\n }\n return result;\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 case \"number\":\n case \"bigint\":\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: _client, forward }) => {\n return (operations$) => {\n const operationResult$ = forward(operations$);\n\n return pipe(\n operationResult$ as any,\n map((r: any) => {\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 ) as any;\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-CM3XjmlO.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 = \"\";\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 || argsStringMap.size > 0) {\n const makePOptional = argsStringMap\n .entries()\n .every(([, value]) => value.includes(\"| undefined\"));\n const argsString =\n argsStringMap.size > 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 isNullable = true;\n let isList = false;\n\n for (let index = 0; index < 4; index++) {\n if (arg instanceof GraphQLNonNull) {\n if (!isList) {\n isNullable = false;\n }\n arg = arg.ofType;\n } else if (arg instanceof GraphQLList) {\n isList = true;\n arg = arg.ofType;\n }\n }\n\n let ret = \"unknown\";\n\n if (\n arg instanceof GraphQLInputObjectType ||\n arg instanceof GraphQLScalarType ||\n arg instanceof GraphQLEnumType\n ) {\n ret = arg.name;\n }\n\n if (isList) {\n ret += \"[]\";\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(\n join(outputPath, \"client.ts\"),\n `${autoGenerationPreamble}\\n${imports.join(\"\\n\")}\\n${code}`,\n ),\n writeFile(\n join(outputPath, `${schemaFileName}.ts`),\n `${autoGenerationPreamble}\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
|
+
{"version":3,"file":"generate-CM3XjmlO.cjs","names":["GraphQLObjectType","GraphQLScalarType","GraphQLEnumType","GraphQLInputObjectType","GraphQLList","GraphQLNonNull","access","rm","mkdir","writeFile","join","uneval","minifyIntrospectionQuery","getIntrospectedSchema"],"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 = \"\";\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 || argsStringMap.size > 0) {\n const makePOptional = argsStringMap\n .entries()\n .every(([, value]) => value.includes(\"| undefined\"));\n const argsString =\n argsStringMap.size > 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 isNullable = true;\n let isList = false;\n\n for (let index = 0; index < 4; index++) {\n if (arg instanceof GraphQLNonNull) {\n if (!isList) {\n isNullable = false;\n }\n arg = arg.ofType;\n } else if (arg instanceof GraphQLList) {\n isList = true;\n arg = arg.ofType;\n }\n }\n\n let ret = \"unknown\";\n\n if (\n arg instanceof GraphQLInputObjectType ||\n arg instanceof GraphQLScalarType ||\n arg instanceof GraphQLEnumType\n ) {\n ret = arg.name;\n }\n\n if (isList) {\n ret += \"[]\";\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(\n join(outputPath, \"client.ts\"),\n `${autoGenerationPreamble}\\n${imports.join(\"\\n\")}\\n${code}`,\n ),\n writeFile(\n join(outputPath, `${schemaFileName}.ts`),\n `${autoGenerationPreamble}\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
|
@@ -16,7 +16,7 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
16
|
}
|
|
17
17
|
return to;
|
|
18
18
|
};
|
|
19
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule || !__hasOwnProp.call(mod, "default") ? __defProp(target, "default", {
|
|
20
20
|
value: mod,
|
|
21
21
|
enumerable: true
|
|
22
22
|
}) : target, mod));
|
|
@@ -92,7 +92,7 @@ return (
|
|
|
92
92
|
db.query.users
|
|
93
93
|
.findFirst({
|
|
94
94
|
...query,
|
|
95
|
-
where: ctx.abilities.users.filter("read").single.where,
|
|
95
|
+
where: (await ctx.abilities.users.filter("read")).single.where,
|
|
96
96
|
})
|
|
97
97
|
// note that we need to manually raise an error if the value is not found
|
|
98
98
|
.then(assertFindFirstExists)
|
|
@@ -134,7 +134,7 @@ name: args.newName,
|
|
|
134
134
|
.where(
|
|
135
135
|
and(
|
|
136
136
|
eq(schema.users.id, args.userId),
|
|
137
|
-
ctx.abilities.users.filter("update").single.where
|
|
137
|
+
(await ctx.abilities.users.filter("update")).single.where
|
|
138
138
|
)
|
|
139
139
|
)
|
|
140
140
|
.returning({ id: schema.users.id, name: schema.users.name })
|
|
@@ -197,7 +197,7 @@ pubsub.updated(user.id);
|
|
|
197
197
|
return db.query.user
|
|
198
198
|
.findFirst(
|
|
199
199
|
query(
|
|
200
|
-
ctx.abilities.user.filter('read').merge(
|
|
200
|
+
(await ctx.abilities.user.filter('read')).merge(
|
|
201
201
|
{
|
|
202
202
|
where: { id: user.id },
|
|
203
203
|
}
|
|
@@ -216,7 +216,7 @@ function mapNullFieldsToUndefined(obj) {
|
|
|
216
216
|
}
|
|
217
217
|
//#endregion
|
|
218
218
|
//#region package.json
|
|
219
|
-
var version = "0.
|
|
219
|
+
var version = "0.24.1";
|
|
220
220
|
//#endregion
|
|
221
221
|
//#region lib/helpers/errorLogging.ts
|
|
222
222
|
function hasMessage(error) {
|
|
@@ -648,7 +648,6 @@ function attributeValue(value) {
|
|
|
648
648
|
case "boolean": return value;
|
|
649
649
|
case "bigint": return value.toString();
|
|
650
650
|
case "undefined": return "null";
|
|
651
|
-
default: break;
|
|
652
651
|
}
|
|
653
652
|
if (value === null) return "null";
|
|
654
653
|
if (Array.isArray(value) && isHomogeneousPrimitiveArray(value)) return value;
|
|
@@ -686,11 +685,28 @@ function durationMs(start) {
|
|
|
686
685
|
//#endregion
|
|
687
686
|
//#region lib/abilityBuilder.ts
|
|
688
687
|
function isDynamicQueryFilter(filter) {
|
|
689
|
-
return typeof filter === "function"
|
|
688
|
+
return typeof filter === "function";
|
|
690
689
|
}
|
|
691
690
|
function isStaticQueryFilter(filter) {
|
|
692
691
|
return typeof filter !== "function";
|
|
693
692
|
}
|
|
693
|
+
/**
|
|
694
|
+
* filter() is async. Without type checking (plain JS, `any`) a forgotten await would
|
|
695
|
+
* hand the promise itself to drizzle
|
|
696
|
+
*/
|
|
697
|
+
function guardAgainstMissingAwait(promise) {
|
|
698
|
+
for (const key of [
|
|
699
|
+
"query",
|
|
700
|
+
"sql",
|
|
701
|
+
"merge"
|
|
702
|
+
]) Object.defineProperty(promise, key, {
|
|
703
|
+
enumerable: true,
|
|
704
|
+
get() {
|
|
705
|
+
throw new RumbleError(`Tried to access "${key}" on the result of abilities.<table>.filter(...) which is a Promise. filter() is async, did you forget to await it?`);
|
|
706
|
+
}
|
|
707
|
+
});
|
|
708
|
+
return promise;
|
|
709
|
+
}
|
|
694
710
|
const makeNothingRegisteredWarner = (config, logger) => (0, es_toolkit.debounce)((model, action) => {
|
|
695
711
|
const msg = `No abilities registered for ${model}/${action} — blocking everything. Register the ability or ignore this warning if intentional.`;
|
|
696
712
|
if (logger) logger.warn({
|
|
@@ -746,8 +762,10 @@ const createAbilityBuilder = ({ db, actions, defaultLimit, otel, logger: loggerC
|
|
|
746
762
|
*/
|
|
747
763
|
when: (queryFilter) => {
|
|
748
764
|
for (const action of actions) {
|
|
749
|
-
if (queryFilters.get(action) === "unrestricted")
|
|
750
|
-
|
|
765
|
+
if (queryFilters.get(action) === "unrestricted") {
|
|
766
|
+
if (setUnrestrictedByThisCall.has(action)) queryFilters.set(action, []);
|
|
767
|
+
else continue;
|
|
768
|
+
}
|
|
751
769
|
queryFilters.get(action).push(queryFilter);
|
|
752
770
|
}
|
|
753
771
|
} };
|
|
@@ -852,7 +870,7 @@ by: (explicitFilter) => {
|
|
|
852
870
|
* @example
|
|
853
871
|
* ```ts
|
|
854
872
|
* author: t.relation("author", {
|
|
855
|
-
* query: (_args, ctx) => ctx.abilities.users.filter("read").query.single,
|
|
873
|
+
* query: async (_args, ctx) => (await ctx.abilities.users.filter("read")).query.single,
|
|
856
874
|
* }),
|
|
857
875
|
* ´´´
|
|
858
876
|
*/
|
|
@@ -890,7 +908,7 @@ by: (explicitFilter) => {
|
|
|
890
908
|
* .where(
|
|
891
909
|
* and(
|
|
892
910
|
* eq(schema.users.id, args.userId),
|
|
893
|
-
* ctx.abilities.users.filter("update").sql.where,
|
|
911
|
+
* (await ctx.abilities.users.filter("update")).sql.where,
|
|
894
912
|
* ),
|
|
895
913
|
* );
|
|
896
914
|
* ```
|
|
@@ -906,7 +924,7 @@ by: (explicitFilter) => {
|
|
|
906
924
|
* @example
|
|
907
925
|
* ```ts
|
|
908
926
|
* author: t.relation("author", {
|
|
909
|
-
* query: (_args, ctx) => ctx.abilities.users.filter("read").query.single,
|
|
927
|
+
* query: async (_args, ctx) => (await ctx.abilities.users.filter("read")).query.single,
|
|
910
928
|
* }),
|
|
911
929
|
* ´´´
|
|
912
930
|
*/
|
|
@@ -942,7 +960,7 @@ by: (explicitFilter) => {
|
|
|
942
960
|
* .where(
|
|
943
961
|
* and(
|
|
944
962
|
* eq(schema.users.id, args.userId),
|
|
945
|
-
* ctx.abilities.users.filter("update").sql.where,
|
|
963
|
+
* (await ctx.abilities.users.filter("update")).sql.where,
|
|
946
964
|
* ),
|
|
947
965
|
* );
|
|
948
966
|
* ```
|
|
@@ -965,8 +983,8 @@ by: (explicitFilter) => {
|
|
|
965
983
|
return ret;
|
|
966
984
|
}
|
|
967
985
|
return { withContext: (userContext) => {
|
|
968
|
-
|
|
969
|
-
const assembleAbilities = (attributes) => {
|
|
986
|
+
const prepare = (action) => {
|
|
987
|
+
const assembleAbilities = async (attributes) => {
|
|
970
988
|
const filters = queryFilters.get(action);
|
|
971
989
|
if (filters === "unrestricted") {
|
|
972
990
|
attributes[ATTR_ABILITIES_STATUS] = "unrestricted";
|
|
@@ -977,19 +995,12 @@ by: (explicitFilter) => {
|
|
|
977
995
|
nothingRegisteredWarningLogger(String(tableName), action);
|
|
978
996
|
return transformToResponse(blockEverythingFilter);
|
|
979
997
|
}
|
|
980
|
-
const
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
const result = func(userContext);
|
|
985
|
-
if (result === "allow") {
|
|
986
|
-
attributes[ATTR_ABILITIES_STATUS] = "unrestricted";
|
|
987
|
-
return transformToResponse();
|
|
988
|
-
}
|
|
989
|
-
if (result === void 0) continue;
|
|
990
|
-
dynamicResults[filtersReturned++] = result;
|
|
998
|
+
const rawResults = await Promise.all(dynamicQueryFilters[action].map((func) => func(userContext)));
|
|
999
|
+
if (rawResults.includes("allow")) {
|
|
1000
|
+
attributes[ATTR_ABILITIES_STATUS] = "unrestricted";
|
|
1001
|
+
return transformToResponse();
|
|
991
1002
|
}
|
|
992
|
-
dynamicResults
|
|
1003
|
+
const dynamicResults = rawResults.filter((r) => r !== void 0);
|
|
993
1004
|
attributes[ATTR_ABILITIES_DYNAMIC] = dynamicResults.length;
|
|
994
1005
|
attributes[ATTR_ABILITIES_STATIC] = simpleQueryFilters[action].length;
|
|
995
1006
|
const allQueryFilters = [...simpleQueryFilters[action], ...dynamicResults];
|
|
@@ -1004,13 +1015,13 @@ by: (explicitFilter) => {
|
|
|
1004
1015
|
attributes[ATTR_ABILITIES_STATUS] = "applied";
|
|
1005
1016
|
return transformToResponse(mergedFilters);
|
|
1006
1017
|
};
|
|
1007
|
-
const run = (span) => {
|
|
1018
|
+
const run = async (span) => {
|
|
1008
1019
|
const attributes = {
|
|
1009
1020
|
[ATTR_TABLE]: String(tableName),
|
|
1010
1021
|
[ATTR_ACTION]: action
|
|
1011
1022
|
};
|
|
1012
1023
|
try {
|
|
1013
|
-
const result = assembleAbilities(attributes);
|
|
1024
|
+
const result = await assembleAbilities(attributes);
|
|
1014
1025
|
log?.debug({
|
|
1015
1026
|
...attributes,
|
|
1016
1027
|
...traceCorrelationFields(telemetryConfig, span)
|
|
@@ -1028,14 +1039,23 @@ by: (explicitFilter) => {
|
|
|
1028
1039
|
span?.setAttributes(attributes);
|
|
1029
1040
|
}
|
|
1030
1041
|
};
|
|
1031
|
-
if (otel?.enabled && otel.tracer) return otel.tracer.startActiveSpan(SPAN_ABILITIES_PREPARE, (span) => {
|
|
1042
|
+
if (otel?.enabled && otel.tracer) return otel.tracer.startActiveSpan(SPAN_ABILITIES_PREPARE, async (span) => {
|
|
1032
1043
|
try {
|
|
1033
|
-
return run(span);
|
|
1044
|
+
return await run(span);
|
|
1034
1045
|
} finally {
|
|
1035
1046
|
span.end();
|
|
1036
1047
|
}
|
|
1037
1048
|
});
|
|
1038
1049
|
return run();
|
|
1050
|
+
};
|
|
1051
|
+
const cache = /* @__PURE__ */ new Map();
|
|
1052
|
+
return { filter: (action) => {
|
|
1053
|
+
let prepared = cache.get(action);
|
|
1054
|
+
if (!prepared) {
|
|
1055
|
+
prepared = guardAgainstMissingAwait(prepare(action));
|
|
1056
|
+
cache.set(action, prepared);
|
|
1057
|
+
}
|
|
1058
|
+
return prepared;
|
|
1039
1059
|
} };
|
|
1040
1060
|
} };
|
|
1041
1061
|
};
|
|
@@ -1118,16 +1138,18 @@ const createEnumImplementer = ({ schema, schemaBuilder }) => {
|
|
|
1118
1138
|
if (enumObject) {
|
|
1119
1139
|
enumSchemaName = enumObject.enumName;
|
|
1120
1140
|
enumValues = enumObject.enumValues;
|
|
1121
|
-
} else if (enumColumn)
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1141
|
+
} else if (enumColumn) {
|
|
1142
|
+
if ((0, drizzle_orm.is)(enumColumn, drizzle_orm_mysql_core.MySqlEnumColumn) || (0, drizzle_orm.is)(enumColumn, drizzle_orm_mysql_core.MySqlEnumObjectColumn)) {
|
|
1143
|
+
enumValues = enumColumn.enumValues;
|
|
1144
|
+
const colTable = enumColumn.table;
|
|
1145
|
+
const tableName = colTable && (0, drizzle_orm.isTable)(colTable) ? (0, drizzle_orm.getTableName)(colTable) : void 0;
|
|
1146
|
+
enumSchemaName = tableName ? `${tableName}_${enumColumn.name}` : enumColumn.name;
|
|
1147
|
+
} else {
|
|
1148
|
+
const pgEnum = enumColumn.enum;
|
|
1149
|
+
if (!pgEnum) throw new RumbleError(`Could not find enum definition on column. Make sure the column is a pgEnum column.`);
|
|
1150
|
+
enumSchemaName = pgEnum.enumName;
|
|
1151
|
+
enumValues = enumColumn.enumValues;
|
|
1152
|
+
}
|
|
1131
1153
|
}
|
|
1132
1154
|
if (!enumSchemaName || !enumValues) throw new RumbleError("Could not determine enum structure!");
|
|
1133
1155
|
const graphqlImplementationName = refName ?? `${(0, es_toolkit.capitalize)((0, drizzle_orm_casing.toCamelCase)(enumSchemaName))}Enum`;
|
|
@@ -1148,8 +1170,10 @@ function mapSQLTypeToGraphQLType({ sqlType, fieldName }) {
|
|
|
1148
1170
|
if (isIntLikeSQLTypeString(normalized)) ret = "Int";
|
|
1149
1171
|
if (isBigIntLikeSQLTypeString(normalized)) ret = "BigInt";
|
|
1150
1172
|
if (isFloatLikeSQLTypeString(normalized)) ret = "Float";
|
|
1151
|
-
if (isStringLikeSQLTypeString(normalized))
|
|
1152
|
-
|
|
1173
|
+
if (isStringLikeSQLTypeString(normalized)) {
|
|
1174
|
+
if (fieldName && (fieldName.toLowerCase().endsWith("_id") || fieldName.toLowerCase().endsWith("id"))) ret = "ID";
|
|
1175
|
+
else ret = "String";
|
|
1176
|
+
}
|
|
1153
1177
|
if (isIDLikeSQLTypeString(normalized)) ret = "ID";
|
|
1154
1178
|
if (isBooleanSQLTypeString(normalized)) ret = "Boolean";
|
|
1155
1179
|
if (isDateTimeLikeSQLTypeString(normalized)) ret = "DateTime";
|
|
@@ -1397,8 +1421,9 @@ const clientCreatorImplementer = ({ builtSchema }) => {
|
|
|
1397
1421
|
useExternalUrqlClient,
|
|
1398
1422
|
removeExisting
|
|
1399
1423
|
})}`);
|
|
1424
|
+
const schema = builtSchema();
|
|
1400
1425
|
await require_generate.generateFromSchema({
|
|
1401
|
-
schema
|
|
1426
|
+
schema,
|
|
1402
1427
|
outputPath,
|
|
1403
1428
|
rumbleImportPath,
|
|
1404
1429
|
apiUrl,
|
|
@@ -1470,7 +1495,7 @@ const createCountQueryImplementer = ({ db, schemaBuilder, whereArgImplementer, m
|
|
|
1470
1495
|
resolve: async (_root, args, ctx, _info) => {
|
|
1471
1496
|
if (isAllowed && !await isAllowed(ctx)) throw new RumbleErrorSafe("Not allowed to perform this action");
|
|
1472
1497
|
deepSetProto(args);
|
|
1473
|
-
return db.select({ count: (0, drizzle_orm.count)() }).from(tableSchema.table).where(ctx.abilities[table].filter(listAction).merge(mapNullFieldsToUndefined(args)).sql.where).then(assertFirstEntryExists).then((r) => r.count);
|
|
1498
|
+
return db.select({ count: (0, drizzle_orm.count)() }).from(tableSchema.table).where((await ctx.abilities[table].filter(listAction)).merge(mapNullFieldsToUndefined(args)).sql.where).then(assertFirstEntryExists).then((r) => r.count);
|
|
1474
1499
|
}
|
|
1475
1500
|
}) };
|
|
1476
1501
|
});
|
|
@@ -2048,15 +2073,15 @@ const createObjectImplementer = ({ db, search, otel, logger: loggerConfig, schem
|
|
|
2048
2073
|
subscribe,
|
|
2049
2074
|
nullable,
|
|
2050
2075
|
description: `Get the ${pluralize.default.plural(relationSchema.tsName)} related to this ${pluralize.default.singular(tableSchema.tsName)}`,
|
|
2051
|
-
query: (args, ctx) => {
|
|
2076
|
+
query: async (args, ctx) => {
|
|
2052
2077
|
args = JSON.parse(JSON.stringify(args));
|
|
2053
2078
|
if (isMany) adjustQueryArgsForSearch({
|
|
2054
2079
|
search,
|
|
2055
2080
|
args,
|
|
2056
2081
|
tableSchema: relationSchema,
|
|
2057
|
-
abilities: ctx.abilities[relationSchema.tsName].filter(readAction)
|
|
2082
|
+
abilities: await ctx.abilities[relationSchema.tsName].filter(readAction)
|
|
2058
2083
|
});
|
|
2059
|
-
const filter = ctx.abilities[relationSchema.tsName].filter(readAction).merge({
|
|
2084
|
+
const filter = (await ctx.abilities[relationSchema.tsName].filter(readAction)).merge({
|
|
2060
2085
|
where: args.where,
|
|
2061
2086
|
limit: args.limit,
|
|
2062
2087
|
extras: args.extras
|
|
@@ -2216,16 +2241,16 @@ const createQueryImplementer = ({ db, schemaBuilder, search, otel, logger: logge
|
|
|
2216
2241
|
});
|
|
2217
2242
|
},
|
|
2218
2243
|
args: manyArgs,
|
|
2219
|
-
resolve: (query, _root, args, ctx, _info) => {
|
|
2244
|
+
resolve: async (query, _root, args, ctx, _info) => {
|
|
2220
2245
|
deepSetProto(args);
|
|
2221
2246
|
adjustQueryArgsForSearch({
|
|
2222
2247
|
search,
|
|
2223
2248
|
args,
|
|
2224
2249
|
tableSchema,
|
|
2225
|
-
abilities: ctx.abilities[table].filter(listAction)
|
|
2250
|
+
abilities: await ctx.abilities[table].filter(listAction)
|
|
2226
2251
|
});
|
|
2227
2252
|
const mappedArgs = mapNullFieldsToUndefined(args);
|
|
2228
|
-
const filter = ctx.abilities[table].filter(listAction).merge(mappedArgs).query.many;
|
|
2253
|
+
const filter = (await ctx.abilities[table].filter(listAction)).merge(mappedArgs).query.many;
|
|
2229
2254
|
if (mappedArgs.offset) filter.offset = mappedArgs.offset;
|
|
2230
2255
|
if (mappedArgs.orderBy) filter.orderBy = mappedArgs.orderBy;
|
|
2231
2256
|
const queryArgs = query(filter);
|
|
@@ -2253,9 +2278,9 @@ const createQueryImplementer = ({ db, schemaBuilder, search, otel, logger: logge
|
|
|
2253
2278
|
smartSubscription: true,
|
|
2254
2279
|
description: `Get a single ${singularName} by ID`,
|
|
2255
2280
|
args: { id: t.arg.id({ required: true }) },
|
|
2256
|
-
resolve: (query, _root, args, ctx, _info) => {
|
|
2281
|
+
resolve: async (query, _root, args, ctx, _info) => {
|
|
2257
2282
|
deepSetProto(args);
|
|
2258
|
-
const filter = ctx.abilities[table].filter(readAction).merge({ where: { [primaryKeyField.name]: args.id } }).query.single;
|
|
2283
|
+
const filter = (await ctx.abilities[table].filter(readAction)).merge({ where: { [primaryKeyField.name]: args.id } }).query.single;
|
|
2259
2284
|
const queryArgs = query(filter);
|
|
2260
2285
|
if (filter.columns) queryArgs.columns = filter.columns;
|
|
2261
2286
|
return findFirst ? findFirst({
|