@morphql/server 0.1.7 → 0.1.9

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.
@@ -9,6 +9,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.AppModule = void 0;
10
10
  const common_1 = require("@nestjs/common");
11
11
  const morph_controller_js_1 = require("./morph.controller.js");
12
+ const staged_queries_service_js_1 = require("./staged-queries.service.js");
13
+ const documentation_service_js_1 = require("./documentation.service.js");
12
14
  let AppModule = class AppModule {
13
15
  };
14
16
  exports.AppModule = AppModule;
@@ -16,7 +18,7 @@ exports.AppModule = AppModule = __decorate([
16
18
  (0, common_1.Module)({
17
19
  imports: [],
18
20
  controllers: [morph_controller_js_1.MorphController],
19
- providers: [],
21
+ providers: [staged_queries_service_js_1.StagedQueriesService, documentation_service_js_1.DocumentationService],
20
22
  })
21
23
  ], AppModule);
22
24
  //# sourceMappingURL=app.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"app.module.js","sourceRoot":"","sources":["../../src/app.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,+DAAwD;AAOjD,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IALrB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,CAAC,qCAAe,CAAC;QAC9B,SAAS,EAAE,EAAE;KACd,CAAC;GACW,SAAS,CAAG"}
1
+ {"version":3,"file":"app.module.js","sourceRoot":"","sources":["../../src/app.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,+DAAwD;AACxD,2EAAmE;AACnE,yEAAkE;AAO3D,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IALrB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,CAAC,qCAAe,CAAC;QAC9B,SAAS,EAAE,CAAC,gDAAoB,EAAE,+CAAoB,CAAC;KACxD,CAAC;GACW,SAAS,CAAG"}
@@ -0,0 +1,13 @@
1
+ import { OnModuleInit } from '@nestjs/common';
2
+ import { StagedQueriesService } from './staged-queries.service.js';
3
+ export declare class DocumentationService implements OnModuleInit {
4
+ private readonly stagedQueriesService;
5
+ private readonly logger;
6
+ private readonly docsDir;
7
+ constructor(stagedQueriesService: StagedQueriesService);
8
+ onModuleInit(): Promise<void>;
9
+ refresh(): Promise<void>;
10
+ private generateQuerySpec;
11
+ private getMimeType;
12
+ getDocFragments(): any[];
13
+ }
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ var DocumentationService_1;
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.DocumentationService = void 0;
47
+ const common_1 = require("@nestjs/common");
48
+ const staged_queries_service_js_1 = require("./staged-queries.service.js");
49
+ const swagger_helper_js_1 = require("./swagger.helper.js");
50
+ const fs = __importStar(require("fs"));
51
+ const path = __importStar(require("path"));
52
+ let DocumentationService = DocumentationService_1 = class DocumentationService {
53
+ stagedQueriesService;
54
+ logger = new common_1.Logger(DocumentationService_1.name);
55
+ docsDir = path.join(process.cwd(), 'staged-docs');
56
+ constructor(stagedQueriesService) {
57
+ this.stagedQueriesService = stagedQueriesService;
58
+ }
59
+ async onModuleInit() {
60
+ await this.refresh();
61
+ }
62
+ async refresh() {
63
+ await this.stagedQueriesService.waitReady();
64
+ if (!fs.existsSync(this.docsDir)) {
65
+ fs.mkdirSync(this.docsDir, { recursive: true });
66
+ }
67
+ const queries = this.stagedQueriesService.getQueries();
68
+ this.logger.log(`Refreshing documentation for ${queries.length} staged queries`);
69
+ for (const query of queries) {
70
+ const spec = await this.generateQuerySpec(query);
71
+ const filePath = path.join(this.docsDir, `${query.name}.json`);
72
+ fs.writeFileSync(filePath, JSON.stringify(spec, null, 2));
73
+ }
74
+ }
75
+ async generateQuerySpec(query) {
76
+ const requestSchema = swagger_helper_js_1.SwaggerHelper.schemaNodeToOpenAPI(query.analysis.source, query.meta);
77
+ const responseSchema = swagger_helper_js_1.SwaggerHelper.schemaNodeToOpenAPI(query.analysis.target, query.meta);
78
+ try {
79
+ const sampleInput = swagger_helper_js_1.SwaggerHelper.schemaToSample(requestSchema);
80
+ const responseExample = await query.engine(sampleInput);
81
+ responseSchema.example = responseExample;
82
+ }
83
+ catch (e) {
84
+ this.logger.warn(`Failed to generate automatic response example for ${query.name}: ${e instanceof Error ? e.message : String(e)}`);
85
+ }
86
+ const sourceMime = this.getMimeType(query.analysis.sourceFormat);
87
+ const targetMime = this.getMimeType(query.analysis.targetFormat);
88
+ if (sourceMime === 'application/xml') {
89
+ requestSchema.xml = { name: 'root' };
90
+ }
91
+ if (targetMime === 'application/xml') {
92
+ responseSchema.xml = { name: 'root' };
93
+ }
94
+ return {
95
+ paths: {
96
+ [`/v1/q/${query.name}`]: {
97
+ post: {
98
+ tags: ['Staged Queries'],
99
+ summary: `Execute staged query: ${query.name}`,
100
+ operationId: `execute_${query.name}`,
101
+ requestBody: {
102
+ required: true,
103
+ content: {
104
+ [sourceMime]: {
105
+ schema: requestSchema,
106
+ },
107
+ },
108
+ },
109
+ responses: {
110
+ '200': {
111
+ description: 'Successful transformation',
112
+ content: {
113
+ [targetMime]: {
114
+ schema: responseSchema,
115
+ },
116
+ },
117
+ },
118
+ },
119
+ },
120
+ },
121
+ },
122
+ };
123
+ }
124
+ getMimeType(format) {
125
+ switch (format?.toLowerCase()) {
126
+ case 'json':
127
+ return 'application/json';
128
+ case 'xml':
129
+ return 'application/xml';
130
+ default:
131
+ return 'text/plain';
132
+ }
133
+ }
134
+ getDocFragments() {
135
+ if (!fs.existsSync(this.docsDir))
136
+ return [];
137
+ const files = fs
138
+ .readdirSync(this.docsDir)
139
+ .filter((f) => f.endsWith('.json'));
140
+ return files.map((file) => {
141
+ const content = fs.readFileSync(path.join(this.docsDir, file), 'utf-8');
142
+ return JSON.parse(content);
143
+ });
144
+ }
145
+ };
146
+ exports.DocumentationService = DocumentationService;
147
+ exports.DocumentationService = DocumentationService = DocumentationService_1 = __decorate([
148
+ (0, common_1.Injectable)(),
149
+ __metadata("design:paramtypes", [staged_queries_service_js_1.StagedQueriesService])
150
+ ], DocumentationService);
151
+ //# sourceMappingURL=documentation.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documentation.service.js","sourceRoot":"","sources":["../../src/documentation.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@nestjs/core");
4
+ const app_module_js_1 = require("../src/app.module.js");
5
+ const documentation_service_js_1 = require("../src/documentation.service.js");
6
+ const staged_queries_service_js_1 = require("../src/staged-queries.service.js");
7
+ async function generate() {
8
+ console.log('Starting MorphQL Documentation Generation...');
9
+ const app = await core_1.NestFactory.createApplicationContext(app_module_js_1.AppModule, {
10
+ logger: ['error', 'warn'],
11
+ });
12
+ const stagedQueriesService = app.get(staged_queries_service_js_1.StagedQueriesService);
13
+ const docService = app.get(documentation_service_js_1.DocumentationService);
14
+ await stagedQueriesService.loadQueries();
15
+ await docService.refresh();
16
+ console.log('Documentation generated successfully in staged-docs/');
17
+ await app.close();
18
+ }
19
+ generate().catch((err) => {
20
+ console.error('Failed to generate documentation:', err);
21
+ process.exit(1);
22
+ });
23
+ //# sourceMappingURL=generate-docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-docs.js","sourceRoot":"","sources":["../../src/generate-docs.ts"],"names":[],"mappings":";;AAAA,uCAA2C;AAC3C,wDAAiD;AACjD,8EAAuE;AACvE,gFAAwE;AAExE,KAAK,UAAU,QAAQ;IACrB,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,wBAAwB,CAAC,yBAAS,EAAE;QAChE,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,CAAC,CAAC;IAEH,MAAM,oBAAoB,GAAG,GAAG,CAAC,GAAG,CAAC,gDAAoB,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,+CAAoB,CAAC,CAAC;IAEjD,MAAM,oBAAoB,CAAC,WAAW,EAAE,CAAC;IACzC,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;IAE3B,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IACpE,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;AACpB,CAAC;AAED,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACvB,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,GAAG,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
package/dist/src/main.js CHANGED
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const core_1 = require("@nestjs/core");
4
4
  const app_module_js_1 = require("./app.module.js");
5
5
  const swagger_1 = require("@nestjs/swagger");
6
+ const documentation_service_js_1 = require("./documentation.service.js");
6
7
  async function bootstrap() {
7
8
  const app = await core_1.NestFactory.create(app_module_js_1.AppModule);
8
9
  const config = new swagger_1.DocumentBuilder()
@@ -12,6 +13,18 @@ async function bootstrap() {
12
13
  .addApiKey({ type: 'apiKey', name: 'X-API-KEY', in: 'header' }, 'X-API-KEY')
13
14
  .build();
14
15
  const document = swagger_1.SwaggerModule.createDocument(app, config);
16
+ const docService = app.get(documentation_service_js_1.DocumentationService);
17
+ const fragments = docService.getDocFragments();
18
+ for (const fragment of fragments) {
19
+ if (fragment.paths) {
20
+ Object.assign(document.paths, fragment.paths);
21
+ }
22
+ if (fragment.components?.schemas) {
23
+ document.components = document.components || {};
24
+ document.components.schemas = document.components.schemas || {};
25
+ Object.assign(document.components.schemas, fragment.components.schemas);
26
+ }
27
+ }
15
28
  swagger_1.SwaggerModule.setup('api', app, document);
16
29
  await app.listen(process.env.PORT ?? 3000);
17
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":";;AAAA,uCAA2C;AAC3C,mDAA4C;AAC5C,6CAAiE;AAEjE,KAAK,UAAU,SAAS;IACtB,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,yBAAS,CAAC,CAAC;IAEhD,MAAM,MAAM,GAAG,IAAI,yBAAe,EAAE;SACjC,QAAQ,CAAC,aAAa,CAAC;SACvB,cAAc,CAAC,iCAAiC,CAAC;SACjD,UAAU,CAAC,KAAK,CAAC;SACjB,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,WAAW,CAAC;SAC3E,KAAK,EAAE,CAAC;IACX,MAAM,QAAQ,GAAG,uBAAa,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC3D,uBAAa,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IAE1C,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AAC7C,CAAC;AACD,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":";;AAAA,uCAA2C;AAC3C,mDAA4C;AAC5C,6CAAgF;AAChF,yEAAkE;AAElE,KAAK,UAAU,SAAS;IACtB,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,yBAAS,CAAC,CAAC;IAEhD,MAAM,MAAM,GAAG,IAAI,yBAAe,EAAE;SACjC,QAAQ,CAAC,aAAa,CAAC;SACvB,cAAc,CAAC,iCAAiC,CAAC;SACjD,UAAU,CAAC,KAAK,CAAC;SACjB,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,WAAW,CAAC;SAC3E,KAAK,EAAE,CAAC;IACX,MAAM,QAAQ,GAAG,uBAAa,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAG3D,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,+CAAoB,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,UAAU,CAAC,eAAe,EAAE,CAAC;IAC/C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;YACjC,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC;YAChD,QAAQ,CAAC,UAAU,CAAC,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE,CAAC;YAChE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,uBAAa,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IAE1C,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AAC7C,CAAC;AACD,SAAS,EAAE,CAAC"}
@@ -1,3 +1,5 @@
1
+ import { StagedQueriesService } from './staged-queries.service.js';
2
+ import { DocumentationService } from './documentation.service.js';
1
3
  export declare class ExecuteDto {
2
4
  query: string;
3
5
  data: Record<string, unknown>;
@@ -15,7 +17,16 @@ export declare class CompileResponseDto {
15
17
  code: string;
16
18
  }
17
19
  export declare class MorphController {
20
+ private readonly stagedQueriesService;
21
+ private readonly documentationService;
22
+ constructor(stagedQueriesService: StagedQueriesService, documentationService: DocumentationService);
18
23
  execute(body: ExecuteDto): Promise<ExecuteResponseDto>;
24
+ executeStaged(name: string, data: Record<string, unknown>, res: any): Promise<any>;
25
+ private detectMimeType;
26
+ refreshDocs(): Promise<{
27
+ success: boolean;
28
+ timestamp: string;
29
+ }>;
19
30
  compile(body: CompileDto): Promise<CompileResponseDto>;
20
31
  health(): {
21
32
  status: string;
@@ -16,6 +16,8 @@ exports.MorphController = exports.CompileResponseDto = exports.ExecuteResponseDt
16
16
  const common_1 = require("@nestjs/common");
17
17
  const auth_guard_js_1 = require("./auth.guard.js");
18
18
  const core_1 = require("@morphql/core");
19
+ const staged_queries_service_js_1 = require("./staged-queries.service.js");
20
+ const documentation_service_js_1 = require("./documentation.service.js");
19
21
  const cache_services_1 = require("@morphql/core/cache-services");
20
22
  const swagger_1 = require("@nestjs/swagger");
21
23
  const redisHost = process.env.REDIS_HOST;
@@ -88,6 +90,12 @@ __decorate([
88
90
  __metadata("design:type", String)
89
91
  ], CompileResponseDto.prototype, "code", void 0);
90
92
  let MorphController = class MorphController {
93
+ stagedQueriesService;
94
+ documentationService;
95
+ constructor(stagedQueriesService, documentationService) {
96
+ this.stagedQueriesService = stagedQueriesService;
97
+ this.documentationService = documentationService;
98
+ }
91
99
  async execute(body) {
92
100
  if (!body.query || !body.data) {
93
101
  throw new common_1.BadRequestException('Missing query or data');
@@ -109,6 +117,39 @@ let MorphController = class MorphController {
109
117
  throw new common_1.InternalServerErrorException(message);
110
118
  }
111
119
  }
120
+ async executeStaged(name, data, res) {
121
+ const staged = this.stagedQueriesService.getQuery(name);
122
+ if (!staged) {
123
+ throw new common_1.BadRequestException(`Staged query not found: ${name}`);
124
+ }
125
+ try {
126
+ const result = await staged.engine(data);
127
+ const mimeType = this.detectMimeType(result);
128
+ res.setHeader('Content-Type', mimeType);
129
+ return result;
130
+ }
131
+ catch (e) {
132
+ console.error('Staged Execute Error:', e);
133
+ const message = e instanceof Error ? e.message : 'Unknown execution error';
134
+ throw new common_1.InternalServerErrorException(message);
135
+ }
136
+ }
137
+ detectMimeType(result) {
138
+ if (typeof result === 'string') {
139
+ const trimmed = result.trim();
140
+ if (trimmed.startsWith('<?xml') ||
141
+ (trimmed.startsWith('<') && trimmed.endsWith('>'))) {
142
+ return 'application/xml';
143
+ }
144
+ return 'text/plain';
145
+ }
146
+ return 'application/json';
147
+ }
148
+ async refreshDocs() {
149
+ await this.stagedQueriesService.loadQueries();
150
+ await this.documentationService.refresh();
151
+ return { success: true, timestamp: new Date().toISOString() };
152
+ }
112
153
  async compile(body) {
113
154
  if (!body.query) {
114
155
  throw new common_1.BadRequestException('Missing query');
@@ -148,6 +189,27 @@ __decorate([
148
189
  __metadata("design:paramtypes", [ExecuteDto]),
149
190
  __metadata("design:returntype", Promise)
150
191
  ], MorphController.prototype, "execute", null);
192
+ __decorate([
193
+ (0, common_1.Post)('q/:name'),
194
+ (0, swagger_1.ApiOperation)({ summary: 'Execute a staged transformation' }),
195
+ (0, swagger_1.ApiResponse)({ status: 200 }),
196
+ __param(0, (0, common_1.Param)('name')),
197
+ __param(1, (0, common_1.Body)()),
198
+ __param(2, (0, common_1.Res)({ passthrough: true })),
199
+ __metadata("design:type", Function),
200
+ __metadata("design:paramtypes", [String, Object, Object]),
201
+ __metadata("design:returntype", Promise)
202
+ ], MorphController.prototype, "executeStaged", null);
203
+ __decorate([
204
+ (0, common_1.Post)('admin/refresh-docs'),
205
+ (0, swagger_1.ApiOperation)({
206
+ summary: 'Refresh OpenApi documentation from staged queries',
207
+ }),
208
+ (0, swagger_1.ApiResponse)({ status: 200, description: 'Documentation refreshed' }),
209
+ __metadata("design:type", Function),
210
+ __metadata("design:paramtypes", []),
211
+ __metadata("design:returntype", Promise)
212
+ ], MorphController.prototype, "refreshDocs", null);
151
213
  __decorate([
152
214
  (0, common_1.Post)('compile'),
153
215
  (0, swagger_1.ApiOperation)({ summary: 'Compile MorphQL to JavaScript' }),
@@ -182,6 +244,8 @@ exports.MorphController = MorphController = __decorate([
182
244
  required: false,
183
245
  }),
184
246
  (0, common_1.Controller)('v1'),
185
- (0, common_1.UseGuards)(auth_guard_js_1.ApiKeyGuard)
247
+ (0, common_1.UseGuards)(auth_guard_js_1.ApiKeyGuard),
248
+ __metadata("design:paramtypes", [staged_queries_service_js_1.StagedQueriesService,
249
+ documentation_service_js_1.DocumentationService])
186
250
  ], MorphController);
187
251
  //# sourceMappingURL=morph.controller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"morph.controller.js","sourceRoot":"","sources":["../../src/morph.controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"morph.controller.js","sourceRoot":"","sources":["../../src/morph.controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { OnModuleInit } from '@nestjs/common';
2
+ import { MorphEngine, AnalyzeResult } from '@morphql/core';
3
+ export interface StagedQuery {
4
+ name: string;
5
+ query: string;
6
+ engine: MorphEngine;
7
+ analysis: AnalyzeResult;
8
+ meta?: Record<string, any>;
9
+ }
10
+ export declare class StagedQueriesService implements OnModuleInit {
11
+ private readonly logger;
12
+ private readonly stagedQueries;
13
+ private readonly queriesDir;
14
+ private loadingPromise;
15
+ onModuleInit(): Promise<void>;
16
+ waitReady(): Promise<void>;
17
+ loadQueries(): Promise<void>;
18
+ private internalLoad;
19
+ getQueries(): StagedQuery[];
20
+ getQuery(name: string): StagedQuery | undefined;
21
+ }
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var StagedQueriesService_1;
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.StagedQueriesService = void 0;
44
+ const common_1 = require("@nestjs/common");
45
+ const core_1 = require("@morphql/core");
46
+ const fs = __importStar(require("fs"));
47
+ const path = __importStar(require("path"));
48
+ const yaml = __importStar(require("js-yaml"));
49
+ let StagedQueriesService = StagedQueriesService_1 = class StagedQueriesService {
50
+ logger = new common_1.Logger(StagedQueriesService_1.name);
51
+ stagedQueries = new Map();
52
+ queriesDir = process.env.MORPHQL_QUERIES_DIR || path.join(process.cwd(), 'queries');
53
+ loadingPromise = null;
54
+ async onModuleInit() {
55
+ await this.loadQueries();
56
+ }
57
+ async waitReady() {
58
+ if (this.loadingPromise) {
59
+ await this.loadingPromise;
60
+ }
61
+ }
62
+ async loadQueries() {
63
+ this.loadingPromise = this.internalLoad();
64
+ await this.loadingPromise;
65
+ }
66
+ async internalLoad() {
67
+ if (!fs.existsSync(this.queriesDir)) {
68
+ this.logger.warn(`Queries directory not found: ${this.queriesDir}`);
69
+ return;
70
+ }
71
+ const files = fs.readdirSync(this.queriesDir);
72
+ const morphFiles = files.filter((f) => f.endsWith('.morphql'));
73
+ this.logger.log(`Loading ${morphFiles.length} staged queries from ${this.queriesDir}`);
74
+ for (const file of morphFiles) {
75
+ const name = path.parse(file).name;
76
+ const filePath = path.join(this.queriesDir, file);
77
+ const content = fs.readFileSync(filePath, 'utf-8');
78
+ try {
79
+ const engine = await (0, core_1.compile)(content, { analyze: true });
80
+ if (!engine.analysis) {
81
+ this.logger.error(`Failed to analyze query: ${name}`);
82
+ continue;
83
+ }
84
+ let meta;
85
+ const yamlPath = path.join(this.queriesDir, `${name}.meta.yaml`);
86
+ const jsonPath = path.join(this.queriesDir, `${name}.meta.json`);
87
+ if (fs.existsSync(yamlPath)) {
88
+ meta = yaml.load(fs.readFileSync(yamlPath, 'utf-8'));
89
+ }
90
+ else if (fs.existsSync(jsonPath)) {
91
+ meta = JSON.parse(fs.readFileSync(jsonPath, 'utf-8'));
92
+ }
93
+ this.stagedQueries.set(name, {
94
+ name,
95
+ query: content,
96
+ engine,
97
+ analysis: engine.analysis,
98
+ meta,
99
+ });
100
+ this.logger.log(`Loaded staged query: ${name}${meta ? ' with metadata' : ''}`);
101
+ }
102
+ catch (e) {
103
+ this.logger.error(`Error compiling staged query ${name}: ${e instanceof Error ? e.message : String(e)}`);
104
+ }
105
+ }
106
+ }
107
+ getQueries() {
108
+ return Array.from(this.stagedQueries.values());
109
+ }
110
+ getQuery(name) {
111
+ return this.stagedQueries.get(name);
112
+ }
113
+ };
114
+ exports.StagedQueriesService = StagedQueriesService;
115
+ exports.StagedQueriesService = StagedQueriesService = StagedQueriesService_1 = __decorate([
116
+ (0, common_1.Injectable)()
117
+ ], StagedQueriesService);
118
+ //# sourceMappingURL=staged-queries.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staged-queries.service.js","sourceRoot":"","sources":["../../src/staged-queries.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { SchemaNode } from '@morphql/core';
2
+ export declare class SwaggerHelper {
3
+ static schemaNodeToOpenAPI(node: SchemaNode, meta?: Record<string, any>, path?: string): any;
4
+ static schemaToSample(schema: any): any;
5
+ private static applyMeta;
6
+ }
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SwaggerHelper = void 0;
4
+ class SwaggerHelper {
5
+ static schemaNodeToOpenAPI(node, meta, path = '') {
6
+ if (node.type === 'any') {
7
+ const schema = {};
8
+ this.applyMeta(schema, path, meta);
9
+ return schema;
10
+ }
11
+ const typeMap = {
12
+ string: 'string',
13
+ number: 'number',
14
+ boolean: 'boolean',
15
+ object: 'object',
16
+ array: 'array',
17
+ };
18
+ const schema = {};
19
+ if (node.type === 'null') {
20
+ schema.nullable = true;
21
+ }
22
+ else {
23
+ schema.type = typeMap[node.type] || 'object';
24
+ }
25
+ this.applyMeta(schema, path, meta);
26
+ if (node.type === 'object') {
27
+ if (node.properties && Object.keys(node.properties).length > 0) {
28
+ schema.properties = {};
29
+ for (const [key, childNode] of Object.entries(node.properties)) {
30
+ const childPath = path ? `${path}.${key}` : key;
31
+ schema.properties[key] = this.schemaNodeToOpenAPI(childNode, meta, childPath);
32
+ }
33
+ }
34
+ if (node.isOpen) {
35
+ schema.additionalProperties = true;
36
+ }
37
+ }
38
+ if (node.type === 'array' && node.items) {
39
+ schema.items = this.schemaNodeToOpenAPI(node.items, meta, path);
40
+ }
41
+ return schema;
42
+ }
43
+ static schemaToSample(schema) {
44
+ if (schema.example !== undefined)
45
+ return schema.example;
46
+ if (schema.type === 'object') {
47
+ const obj = {};
48
+ if (schema.properties) {
49
+ for (const [key, value] of Object.entries(schema.properties)) {
50
+ obj[key] = this.schemaToSample(value);
51
+ }
52
+ }
53
+ return obj;
54
+ }
55
+ if (schema.type === 'array') {
56
+ if (schema.items) {
57
+ return [this.schemaToSample(schema.items)];
58
+ }
59
+ return [];
60
+ }
61
+ const defaults = {
62
+ string: 'string',
63
+ number: 0,
64
+ boolean: true,
65
+ };
66
+ if (schema.type === undefined) {
67
+ return 'sample';
68
+ }
69
+ return defaults[schema.type] ?? null;
70
+ }
71
+ static applyMeta(schema, path, meta) {
72
+ if (!meta || !path)
73
+ return;
74
+ const entry = meta[path];
75
+ if (entry) {
76
+ if (entry.type)
77
+ schema.type = entry.type;
78
+ if (entry.description)
79
+ schema.description = entry.description;
80
+ if (entry.example !== undefined)
81
+ schema.example = entry.example;
82
+ }
83
+ }
84
+ }
85
+ exports.SwaggerHelper = SwaggerHelper;
86
+ //# sourceMappingURL=swagger.helper.js.map