@rhino-dev/rhino-nestjs 0.2.5
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/LICENSE +21 -0
- package/README.md +427 -0
- package/dist/blueprint/blueprint-parser.d.ts +130 -0
- package/dist/blueprint/blueprint-parser.js +276 -0
- package/dist/blueprint/blueprint-parser.js.map +1 -0
- package/dist/blueprint/blueprint-runner.d.ts +51 -0
- package/dist/blueprint/blueprint-runner.js +238 -0
- package/dist/blueprint/blueprint-runner.js.map +1 -0
- package/dist/blueprint/blueprint-validator.d.ts +19 -0
- package/dist/blueprint/blueprint-validator.js +163 -0
- package/dist/blueprint/blueprint-validator.js.map +1 -0
- package/dist/blueprint/generators/policy-generator.d.ts +40 -0
- package/dist/blueprint/generators/policy-generator.js +157 -0
- package/dist/blueprint/generators/policy-generator.js.map +1 -0
- package/dist/blueprint/generators/prisma-schema-generator.d.ts +43 -0
- package/dist/blueprint/generators/prisma-schema-generator.js +197 -0
- package/dist/blueprint/generators/prisma-schema-generator.js.map +1 -0
- package/dist/blueprint/generators/resource-definition-generator.d.ts +52 -0
- package/dist/blueprint/generators/resource-definition-generator.js +229 -0
- package/dist/blueprint/generators/resource-definition-generator.js.map +1 -0
- package/dist/blueprint/generators/seeder-generator.d.ts +21 -0
- package/dist/blueprint/generators/seeder-generator.js +135 -0
- package/dist/blueprint/generators/seeder-generator.js.map +1 -0
- package/dist/blueprint/generators/test-generator.d.ts +28 -0
- package/dist/blueprint/generators/test-generator.js +275 -0
- package/dist/blueprint/generators/test-generator.js.map +1 -0
- package/dist/blueprint/manifest-manager.d.ts +58 -0
- package/dist/blueprint/manifest-manager.js +137 -0
- package/dist/blueprint/manifest-manager.js.map +1 -0
- package/dist/cli/commands/blueprint.command.d.ts +16 -0
- package/dist/cli/commands/blueprint.command.js +35 -0
- package/dist/cli/commands/blueprint.command.js.map +1 -0
- package/dist/cli/commands/export-postman.command.d.ts +5 -0
- package/dist/cli/commands/export-postman.command.js +39 -0
- package/dist/cli/commands/export-postman.command.js.map +1 -0
- package/dist/cli/commands/export-types.command.d.ts +4 -0
- package/dist/cli/commands/export-types.command.js +36 -0
- package/dist/cli/commands/export-types.command.js.map +1 -0
- package/dist/cli/commands/generate.command.d.ts +6 -0
- package/dist/cli/commands/generate.command.js +212 -0
- package/dist/cli/commands/generate.command.js.map +1 -0
- package/dist/cli/commands/install.command.d.ts +8 -0
- package/dist/cli/commands/install.command.js +205 -0
- package/dist/cli/commands/install.command.js.map +1 -0
- package/dist/cli/index.d.ts +17 -0
- package/dist/cli/index.js +123 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/io.d.ts +12 -0
- package/dist/cli/utils/io.js +74 -0
- package/dist/cli/utils/io.js.map +1 -0
- package/dist/cli/utils/prompt.d.ts +12 -0
- package/dist/cli/utils/prompt.js +78 -0
- package/dist/cli/utils/prompt.js.map +1 -0
- package/dist/constants/tokens.d.ts +3 -0
- package/dist/constants/tokens.js +7 -0
- package/dist/constants/tokens.js.map +1 -0
- package/dist/controllers/auth.controller.d.ts +59 -0
- package/dist/controllers/auth.controller.js +121 -0
- package/dist/controllers/auth.controller.js.map +1 -0
- package/dist/controllers/global.controller.d.ts +44 -0
- package/dist/controllers/global.controller.js +357 -0
- package/dist/controllers/global.controller.js.map +1 -0
- package/dist/controllers/invitation.controller.d.ts +30 -0
- package/dist/controllers/invitation.controller.js +111 -0
- package/dist/controllers/invitation.controller.js.map +1 -0
- package/dist/controllers/nested.controller.d.ts +12 -0
- package/dist/controllers/nested.controller.js +69 -0
- package/dist/controllers/nested.controller.js.map +1 -0
- package/dist/decorators/index.d.ts +33 -0
- package/dist/decorators/index.js +79 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/errors/rhino-exception.d.ts +24 -0
- package/dist/errors/rhino-exception.js +47 -0
- package/dist/errors/rhino-exception.js.map +1 -0
- package/dist/exporters/postman-exporter.d.ts +21 -0
- package/dist/exporters/postman-exporter.js +396 -0
- package/dist/exporters/postman-exporter.js.map +1 -0
- package/dist/exporters/typescript-exporter.d.ts +23 -0
- package/dist/exporters/typescript-exporter.js +129 -0
- package/dist/exporters/typescript-exporter.js.map +1 -0
- package/dist/guards/jwt-auth.guard.d.ts +16 -0
- package/dist/guards/jwt-auth.guard.js +61 -0
- package/dist/guards/jwt-auth.guard.js.map +1 -0
- package/dist/guards/resource-policy.guard.d.ts +12 -0
- package/dist/guards/resource-policy.guard.js +111 -0
- package/dist/guards/resource-policy.guard.js.map +1 -0
- package/dist/index.d.ts +60 -0
- package/dist/index.js +171 -0
- package/dist/index.js.map +1 -0
- package/dist/interceptors/hidden-columns.interceptor.d.ts +18 -0
- package/dist/interceptors/hidden-columns.interceptor.js +66 -0
- package/dist/interceptors/hidden-columns.interceptor.js.map +1 -0
- package/dist/interceptors/response.interceptor.d.ts +19 -0
- package/dist/interceptors/response.interceptor.js +47 -0
- package/dist/interceptors/response.interceptor.js.map +1 -0
- package/dist/interfaces/rhino-config.interface.d.ts +103 -0
- package/dist/interfaces/rhino-config.interface.js +3 -0
- package/dist/interfaces/rhino-config.interface.js.map +1 -0
- package/dist/interfaces/rhino-request.interface.d.ts +12 -0
- package/dist/interfaces/rhino-request.interface.js +3 -0
- package/dist/interfaces/rhino-request.interface.js.map +1 -0
- package/dist/middleware/resolve-organization.middleware.d.ts +15 -0
- package/dist/middleware/resolve-organization.middleware.js +38 -0
- package/dist/middleware/resolve-organization.middleware.js.map +1 -0
- package/dist/middleware/route-group.middleware.d.ts +17 -0
- package/dist/middleware/route-group.middleware.js +60 -0
- package/dist/middleware/route-group.middleware.js.map +1 -0
- package/dist/middleware/tenant-route-rewrite.d.ts +76 -0
- package/dist/middleware/tenant-route-rewrite.js +124 -0
- package/dist/middleware/tenant-route-rewrite.js.map +1 -0
- package/dist/policies/resource-policy.d.ts +25 -0
- package/dist/policies/resource-policy.js +77 -0
- package/dist/policies/resource-policy.js.map +1 -0
- package/dist/prisma/prisma-soft-delete.extension.d.ts +16 -0
- package/dist/prisma/prisma-soft-delete.extension.js +57 -0
- package/dist/prisma/prisma-soft-delete.extension.js.map +1 -0
- package/dist/prisma/prisma-uuid.extension.d.ts +9 -0
- package/dist/prisma/prisma-uuid.extension.js +28 -0
- package/dist/prisma/prisma-uuid.extension.js.map +1 -0
- package/dist/prisma/prisma.service.d.ts +38 -0
- package/dist/prisma/prisma.service.js +100 -0
- package/dist/prisma/prisma.service.js.map +1 -0
- package/dist/rhino.config.d.ts +43 -0
- package/dist/rhino.config.js +130 -0
- package/dist/rhino.config.js.map +1 -0
- package/dist/rhino.module.d.ts +61 -0
- package/dist/rhino.module.js +268 -0
- package/dist/rhino.module.js.map +1 -0
- package/dist/services/audit.service.d.ts +35 -0
- package/dist/services/audit.service.js +92 -0
- package/dist/services/audit.service.js.map +1 -0
- package/dist/services/auth.service.d.ts +33 -0
- package/dist/services/auth.service.js +157 -0
- package/dist/services/auth.service.js.map +1 -0
- package/dist/services/invitation.service.d.ts +37 -0
- package/dist/services/invitation.service.js +143 -0
- package/dist/services/invitation.service.js.map +1 -0
- package/dist/services/nested.service.d.ts +34 -0
- package/dist/services/nested.service.js +163 -0
- package/dist/services/nested.service.js.map +1 -0
- package/dist/services/organization.service.d.ts +13 -0
- package/dist/services/organization.service.js +60 -0
- package/dist/services/organization.service.js.map +1 -0
- package/dist/services/query-builder.service.d.ts +31 -0
- package/dist/services/query-builder.service.js +151 -0
- package/dist/services/query-builder.service.js.map +1 -0
- package/dist/services/resource.service.d.ts +38 -0
- package/dist/services/resource.service.js +230 -0
- package/dist/services/resource.service.js.map +1 -0
- package/dist/services/route-registration.service.d.ts +40 -0
- package/dist/services/route-registration.service.js +68 -0
- package/dist/services/route-registration.service.js.map +1 -0
- package/dist/services/scope.service.d.ts +16 -0
- package/dist/services/scope.service.js +32 -0
- package/dist/services/scope.service.js.map +1 -0
- package/dist/services/serializer.service.d.ts +36 -0
- package/dist/services/serializer.service.js +90 -0
- package/dist/services/serializer.service.js.map +1 -0
- package/dist/services/validation.service.d.ts +50 -0
- package/dist/services/validation.service.js +203 -0
- package/dist/services/validation.service.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/dist/utils/fk-chain-walker.d.ts +30 -0
- package/dist/utils/fk-chain-walker.js +23 -0
- package/dist/utils/fk-chain-walker.js.map +1 -0
- package/dist/utils/format.d.ts +7 -0
- package/dist/utils/format.js +28 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/model-builder.d.ts +64 -0
- package/dist/utils/model-builder.js +67 -0
- package/dist/utils/model-builder.js.map +1 -0
- package/dist/utils/permission-matcher.d.ts +46 -0
- package/dist/utils/permission-matcher.js +120 -0
- package/dist/utils/permission-matcher.js.map +1 -0
- package/dist/utils/scope-discovery.d.ts +34 -0
- package/dist/utils/scope-discovery.js +102 -0
- package/dist/utils/scope-discovery.js.map +1 -0
- package/package.json +64 -0
- package/stubs/skills/rhino-audit.md +184 -0
- package/stubs/skills/rhino-bugfix.md +117 -0
- package/stubs/skills/rhino-deploy.md +5 -0
- package/stubs/skills/rhino-docs.md +147 -0
- package/stubs/skills/rhino-feature.md +146 -0
- package/stubs/skills/rhino-migrate.md +181 -0
- package/stubs/skills/rhino-model.md +180 -0
- package/stubs/skills/rhino-plan.md +5 -0
- package/stubs/skills/rhino-policy.md +183 -0
- package/stubs/skills/rhino-refactor.md +147 -0
- package/stubs/skills/rhino-review.md +113 -0
- package/stubs/skills/rhino-scope.md +140 -0
- package/stubs/skills/rhino-test.md +233 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RHINO_MODEL_METADATA = void 0;
|
|
4
|
+
exports.RhinoModel = RhinoModel;
|
|
5
|
+
exports.getRhinoModelMetadata = getRhinoModelMetadata;
|
|
6
|
+
exports.BelongsToOrganization = BelongsToOrganization;
|
|
7
|
+
exports.HasAuditTrail = HasAuditTrail;
|
|
8
|
+
exports.HasUuid = HasUuid;
|
|
9
|
+
exports.HasSoftDeletes = HasSoftDeletes;
|
|
10
|
+
exports.ExceptActions = ExceptActions;
|
|
11
|
+
exports.HidableColumns = HidableColumns;
|
|
12
|
+
exports.PermittedAttrs = PermittedAttrs;
|
|
13
|
+
require("reflect-metadata");
|
|
14
|
+
exports.RHINO_MODEL_METADATA = Symbol('rhino:model');
|
|
15
|
+
/**
|
|
16
|
+
* Class decorator that tags a resource definition class with its Rhino
|
|
17
|
+
* model configuration. The metadata is read by the CLI / install helpers and
|
|
18
|
+
* can be merged into `RhinoModule.forRoot({models})`.
|
|
19
|
+
*
|
|
20
|
+
* Usage:
|
|
21
|
+
*
|
|
22
|
+
* @RhinoModel({ slug: 'posts', model: 'post', belongsToOrganization: true })
|
|
23
|
+
* export class PostResource {}
|
|
24
|
+
*/
|
|
25
|
+
function RhinoModel(config) {
|
|
26
|
+
return (target) => {
|
|
27
|
+
const existing = (Reflect.getMetadata(exports.RHINO_MODEL_METADATA, target) ?? {});
|
|
28
|
+
Reflect.defineMetadata(exports.RHINO_MODEL_METADATA, { ...existing, ...config }, target);
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function getRhinoModelMetadata(target) {
|
|
32
|
+
return Reflect.getMetadata(exports.RHINO_MODEL_METADATA, target);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Marker decorator. Does nothing at runtime — documents intent for generators.
|
|
36
|
+
*/
|
|
37
|
+
function BelongsToOrganization() {
|
|
38
|
+
return (target) => {
|
|
39
|
+
const existing = (Reflect.getMetadata(exports.RHINO_MODEL_METADATA, target) ?? {});
|
|
40
|
+
Reflect.defineMetadata(exports.RHINO_MODEL_METADATA, { ...existing, belongsToOrganization: true }, target);
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function HasAuditTrail(excludeFields = []) {
|
|
44
|
+
return (target) => {
|
|
45
|
+
const existing = (Reflect.getMetadata(exports.RHINO_MODEL_METADATA, target) ?? {});
|
|
46
|
+
Reflect.defineMetadata(exports.RHINO_MODEL_METADATA, { ...existing, hasAuditTrail: true, auditExclude: excludeFields }, target);
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function HasUuid() {
|
|
50
|
+
return (target) => {
|
|
51
|
+
const existing = (Reflect.getMetadata(exports.RHINO_MODEL_METADATA, target) ?? {});
|
|
52
|
+
Reflect.defineMetadata(exports.RHINO_MODEL_METADATA, { ...existing, hasUuid: true }, target);
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function HasSoftDeletes() {
|
|
56
|
+
return (target) => {
|
|
57
|
+
const existing = (Reflect.getMetadata(exports.RHINO_MODEL_METADATA, target) ?? {});
|
|
58
|
+
Reflect.defineMetadata(exports.RHINO_MODEL_METADATA, { ...existing, softDeletes: true }, target);
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function ExceptActions(actions) {
|
|
62
|
+
return (target) => {
|
|
63
|
+
const existing = (Reflect.getMetadata(exports.RHINO_MODEL_METADATA, target) ?? {});
|
|
64
|
+
Reflect.defineMetadata(exports.RHINO_MODEL_METADATA, { ...existing, exceptActions: actions }, target);
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function HidableColumns(columns) {
|
|
68
|
+
return (target) => {
|
|
69
|
+
const existing = (Reflect.getMetadata(exports.RHINO_MODEL_METADATA, target) ?? {});
|
|
70
|
+
Reflect.defineMetadata(exports.RHINO_MODEL_METADATA, { ...existing, additionalHiddenColumns: columns }, target);
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function PermittedAttrs(config) {
|
|
74
|
+
return (target) => {
|
|
75
|
+
const existing = (Reflect.getMetadata(exports.RHINO_MODEL_METADATA, target) ?? {});
|
|
76
|
+
Reflect.defineMetadata(exports.RHINO_MODEL_METADATA, { ...existing, permittedAttrs: config }, target);
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/decorators/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { HttpException } from '@nestjs/common';
|
|
2
|
+
export type RhinoErrorCode = 'VALIDATION_FAILED' | 'FORBIDDEN_FIELDS' | 'CROSS_TENANT' | 'UNAUTHORIZED' | 'FORBIDDEN' | 'NOT_FOUND' | 'ACTION_DISABLED' | 'UNKNOWN_RESOURCE' | 'INVITATION_EXPIRED' | 'INVITATION_USED' | 'INVITATION_INVALID_ROLE' | 'NESTED_OPERATION_FAILED' | 'INCLUDE_NOT_AUTHORIZED';
|
|
3
|
+
export interface RhinoErrorBody {
|
|
4
|
+
code: RhinoErrorCode;
|
|
5
|
+
message: string;
|
|
6
|
+
details?: Record<string, any>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Single exception shape surfaced by the library. Frontends can rely on the
|
|
10
|
+
* `{ code, message, details }` envelope regardless of HTTP status.
|
|
11
|
+
*/
|
|
12
|
+
export declare class RhinoException extends HttpException {
|
|
13
|
+
readonly code: RhinoErrorCode;
|
|
14
|
+
constructor(code: RhinoErrorCode, message: string, status: number, details?: Record<string, any>);
|
|
15
|
+
static validationFailed(errors: Record<string, string[]>): RhinoException;
|
|
16
|
+
static forbiddenFields(fields: string[]): RhinoException;
|
|
17
|
+
static crossTenant(errors: Record<string, string[]>): RhinoException;
|
|
18
|
+
static unauthorized(message?: string): RhinoException;
|
|
19
|
+
static forbidden(message?: string): RhinoException;
|
|
20
|
+
static notFound(message?: string): RhinoException;
|
|
21
|
+
static actionDisabled(action: string): RhinoException;
|
|
22
|
+
static unknownResource(slug: string): RhinoException;
|
|
23
|
+
static includeNotAuthorized(slug: string): RhinoException;
|
|
24
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RhinoException = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
/**
|
|
6
|
+
* Single exception shape surfaced by the library. Frontends can rely on the
|
|
7
|
+
* `{ code, message, details }` envelope regardless of HTTP status.
|
|
8
|
+
*/
|
|
9
|
+
class RhinoException extends common_1.HttpException {
|
|
10
|
+
code;
|
|
11
|
+
constructor(code, message, status, details) {
|
|
12
|
+
const body = { code, message, ...(details ? { details } : {}) };
|
|
13
|
+
super(body, status);
|
|
14
|
+
this.code = code;
|
|
15
|
+
}
|
|
16
|
+
static validationFailed(errors) {
|
|
17
|
+
return new RhinoException('VALIDATION_FAILED', 'Validation failed', 422, { errors });
|
|
18
|
+
}
|
|
19
|
+
static forbiddenFields(fields) {
|
|
20
|
+
return new RhinoException('FORBIDDEN_FIELDS', 'Request contains fields not allowed for your role', 403, {
|
|
21
|
+
fields,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
static crossTenant(errors) {
|
|
25
|
+
return new RhinoException('CROSS_TENANT', 'Referenced record not in current organization', 422, { errors });
|
|
26
|
+
}
|
|
27
|
+
static unauthorized(message = 'Unauthorized') {
|
|
28
|
+
return new RhinoException('UNAUTHORIZED', message, 401);
|
|
29
|
+
}
|
|
30
|
+
static forbidden(message = 'This action is unauthorized.') {
|
|
31
|
+
return new RhinoException('FORBIDDEN', message, 403);
|
|
32
|
+
}
|
|
33
|
+
static notFound(message = 'Not found') {
|
|
34
|
+
return new RhinoException('NOT_FOUND', message, 404);
|
|
35
|
+
}
|
|
36
|
+
static actionDisabled(action) {
|
|
37
|
+
return new RhinoException('ACTION_DISABLED', 'Action not available', 404, { action });
|
|
38
|
+
}
|
|
39
|
+
static unknownResource(slug) {
|
|
40
|
+
return new RhinoException('UNKNOWN_RESOURCE', `Unknown resource: ${slug}`, 404, { slug });
|
|
41
|
+
}
|
|
42
|
+
static includeNotAuthorized(slug) {
|
|
43
|
+
return new RhinoException('INCLUDE_NOT_AUTHORIZED', `Include not authorized: ${slug}`, 403, { slug });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.RhinoException = RhinoException;
|
|
47
|
+
//# sourceMappingURL=rhino-exception.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rhino-exception.js","sourceRoot":"","sources":["../../src/errors/rhino-exception.ts"],"names":[],"mappings":";;;AAAA,2CAA+C;AAuB/C;;;GAGG;AACH,MAAa,cAAe,SAAQ,sBAAa;IACtC,IAAI,CAAiB;IAE9B,YAAY,IAAoB,EAAE,OAAe,EAAE,MAAc,EAAE,OAA6B;QAC9F,MAAM,IAAI,GAAmB,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAChF,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,MAAgC;QACtD,OAAO,IAAI,cAAc,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,CAAC,eAAe,CAAC,MAAgB;QACrC,OAAO,IAAI,cAAc,CAAC,kBAAkB,EAAE,mDAAmD,EAAE,GAAG,EAAE;YACtG,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,MAAgC;QACjD,OAAO,IAAI,cAAc,CAAC,cAAc,EAAE,+CAA+C,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9G,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAAO,GAAG,cAAc;QAC1C,OAAO,IAAI,cAAc,CAAC,cAAc,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,OAAO,GAAG,8BAA8B;QACvD,OAAO,IAAI,cAAc,CAAC,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,OAAO,GAAG,WAAW;QACnC,OAAO,IAAI,cAAc,CAAC,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,MAAc;QAClC,OAAO,IAAI,cAAc,CAAC,iBAAiB,EAAE,sBAAsB,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,CAAC,eAAe,CAAC,IAAY;QACjC,OAAO,IAAI,cAAc,CAAC,kBAAkB,EAAE,qBAAqB,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,CAAC,oBAAoB,CAAC,IAAY;QACtC,OAAO,IAAI,cAAc,CAAC,wBAAwB,EAAE,2BAA2B,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACxG,CAAC;CACF;AA9CD,wCA8CC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { RhinoConfig } from '../interfaces/rhino-config.interface';
|
|
2
|
+
export interface PostmanExporterOptions {
|
|
3
|
+
baseUrl: string;
|
|
4
|
+
projectName?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Generate a Postman Collection v2.1 JSON object from an RhinoConfig.
|
|
8
|
+
*
|
|
9
|
+
* The returned value is a plain JS object that can be serialised with
|
|
10
|
+
* `JSON.stringify`. Prisma model names are not available at export time, so
|
|
11
|
+
* request bodies use field-name placeholders derived from the config hints
|
|
12
|
+
* (allowedFilters / allowedFields / …).
|
|
13
|
+
*/
|
|
14
|
+
export declare function generatePostmanCollection(config: RhinoConfig, options: PostmanExporterOptions): object;
|
|
15
|
+
/**
|
|
16
|
+
* Alias for `generatePostmanCollection` that serialises the result to a JSON
|
|
17
|
+
* string. Used by the CLI command which expects a string back.
|
|
18
|
+
*
|
|
19
|
+
* @internal Prefer `generatePostmanCollection` in library code.
|
|
20
|
+
*/
|
|
21
|
+
export declare function generate(config: RhinoConfig, options: PostmanExporterOptions): string;
|
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generatePostmanCollection = generatePostmanCollection;
|
|
4
|
+
exports.generate = generate;
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Public API
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
/**
|
|
9
|
+
* Generate a Postman Collection v2.1 JSON object from an RhinoConfig.
|
|
10
|
+
*
|
|
11
|
+
* The returned value is a plain JS object that can be serialised with
|
|
12
|
+
* `JSON.stringify`. Prisma model names are not available at export time, so
|
|
13
|
+
* request bodies use field-name placeholders derived from the config hints
|
|
14
|
+
* (allowedFilters / allowedFields / …).
|
|
15
|
+
*/
|
|
16
|
+
function generatePostmanCollection(config, options) {
|
|
17
|
+
const baseUrl = (options.baseUrl ?? '').replace(/\/$/, '');
|
|
18
|
+
const projectName = options.projectName ?? 'Rhino API';
|
|
19
|
+
const models = config.models ?? {};
|
|
20
|
+
const routeGroups = config.routeGroups ?? {};
|
|
21
|
+
const groupNames = Object.keys(routeGroups);
|
|
22
|
+
const hasMultipleGroups = groupNames.length > 1;
|
|
23
|
+
const multiTenantEnabled = isMultiTenantEnabled(config);
|
|
24
|
+
const needsOrgVariable = groupNames.some(name => {
|
|
25
|
+
const prefix = routeGroups[name].prefix ?? '';
|
|
26
|
+
return prefixHasParam(prefix);
|
|
27
|
+
});
|
|
28
|
+
const variables = buildCollectionVariables(baseUrl, needsOrgVariable);
|
|
29
|
+
const items = [];
|
|
30
|
+
// Auth folder is always first
|
|
31
|
+
items.push(buildAuthFolder(multiTenantEnabled));
|
|
32
|
+
if (hasMultipleGroups) {
|
|
33
|
+
for (const groupName of groupNames) {
|
|
34
|
+
const group = routeGroups[groupName];
|
|
35
|
+
const slugList = group.models === '*' ? Object.keys(models) : group.models;
|
|
36
|
+
const groupItems = [];
|
|
37
|
+
for (const slug of slugList) {
|
|
38
|
+
const reg = models[slug];
|
|
39
|
+
if (!reg)
|
|
40
|
+
continue;
|
|
41
|
+
const modelFolder = buildModelFolder(slug, reg, group.prefix ?? '');
|
|
42
|
+
groupItems.push(modelFolder);
|
|
43
|
+
}
|
|
44
|
+
if (groupItems.length > 0) {
|
|
45
|
+
items.push({ name: groupName, item: groupItems });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else if (groupNames.length === 1) {
|
|
50
|
+
const groupName = groupNames[0];
|
|
51
|
+
const group = routeGroups[groupName];
|
|
52
|
+
const slugList = group.models === '*' ? Object.keys(models) : group.models;
|
|
53
|
+
for (const slug of slugList) {
|
|
54
|
+
const reg = models[slug];
|
|
55
|
+
if (!reg)
|
|
56
|
+
continue;
|
|
57
|
+
items.push(buildModelFolder(slug, reg, group.prefix ?? ''));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
// No route groups — flat list
|
|
62
|
+
for (const [slug, reg] of Object.entries(models)) {
|
|
63
|
+
items.push(buildModelFolder(slug, reg, ''));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
info: {
|
|
68
|
+
name: projectName,
|
|
69
|
+
schema: 'https://schema.getpostman.com/json/collection/v2.1.0/collection.json',
|
|
70
|
+
},
|
|
71
|
+
variable: variables,
|
|
72
|
+
item: items,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
// Helpers — variables & headers
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
function isMultiTenantEnabled(config) {
|
|
79
|
+
const mt = config.multiTenant;
|
|
80
|
+
if (!mt)
|
|
81
|
+
return false;
|
|
82
|
+
if (mt.enabled === false)
|
|
83
|
+
return false;
|
|
84
|
+
return mt.enabled === true || Boolean(mt.organizationIdentifierColumn);
|
|
85
|
+
}
|
|
86
|
+
function prefixHasParam(prefix) {
|
|
87
|
+
return prefix.includes('{') || prefix.includes(':');
|
|
88
|
+
}
|
|
89
|
+
function buildCollectionVariables(baseUrl, needsOrgVariable) {
|
|
90
|
+
const vars = [
|
|
91
|
+
{ key: 'baseUrl', value: baseUrl },
|
|
92
|
+
{ key: 'modelId', value: '1' },
|
|
93
|
+
{ key: 'token', value: '' },
|
|
94
|
+
];
|
|
95
|
+
if (needsOrgVariable) {
|
|
96
|
+
vars.push({ key: 'organization', value: 'organization-1' });
|
|
97
|
+
}
|
|
98
|
+
return vars;
|
|
99
|
+
}
|
|
100
|
+
function defaultHeaders() {
|
|
101
|
+
return [
|
|
102
|
+
{ key: 'Accept', value: 'application/json' },
|
|
103
|
+
{ key: 'Authorization', value: 'Bearer {{token}}' },
|
|
104
|
+
];
|
|
105
|
+
}
|
|
106
|
+
function jsonHeaders() {
|
|
107
|
+
return [
|
|
108
|
+
...defaultHeaders(),
|
|
109
|
+
{ key: 'Content-Type', value: 'application/json' },
|
|
110
|
+
];
|
|
111
|
+
}
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
// Auth folder
|
|
114
|
+
// ---------------------------------------------------------------------------
|
|
115
|
+
function buildAuthFolder(multiTenantEnabled) {
|
|
116
|
+
const loginTestScript = 'const json = pm.response.json();\n' +
|
|
117
|
+
'if (json.token) {\n' +
|
|
118
|
+
' pm.collectionVariables.set("token", json.token);\n' +
|
|
119
|
+
'}\n' +
|
|
120
|
+
'if (json.organization_slug) {\n' +
|
|
121
|
+
' pm.collectionVariables.set("organization", json.organization_slug);\n' +
|
|
122
|
+
'}';
|
|
123
|
+
const items = [
|
|
124
|
+
requestItem('Login', 'POST', '{{baseUrl}}/auth/login', {}, jsonHeaders(), {
|
|
125
|
+
email: 'user@example.com',
|
|
126
|
+
password: 'password',
|
|
127
|
+
}, loginTestScript),
|
|
128
|
+
requestItem('Logout', 'POST', '{{baseUrl}}/auth/logout', {}, defaultHeaders()),
|
|
129
|
+
requestItem('Password recover', 'POST', '{{baseUrl}}/auth/password/recover', {}, jsonHeaders(), {
|
|
130
|
+
email: 'user@example.com',
|
|
131
|
+
}),
|
|
132
|
+
requestItem('Password reset', 'POST', '{{baseUrl}}/auth/password/reset', {}, jsonHeaders(), {
|
|
133
|
+
token: '{{token}}',
|
|
134
|
+
email: 'user@example.com',
|
|
135
|
+
password: 'new-password',
|
|
136
|
+
password_confirmation: 'new-password',
|
|
137
|
+
}),
|
|
138
|
+
requestItem('Register', 'POST', '{{baseUrl}}/auth/register', {}, jsonHeaders(), {
|
|
139
|
+
invitation_token: '{{token}}',
|
|
140
|
+
name: 'New User',
|
|
141
|
+
password: 'password',
|
|
142
|
+
password_confirmation: 'password',
|
|
143
|
+
}),
|
|
144
|
+
];
|
|
145
|
+
if (multiTenantEnabled) {
|
|
146
|
+
items.push(requestItem('Accept invitation', 'POST', '{{baseUrl}}/invitations/accept', {}, jsonHeaders(), {
|
|
147
|
+
token: 'invitation-token',
|
|
148
|
+
}));
|
|
149
|
+
}
|
|
150
|
+
return { name: 'Authentication', item: items };
|
|
151
|
+
}
|
|
152
|
+
// ---------------------------------------------------------------------------
|
|
153
|
+
// Model folder
|
|
154
|
+
// ---------------------------------------------------------------------------
|
|
155
|
+
function buildModelFolder(slug, reg, groupPrefix) {
|
|
156
|
+
const basePath = buildBasePath(slug, groupPrefix);
|
|
157
|
+
const exceptActions = reg.exceptActions ?? [];
|
|
158
|
+
const folders = [];
|
|
159
|
+
if (!exceptActions.includes('index')) {
|
|
160
|
+
folders.push({ name: 'Index', item: buildIndexRequests(basePath, slug, reg) });
|
|
161
|
+
}
|
|
162
|
+
if (!exceptActions.includes('show')) {
|
|
163
|
+
folders.push({ name: 'Show', item: buildShowRequests(basePath, slug, reg) });
|
|
164
|
+
}
|
|
165
|
+
if (!exceptActions.includes('store')) {
|
|
166
|
+
folders.push({ name: 'Store', item: buildStoreRequests(basePath, reg) });
|
|
167
|
+
}
|
|
168
|
+
if (!exceptActions.includes('update')) {
|
|
169
|
+
folders.push({ name: 'Update', item: buildUpdateRequests(basePath, reg) });
|
|
170
|
+
}
|
|
171
|
+
if (!exceptActions.includes('destroy')) {
|
|
172
|
+
folders.push({ name: 'Destroy', item: buildDestroyRequests(basePath) });
|
|
173
|
+
}
|
|
174
|
+
if (reg.softDeletes) {
|
|
175
|
+
if (!exceptActions.includes('trashed')) {
|
|
176
|
+
folders.push({ name: 'Trashed', item: buildTrashedRequests(basePath, reg) });
|
|
177
|
+
}
|
|
178
|
+
if (!exceptActions.includes('restore')) {
|
|
179
|
+
folders.push({ name: 'Restore', item: buildRestoreRequests(basePath) });
|
|
180
|
+
}
|
|
181
|
+
if (!exceptActions.includes('forceDelete')) {
|
|
182
|
+
folders.push({ name: 'Force Delete', item: buildForceDeleteRequests(basePath) });
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return { name: slug, item: folders };
|
|
186
|
+
}
|
|
187
|
+
function buildBasePath(slug, groupPrefix) {
|
|
188
|
+
if (groupPrefix) {
|
|
189
|
+
// Replace {param} or :param with {{param}} for Postman variables
|
|
190
|
+
const postmanPrefix = groupPrefix
|
|
191
|
+
.replace(/\{(\w+)\}/g, '{{$1}}')
|
|
192
|
+
.replace(/:(\w+)/g, '{{$1}}');
|
|
193
|
+
return `{{baseUrl}}/${postmanPrefix}/${slug}`;
|
|
194
|
+
}
|
|
195
|
+
return `{{baseUrl}}/${slug}`;
|
|
196
|
+
}
|
|
197
|
+
// ---------------------------------------------------------------------------
|
|
198
|
+
// CRUD request builders
|
|
199
|
+
// ---------------------------------------------------------------------------
|
|
200
|
+
function buildIndexRequests(basePath, slug, reg) {
|
|
201
|
+
const requests = [];
|
|
202
|
+
const hdrs = defaultHeaders();
|
|
203
|
+
requests.push(requestItem('List all', 'GET', basePath, {}, hdrs));
|
|
204
|
+
for (const filter of reg.allowedFilters ?? []) {
|
|
205
|
+
requests.push(requestItem(`Filter by ${filter}`, 'GET', basePath, {
|
|
206
|
+
[`filter[${filter}]`]: exampleFilterValue(filter),
|
|
207
|
+
}, hdrs));
|
|
208
|
+
}
|
|
209
|
+
for (const sort of reg.allowedSorts ?? []) {
|
|
210
|
+
requests.push(requestItem(`Sort by ${sort} (asc)`, 'GET', basePath, { sort }, hdrs));
|
|
211
|
+
requests.push(requestItem(`Sort by ${sort} (desc)`, 'GET', basePath, { sort: `-${sort}` }, hdrs));
|
|
212
|
+
}
|
|
213
|
+
const includes = reg.allowedIncludes ?? [];
|
|
214
|
+
for (const include of includes) {
|
|
215
|
+
requests.push(requestItem(`Include ${include}`, 'GET', basePath, { include }, hdrs));
|
|
216
|
+
}
|
|
217
|
+
if (includes.length > 1) {
|
|
218
|
+
requests.push(requestItem('Include all', 'GET', basePath, { include: includes.join(',') }, hdrs));
|
|
219
|
+
}
|
|
220
|
+
const fields = reg.allowedFields ?? [];
|
|
221
|
+
if (fields.length > 0) {
|
|
222
|
+
requests.push(requestItem('Select fields', 'GET', basePath, {
|
|
223
|
+
[`fields[${slug}]`]: fields.slice(0, 5).join(','),
|
|
224
|
+
}, hdrs));
|
|
225
|
+
}
|
|
226
|
+
if ((reg.allowedSearch ?? []).length > 0) {
|
|
227
|
+
requests.push(requestItem('Search', 'GET', basePath, { search: 'example' }, hdrs));
|
|
228
|
+
}
|
|
229
|
+
if (reg.paginationEnabled !== false) {
|
|
230
|
+
requests.push(requestItem('Paginate', 'GET', basePath, { per_page: '25', page: '1' }, hdrs));
|
|
231
|
+
}
|
|
232
|
+
// Combined example
|
|
233
|
+
const combined = {};
|
|
234
|
+
if ((reg.allowedFilters ?? []).length > 0) {
|
|
235
|
+
const f = reg.allowedFilters[0];
|
|
236
|
+
combined[`filter[${f}]`] = exampleFilterValue(f);
|
|
237
|
+
}
|
|
238
|
+
if ((reg.allowedSorts ?? []).length > 0) {
|
|
239
|
+
combined['sort'] = `-${reg.defaultSort ?? reg.allowedSorts[0]}`;
|
|
240
|
+
}
|
|
241
|
+
if (includes.length > 0) {
|
|
242
|
+
combined['include'] = includes.slice(0, 2).join(',');
|
|
243
|
+
}
|
|
244
|
+
if (fields.length > 0) {
|
|
245
|
+
combined[`fields[${slug}]`] = fields.slice(0, 3).join(',');
|
|
246
|
+
}
|
|
247
|
+
combined['per_page'] = '10';
|
|
248
|
+
combined['page'] = '1';
|
|
249
|
+
requests.push(requestItem('Combined', 'GET', basePath, combined, hdrs));
|
|
250
|
+
return requests;
|
|
251
|
+
}
|
|
252
|
+
function buildShowRequests(basePath, slug, reg) {
|
|
253
|
+
const path = `${basePath}/{{modelId}}`;
|
|
254
|
+
const hdrs = defaultHeaders();
|
|
255
|
+
const requests = [
|
|
256
|
+
requestItem('Show by ID', 'GET', path, {}, hdrs),
|
|
257
|
+
];
|
|
258
|
+
const includes = reg.allowedIncludes ?? [];
|
|
259
|
+
if (includes.length > 0) {
|
|
260
|
+
requests.push(requestItem('Show with include', 'GET', path, { include: includes[0] }, hdrs));
|
|
261
|
+
}
|
|
262
|
+
const fields = reg.allowedFields ?? [];
|
|
263
|
+
if (fields.length > 0) {
|
|
264
|
+
requests.push(requestItem('Show with fields', 'GET', path, {
|
|
265
|
+
[`fields[${slug}]`]: fields.slice(0, 5).join(','),
|
|
266
|
+
}, hdrs));
|
|
267
|
+
}
|
|
268
|
+
return requests;
|
|
269
|
+
}
|
|
270
|
+
function buildStoreRequests(basePath, reg) {
|
|
271
|
+
const body = buildExampleBody(reg);
|
|
272
|
+
return [requestItem('Create', 'POST', basePath, {}, jsonHeaders(), body)];
|
|
273
|
+
}
|
|
274
|
+
function buildUpdateRequests(basePath, reg) {
|
|
275
|
+
const path = `${basePath}/{{modelId}}`;
|
|
276
|
+
const body = buildExampleBody(reg);
|
|
277
|
+
const requests = [
|
|
278
|
+
requestItem('Update', 'PUT', path, {}, jsonHeaders(), body),
|
|
279
|
+
];
|
|
280
|
+
if (Object.keys(body).length > 1) {
|
|
281
|
+
const [firstKey] = Object.keys(body);
|
|
282
|
+
requests.push(requestItem('Update partial', 'PUT', path, {}, jsonHeaders(), { [firstKey]: body[firstKey] }));
|
|
283
|
+
}
|
|
284
|
+
return requests;
|
|
285
|
+
}
|
|
286
|
+
function buildDestroyRequests(basePath) {
|
|
287
|
+
return [requestItem('Delete by ID', 'DELETE', `${basePath}/{{modelId}}`, {}, defaultHeaders())];
|
|
288
|
+
}
|
|
289
|
+
function buildTrashedRequests(basePath, reg) {
|
|
290
|
+
const path = `${basePath}/trashed`;
|
|
291
|
+
const hdrs = defaultHeaders();
|
|
292
|
+
const requests = [requestItem('List trashed', 'GET', path, {}, hdrs)];
|
|
293
|
+
if ((reg.allowedSorts ?? []).length > 0) {
|
|
294
|
+
requests.push(requestItem('List trashed sorted', 'GET', path, { sort: '-deletedAt' }, hdrs));
|
|
295
|
+
}
|
|
296
|
+
return requests;
|
|
297
|
+
}
|
|
298
|
+
function buildRestoreRequests(basePath) {
|
|
299
|
+
return [requestItem('Restore by ID', 'POST', `${basePath}/{{modelId}}/restore`, {}, defaultHeaders())];
|
|
300
|
+
}
|
|
301
|
+
function buildForceDeleteRequests(basePath) {
|
|
302
|
+
return [requestItem('Force delete by ID', 'DELETE', `${basePath}/{{modelId}}/force-delete`, {}, defaultHeaders())];
|
|
303
|
+
}
|
|
304
|
+
// ---------------------------------------------------------------------------
|
|
305
|
+
// Body / value helpers
|
|
306
|
+
// ---------------------------------------------------------------------------
|
|
307
|
+
function buildExampleBody(reg) {
|
|
308
|
+
const body = {};
|
|
309
|
+
const fields = reg.allowedFields ?? [];
|
|
310
|
+
const filters = reg.allowedFilters ?? [];
|
|
311
|
+
// Prefer allowedFields as the body skeleton; fall back to filters for hints
|
|
312
|
+
const candidates = fields.length > 0 ? fields : filters;
|
|
313
|
+
for (const field of candidates) {
|
|
314
|
+
body[field] = exampleValueForField(field);
|
|
315
|
+
}
|
|
316
|
+
return body;
|
|
317
|
+
}
|
|
318
|
+
function exampleFilterValue(filter) {
|
|
319
|
+
const lower = filter.toLowerCase();
|
|
320
|
+
if (['is_published', 'is_active', 'published', 'active'].includes(lower))
|
|
321
|
+
return '1';
|
|
322
|
+
return 'example';
|
|
323
|
+
}
|
|
324
|
+
function exampleValueForField(field) {
|
|
325
|
+
const lower = field.toLowerCase();
|
|
326
|
+
if (lower.endsWith('_id') || lower === 'id')
|
|
327
|
+
return 1;
|
|
328
|
+
if (['is_published', 'is_active', 'active', 'published', 'enabled'].includes(lower))
|
|
329
|
+
return true;
|
|
330
|
+
if (lower.endsWith('_at') || lower.includes('date'))
|
|
331
|
+
return '2024-01-01T00:00:00Z';
|
|
332
|
+
if (lower === 'email')
|
|
333
|
+
return 'user@example.com';
|
|
334
|
+
if (lower === 'name' || lower === 'title')
|
|
335
|
+
return `Example ${field}`;
|
|
336
|
+
return `example-${field}`;
|
|
337
|
+
}
|
|
338
|
+
// ---------------------------------------------------------------------------
|
|
339
|
+
// Core request item builder
|
|
340
|
+
// ---------------------------------------------------------------------------
|
|
341
|
+
function requestItem(name, method, path, queryParams, headers, body, testScript) {
|
|
342
|
+
const query = Object.entries(queryParams).map(([key, value]) => ({ key, value }));
|
|
343
|
+
const rawUrl = query.length > 0
|
|
344
|
+
? `${path}?${query.map(q => `${q.key}=${encodeURIComponent(q.value)}`).join('&')}`
|
|
345
|
+
: path;
|
|
346
|
+
// Split path into host + path parts for Postman URL structure
|
|
347
|
+
// The path looks like "{{baseUrl}}/segment/..."
|
|
348
|
+
const withoutProtocol = path.replace(/^https?:\/\//, '');
|
|
349
|
+
const parts = withoutProtocol.split('/').filter(Boolean);
|
|
350
|
+
const urlObj = {
|
|
351
|
+
raw: rawUrl,
|
|
352
|
+
host: [parts[0] ?? '{{baseUrl}}'],
|
|
353
|
+
path: parts.slice(1),
|
|
354
|
+
};
|
|
355
|
+
if (query.length > 0) {
|
|
356
|
+
urlObj['query'] = query;
|
|
357
|
+
}
|
|
358
|
+
const request = {
|
|
359
|
+
method,
|
|
360
|
+
header: headers,
|
|
361
|
+
url: urlObj,
|
|
362
|
+
};
|
|
363
|
+
if (body != null && ['POST', 'PUT', 'PATCH'].includes(method)) {
|
|
364
|
+
request['body'] = {
|
|
365
|
+
mode: 'raw',
|
|
366
|
+
raw: JSON.stringify(body, null, 2),
|
|
367
|
+
options: { raw: { language: 'json' } },
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
const item = { name, request };
|
|
371
|
+
if (testScript) {
|
|
372
|
+
item['event'] = [
|
|
373
|
+
{
|
|
374
|
+
listen: 'test',
|
|
375
|
+
script: {
|
|
376
|
+
exec: testScript.split('\n'),
|
|
377
|
+
type: 'text/javascript',
|
|
378
|
+
},
|
|
379
|
+
},
|
|
380
|
+
];
|
|
381
|
+
}
|
|
382
|
+
return item;
|
|
383
|
+
}
|
|
384
|
+
// ---------------------------------------------------------------------------
|
|
385
|
+
// CLI-compatible alias
|
|
386
|
+
// ---------------------------------------------------------------------------
|
|
387
|
+
/**
|
|
388
|
+
* Alias for `generatePostmanCollection` that serialises the result to a JSON
|
|
389
|
+
* string. Used by the CLI command which expects a string back.
|
|
390
|
+
*
|
|
391
|
+
* @internal Prefer `generatePostmanCollection` in library code.
|
|
392
|
+
*/
|
|
393
|
+
function generate(config, options) {
|
|
394
|
+
return JSON.stringify(generatePostmanCollection(config, options), null, 2);
|
|
395
|
+
}
|
|
396
|
+
//# sourceMappingURL=postman-exporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postman-exporter.js","sourceRoot":"","sources":["../../src/exporters/postman-exporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { RhinoConfig } from '../interfaces/rhino-config.interface';
|
|
2
|
+
export interface TypeScriptExporterOptions {
|
|
3
|
+
/** Optional header comment prepended to the output. */
|
|
4
|
+
header?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Generate a portable `.d.ts` string from an RhinoConfig.
|
|
8
|
+
*
|
|
9
|
+
* - One interface per registered model slug, using `allowedFields` for
|
|
10
|
+
* properties when available.
|
|
11
|
+
* - A `${PascalSlug}Query` interface when `allowedFilters`, `allowedSorts`
|
|
12
|
+
* or `allowedSearch` are set.
|
|
13
|
+
* - Generic helpers: `Paginated<T>`, `ApiResponse<T>`.
|
|
14
|
+
* - A top-level `RhinoModels` union of all registered slugs.
|
|
15
|
+
* - No Prisma-dependent imports.
|
|
16
|
+
*/
|
|
17
|
+
export declare function generateTypeScriptTypes(config: RhinoConfig, options?: TypeScriptExporterOptions): string;
|
|
18
|
+
/**
|
|
19
|
+
* Alias for `generateTypeScriptTypes` used by the CLI command.
|
|
20
|
+
*
|
|
21
|
+
* @internal Prefer `generateTypeScriptTypes` in library code.
|
|
22
|
+
*/
|
|
23
|
+
export declare function generate(config: RhinoConfig, options?: TypeScriptExporterOptions): string;
|