@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.
- package/out/client/generate.cjs +1 -1
- package/out/client/generate.mjs +1 -1
- package/out/{generate-B4w-hX0K.mjs → generate-0QFVc3Sg.mjs} +10 -5
- package/out/generate-0QFVc3Sg.mjs.map +1 -0
- package/out/{generate-Ch5LEiBr.cjs → generate-CM3XjmlO.cjs} +10 -5
- package/out/generate-CM3XjmlO.cjs.map +1 -0
- package/out/index.cjs +190 -55
- package/out/index.cjs.map +1 -1
- package/out/index.d.cts +66 -49
- package/out/index.d.cts.map +1 -1
- package/out/index.d.mts +66 -49
- package/out/index.d.mts.map +1 -1
- package/out/index.mjs +190 -55
- package/out/index.mjs.map +1 -1
- package/package.json +1 -1
- package/out/generate-B4w-hX0K.mjs.map +0 -1
- package/out/generate-Ch5LEiBr.cjs.map +0 -1
package/out/client/generate.cjs
CHANGED
package/out/client/generate.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as generateFromSchema } from "../generate-
|
|
1
|
+
import { t as generateFromSchema } from "../generate-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
|
-
|
|
153
|
-
|
|
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
|
-
|
|
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-
|
|
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
|
-
|
|
153
|
-
|
|
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
|
-
|
|
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-
|
|
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":";;;;;;AAAA,MAAa,yBAAyB;;;;;;AAOtC,SAAgB,eAAe,EAC7B,QACA,kBACA,uBACA,wBACA,YACA,iBACA,iBASC;CACD,MAAM,UAAoB,CAAC;CAC3B,IAAI,OAAe;CAEnB,MAAM,YACJ,OAAO,kBAAkB,WACrB,8BAA8B,cAAc,KAC5C,kBAAkB,OAChB,mCACA;CAER,IAAI,OAAO,0BAA0B,UACnC,QAAQ,KAAK,+BAA+B,sBAAsB,GAAG;CAGvE,QAAQ,KAAK,qDAAqD;CAClE,QAAQ,KAAK,4DAA4D;CACzE,QAAQ,KAAK,uCAAuC,iBAAiB,GAAG;CACxE,QAAQ,KAAK,2BAA2B,WAAW,GAAG;CAEtD,QAAQ,KACN,6EAA6E,iBAAiB,GAChG;CAEA,MAAM,6BACJ,OAAO,oBAAoB,aAAa,kBACpC,gCACA;CACN,MAAM,4BACJ,OAAO,oBAAoB,aAAa,kBAAkB,WAAW;CAEvE,QAAQ;;UAEA,UAAU,yEAAyE;;;;;;;;;CAU3F,IAAI,CAAC,uBACH,QAAQ;;;CAKV,QAAQ;;;;;;;;;;kCAUwB,0BAA0B;;sCAEtB,uBAC/B,OAAO,CAAC,CACR,QAAQ,CAAC,CACT,KAAK,UAAU,IAAI,MAAM,EAAE,CAAC,CAC5B,KAAK,IAAI,EAAE;WACP,6BAA6B,UAAU;;;;;;;WAOvC,UAAU;;;;;;;WAOV,UAAU;;;;;0BAKK,0BAA0B;;WAEzC,6BAA6B,UAAU;;;CAIhD,OAAO;EACL;EACA;CACF;AACF;;;ACpGA,SAAgB,qBAAqB,OAAoB;CACvD,IAAI,iBAAiBA,QAAAA,mBACnB,OAAO,qBAAqB,KAAK;MAC5B,IAAI,iBAAiBC,QAAAA,mBAC1B,OAAO,+BAA+B,KAAK;MACtC,IAAI,iBAAiBC,QAAAA,iBAC1B,OAAO,+BAA+B,KAAK;MACtC,IAAI,iBAAiBC,QAAAA,wBAC1B,OAAO,0BAA0B,KAAK;CAGxC,MAAM,IAAI,MAAM,uBAAuB,OAAO;AAChD;AAEA,SAAS,qBAAqB,OAA0B;CACtD,MAAM,oCAAoB,IAAI,IAAoB;CAClD,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,UAAU,CAAC,GACzD,kBAAkB,IAAI,KAAK,sBAAsB,MAAM,MAAM,MAAM,IAAI,CAAC;CAG1E,OAAO;IACL,kBACC,QAAQ,CAAC,CACT,KAAK,CAAC,KAAK,WAAW,GAAG,IAAI,IAAI,OAAO,CAAC,CACzC,QAAQ,CAAC,CACT,KAAK,OAAO,EAAE;;AAEnB;AAEA,SAAS,0BAA0B,OAA+B;CAChE,MAAM,oCAAoB,IAAI,IAAoB;CAClD,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,UAAU,CAAC,GACzD,kBAAkB,IAAI,KAAK,2BAA2B,MAAM,IAAI,CAAC;CAGnE,OAAO;IACL,kBACC,QAAQ,CAAC,CACT,KACE,CAAC,KAAK,WACL,GAAG,MAAM,MAAM,SAAS,aAAa,IAAI,MAAM,GAAG,IAAI,OAC1D,CAAC,CACA,QAAQ,CAAC,CACT,KAAK,OAAO,EAAE;;AAEnB;AAEA,SAAS,sBACP,YACA,MACA;CACA,IAAI,sBAAsB;CAC1B,IAAI,SAAS;CAEb,KAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS;EACtC,IAAI,sBAAsBC,QAAAA,aAAa;GACrC,SAAS;GACT,aAAa,WAAW;EAC1B;EAEA,IAAI,sBAAsBC,QAAAA,gBAAgB;GACxC,sBAAsB;GACtB,aAAa,WAAW;EAC1B;CACF;CAEA,IAAI,mBAAoB,WAAmB;CAE3C,IAAI,QACF,oBAAoB;CAGtB,IAAI,CAAC,qBACH,oBAAoB;CAGtB,MAAM,iBAAiB,sBAAsBL,QAAAA;CAE7C,MAAM,gCAAgB,IAAI,IAAoB;CAE9C,KAAK,MAAM,OAAO,QAAQ,CAAC,GACzB,cAAc,IAAI,IAAI,MAAM,qBAAqB,IAAI,IAAI,CAAC;CAG5D,IAAI,kBAAkB,cAAc,OAAO,GAAG;EAC5C,MAAM,gBAAgB,cACnB,QAAQ,CAAC,CACT,OAAO,GAAG,WAAW,MAAM,SAAS,aAAa,CAAC;EAerD,OAAO,IAbL,cAAc,OAAO,IACjB,IAAI,gBAAgB,MAAM,GAAG;IACnC,cACC,QAAQ,CAAC,CACT,KACE,CAAC,KAAK,WACL,KAAK,MAAM,MAAM,SAAS,aAAa,IAAI,MAAM,GAAG,IAAI,OAC5D,CAAC,CACA,QAAQ,CAAC,CACT,KAAK,OAAO,EAAE;OAET,GAEgB,OAAO;CAC/B,OACE,OAAO;AAEX;AAEA,SAAS,2BAA2B,YAA8B;CAChE,IAAI,sBAAsB;CAC1B,IAAI,SAAS;CAEb,KAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS;EACtC,IAAI,sBAAsBI,QAAAA,aAAa;GACrC,SAAS;GACT,aAAa,WAAW;EAC1B;EAEA,IAAI,sBAAsBC,QAAAA,gBAAgB;GACxC,sBAAsB;GACtB,aAAa,WAAW;EAC1B;CACF;CAEA,IAAI,mBAAoB,WAAmB;CAE3C,IAAI,QACF,oBAAoB;CAGtB,IAAI,CAAC,qBACH,oBAAoB;MACf,IAAI,QACT,oBAAoB;CAGtB,OAAO;AACT;AAEA,SAAS,qBAAqB,KAAU;CACtC,IAAI,aAAa;CACjB,IAAI,SAAS;CAEb,KAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAC7B,IAAI,eAAeA,QAAAA,gBAAgB;EACjC,IAAI,CAAC,QACH,aAAa;EAEf,MAAM,IAAI;CACZ,OAAO,IAAI,eAAeD,QAAAA,aAAa;EACrC,SAAS;EACT,MAAM,IAAI;CACZ;CAGF,IAAI,MAAM;CAEV,IACE,eAAeD,QAAAA,0BACf,eAAeF,QAAAA,qBACf,eAAeC,QAAAA,iBAEf,MAAM,IAAI;CAGZ,IAAI,QACF,OAAO;CAGT,IAAI,YACF,OAAO;CAGT,OAAO;AACT;AAEA,SAAS,+BAA+B,KAAU;CAChD,QAAQ,IAAI,MAAZ;EACE,KAAK,MACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,OACH,OAAO;EACT,KAAK,SACH,OAAO;EACT,KAAK,QACH,OAAO;EACT,KAAK,YACH,OAAO;EACT,KAAK,QACH,OAAO;EACT,SACE,OAAO;CACX;AACF;AAEA,SAAS,+BAA+B,UAA2B;CACjE,OAAO,SACJ,UAAU,CAAC,CACX,KAAK,UAAU,IAAI,MAAM,KAAK,EAAE,CAAC,CACjC,KAAK,KAAK;AACf;;;ACnNA,eAAsB,mBAAmB,EACvC,YACA,QACA,mBAAmB,yBACnB,QACA,wBAAwB,OACxB,iBAAiB,MACjB,iBACA,sBAUC;CACD,IAAI,gBACF,IAAI;EACF,OAAA,GAAA,iBAAA,OAAA,CAAa,UAAU;EACvB,OAAA,GAAA,iBAAA,GAAA,CAAS,YAAY;GAAE,WAAW;GAAM,OAAO;EAAK,CAAC;CACvD,SAAS,QAAQ,CAAC;CAGpB,OAAA,GAAA,iBAAA,MAAA,CAAY,YAAY,EAAE,WAAW,KAAK,CAAC;CAE3C,IAAI,CAAC,WAAW,SAAS,GAAG,GAC1B,cAAc;CAGhB,MAAM,UAAoB,CAAC;CAC3B,IAAI,OAAO;CAEX,MAAM,0BAAU,IAAI,IAAiB;CACrC,KAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,OAAO,WAAW,CAAC,GAAG;EAC/D,IAAI,IAAI,WAAW,IAAI,GAAG;EAC1B,QAAQ,IAAI,KAAK,MAAM;CACzB;CAEA,KAAK,MAAM,CAAC,KAAK,WAAW,QAAQ,QAAQ,GAAG;EAC7C,MAAM,MAAM,qBAAqB,MAAM;EAEvC,IAAI,QAAQ,KACV;EAGF,QAAQ;cACE,IAAI,KAAK,IAAI;;CAEzB;CAEA,MAAM,iBAAiB;CAEvB,MAAM,IAAI,eAAe;EACvB;EACA,YAAY,KAAK;EACjB;EACA;EACA,wBAAwB,IAAI,IAC1B,OAAO,KAAK,OAAO,oBAAoB,CAAC,EAAE,UAAU,KAAK,CAAC,CAAC,CAC7D;EACA;EACA,eAAe;CACjB,CAAC;CAED,QAAQ,KAAK,GAAG,EAAE,OAAO;CACzB,QAAQ,EAAE;CAEV,MAAM,QAAQ,IAAI,EAAA,GAAA,iBAAA,UAAA,EAAA,GAAA,UAAA,KAAA,CAET,YAAY,WAAW,GAC5B,GAAG,uBAAuB,IAAI,QAAQ,KAAK,IAAI,EAAE,IAAI,MACvD,IAAA,GAAA,iBAAA,UAAA,EAAA,GAAA,UAAA,KAAA,CAEO,YAAY,GAAG,eAAe,IAAI,GACvC,GAAG,uBAAuB;;6IAE8C,MAAM,GAAG;EAAE,cAAc;EAAM,gBAAgB;EAAM,eAAe;CAAK,CAAC,CAAC,EAAE,uBACvJ,CACF,CAAC;AACH"}
|
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-
|
|
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.
|
|
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
|
-
|
|
853
|
-
if (
|
|
854
|
-
const
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
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:
|
|
931
|
+
type: value.dimensions > 0 ? getEnumArrayWhereInput(enumImpl) : enumImpl,
|
|
894
932
|
required: false
|
|
895
933
|
});
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
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
|
-
|
|
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
|