@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.
Files changed (44) hide show
  1. package/dist/core/MorphServer.d.ts +46 -0
  2. package/dist/core/MorphServer.js +60 -0
  3. package/dist/core/MorphServer.js.map +1 -0
  4. package/dist/{src/swagger.helper.d.ts → core/OpenAPIGenerator.d.ts} +4 -1
  5. package/dist/{src/swagger.helper.js → core/OpenAPIGenerator.js} +54 -7
  6. package/dist/core/OpenAPIGenerator.js.map +1 -0
  7. package/dist/core/StagedQueryManager.d.ts +22 -0
  8. package/dist/core/StagedQueryManager.js +68 -0
  9. package/dist/core/StagedQueryManager.js.map +1 -0
  10. package/dist/core/index.d.ts +3 -0
  11. package/dist/core/index.js +4 -0
  12. package/dist/core/index.js.map +1 -0
  13. package/dist/index.d.ts +1 -0
  14. package/dist/index.js +2 -0
  15. package/dist/index.js.map +1 -0
  16. package/package.json +19 -51
  17. package/Dockerfile +0 -63
  18. package/dist/src/app.module.d.ts +0 -2
  19. package/dist/src/app.module.js +0 -24
  20. package/dist/src/app.module.js.map +0 -1
  21. package/dist/src/auth.guard.d.ts +0 -7
  22. package/dist/src/auth.guard.js +0 -88
  23. package/dist/src/auth.guard.js.map +0 -1
  24. package/dist/src/documentation.service.d.ts +0 -13
  25. package/dist/src/documentation.service.js +0 -151
  26. package/dist/src/documentation.service.js.map +0 -1
  27. package/dist/src/generate-docs.d.ts +0 -1
  28. package/dist/src/generate-docs.js +0 -23
  29. package/dist/src/generate-docs.js.map +0 -1
  30. package/dist/src/main.d.ts +0 -1
  31. package/dist/src/main.js +0 -32
  32. package/dist/src/main.js.map +0 -1
  33. package/dist/src/morph.controller.d.ts +0 -39
  34. package/dist/src/morph.controller.js +0 -251
  35. package/dist/src/morph.controller.js.map +0 -1
  36. package/dist/src/staged-queries.service.d.ts +0 -21
  37. package/dist/src/staged-queries.service.js +0 -118
  38. package/dist/src/staged-queries.service.js.map +0 -1
  39. package/dist/src/swagger.helper.js.map +0 -1
  40. package/dist/tsconfig.build.tsbuildinfo +0 -1
  41. package/dist/vitest.config.d.ts +0 -2
  42. package/dist/vitest.config.js +0 -20
  43. package/dist/vitest.config.js.map +0 -1
  44. 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
- export declare class SwaggerHelper {
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
- "use strict";
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
- exports.SwaggerHelper = SwaggerHelper;
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":"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"}
@@ -0,0 +1,3 @@
1
+ export { MorphServer, MorphServerOptions } from './MorphServer.js';
2
+ export { StagedQueryManager, StagedQuery, QueryDefinition, } from './StagedQueryManager.js';
3
+ export { OpenAPIGenerator } from './OpenAPIGenerator.js';
@@ -0,0 +1,4 @@
1
+ export { MorphServer } from './MorphServer.js';
2
+ export { StagedQueryManager, } from './StagedQueryManager.js';
3
+ export { OpenAPIGenerator } from './OpenAPIGenerator.js';
4
+ //# sourceMappingURL=index.js.map
@@ -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"}
@@ -0,0 +1 @@
1
+ export * from './core/index.js';
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from './core/index.js';
2
+ //# sourceMappingURL=index.js.map
@@ -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.9",
4
- "description": "Stateless Transformation Engine API for MorphQL",
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
- "@morphql/core": "^0.1.9",
43
- "@nestjs/common": "^11.0.1",
44
- "@nestjs/core": "^11.0.1",
45
- "@nestjs/platform-express": "^11.0.1",
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
- "@eslint/eslintrc": "^3.2.0",
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": "^22.10.7",
62
- "@types/supertest": "^6.0.2",
63
- "eslint": "^9.18.0",
64
- "eslint-config-prettier": "^10.0.1",
65
- "eslint-plugin-prettier": "^5.2.2",
66
- "globals": "^16.0.0",
67
- "prettier": "^3.4.2",
68
- "source-map-support": "^0.5.21",
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"]
@@ -1,2 +0,0 @@
1
- export declare class AppModule {
2
- }
@@ -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"}
@@ -1,7 +0,0 @@
1
- import { CanActivate, ExecutionContext } from '@nestjs/common';
2
- export declare class ApiKeyGuard implements CanActivate {
3
- private apiKey;
4
- constructor();
5
- private loadApiKey;
6
- canActivate(context: ExecutionContext): boolean;
7
- }
@@ -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
- }