@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/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
- return pipe(forward(operations$), map((r) => {
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);
@@ -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":";;;;;AAUA,IAAI,+BACU,CAAC;AAEf,MAAM,wBAAuC,OAAO,oBAAoB,CACrE,MAAM,MAAM;CACX,mBAAmB,EAAE;AACvB,CAAC,CAAC,CACD,YAAY,CAAC,CAAC;AAkBjB,SAAS,aAAa,MAAmB;CACvC,IAAI,KAAK,SAAS,YAAY,OAAO,GAAG,aAAa,KAAK,MAAM,EAAE;CAClE,IAAI,KAAK,SAAS,QAAQ,OAAO,IAAI,aAAa,KAAK,MAAM,EAAE;CAC/D,OAAO,KAAK;AACd;AAEA,SAAS,gBACP,SACA,OAC+B;CAC/B,IAAI,IAAI;CACR,OAAO,MAAM,EAAE,SAAS,cAAc,EAAE,SAAS,SAAS,IAAI,EAAE;CAChE,OAAO,MAAM,MAAM,MAAM,EAAE,SAAS,GAAG,IAAI;AAC7C;AAEA,SAAS,gBAAgB,MAA0B;CACjD,OAAO,SAAS,YAAY,SAAS,eAAe,SAAS;AAC/D;AAQA,SAAS,gBAAgB,KAAiB,UAA0B;CAClE,IAAI,CAAC,IAAI,UAAU,IAAI,QAAQ,GAAG;EAChC,IAAI,UAAU,IAAI,QAAQ;EAC1B,OAAO;CACT;CACA,IAAI,IAAI;CACR,OAAO,IAAI,UAAU,IAAI,GAAG,WAAW,GAAG,GAAG;CAC7C,MAAM,OAAO,GAAG,WAAW;CAC3B,IAAI,UAAU,IAAI,IAAI;CACtB,OAAO;AACT;AAEA,MAAa,UAAU;AAEvB,SAAS,cAAc,EACrB,eACA,WACA,QACA,OACA,sBAOC;CACD,MAAM,eAAe,GAAG,WAAW,SAAS,IAAI,WAAW,aAAa;CACxE,MAAM,QAAQ,OAAO,SAAS,MAC3B,QAAQ,MAAM,EAAE,SAAS,QAAQ,CAAC,CAClC,MAAM,MAAM,EAAE,SAAS,OAAO,SAAS,GAAG,cAAc,MAAM,CAAE,IAAI,CAAC,CACrE,OAAO,MAAM,MAAM,EAAE,SAAS,SAAS;CAC1C,MAAM,QAAQ,OAAO,SAAS;CAE9B,MAAM,SAAqB;EACzB,WAAW,CAAC;EACZ,cAAc,CAAC;EACf,2BAAW,IAAI,IAAI;CACrB;CAEA,MAAM,wBAAwB,gBAC5B,gBAAgB,MAAM,MAAM,KAAK,CAAC,EAAE,IACtC;CAEA,MAAM,kBACJ,SAAS,wBACL,mBAAmB;EACjB,gBAAgB,gBAAgB,MAAM,MAAM,KAAK,CAAC,CAAE;EACpD,WAAW;EACX;EACA;EACA;CACF,CAAC,IACD;CAEN,MAAM,iBAAiB,QAAA,YACnB,mBAAmB;EACjB,MAAM,MAAM;EACZ,WAAW,MAAM;EACjB;EACA;CACF,CAAC,IACD;CAMJ,OAAO;EACL,iBAAiB,GAAG,cAAc,GAAG,eALvB,OAAO,aAAa,SAChC,IAAI,OAAO,aAAa,KAAK,IAAI,EAAE,KACnC,GAG0D,KAAK,YAAY,eAAe,GAAG,gBAAgB;EAC/G,WAAW,OAAO;CACpB;AACF;AAEA,SAAgB,wBAAwB,EACtC,WACA,QACA,OACA,QACA,qBAAqB,OACrB,iBACA,sBASC;CACD,IAAI;CACJ,MAAM,YAAY,WAEd,IAAI,MAAM,aAAa,EACrB,IAAI,SAAS,MAAM,UAAU;EAC3B,iBAAiB;EACjB,MAAM,MAAM,QAAQ,IAAI,aAAa,MAAM,QAAQ;EACnD,IAAI,OAAO,QAAQ,YACjB,OAAO,IAAI,KAAK,WAAW;EAE7B,OAAO;CACT,EACF,CAAC,CACL;CAEA,IAAI,yBAAqC,CAAC;CAE1C,MAAM,EAAE,iBAAiB,cAAc,cAAc;EACnD,eAAe;EACf;EACA;EACA;EACA;CACF,CAAC;CAED,MAAM,oBAAmC,CACvC,OAAO,MAAM,iBAAiB,SAAS,CAEzC;CACA,IAAI,oBAAoB;EACtB,MAAM,EAAE,iBAAiB,aAAa,WAAW,YAAY,cAAc;GACzE,eAAe;GACf;GACA;GACA;GACA;EACF,CAAC;EACD,kBAAkB,KAAK,OAAO,aAAa,aAAa,OAAO,CAAC;CAClE;CACA,MAAM,aAAa,aACjB,KACEA,QAAM,iBAAiB,GACvB,OACA,KAAK,MAAW;EACd,IAAI,EAAE,OACJ,MAAM,EAAE;EAGV,MAAM,OAAO,EAAE,OAAO;EACtB,IAAI,OAAO,SAAS,YAAY,SAAS,MAAM;GAC7C,cAAc;GACd,OAAO,UAAU;EACnB;EACA,OAAO;CACT,CAAC,CACH,CACF;CAEA,MAAM,kBAAkB,sBAAsB,WAAW;EACvD,mBAAmB,kBAAkB,WAAW;GAC9C,MAAM,QAAQ,WAAW,WAAW,OAAO;IACzC,OAAO;GACT,CAAC;GACD,aAAa,MAAM,YAAY;EACjC,CAAC;CACH,CAAC;CAED,MAAM,UAAU,IAAI,SAAc,SAAS,WAAW;EACpD,KACE,OAAO,MAAM,iBAAiB,SAAS,GACvC,KAAK,CAAC,GACN,WAAW,MAAW;GACpB,IAAI,EAAE,OAAO;IACX,OAAO,EAAE,KAAK;IACd;GACF;GAEA,MAAM,OAAO,EAAE,OAAO;GACtB,IAAI,OAAO,SAAS,YAAY,SAAS,MAAM;IAC7C,QAAQ,IAAI;IACZ;GACF;GACA,IAAI,OAAO,oBAAoB,aAAa,iBAAiB;IAC3D,gBAAgB,WAAW,QAAQ,UAAU,CAAC;IAC9C;GACF;GAEA,cAAc;GACd,kBAAkB,KAAK,UAAU,IAAI,CAAC;GAEtC,gBAAgB,WAAW;IACzB,IAAI;KACF,MAAM,IAAI,UAAU;KACpB,OAAO,OAAO,GAAG,UAAU;KAC3B,QAAQ,CAAC;IACX,SAAS,KAAK;KACZ,OAAO,GAAG;IACZ;GACF,CAAC;EACH,CAAC,CACH;CACF,CAAC;CAED,OAAO,OAAO,SAAS,UAAU;CACjC,OAAO;AACT;AAEA,SAAgB,2BAA2B,EACzC,cACA,OACA,QACA,QACA,sBAOC;CACD,MAAM,EAAE,iBAAiB,cAAc,cAAc;EACnD,eAAe;EACf,WAAW;EACX;EACA;EACA;CACF,CAAC;CAED,MAAM,aAAa,aACjB,KACE,KAAK,OAAO,SAAS,iBAAiB,SAAS,GAAU,KAAK,GAC9D,KAAK,MAAW;EACd,IAAI,EAAE,OACJ,MAAM,EAAE;EAIV,OADa,EAAE,OAAO;CAExB,CAAC,CACH,CACF;CAEA,MAAM,UAAU,IAAI,SAAc,SAAS,WAAW;EACpD,KACE,OAAO,SAAS,iBAAiB,SAAS,GAC1C,KAAK,CAAC,GACN,WAAW,MAAW;GACpB,IAAI,EAAE,OAAO;IACX,OAAO,EAAE,KAAK;IACd;GACF;GAEA,QAAQ,EAAE,OAAO,aAAa;EAChC,CAAC,CACH;CACF,CAAC;CAED,OAAO,OAAO,SAAS,UAAU;CACjC,OAAO;AACT;AAEA,SAAgB,+BAA+B,EAC7C,kBACA,OACA,QACA,QACA,sBAOC;CACD,MAAM,EAAE,iBAAiB,cAAc,cAAc;EACnD,eAAe;EACf,WAAW;EACX;EACA;EACA;CACF,CAAC;CAED,OAAO,KACL,OAAO,aAAa,iBAAiB,SAAS,GAC9C,KAAK,MAAW;EACd,IAAI,EAAE,OACJ,MAAM,EAAE;EAGV,OAAO,EAAE,OAAO;CAClB,CAAC,GACD,YACF;AACF;AAEA,SAAS,mBAAmB,EAC1B,gBACA,WACA,OACA,oBACA,UAOC;CACD,IACE,sBACA,OAAO,UAAU,wBAAwB,aAEzC,UAAU,sBAAsB;CAGlC,MAAM,aAAa,MAAM,MAAM,MAAM,EAAE,SAAS,cAAc;CA8C9D,OAAO;EA5CK,OAAO,QAAQ,SAAS,CAAC,CAClC,QAAQ,CAAC,SAAS,QAAQ,OAAO,CAAC,CAClC,QAAQ,KAAK,CAAC,KAAK,WAAW;EAC7B,IAAI,OAAO,UAAU,UAAU;GAC7B,MAAM,WACJ,cAAc,YAAY,aACtB,WAAW,OAAO,MAAM,MAAM,EAAE,SAAS,GAAG,IAC5C,KAAA;GAEN,IAAI,aAAa;GACjB,IAAI,MAAA,aAAkB,UACpB,aAAa,mBAAmB;IAC9B,MAAM,MAAM;IACZ;IACA,WAAW,SAAS;IACpB;GACF,CAAC;GAGH,MAAM,eAAe,WACjB,gBAAgB,SAAS,MAAM,KAAK,IACpC,KAAA;GAEJ,IAAI,gBAAgB,cAAc,IAAI,GACpC,OAAO,GAAG,MAAM,WAAW,GAAG,mBAAmB;IAC/C,gBAAgB,aAAc;IAC9B,WAAW;IACX;IACA;GACF,CAAC,EAAE;;QAGH,OAAO,GAAG,MAAM,WAAW;;EAG/B,OACE,IAAI,OAAO,UAAU,aAAa,OAChC,OAAO,GAAG,IAAI;;EAIlB,OAAO;CACT,GAAG,EAGH,EAAE;AACN;AAEA,SAAS,mBAAmB,EAC1B,MACA,WACA,OACA,UAMC;CACD,MAAM,UAAU,OAAO,QAAQ,IAAI;CAEnC,IAAI,QAAQ,SAAS,GACnB,OAAO,IAAI,QACR,KAAK,CAAC,KAAK,WAAW;EACrB,MAAM,SAAS,UAAU,MAAM,MAAM,EAAE,SAAS,GAAG;EAEnD,IAAI,CAAC,QACH,MAAM,IAAI,MACR,YAAY,IAAI,gCAAgC,KAAK,UAAU,UAAU,KAAK,MAAM,EAAE,IAAI,CAAC,GAC7F;EAGF,MAAM,UAAU,gBAAgB,QAAQ,GAAG;EAC3C,OAAO,aAAa,KAAK,IAAI,QAAQ,IAAI,aAAa,OAAO,IAAI,GAAG;EACpE,OAAO,UAAU,WAAW,kBAAkB;GAC5C,KAAK;GACL;GACA;EACF,CAAC;EAED,OAAO,GAAG,IAAI,KAAK;CACrB,CAAC,CAAC,CACD,KAAK,IAAI,EAAE;CAGhB,OAAO;AACT;AAEA,SAAS,kBAAkB,EACzB,KACA,QACA,SAKM;CACN,IAAI,QAAQ,MACV,OAAO;CAGT,IAAI,MAAM,QAAQ,GAAG,GACnB,OAAO,IAAI,KAAK,MAAM;EACpB,OAAO,kBAAkB;GACvB,KAAK;GACL;GACA;EACF,CAAC;CACH,CAAC;CAKH,IAAI,OAFmB,QAEP,YAAY,EAAE,eAAe,OAAO;EAClD,IAAI,OAAO,OAAO;EAElB,IAAI,KAAK,SAAS,YAChB,OAAO,KAAK;EAEd,IAAI,KAAK,SAAS,QAChB,OAAO,KAAK;EAEd,IAAI,KAAK,SAAS,YAChB,OAAO,KAAK;EAGd,MAAM,uBAAuB,MAAM,MAChC,MAAM,EAAE,SAAU,KAAa,IAClC;EAEA,IAAI,sBAAsB,SAAS,gBACjC,OAAO;EAGT,MAAM,SAA8B,CAAC;EACrC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,GAAG,GAAG;GAC9C,MAAM,aAAa,qBAAqB,YAAY,MACjD,MAAM,EAAE,SAAS,GACpB;GAEA,IAAI,CAAC,YACH,MAAM,IAAI,MACR,+DAA+D,IAAI,YAAY,qBAAqB,YAAY,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI,GAC9I;GAGF,OAAO,OAAO,kBAAkB;IAC9B,KAAK;IACL;IACA,QAAQ;GACV,CAAC;EACH;EACA,OAAO;CACT;CAEA,IAAI,OAAO,OAAO;CAElB,IAAI,KAAK,SAAS,YAChB,OAAO,KAAK;CAGd,IAAI,eAAe,MAAM;EACvB,MAAM,OAAQ,KAAa;EAC3B,IAAI;EACJ,QAAQ,MAAR;GACE,KAAK;IACH,QAAQ,aAAa,UAAU,GAAG;IAClC;GACF,KAAK;IACH,QAAQ,oBAAoB,UAAU,GAAG;IACzC;GACF,SACE,MAAM,IAAI,MACR,0BAA0B,KAAK,4BACjC;EACJ;EACA,OAAO;CACT;CAEA,QAAQ,OAAO,KAAf;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,WACH,OAAO;EACT,KAAK,UACH,MAAM,IAAI,MAAM,8CAA8C;EAChE,KAAK,aACH,OAAO;EACT,KAAK,YACH,MAAM,IAAI,MAAM,gDAAgD;CACpE;CAEA,MAAM,IAAI,MAAM,kCAAkC;AACpD;;;AC7iBA,SAAgB,cAGd,EACA,YACA,wBACA,iBACA,QACA,sBAOC;CACD,OAAO,IAAI,MACT,CAAC,GACD,EACE,MAAM,SAAS,SAAS;EACtB,QAAQ,UAA+B;GACrC,OAAO,wBAAwB;IAC7B,WAAW;IACX;IACA,QAAQ;IACR,oBAAoB,uBAAuB,IAAI,IAAc;IAC7D;IACA;IACA;GACF,CAAC;EACH;CACF,EACF,CACF;AACF;;;AClCA,SAAgB,aAAmD,EACjE,YACA,QACA,sBAKC;CACD,OAAO,IAAI,MACT,CAAC,GACD,EACE,MAAM,SAAS,SAAS;EACtB,QAAQ,UAA+B;GACrC,OAAO,2BAA2B;IAChC,cAAc;IACd;IACA,QAAQ;IACR;IACA;GACF,CAAC;EACH;CACF,EACF,CACF;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACGA,SAAgB,cAAc,OAAY,IAAyB;CACjE,MAAM,uBAAO,IAAI,QAAQ;CAEzB,MAAM,WAAW,UAAoB;EACnC,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,MAAM,IAAI,OAAO;EAG1B,IACE,UAAU,QACV,UAAU,KAAA,KACV,OAAO,UAAU,YACjB,MAAM,gBAAgB,QACtB;GACA,IAAI,KAAK,IAAI,KAAK,GAAG,OAAO;GAC5B,KAAK,IAAI,KAAK;GACd,KAAK,MAAM,OAAO,OAAO,KAAK,KAAK,GACjC,MAAM,OAAO,QAAQ,MAAM,IAAI;GAEjC,OAAO;EACT;EAEA,OAAO,GAAG,KAAK;CACjB;CAEA,OAAO,QAAQ,KAAK;AACtB;;;ACvDA,MAAM,eACJ;AAEF,MAAa,sBAAgC,EAAE,QAAQ,SAAS,cAAc;CAC5E,QAAQ,gBAAgB;EAGtB,OAAO,KAFkB,QAAQ,WAGhB,GACf,KAAK,MAAW;GACd,EAAE,OAAO,cAAc,EAAE,OAAO,UAAU;IACxC,IAAI,OAAO,UAAU,YAAY,CAAC,aAAa,KAAK,KAAK,GACvD,OAAO;IAGT,MAAM,OAAO,KAAK,MAAM,KAAK;IAC7B,IAAI,CAAC,OAAO,MAAM,IAAI,GACpB,OAAO,IAAI,KAAK,IAAI;IAGtB,OAAO;GACT,CAAC;GACD,OAAO;EACT,CAAC,CACH;CACF;AACF;;;ACzBA,SAAgB,UAGd,EACA,YACA,iBACA,QACA,sBAMC;CACD,OAAO,IAAI,MACT,CAAC,GACD,EACE,MAAM,SAAS,SAAS;EACtB,QAAQ,UAAgC;GACtC,OAAO,wBAAwB;IAC7B,WAAW;IACX;IACA,QAAQ;IACR,oBAAoB;IACpB;IACA;IACA;GACF,CAAC;EACH;CACF,EACF,CACF;AACF;;;AC3BA,SAAgB,iBAA2D,EACzE,YACA,QACA,sBAKC;CACD,OAAO,IAAI,MACT,CAAC,GACD,EACE,MAAM,SAAS,SAAS;EACtB,QAAQ,UAA+B;GACrC,OAAO,+BAA+B;IACpC,kBAAkB;IAClB;IACA,QAAQ;IACR;IACA;GACF,CAAC;EACH;CACF,EACF,CACF;AACF"}
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.23.24";
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" && filter.constructor.name !== "AsyncFunction";
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") if (setUnrestrictedByThisCall.has(action)) queryFilters.set(action, []);
750
- else continue;
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
- return { filter: (action) => {
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 dynamicResults = new Array(dynamicQueryFilters[action].length);
981
- let filtersReturned = 0;
982
- for (let i = 0; i < dynamicQueryFilters[action].length; i++) {
983
- const func = dynamicQueryFilters[action][i];
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.length = filtersReturned;
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) if ((0, drizzle_orm.is)(enumColumn, drizzle_orm_mysql_core.MySqlEnumColumn) || (0, drizzle_orm.is)(enumColumn, drizzle_orm_mysql_core.MySqlEnumObjectColumn)) {
1122
- enumValues = enumColumn.enumValues;
1123
- const colTable = enumColumn.table;
1124
- const tableName = colTable && (0, drizzle_orm.isTable)(colTable) ? (0, drizzle_orm.getTableName)(colTable) : void 0;
1125
- enumSchemaName = tableName ? `${tableName}_${enumColumn.name}` : enumColumn.name;
1126
- } else {
1127
- const pgEnum = enumColumn.enum;
1128
- if (!pgEnum) throw new RumbleError(`Could not find enum definition on column. Make sure the column is a pgEnum column.`);
1129
- enumSchemaName = pgEnum.enumName;
1130
- enumValues = enumColumn.enumValues;
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)) if (fieldName && (fieldName.toLowerCase().endsWith("_id") || fieldName.toLowerCase().endsWith("id"))) ret = "ID";
1152
- else ret = "String";
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: builtSchema(),
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({