@rapidd/build 2.1.9 → 2.2.0
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/bin/cli.js +11 -1
- package/dist/bin/cli.js.map +1 -1
- package/dist/src/generators/aclGenerator.d.ts.map +1 -1
- package/dist/src/generators/aclGenerator.js +6 -0
- package/dist/src/generators/aclGenerator.js.map +1 -1
- package/dist/src/generators/routeGenerator.d.ts.map +1 -1
- package/dist/src/generators/routeGenerator.js +43 -103
- package/dist/src/generators/routeGenerator.js.map +1 -1
- package/package.json +6 -6
package/dist/bin/cli.js
CHANGED
|
@@ -3,11 +3,21 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
const commander_1 = require("commander");
|
|
5
5
|
const build_1 = require("../src/commands/build");
|
|
6
|
+
// Resolve package.json from dist/bin (published) or bin (dev via tsx)
|
|
7
|
+
let version = '0.0.0';
|
|
8
|
+
try {
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
10
|
+
version = require('../../package.json').version;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
14
|
+
version = require('../package.json').version;
|
|
15
|
+
}
|
|
6
16
|
const program = new commander_1.Command();
|
|
7
17
|
program
|
|
8
18
|
.name('rapidd')
|
|
9
19
|
.description('Rapidd build tool for generating TypeScript model files from Prisma schema')
|
|
10
|
-
.version(
|
|
20
|
+
.version(version);
|
|
11
21
|
program
|
|
12
22
|
.command('build')
|
|
13
23
|
.description('Build TypeScript model files, routes, and ACL from Prisma schema')
|
package/dist/bin/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,iDAAkE;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,iDAAkE;AAClE,sEAAsE;AACtE,IAAI,OAAO,GAAG,OAAO,CAAC;AACtB,IAAI,CAAC;IACD,iEAAiE;IACjE,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC;AACpD,CAAC;AAAC,MAAM,CAAC;IACL,iEAAiE;IACjE,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC;AACjD,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,4EAA4E,CAAC;KACzF,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,kEAAkE,CAAC;KAC/E,MAAM,CAAC,qBAAqB,EAAE,4BAA4B,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,wBAAwB,CAAC;KACvH,MAAM,CAAC,qBAAqB,EAAE,uBAAuB,EAAE,IAAI,CAAC;KAC5D,MAAM,CAAC,oBAAoB,EAAE,+DAA+D,CAAC;KAC7F,MAAM,CAAC,oBAAoB,EAAE,8DAA8D,CAAC;KAC5F,MAAM,CAAC,KAAK,EAAE,OAAqB,EAAE,EAAE;IACtC,IAAI,CAAC;QACH,MAAM,IAAA,mBAAW,EAAC,OAAO,CAAC,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aclGenerator.d.ts","sourceRoot":"","sources":["../../../src/generators/aclGenerator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"aclGenerator.d.ts","sourceRoot":"","sources":["../../../src/generators/aclGenerator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AA+BlD;;GAEG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EACjC,UAAU,EAAE,MAAM,GACjB,IAAI,CAoCN"}
|
|
@@ -56,6 +56,12 @@ function generateModelACL(modelName) {
|
|
|
56
56
|
getOmitFields(_user: RapiddUser): string[] {
|
|
57
57
|
return [];
|
|
58
58
|
},
|
|
59
|
+
// Whitelist of writable fields for create/update payloads (null = unrestricted).
|
|
60
|
+
// At the REST edge (strictWrites) non-writable fields are rejected with 403;
|
|
61
|
+
// internal model calls silently strip them instead.
|
|
62
|
+
getWritableFields(_user: RapiddUser): string[] | null {
|
|
63
|
+
return null;
|
|
64
|
+
},
|
|
59
65
|
}`;
|
|
60
66
|
}
|
|
61
67
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aclGenerator.js","sourceRoot":"","sources":["../../../src/generators/aclGenerator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"aclGenerator.js","sourceRoot":"","sources":["../../../src/generators/aclGenerator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,kCAuCC;AA3ED,uCAAyB;AACzB,2CAA6B;AAG7B;;GAEG;AACH,SAAS,gBAAgB,CAAC,SAAiB;IACzC,OAAO,WAAW,SAAS;;;;;;;;;;;;;;;;;;;;;;UAsBnB,CAAC;AACX,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW,CACzB,MAAiC,EACjC,UAAkB;IAElB,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEvC,IAAI,OAAO,GAAG;;;;CAIf,CAAC;IAEA,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEhF,OAAO,IAAI;;;;;CAKZ,CAAC;IAEA,6DAA6D;IAC7D,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAChF,IAAI,eAAe,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routeGenerator.d.ts","sourceRoot":"","sources":["../../../src/generators/routeGenerator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AA0GlD,MAAM,WAAW,YAAY;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,SAAS,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AAkDD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,SAAiB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"routeGenerator.d.ts","sourceRoot":"","sources":["../../../src/generators/routeGenerator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AA0GlD,MAAM,WAAW,YAAY;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,SAAS,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AAkDD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,SAAiB,GAAG,MAAM,CAkDpH;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,CA+DlH;AAUD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,iBAAiB,EAAE,MAAM,EACzB,iBAAiB,EAAE,SAAS,EAC5B,eAAe,EAAE,SAAS,EAC1B,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,GACnB,MAAM,CA4DR;AAID;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EACjC,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GACpC,IAAI,CA4EN"}
|
|
@@ -175,58 +175,38 @@ const ${modelName}Routes: FastifyPluginAsync = async (fastify) => {
|
|
|
175
175
|
if (!request.user) {
|
|
176
176
|
return reply.sendError(401, 'no_valid_session');
|
|
177
177
|
}
|
|
178
|
-
request.model = new ${className}({ user: request.user });
|
|
178
|
+
request.model = new ${className}({ user: request.user, strictWrites: true });
|
|
179
179
|
});
|
|
180
180
|
|
|
181
181
|
fastify.get('/', async (request: FastifyRequest, reply: FastifyReply) => {
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
return reply.sendList(results.data, results.meta);
|
|
185
|
-
} catch (error: any) {
|
|
186
|
-
return reply.handleError(error);
|
|
187
|
-
}
|
|
182
|
+
const results = await request.model!.getMany(request.parseListQuery());
|
|
183
|
+
return reply.sendList(results.data, results.meta);
|
|
188
184
|
});
|
|
189
185
|
|
|
190
186
|
fastify.get('/:id', async (request: FastifyRequest, reply: FastifyReply) => {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
return reply.send(await request.model!.get(id, include, {}, fields));
|
|
196
|
-
} catch (error: any) {
|
|
197
|
-
return reply.handleError(error);
|
|
198
|
-
}
|
|
187
|
+
const { id: rawId } = request.params as { id: string };
|
|
188
|
+
const id: ${idType} = ${idCast};
|
|
189
|
+
const { include = '', fields = null } = request.query as Record<string, string>;
|
|
190
|
+
return reply.send(await request.model!.get(id, include, {}, fields));
|
|
199
191
|
});
|
|
200
192
|
|
|
201
193
|
fastify.post('/', async (request: FastifyRequest, reply: FastifyReply) => {
|
|
202
194
|
const payload = request.body as Record<string, unknown>;
|
|
203
|
-
|
|
204
|
-
return reply.code(201).send(await request.model!.create(payload));
|
|
205
|
-
} catch (error: any) {
|
|
206
|
-
return reply.handleError(error, payload);
|
|
207
|
-
}
|
|
195
|
+
return reply.code(201).send(await request.model!.create(payload));
|
|
208
196
|
});
|
|
209
197
|
|
|
210
198
|
fastify.patch('/:id', async (request: FastifyRequest, reply: FastifyReply) => {
|
|
211
199
|
const { id: rawId } = request.params as { id: string };
|
|
212
200
|
const id: ${idType} = ${idCast};
|
|
213
201
|
const payload = request.body as Record<string, unknown>;
|
|
214
|
-
|
|
215
|
-
return reply.send(await request.model!.update(id, payload));
|
|
216
|
-
} catch (error: any) {
|
|
217
|
-
return reply.handleError(error, payload);
|
|
218
|
-
}
|
|
202
|
+
return reply.send(await request.model!.update(id, payload));
|
|
219
203
|
});
|
|
220
204
|
|
|
221
205
|
fastify.delete('/:id', async (request: FastifyRequest, reply: FastifyReply) => {
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
return reply.sendResponse(200, 'object_deleted_successfully', { modelName: '${className}' });
|
|
227
|
-
} catch (error: any) {
|
|
228
|
-
return reply.handleError(error);
|
|
229
|
-
}
|
|
206
|
+
const { id: rawId } = request.params as { id: string };
|
|
207
|
+
const id: ${idType} = ${idCast};
|
|
208
|
+
await request.model!.delete(id);
|
|
209
|
+
return reply.sendResponse(200, 'object_deleted_successfully', { modelName: '${className}' });
|
|
230
210
|
});
|
|
231
211
|
};
|
|
232
212
|
|
|
@@ -253,60 +233,40 @@ const ${modelName}Routes: FastifyPluginAsync = async (fastify) => {
|
|
|
253
233
|
if (!request.user) {
|
|
254
234
|
return reply.sendError(401, 'no_valid_session');
|
|
255
235
|
}
|
|
256
|
-
request.model = new ${className}({ user: request.user });
|
|
236
|
+
request.model = new ${className}({ user: request.user, strictWrites: true });
|
|
257
237
|
});
|
|
258
238
|
|
|
259
239
|
${subRouteRegistrations}
|
|
260
240
|
|
|
261
241
|
fastify.get('/', async (request: FastifyRequest, reply: FastifyReply) => {
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
return reply.sendList(results.data, results.meta);
|
|
265
|
-
} catch (error: any) {
|
|
266
|
-
return reply.handleError(error);
|
|
267
|
-
}
|
|
242
|
+
const results = await request.model!.getMany(request.parseListQuery());
|
|
243
|
+
return reply.sendList(results.data, results.meta);
|
|
268
244
|
});
|
|
269
245
|
|
|
270
246
|
fastify.get('/:id', async (request: FastifyRequest, reply: FastifyReply) => {
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
return reply.send(await request.model!.get(id, include, {}, fields));
|
|
276
|
-
} catch (error: any) {
|
|
277
|
-
return reply.handleError(error);
|
|
278
|
-
}
|
|
247
|
+
const { id: rawId } = request.params as { id: string };
|
|
248
|
+
const id: ${idType} = ${idCast};
|
|
249
|
+
const { include = '', fields = null } = request.query as Record<string, string>;
|
|
250
|
+
return reply.send(await request.model!.get(id, include, {}, fields));
|
|
279
251
|
});
|
|
280
252
|
|
|
281
253
|
fastify.post('/', async (request: FastifyRequest, reply: FastifyReply) => {
|
|
282
254
|
const payload = request.body as Record<string, unknown>;
|
|
283
|
-
|
|
284
|
-
return reply.code(201).send(await request.model!.create(payload));
|
|
285
|
-
} catch (error: any) {
|
|
286
|
-
return reply.handleError(error, payload);
|
|
287
|
-
}
|
|
255
|
+
return reply.code(201).send(await request.model!.create(payload));
|
|
288
256
|
});
|
|
289
257
|
|
|
290
258
|
fastify.patch('/:id', async (request: FastifyRequest, reply: FastifyReply) => {
|
|
291
259
|
const { id: rawId } = request.params as { id: string };
|
|
292
260
|
const id: ${idType} = ${idCast};
|
|
293
261
|
const payload = request.body as Record<string, unknown>;
|
|
294
|
-
|
|
295
|
-
return reply.send(await request.model!.update(id, payload));
|
|
296
|
-
} catch (error: any) {
|
|
297
|
-
return reply.handleError(error, payload);
|
|
298
|
-
}
|
|
262
|
+
return reply.send(await request.model!.update(id, payload));
|
|
299
263
|
});
|
|
300
264
|
|
|
301
265
|
fastify.delete('/:id', async (request: FastifyRequest, reply: FastifyReply) => {
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
return reply.sendResponse(200, 'object_deleted_successfully', { modelName: '${className}' });
|
|
307
|
-
} catch (error: any) {
|
|
308
|
-
return reply.handleError(error);
|
|
309
|
-
}
|
|
266
|
+
const { id: rawId } = request.params as { id: string };
|
|
267
|
+
const id: ${idType} = ${idCast};
|
|
268
|
+
await request.model!.delete(id);
|
|
269
|
+
return reply.sendResponse(200, 'object_deleted_successfully', { modelName: '${className}' });
|
|
310
270
|
});
|
|
311
271
|
};
|
|
312
272
|
|
|
@@ -342,63 +302,43 @@ const ${junctionModelName}Routes: FastifyPluginAsync = async (fastify) => {
|
|
|
342
302
|
if (!request.user) {
|
|
343
303
|
return reply.sendError(401, 'no_valid_session');
|
|
344
304
|
}
|
|
345
|
-
request.model = new ${className}({ user: request.user });
|
|
305
|
+
request.model = new ${className}({ user: request.user, strictWrites: true });
|
|
346
306
|
});
|
|
347
307
|
|
|
348
308
|
fastify.get('/', async (request: FastifyRequest, reply: FastifyReply) => {
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
return reply.sendList(results.data, results.meta);
|
|
356
|
-
} catch (error: any) {
|
|
357
|
-
return reply.handleError(error);
|
|
358
|
-
}
|
|
309
|
+
const { id: rawParentId } = request.params as { id: string };
|
|
310
|
+
const parentId: ${parentIdType} = ${parentIdCast};
|
|
311
|
+
const params = request.parseListQuery();
|
|
312
|
+
const q = typeof params.q === 'object' ? { ...params.q, ${fkFieldToParent}: parentId } : { ${fkFieldToParent}: parentId };
|
|
313
|
+
const results = await request.model!.getMany({ ...params, q });
|
|
314
|
+
return reply.sendList(results.data, results.meta);
|
|
359
315
|
});
|
|
360
316
|
|
|
361
317
|
fastify.get('/:subId', async (request: FastifyRequest, reply: FastifyReply) => {
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
return reply.send(await request.model!.get(compositeId, include, {}, fields));
|
|
367
|
-
} catch (error: any) {
|
|
368
|
-
return reply.handleError(error);
|
|
369
|
-
}
|
|
318
|
+
const { id: rawParentId, subId: rawSubId } = request.params as { id: string; subId: string };
|
|
319
|
+
const compositeId = { ${fkFieldToParent}: ${parentIdCast} as ${parentIdType}, ${otherFkField}: ${otherFkCast} as ${otherFkType} };
|
|
320
|
+
const { include = '', fields = null } = request.query as Record<string, string>;
|
|
321
|
+
return reply.send(await request.model!.get(compositeId, include, {}, fields));
|
|
370
322
|
});
|
|
371
323
|
|
|
372
324
|
fastify.post('/', async (request: FastifyRequest, reply: FastifyReply) => {
|
|
373
325
|
const { id: rawParentId } = request.params as { id: string };
|
|
374
326
|
const payload = { ...(request.body as Record<string, unknown>), ${fkFieldToParent}: ${parentIdCast} as ${parentIdType} };
|
|
375
|
-
|
|
376
|
-
return reply.code(201).send(await request.model!.create(payload));
|
|
377
|
-
} catch (error: any) {
|
|
378
|
-
return reply.handleError(error, payload);
|
|
379
|
-
}
|
|
327
|
+
return reply.code(201).send(await request.model!.create(payload));
|
|
380
328
|
});
|
|
381
329
|
|
|
382
330
|
fastify.patch('/:subId', async (request: FastifyRequest, reply: FastifyReply) => {
|
|
383
331
|
const { id: rawParentId, subId: rawSubId } = request.params as { id: string; subId: string };
|
|
384
332
|
const compositeId = { ${fkFieldToParent}: ${parentIdCast} as ${parentIdType}, ${otherFkField}: ${otherFkCast} as ${otherFkType} };
|
|
385
333
|
const payload = request.body as Record<string, unknown>;
|
|
386
|
-
|
|
387
|
-
return reply.send(await request.model!.update(compositeId, payload));
|
|
388
|
-
} catch (error: any) {
|
|
389
|
-
return reply.handleError(error, payload);
|
|
390
|
-
}
|
|
334
|
+
return reply.send(await request.model!.update(compositeId, payload));
|
|
391
335
|
});
|
|
392
336
|
|
|
393
337
|
fastify.delete('/:subId', async (request: FastifyRequest, reply: FastifyReply) => {
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
return reply.sendResponse(200, 'object_deleted_successfully', { modelName: '${className}' });
|
|
399
|
-
} catch (error: any) {
|
|
400
|
-
return reply.handleError(error);
|
|
401
|
-
}
|
|
338
|
+
const { id: rawParentId, subId: rawSubId } = request.params as { id: string; subId: string };
|
|
339
|
+
const compositeId = { ${fkFieldToParent}: ${parentIdCast} as ${parentIdType}, ${otherFkField}: ${otherFkCast} as ${otherFkType} };
|
|
340
|
+
await request.model!.delete(compositeId);
|
|
341
|
+
return reply.sendResponse(200, 'object_deleted_successfully', { modelName: '${className}' });
|
|
402
342
|
});
|
|
403
343
|
};
|
|
404
344
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routeGenerator.js","sourceRoot":"","sources":["../../../src/generators/routeGenerator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuKA,
|
|
1
|
+
{"version":3,"file":"routeGenerator.js","sourceRoot":"","sources":["../../../src/generators/routeGenerator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rapidd/build",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"description": "Dynamic code generator that transforms Prisma schemas into Fastify CRUD APIs with TypeScript",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"author": "Mert Dalbudak",
|
|
47
47
|
"license": "MIT",
|
|
48
48
|
"engines": {
|
|
49
|
-
"node": ">=
|
|
49
|
+
"node": ">=22.0.0"
|
|
50
50
|
},
|
|
51
51
|
"files": [
|
|
52
52
|
"dist/",
|
|
@@ -54,16 +54,16 @@
|
|
|
54
54
|
"LICENSE"
|
|
55
55
|
],
|
|
56
56
|
"dependencies": {
|
|
57
|
-
"@prisma/internals": "^7.0
|
|
57
|
+
"@prisma/internals": "^7.8.0",
|
|
58
58
|
"commander": "^11.0.0"
|
|
59
59
|
},
|
|
60
60
|
"devDependencies": {
|
|
61
|
-
"@types/node": "^
|
|
62
|
-
"prisma": "^7.0
|
|
61
|
+
"@types/node": "^22.12.0",
|
|
62
|
+
"prisma": "^7.8.0",
|
|
63
63
|
"tsx": "^4.0.0",
|
|
64
64
|
"typescript": "^5.5.0"
|
|
65
65
|
},
|
|
66
66
|
"peerDependencies": {
|
|
67
|
-
"@prisma/client": "^7.0
|
|
67
|
+
"@prisma/client": "^7.8.0"
|
|
68
68
|
}
|
|
69
69
|
}
|