@morphql/server 0.1.9 → 0.1.11
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/core/MorphServer.d.ts +46 -0
- package/dist/core/MorphServer.js +60 -0
- package/dist/core/MorphServer.js.map +1 -0
- package/dist/{src/swagger.helper.d.ts → core/OpenAPIGenerator.d.ts} +4 -1
- package/dist/{src/swagger.helper.js → core/OpenAPIGenerator.js} +54 -7
- package/dist/core/OpenAPIGenerator.js.map +1 -0
- package/dist/core/StagedQueryManager.d.ts +22 -0
- package/dist/core/StagedQueryManager.js +68 -0
- package/dist/core/StagedQueryManager.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.js +4 -0
- package/dist/core/index.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/package.json +19 -51
- package/Dockerfile +0 -63
- package/dist/src/app.module.d.ts +0 -2
- package/dist/src/app.module.js +0 -24
- package/dist/src/app.module.js.map +0 -1
- package/dist/src/auth.guard.d.ts +0 -7
- package/dist/src/auth.guard.js +0 -88
- package/dist/src/auth.guard.js.map +0 -1
- package/dist/src/documentation.service.d.ts +0 -13
- package/dist/src/documentation.service.js +0 -151
- package/dist/src/documentation.service.js.map +0 -1
- package/dist/src/generate-docs.d.ts +0 -1
- package/dist/src/generate-docs.js +0 -23
- package/dist/src/generate-docs.js.map +0 -1
- package/dist/src/main.d.ts +0 -1
- package/dist/src/main.js +0 -32
- package/dist/src/main.js.map +0 -1
- package/dist/src/morph.controller.d.ts +0 -39
- package/dist/src/morph.controller.js +0 -251
- package/dist/src/morph.controller.js.map +0 -1
- package/dist/src/staged-queries.service.d.ts +0 -21
- package/dist/src/staged-queries.service.js +0 -118
- package/dist/src/staged-queries.service.js.map +0 -1
- package/dist/src/swagger.helper.js.map +0 -1
- package/dist/tsconfig.build.tsbuildinfo +0 -1
- package/dist/vitest.config.d.ts +0 -2
- package/dist/vitest.config.js +0 -20
- package/dist/vitest.config.js.map +0 -1
- package/docker-compose.yml +0 -32
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { MorphEngine, MorphQLCache } from '@morphql/core';
|
|
2
|
+
import { StagedQueryManager } from './StagedQueryManager.js';
|
|
3
|
+
/**
|
|
4
|
+
* Options for initializing the MorphServer.
|
|
5
|
+
*/
|
|
6
|
+
export interface MorphServerOptions {
|
|
7
|
+
/** Directory where staged queries (.morphql) are located. */
|
|
8
|
+
queriesDir?: string;
|
|
9
|
+
/** Optional cache service for compiled queries. */
|
|
10
|
+
cache?: MorphQLCache;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* High-level facade for the MorphQL Server core.
|
|
14
|
+
* Provides easy access to query compilation, execution, and staged query management.
|
|
15
|
+
*/
|
|
16
|
+
export declare class MorphServer {
|
|
17
|
+
readonly queries: StagedQueryManager;
|
|
18
|
+
private cache?;
|
|
19
|
+
private queriesDir?;
|
|
20
|
+
constructor(options?: MorphServerOptions);
|
|
21
|
+
/**
|
|
22
|
+
* Initializes the server, loading staged queries if a directory was provided.
|
|
23
|
+
*/
|
|
24
|
+
initialize(): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Compiles a MorphQL query and returns an executable engine.
|
|
27
|
+
* @param query The MorphQL query string.
|
|
28
|
+
*/
|
|
29
|
+
compile(query: string): Promise<MorphEngine>;
|
|
30
|
+
/**
|
|
31
|
+
* Directly executes a MorphQL query against the provided data.
|
|
32
|
+
* @param query The MorphQL query string.
|
|
33
|
+
* @param data The input data for transformation.
|
|
34
|
+
*/
|
|
35
|
+
execute(query: string, data: unknown): Promise<unknown>;
|
|
36
|
+
/**
|
|
37
|
+
* Executes a pre-loaded staged query by name.
|
|
38
|
+
* @param name The name of the staged query.
|
|
39
|
+
* @param data The input data for transformation.
|
|
40
|
+
*/
|
|
41
|
+
executeStaged(name: string, data: unknown): Promise<unknown>;
|
|
42
|
+
/**
|
|
43
|
+
* Generates OpenAPI (Swagger) specification fragments for all loaded staged queries.
|
|
44
|
+
*/
|
|
45
|
+
getOpenAPIFragments(): Promise<any[]>;
|
|
46
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { compile } from '@morphql/core';
|
|
2
|
+
import { StagedQueryManager } from './StagedQueryManager.js';
|
|
3
|
+
import { OpenAPIGenerator } from './OpenAPIGenerator.js';
|
|
4
|
+
/**
|
|
5
|
+
* High-level facade for the MorphQL Server core.
|
|
6
|
+
* Provides easy access to query compilation, execution, and staged query management.
|
|
7
|
+
*/
|
|
8
|
+
export class MorphServer {
|
|
9
|
+
queries = new StagedQueryManager();
|
|
10
|
+
cache;
|
|
11
|
+
queriesDir;
|
|
12
|
+
constructor(options) {
|
|
13
|
+
this.queriesDir = options?.queriesDir;
|
|
14
|
+
this.cache = options?.cache;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Initializes the server, loading staged queries if a directory was provided.
|
|
18
|
+
*/
|
|
19
|
+
async initialize() {
|
|
20
|
+
if (this.queriesDir) {
|
|
21
|
+
await this.queries.loadFromDirectory(this.queriesDir);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Compiles a MorphQL query and returns an executable engine.
|
|
26
|
+
* @param query The MorphQL query string.
|
|
27
|
+
*/
|
|
28
|
+
async compile(query) {
|
|
29
|
+
return compile(query, { cache: this.cache });
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Directly executes a MorphQL query against the provided data.
|
|
33
|
+
* @param query The MorphQL query string.
|
|
34
|
+
* @param data The input data for transformation.
|
|
35
|
+
*/
|
|
36
|
+
async execute(query, data) {
|
|
37
|
+
const engine = await this.compile(query);
|
|
38
|
+
return engine(data);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Executes a pre-loaded staged query by name.
|
|
42
|
+
* @param name The name of the staged query.
|
|
43
|
+
* @param data The input data for transformation.
|
|
44
|
+
*/
|
|
45
|
+
async executeStaged(name, data) {
|
|
46
|
+
return this.queries.execute(name, data);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Generates OpenAPI (Swagger) specification fragments for all loaded staged queries.
|
|
50
|
+
*/
|
|
51
|
+
async getOpenAPIFragments() {
|
|
52
|
+
const fragments = [];
|
|
53
|
+
for (const query of this.queries.getAll()) {
|
|
54
|
+
const spec = await OpenAPIGenerator.generatePathSpec(query, '/v1/q');
|
|
55
|
+
fragments.push(spec);
|
|
56
|
+
}
|
|
57
|
+
return fragments;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=MorphServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MorphServer.js","sourceRoot":"","sources":["../../src/core/MorphServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA6B,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAYzD;;;GAGG;AACH,MAAM,OAAO,WAAW;IACb,OAAO,GAAG,IAAI,kBAAkB,EAAE,CAAC;IACpC,KAAK,CAAgB;IACrB,UAAU,CAAU;IAE5B,YAAY,OAA4B;QACtC,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,CAAC;QACtC,IAAI,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,KAAa;QACzB,OAAO,OAAO,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,KAAa,EAAE,IAAa;QACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,aAAa,CAAC,IAAY,EAAE,IAAa;QAC7C,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB;QACvB,MAAM,SAAS,GAAU,EAAE,CAAC;QAC5B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACrE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { SchemaNode } from '@morphql/core';
|
|
2
|
-
|
|
2
|
+
import { StagedQuery } from './StagedQueryManager.js';
|
|
3
|
+
export declare class OpenAPIGenerator {
|
|
3
4
|
static schemaNodeToOpenAPI(node: SchemaNode, meta?: Record<string, any>, path?: string): any;
|
|
4
5
|
static schemaToSample(schema: any): any;
|
|
5
6
|
private static applyMeta;
|
|
7
|
+
static generatePathSpec(query: StagedQuery, basePath: string): Promise<any>;
|
|
8
|
+
private static getMimeType;
|
|
6
9
|
}
|
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SwaggerHelper = void 0;
|
|
4
|
-
class SwaggerHelper {
|
|
1
|
+
export class OpenAPIGenerator {
|
|
5
2
|
static schemaNodeToOpenAPI(node, meta, path = '') {
|
|
6
3
|
if (node.type === 'any') {
|
|
7
4
|
const schema = {};
|
|
8
5
|
this.applyMeta(schema, path, meta);
|
|
9
|
-
return schema;
|
|
6
|
+
return schema; // Represents "any" in OpenAPI 3.0
|
|
10
7
|
}
|
|
11
8
|
const typeMap = {
|
|
12
9
|
string: 'string',
|
|
@@ -81,6 +78,56 @@ class SwaggerHelper {
|
|
|
81
78
|
schema.example = entry.example;
|
|
82
79
|
}
|
|
83
80
|
}
|
|
81
|
+
static async generatePathSpec(query, basePath) {
|
|
82
|
+
const requestSchema = this.schemaNodeToOpenAPI(query.analysis.source, query.meta);
|
|
83
|
+
const responseSchema = this.schemaNodeToOpenAPI(query.analysis.target, query.meta);
|
|
84
|
+
try {
|
|
85
|
+
const sampleInput = this.schemaToSample(requestSchema);
|
|
86
|
+
const responseExample = await query.engine(sampleInput);
|
|
87
|
+
responseSchema.example = responseExample;
|
|
88
|
+
}
|
|
89
|
+
catch (e) {
|
|
90
|
+
console.warn(`Failed to generate response example for ${query.name}`);
|
|
91
|
+
}
|
|
92
|
+
const sourceMime = this.getMimeType(query.analysis.sourceFormat);
|
|
93
|
+
const targetMime = this.getMimeType(query.analysis.targetFormat);
|
|
94
|
+
if (sourceMime === 'application/xml') {
|
|
95
|
+
requestSchema.xml = { name: 'root' };
|
|
96
|
+
}
|
|
97
|
+
if (targetMime === 'application/xml') {
|
|
98
|
+
responseSchema.xml = { name: 'root' };
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
paths: {
|
|
102
|
+
[`${basePath}/${query.name}`]: {
|
|
103
|
+
post: {
|
|
104
|
+
tags: ['Staged Queries'],
|
|
105
|
+
summary: `Execute staged query: ${query.name}`,
|
|
106
|
+
operationId: `execute_${query.name}`,
|
|
107
|
+
requestBody: {
|
|
108
|
+
required: true,
|
|
109
|
+
content: { [sourceMime]: { schema: requestSchema } },
|
|
110
|
+
},
|
|
111
|
+
responses: {
|
|
112
|
+
'200': {
|
|
113
|
+
description: 'Successful transformation',
|
|
114
|
+
content: { [targetMime]: { schema: responseSchema } },
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
static getMimeType(format) {
|
|
123
|
+
switch (format?.toLowerCase()) {
|
|
124
|
+
case 'json':
|
|
125
|
+
return 'application/json';
|
|
126
|
+
case 'xml':
|
|
127
|
+
return 'application/xml';
|
|
128
|
+
default:
|
|
129
|
+
return 'text/plain';
|
|
130
|
+
}
|
|
131
|
+
}
|
|
84
132
|
}
|
|
85
|
-
|
|
86
|
-
//# sourceMappingURL=swagger.helper.js.map
|
|
133
|
+
//# sourceMappingURL=OpenAPIGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OpenAPIGenerator.js","sourceRoot":"","sources":["../../src/core/OpenAPIGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { MorphEngine, AnalyzeResult } from '@morphql/core';
|
|
2
|
+
export interface StagedQuery {
|
|
3
|
+
name: string;
|
|
4
|
+
query: string;
|
|
5
|
+
engine: MorphEngine;
|
|
6
|
+
analysis: AnalyzeResult;
|
|
7
|
+
meta?: Record<string, any>;
|
|
8
|
+
}
|
|
9
|
+
export interface QueryDefinition {
|
|
10
|
+
name: string;
|
|
11
|
+
query: string;
|
|
12
|
+
meta?: Record<string, any>;
|
|
13
|
+
}
|
|
14
|
+
export declare class StagedQueryManager {
|
|
15
|
+
private readonly queries;
|
|
16
|
+
loadFromDirectory(dir: string): Promise<void>;
|
|
17
|
+
loadFromArray(definitions: QueryDefinition[]): Promise<void>;
|
|
18
|
+
private add;
|
|
19
|
+
get(name: string): StagedQuery | undefined;
|
|
20
|
+
getAll(): StagedQuery[];
|
|
21
|
+
execute(name: string, data: unknown): Promise<unknown>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { compile } from '@morphql/core';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import * as yaml from 'js-yaml';
|
|
5
|
+
export class StagedQueryManager {
|
|
6
|
+
queries = new Map();
|
|
7
|
+
async loadFromDirectory(dir) {
|
|
8
|
+
if (!fs.existsSync(dir)) {
|
|
9
|
+
console.warn(`Queries directory not found: ${dir}`);
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
const files = fs.readdirSync(dir);
|
|
13
|
+
const morphFiles = files.filter((f) => f.endsWith('.morphql'));
|
|
14
|
+
for (const file of morphFiles) {
|
|
15
|
+
const name = path.parse(file).name;
|
|
16
|
+
const filePath = path.join(dir, file);
|
|
17
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
18
|
+
let meta;
|
|
19
|
+
const yamlPath = path.join(dir, `${name}.meta.yaml`);
|
|
20
|
+
const jsonPath = path.join(dir, `${name}.meta.json`);
|
|
21
|
+
if (fs.existsSync(yamlPath)) {
|
|
22
|
+
meta = yaml.load(fs.readFileSync(yamlPath, 'utf-8'));
|
|
23
|
+
}
|
|
24
|
+
else if (fs.existsSync(jsonPath)) {
|
|
25
|
+
meta = JSON.parse(fs.readFileSync(jsonPath, 'utf-8'));
|
|
26
|
+
}
|
|
27
|
+
await this.add({ name, query: content, meta });
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async loadFromArray(definitions) {
|
|
31
|
+
for (const def of definitions) {
|
|
32
|
+
await this.add(def);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async add(def) {
|
|
36
|
+
try {
|
|
37
|
+
const engine = await compile(def.query, { analyze: true });
|
|
38
|
+
if (!engine.analysis) {
|
|
39
|
+
console.error(`Failed to analyze query: ${def.name}`);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
this.queries.set(def.name, {
|
|
43
|
+
name: def.name,
|
|
44
|
+
query: def.query,
|
|
45
|
+
engine,
|
|
46
|
+
analysis: engine.analysis,
|
|
47
|
+
meta: def.meta,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
console.error(`Error compiling query ${def.name}:`, e);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
get(name) {
|
|
55
|
+
return this.queries.get(name);
|
|
56
|
+
}
|
|
57
|
+
getAll() {
|
|
58
|
+
return Array.from(this.queries.values());
|
|
59
|
+
}
|
|
60
|
+
async execute(name, data) {
|
|
61
|
+
const query = this.get(name);
|
|
62
|
+
if (!query) {
|
|
63
|
+
throw new Error(`Query not found: ${name}`);
|
|
64
|
+
}
|
|
65
|
+
return query.engine(data);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=StagedQueryManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StagedQueryManager.js","sourceRoot":"","sources":["../../src/core/StagedQueryManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA8B,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAgBhC,MAAM,OAAO,kBAAkB;IACZ,OAAO,GAA6B,IAAI,GAAG,EAAE,CAAC;IAE/D,KAAK,CAAC,iBAAiB,CAAC,GAAW;QACjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,gCAAgC,GAAG,EAAE,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;QAE/D,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;YACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAEnD,IAAI,IAAqC,CAAC;YAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,YAAY,CAAC,CAAC;YACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,YAAY,CAAC,CAAC;YAErD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5B,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAQ,CAAC;YAC9D,CAAC;iBAAM,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;YACxD,CAAC;YAED,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,WAA8B;QAChD,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,GAAG,CAAC,GAAoB;QACpC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACrB,OAAO,CAAC,KAAK,CAAC,4BAA4B,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;gBACtD,OAAO;YACT,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;gBACzB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,MAAM;gBACN,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,IAAI,EAAE,GAAG,CAAC,IAAI;aACf,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,yBAAyB,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,MAAM;QACJ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,IAAa;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAsB,MAAM,kBAAkB,CAAC;AACnE,OAAO,EACL,kBAAkB,GAGnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './core/index.js';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@morphql/server",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.1.11",
|
|
4
|
+
"description": "MorphQL Server Core - Headless transformation engine",
|
|
5
5
|
"author": "Hyperwindmill",
|
|
6
6
|
"private": false,
|
|
7
7
|
"license": "MIT",
|
|
8
|
+
"type": "module",
|
|
8
9
|
"publishConfig": {
|
|
9
10
|
"access": "public"
|
|
10
11
|
},
|
|
12
|
+
"main": "dist/index.js",
|
|
13
|
+
"types": "dist/index.d.ts",
|
|
11
14
|
"files": [
|
|
12
15
|
"dist",
|
|
13
16
|
"README.md",
|
|
14
|
-
"LICENSE"
|
|
15
|
-
"docker-compose.yml",
|
|
16
|
-
"Dockerfile"
|
|
17
|
+
"LICENSE"
|
|
17
18
|
],
|
|
18
19
|
"repository": {
|
|
19
20
|
"type": "git",
|
|
@@ -24,55 +25,22 @@
|
|
|
24
25
|
"url": "https://github.com/Hyperwindmill/morphql/issues"
|
|
25
26
|
},
|
|
26
27
|
"homepage": "https://github.com/Hyperwindmill/morphql/tree/main/packages/server#readme",
|
|
27
|
-
"scripts": {
|
|
28
|
-
"build": "nest build",
|
|
29
|
-
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
|
30
|
-
"start": "nest start",
|
|
31
|
-
"start:dev": "nest start --watch",
|
|
32
|
-
"start:debug": "nest start --debug --watch",
|
|
33
|
-
"start:prod": "node dist/main.js",
|
|
34
|
-
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
|
|
35
|
-
"test": "vitest run",
|
|
36
|
-
"test:watch": "vitest",
|
|
37
|
-
"test:cov": "vitest run --coverage",
|
|
38
|
-
"test:e2e": "vitest run --config ./vitest.config.ts",
|
|
39
|
-
"docs:generate": "node dist/src/generate-docs.js"
|
|
40
|
-
},
|
|
41
28
|
"dependencies": {
|
|
42
|
-
"
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
"@
|
|
46
|
-
"@nestjs/swagger": "^11.2.5",
|
|
47
|
-
"ioredis": "^5.9.2",
|
|
48
|
-
"js-yaml": "^4.1.1",
|
|
49
|
-
"reflect-metadata": "^0.2.2",
|
|
50
|
-
"rxjs": "^7.8.1"
|
|
29
|
+
"js-yaml": "^4.1.1"
|
|
30
|
+
},
|
|
31
|
+
"peerDependencies": {
|
|
32
|
+
"@morphql/core": "^0.1.11"
|
|
51
33
|
},
|
|
52
34
|
"devDependencies": {
|
|
53
|
-
"@
|
|
54
|
-
"@eslint/js": "^9.18.0",
|
|
55
|
-
"@nestjs/cli": "^11.0.0",
|
|
56
|
-
"@nestjs/schematics": "^11.0.0",
|
|
57
|
-
"@nestjs/testing": "^11.0.1",
|
|
58
|
-
"@swc/core": "^1.10.9",
|
|
59
|
-
"@types/express": "^5.0.0",
|
|
35
|
+
"@morphql/core": "^0.1.11",
|
|
60
36
|
"@types/js-yaml": "^4.0.9",
|
|
61
|
-
"@types/node": "^
|
|
62
|
-
"
|
|
63
|
-
"
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
"
|
|
69
|
-
"supertest": "^7.0.0",
|
|
70
|
-
"ts-loader": "^9.5.2",
|
|
71
|
-
"ts-node": "^10.9.2",
|
|
72
|
-
"tsconfig-paths": "^4.2.0",
|
|
73
|
-
"typescript": "^5.7.3",
|
|
74
|
-
"typescript-eslint": "^8.20.0",
|
|
75
|
-
"unplugin-swc": "^1.5.1",
|
|
76
|
-
"vitest": "^3.0.3"
|
|
37
|
+
"@types/node": "^25.2.0",
|
|
38
|
+
"typescript": "^5.9.3",
|
|
39
|
+
"vitest": "^4.0.18"
|
|
40
|
+
},
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "tsc",
|
|
43
|
+
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
|
44
|
+
"lint": "eslint \"{src,test}/**/*.ts\" --fix"
|
|
77
45
|
}
|
|
78
46
|
}
|
package/Dockerfile
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
# Stage 1: Builder
|
|
2
|
-
FROM node:24-alpine AS builder
|
|
3
|
-
|
|
4
|
-
WORKDIR /app
|
|
5
|
-
|
|
6
|
-
# Copy root package files
|
|
7
|
-
COPY package*.json ./
|
|
8
|
-
|
|
9
|
-
# Copy workspace package files (maintaining structure)
|
|
10
|
-
COPY packages/core/package*.json ./packages/core/
|
|
11
|
-
COPY packages/server/package*.json ./packages/server/
|
|
12
|
-
|
|
13
|
-
# Install ALL dependencies (including devDeps for building)
|
|
14
|
-
RUN npm ci
|
|
15
|
-
|
|
16
|
-
# Copy TypeScript configs
|
|
17
|
-
COPY tsconfig*.json ./
|
|
18
|
-
COPY packages/core/tsconfig*.json ./packages/core/
|
|
19
|
-
COPY packages/server/tsconfig*.json ./packages/server/
|
|
20
|
-
COPY packages/server/nest-cli.json ./packages/server/
|
|
21
|
-
|
|
22
|
-
# Copy source code for both packages
|
|
23
|
-
COPY packages/core/src ./packages/core/src
|
|
24
|
-
COPY packages/server/src ./packages/server/src
|
|
25
|
-
COPY packages/server/test ./packages/server/test
|
|
26
|
-
|
|
27
|
-
# Build core first (server depends on it)
|
|
28
|
-
RUN npm run build --workspace=@morphql/core
|
|
29
|
-
|
|
30
|
-
# Build server
|
|
31
|
-
RUN npm run build --workspace=server
|
|
32
|
-
|
|
33
|
-
# Prune dev dependencies
|
|
34
|
-
RUN npm prune --omit=dev
|
|
35
|
-
|
|
36
|
-
# Stage 2: Production
|
|
37
|
-
FROM node:24-alpine AS production
|
|
38
|
-
|
|
39
|
-
WORKDIR /app
|
|
40
|
-
|
|
41
|
-
# Copy root metadata
|
|
42
|
-
COPY package*.json ./
|
|
43
|
-
|
|
44
|
-
# Copy the entire built workspace from builder
|
|
45
|
-
# This includes the pruned node_modules which already has the correct links structure
|
|
46
|
-
COPY --from=builder /app/node_modules ./node_modules
|
|
47
|
-
COPY --from=builder /app/packages ./packages
|
|
48
|
-
|
|
49
|
-
# Create non-root user
|
|
50
|
-
RUN addgroup -g 1001 -S nodejs && \
|
|
51
|
-
adduser -S nestjs -u 1001
|
|
52
|
-
|
|
53
|
-
USER nestjs
|
|
54
|
-
|
|
55
|
-
ENV NODE_ENV=production
|
|
56
|
-
EXPOSE 3000
|
|
57
|
-
|
|
58
|
-
# Set WORKDIR to server for correct execution context
|
|
59
|
-
WORKDIR /app/packages/server
|
|
60
|
-
|
|
61
|
-
# Execute using local package script
|
|
62
|
-
CMD ["npm", "run", "start:prod"]
|
|
63
|
-
#CMD ["tail", "-f", "/dev/null"]
|
package/dist/src/app.module.d.ts
DELETED
package/dist/src/app.module.js
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
-
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;
|
|
6
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
-
};
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.AppModule = void 0;
|
|
10
|
-
const common_1 = require("@nestjs/common");
|
|
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");
|
|
14
|
-
let AppModule = class AppModule {
|
|
15
|
-
};
|
|
16
|
-
exports.AppModule = AppModule;
|
|
17
|
-
exports.AppModule = AppModule = __decorate([
|
|
18
|
-
(0, common_1.Module)({
|
|
19
|
-
imports: [],
|
|
20
|
-
controllers: [morph_controller_js_1.MorphController],
|
|
21
|
-
providers: [staged_queries_service_js_1.StagedQueriesService, documentation_service_js_1.DocumentationService],
|
|
22
|
-
})
|
|
23
|
-
], AppModule);
|
|
24
|
-
//# sourceMappingURL=app.module.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/dist/src/auth.guard.d.ts
DELETED
package/dist/src/auth.guard.js
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
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
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
-
exports.ApiKeyGuard = void 0;
|
|
46
|
-
const common_1 = require("@nestjs/common");
|
|
47
|
-
const fs = __importStar(require("fs"));
|
|
48
|
-
let ApiKeyGuard = class ApiKeyGuard {
|
|
49
|
-
apiKey = null;
|
|
50
|
-
constructor() {
|
|
51
|
-
this.loadApiKey();
|
|
52
|
-
}
|
|
53
|
-
loadApiKey() {
|
|
54
|
-
if (process.env.API_KEY) {
|
|
55
|
-
this.apiKey = process.env.API_KEY;
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
if (process.env.API_KEY_FILE) {
|
|
59
|
-
try {
|
|
60
|
-
if (fs.existsSync(process.env.API_KEY_FILE)) {
|
|
61
|
-
this.apiKey = fs
|
|
62
|
-
.readFileSync(process.env.API_KEY_FILE, 'utf8')
|
|
63
|
-
.trim();
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
catch (e) {
|
|
67
|
-
console.error(`Failed to load API key from file ${process.env.API_KEY_FILE}`, e);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
canActivate(context) {
|
|
72
|
-
if (!this.apiKey) {
|
|
73
|
-
return true;
|
|
74
|
-
}
|
|
75
|
-
const request = context.switchToHttp().getRequest();
|
|
76
|
-
const requestKey = request.headers['x-api-key'];
|
|
77
|
-
if (requestKey === this.apiKey) {
|
|
78
|
-
return true;
|
|
79
|
-
}
|
|
80
|
-
throw new common_1.UnauthorizedException('Invalid or missing API Key');
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
exports.ApiKeyGuard = ApiKeyGuard;
|
|
84
|
-
exports.ApiKeyGuard = ApiKeyGuard = __decorate([
|
|
85
|
-
(0, common_1.Injectable)(),
|
|
86
|
-
__metadata("design:paramtypes", [])
|
|
87
|
-
], ApiKeyGuard);
|
|
88
|
-
//# sourceMappingURL=auth.guard.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth.guard.js","sourceRoot":"","sources":["../../src/auth.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAKwB;AAExB,uCAAyB;AAGlB,IAAM,WAAW,GAAjB,MAAM,WAAW;IACd,MAAM,GAAkB,IAAI,CAAC;IAErC;QACE,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEO,UAAU;QAEhB,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;YAClC,OAAO;QACT,CAAC;QAGD,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC5C,IAAI,CAAC,MAAM,GAAG,EAAE;yBACb,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC;yBAC9C,IAAI,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CACX,oCAAoC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,EAC9D,CAAC,CACF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,WAAW,CAAC,OAAyB;QACnC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAW,CAAC;QAC7D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAEhD,IAAI,UAAU,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,8BAAqB,CAAC,4BAA4B,CAAC,CAAC;IAChE,CAAC;CACF,CAAA;AA7CY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;;GACA,WAAW,CA6CvB"}
|
|
@@ -1,13 +0,0 @@
|
|
|
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
|
-
}
|