@cerebruminc/yates 3.1.1 → 3.2.0-beta.dangerous.abf9bb6

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/dist/index.js DELETED
@@ -1,552 +0,0 @@
1
- "use strict";
2
- var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
3
- if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
4
- return cooked;
5
- };
6
- var __assign = (this && this.__assign) || function () {
7
- __assign = Object.assign || function(t) {
8
- for (var s, i = 1, n = arguments.length; i < n; i++) {
9
- s = arguments[i];
10
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
11
- t[p] = s[p];
12
- }
13
- return t;
14
- };
15
- return __assign.apply(this, arguments);
16
- };
17
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
- if (k2 === undefined) k2 = k;
19
- var desc = Object.getOwnPropertyDescriptor(m, k);
20
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
- desc = { enumerable: true, get: function() { return m[k]; } };
22
- }
23
- Object.defineProperty(o, k2, desc);
24
- }) : (function(o, m, k, k2) {
25
- if (k2 === undefined) k2 = k;
26
- o[k2] = m[k];
27
- }));
28
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
- Object.defineProperty(o, "default", { enumerable: true, value: v });
30
- }) : function(o, v) {
31
- o["default"] = v;
32
- });
33
- var __importStar = (this && this.__importStar) || function (mod) {
34
- if (mod && mod.__esModule) return mod;
35
- var result = {};
36
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
37
- __setModuleDefault(result, mod);
38
- return result;
39
- };
40
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
41
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
42
- return new (P || (P = Promise))(function (resolve, reject) {
43
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
44
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
45
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
46
- step((generator = generator.apply(thisArg, _arguments || [])).next());
47
- });
48
- };
49
- var __generator = (this && this.__generator) || function (thisArg, body) {
50
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
51
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
52
- function verb(n) { return function (v) { return step([n, v]); }; }
53
- function step(op) {
54
- if (f) throw new TypeError("Generator is already executing.");
55
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
56
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
57
- if (y = 0, t) op = [op[0] & 2, t.value];
58
- switch (op[0]) {
59
- case 0: case 1: t = op; break;
60
- case 4: _.label++; return { value: op[1], done: false };
61
- case 5: _.label++; y = op[1]; op = [0]; continue;
62
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
63
- default:
64
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
65
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
66
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
67
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
68
- if (t[2]) _.ops.pop();
69
- _.trys.pop(); continue;
70
- }
71
- op = body.call(thisArg, _);
72
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
73
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
74
- }
75
- };
76
- var __values = (this && this.__values) || function(o) {
77
- var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
78
- if (m) return m.call(o);
79
- if (o && typeof o.length === "number") return {
80
- next: function () {
81
- if (o && i >= o.length) o = void 0;
82
- return { value: o && o[i++], done: !o };
83
- }
84
- };
85
- throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
86
- };
87
- var __read = (this && this.__read) || function (o, n) {
88
- var m = typeof Symbol === "function" && o[Symbol.iterator];
89
- if (!m) return o;
90
- var i = m.call(o), r, ar = [], e;
91
- try {
92
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
93
- }
94
- catch (error) { e = { error: error }; }
95
- finally {
96
- try {
97
- if (r && !r.done && (m = i["return"])) m.call(i);
98
- }
99
- finally { if (e) throw e.error; }
100
- }
101
- return ar;
102
- };
103
- var __importDefault = (this && this.__importDefault) || function (mod) {
104
- return (mod && mod.__esModule) ? mod : { "default": mod };
105
- };
106
- exports.__esModule = true;
107
- exports.setup = exports.createRoles = exports.createClient = exports.createRoleName = exports.createAbilityName = void 0;
108
- var difference_1 = __importDefault(require("lodash/difference"));
109
- var flatMap_1 = __importDefault(require("lodash/flatMap"));
110
- var map_1 = __importDefault(require("lodash/map"));
111
- var toPairs_1 = __importDefault(require("lodash/toPairs"));
112
- var crypto = __importStar(require("crypto"));
113
- var expressions_1 = require("./expressions");
114
- var VALID_OPERATIONS = ["SELECT", "UPDATE", "INSERT", "DELETE"];
115
- /**
116
- * This function is used to take a lock that is automatically released at the end of the current transaction.
117
- * This is very convenient for ensuring we don't hit concurrency issues when running setup code.
118
- */
119
- var takeLock = function (prisma) {
120
- return prisma.$executeRawUnsafe("SELECT pg_advisory_xact_lock(2142616474639426746);");
121
- };
122
- /**
123
- * In PostgreSQL, the maximum length for a role or policy name is 63 bytes.
124
- * This limitation is derived from the value of the NAMEDATALEN configuration parameter,
125
- * which is set to 64 bytes by default. One byte is reserved for the null-terminator,
126
- * leaving 63 bytes for the actual role name.
127
- * This function hashes the ability name to ensure it is within the 63 byte limit.
128
- */
129
- var hashWithPrefix = function (prefix, abilityName) {
130
- var hash = crypto.createHash("sha256");
131
- hash.update(abilityName);
132
- var hashedAbilityName = hash.digest("hex");
133
- var maxLength = 63 - prefix.length;
134
- return prefix + hashedAbilityName.slice(0, maxLength);
135
- };
136
- // Sanitize a single string by ensuring the it has only lowercase alpha characters and underscores
137
- var sanitizeSlug = function (slug) { return slug.toLowerCase().replace("-", "_").replace(/[^a-z0-9_]/gi, ""); };
138
- var createAbilityName = function (model, ability) {
139
- return sanitizeSlug(hashWithPrefix("yates_ability_", "".concat(model, "_").concat(ability)));
140
- };
141
- exports.createAbilityName = createAbilityName;
142
- var createRoleName = function (name) {
143
- return sanitizeSlug(hashWithPrefix("yates_role_", "".concat(name)));
144
- };
145
- exports.createRoleName = createRoleName;
146
- // This uses client extensions to set the role and context for the current user so that RLS can be applied
147
- var createClient = function (prisma, getContext, options) {
148
- if (options === void 0) { options = {}; }
149
- // Set default options
150
- var _a = options.txMaxWait, txMaxWait = _a === void 0 ? 30000 : _a, _b = options.txTimeout, txTimeout = _b === void 0 ? 30000 : _b;
151
- var client = prisma.$extends({
152
- name: "Yates client",
153
- query: {
154
- $allModels: {
155
- $allOperations: function (params) {
156
- var _a;
157
- return __awaiter(this, void 0, void 0, function () {
158
- var model, args, query, operation, ctx, role, context, pgRole, _b, _c, k, _d, _e, v, queryResults, e_1;
159
- var e_2, _f, e_3, _g;
160
- var _this = this;
161
- return __generator(this, function (_h) {
162
- switch (_h.label) {
163
- case 0:
164
- model = params.model, args = params.args, query = params.query, operation = params.operation;
165
- if (!model) {
166
- return [2 /*return*/, query(args)];
167
- }
168
- ctx = getContext();
169
- // If ctx is null, the middleware is explicitly skipped
170
- if (ctx === null) {
171
- return [2 /*return*/, query(args)];
172
- }
173
- role = ctx.role, context = ctx.context;
174
- pgRole = (0, exports.createRoleName)(role);
175
- if (context) {
176
- try {
177
- for (_b = __values(Object.keys(context)), _c = _b.next(); !_c.done; _c = _b.next()) {
178
- k = _c.value;
179
- if (!k.match(/^[a-z_\.]+$/)) {
180
- throw new Error("Context variable \"".concat(k, "\" contains invalid characters. Context variables must only contain lowercase letters, numbers, periods and underscores."));
181
- }
182
- if (typeof context[k] !== "number" && typeof context[k] !== "string" && !Array.isArray(context[k])) {
183
- throw new Error("Context variable \"".concat(k, "\" must be a string, number or array. Got ").concat(typeof context[k]));
184
- }
185
- if (Array.isArray(context[k])) {
186
- try {
187
- for (_d = (e_3 = void 0, __values(context[k])), _e = _d.next(); !_e.done; _e = _d.next()) {
188
- v = _e.value;
189
- if (typeof v !== "string") {
190
- throw new Error("Context variable \"".concat(k, "\" must be an array of strings. Got ").concat(typeof v));
191
- }
192
- }
193
- }
194
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
195
- finally {
196
- try {
197
- if (_e && !_e.done && (_g = _d["return"])) _g.call(_d);
198
- }
199
- finally { if (e_3) throw e_3.error; }
200
- }
201
- // Cast to a JSON string so that it can be used in RLS expressions
202
- context[k] = JSON.stringify(context[k]);
203
- }
204
- }
205
- }
206
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
207
- finally {
208
- try {
209
- if (_c && !_c.done && (_f = _b["return"])) _f.call(_b);
210
- }
211
- finally { if (e_2) throw e_2.error; }
212
- }
213
- }
214
- _h.label = 1;
215
- case 1:
216
- _h.trys.push([1, 3, , 4]);
217
- return [4 /*yield*/, prisma.$transaction(function (tx) { return __awaiter(_this, void 0, void 0, function () {
218
- var _a, _b, _c, key, value, e_4_1, txId, __internalParams, result;
219
- var e_4, _d;
220
- return __generator(this, function (_e) {
221
- switch (_e.label) {
222
- case 0:
223
- // Switch to the user role, We can't use a prepared statement here, due to limitations in PG not allowing prepared statements to be used in SET ROLE
224
- return [4 /*yield*/, tx.$queryRawUnsafe("SET ROLE ".concat(pgRole))];
225
- case 1:
226
- // Switch to the user role, We can't use a prepared statement here, due to limitations in PG not allowing prepared statements to be used in SET ROLE
227
- _e.sent();
228
- _e.label = 2;
229
- case 2:
230
- _e.trys.push([2, 7, 8, 9]);
231
- _a = __values((0, toPairs_1["default"])(context)), _b = _a.next();
232
- _e.label = 3;
233
- case 3:
234
- if (!!_b.done) return [3 /*break*/, 6];
235
- _c = __read(_b.value, 2), key = _c[0], value = _c[1];
236
- return [4 /*yield*/, tx.$queryRaw(templateObject_1 || (templateObject_1 = __makeTemplateObject(["SELECT set_config(", ", ", ", true);"], ["SELECT set_config(", ", ", ", true);"])), key, value.toString())];
237
- case 4:
238
- _e.sent();
239
- _e.label = 5;
240
- case 5:
241
- _b = _a.next();
242
- return [3 /*break*/, 3];
243
- case 6: return [3 /*break*/, 9];
244
- case 7:
245
- e_4_1 = _e.sent();
246
- e_4 = { error: e_4_1 };
247
- return [3 /*break*/, 9];
248
- case 8:
249
- try {
250
- if (_b && !_b.done && (_d = _a["return"])) _d.call(_a);
251
- }
252
- finally { if (e_4) throw e_4.error; }
253
- return [7 /*endfinally*/];
254
- case 9:
255
- txId = tx[Symbol["for"]("prisma.client.transaction.id")];
256
- __internalParams = params.__internalParams;
257
- return [4 /*yield*/, prisma._executeRequest(__assign(__assign({}, __internalParams), { transaction: {
258
- kind: "itx",
259
- id: txId
260
- } }))];
261
- case 10:
262
- result = _e.sent();
263
- // Switch role back to admin user
264
- return [4 /*yield*/, tx.$queryRawUnsafe("SET ROLE none")];
265
- case 11:
266
- // Switch role back to admin user
267
- _e.sent();
268
- return [2 /*return*/, result];
269
- }
270
- });
271
- }); }, {
272
- maxWait: txMaxWait,
273
- timeout: txTimeout
274
- })];
275
- case 2:
276
- queryResults = _h.sent();
277
- return [2 /*return*/, queryResults];
278
- case 3:
279
- e_1 = _h.sent();
280
- // Normalize RLS errors to make them a bit more readable.
281
- if ((_a = e_1.message) === null || _a === void 0 ? void 0 : _a.includes("new row violates row-level security policy for table")) {
282
- throw new Error("You do not have permission to perform this action: ".concat(model, ".").concat(operation, "(...)"));
283
- }
284
- throw e_1;
285
- case 4: return [2 /*return*/];
286
- }
287
- });
288
- });
289
- }
290
- }
291
- }
292
- });
293
- return client;
294
- };
295
- exports.createClient = createClient;
296
- var setRLS = function (prisma, table, roleName, operation, rawExpression) { return __awaiter(void 0, void 0, void 0, function () {
297
- var expression, policyName, rows;
298
- return __generator(this, function (_a) {
299
- switch (_a.label) {
300
- case 0: return [4 /*yield*/, (0, expressions_1.expressionToSQL)(rawExpression, table)];
301
- case 1:
302
- expression = _a.sent();
303
- policyName = roleName;
304
- return [4 /*yield*/, prisma.$queryRawUnsafe("\n\t\tselect * from pg_catalog.pg_policies where tablename = '".concat(table, "' AND policyname = '").concat(policyName, "';\n\t"))];
305
- case 2:
306
- rows = _a.sent();
307
- if (!(rows.length === 0)) return [3 /*break*/, 7];
308
- if (!(operation === "INSERT")) return [3 /*break*/, 4];
309
- return [4 /*yield*/, prisma.$queryRawUnsafe("\n CREATE POLICY ".concat(policyName, " ON \"public\".\"").concat(table, "\" FOR ").concat(operation, " TO ").concat(roleName, " WITH CHECK (").concat(expression, ");\n "))];
310
- case 3:
311
- _a.sent();
312
- return [3 /*break*/, 6];
313
- case 4: return [4 /*yield*/, prisma.$queryRawUnsafe("\n CREATE POLICY ".concat(policyName, " ON \"public\".\"").concat(table, "\" FOR ").concat(operation, " TO ").concat(roleName, " USING (").concat(expression, ");\n "))];
314
- case 5:
315
- _a.sent();
316
- _a.label = 6;
317
- case 6: return [3 /*break*/, 11];
318
- case 7:
319
- if (!(rows[0].qual !== expression)) return [3 /*break*/, 11];
320
- if (!(operation === "INSERT")) return [3 /*break*/, 9];
321
- return [4 /*yield*/, prisma.$queryRawUnsafe("\n ALTER POLICY ".concat(policyName, " ON \"public\".\"").concat(table, "\" TO ").concat(roleName, " WITH CHECK (").concat(expression, ");\n "))];
322
- case 8:
323
- _a.sent();
324
- return [3 /*break*/, 11];
325
- case 9: return [4 /*yield*/, prisma.$queryRawUnsafe("\n ALTER POLICY ".concat(policyName, " ON \"public\".\"").concat(table, "\" TO ").concat(roleName, " USING (").concat(expression, ");\n "))];
326
- case 10:
327
- _a.sent();
328
- _a.label = 11;
329
- case 11: return [2 /*return*/];
330
- }
331
- });
332
- }); };
333
- var createRoles = function (_a) {
334
- var prisma = _a.prisma, customAbilities = _a.customAbilities, getRoles = _a.getRoles;
335
- return __awaiter(void 0, void 0, void 0, function () {
336
- var abilities, runtimeDataModel, models, diff, models_1, models_1_1, model, ability, operation, roles, _b, _c, _d, _i, model, table, _e, _f, _g, _h, slug, ability, roleName, _loop_1, _j, _k, _l, _m, key;
337
- var e_5, _o;
338
- var _p;
339
- return __generator(this, function (_q) {
340
- switch (_q.label) {
341
- case 0:
342
- abilities = {};
343
- runtimeDataModel = prisma._runtimeDataModel;
344
- models = Object.keys(runtimeDataModel.models).map(function (m) { return runtimeDataModel.models[m].dbName || m; });
345
- if (customAbilities) {
346
- diff = (0, difference_1["default"])(Object.keys(customAbilities), models);
347
- if (diff.length) {
348
- throw new Error("Invalid models in custom abilities: ".concat(diff.join(", ")));
349
- }
350
- }
351
- try {
352
- for (models_1 = __values(models), models_1_1 = models_1.next(); !models_1_1.done; models_1_1 = models_1.next()) {
353
- model = models_1_1.value;
354
- abilities[model] = {
355
- create: {
356
- description: "Create ".concat(model),
357
- expression: "true",
358
- operation: "INSERT",
359
- model: model,
360
- slug: "create"
361
- },
362
- read: {
363
- description: "Read ".concat(model),
364
- expression: "true",
365
- operation: "SELECT",
366
- model: model,
367
- slug: "read"
368
- },
369
- update: {
370
- description: "Update ".concat(model),
371
- expression: "true",
372
- operation: "UPDATE",
373
- model: model,
374
- slug: "update"
375
- },
376
- "delete": {
377
- description: "Delete ".concat(model),
378
- expression: "true",
379
- operation: "DELETE",
380
- model: model,
381
- slug: "delete"
382
- }
383
- };
384
- if (customAbilities === null || customAbilities === void 0 ? void 0 : customAbilities[model]) {
385
- for (ability in customAbilities[model]) {
386
- operation = (_p = customAbilities[model][ability]) === null || _p === void 0 ? void 0 : _p.operation;
387
- if (!operation)
388
- continue;
389
- abilities[model][ability] = __assign(__assign({}, customAbilities[model][ability]), { operation: operation, model: model, slug: ability });
390
- }
391
- }
392
- }
393
- }
394
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
395
- finally {
396
- try {
397
- if (models_1_1 && !models_1_1.done && (_o = models_1["return"])) _o.call(models_1);
398
- }
399
- finally { if (e_5) throw e_5.error; }
400
- }
401
- roles = getRoles(abilities);
402
- _b = abilities;
403
- _c = [];
404
- for (_d in _b)
405
- _c.push(_d);
406
- _i = 0;
407
- _q.label = 1;
408
- case 1:
409
- if (!(_i < _c.length)) return [3 /*break*/, 8];
410
- _d = _c[_i];
411
- if (!(_d in _b)) return [3 /*break*/, 7];
412
- model = _d;
413
- table = model;
414
- return [4 /*yield*/, prisma.$transaction([
415
- takeLock(prisma),
416
- prisma.$queryRawUnsafe("ALTER table \"".concat(table, "\" enable row level security;")),
417
- ])];
418
- case 2:
419
- _q.sent();
420
- _e = abilities[model];
421
- _f = [];
422
- for (_g in _e)
423
- _f.push(_g);
424
- _h = 0;
425
- _q.label = 3;
426
- case 3:
427
- if (!(_h < _f.length)) return [3 /*break*/, 7];
428
- _g = _f[_h];
429
- if (!(_g in _e)) return [3 /*break*/, 6];
430
- slug = _g;
431
- ability = abilities[model][slug];
432
- if (!VALID_OPERATIONS.includes(ability.operation)) {
433
- throw new Error("Invalid operation: ".concat(ability.operation));
434
- }
435
- roleName = (0, exports.createAbilityName)(model, slug);
436
- // Check if role already exists
437
- return [4 /*yield*/, prisma.$transaction([
438
- takeLock(prisma),
439
- prisma.$queryRawUnsafe("\n\t\t\t\t\tdo\n\t\t\t\t\t$$\n\t\t\t\t\tbegin\n\t\t\t\t\tif not exists (select * from pg_catalog.pg_roles where rolname = '".concat(roleName, "') then \n\t\t\t\t\t\tcreate role ").concat(roleName, ";\n\t\t\t\t\tend if;\n\t\t\t\t\tend\n\t\t\t\t\t$$\n\t\t\t\t\t;\n\t\t\t\t")),
440
- prisma.$queryRawUnsafe("\n\t\t\t\t\tGRANT ".concat(ability.operation, " ON \"").concat(table, "\" TO ").concat(roleName, ";\n\t\t\t\t")),
441
- ])];
442
- case 4:
443
- // Check if role already exists
444
- _q.sent();
445
- if (!ability.expression) return [3 /*break*/, 6];
446
- return [4 /*yield*/, setRLS(prisma, table, roleName, ability.operation, ability.expression)];
447
- case 5:
448
- _q.sent();
449
- _q.label = 6;
450
- case 6:
451
- _h++;
452
- return [3 /*break*/, 3];
453
- case 7:
454
- _i++;
455
- return [3 /*break*/, 1];
456
- case 8:
457
- _loop_1 = function (key) {
458
- var role, wildCardAbilities, roleAbilities, rlsRoles, userRoles, oldRoles;
459
- return __generator(this, function (_r) {
460
- switch (_r.label) {
461
- case 0:
462
- role = (0, exports.createRoleName)(key);
463
- return [4 /*yield*/, prisma.$executeRawUnsafe("\n\t\t\tdo\n\t\t\t$$\n\t\t\tbegin\n\t\t\tif not exists (select * from pg_catalog.pg_roles where rolname = '".concat(role, "') then \n\t\t\t\tcreate role ").concat(role, ";\n\t\t\tend if;\n\t\t\tend\n\t\t\t$$\n\t\t\t;\n\t\t"))];
464
- case 1:
465
- _r.sent();
466
- wildCardAbilities = (0, flatMap_1["default"])(abilities, function (model, modelName) {
467
- return (0, map_1["default"])(model, function (_params, slug) {
468
- return (0, exports.createAbilityName)(modelName, slug);
469
- });
470
- });
471
- roleAbilities = roles[key];
472
- rlsRoles = roleAbilities === "*"
473
- ? wildCardAbilities
474
- : roleAbilities.map(function (ability) { return (0, exports.createAbilityName)(ability.model, ability.slug); });
475
- // Note: We need to GRANT all on schema public so that we can resolve relation queries with prisma, as they will sometimes use a join table.
476
- // This is not ideal, but because we are using RLS, it's not a security risk. Any table with RLS also needs a corresponding policy for the role to have access.
477
- return [4 /*yield*/, prisma.$transaction([
478
- takeLock(prisma),
479
- prisma.$executeRawUnsafe("GRANT ALL ON ALL TABLES IN SCHEMA public TO ".concat(role, ";")),
480
- prisma.$executeRawUnsafe("\n\t\t\t\tGRANT ALL ON ALL SEQUENCES IN SCHEMA public TO ".concat(role, ";\n\t\t\t")),
481
- prisma.$executeRawUnsafe("\n\t\t\t\tGRANT ALL ON SCHEMA public TO ".concat(role, ";\n\t\t\t")),
482
- prisma.$queryRawUnsafe("GRANT ".concat(rlsRoles.join(", "), " TO ").concat(role)),
483
- ])];
484
- case 2:
485
- // Note: We need to GRANT all on schema public so that we can resolve relation queries with prisma, as they will sometimes use a join table.
486
- // This is not ideal, but because we are using RLS, it's not a security risk. Any table with RLS also needs a corresponding policy for the role to have access.
487
- _r.sent();
488
- return [4 /*yield*/, prisma.$queryRawUnsafe("\n\t\t\tWITH RECURSIVE cte AS (\n\t\t\t\tSELECT oid FROM pg_roles where rolname = '".concat(role, "'\n\t\t\t\tUNION ALL\n\t\t\t\tSELECT m.roleid\n\t\t\t\tFROM cte\n\t\t\t\tJOIN pg_auth_members m ON m.member = cte.oid\n\t\t\t\t)\n\t\t\tSELECT oid, oid::regrole::text AS rolename FROM cte where oid::regrole::text != '").concat(role, "'; \n\t "))];
489
- case 3:
490
- userRoles = _r.sent();
491
- oldRoles = userRoles.filter(function (_a) {
492
- var rolename = _a.rolename;
493
- return !rlsRoles.includes(rolename);
494
- }).map(function (_a) {
495
- var rolename = _a.rolename;
496
- return rolename;
497
- });
498
- if (!oldRoles.length) return [3 /*break*/, 5];
499
- // Now revoke old roles from the user role
500
- return [4 /*yield*/, prisma.$executeRawUnsafe("REVOKE ".concat(oldRoles.join(", "), " FROM ").concat(role))];
501
- case 4:
502
- // Now revoke old roles from the user role
503
- _r.sent();
504
- _r.label = 5;
505
- case 5: return [2 /*return*/];
506
- }
507
- });
508
- };
509
- _j = roles;
510
- _k = [];
511
- for (_l in _j)
512
- _k.push(_l);
513
- _m = 0;
514
- _q.label = 9;
515
- case 9:
516
- if (!(_m < _k.length)) return [3 /*break*/, 12];
517
- _l = _k[_m];
518
- if (!(_l in _j)) return [3 /*break*/, 11];
519
- key = _l;
520
- return [5 /*yield**/, _loop_1(key)];
521
- case 10:
522
- _q.sent();
523
- _q.label = 11;
524
- case 11:
525
- _m++;
526
- return [3 /*break*/, 9];
527
- case 12: return [2 /*return*/];
528
- }
529
- });
530
- });
531
- };
532
- exports.createRoles = createRoles;
533
- /**
534
- * Creates an extended client that sets contextual parameters and user role on every query
535
- **/
536
- var setup = function (params) { return __awaiter(void 0, void 0, void 0, function () {
537
- var prisma, customAbilities, getRoles, getContext, client;
538
- return __generator(this, function (_a) {
539
- switch (_a.label) {
540
- case 0:
541
- prisma = params.prisma, customAbilities = params.customAbilities, getRoles = params.getRoles, getContext = params.getContext;
542
- return [4 /*yield*/, (0, exports.createRoles)({ prisma: prisma, customAbilities: customAbilities, getRoles: getRoles })];
543
- case 1:
544
- _a.sent();
545
- client = (0, exports.createClient)(prisma, getContext, params.options);
546
- return [2 /*return*/, client];
547
- }
548
- });
549
- }); };
550
- exports.setup = setup;
551
- var templateObject_1;
552
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}