diff --git a/package-lock.json b/package-lock.json index 6619858..33e0f71 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "apollo-server-express": "^3.13.0", "graphql": "^15.3.0", + "reflect-metadata": "^0.1.13", "type-graphql": "^1.1.1" }, "devDependencies": { @@ -40,6 +41,7 @@ "ts-node": "^10.9.1", "tsc": "^2.0.4", "tsc-watch": "^6.0.4", + "tsconfig-paths": "^4.2.0", "typescript": "^5.3.2" } }, @@ -2961,6 +2963,18 @@ "node": ">=0.10.0" } }, + "node_modules/eslint-plugin-import/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, "node_modules/eslint-plugin-import/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -2976,6 +2990,18 @@ "semver": "bin/semver.js" } }, + "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, "node_modules/eslint-plugin-json": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-json/-/eslint-plugin-json-3.1.0.tgz", @@ -4473,15 +4499,15 @@ "dev": true }, "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, "bin": { "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" } }, "node_modules/jsonc-parser": { @@ -6950,6 +6976,11 @@ "node": ">=8.10.0" } }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, "node_modules/regexp-tree": { "version": "0.1.27", "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", @@ -12756,15 +12787,17 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", + "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, "node_modules/tslib": { @@ -13009,18 +13042,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/unified-args/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/unified-args/node_modules/strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", diff --git a/package.json b/package.json index 16d35c2..8d0fd8c 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "boilerplate-backend", "version": "1.0.0", "description": "The IT4C Boilerplate for backends", - "main": "build/index.ts", + "main": "build/index.js", "type": "module", "repository": { "type": "git", @@ -25,6 +25,7 @@ "dependencies": { "apollo-server-express": "^3.13.0", "graphql": "^15.3.0", + "reflect-metadata": "^0.1.13", "type-graphql": "^1.1.1" }, "devDependencies": { @@ -54,6 +55,7 @@ "ts-node": "^10.9.1", "tsc": "^2.0.4", "tsc-watch": "^6.0.4", + "tsconfig-paths": "^4.2.0", "typescript": "^5.3.2" }, "imports": { diff --git a/src/graphql/schema.ts b/src/graphql/schema.ts index 315a489..df2d0bb 100644 --- a/src/graphql/schema.ts +++ b/src/graphql/schema.ts @@ -1,11 +1,15 @@ import path from 'path' +import { fileURLToPath } from 'url' import { GraphQLSchema } from 'graphql' import { buildSchema } from 'type-graphql' +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) + export const schema = async (): Promise => { return buildSchema({ - resolvers: [path.join(__dirname, 'resolvers', `!(*.spec).{ts}`)], + resolvers: [path.join(__dirname, 'resolvers', `!(*.spec).{ts,js}`)], validate: { validationError: { target: false }, skipMissingProperties: true, diff --git a/src/index.ts b/src/index.ts index 7773cb7..0506e2d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,25 +1,17 @@ -import { ApolloServer, gql } from 'apollo-server-express' +// eslint-disable-next-line import/no-unassigned-import +import 'reflect-metadata' + +import { ApolloServer } from 'apollo-server-express' import express from 'express' -const typeDefs = gql` - type Query { - hello: String - } -` - -const resolvers = { - Query: { - hello: () => 'Hello world!', - }, -} +import { schema } from './graphql/schema' async function listen(port: number) { // eslint-disable-next-line @typescript-eslint/no-explicit-any const app: any = express() const server = new ApolloServer({ - typeDefs, - resolvers, + schema: await schema(), }) await server.start() diff --git a/tsconfig.json b/tsconfig.json index b43fd64..15546e1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,10 +1,12 @@ { "compilerOptions": { - "target": "es2021", + "target": "ESNext", "experimentalDecorators": true, "emitDecoratorMetadata": true, - "module": "ES2020", + "module": "ESNext", "moduleResolution": "node", + "baseUrl": ".", + "lib": ["ESNext"], "paths": { "#types/*": ["./src/graphql/types/*"] }, @@ -12,5 +14,8 @@ "esModuleInterop": true, "strict": true, "skipLibCheck": true + }, + "ts-node": { + "experimentalSpecifierResolution": "node" } }