@m1212e/rumble 0.16.12 → 0.16.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/out/client/generate.cjs +1 -0
- package/out/client/generate.d.cts.map +1 -1
- package/out/client/generate.d.mts.map +1 -1
- package/out/client/generate.mjs +1 -1
- package/out/client.cjs +7 -6
- package/out/client.cjs.map +1 -1
- package/out/client.d.cts +3 -5
- package/out/client.d.cts.map +1 -1
- package/out/client.d.mts +3 -5
- package/out/client.d.mts.map +1 -1
- package/out/client.mjs +7 -7
- package/out/client.mjs.map +1 -1
- package/out/generate-9zSO5f7n.cjs.map +1 -1
- package/out/{generate-C3f0bYEP.mjs → generate-PDRNfY6V.mjs} +1 -1
- package/out/generate-PDRNfY6V.mjs.map +1 -0
- package/out/index.cjs +37 -27
- package/out/index.cjs.map +1 -1
- package/out/index.d.cts +4037 -48
- package/out/index.d.cts.map +1 -1
- package/out/index.d.mts +4037 -48
- package/out/index.d.mts.map +1 -1
- package/out/index.mjs +37 -28
- package/out/index.mjs.map +1 -1
- package/out/lazy-BrDkNRyV.cjs.map +1 -1
- package/out/{lazy-JdA7QgYA.mjs → lazy-CoMVcY4X.mjs} +1 -1
- package/out/lazy-CoMVcY4X.mjs.map +1 -0
- package/package.json +20 -20
- package/out/generate-C3f0bYEP.mjs.map +0 -1
- package/out/lazy-JdA7QgYA.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-PDRNfY6V.mjs","names":[],"sources":["../lib/client/generate/client.ts","../lib/client/generate/tsRepresentation.ts","../lib/client/generate/generate.ts"],"sourcesContent":["export function generateClient({\n apiUrl,\n rumbleImportPath,\n useExternalUrqlClient,\n availableSubscriptions,\n schemaPath,\n forceReactivity,\n}: {\n rumbleImportPath: string;\n useExternalUrqlClient: string | boolean;\n apiUrl?: string;\n availableSubscriptions: Set<string>;\n schemaPath: string;\n forceReactivity?: boolean;\n}) {\n const imports: string[] = [];\n let code: string = \"\";\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}\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,\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,\n }),\n /**\n * A one-time fetch of data.\n */\n query: makeQuery<Query${forceReactivityTypeString}>({\n\t urqlClient,\n\t\tschema,${forceReactivityFieldString}\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) {\n const makePOptional = argsStringMap\n .entries()\n .every(([, value]) => value.includes(\"| undefined\"));\n const argsString =\n (args ?? []).length > 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 ret = \"unknown\";\n let isNullable = true;\n\n if (arg instanceof GraphQLNonNull) {\n isNullable = false;\n arg = arg.ofType;\n }\n\n if (\n arg instanceof GraphQLInputObjectType ||\n arg instanceof GraphQLScalarType\n ) {\n ret = arg.name;\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 { 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}: {\n schema: GraphQLSchema;\n outputPath: string;\n rumbleImportPath?: string;\n apiUrl?: string;\n useExternalUrqlClient?: boolean | string;\n removeExisting?: boolean;\n forceReactivity?: 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 });\n\n imports.push(...c.imports);\n code += c.code;\n\n await Promise.all([\n writeFile(join(outputPath, \"client.ts\"), `${imports.join(\"\\n\")}\\n${code}`),\n writeFile(\n join(outputPath, `${schemaFileName}.ts`),\n `\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
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
//#region \0rolldown/runtime.js
|
|
2
3
|
var __create = Object.create;
|
|
3
4
|
var __defProp = Object.defineProperty;
|
|
4
5
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -382,25 +383,25 @@ const createAbilityBuilder = ({ db, actions, defaultLimit }) => {
|
|
|
382
383
|
return {
|
|
383
384
|
allow: (action) => {
|
|
384
385
|
if (hasBeenBuilt) throw new RumbleError("You can't call allow() after the ability builder has been built. Please ensure that you register all abilities before accessing them.");
|
|
385
|
-
const actions
|
|
386
|
-
for (const action
|
|
387
|
-
let filters = queryFilters.get(action
|
|
386
|
+
const actions = Array.isArray(action) ? action : [action];
|
|
387
|
+
for (const action of actions) {
|
|
388
|
+
let filters = queryFilters.get(action);
|
|
388
389
|
if (!filters) {
|
|
389
390
|
filters = "unrestricted";
|
|
390
|
-
queryFilters.set(action
|
|
391
|
+
queryFilters.set(action, filters);
|
|
391
392
|
}
|
|
392
393
|
}
|
|
393
394
|
return { when: (queryFilter) => {
|
|
394
|
-
for (const action
|
|
395
|
-
if (queryFilters.get(action
|
|
396
|
-
queryFilters.get(action
|
|
395
|
+
for (const action of actions) {
|
|
396
|
+
if (queryFilters.get(action) === "unrestricted") queryFilters.set(action, []);
|
|
397
|
+
queryFilters.get(action).push(queryFilter);
|
|
397
398
|
}
|
|
398
399
|
} };
|
|
399
400
|
},
|
|
400
401
|
filter: (action) => {
|
|
401
|
-
const actions
|
|
402
|
+
const actions = Array.isArray(action) ? action : [action];
|
|
402
403
|
return { by: (explicitFilter) => {
|
|
403
|
-
for (const action
|
|
404
|
+
for (const action of actions) runtimeFilters.get(action).push(explicitFilter);
|
|
404
405
|
} };
|
|
405
406
|
},
|
|
406
407
|
_: {
|
|
@@ -440,16 +441,16 @@ const createAbilityBuilder = ({ db, actions, defaultLimit }) => {
|
|
|
440
441
|
/**
|
|
441
442
|
* Packs the filters into a response object that can be applied for queries by the user
|
|
442
443
|
*/
|
|
443
|
-
function transformToResponse(queryFilters
|
|
444
|
+
function transformToResponse(queryFilters) {
|
|
444
445
|
const internalTransformer = (filters, mergedLimit) => {
|
|
445
446
|
const limit = require_lazy.lazy(() => {
|
|
446
447
|
if (mergedLimit !== void 0) {
|
|
447
448
|
if (!filters?.limit) return mergedLimit;
|
|
448
449
|
if (filters.limit > mergedLimit) return mergedLimit;
|
|
449
450
|
}
|
|
450
|
-
let limit
|
|
451
|
-
if (defaultLimit && (limit
|
|
452
|
-
return limit
|
|
451
|
+
let limit = filters?.limit;
|
|
452
|
+
if (defaultLimit && (limit === void 0 || limit > defaultLimit)) limit = defaultLimit;
|
|
453
|
+
return limit ?? void 0;
|
|
453
454
|
});
|
|
454
455
|
const sqlTransformedWhere = require_lazy.lazy(() => {
|
|
455
456
|
return filters?.where ? (0, drizzle_orm.relationsFilterToSQL)(tableSchema.foundRelation.table, filters.where) : void 0;
|
|
@@ -493,14 +494,14 @@ const createAbilityBuilder = ({ db, actions, defaultLimit }) => {
|
|
|
493
494
|
} }
|
|
494
495
|
};
|
|
495
496
|
};
|
|
496
|
-
const ret = internalTransformer(queryFilters
|
|
497
|
+
const ret = internalTransformer(queryFilters);
|
|
497
498
|
/**
|
|
498
499
|
* Merges the current query filters with the provided filters for this call only
|
|
499
500
|
*/
|
|
500
|
-
function merge
|
|
501
|
+
function merge(p) {
|
|
501
502
|
return internalTransformer(mergeFilters(ret.query.many, p), p.limit);
|
|
502
503
|
}
|
|
503
|
-
ret.merge = merge
|
|
504
|
+
ret.merge = merge;
|
|
504
505
|
return ret;
|
|
505
506
|
}
|
|
506
507
|
return { withContext: (userContext) => {
|
|
@@ -948,6 +949,10 @@ async function initSearchIfApplicable(input) {
|
|
|
948
949
|
const dbName = (await input.db.execute(drizzle_orm.sql`SELECT current_database()`)).rows[0].current_database;
|
|
949
950
|
await input.db.execute(drizzle_orm.sql.raw(`ALTER DATABASE ${dbName} SET pg_trgm.similarity_threshold = ${threshold};`));
|
|
950
951
|
}
|
|
952
|
+
if (input.search?.cpu_operator_cost) {
|
|
953
|
+
if (typeof input.search.cpu_operator_cost !== "number") throw new Error(`CPU operator cost must be a number`);
|
|
954
|
+
if (input.search.cpu_operator_cost <= 0) throw new Error(`CPU operator cost must be a positive number`);
|
|
955
|
+
}
|
|
951
956
|
}
|
|
952
957
|
/**
|
|
953
958
|
* Performs adjustments to the query args to issue a full text search in case the
|
|
@@ -1112,21 +1117,21 @@ const createObjectImplementer = ({ db, search, schemaBuilder, makePubSubInstance
|
|
|
1112
1117
|
subscribe,
|
|
1113
1118
|
nullable,
|
|
1114
1119
|
description: `Get the ${pluralize.default.plural(relationSchema.tsName)} related to this ${pluralize.default.singular(tableSchema.tsName)}`,
|
|
1115
|
-
query: (args
|
|
1116
|
-
args
|
|
1120
|
+
query: (args, ctx) => {
|
|
1121
|
+
args = JSON.parse(JSON.stringify(args));
|
|
1117
1122
|
if (isMany) adjustQueryArgsForSearch({
|
|
1118
1123
|
search,
|
|
1119
|
-
args
|
|
1124
|
+
args,
|
|
1120
1125
|
tableSchema: relationSchema,
|
|
1121
1126
|
abilities: ctx.abilities[relationSchema.tsName].filter(readAction)
|
|
1122
1127
|
});
|
|
1123
1128
|
const filter = ctx.abilities[relationSchema.tsName].filter(readAction).merge({
|
|
1124
|
-
where: args
|
|
1125
|
-
limit: args
|
|
1126
|
-
extras: args
|
|
1129
|
+
where: args.where,
|
|
1130
|
+
limit: args.limit,
|
|
1131
|
+
extras: args.extras
|
|
1127
1132
|
}).query[filterSpecifier];
|
|
1128
|
-
if (args
|
|
1129
|
-
if (args
|
|
1133
|
+
if (args.offset) filter.offset = args.offset;
|
|
1134
|
+
if (args.orderBy) filter.orderBy = args.orderBy;
|
|
1130
1135
|
return filter;
|
|
1131
1136
|
}
|
|
1132
1137
|
});
|
|
@@ -1199,10 +1204,10 @@ const createPubSubInstance = ({ subscriptions }) => {
|
|
|
1199
1204
|
return pubsub.publish(key);
|
|
1200
1205
|
},
|
|
1201
1206
|
updated(primaryKeyValue) {
|
|
1202
|
-
const keys = (Array.isArray(primaryKeyValue) ? primaryKeyValue : [primaryKeyValue]).map((primaryKeyValue
|
|
1207
|
+
const keys = (Array.isArray(primaryKeyValue) ? primaryKeyValue : [primaryKeyValue]).map((primaryKeyValue) => makePubSubKey({
|
|
1203
1208
|
tableName: table.toString(),
|
|
1204
1209
|
action: "updated",
|
|
1205
|
-
primaryKeyValue
|
|
1210
|
+
primaryKeyValue
|
|
1206
1211
|
}));
|
|
1207
1212
|
const uniqueKeys = Array.from(new Set(keys));
|
|
1208
1213
|
for (const key of uniqueKeys) pubsub.publish(key);
|
|
@@ -1273,6 +1278,11 @@ const createQueryImplementer = ({ db, schemaBuilder, search, whereArgImplementer
|
|
|
1273
1278
|
if (mappedArgs.orderBy) filter.orderBy = mappedArgs.orderBy;
|
|
1274
1279
|
const queryInstance = query(filter);
|
|
1275
1280
|
if (filter.columns) queryInstance.columns = filter.columns;
|
|
1281
|
+
if (search?.enabled && args.search && args.search.length > 0 && search?.cpu_operator_cost) return db.transaction(async (tx) => {
|
|
1282
|
+
if (isPostgresDB(tx)) await tx.execute(drizzle_orm.sql.raw(`SET cpu_operator_cost = ${search.cpu_operator_cost};`));
|
|
1283
|
+
else console.info("Database dialect is not postgresql, cannot set cpu_operator_cost.");
|
|
1284
|
+
return tx.query[table].findMany(queryInstance);
|
|
1285
|
+
});
|
|
1276
1286
|
return db.query[table].findMany(queryInstance);
|
|
1277
1287
|
}
|
|
1278
1288
|
}),
|