@m1212e/rumble 0.25.1 → 0.25.3
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-0QFVc3Sg.mjs → generate-BAZg-eXa.mjs} +16 -12
- package/out/{generate-0QFVc3Sg.mjs.map → generate-BAZg-eXa.mjs.map} +1 -1
- package/out/{generate-CM3XjmlO.cjs → generate-Ci6AXNnn.cjs} +16 -12
- package/out/{generate-CM3XjmlO.cjs.map → generate-Ci6AXNnn.cjs.map} +1 -1
- package/out/index.cjs +34 -19
- package/out/index.cjs.map +1 -1
- package/out/index.d.cts +31 -0
- package/out/index.d.cts.map +1 -1
- package/out/index.d.mts +32 -1
- package/out/index.d.mts.map +1 -1
- package/out/index.mjs +32 -20
- package/out/index.mjs.map +1 -1
- package/package.json +1 -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-BAZg-eXa.mjs";
|
|
2
2
|
export { generateFromSchema };
|
|
@@ -162,18 +162,22 @@ function stringifyTSObjectArg(arg) {
|
|
|
162
162
|
if (isNullable) ret += " | null | undefined";
|
|
163
163
|
return ret;
|
|
164
164
|
}
|
|
165
|
+
const SCALAR_TS_TYPES = {
|
|
166
|
+
ID: "string",
|
|
167
|
+
String: "string",
|
|
168
|
+
Boolean: "boolean",
|
|
169
|
+
Int: "number",
|
|
170
|
+
Float: "number",
|
|
171
|
+
Date: "Date",
|
|
172
|
+
DateTime: "Date",
|
|
173
|
+
JSON: "any",
|
|
174
|
+
EmailAddress: "string",
|
|
175
|
+
PersonName: "string",
|
|
176
|
+
PhoneNumber: "string",
|
|
177
|
+
Locale: "string"
|
|
178
|
+
};
|
|
165
179
|
function mapGraphqlScalarToTSTypeString(arg) {
|
|
166
|
-
|
|
167
|
-
case "ID": return "string";
|
|
168
|
-
case "String": return "string";
|
|
169
|
-
case "Boolean": return "boolean";
|
|
170
|
-
case "Int": return "number";
|
|
171
|
-
case "Float": return "number";
|
|
172
|
-
case "Date": return "Date";
|
|
173
|
-
case "DateTime": return "Date";
|
|
174
|
-
case "JSON": return "any";
|
|
175
|
-
default: return "unknown";
|
|
176
|
-
}
|
|
180
|
+
return SCALAR_TS_TYPES[arg.name] ?? "unknown";
|
|
177
181
|
}
|
|
178
182
|
function makeStringLiteralUnionFromEnum(enumType) {
|
|
179
183
|
return enumType.getValues().map((value) => `"${value.name}"`).join(" | ");
|
|
@@ -227,4 +231,4 @@ export const schema = ${uneval(minifyIntrospectionQuery(getIntrospectedSchema(sc
|
|
|
227
231
|
//#endregion
|
|
228
232
|
export { generateFromSchema as t };
|
|
229
233
|
|
|
230
|
-
//# sourceMappingURL=generate-
|
|
234
|
+
//# sourceMappingURL=generate-BAZg-eXa.mjs.map
|
|
@@ -1 +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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"}
|
|
1
|
+
{"version":3,"file":"generate-BAZg-eXa.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\nconst SCALAR_TS_TYPES: Record<string, string> = {\n ID: \"string\",\n String: \"string\",\n Boolean: \"boolean\",\n Int: \"number\",\n Float: \"number\",\n Date: \"Date\",\n DateTime: \"Date\",\n JSON: \"any\",\n // rumble's own string scalars: normalized and validated on the server, plain strings on the wire\n EmailAddress: \"string\",\n PersonName: \"string\",\n PhoneNumber: \"string\",\n Locale: \"string\",\n};\n\nfunction mapGraphqlScalarToTSTypeString(arg: any) {\n return SCALAR_TS_TYPES[arg.name] ?? \"unknown\";\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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"}
|
|
@@ -162,18 +162,22 @@ function stringifyTSObjectArg(arg) {
|
|
|
162
162
|
if (isNullable) ret += " | null | undefined";
|
|
163
163
|
return ret;
|
|
164
164
|
}
|
|
165
|
+
const SCALAR_TS_TYPES = {
|
|
166
|
+
ID: "string",
|
|
167
|
+
String: "string",
|
|
168
|
+
Boolean: "boolean",
|
|
169
|
+
Int: "number",
|
|
170
|
+
Float: "number",
|
|
171
|
+
Date: "Date",
|
|
172
|
+
DateTime: "Date",
|
|
173
|
+
JSON: "any",
|
|
174
|
+
EmailAddress: "string",
|
|
175
|
+
PersonName: "string",
|
|
176
|
+
PhoneNumber: "string",
|
|
177
|
+
Locale: "string"
|
|
178
|
+
};
|
|
165
179
|
function mapGraphqlScalarToTSTypeString(arg) {
|
|
166
|
-
|
|
167
|
-
case "ID": return "string";
|
|
168
|
-
case "String": return "string";
|
|
169
|
-
case "Boolean": return "boolean";
|
|
170
|
-
case "Int": return "number";
|
|
171
|
-
case "Float": return "number";
|
|
172
|
-
case "Date": return "Date";
|
|
173
|
-
case "DateTime": return "Date";
|
|
174
|
-
case "JSON": return "any";
|
|
175
|
-
default: return "unknown";
|
|
176
|
-
}
|
|
180
|
+
return SCALAR_TS_TYPES[arg.name] ?? "unknown";
|
|
177
181
|
}
|
|
178
182
|
function makeStringLiteralUnionFromEnum(enumType) {
|
|
179
183
|
return enumType.getValues().map((value) => `"${value.name}"`).join(" | ");
|
|
@@ -232,4 +236,4 @@ Object.defineProperty(exports, "generateFromSchema", {
|
|
|
232
236
|
}
|
|
233
237
|
});
|
|
234
238
|
|
|
235
|
-
//# sourceMappingURL=generate-
|
|
239
|
+
//# sourceMappingURL=generate-Ci6AXNnn.cjs.map
|
|
@@ -1 +1 @@
|
|
|
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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"}
|
|
1
|
+
{"version":3,"file":"generate-Ci6AXNnn.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\nconst SCALAR_TS_TYPES: Record<string, string> = {\n ID: \"string\",\n String: \"string\",\n Boolean: \"boolean\",\n Int: \"number\",\n Float: \"number\",\n Date: \"Date\",\n DateTime: \"Date\",\n JSON: \"any\",\n // rumble's own string scalars: normalized and validated on the server, plain strings on the wire\n EmailAddress: \"string\",\n PersonName: \"string\",\n PhoneNumber: \"string\",\n Locale: \"string\",\n};\n\nfunction mapGraphqlScalarToTSTypeString(arg: any) {\n return SCALAR_TS_TYPES[arg.name] ?? \"unknown\";\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-
|
|
25
|
+
const require_generate = require("./generate-Ci6AXNnn.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");
|
|
@@ -216,7 +216,7 @@ function mapNullFieldsToUndefined(obj) {
|
|
|
216
216
|
}
|
|
217
217
|
//#endregion
|
|
218
218
|
//#region package.json
|
|
219
|
-
var version = "0.25.
|
|
219
|
+
var version = "0.25.3";
|
|
220
220
|
//#endregion
|
|
221
221
|
//#region lib/helpers/tableHelpers.ts
|
|
222
222
|
const indexCache = /* @__PURE__ */ new WeakMap();
|
|
@@ -3115,9 +3115,13 @@ function implementDefaultAddressTypes(schemaBuilder) {
|
|
|
3115
3115
|
//#endregion
|
|
3116
3116
|
//#region lib/scalars/emailAddress.ts
|
|
3117
3117
|
/**
|
|
3118
|
-
* Validates an email address using graphql-scalars' own format check, then lowercases it
|
|
3118
|
+
* Validates an email address using graphql-scalars' own format check, then lowercases it, exactly
|
|
3119
|
+
* as the `EmailAddress` scalar does. Exported for values that do not arrive as GraphQL input,
|
|
3120
|
+
* such as OIDC claims.
|
|
3121
|
+
*
|
|
3122
|
+
* @throws RumbleErrorSafe if the value is not a valid email address
|
|
3119
3123
|
*/
|
|
3120
|
-
const
|
|
3124
|
+
const normalizeEmailAddress = (value) => {
|
|
3121
3125
|
try {
|
|
3122
3126
|
return graphql_scalars.EmailAddressResolver.parseValue(value).toLowerCase();
|
|
3123
3127
|
} catch (error) {
|
|
@@ -3128,23 +3132,28 @@ const EmailAddressResolver = new graphql.GraphQLScalarType({
|
|
|
3128
3132
|
name: "EmailAddress",
|
|
3129
3133
|
description: `${graphql_scalars.EmailAddressResolver.description} Lowercased.`,
|
|
3130
3134
|
specifiedByURL: graphql_scalars.EmailAddressResolver.specifiedByURL,
|
|
3131
|
-
serialize:
|
|
3132
|
-
parseValue:
|
|
3135
|
+
serialize: normalizeEmailAddress,
|
|
3136
|
+
parseValue: normalizeEmailAddress,
|
|
3133
3137
|
parseLiteral(ast) {
|
|
3134
3138
|
if (ast.kind !== graphql.Kind.STRING) throw new RumbleErrorSafe(`Can only validate strings as email addresses but got a: ${ast.kind}`);
|
|
3135
|
-
return
|
|
3139
|
+
return normalizeEmailAddress(ast.value);
|
|
3136
3140
|
}
|
|
3137
3141
|
});
|
|
3138
3142
|
//#endregion
|
|
3139
3143
|
//#region lib/scalars/personName.ts
|
|
3140
3144
|
const MAX_LENGTH = 200;
|
|
3141
3145
|
const NAME_REGEX = /^[\p{L}\p{M}]+(?:(?:[ '-]|\.\x20?)[\p{L}\p{M}]+)*\.?$/u;
|
|
3146
|
+
const APOSTROPHE_VARIANTS = /[\u2018\u2019\u02BC\u00B4\u0060]/gu;
|
|
3147
|
+
const HYPHEN_VARIANTS = /[\u2010-\u2015\u2212]/gu;
|
|
3142
3148
|
/**
|
|
3143
|
-
* Normalizes and validates a person's name.
|
|
3149
|
+
* Normalizes and validates a person's name, exactly as the `PersonName` scalar does. Exported
|
|
3150
|
+
* for values that do not arrive as GraphQL input, such as OIDC claims.
|
|
3151
|
+
*
|
|
3152
|
+
* @throws RumbleErrorSafe if the value is not a valid name
|
|
3144
3153
|
*/
|
|
3145
|
-
const
|
|
3154
|
+
const normalizePersonName = (value) => {
|
|
3146
3155
|
if (typeof value !== "string") throw new RumbleErrorSafe(`Name value is not a string: ${value}`);
|
|
3147
|
-
const normalized = value.normalize("NFC").replace(/[\p{Cc}\p{Cf}]/gu, "").replace(/\p{Zs}+/gu, " ").trim().replace(/([-'])\1+/gu, "$1").replace(/^[-']+|[-']+$/gu, "").trim();
|
|
3156
|
+
const normalized = value.normalize("NFC").replace(/[\p{Cc}\p{Cf}]/gu, "").replace(APOSTROPHE_VARIANTS, "'").replace(HYPHEN_VARIANTS, "-").replace(/\p{Zs}+/gu, " ").trim().replace(/ ?- ?/gu, "-").replace(/([-'])\1+/gu, "$1").replace(/^[-']+|[-']+$/gu, "").trim();
|
|
3148
3157
|
if (normalized.length === 0) throw new RumbleErrorSafe("Name must not be empty.");
|
|
3149
3158
|
if (normalized.length > MAX_LENGTH) throw new RumbleErrorSafe(`Name must not be longer than ${MAX_LENGTH} characters.`);
|
|
3150
3159
|
if (!NAME_REGEX.test(normalized)) throw new RumbleErrorSafe(`Invalid name: ${value}. Names may only contain letters and the separators space, apostrophe, hyphen and period, and may not start with or repeat a separator.`);
|
|
@@ -3152,12 +3161,12 @@ const normalize = (value) => {
|
|
|
3152
3161
|
};
|
|
3153
3162
|
const PersonNameResolver = new graphql.GraphQLScalarType({
|
|
3154
3163
|
name: "PersonName",
|
|
3155
|
-
description: "A person's name. Unicode letters from any script are allowed, along with space, apostrophe, hyphen and period as separators between name parts. The value is Unicode NFC normalized, has invisible/control characters stripped, has its whitespace collapsed, and has unambiguous typos (a doubled or stray leading/trailing hyphen/apostrophe) silently corrected rather than rejected.",
|
|
3156
|
-
serialize:
|
|
3157
|
-
parseValue:
|
|
3164
|
+
description: "A person's name. Unicode letters from any script are allowed, along with space, apostrophe, hyphen and period as separators between name parts. The value is Unicode NFC normalized, has invisible/control characters stripped, has its whitespace collapsed, and has unambiguous typos (typographic apostrophe or dash variants, spaces around a hyphen, a doubled or stray leading/trailing hyphen/apostrophe) silently corrected rather than rejected.",
|
|
3165
|
+
serialize: normalizePersonName,
|
|
3166
|
+
parseValue: normalizePersonName,
|
|
3158
3167
|
parseLiteral(ast) {
|
|
3159
3168
|
if (ast.kind !== graphql.Kind.STRING) throw new RumbleErrorSafe(`Can only validate strings as names but got a: ${ast.kind}`);
|
|
3160
|
-
return
|
|
3169
|
+
return normalizePersonName(ast.value);
|
|
3161
3170
|
}
|
|
3162
3171
|
});
|
|
3163
3172
|
//#endregion
|
|
@@ -3165,9 +3174,12 @@ const PersonNameResolver = new graphql.GraphQLScalarType({
|
|
|
3165
3174
|
/**
|
|
3166
3175
|
* Parses and validates a phone number using libphonenumber-js (Google's phone number metadata),
|
|
3167
3176
|
* which checks real per-country validity (length, area code plausibility, ...) rather than just
|
|
3168
|
-
* the E.164 shape.
|
|
3177
|
+
* the E.164 shape. This is what the `PhoneNumber` scalar does with its input; exported for values
|
|
3178
|
+
* that do not arrive as GraphQL input. `.number` of the result is the E.164 form.
|
|
3179
|
+
*
|
|
3180
|
+
* @throws RumbleErrorSafe if the value is not a valid phone number
|
|
3169
3181
|
*/
|
|
3170
|
-
const
|
|
3182
|
+
const parsePhoneNumber = (value) => {
|
|
3171
3183
|
if (typeof value !== "string") throw new RumbleErrorSafe(`Phone number value is not a string: ${value}`);
|
|
3172
3184
|
const phoneNumber = (0, libphonenumber_js.parsePhoneNumberFromString)(value);
|
|
3173
3185
|
if (!phoneNumber?.isValid()) throw new RumbleErrorSafe(`Invalid phone number: ${value}. Please provide a valid phone number including its country calling code, e.g. +4915123456789.`);
|
|
@@ -3183,16 +3195,16 @@ const serialize = (value) => {
|
|
|
3183
3195
|
if (!phoneNumber.isValid()) throw new RumbleErrorSafe(`Invalid phone number: ${phoneNumber.number}`);
|
|
3184
3196
|
return phoneNumber.number;
|
|
3185
3197
|
}
|
|
3186
|
-
return
|
|
3198
|
+
return parsePhoneNumber(value).number;
|
|
3187
3199
|
};
|
|
3188
3200
|
const PhoneNumberResolver = new graphql.GraphQLScalarType({
|
|
3189
3201
|
name: "PhoneNumber",
|
|
3190
3202
|
description: "A phone number, validated using real per-country validity rules and represented as a parsed libphonenumber-js PhoneNumber. On the wire it is transported as the E.164 format (https://en.wikipedia.org/wiki/E.164), e.g. +4915123456789. The country calling code is required.",
|
|
3191
3203
|
serialize,
|
|
3192
|
-
parseValue:
|
|
3204
|
+
parseValue: parsePhoneNumber,
|
|
3193
3205
|
parseLiteral(ast) {
|
|
3194
3206
|
if (ast.kind !== graphql.Kind.STRING) throw new RumbleErrorSafe(`Can only validate strings as phone numbers but got a: ${ast.kind}`);
|
|
3195
|
-
return
|
|
3207
|
+
return parsePhoneNumber(ast.value);
|
|
3196
3208
|
}
|
|
3197
3209
|
});
|
|
3198
3210
|
//#endregion
|
|
@@ -3614,6 +3626,9 @@ exports.RumbleErrorSafe = RumbleErrorSafe;
|
|
|
3614
3626
|
exports.assertFindFirstExists = assertFindFirstExists;
|
|
3615
3627
|
exports.assertFirstEntryExists = assertFirstEntryExists;
|
|
3616
3628
|
exports.mapNullFieldsToUndefined = mapNullFieldsToUndefined;
|
|
3629
|
+
exports.normalizeEmailAddress = normalizeEmailAddress;
|
|
3630
|
+
exports.normalizePersonName = normalizePersonName;
|
|
3631
|
+
exports.parsePhoneNumber = parsePhoneNumber;
|
|
3617
3632
|
exports.rumble = rumble;
|
|
3618
3633
|
|
|
3619
3634
|
//# sourceMappingURL=index.cjs.map
|