@m1212e/rumble 0.21.4 → 0.22.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.
@@ -1,3 +1,3 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_generate = require("../generate-Ch5LEiBr.cjs");
2
+ const require_generate = require("../generate-CM3XjmlO.cjs");
3
3
  exports.generateFromSchema = require_generate.generateFromSchema;
@@ -1,2 +1,2 @@
1
- import { t as generateFromSchema } from "../generate-B4w-hX0K.mjs";
1
+ import { t as generateFromSchema } from "../generate-0QFVc3Sg.mjs";
2
2
  export { generateFromSchema };
@@ -147,13 +147,18 @@ function makeTSInputObjectTypeField(returnType) {
147
147
  return returnTypeString;
148
148
  }
149
149
  function stringifyTSObjectArg(arg) {
150
- let ret = "unknown";
151
150
  let isNullable = true;
152
- if (arg instanceof GraphQLNonNull) {
153
- isNullable = false;
151
+ let isList = false;
152
+ for (let index = 0; index < 4; index++) if (arg instanceof GraphQLNonNull) {
153
+ if (!isList) isNullable = false;
154
+ arg = arg.ofType;
155
+ } else if (arg instanceof GraphQLList) {
156
+ isList = true;
154
157
  arg = arg.ofType;
155
158
  }
156
- if (arg instanceof GraphQLInputObjectType || arg instanceof GraphQLScalarType) ret = arg.name;
159
+ let ret = "unknown";
160
+ if (arg instanceof GraphQLInputObjectType || arg instanceof GraphQLScalarType || arg instanceof GraphQLEnumType) ret = arg.name;
161
+ if (isList) ret += "[]";
157
162
  if (isNullable) ret += " | null | undefined";
158
163
  return ret;
159
164
  }
@@ -222,4 +227,4 @@ export const schema = ${uneval(minifyIntrospectionQuery(getIntrospectedSchema(sc
222
227
  //#endregion
223
228
  export { generateFromSchema as t };
224
229
 
225
- //# sourceMappingURL=generate-B4w-hX0K.mjs.map
230
+ //# sourceMappingURL=generate-0QFVc3Sg.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-0QFVc3Sg.mjs","names":[],"sources":["../lib/client/generate/client.ts","../lib/client/generate/tsRepresentation.ts","../lib/client/generate/generate.ts"],"sourcesContent":["export const autoGenerationPreamble = `// This file is auto-generated. Do not edit manually.\n// @generated\n/* eslint-disable */\n// biome-ignore-all lint: This file is auto-generated\n// biome-ignore-all assist: This file is auto-generated\n// biome-ignore-all syntax: This file is auto-generated`;\n\nexport function generateClient({\n apiUrl,\n rumbleImportPath,\n useExternalUrqlClient,\n availableSubscriptions,\n schemaPath,\n forceReactivity,\n autoIncludeId,\n}: {\n rumbleImportPath: string;\n useExternalUrqlClient: string | boolean;\n apiUrl?: string;\n availableSubscriptions: Set<string>;\n schemaPath: string;\n forceReactivity?: boolean;\n autoIncludeId?: string | boolean;\n}) {\n const imports: string[] = [];\n let code: string = \"\";\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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"}
@@ -147,13 +147,18 @@ function makeTSInputObjectTypeField(returnType) {
147
147
  return returnTypeString;
148
148
  }
149
149
  function stringifyTSObjectArg(arg) {
150
- let ret = "unknown";
151
150
  let isNullable = true;
152
- if (arg instanceof graphql.GraphQLNonNull) {
153
- isNullable = false;
151
+ let isList = false;
152
+ for (let index = 0; index < 4; index++) if (arg instanceof graphql.GraphQLNonNull) {
153
+ if (!isList) isNullable = false;
154
+ arg = arg.ofType;
155
+ } else if (arg instanceof graphql.GraphQLList) {
156
+ isList = true;
154
157
  arg = arg.ofType;
155
158
  }
156
- if (arg instanceof graphql.GraphQLInputObjectType || arg instanceof graphql.GraphQLScalarType) ret = arg.name;
159
+ let ret = "unknown";
160
+ if (arg instanceof graphql.GraphQLInputObjectType || arg instanceof graphql.GraphQLScalarType || arg instanceof graphql.GraphQLEnumType) ret = arg.name;
161
+ if (isList) ret += "[]";
157
162
  if (isNullable) ret += " | null | undefined";
158
163
  return ret;
159
164
  }
@@ -227,4 +232,4 @@ Object.defineProperty(exports, "generateFromSchema", {
227
232
  }
228
233
  });
229
234
 
230
- //# sourceMappingURL=generate-Ch5LEiBr.cjs.map
235
+ //# sourceMappingURL=generate-CM3XjmlO.cjs.map
@@ -0,0 +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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"}
package/out/index.cjs CHANGED
@@ -22,7 +22,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
22
22
  }) : target, mod));
23
23
  //#endregion
24
24
  const require_lazy = require("./lazy-CAN0oaXD.cjs");
25
- const require_generate = require("./generate-Ch5LEiBr.cjs");
25
+ const require_generate = require("./generate-CM3XjmlO.cjs");
26
26
  let graphql = require("graphql");
27
27
  let _escape_tech_graphql_armor = require("@escape.tech/graphql-armor");
28
28
  let _graphql_yoga_plugin_disable_introspection = require("@graphql-yoga/plugin-disable-introspection");
@@ -208,7 +208,7 @@ function mapNullFieldsToUndefined(obj) {
208
208
  }
209
209
  //#endregion
210
210
  //#region package.json
211
- var version = "0.21.4";
211
+ var version = "0.22.1";
212
212
  //#endregion
213
213
  //#region lib/helpers/mergeFilters.ts
214
214
  function mergeFilters(filterA, filterB, mode = "AND") {
@@ -843,66 +843,126 @@ function mapSQLTypeToGraphQLType({ sqlType, fieldName }) {
843
843
  const makeDefaultName = (dbName) => `${(0, es_toolkit.capitalize)((0, drizzle_orm_casing.toCamelCase)(dbName.toString()))}WhereInputArgument`;
844
844
  const createWhereArgImplementer = ({ db, schemaBuilder, enumImplementer }) => {
845
845
  const referenceStorage = /* @__PURE__ */ new Map();
846
+ const enumArrayWhereInputStorage = /* @__PURE__ */ new Map();
847
+ const getEnumArrayWhereInput = (enumImpl) => {
848
+ const typeName = `${enumImpl.name}WhereInputArgument`;
849
+ const existing = enumArrayWhereInputStorage.get(typeName);
850
+ if (existing) return existing;
851
+ const ret = schemaBuilder.inputRef(typeName);
852
+ enumArrayWhereInputStorage.set(typeName, ret);
853
+ ret.implement({ fields: (t) => ({
854
+ eq: t.field({
855
+ type: enumImpl,
856
+ required: false
857
+ }),
858
+ ne: t.field({
859
+ type: enumImpl,
860
+ required: false
861
+ }),
862
+ in: t.field({
863
+ type: [enumImpl],
864
+ required: false
865
+ }),
866
+ notIn: t.field({
867
+ type: [enumImpl],
868
+ required: false
869
+ }),
870
+ isNull: t.boolean({ required: false }),
871
+ isNotNull: t.boolean({ required: false }),
872
+ arrayOverlaps: t.field({
873
+ type: [enumImpl],
874
+ required: false
875
+ }),
876
+ arrayContained: t.field({
877
+ type: [enumImpl],
878
+ required: false
879
+ }),
880
+ arrayContains: t.field({
881
+ type: [enumImpl],
882
+ required: false
883
+ }),
884
+ AND: t.field({
885
+ type: [ret],
886
+ required: false
887
+ }),
888
+ OR: t.field({
889
+ type: [ret],
890
+ required: false
891
+ }),
892
+ NOT: t.field({
893
+ type: ret,
894
+ required: false
895
+ })
896
+ }) });
897
+ return ret;
898
+ };
846
899
  const whereArgImplementer = ({ table, refName, dbName }) => {
847
900
  const tableSchema = tableHelper({
848
901
  db,
849
902
  table: dbName ?? table
850
903
  });
851
904
  const inputTypeName = refName ?? makeDefaultName(tableSchema.tsName);
852
- let ret = referenceStorage.get(inputTypeName);
853
- if (ret) return ret;
854
- const implement = () => {
855
- return schemaBuilder.inputType(inputTypeName, { fields: (t) => {
856
- const mapSQLTypeStringToInputPothosType = (sqlType, fieldName) => {
857
- const gqlType = mapSQLTypeToGraphQLType({
858
- sqlType,
859
- fieldName
860
- });
861
- switch (gqlType) {
862
- case "Int": return t.field({ type: "IntWhereInputArgument" });
863
- case "String": return t.field({ type: "StringWhereInputArgument" });
864
- case "Boolean": return t.boolean({ required: false });
865
- case "Date": return t.field({ type: "DateWhereInputArgument" });
866
- case "DateTime": return t.field({ type: "DateWhereInputArgument" });
867
- case "Float": return t.field({ type: "FloatWhereInputArgument" });
868
- case "ID": return t.id({ required: false });
869
- case "JSON": return t.field({
870
- type: "JSON",
871
- required: false
872
- });
873
- default: throw new RumbleError(`Unsupported argument type ${gqlType} for column ${sqlType}`);
874
- }
875
- };
876
- const fields = Object.entries(tableSchema.columns).reduce((acc, [key, value]) => {
877
- if (isEnumSchema(value)) {
878
- const enumImpl = enumImplementer({ enumColumn: value });
879
- acc[key] = t.field({
880
- type: enumImpl,
881
- required: false
882
- });
883
- } else acc[key] = mapSQLTypeStringToInputPothosType(value.getSQLType(), key);
884
- return acc;
885
- }, {});
886
- const relations = Object.entries(tableSchema.relations ?? {}).reduce((acc, [key, value]) => {
887
- const targetTsName = value.targetTableName;
888
- const referenceModel = whereArgImplementer({ dbName: tableHelper({
889
- db,
890
- table: targetTsName
891
- }).dbName });
905
+ const existing = referenceStorage.get(inputTypeName);
906
+ if (existing) return existing;
907
+ const ret = schemaBuilder.inputRef(inputTypeName);
908
+ referenceStorage.set(inputTypeName, ret);
909
+ ret.implement({ fields: (t) => {
910
+ const mapSQLTypeStringToInputPothosType = (sqlType, fieldName) => {
911
+ const gqlType = mapSQLTypeToGraphQLType({
912
+ sqlType,
913
+ fieldName
914
+ });
915
+ switch (gqlType) {
916
+ case "Int": return t.field({ type: "IntWhereInputArgument" });
917
+ case "String": return t.field({ type: "StringWhereInputArgument" });
918
+ case "Boolean": return t.field({ type: "BooleanWhereInputArgument" });
919
+ case "Date": return t.field({ type: "DateWhereInputArgument" });
920
+ case "DateTime": return t.field({ type: "DateWhereInputArgument" });
921
+ case "Float": return t.field({ type: "FloatWhereInputArgument" });
922
+ case "ID": return t.field({ type: "IDWhereInputArgument" });
923
+ case "JSON": return t.field({ type: "JSONWhereInputArgument" });
924
+ default: throw new RumbleError(`Unsupported argument type ${gqlType} for column ${sqlType}`);
925
+ }
926
+ };
927
+ const fields = Object.entries(tableSchema.columns).reduce((acc, [key, value]) => {
928
+ if (isEnumSchema(value)) {
929
+ const enumImpl = enumImplementer({ enumColumn: value });
892
930
  acc[key] = t.field({
893
- type: referenceModel,
931
+ type: value.dimensions > 0 ? getEnumArrayWhereInput(enumImpl) : enumImpl,
894
932
  required: false
895
933
  });
896
- return acc;
897
- }, {});
898
- return {
899
- ...fields,
900
- ...relations
901
- };
902
- } });
903
- };
904
- ret = implement();
905
- referenceStorage.set(inputTypeName, ret);
934
+ } else acc[key] = mapSQLTypeStringToInputPothosType(value.getSQLType(), key);
935
+ return acc;
936
+ }, {});
937
+ const relations = Object.entries(tableSchema.relations ?? {}).reduce((acc, [key, value]) => {
938
+ const targetTsName = value.targetTableName;
939
+ const referenceModel = whereArgImplementer({ dbName: tableHelper({
940
+ db,
941
+ table: targetTsName
942
+ }).dbName });
943
+ acc[key] = t.field({
944
+ type: referenceModel,
945
+ required: false
946
+ });
947
+ return acc;
948
+ }, {});
949
+ return {
950
+ ...fields,
951
+ ...relations,
952
+ AND: t.field({
953
+ type: [ret],
954
+ required: false
955
+ }),
956
+ OR: t.field({
957
+ type: [ret],
958
+ required: false
959
+ }),
960
+ NOT: t.field({
961
+ type: ret,
962
+ required: false
963
+ })
964
+ };
965
+ } });
906
966
  return ret;
907
967
  };
908
968
  return whereArgImplementer;
@@ -949,7 +1009,7 @@ function deepSetProto(obj, proto = Object.prototype, seen = /* @__PURE__ */ new
949
1009
  if (obj === null || typeof obj !== "object") return;
950
1010
  if (seen.has(obj)) return;
951
1011
  seen.add(obj);
952
- Object.setPrototypeOf(obj, proto);
1012
+ if (!Array.isArray(obj)) Object.setPrototypeOf(obj, proto);
953
1013
  for (const key of Object.keys(obj)) deepSetProto(obj[key], proto, seen);
954
1014
  }
955
1015
  //#endregion
@@ -1149,7 +1209,11 @@ async function initSearchIfApplicable(input) {
1149
1209
  const threshold = Number(input.search.threshold);
1150
1210
  if (threshold < 0 || threshold > 1) throw new Error(`Search threshold must be between 0 and 1`);
1151
1211
  const dbName = (await input.db.execute(drizzle_orm.sql`SELECT current_database()`)).rows[0].current_database;
1152
- await input.db.execute(drizzle_orm.sql.raw(`ALTER DATABASE ${dbName} SET pg_trgm.similarity_threshold = ${threshold};`));
1212
+ try {
1213
+ await input.db.execute(drizzle_orm.sql.raw(`ALTER DATABASE ${dbName} SET pg_trgm.similarity_threshold = ${threshold};`));
1214
+ } catch (error) {
1215
+ if (error?.cause?.code !== "XX000" && error?.code !== "XX000") throw error;
1216
+ }
1153
1217
  }
1154
1218
  if (input.search?.cpu_operator_cost) {
1155
1219
  if (typeof input.search.cpu_operator_cost !== "number") throw new Error(`CPU operator cost must be a number`);
@@ -1616,6 +1680,77 @@ function implementDefaultWhereInputArgs(schemaBuilder) {
1616
1680
  OR: t.field({ type: [DateWhereInputArgument] }),
1617
1681
  NOT: t.field({ type: DateWhereInputArgument })
1618
1682
  }) });
1683
+ const BooleanWhereInputArgument = schemaBuilder.inputRef("BooleanWhereInputArgument").implement({ fields: (t) => ({
1684
+ eq: t.boolean(),
1685
+ ne: t.boolean(),
1686
+ in: t.booleanList(),
1687
+ notIn: t.booleanList(),
1688
+ isNull: t.boolean(),
1689
+ isNotNull: t.boolean(),
1690
+ arrayOverlaps: t.booleanList(),
1691
+ arrayContained: t.booleanList(),
1692
+ arrayContains: t.booleanList(),
1693
+ AND: t.field({ type: [BooleanWhereInputArgument] }),
1694
+ OR: t.field({ type: [BooleanWhereInputArgument] }),
1695
+ NOT: t.field({ type: BooleanWhereInputArgument })
1696
+ }) });
1697
+ const IDWhereInputArgument = schemaBuilder.inputRef("IDWhereInputArgument").implement({ fields: (t) => ({
1698
+ eq: t.id(),
1699
+ ne: t.id(),
1700
+ gt: t.id(),
1701
+ gte: t.id(),
1702
+ lt: t.id(),
1703
+ lte: t.id(),
1704
+ in: t.idList(),
1705
+ notIn: t.idList(),
1706
+ like: t.string(),
1707
+ ilike: t.string(),
1708
+ notLike: t.string(),
1709
+ notIlike: t.string(),
1710
+ isNull: t.boolean(),
1711
+ isNotNull: t.boolean(),
1712
+ arrayOverlaps: t.idList(),
1713
+ arrayContained: t.idList(),
1714
+ arrayContains: t.idList(),
1715
+ AND: t.field({ type: [IDWhereInputArgument] }),
1716
+ OR: t.field({ type: [IDWhereInputArgument] }),
1717
+ NOT: t.field({ type: IDWhereInputArgument })
1718
+ }) });
1719
+ const JSONWhereInputArgument = schemaBuilder.inputRef("JSONWhereInputArgument").implement({ fields: (t) => ({
1720
+ eq: t.field({
1721
+ type: "JSON",
1722
+ required: false
1723
+ }),
1724
+ ne: t.field({
1725
+ type: "JSON",
1726
+ required: false
1727
+ }),
1728
+ in: t.field({
1729
+ type: ["JSON"],
1730
+ required: false
1731
+ }),
1732
+ notIn: t.field({
1733
+ type: ["JSON"],
1734
+ required: false
1735
+ }),
1736
+ isNull: t.boolean(),
1737
+ isNotNull: t.boolean(),
1738
+ arrayOverlaps: t.field({
1739
+ type: ["JSON"],
1740
+ required: false
1741
+ }),
1742
+ arrayContained: t.field({
1743
+ type: ["JSON"],
1744
+ required: false
1745
+ }),
1746
+ arrayContains: t.field({
1747
+ type: ["JSON"],
1748
+ required: false
1749
+ }),
1750
+ AND: t.field({ type: [JSONWhereInputArgument] }),
1751
+ OR: t.field({ type: [JSONWhereInputArgument] }),
1752
+ NOT: t.field({ type: JSONWhereInputArgument })
1753
+ }) });
1619
1754
  }
1620
1755
  //#endregion
1621
1756
  //#region lib/runtimeFiltersPlugin/filterTypes.ts