{"_id":"warthog","_rev":"225-100436023a6e06fd2ec0da8e833d94e2","name":"warthog","dist-tags":{"latest":"2.21.2","beta":"3.0.0-beta.27","alpha":"1.47.0-alpha.2"},"versions":{"1.0.0":{"name":"warthog","version":"1.0.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/types/index.d.ts","files":["dist"],"author":{"name":"Dan Caddigan"},"scripts":{"build":"yarn tsc","precommit":"lint-staged && npm test","preversion":"lint-staged && npm test","semantic-release":"semantic-release","test":"jest --verbose"},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","dependencies":{"@types/jest":"^23.3.0","jest":"^23.4.1","ts-jest":"^23.0.1"},"devDependencies":{"condition-circle":"^2.0.1","husky":"^0.14.3","lint-staged":"^7.2.0","prettier":"^1.6.1","semantic-release":"^15.8.1","typescript":"^2.9.2"},"lint-staged":{"*.{js,json}":["prettier --write","git add"]},"prettier":{"printWidth":100,"singleQuote":true},"release":{"verifyConditions":"condition-circle"},"jest":{"transform":{".ts":"<rootDir>/node_modules/ts-jest/preprocessor.js"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfigFile":"tsconfig.test.json"}}},"gitHead":"39da0788fdb40b10c88fd962d4f6895c2343b9a5","_id":"warthog@1.0.0","_npmVersion":"6.1.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-5d+kmacfCt6XTMLaDZNBAlutESWLVYD1IzJtdX1GlO8ZxzoFEzzntAlf2YwZU/1/PaexuMkZjM/MP7J45aGAXQ==","shasum":"3678946bfa04604b392d4f7acae270b70c3690ff","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.0.0.tgz","fileCount":9,"unpackedSize":4192,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbWVO6CRA9TVsSAnZWagAAg0cP+wd7JhP92Gd6ANHCNrFA\nGAVy5G2z8lMPLpVzxwOc/AVkpUX/wsx8yN6/vBBOTIQpG7vjTzMUhPiq5+XZ\nGlheehUqmn3tF0ba4uNbel25FPia1AsT4gdv1zex1iUdMNb9LGwCh3mIXVaB\n+BxVxnzzUImJAxApbKO9Z7FJ0aqtUh/vbDwTkliBLMCyqS/TSzXc+8S/H0mE\nYLk+Evg6HLpG/X77y4qKf73hu5pDQXiDaJ1/b4SZV5RkSMxNcBRSq9BYMDnD\nVS/w1OM9i3WI2huFMdCSDQPXmB5IGn4n1/Cuh3yDJXSidzC/5Txj8Uy/zWNn\no6RbgOw94gt7TursXoxq6kaYeoMlGaEERyRJRqbVDbtyDvdTICvJAZp0QI9l\nEApojfkOAZsH5D5Dm6PgEM1ke/RGqFFaY+i8GfC4+bdtOm5wKVlB2aYHkQQ1\ncepnVEKk3EdDKFear+np0klOJvnTPLBvN/6O/zEVGAHEw42WgJUUWOO6Zowf\nenZjXAudVd5SPVRSSZ2WXLHhPUhEcYTfwhGrUqgfxLSn5KJpUy0tIL5dGpsa\n386GA93yArISEahzQHetN7wRRJavowTZDYOPX6z+bmdsFhK5dTzMA9WlUWl6\nE3qyTY0q3CdV4tEhMw097Re0TOaDiRInr0CIaKHxzpP1+ihkJGoVN8cOALqo\nZNIx\r\n=9AY9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICD3I07t1lVff/Fj6ioI1RlZ3Uv2qBU1Rldj08pMHfFPAiBTA4AZT2deROIQz1H/vpzGbXI0JRZHLk7Ket8lu5+krg=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.0.0_1532580794626_0.8517335175995193"},"_hasShrinkwrap":false},"1.1.0":{"name":"warthog","version":"1.1.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan"},"scripts":{"build":"yarn tsc","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && yarn test","pre-version":"commitlint -E HUSKY_GIT_PARAMS"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","lodash":"^4.17.11","node-emoji":"^1.8.1","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.11","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0"},"lint-staged":{"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14","@indigo-ag/server/**/graphql":"^14","@indigo-ag/server/**/@types/graphql":"^14"},"prettier":{"printWidth":120,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"d5aff189818556516e43cddae73aed83ba966bde","_id":"warthog@1.1.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-3JycGSs3iXRxKk5ASHXINJ2wMgi7AgUrXyXVYrpaoOU476kybgQ6OVFHeIgBQjei62gW1M1xWSARVmniHqI7pQ==","shasum":"0fc125214fe4387aa24a7b3f65563d10066c1695","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.1.0.tgz","fileCount":108,"unpackedSize":108504,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcMaDsCRA9TVsSAnZWagAAdR0P/REVWJ5mnPfT0ZvmUEhR\n6Hf8jbbu3chVSomdUi0KMHT3HKIeN4UrnIw+p6N1iuYXU2SjYMqpgpGQhk4O\nng8U1MQvW/9CZUOUOD3tiw+tqUJjn1hi4bOcyUsi7zjNDsLpEZq527PYnFbS\n71ezVh9A3IzfhbVWmEFFSgdFEZOVrrpBoiwEihkuRR2uihA4Wmrhv+HTesR4\nZ5bHX2xXLmE4n+rrCngoDlEiN/MKG+v+kkThCQsHYez0kQQrCDuSCwbambmz\nxUa5Qb5ab/yUtUMOeRldbzg8B1fp68NKLxucrtfh7BvlmXrFtPWyRoZ0RhnH\n0izqpVdmDeq9B5vBIPTByzDH8Q6LrPtxEyS7ockVdillY7JtR27f7OkEYbGA\nKTj67VBJARkeaw0sW1+iWnC0FxInqGHd6hLqBIdKyo7aQlWPhGD9/q5VcTDd\nyi+zSo627+vIS8JHJ76PWbCHzcrBarz28r2gjhnr8yw24/ZDHI/a3Zkzd6Qt\neocnzVbXpP35eUeCwy3hV3vi1vyKl/cv3uv5TybOCNQVvY6f0vB/B4ME+Uny\nzZ+5gNawOZYeFaSDtOC6o4lGBibO91Sv/5LbLZ+jxU8Oejz1G58qABA4hwJb\nuxUYK27bKMS7NTN6IwsZS7ue3yh03NdSJlJMStJGLM1auy/wE5XckrHbusbJ\nRPbu\r\n=x5gb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFJnK8T1NlRNX/21bwvC0GQdq3ZCguw1XcQyWi0rk8y9AiBOEbRnT2q5qcQu9CKJrPEX50FCQOCROhMmGbu7wgbbLA=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.1.0_1546756331250_0.9739464707853105"},"_hasShrinkwrap":false},"0.0.0-development":{"name":"warthog","version":"0.0.0-development","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan"},"scripts":{"build":"yarn tsc","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && yarn test","pre-version":"commitlint -E HUSKY_GIT_PARAMS"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","lodash":"^4.17.11","node-emoji":"^1.8.1","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.11","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0"},"lint-staged":{"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":120,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"8cad6cfb7adfb0396a9537e3de28f33ce50f5e80","_id":"warthog@0.0.0-development","_npmVersion":"6.4.1","_nodeVersion":"10.14.2","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-s3+8dhICCMwdMC2TrsIysbBiE7mmGQ5bwG5SMhTWD3bnK9kVZXDhrlzUkHP6ZpDVChRrf7BzPG/p9+mnUoWQwA==","shasum":"3a950af3eb412a8fe824202d089248c05523a292","tarball":"https://registry.npmjs.org/warthog/-/warthog-0.0.0-development.tgz","fileCount":111,"unpackedSize":108061,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcNDdFCRA9TVsSAnZWagAAgGYP/1jhj2qGgRlZpxFSdbjb\nXMCEzhJfEFeTKxIpptYUBxhpLnKkhwO+IIaBq+g/+O1mJHx1KUj5GOHCLg5u\nD9zizO8o28p+nH5au3fLF9slnCRxLFbhriK2+PDpVC98k79ai+QiIHOyry8g\nF8zanGJ9n967KoBnDCISNguwJluA8OYxA7vN2ZnmYqsys5+ek07g97lc1fc2\nT8dAkeCd+hHJ00UAyTncHN6Zr2rhWFo75BSqP0nXYz4D7yMGPcSbpXsff/1l\n4st7pUD7VOqEM4Idz3Si+tjII+//FL/oIhH/w13bBmBl5Rc5IWO8VYaNFREL\nKhZnSLzCRUPw+Bx1Wi+56NhOLPy5lAsq7i7FL2dNbsTDtlGnXmmzXUjUm7Z1\nlQYIxK5vBAifQIri3oCrLEJRNy8+9/017CewSmprN8824BxGwMj3E7U05ej8\nw4l/DeMocZTsmSExGItfgcbYj+7vtNcE5q+0l+m18VOSYV3CfcP0oI2fRWRE\nl4XoIrk9B3TUQmGAqThhxDYLVPLJeRT956rKPFTg8ua/GvkfrPbcTWXaJrRS\nD+WiQQnJxm0Zz2xQdBBUog+l96/T10OpMV6jzwuKp4RQ+cANNc5FuHsLNq+p\nK65mioAX36BiHKz1y3nm/V9CHUbKA3NPZfqD9o/4Bg/K5EQZzkAUjvxDklO4\nJ+GE\r\n=0nTv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCs8lUphghHErDHgRLAClktO2gNEOIV25kKim3YWFfEkQIgTGOLHK/VaDG61y+XSQjFQ2zRD8U0o6H07cc7BkKZQ3U="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_0.0.0-development_1546925893044_0.5428109074446341"},"_hasShrinkwrap":false},"1.3.0":{"name":"warthog","version":"1.3.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan"},"scripts":{"build":"yarn tsc","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && yarn test","pre-version":"commitlint -E HUSKY_GIT_PARAMS"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","lodash":"^4.17.11","node-emoji":"^1.8.1","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.11","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0"},"lint-staged":{"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":120,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"4f89f64ac6016998d55eb26140fd6a71c7e2afa2","_id":"warthog@1.3.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-qIMSeeuMc0NbMKGDN2RPsymXKMGcR0N4vEePVRYExIpvrAPVqIxQPrqkmksgVwW8TFj2WHzbN8KkWJutkMAzmw==","shasum":"ce6bc7c83b7e1890998a838841119c3a72a5c03b","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.3.0.tgz","fileCount":108,"unpackedSize":108300,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcND1hCRA9TVsSAnZWagAAx4QP/33Th1yBUOkrt/20gS0h\n797iFelIkZaj8OVQ5/mdDkJT3TNxxKv3NXLJvxl4vT3ojBbjoCuMekmgqCCD\nv5EEuDPF1Nsbsa4yEnE4TIgEVR5RWJeOTA59TeKh466IEWvGhOGfoxDPLno3\nuKVsOz4AYh4IFIJdwCtLUt7BbPooX+gUxvkLwYVE73Fi0ccQM94ekxl+3MWt\ns4Npk2nZd3NZMpFwE/ADVqkn5z7QlogHUIubs/3bLdCQdQ9qPKiQAooR2Z5w\n/vKuKiMs7z3lJ8a330irvNzzyugVUUg+JIQiuu998oc2imFgrkTa/hGClMn6\nICrvs0X1Aw7sY/M0uLK9z9yQgNsv9Mi2JgmoyGjtWnll9Lgs8DQsQFS5l4M9\nyFHkRLXVb8VVy5zW9yQkZDVGPk9/q5iESJzPf7ZaFQqhBHwwKIZa6+NICvhX\npH1WKWSAY1C2DPNzDNPJn6fbo0JnF7F+X3XV/RgQT1SWd7me+g3gV6aF1MVt\noGxZrLXUSW6pPNq1DtCoyJKtvjWPXTdMRV87CZqanOEQGHZ60Ylo85x2kQJR\nDAObhtmt2d0wh7bSbtB1aVmfugw4+yQ/YwlhP60XO2WUNnnlTmRJt4JjckuT\n5eOATjTm1my+hIxig8wr7DxXEr4ZYsXLjlb0bFrRQR+jbFMCfVu1Qb9dXupR\nDBHf\r\n=Hc85\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHEtU08DcaA2QE8r0kRKj2zWmOtdpz10Ht4WQ5pSx+HbAiEA6sw159GlvjBqcveswPvqbZ9adfbDmiszMcHyGQNgfj8="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.3.0_1546927457174_0.692024920599714"},"_hasShrinkwrap":false},"1.3.1":{"name":"warthog","version":"1.3.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan"},"scripts":{"build":"yarn tsc","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && yarn test","pre-version":"commitlint -E HUSKY_GIT_PARAMS"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","lodash":"^4.17.11","node-emoji":"^1.8.1","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.11","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0"},"lint-staged":{"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":120,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"696bc9bce7ccc52d306446be043d3e21b2c8c3ca","_id":"warthog@1.3.1","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-FKPBgnl4BFD+JsZHz5sDEAFsF9U06xDlxvsZAVzyqHheUWpH3CD+45IrSJbmxbgCoc0gGJeZJrUX47QyoPCxDQ==","shasum":"a1f4c790fdd790529d151cfa23982de127e5ad8e","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.3.1.tgz","fileCount":108,"unpackedSize":109534,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcNENmCRA9TVsSAnZWagAAAuoP/22i8Kf5N48xVOA7Rheq\nkDtmeVoDEKpTrrmXpgarY43Q2Q7rGU3ncxSPH775WUSz9nXj6OnSJezOK17O\nDp+Uso8X+vxifwEQ6gouaXPhyd496MKsdrRJjDP3HRm+ZAkesCcyRDXEg/F+\nJWMN+Opwca5bE2DCgSmTiVtcis+M09b4xTf+guLZg43j1+MAXDRaYtItKsDb\nEe1NgrmuwOMxWhnbp42eGyOOcxLovTOL+rZuXaNkj1XaQ2ORFr7XDEdMhVtg\nUf7HrS4cQn9P1lID2Tj+DR0nfbuqglH1SY4D3mtvNRPmj5RBOJAeCYbWqHSJ\nOOg6A91phxg9n1Il9S9ys2ZwQ+56dzIEeqFz69UyGl/EekAcKIY++qzhZDzq\nVuPQkDhiD7Cc5wP6ln6kH/x41K4c+ZiEhwfMZK9bQtbSDOkLERxViqM31SX9\nqst2G14D/tZtsPhE80VzJzIhoUZ/WMozAjHmUaxvtk8E5r33NZQlCz3RZ8J9\nWIQ17Zc1bJL7j5k8AUCuO/Eo3BIQJiBtWCyvIX16/JeqLqOqwB5OIXdcoq3r\n80sGVbzbPPIwxS0co+WZ8vYBpdJn+5Fl/7J40BdNyWkRSJh7uew66FN6wwqG\njhzvx9+KjYEOhvZVdtcr0W29Cgw5D6rIQ7IwFt06hyM1/m+Y6gTvMhO4SnDb\nJuKN\r\n=jjcm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICaffmq/KmTUVMeEmH/lySsXIrAqxSiOrXubjDg5GQHGAiBdHWPIahCJH/YzWT7kx/8tuyHQYmuQh0iaeqRsLTaeiw=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.3.1_1546928997650_0.3277745482074679"},"_hasShrinkwrap":false},"1.4.0":{"name":"warthog","version":"1.4.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan"},"scripts":{"build":"yarn tsc","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && yarn test","pre-version":"commitlint -E HUSKY_GIT_PARAMS"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","lodash":"^4.17.11","node-emoji":"^1.8.1","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.11","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0"},"lint-staged":{"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":120,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"7ec77b7934eaaba66638c9f574dfe83df6aabe2b","_id":"warthog@1.4.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-ggmtPX+KIs0+7030N9eMhWdUm6F1ld8RSGnDkzCAsedh+Ubu+NuhdMOGvpQYp/bWBIss2BWanIr1uGCP7wYmnQ==","shasum":"791fc1aa33e9f79fa5aba4c67ee93d5dd13d631a","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.4.0.tgz","fileCount":123,"unpackedSize":126449,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcOZsUCRA9TVsSAnZWagAAFz8P/RVmzPWK7OQBHTl4A3/a\npWx0SCaMp8Cl4uL/1JimOqUOyIPaBeUdJ9JgTweF1u1f/TDl0L9e8Cwllyct\n9vFtd6UIYZgrsjfYOkaZXaHGDWIzK4cABW4e5eyaQP3seuPzzZFP6q73gc5V\n6F79r2MLfFTuraKYmGIX9JaVFCuUyEfsPAa3WKexiDIeU/WCoOSK4mKzcMGC\nb0Nl3/MRH1pIyhv92HegXeHxU+VVYPd9co//a80Bobhw9vrSYr5hJ+2fy9JI\nrbwogFTDMt7PyzRxkf60Te2P9vj3qnRJmFaV56uxbEBe+bft7ZI2/duSVANd\nlmlaiQGhjQxkLjNO7DvAP4W+rgj6RAZ4mumJxROB519FerjizMx9yvXlq8h+\nCxjJukg2Uer1g8kZ/XPTXyjxwwHZyRWZpl2TP0PuYdHOzB08f+CKtgIT0w46\nmh3C/h8egE6fFRPFc2mjg9VVweUqt5M6o4oTneHqATSYcu9A3oCt0SUnrFYY\nvWoZDMReg1yuBVj4E60O7nlV/0Cm85Mj3oYoXITNR7ll/3PnJOtsWPtAdZku\n6sgvK8r82PC2sZnnOPqYRGGIXYncKJOljVjxZj2FY4PHK6PR3lWjhSgQlR3R\nijgLHWr2Iu3TwShAulpILymfHzDv1ChKnUufnt0iXpr2Vw3B5Yx8JYSWVIO9\nemQD\r\n=yV9T\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBZeYesHj/P/d7sVePLQygImUt6ZXuor9NkjudG0Z2q6AiBpqQBkF1n4gGY/0ABL+le1B2izTAXY/8RqJLJ6my2+Uw=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.4.0_1547279122992_0.13123734522309616"},"_hasShrinkwrap":false},"1.4.1":{"name":"warthog","version":"1.4.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan"},"scripts":{"build":"yarn tsc","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && yarn test","pre-version":"commitlint -E HUSKY_GIT_PARAMS"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","lodash":"^4.17.11","node-emoji":"^1.8.1","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.11","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0"},"lint-staged":{"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":120,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"bf0917973cde8566cb469950561572facb9658ae","_id":"warthog@1.4.1","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-gGlxm3MqOG2un6z6Rxf/PqQevGugG+Eo1vFr55VgG/Pi5hZONCSCzVvT5BufE5Y/RYCcJY5AkTV6NhBf/NbZMQ==","shasum":"d7f70ae142337283ff53cc851052221a38ac85e1","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.4.1.tgz","fileCount":123,"unpackedSize":127128,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcOhoGCRA9TVsSAnZWagAAG4YQAJdJfP7YkADWV3kumuEx\nFYihTUuR6goopkvihbWuiewFikhF0UHXZDSyn6tZ4WXGED4/Wqf3zvD+/1tP\nXW9f7eAiFPxq8sZIZ83t/ibGWrxDL1xMeeKTL6s0ev9VaLotgjf67ngUWcZA\n/IdgflOdxIKp22MPnl/BkMpF0tRif8ep+qZi8AIG1d5RptesGfB5xEyF8Bk3\nYJSBvn3gQiYhtzvs0Mu/B0i5ADmrKuvSQySgtyAs6ram0cHqu9XC2A9Md61H\n1qDT5n0Z0vXJPqAYIobVWJHriRxB439VCfQLY7KN58r3haDdF0XzpYFboX81\nreXRy4Lm8cnpuOzbC0BD77UWI+OgoonQw/VhV3UzgnOfgYcfbf35i1boqXpi\nzy1JdXMe6LfVg1c3iU2s2V47g/BlgO5kLV/LeKMiXD9z8Y2kaumlxhxK57R1\nBrEXT7o5cmUnlwdYIPHQXZZgz4sZ34Wzuuh2l/qcEUOwB8w99aTZbxDHRCkf\nLzZwOKnn4OYft9DDkNXQNn8MPKFas0g1yNv0FfACFWLZ5kK4ZZFiTgPDrIcN\niT9NskNhXmTWoJ8lWA4xDJL9XZxHNjEbAIvLFHUc53nwuBHgZGT0HLxG13uI\nZbb4Lzuos9bVX5QUpOcN22PkCv8l39aT5se5ZQdZWMr3jenzgJw6LgPJFDMb\nxPmq\r\n=sJRR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIClVGQWh4h0O4vEDFsVzYKlpa0TuQZAYWWMPdHQeDB0cAiEAyWRGmJ3wJOzfdp08LsDEx0oSh3wi+AgSiTCFnqSdlRU="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.4.1_1547311621758_0.2919127685927494"},"_hasShrinkwrap":false},"1.5.0":{"name":"warthog","version":"1.5.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan"},"scripts":{"build":"yarn tsc","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test","pre-version":"commitlint -E HUSKY_GIT_PARAMS"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","lodash":"^4.17.11","node-emoji":"^1.8.1","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.11","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0"},"lint-staged":{"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":120,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"3fb97f13568aed737300e4020fae4843bbc5a46e","_id":"warthog@1.5.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-b/RiFGMFnzcXCUzXNoFlhlPhLETKs86BICrhc/2WdWiqziFo8Mt28rVE32FJp6G+S3qM2J7oPirJMszPXQZ0JQ==","shasum":"3cb2341650439ae1dbb1a02b26d5d6a6beebfa22","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.5.0.tgz","fileCount":129,"unpackedSize":133070,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcOnPaCRA9TVsSAnZWagAAOXQP/RtgPSTTfs9/+dE2Rouh\n7SCmiCv+BkZ/24mpDhI7vL/99Jyin+MhIervnypU/r6MzjSFoI9v2NVHMEc0\nU06sVMoDZNFFqgixuX+5SJPUnRXkd+3gXTIy2WYycGEYtV2JSu7t8LP4odmN\neZH+4c6dH5OwvWJnu1DT7+7WOMjUpcohaYfOU3Ccj83OY1vEn3WQQF1Bn06F\nXJRUGKCPha4aNIdCuAqmtYgYom93EtVls/yCFzRuqyoUe/uGecfmsmEGwicD\nhvnJQAihUTyRO8L49/3J/WhzJ1TkmLJMhPXgktQwetJYX+1YIbjdCzkfPsiD\nf2YJumL2gYv4Jc9pEbGpH6rP4GiDqE+lbUjCg2GcBc6GKMBPL0MHPvAshsli\n8tFFoH74ZqbxdZfP72tv5PMaB8e5L9P4oTvpliK3J+pnu3QhfPhnDolnT+S5\nQJ9Sx3HLO5ckOuKJumH8fBdyatR7B7GmQailRBNIs5Ktv3qTWdHuJP9UhFnL\nEiS5oU210EnpyK36W0zdULNOs/1LlqtHP6DRyph/4D9F0MLoDeVOYTrYhI8I\nWuG4ICF2rEteIj3oxDBzZHiRi2Qj1uSZqbCk4FIXdgYjMlkNuLb4jqhH/6oM\nyJM7jJIm7z6ZAcTrpEBLObfsvQJHRPH1+KcNyIl7TVJyntyzJ7H1dlEANtz3\nkYvS\r\n=o/QD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDUqiZKQd3v3TGb62Dg3Nzbss9z7uUikwqMOtIexE4qRAiAX9bTGLOQBGIepjWGVx0ri2xgqJ9UQZ3Z74O61vxBKyg=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.5.0_1547334617356_0.25564131666369394"},"_hasShrinkwrap":false},"1.5.1":{"name":"warthog","version":"1.5.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan"},"scripts":{"build":"yarn tsc","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test","pre-version":"commitlint -E HUSKY_GIT_PARAMS"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","lodash":"^4.17.11","node-emoji":"^1.8.1","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.11","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0"},"lint-staged":{"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":120,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"ad28c60667230c6ad0ad2871401b64f8877cdf6b","_id":"warthog@1.5.1","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-d55wBuw5w2ubf5H8FdgRG/Ewl6blnhFzYPrLiXSlxXDoJU+lhlRTJMc9CJP7nyFAlfOxO+lAovkOKUc+iSYMOg==","shasum":"bdc0e70865b23737c0ccf5ada015c5258638427e","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.5.1.tgz","fileCount":129,"unpackedSize":133347,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcOnwVCRA9TVsSAnZWagAAouUP/i7tGzdr1ZVs566Q10Vy\nJaJnYlBbZCGoS2yvzrOI/9LA1MtEDpMXK/h8YduTgUx17wTCXm2//F1LyEtf\nwKtPbEe3jM8etkyf7pXNdX0b6laWCosujfKj12uxU45OGyEoS/LGwqNrI9QH\nXVSQoVLzA77d73VGMYxLZ7Z5MLSo/+RxwOxX1zNGwZTLh8UXVGa2JFh0sYCA\nsfzmVZ2cvSrfxNh48v2eQtFx9rCM8Go5WUY2dkPHKLYz4gMfcyEyCeknLcBH\nTwrD3N7ZANgiE+z1Phup0WXzhWDrzskxbhmL7OVTv+H56BBNV97AgFsXMVi/\nP9eNgL+RzB9lhhqmTOEvSLY0W49kAq8dsmkG+nX2CwStBDKj7sLF7FGDnfmI\nKtleRnWOsiUH+yS6mrfDFNjnAFsOGDv+OFMsaRd7QiRpPxQUOv+yefLbj1iL\nYVrdvZz7ZhuxUP1x/JztFv78usNWIycYBWBhQSSlB2lw6cFmkekfrzg/io8g\n9Am6l1KfB4UW2gvlKGMzZHF3mtIyq4bsPGQdu1xDTHkha3wDePbvAx1v9nPf\ntnrhnfpmc1FhWjQEhN9r/Rdmr/DB8TWZBknzE3kUCfZSpq3A2d0sH+ByLkRP\nRomyxLss3t8jbEx909Cgo6RA2PFpTLmp7GAZYm3CbCq6T+I1miHDstKFbBbv\ndVt8\r\n=6RmC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC8YupuA+98sDzZ7zLaYoZeTqF7ot1stBqyw8PePTzg9AIgK+nRD6PAOf/D5lssUK5dcAOMV/HdPiVuJUcQ+5qlPwg="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.5.1_1547336724670_0.19699228795147117"},"_hasShrinkwrap":false},"1.5.2":{"name":"warthog","version":"1.5.2","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan"},"scripts":{"build":"yarn tsc","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test","pre-version":"commitlint -E HUSKY_GIT_PARAMS"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","lodash":"^4.17.11","node-emoji":"^1.8.1","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.11","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0"},"lint-staged":{"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":120,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"54424fba7a1989d4607353debf0282ef5d9712eb","_id":"warthog@1.5.2","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-hOL3Mysdjd1VR2RDnF7z4ioaLOtSX4+jGgpszdgSX/OM+dMJWh/u2GFoWSsZclnnEhe2rI+AJ08TbNFp6zZVXQ==","shasum":"51c358d7328e3bd07dcb1bf940007d1d6d420596","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.5.2.tgz","fileCount":129,"unpackedSize":133747,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcOuHsCRA9TVsSAnZWagAASBwP/RIp4uOp6QvSzSKVvmTA\nhEYjWReYEzXVVv+AsAMttiKyiQ34wBmCqRFKo4jyRIYqxXpq5wXI9haV+qc6\nCIsstd1FkN2ytL+4Cl/D27MQ30v4QwJmVcs/ru4644jTLKYqclT9kcYW9Ea1\nDy8NuiGYuFG4cIjnEKceQjjWIbHu5syKDuUQrNIVgxqHOGkq1tput9/YrQIB\nuYBDaXS1E6rnUugYN8FIlEh9OUYQAq3HQ8UtswXyof6bB57+n4TCpRQF17AF\nmyn1rouNwszumEuxFU1LV1tDmt50uHdoAETp2zWztVEGdJOtPgO3zfXXDand\nZWSB1hfWtg6QANVaKtOU5dUKj88rQiAacxOhIeCrcpwuAry8etPBWWqN28br\nZVxp+CqvKlBUb7l7RnZVTA0hw35jbo854FfCtT/ODc8fRXtFzjRFqnUSHqL5\nBwpVEsErrRQrXswjGioQT13g4bc9xKbRc3qFx112unEldxOJvQppdNedTdi4\n0a88pogk5HAa094SZ5lHqWhYALtEjbZg05RPwFvPhefSrC1bZ+3zXEdfOJAH\n+WxtYAOJLsuNu3gybVPlglUEXmO0cPX3q6ckbeFKfLf/kPKGBlss+N2MPKFm\nVwL2qn9DzZHrMtzsua21eVZxch3BT5tt6Abcyufg8lm95wdB1AUAkYITjS/q\nTMP5\r\n=m46S\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDo22+JgVekKFjPZEGkTNU8GqdyRm6CLKqepEd1G6QxIwIhAK+t7EIwiwxjwiNjQAnrMM4W1AMHif/VYz0+kRYia7nL"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.5.2_1547362795872_0.6378018358144444"},"_hasShrinkwrap":false},"1.6.0":{"name":"warthog","version":"1.6.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan"},"scripts":{"build":"yarn tsc","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test","pre-version":"commitlint -E HUSKY_GIT_PARAMS"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","lodash":"^4.17.11","node-emoji":"^1.8.1","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.11","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0"},"lint-staged":{"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":120,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"91f60d3b82ba152e8375ac5114e27d3958503e06","_id":"warthog@1.6.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-O8psET/n/a7Scy4H9kVuDYKaBrQtZ5KytgyUo8mjOouahE8e7pjx0MaMIxhg7jAIVOw4T7zX6cWegZCJVnglSA==","shasum":"8227b6922d4f66baec1472210ca9e3be94467065","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.6.0.tgz","fileCount":129,"unpackedSize":136337,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcPWo8CRA9TVsSAnZWagAACf0QAIzbG94bw9B4YkhQF9l7\nYivOwL0BdisbKvY1/6A/aaBcUX0uoBO/CWXrAA5vnGHxmmWYALCnwYuXj5Ty\nZwWr4ShupEsxMJd4xui18cJ9w/qtr/kt2CNzO8iwRb5M8sLTzlmmQEBxj2iX\nCQrdao3uu95CnPWIUfoLEUaX2uNajU+qutMyaYmveFnVEWk7qNGfgzzxddpt\nAdYbyGJIkgc/Tmmwoj4lsW2hbEIl2qi1L+KlW26Bl9Jr9jpCTa5uPX8pxq/r\n2e9u3Ja3AJ3kZWXQollPkECePAqiciQ+TSRo9fFtaailTFclp+lJ4c7pGsVg\nO3vARLkeZhrGtCFizPr9EwTKCj2Fo4+Zys+F6LO+k6vJKZ4wilk7F+ogHN9G\nq51AMM+sY+ElIjpBTL+MpvREn3cog9iFuL3EVfqhpSDGFxLQRqGeA8VE//Tq\nvZPrsQjXvckqwhkGeNrFMzgrULjBdXlwI4wqr1LRecF1z8dYdpQkWqiWecXL\nYNwD7oKG9IHTdvY2bLfrBJyF6zIitbHC8MdYhmSrXlNTTgomOkZBb96X3CFl\naByxnzMiLOMCpj6JWFuM3Jq8EXQX4AVKKd+Zhm8P0m9cLntC9YW+O71vi4lm\n8UcJnGL+pRNdnzzxQJYApRdh4jW6VYYiEiDLgvDzURgGDK8TeRP4fbU0FKk5\nD+kM\r\n=pA8f\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCSq9MIhG80D6JLVL/cvjy8O4wQfHh6Xtvhne2n8hUM+AIhAOwu7nCO5h8WY3OrJJQKmbKB+oa0Vb+shMFAs5J2NrOZ"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.6.0_1547528763610_0.06370045045876505"},"_hasShrinkwrap":false},"1.7.0":{"name":"warthog","version":"1.7.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan"},"scripts":{"build":"yarn tsc","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test","pre-version":"commitlint -E HUSKY_GIT_PARAMS"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","lodash":"^4.17.11","node-emoji":"^1.8.1","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.11","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0"},"lint-staged":{"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":120,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"51b76cc5840254653d8dafab2a345efa4dc81d2a","_id":"warthog@1.7.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-Gv0vB9OHS5mP18Dg1q68NUdUpivc+88WEhxDO6Njn7aOq8KweMIP7IPGooB43mCkLhbBZtogxoMXWR5Hj5iCkA==","shasum":"12fea81f8a530cb4812ea3d9c617f5ef0deedfb6","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.7.0.tgz","fileCount":135,"unpackedSize":139061,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcPWtWCRA9TVsSAnZWagAAD5UP/2OwHyBYsJgF1ND0v65s\nYeOdK2HxkJ60z1dcQ3ua4DMtdTPn1uo6xAPBvFhSPCliNRCXgptEMP4EytZA\nU7yoKBbrPV5RZbpUsP3it7uiBRxiXvHtloErmAXYGeoOGqEZQ5vWLAk0RJ7V\n0FYAiRZyIC6nFrRu0H/+iODoaygJuKWG1V7U8NkVpVTc7sR8z9vJxl+NrBoN\nu1LOtWhNUSgEHAvlPaZ+PsPWVb3BZjRc93CxbPH//OoMHyDZ72U+kuRMxyTR\nhUxrM8mxPRr5cUI2RW0cCVrpczaKjrgV22u/wAw0aV1Jmutkn7gvrY1+NLJn\nZ5A1yFgczsDlzyn/Rn9w6cKAB4qdDj3QO6n+9WFqXK86m+GRt/KKi+nkDzZ2\n3dpNNLNTOsfpWzTZLPYA6QzkDfNmYtMx/wbHAk/iJ2dtuxBT9iPMMyMn27vH\nVDxzEZbdvrg26XbwXgJX3IA8Z4gx5AYiTawEnxvxdIM8lMkGtbAfBLVBCi/f\n7Nm1mK3v7odN2oouZbJgpyJkUFFjnki8EiArYK1OCKiHrRBQv9CwSey3+m57\nQ4CV0FtjTTb3e6BeYYAiL5e0zvu4zjtIyWr92XMMZpeaLmDos7+Dz3JNctAa\nqv55YDm9itx0PZKxz7Kvj/z6UmeiVTjOhDaFqTx+qR1P6mWuubL/8OM5MWWu\nv/vj\r\n=TlnL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD6671+wlTHxsBgUHh3SkDRTQtOebZQdtDyqfFd5FhVkwIhAKjrUcQpvnUuVud7wLadBMYQvrvft7ckKKIQQGQIyFwg"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.7.0_1547529046042_0.7154196398180348"},"_hasShrinkwrap":false},"1.8.0":{"name":"warthog","version":"1.8.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test","pre-version":"commitlint -E HUSKY_GIT_PARAMS"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.11","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":120,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"ae0ae2f0a59b38fc2dc3bad6d03a423f02574ee8","_id":"warthog@1.8.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-xgp9r4049nqQ3QZxsqmMiqHHGMqaupilfuwJJgzBdimQ3ySqcvPLg6rF22ESE24zSKTCTFH/E1IId1nN76TaYQ==","shasum":"bc93277cca79d98c9e88c5501f73eb9d3409c4a4","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.8.0.tgz","fileCount":135,"unpackedSize":144288,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcRKUICRA9TVsSAnZWagAAmNUP/3CDv46MnunVwc4TaAQ3\nKziAa2KlasqE+SYDpYClIK4zbAKPv0QkWX9fAwR58IUPND+S2IkQqxgHI83b\n6z0Vfsst4Ok6TW6fP7K9OZhx34fG5lbUzO6G+PAlTdWASI612rCUdSlZeyjs\n4bW4/AbHSjxv7AOQovYBW5pyju6ZGgReO9Rzloqoa8Z3zyTCGOWsBby44TM8\na/DMhLOvweDvbPol/qrpPsjNJS/SubHukqD/XJi4KTTlwmW/xV+uJMwPKOyP\np527U9W4Qs41BBsFN153HmurJM5EtNlbnrOXU3+1MgL6ZJX7RonD/P+sYufR\nbSAxGf5ZHSBMrY6Aqz0T98RjB0M6KU0EnUvbVudntodBLu5RC5sLblB1PEL1\n9di58mXKNBcy6tbBz+PgYSP4PJGlTE7j49WKYzE8/RcHaiUE+J5+pSrh2jQ+\nMF3Qzjk1cA3r6lYNjLCVc+1zCAbkyPeZgN0b+ukM/+p4m+cojTxMRIMdGZv8\nISWuQ5chKJcwC4UhCIpO7ElNbi/rEsIJx7OD4sASiK9tnysVEQUAU1Q480lL\ne388wajjRFCd8LFFa31FuhfZ+4UDuHBzKDNk4NbM0Nf9fdU0ykLh2gMZWUNs\n6k+oN+cF4fBOCYCNsXYj8PRAce0OgE18ZkJWaZEVJeGIZIM+qlAPpNLIuJ2o\n8eb8\r\n=EASX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFm+TqMGN32jeIUckNa+zKOq550Ft0su4Y23s0vrbiUfAiBJ2PPNfD8Z++dRd7Rb0LS1Uc2MJf2lVkR9QC0PXgoLVw=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.8.0_1548002567647_0.06840006402167353"},"_hasShrinkwrap":false},"1.8.1":{"name":"warthog","version":"1.8.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.11","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":120,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"3afbc23b24b33de77f617428e86177a502c4ff63","_id":"warthog@1.8.1","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-wSpijIr8bxmEW/CZvb/01kR4nNrT6vQBomrWzG8LcIUazvzXzLRn8t0ZrNMGFIMAvTPT0H/RsqcHlxtE+zTacw==","shasum":"ed8706c33b39d09d731346528d42e9464bca75c5","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.8.1.tgz","fileCount":135,"unpackedSize":144234,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcRLKyCRA9TVsSAnZWagAAkqQP/iKnM2Fy3tXqjIYrSkfB\n5BywDZdjaWfS/KdHSwq2SCJkrAiNQDnWVFpUCaP3zeIVbO6Hly95aBEK13FB\ngvUsHGiLIsoJlt4AuDJ7pKxIk92qm8+/xD1ZTsPo081Txek90jpn+Of4QJaS\nXEsw2X1t5Ca/RhKWkC3dPSXEhb0vr6GzCTWlVAZ6gofmtvesTTwqgufHHjuw\nlgSZ8B2UKLZJHXncEwXf4KbJKBJ6lgUzZwk97SalR7MWUOzfr8k7B930lFl+\nrvD38AaNZdrDqTQQH5WVX1JjHEdzhLokUtigEWR4YJGPmy9hk9+heJ1HRPvx\nHEL4Kf8knqIhodR22MNqR+NkG7tDaA41TiXkVDeO0SO3l1xfaERcwNtPIlXx\nImfbru1Fc0ABieZWVaVY9Ftl6lswcb3ffVc7Z2+ujMtd2c2ZB/vOzgxvr9mr\nEP9nO2NiMTnHqLtmQ1eCgQIBS0vFSt+gmkNWeksCgGSQ6d6UovFXrZxW9pyz\n3N0slwcS2/rTOaTiFeR7GTx3XKDwf1ZFTiUj8Dp5cW+owz1o+fndb+DOZ7/E\nDAJoHXwXBxIRbNMH4DaX4QmheA8J6RjkXonKQ8Vxlbz0dG/DHy2xlYiJnlN9\n5dJhFF9DHSAzuF7J8vLPCTY5J1JtqVZx9bP0I59lUJ/ZGpnAFTMtaJ1uSjLs\n7x8t\r\n=rV3K\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCUCcK1scx3uD3T8hGR4XM5MX2WqFMYnKnnEXVmmE+AhQIhAL/9SeD19rGjvLKSodLPK4ktVZ6+bPWQtFEy3Y3qjQXt"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.8.1_1548006066118_0.3801845678558131"},"_hasShrinkwrap":false},"1.8.2":{"name":"warthog","version":"1.8.2","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.11","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":120,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"a74586cd7e2d1b4878512e6b7207939c422a56f7","_id":"warthog@1.8.2","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-FRqvORuMvC1UIy7Uk9yNTdAZB1JI3o9HuD4co+PE3IWga5e4uswIjiHJG6SB+sGfoopbeqJfg44nCocf5amfBg==","shasum":"1f3569e235adf037a83effa4141acf4d673ea001","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.8.2.tgz","fileCount":135,"unpackedSize":144828,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcRMChCRA9TVsSAnZWagAARswP/jm307xcr4mxLLjUA9PL\nrLZvJj33R3O0hjolFzYefQYgAyxgkD4/jzO0A4av1KHd3zQk9U+cExKOvpN+\n5Ta4Ckyjnt8GuEDa4Vy3nU8dXeOh+xGkAF4mOL86um1c/Z/zz6Br5ClvsFRv\nM+Ax4m8ywQvZllfd1bWjaaxEgoL+uvAZNnaN2bu11agIZ3GPO0+zmc9yvE2b\nH9slQfmcThhTpCV28K5m6JNkdyUzJcJ/xN8oSK/X4jdguPKSt6xrSz3yYEJK\njIE5XsOb91C9UPOBTZF/5AjuUOkorJoZ+8rCV3KPTZjdN+RqlcvhduI7GNFT\nVqsZfW6zzCOnhWUC60gASjaroQn6XYhmdKUpfnEndscrn3ScjJQrE6DCzZ7x\njggmujFBqM3n4zOmtEHfIADIrbbk6cJVJ3pNpyjuunkwoKbtCSiAJYdwiHB3\nWCp06Dby5NuqL1RONoQMWYFYw9RD3aCwA2nde4391je1Mte2sJMw/VXiRYJ/\nVFGv75GmeclBjSc7sfiRqjJ+QVnGVrmwVBJRYpK8VpapM+rBOsSnj2gV55zg\nmIMXuyypiIsF/V1XngGmblHMQGA9ShkmbHz/1J2ttgwFcuxWNyFqm1OtIlem\n265eBcKq+uv7ekrNLO7mtCYBSdagiD30bD85Hi+VAgSFChZhh6ZOazKa3pW7\n9lnc\r\n=5fk3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF+bDtdBVOJBmfNFMUOXqzEFkM5hdvCKXtUdHJLOzopZAiEAmCRVg41VnqXRP8wAuDHJFTLPDxbS1Jc+Ig/lHzmKocY="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.8.2_1548009632865_0.06439572218627876"},"_hasShrinkwrap":false},"1.9.0":{"name":"warthog","version":"1.9.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.11","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"c40787fed8537d40ada3f4c271d2a06db5ea8e12","_id":"warthog@1.9.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-pqQ0XLCyjuhgyE2jDmpmSWHegDL89InesCjvbiKByW1d88EVvNQw6ulHh1L3l3Po2dczF1SBCJx7lrIWcdxYZA==","shasum":"ee8befe5743fcba2de037938cfc03cc349e8b83e","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.9.0.tgz","fileCount":135,"unpackedSize":145628,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcRORICRA9TVsSAnZWagAAzs0P/1iDdtM8li6TlR9nrPxw\njnmYPp+JoD5AhJrt2z3i31+4uMp0O8DYELGEOdb6xgi0sq5JmuEKEFcbfzJn\nf4tnOPZ0rOJmgt6PVdvtCd4JWlL6S1wpVI+WvaF50KV/1zXWj0KMcFrGmim7\nFvt1LK36IqjXbGYzFVdJUkmeamn5jTaYKX+dJt9XO0fMwPaX1i4AbnRKRqu2\nCFqieRTvK/Agxv2xz+TMvh44Bdih/hwqz+liZpTy3fiMVGHco4V1KhT1s011\nSCuZwcY40YlkgxOg7tBS9QrTDoWySve3elrxNVaCUNqSy7NifX+Gkb5EaQsR\n0ZyDyMEXLCbQD0OZBqxhVTXlA3ILGojGXcVvKgT/Fg+JEE+UgDstUb2gU+4O\nbBOWc+7LnCIeYOpxWlzJsudPPR64zG74+ytEqd7zvG9EgoFmQioiaHMMV6mw\nG7WSp9qwmux38gxdJ80n/ZmWxodSHL3i7+qV6fPu3NHcTYLuImQxgNfobCoy\ndLbXzaL8ZJlNn2rntZi8EpPJb7r4lPFHTH8gd9E7658MY9lvX2p6K3Xvl2T5\nDLDdoWZW1pwr+CfKnxWROAv52OuzwMspL7dWMaBUTP+Kict+tKF0yrhNrH3C\nqVfG1e8VxKSxs5GsiyMeVVyvr1V4Kx4rZA+AEjaapfR7hZC/6wQnYZAnaq6P\nVse/\r\n=dQbu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC2nfZBnM7LP015XZluoHFHlLrbIfvTh9OM00alYuR27AIhAOUJazdtkDa/IukksO0qTUOmyvVdIiX3t38F42OX+MTI"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.9.0_1548018759610_0.22592747510682432"},"_hasShrinkwrap":false},"1.9.1":{"name":"warthog","version":"1.9.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.11","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"8684cf508d83ff24f9e752202ed2f64caf025697","_id":"warthog@1.9.1","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-B8VpcYcYOR98a4Qni0gkcbJ2jIV83zKpB+kCv60IPZ4oeAWeYim8A31RI+L+8j8Hbx0UMKZOqbOkrUE7MI6MYg==","shasum":"8558abc0c5c731520792f4352b526f4935340eb9","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.9.1.tgz","fileCount":135,"unpackedSize":146734,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcRUk8CRA9TVsSAnZWagAAHtEP/2IXk93Vz3T/sXdyjMdP\nWvLnMqD+NK96qUH1qzx1qgpUvanr0KCLJsck2Gxedc89BvsvHoijcBVWP1aN\n8NyEEVKMCAr5m9iLCLxcIkgveRf+94J8pkODIRXLElpWSo40oH40rQSiQEqj\nluWEcQcZcAWF2PN4OUeeaz7l3KANCCCFpnstVB82mZPydwRhoElzenF2ScPW\nVS75oX0FBaweaaA2d/Bkja6o76z5U7qz1MjZ5jTlMlOfpSPlznJn44CxRfee\naATuY4eJ4znA7SD6EzJTiU+q6qs/Ey8aD6FPyH6mYkhRHhU3NU8KxEspKA7d\nqipMQ58UcUfRwom4/VBTCNOD1lP7Wwp5bFf6oyHC98nXjU68owyKNyfHbMb/\ncaj/5QfOq5WEEpJMrYV1YmsnypM46KXvbrSgsWkMrBaOrUmi/luICoxWp9TC\nh136x6s0TM3NOxKEhBV+qbeRSosao3JTAbrFgo70REnErqwigW9muzwAaspc\nZxAypp5RuZyF4TVStvG3e9GZ1cQjU4Tm5J7y38wLLu3AH/YPGJT2VwZvQtgq\nmU88N0qqut3W+Af9gGHQhUyCpNf79bK8+UW3FpuThWZRlKQdJU3xamFJnO4Y\n3PTMyk9maU5LhuIa89Sh/XVeFpboHxHjk4R+CoecuMg/6qF8S64BQC16judU\nJqJX\r\n=FFg/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC1tV6WdZTpxxR8kTlRA4wnH7HBVRLYqoU0DFnPb0nTjwIgNaToYljgHNta3j4zxJeTM0YXuE5WHmGRoQbxbPcliRI="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.9.1_1548044603755_0.7001216764686515"},"_hasShrinkwrap":false},"1.9.2":{"name":"warthog","version":"1.9.2","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.11","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"871eda0c4d725ffa61063affce2067114a2cc638","_id":"warthog@1.9.2","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-RVcCUaYryJUksLpBaMWu7ZKdIOGvM9r+SmOXXGdQ+e7bgtabk+uATTPT+yBc7u51jHMZ6Kp4xTt2BhGT5U42VA==","shasum":"6556df84d7295ca6cd96385fc363b7a8900c3bd3","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.9.2.tgz","fileCount":135,"unpackedSize":147139,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcSOjECRA9TVsSAnZWagAARxwP/05Tn5qCoWqkZ8iuIu0W\njnq5Tx7d2GJNAjH7Ih9g8qcudSLVJ1vyrHzFOcMXCuvEbt1w6hGms41vENLf\nQCrC8f0jI8/RgBUQlhHmuVlFB/4e12CTrrW4jy84hb0b12qiry3/p5F+B2wn\nAxwhOByLaRFvy5T/yIQl8Q7MCAW3SA+gecyMbirNvqhVtIM4J98vEJ2UNmYy\ndR9+pXD/7ZL0WJrMFUSZAgy6Z0Pc5MxXm4CmGWiV7VNH2tnFqI4G9x8EnL65\nLf79PdYXBUWCPdyOdQBhLm+QI7jKi8FLLnX2ZZ720K58md5YTdya50vt4IKz\nLfaTEXEL6bZVrOdLCW69nGdpalhYVjXBB0q0P0fBMxKRSw44DkzsSf9TaIR5\ntGZ8rpWQwCt/6O+YBxwU6j7HXTHDyaq4UILdOO17xHCw/suJA20rjfxnDpHG\noNkB09GTKV4X+dHyiSAZxMt9d4c3yE54sgOxf54oA5sKTV9wqstfnHb7Mm6F\nub8pwLz1OAfeC5bTq0iSC29hO5WZWuWBn7faMtqAusDJpakpkboWl6mx2iYD\nzBMU+Xc0iJM3ls75vItpgH7laVkhsUQjx0p+40vgoa2iDEz5LKvhA6ozN5rD\nbgun6Q95gE+lm3RdYnBD2+c0mlio8rsTNUpIVhOCc8mq1nnKCP+DNVZmL7Zj\nw2TH\r\n=Xy1u\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEXkwIipICxHuMB8nMV8vOOkrnxqBZm4GNtw1YFj7jn5AiBrW8rhY4UFE1GozH++EZ7vAdijmpLe2BoedgOLWYO1JQ=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.9.2_1548282051628_0.22133806703287462"},"_hasShrinkwrap":false},"1.9.3":{"name":"warthog","version":"1.9.3","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.11","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"684057ed18f28370187b925aa819938973194cbc","_id":"warthog@1.9.3","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-HlCFiteKC+R5zk+1l0pa4z3U6F8l6IE4gE3RwqWyEYcaJSCkNBnqmoq0CZWRptc09oKF4JsLF+rt8mb4lkxYqA==","shasum":"8479eeb97594636cd3025fde61b65dbd6dfa853f","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.9.3.tgz","fileCount":135,"unpackedSize":148624,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcS+jDCRA9TVsSAnZWagAAW8YP/i7nX5t85EabadOhXmpU\nxUd68Bght3JUMqDz1vxcoXVNxg5ImzMDAMgJeaJCsoK7GPZsJyEzeXFfOw78\nKYiHy1Hw1GWiNoPEUQEU+wC9Hj23SIy/fuLD1qQq1swbRYV79lkWfMonL4YN\nbrgHi1oyr1OjNhzUueX0y9cYza+039qlf9XOfiPbX6Zsy+HXbeanLuvHbf8B\nD4z/ZF4enH+6AWHgn4tU9KKdayhjhElHpt8lND1tfE+k6swqbHV4jvgx44tw\nRYzz5GKhrm0XIbnZ+gxmfqvNnWRCmrlWSJPgNGjFu6HJBbDR1guuV1raS1g+\nTU63tV+hM7SGhZH9ZtfKyH7Vnp5ya1xYFUmZrQKdOibHqLSDBV2CaiTP7qJ6\nAGomiiYemSWvUHMpJUDVUrPPzYaL/kyXZjSkiuE66HxnXdUqHrn2lT3+nHVQ\ntbhTj1NRzXOQugj/pSwVudMBsWI3mZJCQnURMLqVTkSdqnCgv9tuqId6c3Yr\np8qIqwsQMY4gEPzUHlPMg0L5yKpCNKnKvLqLlNBTQCT3EiNAqxJcPPKB4Nfo\nW29WFELFGHH0AF0lqUX34OZ3cxL1DWGmHTfHA9qx2X/s7WGCSIkVB03F76CH\n3MWagYWnc4Kg1ZVcQfHKPTU6NPzfR9svb7wnne1kEeGq+2/BKgbNLk4x2E31\nsXEi\r\n=bKAw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE/VltXn+n3AhT454kfJWO5QeflQI28gw3abuf2L0a29AiAZMZiryjVqIf0CzPMsU7HwI1X9Pgssp00vgZmk4WRKSA=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.9.3_1548478659233_0.37044637102511846"},"_hasShrinkwrap":false},"1.9.4":{"name":"warthog","version":"1.9.4","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.11","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"533d8383422fee5805009e51b25a8a8b50ed6ee8","_id":"warthog@1.9.4","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-KrZD3moH/dzQEliC3wm8XU3GHvTnHwn5OWpU8UR/4JbVH1yi0jBFwldv668TCVzrrVSklTlg0GQg1wIzRY7kig==","shasum":"f4ecc16340b254c9bdf0ba9dc58392d869af910a","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.9.4.tgz","fileCount":138,"unpackedSize":154134,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcS/c2CRA9TVsSAnZWagAApQIP/i6O2nALj8XvgDr0GUJb\nDxrgT5yo40jlOAewT8qwNclilUFe5A1nnW2nse5SgXNWf5vdbIQNbx2hXEtW\nkxJrD5ACDa85xG/VWZa7tYQvR5xlZVa6Ceq/3guXvV4q68OlR+49WE36rgEv\nid6aVH6JMdzyu4952AJke8vkExwp7tMAzSsdWN56WAGEB5pu8ZovV9laQDmX\n1X8uS2BhUGCNz0qMA9+A3skzdIpDAt2H9fgnrx5nDHui7xCsL7vicKDURom/\nSEm94TzzI0VuuXOyIEp5w8sf/LQ4xVDHMBYIPS3raV6AXfZcJ0CN4ZEo4DcQ\nEqiYHJZKCOspIwh8CBOZRW48oBJk7l0FtmR2vLURlcOmpgvluJXgDB1gyVw5\nqfEUqCrtwk0l+0ZgTcTBVSjzopWH9uSyhqGscU762AMXyTWiYryDgsHkE7SA\nHVxbDTM/WUznqAPk+CXaWrgUwVFetK/R7w6+aaXdtZpRbEcDWvhLmXi+RzJt\nRx8B80KAtGr2DMlTYMkhgnf2sKc5iz9gTKsPAP8nRmRMQQdELIej2ggqg/Nf\nhZKSlh3nOR7qbwAeGR8fWPiHufV1qTT+SU7Tf9YrOONfoBPGk6djJsK8KRt7\nwVuVmH8Fpjv4lNH3k24Q3lANBn9y+m6hDCP0sgwZdRZXf5xf+fmi++IoUaMg\nFpU1\r\n=AT+6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDbU9G7CBjyOnC6n4RdcuW5XawRy1ORYlbPZCKMnCovbQIhAPDnhMWJC7SXbAv0msr6o5YqJ5OVKmUIQ5i8TuVwz7fJ"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.9.4_1548482357356_0.06792264960609162"},"_hasShrinkwrap":false},"1.10.0":{"name":"warthog","version":"1.10.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.11","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"aa279f45130ca9f643b6726f8ee109817d8b0830","_id":"warthog@1.10.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-r7/CBZGGdzVBAFh1L55/KkE7g/2J+6mtQ5kpwv2oJmwkoV67QsaJX2ZysrFE0Dn9XHujSxhy38WXp6PwbY4LNA==","shasum":"31e5d2ce11529c2160b6d61f778af5826074eec7","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.10.0.tgz","fileCount":138,"unpackedSize":154336,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcTAUuCRA9TVsSAnZWagAA1F8P/jN8r4wXpH1ex6qi++As\numkQoYBgchOCa6JqwjaSQtQEnFTwgC683Gcyski0C2BqykQ0rEM8jJCbOHCr\nb+u55CKPjv/l9MNSLqpPqVQXpk51mxbioAidNDEK1htnxDGQAbdtekAePPMi\n0uYHpEOLlvyPyr/SINlOwiGo3b9BbrGXRzdoWzcAIXUlUrmwadqASnSpnJfg\nC1I2elLCcUK0eFNtakvDPLPLzQRyiaSu20FdSZEYVaGyk4ajWZYyCyvdYlKC\nJEUr6sozDjJw876g29UbLv7rEgLPnyOFvxya613Ml1qY2A/fPdOni67oD4Sh\nlgiSwPv2PjnbY2gyXWXQH28HzmDR8XhJZ5ciKzTMVVrm19T3y26kzLdJLupO\nR63F2O10zRKC8n4F7vMldUbhwVIwWKB6mHe84mGLfbx84hjU4j+OlHi4Cqdo\nfL5uj+6PqwhzH0gdN+WnfqLScgaGXJ3EhfdCtJJ7QidsKwWZ8NdhTkrS3N3u\nPEIgfVuMFewkTY9iH87EQ6ur7J6bMjnif9KOMfP0kMyQQWNyrt6HQ0SbN7tY\nxX/zi0ANsyC8y8ksOKYO33ODVQB9425q9xKiTqgJV0nBqqPXSA4W7l2pzElS\na4TkZ+JxKv87tXh4lfGoh429tL4aTsWihA0swv74PSFylOEH+0NnTuL1n0sk\n48OS\r\n=SQo6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGchWtvQjlXP9aw869gCOXdTVYzpaURsSHS9HtWgRS/YAiEAln5EMQjJGp8vqQ5Vnnie72W8Jk5nIVKaQ0BOpy/fYmM="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.10.0_1548485934232_0.00012056705431495729"},"_hasShrinkwrap":false},"1.10.1":{"name":"warthog","version":"1.10.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.11","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"7c4eb905d57ecd0e81ff63895f74e3ecaf377627","_id":"warthog@1.10.1","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-rBFv5Gdf57b/LhjD+4qDlFWt0Au50tILoyEPNHM/ptZPSKT+7m7GKhNlJBvW6q6DgeaXReM8ZOi8s8JJfkXhQg==","shasum":"005617c8d9fc42b266393db529c5f7d275570828","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.10.1.tgz","fileCount":135,"unpackedSize":148625,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcTJZgCRA9TVsSAnZWagAA+6IP/1UGtcsIC+TIFSCG22Mw\nQNW6o/bYVEH3sys84gypPpv7SmmVR8NyKLmc6D0Ugxf3ZBgfZ8y8sAssiS46\n5PCCclenHdmjpuG/CF0IExTe+QtJIrYWEWUTcuGTigm9ltkHccZIO1kXzVD/\nRYL1iHOYbDMNREmxCXE6i9MURyIxhM6YmnR6jI7AkmCMbbcG6i2NKhs7HLFB\nQca+sxb4sBoPf1hlO7Rg/0YaBN7JSywMPp8JUqdx2CWiZMU+mo1/99b5YGtN\nH57Fq1sznSBKxE0nkd/5rC7wWCYGxeE5nnaAEwSoi4UyON9bIcRMT+cNbrAR\nQImR7+Ad3M8Byyk1BngEQyC8vdKeKNCdYRqMUi0XNRsIb4ZxO312HSTortLd\nYYKjvxKP6iV97B9AOJLpv0e0mZnYz8OhchYAtj7OE/GxSucx86t0qZBC2tie\n9TMUGeu6QjeCE48RObiXnAkdscMYd2QVMl5/CC1K56q/IY0O+TtDnLGT1gHH\n9s74t6cwAprA2E6wvG7eafWe9KjvYYD2QpwNkGnZsyCEPje6cVFkY/4bgZeH\nBNRI5sYh7SeUBPF+jxA9b7K2E3AL7OTo4vQzmKXJVPkdQuIjLHme/fG1oxB3\nkbrKBsL7pjqk4D5JUEgNgqqZrtUo3/S4ri+sdzUlUU18EzVKO/DGwF+pRbAg\nzlK6\r\n=AxM7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQColYTLuLN52r5xCDj3r4NxFsNb9u30MkwavP442VAtKQIgGa9Gj2JQWunVuJx0I9+dP6g35Bcc5cyMsAlVlR5+cs0="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.10.1_1548523103989_0.9929214763235721"},"_hasShrinkwrap":false},"1.11.0":{"name":"warthog","version":"1.11.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.11","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"89eb4b8d0ba80784f47fa3d3a7d2f92305120bbe","_id":"warthog@1.11.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-nxwFDTjcz+kQYwLPpBgVX6juAOlWVOz709WXCu9HgH1Rz4fKyH2lJgCWtreNQUC8b13l5Dh9thLVA+iOepNtxA==","shasum":"23180fb32dace632df8452af324f91ce1b34e67b","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.11.0.tgz","fileCount":138,"unpackedSize":154693,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcTJqoCRA9TVsSAnZWagAAc8EP+wRT4sU8ysbFctoryT8a\nwFC/C5Ua9eMsPWkwXNtOQQNDqK0i0CyM6D6K1XUA6rWRCUlUxi/EQW5JXgRf\nSv2kfnJCfP9VT3ct8x+aQcLt8sQ/QuTY1nAIXOJGmzH/MmNqrDPvlo1zpuzx\nYmSx4Z0g4vGzkORvv5THrxPFY9n41A7zC/k8THrYlXo3J6c9I5aIC87qygGk\nS+JiBSNah+ZCjMf9yrZBHHoct5o6CYwfX41nMR4lqD6WazS9g44laYra8gPW\noY6VFax6NjqRRKQSbmLfHT5Y07vZpK77negbeY8BoVmcN1ZPIyFXnpBwINBJ\nyhDBSP2BWHO8dXBpG/Mgo9qc01LE5o1L4nxtLUThW93W5t2tOrULyyFMQSp5\ngnLa1yxo5IpxPAzGubReZtCyBqRizH4YMg2A8aPU8lCemNPlro5FKFPggWP/\nD9d9V5kbSCp0Ff5z2WGJJyDp/zUMpgQGJZZ6nJyvzy0WJBdMtUll1wgY1zah\nepaWVE6LtixAoa0sFZZjNmPD427m7okDecZR9RkWMYg00VX7NRS4F8p6+ROR\n94h3UHgbz4ZxkXH46UMdPHIYf9a3wHWKl1xsmIm1lUaKV89ol+o34k5kwBfo\n5eBaovD2Gh0QFVbBrUeSWRT729e7d5Q8SNMaXrowcm5byhr7jZl5oIhW8jsq\n/66f\r\n=6neE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDZORw4k07q6IwbXJaEOk5ncJXxFeQo5p6gDGUI+MU2oAiEA1lnMczjvxRMDDF497EqJRGgyGmkr5OZ2EofMzFSTuw4="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.11.0_1548524199888_0.7406939143129139"},"_hasShrinkwrap":false},"1.12.0":{"name":"warthog","version":"1.12.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"a470b2dfb22e782d75013dfeebbd0ef57651ba6d","_id":"warthog@1.12.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-CFByJ1xfR7NQCviQ2LVvJpeZLx1XgxfdtTRNfbqFt3KOUCQy8z6Jcg/h9josLo9sdnz2RNxV+fZjirOvszNeNw==","shasum":"a5739dfd8ea78175527618db196aaf98480a6d83","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.12.0.tgz","fileCount":141,"unpackedSize":157304,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcTMvwCRA9TVsSAnZWagAAZuYP/jKY90XFpKdZGZOE23Uy\nDr7MzOGJkm1rUEwR1rqwSdY2sVzmEB91TESuDs65cxPA9vbeV02KMte2sDcA\nhGXef3pExQk5khAMSwV8kEc5OnSu853TSH8OedUNMKQtdQYDm1xv9rkDsoT7\ngpfE1kV9d8L/ZcVrQyWqVsjKfj4Cd/IKJU0Oit1zYK4WigqgWjjlCnz6vhMk\nEirJcEtQm3IJmu14y5QbhAYG5VTwON2EWYpnzDHVIfW2O2cb9g9R6mQcoPmN\n65G2f57sRyUkrgyfw+ZKUrdDuJYhVYzF/n7b6ayiK+/t0Farv6vNnFINEmP1\nRGeohQqK2D6j5HSitYO4BIuXWlPQ4Wik/Wkngas2+plWeLfj3mNKv3xo+tLM\nTM71m0ZHSwBicE1WYL+9pefaNZmyhxjlvfsAaXEfMcQZh/6UUhrz+lo/t8lN\nrXdLeIhunVhG/xgwtryDG6EetN/nvXNulbpf8YpJHnLdtA2p6F/qI68z0iim\nOTI4uKz5dmrIVFvfeCn1GbzPXRyAoiOV20xvJwVs4rbafj2rYs3aizOrwEmr\ntSoKvHTYteWf8mQkTEBwrixs3G0XErXA68C2lozN9ITV3oSPUoRvGEbjZeCJ\ncFY7wEffIyeGN8ud2ZQcQZs/5ow/dT2dFr5o0uy6qEBoO+Fscq6GyAb857xG\nu5v3\r\n=9B8n\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGInMZb39ZUkEUAShQR48ybkfXHZdvGDf4bxbyg4UOsdAiEAiHD5RiOgvVgWxt4poiW8gGU3RbUNnKf/NfAcHvwnrng="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.12.0_1548536815544_0.7450858734979651"},"_hasShrinkwrap":false},"1.13.0":{"name":"warthog","version":"1.13.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"52c2385ca845755c46144fcc7d6a24ad7da4d97a","_id":"warthog@1.13.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-UMS67wFol2R3Nf9wHxIAN9lN1xXeUpZdHkBLFxcQifvLukW+Ue0/vrp4xtUo5lH5fxsk2s0R4RNrkRLEtccFqg==","shasum":"fb64abc01fc902a4e4b921a9078aa93e9d093042","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.13.0.tgz","fileCount":141,"unpackedSize":157868,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcVQhYCRA9TVsSAnZWagAAYRwP/3cXXP0kQrHmO5e6RSUj\nJHbBvBEANydmw+CLXdOpRby/OLnnoeCi/U+aHoYis+CJvT54GWmGmPh6IAP8\n0jJTElsnXl+NMA8JES97kO9ZNeiJolmC4F49ZxLaipcVg93xnQHMSAOZE2eO\nR8JhbFDosrmg5Y7fzjZSGmcNuXxdeu4gfGffdbNQCfjFQ4sYpek0Va3dvVls\nF/BzUL15wo1bR1857u6C+S7SEv+nNqlwijVmBqWdxoP1aiR1Jh9xvQU4YJpk\nDJRabGAru8JEKU2G024zSEj6lmQ4iVH6YseOjvBOB6hVS5ggudoLxmoWqOxr\n15YXlEHhFLUQWUaPl2Z1x9dU8psMSWdmSBcU98jkiOhm0NTYXROBUMRB1ODQ\nU1mDpM883XVaFisrjwfyXhDT/II+2jXQMRvv7bF359cL7wlmBcQLVbJYc0FL\nsOiSe1ojSNqqJnZe9S0x2Uar4NCTxUwDIZeOgC48m85J76kPZTn6KuDzxzzs\nM6cJAlBK9qmGDZo1f+sUh1NG8+TOclAvtB/A4AskQqYN2Bb0jPDr0av+A2W/\n/InNple32u+8psqDTcs4b5wMhu7YnTwkAGWPOCOeSdDl6h447GouNfVbpnbI\nqv1LLuQzBCLLMsD0y3tRoREkJIysjbNStobA7ZZqhBCs86uw+TzEc85H1JLx\naqjj\r\n=5pCA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDLv7d7IhMm18yp9p2Ai/C7bTBwkY438M6vSLsmGlRCxAIgPq2/1f49figRoyZaC5LOXScpLlsAIMcCQ6uzOnFK7KU="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.13.0_1549076567776_0.8298341614747373"},"_hasShrinkwrap":false},"1.14.0":{"name":"warthog","version":"1.14.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"4cb499dd5f6d1248ad4b08a30ed45ab22a24aed2","_id":"warthog@1.14.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-u7Zm0r8amSc/BDTJ/b/itPDhbVS+L6FAW98GoWP+cHrAqp8afvvNoR3Owau7d3nsGtZH7Q0F6ewraEozoI+UCQ==","shasum":"75ad86d321853e670a24a3d6b71281bad857dd43","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.14.0.tgz","fileCount":144,"unpackedSize":159699,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcYfoeCRA9TVsSAnZWagAARzcP/RnOQYBEhi7DTF2p9ha+\nuSSnLvJzmoWGt2cL9k3DNIkj0PqzEKIsb3U8rBxMUPxmgJK8Lzn8IrQwF5wa\ntIQDcq28FD0x1+Fkw5QLNqTIaUEa0tIxYmFIjtu6TsRPehAK8EFDnpbbPhsB\nX/gMUilJS9wXvD4b+WyNFKYt2eKgmROf7Be+hPhPWsjl2QIIMlGk8lFqtRC/\ndJfXyYUVdF4tvfkdJpuw7BsL8SruybGGFBvSudRSn4WtrnHtjDEz5cXCcZzK\nuYOaLif+lTcoCSaWwaEqXbW+EFQ3X1Vssf+deykg5qo/WN8NlbRYS9or8N0T\nf8dJ1jVXZdnCmzW5Z1gsvnUaKS0304EWI8DOzYh+E7Q1H/wUox6969iLdvN2\nDVgCB/UJTN3ijtWcZ6mp520SbXcPc+BIMl56NdL3naFwIrp3jgp66E+O4A/f\n2nVNSBUVo5tJYp+J8oWWLj/pZNPR6K6SX1Z1g5S5GwOyEKOo40ZUm9Ln8j3B\nTwo8zpI7gXTZPjxj5tstiHZtwX1ct/UNgqNiCHedWnPfGHjaBnjzP1Eqj2sG\nvprFl3OeR62zOoudKyHuEZD3Vpc/I1L8kNJRHSGWgRYn5hsR3V4r70fqfFmK\nZlhdIqibgc7jpo0NAfkrEb7vVTcjYJQ3WUTzsW5IogwJ9g311CDTyoAdxvHT\nugW/\r\n=M7nB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDRxMwBID1l6/UTJjEfV1Bzipo/u+RdZRG7w/LKbmL9hQIhAPfHN55KHL2OzbPJbcjK2Hp1h5pGypRrnh686NkKDd0O"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.14.0_1549924894211_0.32035457822336344"},"_hasShrinkwrap":false},"1.14.1":{"name":"warthog","version":"1.14.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"d91d46449dd466497b98e9e24840f0c5164b5c8f","_id":"warthog@1.14.1","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-GQjR5lDxKWmHx93DWJ12b4u16v7fvNOkatGJSHDTfRSAWzgQzy/zHZ/U00+h0QxT+xgnGbZIoptT7352iUdjnw==","shasum":"4b84f955620623898b60ed7932aa316477159f35","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.14.1.tgz","fileCount":144,"unpackedSize":159559,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcY16xCRA9TVsSAnZWagAACHgP/2fWcGgrioy+sWJMTOKY\nqwo+DHkBe5IpRQPqYqXMjSbibuhDHHkXVbwtNozDSCN1ZLKLUvKd+e0oZyls\nQdNH+elz0zpjMCJ3rGQBN20rxfJF3LTJE+Mnft4qh1gicUy6/5iriZ/W7KXr\n+h3ytRSq0TUuex2g4OQVdTViwJVEinBN8AflCphcU5jg0fMycfUyv2zAKknB\n+m7FlP+e/e1U9zS19Rxpeg00wzLn9XER8NaI1KiJyY2fguTPRvpq9yBv1AzT\nocz4hrljEgctuvA6zkAhDMdl5NjlJAybZL2O6xmu5lo9uvtmu4GuSz9AcVrM\nY5d6wY+IGB3h3Fvy2OnqBgw3K86gfIxRgq6Vk5LRvBlkZZYk3HK7zFMBon8O\nJqS6DZlMQneOm6enbkt1NTWPGg419qgTr93WEiDgTmWBy9R7MrEGfHhn6sxH\na7VorfXConTqORidzvimJgrkrLpTGnnh/CRUVJF/WRol9I+sSyLZYscAeydp\nbNhuKJ06WZ87vue4AMcia+FdHQqx/Z8a8V0xFznXWkCyxtoSFgZqOAPLyytG\nUPDVRg8J6Lm1r/Xsq5RwuIA68XH+0WRNrhmlKE+fuygY8rsZdLI5oS+shjaz\nOVb7UKt8QEcQ0cj7mGfjHA0lsadtBV8Y4Zgo7qxUef8dhiV17CsENtSOZUdc\nODyB\r\n=UlOI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICF9rKWh0ofy08WLpKECRuWOdzgf0uJkNu+5umn2yd8FAiBk3LCWk1UNT0bJG/wEP61/RjqmgfihVDidj2eHh7fGNQ=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.14.1_1550016176692_0.303020435801012"},"_hasShrinkwrap":false},"1.15.0":{"name":"warthog","version":"1.15.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"3f691a04562143a75381496bb2f0fdc37114a69a","_id":"warthog@1.15.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-8P4gfTOUNKBGdzDdWpiCBYpPDhuqtDiE2GS+6vs3TWikB7azsSlfUCt99w6tOTzvKmhnuVwcAdBYAcdZWemasQ==","shasum":"78d3a19c359174135c259d1a0d97e72945a94845","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.15.0.tgz","fileCount":147,"unpackedSize":161314,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcZcV4CRA9TVsSAnZWagAA1AEP/1afdL8Q9o6IMN4tTVej\nG8QI50gvNPD/Cg+2xhNOAX6GAPpp9nfCGrIJ8JPZzA+t0GQDxT2/LS1eAjqS\nZFPBZgXqmMR9xbX/0ZLllEUTfQwGskEJcQ7JFoRL3iffhFXBFlX6aBg0lSTa\nxSyQ/xmTY3A6u7Nus8DFYb+S70LzONLiQcjAPui5R33jRr5usdOlZdNKstkV\n5JrzWDh3LlaEEZQ63LQT3A1hpH4TRtQqEK/6FaZQoa8XFqweddk/ZTU5MJEW\n6M3gOPnKdPFxgCvPGk1lB2Us+Cqa6gLYQSRqkSnMjwurHHj6wfHNmUK0o5e6\ni4gQcz39RPav0wmeoB7ACY25XlMqq9NcQ0vkohAzjYNIGWp8dY71rI5XDcJs\nmNyH5zIeLq9huR20GBD0IM8ZLCkuUsaN7+D3MEy2VVspLx3pHWuHsuNKS9bw\n4rbQoY4fTgkg4W6bH+HnTyYcVmsZrU/zqjxbPsI8Rewb+zuJHFfiGzazA/05\nD2vszrCcemKeGMAGTzisT3vzldUo7FMU89VSI95DUXr2ZRNBLl9tBZi2y5cb\noKKKmKAv5bi06h13pymiajXk7gqFCwS+fmqqJ2ARYfSAGllTjzvBGIDeqKfy\n5oQHr9h3mfulXJ5nK6QRLtggW1ZkJX2JgavbCnFGTOe0+6/MDIqfoK/p4Q9B\nsj16\r\n=xX1w\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID970nEWJOcKxifkclBorWUybFszvBC22il8X1gBSD3xAiBc55THbcdJI6ppoDe4ZJWrjPJaztf0yZVQpYn0ZqXJHg=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.15.0_1550173559820_0.24929702114118646"},"_hasShrinkwrap":false},"1.16.0":{"name":"warthog","version":"1.16.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"0548343906517b5dab42e0a0aabfc59aab57dd09","_id":"warthog@1.16.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-FhFwN54dsGIYIpADXu2NmMzK6owJAhTok8S2YBSw+7PiW1XqsBvTcVb5dVKv6o7Zsbq6JP+H67EiqhhVFpoVOQ==","shasum":"56bb5ea4bf56e99e19e125b059cb0e73cca300b2","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.16.0.tgz","fileCount":147,"unpackedSize":161936,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcib8kCRA9TVsSAnZWagAAP7IP/iuQ3IYRgJ3fvFyjMSVt\nj+QyDsACEhw4pYYeR5Y2xp8wr/0vu049pnuI3AFup0jnhxhPJaJE7jBLLu6g\nJa2SM+RtejDReleCW2AIq0ISCMaeErUJDQAB92lTrAFn3MyRfe5aLHFg5Hzf\njWjegJtuaSdkEkoQ8gsipiyC2vnGWCTJ9IniQGq4AAV0drtPQ8K0l5xEm3+k\n1//GkJ3cg81na7tbPor/Nldn+Se5eG4D/ZYCoqBrm7vseZCtHUqzIXmecuQv\nTO2I5AO/Vo7uLZbp4LfeGd0YYZFiv5l0W28lyaz09/HD6zJbgXjX/Dc75Mdp\n5HEmF3itEIWGdHo0gVuUz9/8CnkjpZke8n4Vz8vPt+R9cZrzBfqfLV0MgYXo\ndh0chO7grPSZbwcCN8aiE809cSoJpQL4YRWSBHvNSjav4PVSahJuwUioFz+Z\n3GtQ5cF9MKa/vyptuFjgqRg4/Q8Ro8A0w/2bcS22crxmkHoRxX+hzuTRSDNT\n5hpUAIH3cDykGS+WB553iZBlPafxCinqCm2GqTFEGG25TQCEuqyWrT2gGIfX\nO3/QQ+6OcZr69b60BD/W0eV5mizKPi7hR8UA0QPr+Vt5X/ZyhYPg/UYFtcwo\nH6MpzKdbuicuIC8ymv5Iih4NfF9BpCm3+ff/rcsMcq5lW57cQIB52H2TVM89\nan0t\r\n=uXUR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCiWNyJu1ptkzEsnRzMC9eAY0fhKsl5GPgZdiiuMyQpAAIhANzgV+dqxnLKrrydYtKLi6b2fibCUeoPaiQs34RMS1ws"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.16.0_1552531235635_0.38199334829811504"},"_hasShrinkwrap":false},"1.16.1":{"name":"warthog","version":"1.16.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"1ed3607109005e1f69fa85af96ac7b83eabed3e9","_id":"warthog@1.16.1","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-om6L0zyI9kAKYB3lxgNXgAcJUZCMNe4Jc+visKcLkhSMPZkY6hKdiGXk8McCs5LYjmWSn07J8VU2+b31AWLNrA==","shasum":"f220f9b8b96834e1f78568ec44b59349fb1833a7","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.16.1.tgz","fileCount":147,"unpackedSize":161620,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcib+QCRA9TVsSAnZWagAA31wP/1dB60WcVtWbBSETCr77\n1jw4s3vFwJ1j1vgL6IsFjpjTWFlI5UGhgOvW6wahgjNyF8Nuzp837BQiIzV0\nT6DUwnyevxeMuZRTnWa7wy5DIFcLaII26vke6t0BFx4eRqdtSuCNkZ4vUxGs\n9iQZztCZGpfOWWGW9QNoGR8UgtXgQLmRIdo4XShJmtGSqFVnxrPNP9qXhpAB\nUaWuY+1bz/s7ahHpUQQQ6dKTRQ89dmA7tuoXKrea7Rqoe8V32ATZxfdCf/nG\nkK2eb2Vegu9z52YEzocV8EOiBy8JwlurbI2uvyq0mqdnn7p3VHxDALhERrAi\nhbB1SlHQqSfF7Hir2PNqkv3+1Stkng0QRnWdj8jrY9S5ONvPVwpP/K4uRPe5\nbG7CpfVyhUB1kuQlh7lLMXpS6zbE4Xdc3SN117URtdYP1l0kS3Wy9qZE3br+\njdD23dD4REPz4/0hYrdefUPtYTZ1sc4wK2Cg3kM8vszAeHZLoL4O8LXPe/gP\n7RQ2FCRei+QbyQ00clDge0RsXlxsK4t+xc0eRamDyP3oomCe1/QyuuPtU/ud\nb4BxEWVDYabSNbBA8sG9jGd75IVAySHnY0Wp/lQUMaUztdiwtYorlbz2/Yry\nJJVSZUJerJL/KMrI9zcgyMpcX9TjxfSeJAcqizXMTti0znxaVMj8azQnP47a\njBk8\r\n=SSHO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFnVzkYrFIJbQVH7+FqIjA5DCxTQa/DP0OjLGVrOdRSqAiEAgGaNlaxctqOBaBkJgL6BimErgxCFBKPQWgc1R3qLtlM="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.16.1_1552531343654_0.7295829267055975"},"_hasShrinkwrap":false},"1.16.2":{"name":"warthog","version":"1.16.2","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"7355b518867f36c7def4245bfbee3a877e48a702","_id":"warthog@1.16.2","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-gkqYDX5ASlVfr5/8gKLAboysHCmVEdLXzjJe/JXtO3oyunVrCGgwRKXRuv3pslWB8fVnnVUR4pioaDpNUBv89Q==","shasum":"ec0c891c83afc5631768a4bfb787a8f415d02214","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.16.2.tgz","fileCount":147,"unpackedSize":164335,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJciqv6CRA9TVsSAnZWagAA83UP/1zf9Tpavt11EmOuJyxj\nDsKSjsaEfqgS8MPWVvE3bHYW996FcENfWwGedXxiHFS2zyALU0OM+1lux2n/\nqROGje03quSfXWy2voKmqa9mCpuMnqRv/jIqbpuddfqZuZ3k6OqX1yYNIWUg\nzWe5Du6uqoGY56aJQ7UfPyw4CqWxBO0oiP+KlxqziJd7oAC1YVNDYoc362pj\ntwaAe0orTPIJSPaSNLe8hO+VyCPAtIWv+lyhi2kl1aOFn9kX01BO5cz3NS/l\n5USObXXMhDFRLibW25mi2pk5DJvCRV6l6NfuCxJCIqUOI5mqblCK79+8VrZ+\nnFwAssvSFPtpGP8vCawy7jdtUeUw48Hn+sYRAV75ycq1d21ibmephnBqd9xn\nadmZKPzb2FnLM4DSEerjsrinb7n9jX6Uh2HAe2snveY7R67FfL3f+VqMghcL\nWZZQljN1eWUkplJ8ULK2VgGZ6rlBYkKQJMg9yhy8Va+5jvmjDUSUFxHtyhJY\nnIs/qkwshpOx2bMCu31vLmPrJm3uoSLc3JszSLnuSf4QCB9s2W7FPsi+bAwe\nLsMNQVT10buegymILYNHUjAKbMeXgTxLCbgVfdYRysgZBrgYFTwyH7JwMTqx\n+3s/9UefHscAdM8IPbniL0OJWtsXSbks8xI6FQvkiocuvIW32Cg/BDWH5oFS\nTcW8\r\n=MFLB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAHBZWcClVn9/IJy14bIK3QtWi+/NHih6srOslid+IjbAiEAzJrFUeyRGUu7DI/LeKyJnbA1cf0mgoIDQ7UoiDkaHz4="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.16.2_1552591865964_0.9104889895032959"},"_hasShrinkwrap":false},"1.17.0":{"name":"warthog","version":"1.17.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"0e2f65c83b8f312162881c1bcca2b8ed7bc3e2a1","_id":"warthog@1.17.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-v22p4lSnlPEKuq3pFSKraL3cKawDjazau/4u3eWj/2ydpDXgiM0auIUX9pgfVZY4kKsnV+kPZLmgMU+u6oOdhA==","shasum":"6def313cad7ce4c99b0d75cd1a5cb32c75ecc7be","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.17.0.tgz","fileCount":147,"unpackedSize":166042,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJci8F4CRA9TVsSAnZWagAAGzkQAJatBCs2owhPTGE94tq/\nMcLikTSgWfjZ3DluGQi39pfUn3teeczhLdTJKPg6aN1HbUvO7xCR2AuWf8dt\nUPxk6FtA+wl8ZgsDCeJJrxaJdkkyWRZiDX3Yj8QxtOhqZEpQiT/W+YNoXoIC\nI16uqGOCnmFaDdvu7hDgTGlQfrNgPyoaIn779WSe6kfIuL2hI5lEOP73DQum\ne6gvmcjyYBQSdzx0GUVDrOYPRTeKLb0jgu8BLqADnY4/P4GR7kcogQDMHJvd\nUs5QjAB4F3ZzXP2kkqhaUqkF9k9uu5gJcW5I8hNJRLpOM8Mqzl6yvNzPTm8u\nI4xbpFzJPXCzbKI0EIXJE7jVpXzcCD4jZcQO6cqYGxVnRUaknvOixguZdcJK\nL8dbcKXgI5zMuZaliS/w81xcxg6q+1mBBRQjjG7fo3DCB0RhLgL+WTv4R4sm\n8+RWlNCzjlhyonBWEwl4Ts888X6OkxlpffOIit2FqJlKBjRzgwK05kyu6SB/\n/3YWAn6aqh1TrO5JdbF1VyigIkkxdCjRbM0JtoaibasDaCE25L5zOOLEJ7Sp\nQ1EPgj1zdBEo/djXqQmcvXVCje1J5r5kaJNm5mbqCL+GI1hxJUXPc7ndq5lT\n5/Iz3/NyEvJn6XYaRgfTn9My7cORLuBzm7qxJ7Mmyh9WE22qhkJQPKUSBN0i\ntSo4\r\n=BcVL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEHUbiSwKjLwXii+0Lz0R8X0EEGAbgWRRB5VKKCx0x/MAiEAl5hba0ssa0EQNp1IgGXvNRPhZ461BUKz0kPBRoLIST4="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.17.0_1552662903864_0.14278100298412522"},"_hasShrinkwrap":false},"1.17.1":{"name":"warthog","version":"1.17.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"42f0e58f7e9278205353a99259794ada6529e2ef","_id":"warthog@1.17.1","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-wurVC3uBVYNl0qughgTBQYEjGSZrQXw/r+AUyW1q9VmWx+H3WW3TOYjBHCO7t/sr8klBSsUijRgRioHL0kGn7w==","shasum":"4ff8d23eddbaab8304b8453ca02b44343947ab43","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.17.1.tgz","fileCount":147,"unpackedSize":166144,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcj8+mCRA9TVsSAnZWagAActYP/3Q284ixIDYgFsAV7Kaa\nXq0aT62+khLFmg/fY6XumjRN/+cUTE9yak4+bGnhfL/1nf0WqyfKS4dL2Lpx\nvSLYguS85LQhCsLxs7E66KONfZ2yQsSG47GLqoahVvQ1GdL2QHvv/9lBHDAV\noF+QuyrPgE7ZmhJJtzRZAqB80lVrlONw2tszN4u888GqdFHdDcf44YAKpC7e\nJ8grkwgJ4k9EYNzzOtobWNQL5sAnSn9MAwrIu1ucIuLJ2P7XcVeG6OgtmoQx\n1/AVM0Y8MHin1FOIwnJ0Jdw/i+CTAQC2BHWw+7OzxhOq8HJen79yLTJirpKh\nqVSIEc9ctYZYGdasQ7FaZUMm/ndc5s5DBKDIzJbHBnPOYqm6pkDsIhO9j1ul\nwzr3wRy3ZNCSwl6jaqIgFCaMHRmCUZHG+wJimAOmqh4hgnTUbYnIZyigokCN\nSXrxXleg2wD5mhpGfku3A/rEpomACQCPJqozntm/WFt+0KruZqiNucAykx/k\n3DROQiOmScb/Tp2wHc4QjvuHnDMuO0Z5nIrtc0flus6IMTfBvpPeUoWCEpm/\nSX/WYKaskKO5zZ43YbNfgnZpSyaT1mOJgv2bWVEQ+TqF2MBjjQezblEhr73+\nFYKfFfDkl0Mjb24wvfPrKIqY8hDOymKeTbN8KlQbTCXe6XOekPWh8UwgLAaZ\n2e6A\r\n=7EyR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG/yvoEpEAWbfHkj7uhV7SKwZZ40qsBwJpJW2ibCdQ0JAiEAy4g+1EnM3x0lgkCpmnCz0EjQVZQn1IvkKLW8I0J5ngE="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.17.1_1552928678002_0.928694089707425"},"_hasShrinkwrap":false},"1.17.2":{"name":"warthog","version":"1.17.2","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"0e9d0b818c832d77f66eb82ec82303b01087de38","_id":"warthog@1.17.2","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-FWXHvuDjrhqIjdiK3rxia5DkvSmbI8fjIGn8ErpS19hoBNpjfuvzFa5InQ0OfKzzwTfS73Da8jNX5IlIVUKwiA==","shasum":"075c96f3cf300f102118b953ff147538ea2d8bd4","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.17.2.tgz","fileCount":147,"unpackedSize":166520,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJckPcGCRA9TVsSAnZWagAAENYP/igCWSa+uNQ7InlD4YNG\nRiYgpOOFJiM8kp1+Oqw6hbCfziSoApQJdz3IVgSlPI0l20TyNX9lu5xAm4V2\nOup1BGnF3oG+/nmDUoMNGSc9WFjedn6jGrecXWxxZ9NVs8FSwr/gS/cswPHY\ndSZhjl775nXQIkEwBY0wYKuwHftcmMu2SW8BerMu8bplc+OwwmMAC5+At/zL\nEext603SxYcFTYmv4pYRTsDhYVJYnDaojeUYupnOKC0NkiXQW1ZXRNhU89FT\nyY5moDPZY8RSFYnp0iFTWUHv/77ty7lTj2m/3f/aV035YvMiUz+IL1qt6hMt\nR+4MnXBiK3ozsUETW8577Va6BrTm3/noSdA0HXgIi/Wjm2K+bFnklMngLE+a\nXjmrlYmmE3LRpaggwhtgIjDaeQer8F1oPEFQ9d4JhEbE5rh2u6tLsq9OmQCj\nk9CO5eriX8BI2UoMQ0Ojfz2gJNu5K0T4qgvmovbaJEKVScECaAHWwnGCh80I\nthlsjNnj9NFeRjLJNZVRXaSiLGA55lgCzPnw9shPceIUKwX4KiaAHOAMTzv3\nHZtEeyvXmqSr7gs0+K/8uhPGoh8Ap+lqNHCFcNjFqKqudDapJJN9Q1Y7zSVK\nfZ8ZBXDk7xRuXFUsDEWmmUb/36/jOawGAV1GCe8FWCU1iPM9pFKtvmHftvlR\nopW9\r\n=66yp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIADkItFRbLlKninO9ub4x63GJvOBhb2qD36frbBx+5K7AiEAigY2mGHXopUxbrMjvu7CC9Dii8UjBeiZGIg10Si6LiA="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.17.2_1553004294058_0.33190536520883596"},"_hasShrinkwrap":false},"1.17.3":{"name":"warthog","version":"1.17.3","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"52bd5c4d5e2b69a2a52f878602f17d18dc53b69d","_id":"warthog@1.17.3","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-cxWaPQA5szPTJ99X8QVk0BIOr8Y+ZYPag96bTniWHq2bYb17ZBmu027eUM5Q7QyFMxj9E0nGG1xco/4BjeUZtQ==","shasum":"305b96fad0b8b54945c189d547e9772e2542fafd","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.17.3.tgz","fileCount":147,"unpackedSize":166809,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcknCCCRA9TVsSAnZWagAAFasQAJU0Dwfz7hAQumhtenGu\nDXyeOn8scYkEC4UHe70xiJqID8fgs62b/KUg5qspsx/KszckuDCTbA4XD6V8\nRY0ebh5HUUWm45N+UCQe1DiMHcYSRT0m+I28qpp+RJzXis1m25xHWh5WHFi+\nXlAotel2Bv8gioa3XkGeRBU4PGpApUa/FrpXO+awkQqcrqSZfR8P39XWp1O6\ngGebIbieQklMkDv3JiZ508AuCY/2enT5NaLd10JUfrbbBZE+SgjRPJAlofaN\niHu0tgSlfmnaf1Fdqr+3K4/tGCOBGbIHYglQWj0jkZmJhWYHsWtEDoj9+GYR\nPzoSLJL2oHM9dY4ogX0xYcpv8hFJEb5gHTZ/HWp2GhI5CtMNKOwV8cmAwXM1\nmszyVreApqmhI4gh7SMv5UQIUnsjoXKfCGgl4zti/lcxboy95WYbAy12lpLk\nWHIYpzs4t7TbTfRqFap9BuyW2gvz9zU2x77NRbUE3u4RQ44h36ZPfM/ZRVeK\naNpI67AoLbG0p0z9qd6vmjQLnF+9y//qql9YFg25ijddTqgiXNPggWGBBmDp\ncFVoiW7sKysbn5+1tr9vF3icogzpnOJt4fMp2lBL75fMV6eitFdVBm1tzd91\nGjvyolHbdzjIh/oQR7i8O0+6sZCQDPewUNYTAeniYNl7pkc8H1C9XFFeZ5lZ\nPlth\r\n=1pdr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCAZYpf0tiR5NzW3s0yiUAiWVhEz0Aj4SHGgJWzq8qU2QIgPYm22aUA4SYH5+WRi3DLnr+2B6tHPyBhcZA0/+5bEws="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.17.3_1553100929749_0.3862036929844235"},"_hasShrinkwrap":false},"1.17.4":{"name":"warthog","version":"1.17.4","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"6086fe5cdc388d8f5849bb5961bc10f7a10163bb","_id":"warthog@1.17.4","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-Fm6707DqUIzf5XSN5QK+ebAYbysfONyM8jyuVZX2fwtJ3HGXmDEtbs9ytqhY/TaNKEjh/QpIqjDYKRHV4wPR+Q==","shasum":"1976b8ad7869d4f5b2509e4ebdc542a8db6bfe6d","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.17.4.tgz","fileCount":150,"unpackedSize":170539,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcmS+8CRA9TVsSAnZWagAAJvIQAKJ7AlCWMMIpcE96/d+W\n/NLBKKXGXK2IGtdFcZzXFEVx80CSHTFmwergdzsc0UK7YkgwaQ75V6pCH326\nlGE6hBnPLGjeKa6hmJ8n4yT08DwnmHNsEmpviwnhSKYKu5uWPVaoaxwiq5JA\n3gpGKSB3GnIN+7HtX/LlK46EtGm4yGKU9kSHJUkk6gCiCRt+Om95WxwGIFrk\n5Gb199dJoImXi250TG41WUPXdZ4jXp8oz8gVSzaLGYCVZK5owze/nZKcxkyp\nfcGWU4teneXlip0Ynus33avG3T3vvy8wWrvhaNdgDxPiYSeJ3zdRIJvHfHCi\nyKkbKBx5qdIHP0CMQe4Jgx11iqtRt0EjynnyDH9d9jzS9H4b1jUQADPkAWC5\nAc1c0Gs9KtWCxBR8Ky8rKkxyk4lg5ejor4JTjPNZl+SvkS9SGxRDMKBTQdWv\nonr/50VI1WMhRDvKoYC1tg8zCQmu6CBIs2nWpaezLZNvqcX3CbcwtosWTFwJ\n0LOTZyjkrsmfJltTzDq5y2PXsgFnnKuqTJUWHNaY+cCjYLpAj8J/C0a+fxjp\nKLHE+HYSbH2HEppFRjGBXrKix3CJMsjX7/3HUkmTw2xWVzqEjwiABAFh9nBD\nbYL//LF1LjJoPwKLhbLYsBt3Q5jflRaZW/4FtlElr2nIKcSNtoniOjxF+B14\n/r5Q\r\n=aqzZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDEklUf4CZ/PfP5PiHUdSWYwco/Yh21hBQZPw1wOjL57QIgcMXY2HH9uAbLaL5vM9AzWo87urpz0wne/X2y46UkJP8="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.17.4_1553543099371_0.827651588656982"},"_hasShrinkwrap":false},"1.17.5":{"name":"warthog","version":"1.17.5","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"32673c35724b40d89f29fb1dcd39436ba4c7d3b5","_id":"warthog@1.17.5","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-gm84w4HYl8ojnEwUnerftKnK3rC+5m/9/3REdzsrw/S1jmvaGbXswSU8aPCkA27wEPWPRJfW1hNgHAWgcs05WA==","shasum":"1cee73f5e9e709ae6679e1f33e602285a82262be","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.17.5.tgz","fileCount":150,"unpackedSize":170590,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcnAgYCRA9TVsSAnZWagAAs1gP/Ak9csEK8UTlCEKlW/lX\nbppJcXjoM6WiqwveqCskCNfIp2cBSH0oHGizhGBntbGwuqVf6hnpGDQgzq03\n49XSj4P6M5D34ChEFqcpCZ0278OeGz9LMx8LQRph5WOplOxNxP809gajwCSt\nkZO9QFuFtLFA5SVdKN/Wpn6uEeP4N47wg/FGQ9wdplyeFXORnADWgsqGbl1d\ns2r1bBcytFkw2XVGFlJF8JPktsbwXBduDDPggtU1b50cSilRMFrxzRZK6LUB\naP0/aiWWeU322klmkIPma9yd2AxYtlSPeeFVru+wC2LNz++SCRKu862CQq9b\n/J9jLjiH82EAY4X3sqAEwUnHBgTF4uRN6rbFS1JI+PZ4G7PjzrkjnfxHN84P\nvRgRUmpu01vnzxFkuAUNFUKPNZYWL4Sp1C/y4QjhLlh44P0f+SHuFdNWZZP8\n8NZK0uaMB7IEtyu7xqgiY1lkLq9WXRaLzek9FT2XlAXREIP7SlQ3ZES9Veex\n+t+wQkE4vJ/lrk7z05ZcIQpUPJ/Vu7fovoC97s0ct5VdojtihlE4qOOwZpaO\naTTJBWSDqCqXlyuNycCk7XchJgBNoPXyuxev6Nvozvd1ZTUsFYCAo7LVdCEF\nvTBWECOKvK57f8wu+HpaCaR/8nZ9uuJmkUZmq8ira1jW8Z9dXDpeOlFzZbva\nLK1w\r\n=2W2J\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEvM/XlEb/kQ2xcffhQRph93a9mOmkhwdHwQewbkbRtlAiARR/sSvCvpP102IBrR5z5zvM0dNLxt9Gyvro2hqG5eVA=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.17.5_1553729559860_0.577117196170402"},"_hasShrinkwrap":false},"1.18.0":{"name":"warthog","version":"1.18.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"9f1e29babfe0e4ef6b9cfd24d6df0576dcf340b8","_id":"warthog@1.18.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-9ob0igZm4qdjkV01ZyuS+EyO0beiIM2FA0v+QKokT03ZE/4ve1dnBlowQ8SItavadvThN7tx94mXvEBv2DjK/g==","shasum":"ac0e86906e10d2ecb4b5ba9d7ec1a72d4e91eed1","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.18.0.tgz","fileCount":153,"unpackedSize":172293,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcnmu1CRA9TVsSAnZWagAA0A0QAJWA85u8xIq2Hcv+glNu\nH+TnnTh1/9kmspBiJWf2rQmUQ4x+2bD6fAD1sylkxs8d5OjERYy8PBHBmwC/\nFrW8oVnvP5fic/V1a6LoEc1vEpifj52+hopCfosYfdDIhCZhM77GunLg8EIy\np4oeCniem3dXWVXZGWEeyg+9f0hIfFLrNRUipXNG4k7QL2nFjBTBQVuq+sIu\nIxP/PTlVig2PLciKxS0NV8VaehI4SOvlogkEiTqeFbiefZqKeDp96gJT0Wd4\notVmjEk+xiu1wBEIpxhBUAAmf2BcVN5HE8VPVkKmBlX+JavV1wI3/BfcpU4j\nRUAeD05VhJHNfMcraFIPAqIKHXIdA3AvJqKFr3IZeU1F0b7sCNroi5ob5fSh\nYCKBxHTa7oOfl2r9qygF1+eZfLJMXGv0hD/S7eiJ6G+lB7uZOoJfW2Uf78P7\nMligZY+CfNtMMBGWbBqVngNC908nBxxHSjZ8i9VvBId4vphYp/F+FRwVngPi\nRMBWM+qj2t+6+iZwubclg88Ju/Jq/5oMQ4Cq54qWBoIlG8OBpwwvf4fKwxif\nZzCE6akXaHnEaNFeUJxhpTX6DyFSB2YMQP7ST72vPnChJTpIomuc6c1axKB8\nJApJpzCmujZfx/bMGmocG3I6Eo3R9+OCltOAd9FeulV7NvlPRV5pwZzxSdbI\nxdqs\r\n=kQma\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEW55NVzZKLGr4L6VECUCIdsDgh7bR4l2CzfThRx4WVwAiBMTO8sEHum16lWUSqf27vNaRoSWn1yOSAmEn6ot4BJRw=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.18.0_1553886133169_0.2185914368203874"},"_hasShrinkwrap":false},"1.19.0":{"name":"warthog","version":"1.19.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"e90793b34fc11b9c1c6506ce1e715929406e426a","_id":"warthog@1.19.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-P87kXI3qoXvvMN4ktUBLBFWmnvrVE+6akRWsghEWan6AivlhUQnRr1Ut1J1xnCxoU7BvpvoFc2TlShnmO+48pg==","shasum":"4894e14cc3cecb8b97f4fea256aa6fe473072267","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.19.0.tgz","fileCount":153,"unpackedSize":172619,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcok7/CRA9TVsSAnZWagAA6cgP/0o7+0fTnAXm+YwZe4/X\nuOaDpE5TxBkJH68no+fj469wUzFnUCwEnMV1BFjYpaBTXytGIpjGxpHnJLvJ\ni6UfvXQ8HRpdgNltF8dwvJWid7VEvgvnwf4ccTwEJgdPjZfQCK2nkbJ2eOui\nUFf7awrfoKIZ4yz5bxrDo2Jc0MVsfndW8hwWq2EM1i4rRywbGZEmmMG623nE\nHz4OznrSoIGpq5RlqLEvLI1F+vf0sjPCE9KBerZvbpczJyS/th0ksuY57Igh\nZi1bEh3ACXQih7MdEnze1O1n4mP4Woaj0nY+Xr9S+r3cDb00YQ6ql0d+Obwp\nMSasFiDaxdGk6qWIA9iYZ0U4YQTtBJ9zIr7vbhr83PAfJ9pQmiJl2JQiRXNP\n8jUZJml+SOMNnX3CHlyv3dFun1aEEt+U+2T7AnipoPBgTxvZ/oFOCv5AcU9f\nPfsm134Qo76B3qlDa23S0snJnuTro5lcs5ZcOQVEyLdxLSVynhVHWo1mIqCT\nXw1BJ8/ubKcap2uPEzrFUHyPhWI8zGEEwpAIDNUymse6Cf5ODwqVZve+aPon\nwjsYXZEtymIFowlq269xEJbT+rC3+JEubv+d0Zrxnkr+QGQBi2JjSLyHdzRS\njz81aMMpqPC/BchFIHS+sMH2vXGK50a9nVR9NXPP8+dzN1y8U9e9qIiBznyi\nvcoE\r\n=tPpC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCd3v9FJV85bnxs87MUp8hvuGzhvgn5G18IoWxX0hm4KQIga2cuWBTlwB6jbvChZFaZNwO/cve+otso26EERVNMW/c="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.19.0_1554140926372_0.30239094151454204"},"_hasShrinkwrap":false},"1.19.1":{"name":"warthog","version":"1.19.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"4f15696707a0c913a4707227ddc701f08534975a","_id":"warthog@1.19.1","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-pY4GhK9FgLEQs0C18u5Y3TNLwUUFq1yd75DUYlRw7u/Mwa4MqJAr1Fdd1YwExw6v09PKGfLpQuGojFWmgSWF/A==","shasum":"6490cc65aa91f940d55e438f1a20c3adfa6a0a04","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.19.1.tgz","fileCount":153,"unpackedSize":172721,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJco9NfCRA9TVsSAnZWagAAx+cP/1neOHSwe3p86pC9o3LU\nIseSaGmLhSw/otMBACD6RTCiRk/8WsNPD+i0sow0qMPEohhZDSmIsrQuzBre\nzVyG17a+CEmI8wOwv4ORELqUHd/HZqLXjysiXVtYuBYkiO9PHKgV6s52wNQg\nzBACQsARHJhSUS6IYoRtKIj5Q0+liYwWStBAMdwwxY5Q/7YMgA/O3nkzPO9n\n1ejgbQAS8+b5kjmD8gehrcmX5HfZJU0TCBhw4ta6jcWYRG3+NRq3NTcypY6h\nzYm8G4EsN/88oybCEbEsvKaIXoJh+Yj9f1tmn1/jmGsfpfptfw9QNDX82HS4\n9zXkvZdkHxS7HGe+epISEp0vjkPhJ2519n9IapgQ5MMbhGvyMuDBxrY6c46g\n7Z+ikekB2T96cKNOCGTMs6IGKtwDEl4tBOeR91U5OmXFG/W7GjXKC3TQ16PF\nOOGfjTwYj7cjkl4312PMUtLPI/aVJIVYm7B9HAVlO549H3IeZYEHWSovKa5l\n8OImmRJKx9RAoWGb2ft9eOPqWVTSnSWnIv80hnYFSk8WLC2RCojLf2awEefI\nOQVIgcYCch9AJCiWzdk8IPs1dUL/bDtL71UWNdhz3lyXs098A2+FNj09WxJy\nQJFxxJqHNlDItH+E2jWIQabJ4zPvatcNb39ytPmDpvXNaPHaS0yTPr6Etlwk\nF3jK\r\n=rS/v\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDpzCRug5vUbQgJLwI/w0WkBnYFwrK7qFFX0afxKvayLgIgAOBUSZjZmZXzO319lwgDBeMxdgAQ7VMDHfx+s2CPwUQ="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.19.1_1554240349711_0.6961553648479075"},"_hasShrinkwrap":false},"1.19.2":{"name":"warthog","version":"1.19.2","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"9a028f7f6988f2390c9734e177242d487cc8c585","_id":"warthog@1.19.2","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-1qPGzrRzD2YCAlDoompvoH8ovQFx7Sj23T9O/M6+MwnRYEYvLJaQIcC8ySEr9s7zJ5/+igCMUyt/8mFhjJjE2Q==","shasum":"e1745aae6a2b59860a63a15e473bb9747a844bae","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.19.2.tgz","fileCount":153,"unpackedSize":173771,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcsJ08CRA9TVsSAnZWagAA4z8P/RCWGeRpljNQnTIcdlA1\nJhM21LCSxI42TM6OVfl+9embuxgNHnDX7V2XC9nZjMsd5J1vr2pPInZ8R0ad\nvba9puYScm0F2pikJnYJJLlSV27GK1afpaCWxdcRSvKlW6e5a0gR9/NiAnwI\naLQPnh2lbQgG11xKLP8I2+jIoUXMrZut77c6yruc6RhxrjXaEbDYTjqtA5d2\nAuEEvigsPfgmAzGx/4eWtDuU7KbcobiWBRxJCSACEUi+zStxzOFm/+yVksbK\nrTFXb4JjSGI+yddcmvuVAho/anKvGuHYomi0oqp+/TLmqMKytZkRUkE/HsPJ\n6iN05h6zAiAV+Z2ZcWbk4mgne8orfKgYYhdClvjRLACkO/xt1R/c+SWiHX/v\nB5yYffI+UkoQIAyXJg37AfIvNNMprz669yrwBO7cYTvtZEfVo5z2pPwNpxEh\nK3aqTsLtqLiSnVW6jW5KOLqfO75vbq6Vkhr6bkfPcK3rdr+wXvTFpjaGuHeV\nUtgr3sZ4Bsd2laWOzqqnPenDwnKBYsLeH4ffRQgULVeQruvwgShmqLjY6S7n\nhG96ph2XFNHK0nxMQrR+UfD8KtmKEinvNtwKvy7mYCiuIiQGsQec4r90ZZrf\nYa4memkv+d/TYSyTEwaj4xM4ObpWE7FjzWOrgYQ//LWe0bHuCbnhHDJ0l4Wo\n2P73\r\n=dGRu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCFvI4hyzV94ris4sowxhgR5DLmPb3zz0g6Nyv7Cc522AIhAKWjc1QOydyPSUhoaUT2Awzgq9wzmy7AhTqb7GcmU276"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.19.2_1555078459105_0.761501361143988"},"_hasShrinkwrap":false},"1.20.0":{"name":"warthog","version":"1.20.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"425cce08b53febdaeff4be172de64e42988bc8b0","_id":"warthog@1.20.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-QwU5R/G9WnLnvvD3HNdhd3W3vpZ+N2Kdw06Hjn8zr6iIPKndN42oOqwyLz18dQGWhZo1W91yfPFOEWCnJ1AHdg==","shasum":"46a133c42066eba3c41c924fb2e3c317713c08e1","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.20.0.tgz","fileCount":153,"unpackedSize":176006,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcteCbCRA9TVsSAnZWagAAQ3EP/0yImaP1YtragmspL2Qs\ny+KtReyWf95X9uwgsbRbq+7U+gC/aDWN2YuYQsVj9T3XZPU+FW9okFzMqqfZ\n5C3G9Fa5XG3gcp0UhqwRt2eyvpGUqnLbKfj36uQ96WBVNyIW5pTDtMwJE22F\nwLWWZNn5/8jhP6GYKwH9L4yswmsO1cNhj6lLvZuHYWPOCJwtUsVSadwauVMH\nZ/bIKhbaR0zhZS54TVwprxatku68APGLcWJYIXDkQwRhcJ4u3VLJqOqk7P/D\n2RtrJ0opv4Ikni823x8LucZS7uZTZyTI2Iorgw7GqRTEiWRA0qZYCQn8h6AH\ntuqG58BnxJWfKyUrtVtj3lR79tI51sqHUnNhh5C55yZEPmvij3V5Ox4rdbUr\nwKJrJv2cd/oUfJ47vEZdZYkksWscWBwEHysVuBd3b2BzKwSJ1y1sStnNAGqn\nPJPHmvmK+GIxic7nwqxfgfHBsxskfsnMo+18nkYcbgMi/osLta2f3OPLAPp/\nrls6nGojdJdP9ppCzRlSyP0NMrcAU9wkiuUmISpWbklblIQQWOubzJsZMkti\nZwSj3ddrEWaTwxArS08/SIpmMehSSGd5RgpdwKg/9M2hXUtth7TZtibhk5k4\na+YemtcRVhFrfbJvzncLhBM1lxe2WEaPK6oNDODTK9LPYoU3i9HyHkX+AgWq\n58zQ\r\n=S7SN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDhXEp805zHEJoDmgoEJUITJiKpWU5NrJq6pbJnKyl5ngIgccCkgZX+W/HjgNw9t9edBLFGOOOwDy7RgpYnv8WTdBE="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.20.0_1555423386958_0.0811005512285623"},"_hasShrinkwrap":false},"1.21.0":{"name":"warthog","version":"1.21.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"53bcf67c526ad4c565c07c1b65c50e0e52a4868b","_id":"warthog@1.21.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-p4ZyGotq+oY1A5+62xWKZpLF7X9n34Z006Cy/8KbaUtYWLH+MrGv4eKYW6zZ1r9+ehAdcvDNC10Ipw/VNLPKzg==","shasum":"838076f64513888989a984ed64c212a952b0f0a9","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.21.0.tgz","fileCount":156,"unpackedSize":178994,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJctgXsCRA9TVsSAnZWagAAgW8P/0cfRRwoqv8dTOWfKuKI\n0DnVDKm7TIbe2j4qXBij5bPb+RkgWSopuv/9UtSMavvsZTYD6Icz7t3fv3ak\nM/ylBRPzaSWeBTQ1YjC0Y58TVqyvPWXR7M45U7X6Q8+t9+0D14cuCibPO52v\nff5d4iIlXI3V0wXSLK/GxhzH0tW8EIQYtFGrHheGCXKFpfckAMCGcnK2ECse\nMjqZBaz7oVBGv3qpnLdIQD7yv6mBfkHtCACbwLmdS9+MGsXTL0zctXYSBRgZ\nDCHnkPp+nLsx+Q1ScBrnbmGyVt311benJEbCjtYpwM08fJHUYKiydkD8jWvM\njH4NXbzLI3eDgGOsLQPSiZgihgwiEIRhlytDal2RB1FSAeomitb+2g1SXWV7\nKP49KRx5csF3Zys3h0eCZlersB6G3pBAK8ZufkhJWgkW4z/Z7S5zyt2gfgFb\ntFHk6R767OZ9SE4YOA6cEsKaV5YHfjxDjwqEeg99s7jGXW7ChDTl+vRKyn4e\n2rgvit/4jmnVtnGCqVSko+LC3JQQVIPvyoThRyYZ1h4xXZVeL/ZOzkPyHczd\n4QypkVPnrgSLfZfqMv0V5XFn6xKO5h5QVAdIe3/8vzrwgX3dWJcWjAMQwxVq\nXfzsjj6VHzB/z9qXCtWNoNDfaJoiZu8Oo+zAmJW5Rk7/UERO9BAwZm2xqigF\nQAO3\r\n=Qhhq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEyV94rMDRQXOj6MxximWt8MFNO1Txc45a00lzx9AZYFAiAJMYprOrzesPO0QCDHARsfFq10umJPuFETr1VtCPfSQg=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.21.0_1555432939335_0.007699269325584401"},"_hasShrinkwrap":false},"1.21.1":{"name":"warthog","version":"1.21.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"14aaa83efc934c7cddffb07104b8adba88819d77","_id":"warthog@1.21.1","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-MLuaWK/2E7GgLYoW66T6atd1YznqchYq2WQDuarbZgZbf309TuZkx3nd9ZUSnDIXxQjhFGRIXA3IEC54MxfTSQ==","shasum":"648b0d728f7ac991c7146d98233e8c988c9109f5","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.21.1.tgz","fileCount":156,"unpackedSize":182076,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcwS7mCRA9TVsSAnZWagAANNMP/A9tqudaH0L2vleNFrtV\nUQQhBaRXRiborRU01us9qvVrlZusEBIwkRckXjFmisxVy+/CueXhSFkWYmWz\ngSwfXuBNrpF/qT6LVAIYsoDLo4sl5wbAtsrYPFNo5/3obBgzdhCo91xn4YA9\nlKEcA8H1Rne+Ruk9sH0L+Fc+u4JdidNhPNhUOHMQbOpYm1YiET4P3ilCCMIi\nmF8E8LOPLQBv6L1K4wvvpeKtQcOXK0+wp2HxsajFmeqI5ZW261Km5n7jn3Xa\n2f4gOz5dZwwRRMB1TAtMNpkUN+1M94nJxIi0wkgKFp1AmKyuM+naGU5u2ub6\nvLGSCkXVQMseWf96DO0rHjumLDil6flKCl2vLZG9rdmyXo76HawvoCjPYkeo\n1/+M/hBTywyWxCY6V7U6YWussZgOSoRe734EK5cHAYzESpJFiTWQjPqVKOao\n9jxllnZIhBJs/B7WMh8PDGVW4TH3Q4rWSMZfdluk0oHmqPGXygmv9pIiCXhI\n871plleKzhi87BIHtfzNs2HN8HzDD6vtWvkZ4vWG7+vx/tmwffOITgxNHlEP\nwHfqtM/5gvCx5PHL1FTxWjXY1gXWCmXpsJKtEqhlLxKrp7XJULjzImhc3vRR\nSZW6bHVpmLC/R+Lwrno8talKaUivcqQ7bGaYN8owmlRPvNDaaUN7iZR2gfH0\nGLv7\r\n=No9v\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCDLpsGVpZlQX/QNBO0C/loiEWq2tcJXRvF5lw8fPPiYAIgStXkF2dzQ2Ng6Uqv6aLDDjbYyb8sDIEjJiZHSFpaQFs="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.21.1_1556164325863_0.4492651575524409"},"_hasShrinkwrap":false},"1.22.0":{"name":"warthog","version":"1.22.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"5c9293243f063c4a40b9f1e6f070fe53799286b5","_id":"warthog@1.22.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-kcOqtirt7IVM7GCpkJQnCF4AQlWeVtJca/UbXRfMf8zXOmB0lRZE7vuj8Nx1eKh2sGcgkJorrBu6ONzS1MrdWQ==","shasum":"8d31a504c59c515ad0bcecb4ec3e3e5422aad632","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.22.0.tgz","fileCount":162,"unpackedSize":185879,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcyiDECRA9TVsSAnZWagAAmtsP/jIT53btJaXHW0aY9cY2\ncfVx1JROqAv+4pP97Epqe1kSoJxyuSd+E89yRndy2fQ85Fwrves5SuPTupuI\nLIY3bz725BtT8FqHf83609BpYbIoGeWv3Wz5ATfpGQp1513IZeIM/cy1lDES\nnXnjuG3rH0af2tnRqZe2cAXDtpu3Z08vpCBQ84pkQkTuMhuTKDoVn1/RtxY+\n/tMAcFjrXHUjFx/buXHETDD72snTOZxHwjuuTgEvXFY3m1UZ+Kih/O+tDINm\nIwE1I0uzaCUxbmzBBwlCh6vXoP6XdoD+1vlWCNrsbe0DFUNvIhrEOiYHYrEX\nA8VHQ6V8s5iv3YqNUxjsiGWwj44f1OkW1fCtZWj1OAWrCu6U+LwUYi7FC5ac\nbYrwWh9KfS0IkuTwh7WJLphPWebVUjViLeKE1PproTaGLzNRisE343m0cK/a\n6P4GMqmOrXEEbos2waPf+1XM9JFFSOl4400MOU3A3bslNReVkKeWH0ZEB0B2\nyWCO23V182CAreZqYKiszz9kAIRoeQm2j9vAzpqKd2+3UFcrYfWVVmuZlUww\n+qvq/+aoAGCXSA/yM6nfVVRaOPdUZ0VBxTXkwNg3lWABomfqiX1gsODTRdHb\nVHHDcVE8R9BjEzGUD+UMf174kx/4RqRBXPzDN3ginLBgvuyJ5R00A+c5eNlm\nWH6Q\r\n=sUpv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDjd6tKh4rbdk21XXl5OXKae+xTOE8TJFVFclay1Ed/nQIhAO88Lw2ezkPWBVH+bF4UkLYTbe8SzKrn21JkPlmC2lDl"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.22.0_1556750531943_0.5071129603370135"},"_hasShrinkwrap":false},"1.23.0":{"name":"warthog","version":"1.23.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"40c245260b71b9fb6a6dc4a7cab8bb6c70c41aac","_id":"warthog@1.23.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-SMHs65z9kPfI5xQs5LVXO+dryKf8LrpPbHNMmBXqsO6hyPNj6vQbgaVb0B4niwneQW/Ji+bpc2AfXwdXVzpAPA==","shasum":"2551ec7a59bcf74a32404f3ca3a763406b5ab5b3","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.23.0.tgz","fileCount":162,"unpackedSize":186089,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcyid7CRA9TVsSAnZWagAAGiQQAJF0I2JRfiXIdqmjQ8H/\ngqNGls4+QTpsjbq3OExWRRWtTEL0B2eq7UdfmcxlxKh8lqYhjtRfjokU0mrd\nwXKRES/pXt47s1M8JHXWeODOQ42nOkavL840yb/k4l85XikRBVF2BYNminoT\nBjJDW9lbejt7aEMW7BU65+cO8iDdZiZHdGWeo60rpOaEH+vSiWoptAyxwoUK\nfiD/NqHyMEtmUHwIbCgs+IOUCDZDylLqnVkDxfMQe4rw48EFEEC/75itHHLc\nYjq9cdJbiPRLCXFJ6R3a/dU5VcrtJq5+iO009PxQi7MFo3Spu2jLV3kPt0Z6\nB5ydqp4RmEfnqGzWxRIXkQq/by5kz1awp5K7kdMxkVtRK36I+K9hwM3gOLlD\nZ7GQ1QBocuVL0An8GMuTj7YQaswEkVfuaiH/yGs974KFImjvmmdQ+9wKEgv7\ndGfBwjdCVXqXgYUhFMaKfkeZz1zonMFcuO1ZOIhhmYPNl+ptHl3xrHNF5kQa\nRPPx/6ZlE05MlleLa93kzx3BLHUD0gOOV4gRxFi5I5199wNG7NVPkRse0mWd\nH5ecYnhQ+iQFge+o70ddjPvh8aV5P3DqLLVdtIuGl/ucWdBiia1qrWABU+9L\nDr7Ye9NEoF2SbOJBtVYCk1Hanb90u8z2ypvU345Qo9ZM6RNWHbfrpGWeRUFg\n/ZsF\r\n=5bvx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDcjJbayOMX4Aq1snMwveuWcA/Q8JL7yIPdxi3L2qhAZAIgAzM+RlOtrGj/y5Y/Sp5YrsREchHz8EvQV3Gem7PAZoE="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.23.0_1556752251244_0.06169508102098531"},"_hasShrinkwrap":false},"1.23.1":{"name":"warthog","version":"1.23.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"27200643f3189a72771078b7302280907c1e7c7a","_id":"warthog@1.23.1","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-ouF5p5QbFqeRg34rIZqsy0X3hbW++VJjV8Zcg3svdIKgWNCqtU4qN8EbRxgEiypUl1AgfqyVpSPi9xfPJm28aA==","shasum":"85a199166ab046ea7be2a53cea2f9dcf8bf4411e","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.23.1.tgz","fileCount":162,"unpackedSize":186421,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc1HVQCRA9TVsSAnZWagAAjBsP+wfuLNvIfoNQIPfYU2cq\neLixQLDzULM3ilmRGfoZoGRmJJGVVmWo7+FDct2IXYOAT6N2c+l/Bq6vcM9l\nxYyXhtE1dailP334iXe2UAfQHQjsSBXrDMxXyu5TWs7VuCb3HZZG5x3uhnII\nVWCfnqK3P4vjxyGZdw3vZ4KQpxU+yfV+SBxRQ+kiCQtiTiCvOK3zPeTUpWDd\n8ByhG7EYwz74lsGt2EBUH6Prsoxcv7UAMF8A/FSkYRKZSZntN2uNS5XXj+JM\nVSDOnIXzfCLtwOhy+CQ6MYS7yg2GXDvVuVyv8NjFbavQmM5W9pyISUt5aKaL\nPD0oXjSvDA++N50BBqAAY6SZ9AA9V/UWQ+1nXCTNofYfCRKzhQAoklFYX22I\nfGM8lnf84TCCU63xrabWhJX+6iiv9ETaFN+fiahJzwTUrmHTC794r1ZDSnQn\naZFBK1jOPyOnfNyVLeFl0t/EO0aNnVAWo1riKj0obfnb4yOcBWqJFoGPJFfV\nz+3YC0W5CSLm+x68NGnDV+eeU4XtN3+iuGn4EaVXsCr1FUAvl21dHXLkWqRd\n0Qh9OjZZVUi8n+hFzgj/EPRpXRjv0at7uHJwL0T1/Nkwrv3By15Jl10DtZrA\n469xF09hDP1GQNZTN0dyimkdn6WA5UAru/b6FrlHzCkubXzwLjlWz38tqH3F\nlIHw\r\n=ZdVA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFjyLUTh3z2Zr0C9ZXA3k9lfvkArIm+Z+R06Un0oKOcYAiAfL8mBf0dUkA0cIcDPiiWdFFjzDoSsqQn9PmLlhzn/0Q=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.23.1_1557427535788_0.16048982102419718"},"_hasShrinkwrap":false},"1.23.2":{"name":"warthog","version":"1.23.2","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/opn":"^5.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","opn":"^5.4.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"16d9fc8e5883cfab48b035d3987d0d8b82ded101","_id":"warthog@1.23.2","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-QwlvhplRzybgCZrwp5e/Y3NYXvL7yRe6j0XGjl/qfnK85L0Mn0d7qdJbuzjzxeTvIfwlflNvlzGZtFNOVSV3IQ==","shasum":"825ee22e99199d597a72a13bf6dfa7af02db8227","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.23.2.tgz","fileCount":165,"unpackedSize":188433,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc5V8eCRA9TVsSAnZWagAA/8EP/3iXELqASVGQJ3zNtzBx\nvRjl3GjfW/I7gSisjbzaAiBMTRNMtPrjeIH9YJws0wSqBV5kctLUFgs+OGFf\nbJE0vFeIbyWwj1+FIZAEm8duZYpFS7a/fRs3UJGFZpmE5LfIF+dQyd6ETuML\nzbBzQR0qGd47bwP4X3OmUtkVilfASd6ea0k2JGx6AzgVucw0rXuKIwXlU+qP\n6560wzaHnJ8T9NDZZQ2M3vQCAugi0/YxBqY25eajfE7ueJ/4r5LMgJ55S6VL\n/nfW/VTURHRfPcuGD16QSzQtmjU+ja2/+Y3SSZNz6mbxvo0ubgVB//tIzGh0\nN0lXlsnuG0U7ad5mEAJ2/h4mxi3D2KSsGpi2bQzk6rsf84FGrDM3UHtMwpfW\namVj0LlOlz9f9bPjActzpV5dODt7s+/ImM/pJ4dLquXwYePWOULbGpbsw9hy\n6dVEOBMMOLKdjjJq7qSLS77yneGFnKg2s1P2cguEiDAakn40e23fkJbs7EAW\n+HBLGg4+ftlOO5qlSO6L3/Kppbp7Q8fPyRoIliGWY6R7M4Oa+UNG+RtLiaoa\nGzhSydbc17Ti/wNt+EUnoDyVZaNKtoK3YfNOp8us6GpoaLgCEjxGOcgXRAud\n8hOaEFNfhHkCMa8cMJdGcqLBqJVq1LjBCklK1LDPLQa/XH6ZX049s42gw37S\nSu6p\r\n=EVPn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGqiCSYATkI9u20eMaW5MIJJTFef8dp+Vt/eIeaqErwHAiBvj3SKl+eEmYMrwWg8LP8v5mKOZjWRQjbXFuRUl0HT3A=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.23.2_1558535966147_0.13054199413972478"},"_hasShrinkwrap":false},"1.23.3":{"name":"warthog","version":"1.23.3","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"1217bf76081643dfac9e06ed0a937911fb82381e","_id":"warthog@1.23.3","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-Ub6K4PGWM3OJcSAVSFZSfKhUpxOjFw/3WQExrUSQDlfE6YG/fSorqDHf5XcZAiWX9fFO2K6acy1C2UdupsXqjw==","shasum":"c448ba8a9f097c6fa2fd5a5d6038c2277d30fc39","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.23.3.tgz","fileCount":165,"unpackedSize":188857,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc9InaCRA9TVsSAnZWagAAIysP/0A+3ks7M0/Z1BYYGOl+\naSjzjbLw+B3Zx4OZAuSNmAn2s+GlH4Tz26M4Vl0FErZyRzvge7IQPzmFVjjM\ntrbUYn0Fitz+lo2cn4HUC3lqc79K++wpgRSKdlej0xvh6MiDEO600YEjbokh\nnZVYjg36AP0n8qAwkaWY5EcvwvvOGLNeOKCOnGzZyE7Oos41eq9foLRaDdEU\nbDGSwS6BuRQxu6Uoeemd3Rvabr24O+/mFcRM3laQnRxatVU8w0SGGz5Mzmvb\nuVyDJ0qIJDiOc58ajNZw0AExL8T2GVNKb4yLYP9Hry7Z6rcpdYBqhO/nN0hu\nVWTlWMKHJYJr1+qGK+LikRQZk/z1Rf5jObwSCcmL6f4I95ywL17BNCPDJ3C7\noprqATW1HrdVYwtFgwo8rOqOKL08gGb1fDUpOocbKYpJxCMQ9D6k0j+NUEbn\n47yNTOkwajyQWiWAtZnqcas3QG77+MPjhTyPla7xpAK2KQfPs7TzydoMKkCV\nzR6NXg4nqFZ/lwA40CLXfNsj938G+Qx+VN1749szdhUbmE9Zzc1WsBOq9qOH\ndIvb+UaDu8aKUHJc02wIj5bvXwX2NBek/pl+HgNiOKJ7ltacNdHzBeENJTNM\n/AgHO/Ey4KBo3qmMbYTlDGDmO0q0teUKqqliBZtxMU2OVnpTFH9qVDJxMVrj\nX2vt\r\n=34DL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG0if99Mh/SWUUalw+UxXPZ994L4oFSn/QXUI/0S0B1JAiA7AjczEGxpR9VUhgNk6h1dd/qWVZfyxbeo07VtX46avA=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.23.3_1559529945722_0.8689572117391167"},"_hasShrinkwrap":false},"1.23.4":{"name":"warthog","version":"1.23.4","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"c8b0011c1e625a52ecd2660806766c4abb1e2d67","_id":"warthog@1.23.4","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-Aw5NTwgY+r6J0s2ZILUY0iUTSM9/84z+deeDWvE3UXwmdAcvYfS7BPQobUH1RLwC05aF6by/ERSIRjN8+HA3HA==","shasum":"5b6f8ee24a800d99c1103266d21f5210e64e17a4","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.23.4.tgz","fileCount":165,"unpackedSize":188857,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc9IuxCRA9TVsSAnZWagAAVeIP/jVDhKHrLYiHleg0F24J\nRdt1H4fpI3m3kvPxYDGPKcIZEXhxPZFDdrtASdSYKtE84FrwxKrojAQ7Uc2P\nNS0TKiXiZj1K6btSE5WVJnvJeQdup3Yj7yKVE68EoCTURjhgYW8R0wLJNOGF\ndbfy1TzH8xjppZOpWWLqf3p2zlr2FRGcxsaZdXD95iCZasx0M7WaZ4PVhHV1\nVNeGUdwQg8jANTFROjq5E+fFXeLnlociMa5WNN6lyWE0sbIJ5jA4CS+4JIJW\nV04+daU4NL/m7lEjrwWgak+Xk6x+/jxB+BFdgaHMnbXGgSBnENeLFW6l9fl3\neIBOXalK5mhiz13vnkEduI1+5i2kyFqN4pQirahIMNNFcsM90RxDwlqe8skb\nV5C9VN24srFiyu+ERRuVPBZ048buiarnEWE9bhDqPUjBpa1dPxeINj3Dl33k\nzWFq4RLTTywFi+sAOoKUYlDw95aUa5bIr55vc208t2h4RkCsApqeZrF1rF8c\n/iPzhgj2nuNPYVTtJh+fhG0qnPoaABoVL899f7trBel8cu4tp+wTKsbUW5t3\nTmHwfzWtGMISAD9rrak+5SD/hbcmgsLOGeE4Z40FJIPiGW2oXxhW3/jIxIjM\nrmTJP3H59ljYmSeHuZdWVf+wbHSMsgDGKIJO/tSl11Gx2Nybi92DXGRREGR4\nE4Mv\r\n=UMSC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDiRXlofBqeL5apJaDxRwP6DATxS/LgETdzVfLMhe+bFAIga1DT/hI21XA8456TyOUiycnJqfkvE2uV5/EGb/BY0Ao="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.23.4_1559530416783_0.2819348596106468"},"_hasShrinkwrap":false},"1.23.5":{"name":"warthog","version":"1.23.5","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"959b5806f3e127eb6400f052d023e5bc9448deb4","_id":"warthog@1.23.5","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-o5D2k8D8//DTgBOT79dwh87Lk57dluf0o0p3e5hv2MmWoqt1GyN/RvrmWDdUZrcpAB87v7F7e93QiornXx703g==","shasum":"a7743be3c32806395b6ed51d3aaa91a44040e102","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.23.5.tgz","fileCount":165,"unpackedSize":188933,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc989mCRA9TVsSAnZWagAAGPcP/A87POA5IRW2dpuCaaXy\ncqDJeaSEhe9fptFU+FaOX8z9qouQLPT6+29lyda4QCBLtOjukN3xerEC6a4i\nYCviJJiCp6f86vme1XCCKbB46L1e7fVWlVvKqtI3YD+egL6GFGN4sXfyLRxM\nz1MkonGbrhs4aQ/vixLPT7GaM0Bjrv8Q8CBmmC1Ob6UXU8VSuPVxmOS/nwE5\neExQlUo5+AySuptsgMfse2Hbm4WJYWXbwhCFZ9/RYPQhchLx3J673xGm/162\n+a6s7tMnPWjU82Yo+iVxC2V8Z2o6zAPL0rdyNaNRh6OUxKWM+r5UFnlOHSJp\nPKEkNi71Y7BEcExRfGygtFms3RFsI2Czf7eiO/ZO63x0/RX8ejhGWd3j6Hyn\nBlZpScecLelbeThHBstoacSJX+rtLD4ox7p7Trl1vWu7rCeGinLD9ZnfVb8x\nntWlaK+MMoQ+LhwbRe/48nu+W6GRiRGtJBImbKgL+2XpeNL/5r8nTEDL2AN7\ngMXDPkh5LoG5tOtdQYE25tzBRJnqWCeK/oZIONeD3cY67LE9bUAm/dfg+Scf\nwQCDy3j2UTLtygsRfR4lY2Pq9Dk32fWnDCYJf2/4btRHHOxIajmQTm6mSViP\nUy7QcNW+RT4KniIFFe9sfMq8sqG5+tppZKbTweCNTSOCRXmcUBJTBLjc0umv\nDmi+\r\n=4U2H\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICQmmyGfCI/ujsK1ZlLjqjpjFi7HUNohHgcoqeqbzwFbAiEApnuO/0PkUBy2/I2w59dyPiC996wgBv72lEMbz+Uk58A="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.23.5_1559744358152_0.3538286403843114"},"_hasShrinkwrap":false},"1.23.6":{"name":"warthog","version":"1.23.6","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.4.0","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"9b709b32e8aac98fb307e74ecca5569e8730e802","_id":"warthog@1.23.6","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-dnwGQ09WUtkRcLkvxVO5kv9ByigykBtW9fpV3yRjEiZDbVUa9/zYhq2y9ks7cqqTklQMUR+TXGxJFV32WROVlw==","shasum":"af0840ee35a8db38d73f8cf116aff6a952c07931","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.23.6.tgz","fileCount":165,"unpackedSize":189008,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc/bInCRA9TVsSAnZWagAA1h0P/1kmssTaTRvb0o8bkzrS\nWWT3f34IJ55Qs1PwZw082mouF1hDXlXhDXJVgXWuvG/mOHY6ViJPZP4dNPu2\nu7geKOJoRNQwMjSOus3XFlqk5Df2nLzZdCGV0BeVwd6MgD1z5EWwrM1/FwUc\nTQIfxmIrtOzp9+XW8wvvUqJDus8MtrSbf0cZc6oNMSfTnp5tzLMkG2bqYW3r\nAjx2Ro1ehnPSpOdL44snpXss0qJVVJmWpugAQoOHJDB81sc59Yoww1uTKOfh\nZLWM5SaZEkDogiSvA2pipY2BoXccQG+mVPbfAJIa7BKivo1bk8TvgtOEP2Ui\nynYi3wa6zdbwuR43eeLIuVDwH8eAhOawMXVJggk9TkRbU4CAXaCIfbGqNUEH\neurJGhEXEDjFxs80ZxsVRNj/SQ8u3/xxp2PEg7OeDlFsV1v/NKhDRuLKfp4X\nP8/qOWTEELOUP47Evi9XQR7k36gNEgx1dqjCtcmwSi1PdM5aSOEv9P58QdZd\nvB1z1Nj0hJHJOAY7insiMN4exH9Gc2L3Kr7AHlG/2IZfnzzN1PpQwgmlose5\nvruwPp+G1p7QBwF/lgH7mdcStrs2jcoXq49sbiz6BbD4+212hj80wUQ9sDSR\nTNIU05nVuRwcibPOxyaX3fo1OmfZSA0O40NJ85ERwzcueUeUoOCyjzWvC7Zl\nBS31\r\n=8lnu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD7Lu0wFor46c/8Dd1eturMf/EVBVu/sLGPgHtGxyihuAIgSp4fsyQk3pS9X9blZaxRrgJ214PP2ZJAjnYDclpcHQ4="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.23.6_1560130086900_0.5425540475580122"},"_hasShrinkwrap":false},"1.23.7":{"name":"warthog","version":"1.23.7","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettier":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.5.1","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"905c74a7e633be899c862b6a5be57f2472a27954","_id":"warthog@1.23.7","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-oQ1KRI5eRZiw/TKMugI59uuaSG35XSTaJm3JKf/brXwjc4QX1p3vITkQBfdJTZc/l5rbBFcbDSuoQLdZTQq5qw==","shasum":"076aba333e9528c31f6bd6c763f046239aa8f920","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.23.7.tgz","fileCount":165,"unpackedSize":190903,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc/bT1CRA9TVsSAnZWagAA62gQAIy9NU3qMBrnDXF6vrW0\nB1RAczTg9l+oa9JULuHdoHEOJ3esiuHL41NXDOUpPF2M9NuCObippbls7arX\nkRYbVsRJ987Df0OH1QWChcdJumDoctE/BKPf/0i7+ro0SsPr8uXMSSYvzzIh\n3DfvadNG4kKr4dfp+Yh/xl69Dm0OIzwBkkYnGipPlOSb+obkoXn4zaLAUqMb\nBej/zTN+9jLeDiynRRtCP8WhaeEVmoOxcwpW0ptMF1kVf/K3U1ONtsIhbzfr\n0cG4rCcUP2qgW2AYXy+8o9xEMZQebw6Aon8NeKVAPFfPKzPd9KHGEHDsVcgQ\nyJAAwb4L7e5GNii9kpJ3xUQsQQyTH5fAhNezyMK+FrPpWK1Rij6w5BwfoAez\nBHqZ8+/NQEdlzpUuRAu+XfeAsJGEB+1dZtHXE74+hNu3U3WhXvuBqLpfHA+O\nymY5dZ4i0qiMrtfQkLGgu14rJjsT4obFA/KqJHBfMj+7K5Yw/elMJ2tbKtjx\ncWDMlWptQm7ZIohAwOEf+L8Xep6QJoZCaA7pBQbD6yKImELDAQgkAMoZhGRc\nsp9pHlMO46LXnHTFZ2BGskZdY+jvLTtMKU/4g+lvZpeUtefaWrXJX0ni+qRa\ndwhy1O91pnfjqgejL7VZI/hR2kCWgmzwMvKRw1WD7tn+LrzEtsaUDZTRtMZ/\neI8b\r\n=i/vo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCtOc85mmw9gYI7ZakWSNJ0oOYaHnY+nqNMfwGPi37f+AIgRAi+KyOZ9gXV1N5DPB5PLNqPSgNJeiQWnrhQvsT9qRc="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.23.7_1560130804632_0.3515083981212961"},"_hasShrinkwrap":false},"1.23.8":{"name":"warthog","version":"1.23.8","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettify":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.5.1","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":120,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"0fa6c885d9ea5f98ce0b1e4066cb1f3fdd46d98f","_id":"warthog@1.23.8","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-MLBSDkMiUaXL6N8FbB2m46TLaIBpalzWCKzz9KUh+hjF0+TX2ZEEQXF5diKraLBN9LeN+xjsVctn9IzszcJoag==","shasum":"4a097066c9b15c5e19e4a6139ca46ab2266e8270","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.23.8.tgz","fileCount":165,"unpackedSize":191466,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc/wcUCRA9TVsSAnZWagAAbmAP/A1mHVDylhz0dgj4mRf+\nk+hQ4XI9tt+ZwWKT/xLDloc8sVt7RmGGJnv6M6Mjv9iWH5a+jL6FHgMhGrf3\nB5cAxba8s7CBr/3KDYza+MQebk4wOWHNJerxNUqI/cbolptAT0WL08cHW3br\nUmZXhMiyF3P5SbfueK8RaTNMxSWn/IlIb0yvdTZsj2RybKrjQ6yDMH1dfPvK\nxP6wFNVq1QZhiELW7vB5aKi7H9WaCEs3VGTcxUKiX9nfDu8ogn+gmh0aKfJK\nJcHgbUkw0sBubp24PvwK28TVXIKFDGHnXDRo3zDGojAkASOX8qNdmzt0oHh6\nNBO9UjFxrzSZRLad5GAS+6f+VwuKLSiT9uoI5yziqOEc6dCMXpuOKqfIB+Em\nVarRLbGUgjMQ/BAPp4ryF820Vx0j0VpambMVwSrm2seYeiJ2mM+6ZfCn706N\n0I56XLEsk47tRUe8vZXn9N6BE41LcanwaRM5kdwEyxIgxm08PBFwKQ0NAJIp\nZ8bqx1w5uy4FpuA8cxM57oemmTmyWjA8yyx4hqNT7ePwWkMau72B/5JuHQKw\nfiEH4yMf+FO5ozAPf7hpOwvhDIDRP4DnpJDdQyZEVL6QaAqsSF6CDx7/k8i7\nasVHHYF4sOZjLPS3pNtyanU/OsxH4db+VC1VOeXltasore9L5V5KyjfMK0We\nzEeO\r\n=8P2S\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCaAV1UzqjLTFuu92C7oyf/SrWLegC2Uy4PZ8GFdcY/9gIgBeo80MSfJ2Lix+xd596cSOhoySrmrnO0XN525cuuuTA="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.23.8_1560217363141_0.6067957935681065"},"_hasShrinkwrap":false},"1.23.9":{"name":"warthog","version":"1.23.9","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettify":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.5.1","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":120,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"b3e15326d9c037cc1fada15a1002943d729d1b03","_id":"warthog@1.23.9","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-xb9DrbGLIXICkerd9sWExx8c8Hpp3X8QDYO6tAXSbAndYtZZXRRP9ZD8Y9+UePp4sz+fteFnII/1CkoKipa3Jg==","shasum":"94fc8c117ecebaa721dffd325427ca6c9a6baad7","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.23.9.tgz","fileCount":165,"unpackedSize":191466,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc/zmJCRA9TVsSAnZWagAAAokP+wSWxAsC6zT/g74CZLMb\n9OkFrKguKyOI9JrG29ybTt67yI2b1Cb6OOTp4Rr/qmYeZMKwBku7r43/XnLV\nng7lwUfAc3j1eSJnso0SsSRxrfdCEki5cHUqdyB5B3Nbaf7lUUuQcxSR4nMv\nUdx2yc4RR5H1pQeCLUtZF0HGeDgGMdvdc0CYJnHX4gSqdo2EKlkZa8pTyp26\nTUyixZNDTWwX6ZxIFSSouDor/0bmpQrrfLzpEpza7UTkWRr4MtIXMZMuo5Xv\nS1AJW1Weyn80Xaya4tsjHx/t9wZfGCfj+cvS20yECegl6KQMhZ6dcUJI6sm5\nRRAuYjJymCbmMwmLR9XMPwaJGXkKHo5Oo/onPaU8fZ8mAFE4MfrplMS5Vpfi\n6bm3MahDP0RgMzu35twm/ObiEynbrqQOBKbS49pr11Mg1RzGgkTO5oqU+6l0\nnEc8XjaKmhs+1pGzey2aVlw6vci65ocDIFSi5b65Jy9TOaybBpcdT7u71Eek\nXuV0qk6pUvmSPmvpTX2saijfL1IKIGZf4dd1I8zgIf+L4qKXMZxsO3VVK2e5\nyfDUmKJEn/42jN9m8WAq64v1qeJ68of7ZeDXxFeMMVJnofokqKvgD0h2nqLJ\nG0+p42p9IVkhJrVuDXDmcdtnLkH0MnfR1JALoYsofiTkrpXXPLiCu1xYl9co\nHVkT\r\n=ws4+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHqdKuzLjWA2V9lhyqM4SKVu7kWU6vY/HCJ3Dyt895ALAiEAsFDBt3Sgwyp4lAieEoN+NM18tY7tmOKh9eh3j5Fgm2o="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.23.9_1560230280807_0.03360787707568513"},"_hasShrinkwrap":false},"1.23.10":{"name":"warthog","version":"1.23.10","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettify":"prettier ./{src,test,tools}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.5.1","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":120,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"fac07da9f386a6ab3e177147e248d77dd9336841","_id":"warthog@1.23.10","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-bc1KWRsnxFK1cgcqrAixQuAVlyN2RMfGNC+YRlc09PxlGVYbwV5yX15Ez+dOWdMmas1lVXYRHpl8MG2YUKrdAA==","shasum":"80fafbf2290c3f43c650e6c7ca5911c5f1b6fa03","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.23.10.tgz","fileCount":165,"unpackedSize":191478,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdATfBCRA9TVsSAnZWagAAED4P/RqP3rxtEW8CTqyWQMqV\nfyGplAgsTXZ9oyQhirvzYhZhMx5k22A1zvXiFJyWg/e9Y4lDmudAs4qEpCtN\nZo9x/pDghgzDFFjby5kd2Th6nmSj4ak3hK7iQxozp0Q7hpbegcuTrH4pVYg1\nKtc/U2HwUizlCXr0RDQKg3XPZeFBPanSwg/ZPEiREz3/Quo9HXQXpCmoQmZf\ngP6KfXWJ365aMzRgm0uPthB7Dq3M17aUVaZrSc2DQCZlBNe+rxYhF8UNJ1Mu\nxGPkaShr1ESF7i1sbavgrCL3vadfckiADl8M/4YR0oWrEZ2Fm8wiOLlX25k6\nkU42Wby5g4NQxopvfbj064EPZRXq7r0PZ/OtEw4yELNaeh+k466y9aYeh5fx\nSUzkD33lD4e9QUVeMkXdLqX66cKPHCV2Xj862wt3O5PH4g5hmlQvM5CcMUVq\nVlu+AlOdiQV/AIYPRA1QlIExA23t8M+bpYHizdj5Wjx0y8xneWE7dfuQ8yKT\nUsk+i1ac9CwBGnEg7mZByokcJmN7TItE4/glTnwTkQ/5BGfuFxM2Lmb3+r50\nHvULcoyopNpuwsIjmSwqUW4MvHU+Re+4G+NqY1Du5l+ePx7C2AEVMIzZa1Kr\nQNNJx3sK7GmkHmkxdIsoEh8E1ncwp51npM0Ic3f+aJTRQ+CNPvgbYFUoeh13\ntHN1\r\n=zO4z\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIECI7ZCDET0Hii/LbfyDHdcXkxdGFCPcevWa2lAJK51CAiBEuZkUb39+bstiTQrRB1UZAHdfqX/DAXCIzew/j5diJg=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.23.10_1560360897208_0.3909525754410912"},"_hasShrinkwrap":false},"1.24.0":{"name":"warthog","version":"1.24.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","prettify":"prettier ./{src,test,tools,!generated}/**/*.ts --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.5.1","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.15.3","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"linters":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":120,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"fdb5df4770b2cc0de994c09482b90cf0cf021894","_id":"warthog@1.24.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-K+TFZObrw4NmlGjIbOGx8GE08KK2NUQQIhqXR3G9lOcHAj4ziHLRM8caw7QvtD6t0p41MobeZAjTM0FrY6Ejvw==","shasum":"75656a4a7752343a2e33774c507b70937344c357","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.24.0.tgz","fileCount":165,"unpackedSize":191899,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAVkICRA9TVsSAnZWagAAeI8QAKRkkHLBd0DFMyWAzI7O\n2PdsyGRVuXY8AkuAGplNbC6kE2xUZxi+I3NN7u25Q19/6TxqXt8EJWh5q9nk\ncysqih56GLDP8L7lFU+Zg+hA3/CZIrEyVPBUnXTpequCr5c8mJSbQ4vatDvX\n8/PzijQZ6tom+tp87QYDRPOUHsq0UQRN9JnE0mJePIPxGQFaobHAW7P9l6Xb\n3TrjiFoEVBwBHSHJeqdl2AnyZtbQzgsbL7MIkGBOILoS0FVgMCTqEHI0t/ES\njSFDREXIWew3/b3/AQxM3DK98Y004IAgffoyciX5ElQeENIIMTfI05Zsyhxj\nFMSuqNEAreQF2HMnHl4zQzFcpz6XmtWMzRAWXvnHIZAiEqbgrYhWd19QC1Hi\n4eRPorkhg4uU/YL6jq//VGOTlWDeCTbZ96IVG0rf+IXV6garOLHjJrs7qdOQ\nsALVuskMqRFvGP0OX9vdzgAj3OYi7TGUidMXtONcKZ08bkVPZhGqsy0mbr77\n/DHBWOXD/eDoHyNg4bE/vF+RR9D3116ZiDypxFSULvaHbud1SWkc9SdnFe7o\nfz7d5xFRELknNwmFs84wYTRIE6hII3sZZ2BHm4ZELcO2x55MFqDgH0fFaTml\nme81mc1UtEA3bIiYo+ClBHVsTkFYHGOHyn7KeD7B7JRa0PgmAu4VVrJ+Cq/9\nyzqb\r\n=nIpn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDm8n6nUW0FQPGzQVGTVUSC49O2X4Tt0FURd9rctK3x2gIhANFosJGcHxx12KQIno0IyOcs5MuJ9gK2MfcyNbpZd7q0"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.24.0_1560369415449_0.3657046623770501"},"_hasShrinkwrap":false},"1.24.1":{"name":"warthog","version":"1.24.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(src|test|examples|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.5.1","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"linters":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"b0eb03c23a7e2561a6806f15e47acb78410dee41","_id":"warthog@1.24.1","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-pqj+jNkOAbHxqgF5yoEFJuUkKeE7lkZuGTeKT4dwwn9XtucHt3ZwP2sZSRYdxARk6UrRsPdhMPKLBQj1HSYdpg==","shasum":"ae50ab6c6d14613665cbabb6663702a5bc099d1e","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.24.1.tgz","fileCount":165,"unpackedSize":192007,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdBnPDCRA9TVsSAnZWagAA27EP/3WNILPhDO7oCAvkHxdd\nie18fYWho62PiSw1tffQMBoTb/o8Axdi5Jp36gxOQLTdUmNNpnBS1NMlOXsq\n92rPCQxMUV5EUD2/mpnykVUg7tjN8ScdvIYmGZh5wKscJN2sONjnSPca4rl3\nGXJFxuLK6hEddZZdoonoBcBjDWhT+/yM3hwFi6gKj+Bs1BLTE/sI0bmctQqh\nm2tJDUAMtj3K4wLlCoa3zF2L/PqCTy637KkxRL8D7py7ORlAAomnipVWy3sP\nHGQlmVUqHjXMq7JbDFduu8o4cufgVu2tjl4gYa7zLv01ZoAczA6BWkDGmGH/\nHNZiZTKiYWoYyMTYp0zePxijZEuhNna6BBy0YGX9KXHK11b1JPq9sphXKr0i\n/D9DmOlx8ldqRmjPP/a5YaVcYeu3eWokiqjM4qqi6lN9D4y/NbvKB4hSu5nA\nxR0F3J0eW9y8yeXZxHy9MIGiebk9QeI3VTbY5F8uhZhdnzFZjUbm+ChhA85Y\n9h0gg9k8gcPfNNoNrXBdTkzUfZQzwcscPkCMxcub7o55EtO+BrlNvsAiEfW2\nuPuVnOUAciZI221FM84xanDCB7CSU/PzIfRDEHzGtANxi186dmghUZN5hBLU\nyddbqDglUxkJ9yokL7PACAZs1+h5TTucrjcxgu+yRAc8tbwTVFUHOBkvMII4\np+3D\r\n=oNQQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBdnBnnrj7BbGNzhgq4iPgWya5SwgbJ1LKfYw/1m/Nr0AiEA0h2t5O8w/zUBSR6ZrlNGWYNRvgK6d8XSK9BylVr+ATI="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.24.1_1560703938634_0.4053311648001443"},"_hasShrinkwrap":false},"1.24.2":{"name":"warthog","version":"1.24.2","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(src|test|examples|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.5.1","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"linters":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"1a3544600cbca221a1481c1b1c5bd646664f1d8b","_id":"warthog@1.24.2","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-ZZFnwRlK/47aJ9l7cFJW7GdTACuOCEyucK0jb7IOnPJ1d0rp0bJriHsjp9ey0qp3pjUmuJIeY+jdu/E3ec+7tA==","shasum":"8f18cbded1ed5a9e3009418ef9ab57a398aae4be","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.24.2.tgz","fileCount":165,"unpackedSize":192007,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdBqqwCRA9TVsSAnZWagAANswQAIAdbxAN+hdr1dno0nMI\nilvEbJeJ2J7hRnoVb+bOjkxk9exXUxjCDv9BfEXBXg+WB3bvfWwYnugzLqb1\ntF57h1wJgA0xaqo1dhYXnoL64XmXhad5oiSCLkvlgq9Z/hdqkzVQ/IODie4X\nMsOX3LGGF0rBTnTiXa9euEY5I+J2Gji8cwF8Lf84N0fO8TfEtLqYPoDXN+8J\nqPVUlOQRgj9mPPMOCsrzLfoLOOcXsyCJjc8xDdMPwKKMqYja1QEimZhJ85+v\nIT0LYCB1cv7NqfHuod0xVCRzjTXe3BmDzPUG1uCi6VovFQIK3b00jJ/tNpiB\nB06RiNMgdgJ1nqEkNvL3EqMXjdYd7lJdHgOygScAutiYrNu5Zmt7MwNE2YYd\nGU7zh47cAITHCnnKB9RSJndhZWyn1TOMRb1WebTbjgExBnsxqn3HdMhmTAcv\npAgiOzqMkBOmnNAI4F7TeJVzV1f1WcNAMHQw7P4KISTzm9hNrtN6N9UruTzT\ngJvuyCb4xpXiVN58oy8raliluawcSki9Gct3v4zOdG5oB/i5zg1XtfCovx4x\npQ4d6pHuA7wydh98kI7J9w412/C7u+jSJfP1dGlSDi+9Grx0jF2dHzt2mS4H\nLCzs4yOZfCOraQqzELL2HZ0jHuMRLv2ALQMYERscXsy57PryaebvgEHbpukX\nQbZQ\r\n=6G5Q\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHrEOhj7cPGVsoh2cb4KPyU9hcpKlaeK3XRWmUgLjG4kAiA6oGNepkek17wiZSIEGhSAaCu3ekmWOjEY5TKPZKWRqQ=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.24.2_1560717999609_0.769846010833213"},"_hasShrinkwrap":false},"1.24.3":{"name":"warthog","version":"1.24.3","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(src|test|examples|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.0.4","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.3.1","apollo-server-express":"^2.3.1","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.0.2","graphql-binding":"^2.5.1","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.16.0","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"linters":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"resolutions":{"@types/graphql":"^14","graphql":"^14","graphql-yoga/**/graphql":"^14","graphql-yoga/**/@types/graphql":"^14"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"210354fbd9cffc177ff9c15f992fe92f73a9515a","_id":"warthog@1.24.3","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-4MSZgbJ8AGRslILMC0Uco44FYHq5xG2BlzMdpw0NUfSV1Il7lYMnmkQM71XRkoTb53F/zCzFDJ0i7JmaIfWXxg==","shasum":"aefacf582577d35e150fe4a39b2331a4f25c199c","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.24.3.tgz","fileCount":165,"unpackedSize":192007,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdBqrrCRA9TVsSAnZWagAAjUEP/07gJVs7zgljAMomkd4p\nVuZny/VShxmtor6TEKglipsycl+MAwKd3p8VIC/KhUrsAczJKdpAuSLZ2ODJ\npCJQ2QdpbVdTerLfsWzTLcin4GU4712Gn68WzSYA9ZtDuEDHPUvWYuL2nEN5\n8Ex/JGhFbRZgOTUb3uC6247Q1DsmmyKhSBlJ4Tp4N8wLpvknun31S8yTrGYk\n3uiWskMz04+JpsLpsTPqlkqPL+p57fcE2kXmsv+O3jRUU4SoR2bcpnXyOTFu\nyufTqMdbgg4s5GVlg8hVbZZEcbL1/VISR2CWl3tH49JpaIpT5BBzRyvQDCNg\nXmDuQCTxTIONkeM/zWT2yHxVvonwTbUMsw2k7PfuIf3gwf6b0oIUMr2JDn78\n9dmttcOMy6dkMIb+PXT8vh1C4PbF8moQTJvKvf5N9mm7InnnnelK1XPqfVYp\nncL0km9dBVy+JNGcvlkI5KSO8dlnvGx1+hPYm6QUKTLtFbDLClHne1F7Bdxm\na3BXaHuHoqDz40i58dtUBXVHuQ9rrd7YfdQQnfYij/y1/L291G/CqowOTCni\nlKNZ4MyBhBJj9Lwf6dbLZUu95tj9HCDeCdaegTv+YPjwTHARjmWMMX/veNO4\naMwpnCPEupQnv6t4wmS5B4vA5lrGRvD2geIkdfJ/YCF56D9sMOeDUOLDBpeg\nrYSA\r\n=PzY7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHK8camyQOxVIHsDduL4/N89yxn62OzucjB/SQRhgjsoAiBKjWr0DQHj6dNCGqKddaBMxIUpMnEkbw79onj1FeF2aQ=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.24.3_1560718058629_0.3351659383474015"},"_hasShrinkwrap":false},"1.25.0":{"name":"warthog","version":"1.25.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(src|test|examples|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.1.1","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"linters":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"1dda79e22c3a0da76cd3fd5194538f75729010f0","_id":"warthog@1.25.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-ns99vU8MdX2nDG8rKbI5QgZy9s0AwtaG6n2vVCXtbGAz3Nx5C1u8Bx3Q9wxGQyscLadfc0RUN+BbcFGIdQ1ZGA==","shasum":"ba59c91f6bb9af946eb97f7eef6f4b9e411d1124","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.25.0.tgz","fileCount":165,"unpackedSize":191813,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdBqs4CRA9TVsSAnZWagAABxYP/AnSN0FLwlXyFraiHMFg\naIH7N9NYLQ5lGOuGlJIO4ZVP7arVtxNoxkaujFEBcOJGmj5IoYGKcdpInsB1\noxewpFzhTmzfA4YmyXSP5lV/g6uhbZF23azGHV5Zz+6ItJrr/cQk7uh7WId4\nArN8O8SyH0Gt2vAG3UzN1j0LDqH9Moxy112MA4CeciXrk4wPSnjoUJCoI6jS\nC4gp6We5nyG+cJm0Hkj/jXXiPr5E9GFHj9FWE4qHV9HIZUURd3Vmo5CItk9J\nlMJg35eqFbhfii+USbJ1VWnkw0zMsvEBMC5KDc0G3rSZTNBmZZYmLOvR4vi+\nzNCC0WF+Xix1+b3YxZMa2WqN4jhZ6yGGUNRpt+2lD+x4XAE1dvOzjzXSkak3\nDomtCQCU4RbRASAybTk2t+fQBWpJGVe3WNF7NgrrKctE2YExiuvI77q14ofA\n2dkWsLLssgHSqk4RUZMBxRUorhOx+iHeBN4mJoRaEBHLLzph72wFaXLNQttm\n4ttXSbMUlIZtYjF2x3SeFw9ODle4N788Fk/DlxW6Zx9CNbE0Lgdaq0Ki94gd\nzgA209rZzqDpzU49OThkWQl/TSmcGK3mUmL8iRxlO5RI0L510UpHkEswqL6l\nrm2psNhEGmsu2K8oTiYWr7gDt8qhg2VmXe5sa8niZSwOkxyxBDOZBs5QKj1g\nMwI0\r\n=yNnU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGdm6cETiQi7ZqYWCK+lb4xe3eNCyUjBgecf6qJRhcJ1AiEAlo/EwP4VskCAIkyoPPTBg1hCPVxi+FExQG7Mg6T0KWQ="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.25.0_1560718135458_0.07065690755371379"},"_hasShrinkwrap":false},"1.26.0":{"name":"warthog","version":"1.26.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(src|test|examples|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.1.1","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"linters":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"b571c8bef9dde0551ba62cd8872445276a6d6f43","_id":"warthog@1.26.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-Q9V/1Vpi6LDHm0x+vbjF2tM8sNCNwVJaqK3P6wnOcivDZNvqJioJFY+25krQQMKU5ywxvqULUOLKkSFA9iWRkw==","shasum":"46d3b7fd4d908019521a666b017cf6c122efe5f0","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.26.0.tgz","fileCount":168,"unpackedSize":192937,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdBtlfCRA9TVsSAnZWagAAPqUQAKJZyaQgCKKin4KTcufd\n1HrS4Eef5Z8qsbk+VHWYi86347dwMO8hs6Fff3ek0TyJRAW9Gy2D5uZsvujM\npKpegHG1A5ENOU7aatlVYID21uXOMRbzsos53AQuenkZnKl2btjjezsYVwzy\n4MGpnxZURBaSUdMwKckavbmti7RPYJZb5skZyk2a7pK8Ol5L47/s2q0p24uo\n6q7QJ/UcbH4kEUZxKdbwfNsEuM9OiZqbnwK74aHfvpgfUVQ3TQGlOHUr6ddA\nQJ3qgce8/8C7dUAIxDNbWLEK6LvcL51xezbR8gGE4p1Bh2zHILaWHt77qyym\nYpUOIgkzTcgRNeC/dTh2vxk8egV7FqP8bQyn9CZG1WcwKg8TFdEdRgVK14cU\nOo8OXUu1FVtS/YFf5+emzWBIyvUkdIs66OZiBgB1F8rdWLaAJiSqd7DK+BGc\nlofSacH/AvVVnwjI6+New3Slltlz+5uuslszSt4XIQwZRVarJQcQ49JLJM6Q\nFKDN7ChcWmFdxjX1/E5yhEANmATW8hWhxpsIbq9j8NQm+zYAHZShKBE0Sz2B\n3TidUmgDOwvP1xsFSPC/9kYF+3UME9Hb/whPiLSivBMxrhEjLGhv7e1U41op\nTDyvF00FOfTN6k/z9XVj7tPbZRQO+kNOQlZV1h7CNlnPY8lwqbCZl1Lah7Ds\n2/gb\r\n=SRCu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAQ5QLDislPWGtKdSDCSehIqH/YYuAAze7tumSoo/u9NAiAdmBNlsawpGz3niJDHuIKdaYAhb0gZgNoinnvPKSehVg=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.26.0_1560729950324_0.6778192317727143"},"_hasShrinkwrap":false},"1.27.0":{"name":"warthog","version":"1.27.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(src|test|examples|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"linters":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"02cbcfbdf4e8095799027038670bea7b57557d9d","_id":"warthog@1.27.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-rf6MEFaKHhuQxcnHEa6bhzdFyuxy9JZtAf8RS7qp8zjVb2oLJkNeBy+YvgOTjEfmHCzwhBdZKDM+II8gAh5Q1w==","shasum":"829cf63737ed87d1eaf9cb5cfef8e7723fffaca5","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.27.0.tgz","fileCount":171,"unpackedSize":194087,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdBuADCRA9TVsSAnZWagAAQOUP/is7QBbBsx04WON9qq6v\nKZzlzDXiPYH40b3eaDXbx/VvSlnmY35oY17z+Jg4cWQP+lE7gqu4ubj+cugy\nTMtTXB+xBWnmp8zKjT3KJIWXKcQ8avCdo/A7sOAwgFtumGEwAPhR6+sOUNNr\nOZ58oDQOnngem52dhs4/wfkrf98ZbWU9HAKHXwSj56QyWYaZqjb1AoLaLa9R\ny7XepG8UZmPL+hAlI3Rt9TuDbHP/cXK/XXg6TC4BqOoMwgTGpp1wRVsPON/o\nLHs28zeSnn45Xn3qvxru/zQVYodSfuzmsKXu9Z5n4Fp/G/5RSE6z+gHfVrsg\nBT3bmvnAZO3j8CLWKIxkwj+TwAAoYqDBouhHfa5FHKCp9hoignZeDk1bawQf\nbgM0CVlddxJOfBFMeAM4NxhpQbXUcY9LHAcncz6VqCN4MYPFquk8+tKFty44\nG1KNp3mEEVVAC4YUK4IL6bPF58gTvv55utQixOG4uR/FnffCgxRggJ1QFt50\nxUiMz9cvCqGQ8rVgDKSv6TVSsDfLgTC0UqctDa/YKOtOqzuQx1s7yLi3Qr3+\n148RUIJYkA25RJrkrrJRNAYDfNzVMIHjNncEMD5kN8VjFxj1gvfo1hHJblC8\npugfOESdoXynIuYs/12s9nsZe9OqgzP+iVaOsaF3hwHd6jgDpS9HDyJ2rS7y\ndI24\r\n=WIdW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGJMSWHIBFnJ43D+SakLmS2KOil5wNteMzdxqaylRbyiAiEAm0S3VVhQT+945ZO3fJ9GYUknP12TwySDzHr36Ceh2do="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.27.0_1560731650864_0.8502448373411833"},"_hasShrinkwrap":false},"1.27.1":{"name":"warthog","version":"1.27.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","lint":"tslint --fix -c ./tslint.json -p ./tsconfig.json","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(src|test|examples|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","ts-node":"^7.0.1","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^23.10.5","tslint":"^5.12.0","tslint-config-prettier":"^1.17.0"},"lint-staged":{"linters":{"*.ts":["tslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"03891d3424283dc6a9949b33257b65ab2730af7a","_id":"warthog@1.27.1","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-lCMWI2/qSxa80ERijMAslWfR7kGJtTW4OMvJ1w+ZkOD83p5kmUKhbcBTnE4rqxEXyi+IrWejHjcnRmsOfBdIhA==","shasum":"52c49699472a1bfc1b7bbce0533c021e64922a01","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.27.1.tgz","fileCount":171,"unpackedSize":194100,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdBwDFCRA9TVsSAnZWagAAhPgP/0ANyV3VKacLBcmBwg94\nhjqRVGGDpw6h8lXOjpxyZ+/3ZO2eGEnO5zN8vE76NlVuqiBDyy7EMnjATT3Z\nqSV1Ov8c7Mf5mkCLduZmm7wPN5gs3rVYfCRqiGNQ7VTIsz5ATuOuHrulx3IG\n3Yjk+86Gqw4BKvVkvOUGoeQ1bfAUAPAs2O5gF3Ef335bUC2+N19g76XV5XGj\nBvc+qdrXXUSrhUrOQM2rCT7M0CSZeSsfYEC77DVFR/nKWVoy0PRQD8VETAlk\ngOdfuJVEa3l2mcjuSIrBWCXfgXb9HWH1XOoWzxt4pBvxmvdDPmF71mHqOKQo\nUcUHKlWraGYHjd75oS1lBcbx7OhwzAMS3khl4cUN4fxw94Yp0peWeLTijGHm\nb1nISPyBxD/POqB4p0OK2I0S+r55Dj/Re+o+ZRqRCscQI1An1a+YvloaUAtN\neEzbWhTezLKIR7E7UTSBpMNg4hzkQgRUKFISOEWRHv4F3cLYGxySTYir2Bft\nXpe7JvbDDHjv4aVejbS+GvTq44NtufvjGnCOBK6nXSXOaU+GVJ+CFpWJ+BLr\nQO1aTK4Wdo2wLWeZ4ITDrNq9Cr17OMgCuRNMa9ygoI5ijWFcGIEB+nSAvjoi\npyFmlsxOd6kGCkVoww85HS2zVI8gWeLdk0jGl8Gr0vtqQd29kQ9RQ4Z2K4v3\nR59k\r\n=fQX7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDecWmQCLncg1BupaX7bEYuUBuBnyPML9elbNunQLAhRgIgFCmducnMU8R5swVDJfDxhTcnSvOiWJwsl+L25/rCYTg="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.27.1_1560740036368_0.5276539525871735"},"_hasShrinkwrap":false},"1.28.0":{"name":"warthog","version":"1.28.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","check":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^23.10.5","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"a2cf3eb554bff4b8b0cc27064ebaa30a83be12e7","_id":"warthog@1.28.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-U0HIfSukVjFMBXva3rCn82FGPdMXaeXHEBBRGMpcxcbjWhgOCsrDGhBRMOvTLzOKt2km3ZSkhL4ktN6ReLHejw==","shasum":"658ccb8c3eba4c52d68c3dee80b98e764191d589","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.28.0.tgz","fileCount":171,"unpackedSize":194958,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdCcHrCRA9TVsSAnZWagAAd2YP/i2IUuQkPm0NOc20nId5\nJJKroLQOXi0BGt9o1jKZieMhiiHteW9aGuv7yJrbOwl/5UXRyLjy/daoxjEF\n5+uOKWkoAx94VQBADPf6vGs0uhAh3o9jWpb4+Dgu3FE4wZPlAwZk0zJx8GpR\nib7rHX7OKuj+DuHP17mC9xc1bf4tMycf551YMSKmhjqbuXCqC0wFOp3cX9YD\nx3JZPl3R0co2A2lPHaQAKX16Y0TjHyXaLkr6M6H+QIPCOLiCucqLEa8la/nc\nZIIVp8YZ1xnnUen0eujERC4f9OVS5PN7bBDJExCFlDSk9yFKJSbfXJlo67U2\nEXLPV6DIexKehIFp3vh3tEnd3xd/KI3FHyV3noRN04OIYQPXMg5UCwkjcODL\ngIoLStCIMsvyAHhbmouyuqybQz4sMMmxgfkqZmjzNS0wQuoRZOGC998Kr99a\nnNATdwol3NjZkXnu7U9NObUDlKj9BBaz0MNCZ9vNhr6XHY8aM20Nxh9466+K\nsPgD+1KrDKXSMkLlaKTEG0yKAdzCUP0pGqiREzLo8PogVFeH3uihujRK6LBW\nlwfsvB7jNX09k3g/avqoQUMM20WV3xUVAMFNscD/4zfiHtYEzOz/rsJOuX8Q\nfYeDT5ii0TiQWtj9g1WiYRtcOGFd10F0GQt5OcX1trcY47VL3AXmnMXQgi8B\nSmmF\r\n=T3y5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH+qD++MhvP3csvgp+KnPI5dX2pdIBCUr0LYVhWEECmzAiEA1I1K6LZ6ROwnx76GhsOLy+0Ix5YGddwvrLIC82A5PcE="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.28.0_1560920554621_0.009882403642143212"},"_hasShrinkwrap":false},"1.28.1":{"name":"warthog","version":"1.28.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","check":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^23.10.5","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"0e2040d446fddde38f8dfa556952a119bca3beb7","_id":"warthog@1.28.1","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-pjdJmqnZ/2b0QZm1uoZ4Nd7fE4ST0JzTJAxYIXcuIf1nxNTyTg13G03i8GFLTY0RQbbAYMLs1+zpQkgfrhI9hA==","shasum":"f6061a76d846513957b81832b07b46d594a5e847","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.28.1.tgz","fileCount":171,"unpackedSize":194765,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdCxqbCRA9TVsSAnZWagAA3uUP/RPVZfdLUq5NWAD/Fl/8\nVdceodcIeuTzT6TcsWUcqlmDyh79l70APy8A0LTkLEdTx4g9xxhvIyUfG0YV\nQUDYmZZyxqArjyQTjlQUKGZ921+C+LDIith4oIjXUlXW0jiM66frzXQe27gW\n1cLlc/D2XKLiJi2Szz7+ldjj1OAkTJkjvh6LwHb0p4US57ym6cC0O5PfSdJP\n6GBIaX+RAFXSij79DYpuDtsTuj9rNjH6kBZezAkQuXBYVGqfwWjd2XQ7FUIk\npjTWI98PsOAyd9fFf2t038v5ZwOWNdmkyKQkgZ6R6ruhuzycqYSP2q9e6gl0\nTCAmWYzycyY3RFS799qXY6mbeu7tN+aH/VT4EEg6+XNSIA8iy/uTjTIp6YPL\nqfltnR/JW4b2NVZWNaSSFy6pEljwrrnAbvPPq3L9eFPjzNWfuDnPnr4H+w7k\nnCZcBNtZcVOcfHhKke5TC9FR8ZLDNDQ233CYKWwSoTI6/EhChEJlXsNbXgS/\n/9Jjh+VbkABczhRlzLD8wyBJ4KUDGPl647Id3kxpC8vpKcA+j3/t7bgDTWrt\nxcAf3QQau2hOTUqRXQgxX9uboR7d/W9iqxuFc+D+c7L8CZa7KaMl7Po1vKpr\nV598zYW3mr5OjcLVT0VvDZZujtBnBhp+ZRh6dInaQHavA0QBcsxKzkJBXbtn\n+HRl\r\n=Caaa\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCu5eq/nGRz+d1wwD0s6jsk0V6zzTPHQs4QDd5vjXDYIQIhAJ267exi2ukWRBZduRcztEfFGQUA44mCzbIi+jsjbRYo"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.28.1_1561008795049_0.8866999655242132"},"_hasShrinkwrap":false},"1.29.0":{"name":"warthog","version":"1.29.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","check":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^23.10.5","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"ceb0fff380ab86e6913f046379f98ac887c3300d","_id":"warthog@1.29.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-IzUL4e1I7ScjWpJf73SXynG/CY3DEUWa6NcPuA6b3N+8FzazZ9shSajsM06j5idl6qTatc8SJ/oTYvdc4SjJjw==","shasum":"0e8a710afd838f768075530b2e155b2771f3c1c9","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.29.0.tgz","fileCount":171,"unpackedSize":194835,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdDmGZCRA9TVsSAnZWagAAPAoP/1YJcFMwY7FxJ5xoOYcf\n8nqDMtAOvbhJQ1OHyksSO5gVCxxuLJ+5d3qg0/eW6YfjHoxB+kYpAZY+qVo4\noAtr1TZrSjKHlTdixVui6SWJ3m8ZcDHLqK+SBWU6HCO+WHwDdfsi9tPT6FP6\nfs9YkjiPF/nO8WG9MUP3wh9RrM/QkODr0hnXHu8Wsx2uXRBiCg9gfdkdB+yZ\nInWpbgGjYK5fP+1HhHCKMDic1gQbp75QAVl/PUl3Mu6PnnBtnjud/91Uzoi7\nIAvBOr3FYdKBukD0DUW6f77f5q5+qGRn3XeW+4aaP46zXZY/jvUd/0uMuekQ\nNjJ1HP/TqgXVLbSXzQMAqEGylltw9/23Z0p4XPv0ARpdUgvjLY9+I1+34BaC\nr/tWBl8+YboIq3U/2SEZOFehe4MuY/0FzosS1T0rkN4pd31QCzf2UYq5Ogv2\n4YChy4KBeNLVG2T1oHn8StoNbq8rJQkk2ozkTQFxwEf81cFRJL87ZEhJz4b6\nOd5aHPmEsUtvs7u2yPAc/qo0GIp3WESqrWAURn1XTWVMPffEzB2bPQsKWiMs\nEluiBbtS2ty1zQ3qPHPy0BBmQ2LMBC2oows9cTWAPm6TvsryQsP4cyKFTniB\nXayod/27+JBW6hKxOT0REvB2N0hLYNkouzf7UwlCDOn4vo4wkQaaeqINy8pp\nH20C\r\n=YLIu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDgMibL8Yawvm5NLdhysODFe26PCL16LtPRc8UqCH8aLAIhAKGiXkks5jlwKn30p3IQMtl/ETCxjsluT2FBy3PfUNX4"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.29.0_1561223576238_0.9265461387257283"},"_hasShrinkwrap":false},"1.30.0":{"name":"warthog","version":"1.30.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","check":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch","test:ci":"jest --coverage --ci --forceExit --detectOpenHandles --runInBand"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^23.10.5","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"f5b8b103605867a81b87b81eec50be58077f2a2a","_id":"warthog@1.30.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-e1N/K8mJDEl9fCyWv8LmQI6nbe+fp7Qw2OUTdsgmVwtV5Q0i0/kBH2B0faJrYeVjUPBtshuSUqlHqUnCDUd3QA==","shasum":"c58e7e02e37bd97627174474dd231f40488b6cdf","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.30.0.tgz","fileCount":171,"unpackedSize":195471,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdDt0bCRA9TVsSAnZWagAAj34P+QGxU6SbYRv9Yh9A4eTi\nb+0Pn77ru8nsCDApHZe+nMAkYxauHDKJF/PR05SJ6R2DC/YAzOs9Sc2e8+qj\nOYy1u8ZGt73n4/q/EdQDwbCUKlXTVR7z6C8HPeuBtfOcUAxeO//X5VIQrOnV\nH0jlU3yhcwIyysSEXk2k105NmmIvWlaUoDgiEnBzRvnvCUHe6ttkUCKFt9J7\nG4FRbddFQW+t9Z1Km45IHANJY0AX0nbrWNfb8eMQ9skGMtz4riPoqt9SlLcI\nP7mZp2VxkZTNMLvoIyIi83F2YHnhV4VQbFv62R6Pgs7qaQKcyj+v6UE0+QQa\neiqfm4Ius/b/DEvvq8n7m5kDzseAyJRv3wWpjTKVnB+djiHQ00WCQiv7UT/F\nUvj9j0f+DlXgDc2RBvyjFiDiPqfQABIJsC1USlPrw03kfkhKyYHgZowJVVy3\n8OyAeMhfAchGbN/d3rjzGFZPL6MM6TXYRFSg3yJASjS5o8THdzjcUlPIGpRU\nQU+/AEaJIdBRik30R/4wHQ3UM+NzFNjpPdyJEaW6pZHj2+X5mhJ2QOXnONJH\nJb/uDfOjh5GNWK0RV3BVVUdafmhtzptnT4FhvB5Bz0A6Z9GXanHrYawlOOAN\nSCpuW/mkGehHqO6yqnDWitiGxR4os8QVAt0OiNSaztwrPdqUTlbNhQgv5sAe\nHUmy\r\n=M+5q\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGcvTagCS2mlEjQnmR98GHsbw2KPKBFcyVS93sWXsrZNAiEA9uq9OGh8xDQLQDCvB9QaEOoQx1JOVVQB96O6XTnIOyM="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.30.0_1561255193259_0.33004423675288375"},"_hasShrinkwrap":false},"1.31.0":{"name":"warthog","version":"1.31.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","check":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^23.10.5","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"55537353929c3542e9f1d52abbad0dd580d1ba73","_id":"warthog@1.31.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-c+136IIWcKmi9uE/beiOOghneWHjJ49IiRZmLVMWJViogEtOhQxq1epoK+qxZtS2s4K01+u71HV3D4LkI6E9Lg==","shasum":"83fa4e7113766140b908d858073a51c971fd5177","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.31.0.tgz","fileCount":198,"unpackedSize":211519,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdDyPQCRA9TVsSAnZWagAAlAEQAJZTau/rJ1ERdtwXmZu4\nn3z6fqM5a+YuVQny1p6vkOffJR1i4mEx8eR3CiUQ45vkyDKCX5plaALSCbOZ\nbXDPS/nJyDqTcJ4xcs5XWvhYXafiCWeYWQC/ZBJlJBYAfgMDK1SIkz4WGN8L\nN9DRyugtpBM5brS0aYYJ3oDjwXVSVuQoZ0VpwNm2uZi+M4t5ebrjjCMD0ZiW\nWCzEM1ODYgnA0ujnwqtRvsE9t+PiGUuWclaq2P7Pz8Nw2cmHsJQ+lH00iWUh\nE13FTPLJjyV3Ol5/oOS0yXL6YgDzrKBFipyZfKxn8eqlnXUzfSD9xJn+IgZe\ngemxkK/cjhMPLdyqDbBgZH68Y0HCmG4KeIs4oam9S7aEfa4099qdZe+WfVl1\no++H5gf+ACp28d7suEzqsmwQr6K/XYK8dNYwrY/lMJeL9vCfAj+y7NfUnTgV\nz8j06iqhASkLIz86efrPoZNJADWRkF42hA6zFRIGYDEz9mHBbt0xkZxr8OIl\nME3q3tIcc5ONU68fcKIcI2Nw35dZS1dgYGa+pS7xv4+AEs9+8AG4LRsRipLG\nxpe5z26u/oHcxujZzvPLzImPTZ89T6qCTfkGF4lslODENIs8iTqhAGL2lgRn\nm17iepB9q4eX89+Osroivs/Jk6DooZ1aA4FLZg/G/t08fsnbhcKSxWO0FOeX\n1JN6\r\n=2Juh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDUY8QiMcGmDwugF+V7PS94xZOc4aeGTHVQr9siR1FFSAiEA3beRMHFLtQfU1yidXkO5hnBPifszE6d6SExdVWiuyog="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.31.0_1561273296125_0.3901006061237098"},"_hasShrinkwrap":false},"1.32.0":{"name":"warthog","version":"1.32.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^23.10.5","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"bda6eb4c27440af4a999cffcfbb84b1c9f35087e","_id":"warthog@1.32.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-X+zDKuPe3ZkZ5oNirfe47fI+78EXOnd5Wc3fGrGWf7DpgZwJXmf9mrkhwVTtmTkhZMPHvkY9u4TqSZsWPq02Hg==","shasum":"1f0cc3b023ec23f83740fb40c3a3d56bd5f91755","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.32.0.tgz","fileCount":225,"unpackedSize":235013,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdDy8/CRA9TVsSAnZWagAA49kP/jCDCSnZWu3Lhxf9WY1d\nNFMwgnWYO1FwnD/YOLotSPTapQf2OdcVydzl4gtlSrR3Ii3oXsL6HHguIPwg\nkaOGKVL99jVuMiuLDP2HLXqIJJ4qxuZ8GuzpkMf1xhe9+TsU01jqw1vKxT6A\noUhVdhH45peDMmdCEvhWZs4Exw+z9gx0Ic/J74vKYOdW9KUimn9A1XiBhcjB\nFylsW9+tMPN+y+QFRopXXUyPBGIzqFQYph8iaCVljv+01pPW0hPRYxi9LMuV\nd6b0x2R7FaJGedA6e6inG/sIg/7mAwQpPth0RUpAAGmrr5sBemD+NCe/2sP+\netgRt9hW0QgpFCqwMNSPqLFJk8aG1h17gu+NCuuHmVaWuOyiHMlTj3qE4p8m\nA+Nj9qBXeyH0xGcHxnM4QaEAScpPt8ihwoQoCblUh2CzTliOI5YJI18+rUiK\nXtMPupNwclNV6YnD8TbeSADHk7Ovj8q7Q1i3sYbMWaTiK7a+V6MwPYljMmqp\n8qurH5dRqI9vK9C2D0ZIHq3op5LIKAqKyzH8cGakVJlEQGOkqS92OHqwogfA\nC6KRP7xk6naR6r3uEsB6FkgSdEtz16l5OpSiI5hs98U5GAjXBcnmJGoBuOCu\nPwNmYFTjEa8pkFRWjpqMymjjOZSyDBHbye58TMnnbw/ivkOIvts1o0E9sych\nvwgz\r\n=YeZZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCkubDueIiqxsiU1X1MloJhX5KEZ3h0v5gMKCoh2Cop+wIgaECiiZgwyWhh/WJLOECyvbtKoHhNfZDELVT1fqmlBvs="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.32.0_1561276222551_0.8007948422395823"},"_hasShrinkwrap":false},"1.32.1":{"name":"warthog","version":"1.32.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2","typestrict":"^1.0.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^23.10.5","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"ea996e7536332ac35ae0e11b774a5a1ddb364b94","_id":"warthog@1.32.1","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-ZQEvTILK9lByzG6eWmp+atcMOvxJp3i3K3heV7DXEywqmNAfZN3iVSaledO+JvwHhot+KBGiMoEK0EAXjFEIFg==","shasum":"fcfd06d3d9876c861d9e754e442dff9a23f93a2f","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.32.1.tgz","fileCount":226,"unpackedSize":235882,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdD51gCRA9TVsSAnZWagAAy9cP/iLwJetJECBMaTfn7Je6\nT9VHzo7O25VWhm185Ckfb/uehPDeB7mWLoFlZ4OrkTA+shzdcFEs3Ec28Vlu\n89ZM7dDMzrYrkPAJbAWi/uqe4JgM4uZ3Q908MbolOgVKxHqctwYnQjGHHZEP\ns14mozO5kReU4Bwb6DYHPkwI73yWkHG/GEzfbv1ZgUmsMpf4EB5yDpHjIF6I\nn+ErltaZ3y9hcykZonexhV+9SD8h0ag4J7gjVOHJAXnjT0VKI18y5v4Gdq88\n+n7jbtIFKe2vCk+iga2zRgK6tUglGp161S0eqLZ/0U4mJUZalMXCrdqi/YJD\nRBaXeVznplnW6myh8dR62YPihF8giuljft6JuM62yy7bWwS4MK1qlu7G+htZ\n9o/H/XFVLWXY2ox0SxmQwAj6BEY52uBW2Hwo3k4g12IeSiFhNV6uwAoV/Lhg\nj8r0lPYwiuH2pZBFpNeLWZ6SoWJ36D0Bt1SQBg7MccKNPEhnK89qnqI9dR+d\nEBlx44nWrM0IQshSII5sbOFSvZ+K+oVc0AEDRbEaMtAoS/Lbx/kiVUN2Pat3\n9h7fcxkNwDdZFPsKbg0VnoznQE0p3X3GfSAIwTvYMjI4/q0zOKYe5JPju76a\niBsoc2bCiu+67qx4FrI5wYxjdPHIKkn9A9p4fgYx73RMlK/0+hF2OotKDb4S\nr9n+\r\n=qd98\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC1LZugMCUEJex7D/uddvECvK4W4KxJrz8l6thbF1fjDwIhAPkdb3XJ1EvLRZzYX3ZfYV2Li5/TmrY/ibGYM3SHWXjp"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.32.1_1561304415214_0.7611349659110838"},"_hasShrinkwrap":false},"1.32.2":{"name":"warthog","version":"1.32.2","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^23.10.5","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"83fb1b2f6ce58f66e970e7f3998d9695d8927270","_id":"warthog@1.32.2","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-PXE98s+DBRrGhDty98V70FYwBSUBCxtD4A5hiUyoln71BECsadIR2Qq7DdrjFAY06sAmvtJrO8+21TbLNvLzzQ==","shasum":"8834f6ef3d45b35f428c31f69b2f61374c5ce400","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.32.2.tgz","fileCount":226,"unpackedSize":334138,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdD6EWCRA9TVsSAnZWagAAD58P/36nRVFMHT7T8vmjHh2a\nrK/NoMePE1D1l55dnIdBWgxeAGbJ4Jfj+cMBXe0T/DqAxDbiaW2owAVTA55W\nHUeMKLWIyyhKz49kN/nZMIoerPJRwQu1YH/MFrFRZdwu8cHBZSj0HoF2jFne\nvYfkJFXUB0c1YAky4HozT94aBt2hhjpI5NJIzomAffM89DssYqbUGm4WtTuV\n9PaJr8iBIFqL6QXGxTD9r5Oe3Ace6ceaemYOZXb86gvEepsAv/H9jOgrOqe/\nAigJwI2sYUVhb+QrVsojaItz+B2H6/CRwdxQAxlM0Zzaj2OUGx4LosRj021i\nKA2rLDn1rGI9hE1HTJDllQjO7gLWPTTX78M45dy+fQYUcP85pW4ad682ejmb\npzNMsQB8U20iN6tJ00IPnjnkSTPbolmq0BLfcx8AV8CgQXCP140sFIJaz3BT\nZJNYNM3F75Hxq+CQG3PnBUkyzVaUUb9e8xGT1qx+KI0eMIcpNeh49ONbhrEr\nk4zsuU5ox3Upu8BTWV0opUXfl9Rm+BmqNvsSa2Oaxw01Pb1ch3I0byQc+sso\nk1z8DYGcpHe55xuvkiq4kajIMk6A1l8s6hJ6bLUdQTQ55TFz/rhe11WzFiTc\nooRhvHgkiKgTjb0bfYYUKKD0+tGjDQEMB5qY+EbLKy20cAkQCDKNx+v2wjaU\nxJpF\r\n=7ktB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCTN/OEF11MedXnzmoU0HieII007OftBsmhOxSLxzmyCwIgbJoEHrWoPh6TM7J5A8YyqOfbQCxriWlkIKf3BEu5MKs="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.32.2_1561305365379_0.7971795246438333"},"_hasShrinkwrap":false},"1.32.3":{"name":"warthog","version":"1.32.3","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^23.10.5","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"b877d917aa1f4c7c59880920774c3daa85794eec","_id":"warthog@1.32.3","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-FVqm6zPA7COIPHdYr/ug9XxZJR1xa6S9c8allFq+GqqTBQHUp6JUkuarBzp7MWlAr0Z5EzU4filizHD8MchZTA==","shasum":"56f4cbf8313f43b47448ba446477e7ee51b72503","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.32.3.tgz","fileCount":205,"unpackedSize":297343,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdD+IDCRA9TVsSAnZWagAAn0wP/0T6XinipM085xYhvzUD\nlitpNdkn7D8dsZRtgPKElW+6TneuZlbAGtxwvG2GShondr0WvKPJ2A7CNPje\nBZHGNtvGQHroK2y6YMHY8vXkiUoS4MbrQlm2bJA0ZskF6VtdRlgyKpP2It89\nZ4kpUzgVYOmTkbDrBN6Wf1qK+YgF5XHKSzj+eKF1eO2EEndrhHxhuhGL/WWs\nw0yflpPVTYhdLO6WE3BEc6EWTRNtecoZIYkgh3k36M5yUgtCMGa0A+kGXJpo\nY01senCgg8YrcQM+CX2xvb5GOjCbbq04qdYpH6fslf0p0TK6UeS7ilrx1spy\nYvP/0ZThCXIYRDrhgfyohlhw0p57PLnY1hJc8WD1RzEUOUgoKYC7bF7rDumj\ntY2kmhVi1gMBtjOV5t5oc+eR5b+Wwj4sEsNIVi1EXkGuZWh7ImN/KeDbwTm1\njvBNhFkMJeKF4A7YM0DXmCHe0SXgZHRliGdiL8FdkwQGv6kTRXObdHD26ixp\nRMEnPg+iqyAlI7qe4Fgbjkq30Y6DNqVKJkEt5BDakV+Tj6gjGYPretaF7p8p\n59uuOMx1zb8RD35IG0fedbDB7bY3XGvLorecHH7ULf6jCSH0hnDb4hABkZsC\nnK6KR06fAHXEIoEu93mGm01ajRmhVmCZ3caSyquEy8AHLLTjugx2/KtNUuOE\nRE7J\r\n=4RgC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD4ZHajYzH3BlOexkAI6aUbeIzhMFpEUwAuWOYIl9bp1wIgIvigkh4K7W8t0jV6I+8+4OWMjDv28Q1Xf4XskAHd60I="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.32.3_1561321986760_0.6823764270230273"},"_hasShrinkwrap":false},"1.32.4":{"name":"warthog","version":"1.32.4","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^23.10.5","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"5878366a4365c9f1cdea4e44519dea127c7a9a62","_id":"warthog@1.32.4","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-YJf8ux7SDp+N3c9f8XnBB1qmeuuW1FRWyq2NUyU2DntKDx0GTniCVv3q6IfC9MuLI1AuIXokXT8Yh6Ti0hrBDA==","shasum":"d9ff0c0a00561e1590ead5744aa2d10de05cbefe","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.32.4.tgz","fileCount":205,"unpackedSize":298257,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdD+ZgCRA9TVsSAnZWagAAqjoP/RiS0ni/h5v1mpcUbdN6\nhNaPWi24v+FRaNQmj/8ApBVwTdErukFGTw7GKHVv887HWqGXheiZetRjdGs7\nuetXlpAMe8ZjTh0KhMPCn9AgDb0uEGXJM5iFxarqM0xd+DUsdtbSpgh92+4+\n712CCoS2pI++UqLYKfRFVwzslkUXdRWwPrbPe0j0Qu6QQzq4Dgn/HUCahBgS\nxXfIgGo9N5nZD2b8QnoGwxyVVtaVDAKKqlPd/Us8CCs5dHvyeksMIyf53moU\n4+XgvMhgal+I4NUIxuu3GhO237p0vt8rUPozQsKXyAdsNHMkY6qklNH9Ybf7\n1zC160STB/jJU8pZIfQAwnza3QB3C6o3/KGOHYdLDth4VnstNFFSvPz3YgRm\n1mKkZxK9TWOJrpBG5IZtgFsKunxzn6srgq8X2kjra+Ds9eI+23iVRza4oZZF\nj7nqGpF/e3s95zrIfC8e3P/4iXd3khsi4OovBxjuhDMV6RRdY7lWsQNITCFJ\nfSIlsDZO34kCINGAbN9GGikTU5DtfG+o4riHd27vktBPfgwRYhYIVJ+IyjhE\nUnplMJkw/ZB30xdpjtqMlHAmxnOJxxHHksLsg0CeKsy6bfpbPaxHiWVemQ4A\nLwpQV2MTkUIAmH45zg67BEqGlTDpoNQitWGCJ0l9bTHBgT+NrkkyLnYfYZVL\ngxXk\r\n=B2mP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBewi77aFPPm1lhUSt+9wu3cdFrRkGW9WRMYMA1czzD2AiEAmALWrvSIwTwOHvXigJGLVZaVbqZhygQuq0z0qWWTXBE="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.32.4_1561323103812_0.622459374139128"},"_hasShrinkwrap":false},"1.32.5":{"name":"warthog","version":"1.32.5","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^23.3.11","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","husky":"^1.3.1","jest":"^23.6.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^23.10.5","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"37858fc7c3d1fb47ace77389d63c2e79eb03b828","_id":"warthog@1.32.5","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-MiRopWy8L5LJTEJalVFfqv1BiiZ2JsmH8gY7nv7hFwAmz7QIjSdjwpJgknc+S1ZK9KMQ600EYXQbB/h7MdmO+A==","shasum":"e17a4734f0e955627c2567c5271db3625cdb2cdc","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.32.5.tgz","fileCount":205,"unpackedSize":298257,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdEBKSCRA9TVsSAnZWagAAGP8P/jgS5VDlpmeOuNa/qskK\nxfEB22tPkmlG0TflwQtMuKS9Ag4OzGKhjz9pBCKVMVxxmvECwl9YnQz1qU/P\no0bZH6K6R+IGB17Q3MQQQ+xzwn8er2pFO429G+tfcApzgKeXCmgizaEofBAq\ngaCMBpym6B/4ZtNc9Q6BB+lBLi6pC3Kq0q8Sas79+iEGp2B304Li0shn7r3Z\nsBlp4d8cA2Yx4GJ+niheR7yZ31bYInDXC4JgmlacZrJveqxXzatv2FBFOFoA\nXnBUOIiaoW7FF/UQGLAHGYbnE0XTZTxGKxxyx0C+iyO5FeFSK9UPZFaIHVXl\ni4VTani+mtZEly/s4cG+tdBkAyjGKS8WHLAHruqJwwJPxE4857ufOzC6cPnw\nlMQ+6XJmcMFa83fCkQPIKtOZ9GiioZRkrKbFi06wuZsqtkMukGqGkE4SGZPU\nd93AXNsoAXXTWaw9GN+tgX9m+q6+u/e+Af16rsJCX6QpQyGkgW6W5QaHeifB\nbynb4NCmfClSwMdb0TCrCrHG2ghiQjlBcnJTW2UQjJqhTawLGlLyDlU5vNKR\nWtLzFlWTuSiXJLG7ebths4aa4SuJzLDpPBwuLey5aNPswnqhxs0w3HKj9Hxp\nf7+gJbtsSyj5/kgPJ+nvBrGczcP8gEiqHYx30ceBYckyTILNLGV1ryHCr4aK\nYtWr\r\n=Oe7F\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCx7SpIT72lC66phPQ5T/8FFHX9uqoIOJJh0U3S2pJUTgIhAPGqYkgllPKmIJs9S2Pn3uE/ywiFV53C+lEe++tbsKsi"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.32.5_1561334417708_0.969385872454056"},"_hasShrinkwrap":false},"1.32.6":{"name":"warthog","version":"1.32.6","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"0ec389fc22bc768dd951bff436dfa543c127599f","_id":"warthog@1.32.6","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-w6J2Dn0+Xxv7S23qqyl6rbBlVmnPAiShTYHj2SIq5IbTEx0nMqYsFUL0p6nOCXfgPjcfGWm/absbmV4bjLIU5g==","shasum":"92efb165cccc0bc09a51e16aff73f073ec5eae82","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.32.6.tgz","fileCount":211,"unpackedSize":302401,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdEXouCRA9TVsSAnZWagAAjtMP/jbb941lGlzpyySsm+38\n8XfKMoU/R5E8w5QDyqhJDjScewJTC92bOPSOL7J+POjvfWEt/R6shwPfaK2s\n1y1olc355UGHzdqMKK32FJW/i7UbIH55h6t2dNZpA5BOoyw6jY6YNoHkzzK/\nb7Mi9x9XAH0WDoylUqvbMkxup52BY34h5ttombUMMBefgazRRMgkZm5ngeHs\nMxFWd3+2pdY/WZ9WG0tEiZXWBOtrSKN9THYH2PecwyWSidX4MWXuKwfI1ZKf\ns5KLeAN0UuGpa27aaIZY9ZYLSKSDxqAh94AgLCMiGWHNL5mv98nDXW3dstGg\n9DZdphnb15DM+PUCn6h8oU1uQihm1elnLt+qOuPVRuxRcxhvt59BtkqZ3Ti9\nrRk7OUzSe/Xq0nmbZgd5z3ZWvCG5zOXiQDWCH69Y+etLGaN1ggwFJMItb55M\nxl1odJ0T717NiTrHcBXHNblk0hETN3q7C8NBm5JCRi7VPHwPEcDeymGVtVm+\nB4pEDfVm5TZZ9ZwgM8MUHFcUCj8KpcoqmCucUunmnwwu7szZJgr70kL9N0xL\na3P6gFUL+eG39aG99tJNb7M0947fi6HjUVh/FAkpV+nKYppuMBW4VVeCaz+K\ndGq8jxRg9DOqFNiRWTgJuIOvdm6nksdXnI/wy/h+mzVkICCOSxuewTfq7vbx\nBtHR\r\n=AJf7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCzoqqiM9pr0eAe/Ovth8ZH75ZHCHf41e6u5VL/yf/YYwIgQron7zlFV0nxVcFdGPFy6c05iPOE4831ANMv2VNYI78="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.32.6_1561426477302_0.44759443507247965"},"_hasShrinkwrap":false},"1.32.7":{"name":"warthog","version":"1.32.7","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","typings":"dist/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"3c7a5e970bc5dc0dbf98f371369aacf314023481","_id":"warthog@1.32.7","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-Fwa5lTHYq5aMWSCzxA8MDrwW82DHWOGkEyp2uQ2tn/ip1DkDOpymaYWT8xnSEMry43xlNa1Nj/PXZdtVKIgAGg==","shasum":"3ae5ec5c6dd18e3dbe6fbbf7a758a04d363328cd","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.32.7.tgz","fileCount":211,"unpackedSize":302381,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdEXvpCRA9TVsSAnZWagAAcDwP/0eF4061eC7JFls4+GI1\ncs5rw5b+X3HOyvU1HACGugA/DcMVoTD/uFnd8sIOik8V+2B1thvmtavk4NIo\njXCL9/a6gp2WnIYVNPnaxQZ+prq5OhJQjRcn60ER2j4nqEgIJ3Z+FVru6JCX\ncDKf5/80881NKdiAm+/0YeDlsKiTu/pBQmrnDg8TnWkUOjXhEH7oZkAdTOPa\nSLCSI5HXYP47x/U6MMmrJzHGZwiRusAPBd+lU1GDor25HY/QCHQibYAICsAX\nyVKKeLTDjgIjaDJ1xuoOWadDFSPNq9aQ2reoTNgo8ZDo+4MplIk0hybkwY0I\nCMZy0irXH7erZGoHC+gPJ0a+j2eimADvPmjG6rAoMop9HPGf7UzMwbFNSEDt\npwRjrf4yCxuj9o2tZ7QNRMc+Gqt+caSJAJZXYGt7+A4exKLXlQMw6ZQlxY3T\nDvzp4KApMUMyqzUhAiFeqyvwwRVC48Eh7X3p3TWnqGIiQDJ/ZST5bxIA2z9F\no4aEpxyZAPOaTiPNIbv4jp28D3AQnVTuKzNXZQ9cpbAY6x/0CYhVm6h5YD7A\nlyq8FYuHYAxK1OtJEbmmk90pz4iFsp+dwbKpF/zJsPntk4RqhO/JJsRcKm+H\nGaDc+A4NvewLnQx+f4XZtOyejVyrz/kjSQSj47gZ1himn3WLwOzFXweMQHE2\nWteO\r\n=CeFm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDE40GHk7clHsHhLPSeRh4mFguza0XaNS+l8lM6/au96AiBDKPU3owlQEkNZJbHuS6v4CHpWGr20e4I1Bs48n7xSGQ=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.32.7_1561426920762_0.5320297615381828"},"_hasShrinkwrap":false},"1.32.8":{"name":"warthog","version":"1.32.8","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"3a0a64c114117694f6b9a9c4e7fd151c0aa372e8","_id":"warthog@1.32.8","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-fi59DAWSfro84t3SWVriLZdUM9aMhe1SZ6c308L+O84/QePJaXYhaJ6QJNua8vX3N1K5btacCjEpJNsW+iMmgw==","shasum":"efba9b9aa43110e0542d67708d1c12267b04b04d","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.32.8.tgz","fileCount":211,"unpackedSize":302385,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdEX0hCRA9TVsSAnZWagAApboP/jArPWRQWQDqbNRRxdcc\nYsKUsH/KJfCEbT0VQ5xbMn2b2Jl9cpStAkFrpuNXuOr5tK2+wZetr6RmsC1e\nON7hbXncuAbz7NldvlAf4tH2jeGkbJGGoooIU4uAo/6vpIH5hskKS6VUlrUP\nurF5l9gscFe9LOIEwJMc4uyFB1nRJNcZ4R4LBsQCzRg4+9bizF10iWS/HsET\nRzY6A0YpMU5FdbCxWdnBZY4r+iUcSuDMA854hdaVZyXaroce1agaCzanrR6n\ncur7r+u/UxUdZaNeFu26CaskZETUYzebVtZwMfnn6+jgqqtTmLIIxvmKuR/Q\nIdcuvrVj2L+5rJ2sg1HGWceRQNMZgeKFikuheBn3Jc0IyZlyA0NZlipNShGC\nX1EuVJQIsSmdmlDs0v3Fb/jAVaDgXaXQH+RXWgR6gcasYPtgqpyK336XsE0M\npYOw66/DjtSwir2LakvWPypLM7BMoYOgZTlyQOEqT1R1gFgIuU1r0tN7e1E/\nUk6sJ42eqoDeLboLn+ze/tkBhNyBKBFhXVNa/eQE9PSFRhD+EV76VDxd4gHs\niuAvD7gr3JymFsW1NBhn0fd7YaUq7uqK1zUcfCb1pR0QMr/nqxxYCsY0E3SB\neo5kk0glM1P+nk4nZczXEwUbjsQDOLmhOR8P1H2fy/+bb9XnobiZCAx9CWRq\nouxc\r\n=+0kj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBioaXvMDcKqxA56xZSi0YXXouVRaCWU3Ob9SZO7IkaLAiEAgeF/fnqRPSJR2Nssr1gwudIH7VbwUHJBceWdyEvw3UE="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.32.8_1561427232990_0.46311783591699607"},"_hasShrinkwrap":false},"1.32.9":{"name":"warthog","version":"1.32.9","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"8212aaaf1944bbad8efa6fa00309ed790e0bb498","_id":"warthog@1.32.9","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-b8ueuL8Wqe0G76O+AZB11H8UeS3ssYG1EX6GSTHS7e3iU8PWVZyNcN6GR2YjqYxxbGi+aZu4WgUUdJU0djhdZA==","shasum":"38281153180cbb18837ab51aef78fe7051bfa27e","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.32.9.tgz","fileCount":211,"unpackedSize":302565,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdEYLOCRA9TVsSAnZWagAAKzwQAIX2F9GAdahoQDsQXMuK\n+4uao0zDGTVgstnn2VeJ9WNEUd4Qpf72v7KZDYalHy/XINZXv6R9exfsJcwe\nfRyNcbwTVl3I/0YOKuLU6u7Dw8j2P7Mqlou3RYQYptsFV7foWa4ha4gO+uGy\nr/LY/LHjB1OYulaRLt16FILVf/eJxtshn9GRLgcjkwm3VOgcoExpAyDO4bNL\nUqsaDxVRooChvSl6I1+BWfPjpACHXfvxFyUPYWasT95uhXd6Cd4NWeq1rL+O\nr/OFCNrFxY716cFJ0gC6d3Iyl6EOShMARBgzDDU8qHVKvVuGf+CJkoe4JH6P\nPROPKLrG3IQAxR7t9fDK2m05Avs5wAM3H+F4TOWb58t0mT3IO6Mpv3cu5exv\nzK+/1AnQvlVUgTTW1XOwFnHogEf/vFG7N7JDdc/tU53lU0aI36zM7RsQgMLO\nk9QCHNXBfm/mYbWlRF1Cx9ni3RODbKzHnjmxh3WwwZC0ht98gij7dtQWyx4u\n6iic4n11TPX8QzJu3BGEBk/F+cft2lo9/Cdh+uObml8zsHRwr5ePmYebcet0\nCDQd6Gwchg8smj6FhO6N//d3ZPP6Fu4w5wBC9sCirGTKAe9bCrUbxy2XIlf9\nY7GAxKgDFMi2VPEFsVzCHyWojo5v7OcnmRBvr0LtbInQTWmYX8vTomw2Zu5v\nSR2W\r\n=oEOw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEcOuefeLiQF12fL3sS1SsW8L6qyQQOsvaTYj3dt9SOPAiBOfdgI4oIInC+X2V/HKKdp3ks96wGRdQXp5vMer/CCWg=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.32.9_1561428685510_0.7693495591551955"},"_hasShrinkwrap":false},"1.32.10":{"name":"warthog","version":"1.32.10","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"d30bd360717c9789e0680a792eb45384bcfe9bb5","_id":"warthog@1.32.10","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-gJtvZnC/nRK86lYblv/YduGpatEXFqqLlMkdw8qFxApQrCMN3jf4LOdck1jvTlqqDUbvXH766z+dBbufK0jU7w==","shasum":"edeb517184debc7e596a8cb4278a3a9ce5970792","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.32.10.tgz","fileCount":211,"unpackedSize":302565,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdEsALCRA9TVsSAnZWagAA65AQAJ57bNha1CXgW6wjNQLA\nhhKIikHoZwEhGM72H33My8sjoMYkgZ29r9+qs7u9uICBkZUupELK9FOF/NXo\n2xHmHmU9SRzKLBX+xnWWWy4Ve/dNASnASitVQXUmaKAx/66BePfe2x4WK1pQ\nAMgmlTystof32k912K+rEkKPfKfa0y/bL45eO5Uryx6OmP/iIiEyBExMP3WB\niPg8iz6ocDn+e/q7vQQXfl68h/Vs1iTia7P82Ibh7yEZ8h7jNsWKUTS417qo\nlh/XImXhMQlYHM/ia0TAFhJmAwOVxbGY0becaKnTjVwcJIYwZvu71FEtPH4E\n0UGo7qInkJS1FmXS63cSEeVPoGERATJexQ4oh3fNjPObOM2cPQsX3Y0N1E/O\nyubORZYXBVjSsqH6XAqFJ7Z86ERgnuAP3q6YzWNP3BTQ812N4Joh2j9TsY/D\nOFJ1H/U0Ir6R7IanvWL5wOR7ov7NHo6i6Szj6YZrxVxnmIhIjPWoLbG6mGAU\nvXKisYaYsi0aiRClYZNPWPX6M8YAyjgmn7j+7FJh0dZ+wP1CWJiEP6NRdawD\nvLu2i9p7aRqRzMaEB8vhwptNBfTzD/o/a4+S1P9cvTrlDtYSiYMX7Q9lD8Do\nSCCvyWOkzGxpdj89Ffl4pJ8dXrOuLHfk0TAxpJREa0gbYuEjTSYJGQEWJeUw\nwv1f\r\n=yer5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIB9MAnId4wgSXXj3GjPkj3zJmtCI9gVNd8WsvOKoSq5RAiAJ3aLwg8WUMnUqeVwbvMvV9dptT9kzBEr37apFQgEWFA=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.32.10_1561509898599_0.32497690951833147"},"_hasShrinkwrap":false},"1.32.11":{"name":"warthog","version":"1.32.11","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"223c13b7f2e2228abe3195a8408885e4b2691860","_id":"warthog@1.32.11","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-UdRA6a+SmH1dWS1MI4llXwVlJxzdfInazZSLZIHwDSkhRc+ZsYehV1RgLwdHtFcbEgsTr9RUeb/6RFyjA9f45g==","shasum":"8b0fbf8a2e1c777db4fdd822323ca79b45e53f8f","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.32.11.tgz","fileCount":211,"unpackedSize":304837,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdEsNBCRA9TVsSAnZWagAA/woQAIGUaTcKukpCK9K8ZpLO\nMTJtwXfgAdK4hp134SaG9BLvBh+RIa1q+hkZlnN8kXal1+Agu7GijboKSu2P\n9yHlYHbl3YHuQ9RorM1q9X3//IrcF+wH+suNbwplmx195PgWthlCXLieJgZK\nE/Zhidn8F3ANKPdeebmiBy9sSLUeau7lzQMI9PDqJICoFL9fyBnn3hi8FNdC\nvUXUZP0uyejcp+2prXo+sg+w1m7gaxsoFLULqZaOBqKG5rLW80CuI+8EDSC5\n7R/357HDQajgET5dyk3RBUzem3M6L8Q6RO4UCEK6Gp2rV7UV7glhfwIsT7ff\nGhbr2z61Gjjkp2y0YUccyNujFcbbUpvrD5jSz82Yv/vbaDKu78XzItHccke5\nWi3VswvkVbMwW47TklD7GXyZljbP+zyDMGshQolK3iVvTHmYS5YZtSK/Egkc\nOLQnsVxERreHvRDZhBooZJ5+CeB+6ADNFyflqKs9ouu80d9Wg5+y1GIae89l\nlvNbZrmG2QBBztTRSeSmAbjTicRkkhr6sIRooZGKPceIC2GvFSsR/SmAA+/z\nXnzWIjKuFl7yFQwVwFRp6I4PjOSzSQVmJOPrmDycnh/QA88YaDN9llAfldnv\n3HGEoobUHzZ7rYd5NTzL2TSWJw+Sc4D929PMb1ai19BwskUdp18xedopy6ue\nih2p\r\n=zju6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAYp61+NDe7do2RTIwYoLcAINxUH+5nE+4cqWdJHNrFKAiEA+SyxbMdjm+/28aL1BCKP6BdoEQhxEN43FyXBUXh0JjI="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.32.11_1561510721328_0.15489427490193197"},"_hasShrinkwrap":false},"1.32.12":{"name":"warthog","version":"1.32.12","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:seed":"cd examples/1-simple-model && DEBUG=* NODE_ENV=development WARTHOG_MOCK_DATABASE=true yarn db:seed:dev && rm warthog.sqlite.tmp","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.0","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^6.2.0","dotenv-cli":"^1.4.0","dotenvi":"^0.5.1","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"f5c16bd515a1a86fddf4396d04978223a5c289b2","_id":"warthog@1.32.12","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-1d0BEjrHCFxMwFgls9MNCpdWYKJd/70EbVGxoRWL83aLtJwPNKimqTae3gNO8b66fCAnX02zkysmpbesq0/vRQ==","shasum":"71d27a1de2e0f07a8a558aea6ba86137c1653702","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.32.12.tgz","fileCount":214,"unpackedSize":308373,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdFZ0aCRA9TVsSAnZWagAA4NkP/A3cIcRs+7n+VgnNMhFE\n+ZKOPHZ/zxSAEwDiDym2+HJENW3YNLtWO8GrxBmt0YqETS06VrFpAiU8ZTIf\nzGqtkSgJU4+X4lY2sR9/KRW0jLBAGjnqqs+JNXIIrsghteAxAUXC7xk+8vkh\nNMoD8TVzqYXXnyLvn+/BA6/wXjGs1PlRSibPeABOkSKXUAL125UT9D/9DnGM\n1ByYvGFF2OhXp8neaC50etLqSwWNc5IhfNXzW2JVyqY5XytfJboY4fmEL3YC\naC2/CXvshDC1mDAwmOnCFeqzLZ0TBu8jXQ9lTbQLfRhPmtyMLie/xfyMJ0Ro\neIGhRk3401YXaiNu3gQX+NiSYYrX4ABajqA1pA9Z/aZMvQwps/sVqTtTxWGv\n9LSE73jf2eLs3tcsYJNL+CHgEtpfYgWO8VGBPoAx2W+ebrtOCRZun0kMjg00\nVHUOA7Rl62fvv2M8PtPexBNrCwHxuzQOOmZHlubxfDvZ47GlvuID7ebiM8ze\nZ6f+E/Ppb747F278F1rdXg1gbR71pPGex9mO7s9DxDvrOH8D7tsUXdvVWkUt\nvbEJLQn1/8uKX/CR1GPJSf31Uh9gEuPeJSsoyTnelMPRJ69BSW4yUoq0X8Ya\niTeR6G2ipqFeGYhWw/ZiISdsUyaqs48u8UTf3FUE1XyewKRpInN3fGYPriGC\nOBdO\r\n=Zw6r\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD2+EyEcxhdmSqXBcxxpgOoRMSpcagc6a9OwFLJB0jfkAIhAKeEZKRhfGa9Td8l6Id+FqKxsV1pSdIGnPSQkDxRJPse"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.32.12_1561697561373_0.9565232840224254"},"_hasShrinkwrap":false},"1.32.13":{"name":"warthog","version":"1.32.13","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:seed":"cd examples/1-simple-model && DEBUG=* NODE_ENV=development WARTHOG_MOCK_DATABASE=true yarn db:seed:dev && rm warthog.sqlite.tmp","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/faker":"^4.1.4","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","faker":"^4.1.0","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.12","typeorm-typedi-extensions":"^0.2.1","typescript":"^3.2.2"},"devDependencies":{"@types/express":"^4.16.0","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^8.0.0","dotenv-cli":"^2.0.0","dotenvi":"^0.6.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"4b53e0b5d22fdc3fa56f0542ef9d52eef3770825","_id":"warthog@1.32.13","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-WDmQ5/t/ydsRuhmvqvVQyYmfIyP3ZOQK8ayj38DxekF3nOhRmcklrFHy0sXV994Rl5y5j4+JTNJlgEHtfPvm4g==","shasum":"275a069181b0f6e1487346b3d0ae32c86fb6f903","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.32.13.tgz","fileCount":211,"unpackedSize":306221,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdGNvxCRA9TVsSAnZWagAA+oQP/iwlkDZUzsZGw+D1FSBP\nvKmfQ2YVhyUgUV38RotUf8bmwFvo0qQ6PxMnFF6DAQmTMJP/qCLcdYo3SXsj\nl9/jGLEM3BtSFftBM6rahvJEGH8D6qdLX/IeVMDswz5ZUOEHWeWh6wmi6feu\nB54XeVqGlAHQM1uHS2XsaTEqh1fhf3bn7SVt3qB1F/oShKA+NBDL8/F6FhDO\nzQ6WyyHcV32b2QQI/hVsGMu8mURdYHW2C5jT9MGW9e9bEQihoDGzUrU+QxZU\nPWP/kcaE3DX+4noTU8EaQPuAmi/XweLtArDZfXg9ZQGQ4qVHGGYHbOM5uP5D\noivi+xc3iphUArMMpB6TH+n/BI7MBf2dy1BFBdQD+vwYotGDPrMrtQvNDeRq\ngQbWeY8mhPpLJcOzkguOIVOzmac/CgFXpW/egzhkQW9ocjpktj2UQhFrf3S9\n6jxxkoBkbTZHmA1JbwE+wwByRzV9+HLcpWT9CBuOPx98+Ys92CCK2awF4mK7\np+pnvbKftm0yzwf90RMsj3KqGDnVq9bhfdTL+V6rPZBX0pYQHPnbaX+GxQ1h\n2JYrTlrN1qKB4/iY15/b6BpTS4lm9s82pWzKLDMx2ivbEfx+lxGV4ppqlw+B\nA3FbEt9Dbt03FQhgQt5wDGmR77WG1jFs4PywTtL/g6Mmcw4MqF0I7VeLOd//\ngQVw\r\n=kZ3u\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGc2cEy/439sEf5jenHoRvAYzp8wMPdHrj1Q9IMyV4M9AiBp1NKIhasGE06oo+uU6qaaPoz9AZP0iCD+iiIAmLc+iw=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.32.13_1561910256657_0.11370197770310853"},"_hasShrinkwrap":false},"1.32.14":{"name":"warthog","version":"1.32.14","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:seed":"cd examples/1-simple-model && DEBUG=* NODE_ENV=development WARTHOG_MOCK_DATABASE=true yarn db:seed:dev && rm warthog.sqlite.tmp","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.2.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"c1e1dba2bcd404d18c76fd20413178b80cd71ef9","_id":"warthog@1.32.14","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-/VIhLkRTVtfb4cHhJ3SynvlrXvRvZQgpqhiXJHms6IRVs3dMNrn6pyztqp7bG6Kqp8TG/WC6a89oLHK2D3ai1A==","shasum":"72a4409305513d151891eab6101ed648feb32350","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.32.14.tgz","fileCount":211,"unpackedSize":306270,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdGStMCRA9TVsSAnZWagAAwDAP/i1W0TzLmMUBWKGsREnS\nLuAnoqZYvLI2gBWxK+E2K528GdFvAjXhsCL2f/BftpCbDGXfInpLUdY2BH18\n0gvSD0C0Iz1MdzeFSUoAQejZB1H9C6OcTEK9YUc0I4wUBiZYB/+JKSQ/NdzP\n+oIjES+QHpKO16JLhsJhb1C9IF4fNjgLYnNrYYeHoOcGJBBvau9+BcFiQJLp\naAtJYuLWOmoVkjcxlsYwUx5Gz8is/J8NjN4I3q3o3gNh0F7LJtuYcTT3hXDx\nW7ec3eoJIPngKHIxZqQjs7+13u4MdBa3T7DpoOjNr+BGSqDCuxWOYN5XWJpc\nazYHX9tuIa89apyoGxeqOMzTY/utQHarvsE+H1hzVg2xgdPXtr9xGTCsz2yz\npry+fLmQe0nXcgVJ6ilbKVSZaCaRPbQrQoZj/DnNqtseGJ0eJSZtyeroxc2B\n2HjNh2Y/IDdoo/WubDpor/rYjmJFRe6VxsEiMaQUXKJHsF6j3EdftnQOdd4S\nNJNCcJJuWPXUfl24u4qxW7IXK+Ple4mR7hYRKSb49BjtYtpAN6BsZ4vfLQ5i\ntYuHywyIWwwG61UYuj/FXDPuQwi2nw4ciUnKrAjlj9LD3MbzRzLvujlZDz5v\nBe9v0w53P2/JlhMiHx9B46slWhsbt3zO2tT6rZDZh0BdqHaCH+NKo3lVmp2G\noh3S\r\n=ej7K\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHhwWvFqJp2h1qHJnQaUuReLeiumxYssDBHXk28WQ+VeAiAteVSRQYlTo8ygjqGtda29cjMIMtfUMoWRJi04FxMbLw=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.32.14_1561930571778_0.4030267517516748"},"_hasShrinkwrap":false},"1.32.15":{"name":"warthog","version":"1.32.15","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:seed":"cd examples/1-simple-model && DEBUG=* NODE_ENV=development WARTHOG_MOCK_DATABASE=true yarn db:seed:dev && rm warthog.sqlite.tmp","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.2.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","prettier":"^1.18.2","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"23bec547da50c636d0d2ae90ec6ad4df5fc06ce6","_id":"warthog@1.32.15","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-Xd+/XNt05bwveU6ECGKJgRE4l5fIDaYeVgjGayysNcO+F6UExWH7aBmdQbfql3gO3GFNJef6D4qH3OL6iyCq5A==","shasum":"4fc395fc64abcade74df45f5698451eb82265221","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.32.15.tgz","fileCount":211,"unpackedSize":308485,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdGYIUCRA9TVsSAnZWagAAWMYP/2jLujKVVXC9Hcwhxf40\nwC9xUj3mfg7mYETMNE9CfpJBK5S07jt0O6KDEZUHVz3tBeDUhzQAlWbXDoEo\n4ye+v5j8tga/toICi6WWB9Y8RU8OO24rc4Joe2FO2un5uAoKlE5RCsOwjh30\nxJUmQLjwcac0kd5+7aXB7v6SJHKy5ssiFndbpZPnzFyGToj90yWuim8pRc4p\nnCJf0kApWWnV3Zo4Oav4fVCifj9wvZP5sgYozQXstIDR5x8//OzNQewswDy1\n83pISVnnYCcDKucY3c19F2GX8R3SWrEB4Kp+peW0GeFS3H/WF+Gee8qJkNSH\nZdhPd0ILklhKaVQG/5pucoQbVfQMx2jZoZ0Px6xQJ6INP5LgTVXQ3t74nKpv\nF8kgHWFcGrErnIsh4Nb8UrF+c+JVQinDZKr9ov7we9mechrUaYsI2ysMvWjB\ncb+dlH+Cj5IK9V96WCvc30eGjeXp3bA1WBgtsMXGPEdityGu31Jhvw8gYWxO\nik4xcadeEIlz26f0bIVqq2b6on3Twgg5c1lR52hho53tjYrjeOuorKUpcaj4\ndlIuJ/hgpwzPl08Cg7IIIFEsROSFyWXKX+OZD8EIULROAUDLz06m6ofhA+G/\n9VxKvbvDyBaAobwc8NQLBcNZ9X4mF3x1AGrW8ylyMWfhyhms/OYvhUU2UNz/\nXjO0\r\n=d0BP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDUhyyDfZx4jYnSo7LrvJ7m4TJf4fLq/Z14P8QD610R6gIgfTxrOwjjapbkyj4ooZaOybGTwTNTSwH0fXAwooHZw1Y="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.32.15_1561952787994_0.6425224188128362"},"_hasShrinkwrap":false},"1.32.16":{"name":"warthog","version":"1.32.16","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:seed":"cd examples/1-simple-model && DEBUG=* NODE_ENV=development WARTHOG_MOCK_DATABASE=true yarn db:seed:dev && rm warthog.sqlite.tmp","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.2.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"9121c743fee09e892882439c7e50b8216907c849","_id":"warthog@1.32.16","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-hDpG4ohfDL2BeSlOqPArouQTWnP838uiAjtiSSibRoQ4LRumdOZp++tVKfw153BBSSruWPcYGVIlVxlqSoW7zg==","shasum":"df7a6a9b87158815b61a28d4f6db696d130cfece","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.32.16.tgz","fileCount":211,"unpackedSize":308691,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdGYsSCRA9TVsSAnZWagAAkLEP/15ghm1BrOCSdaxVWbGP\nyKiVT+GU7f/wjRstSB5OcDHxHJQu5QSHIBSweuncbv+l7ihwtzaF17jsS5h7\n2GFE4nW+iYAcH6S78tPsqJ70BE4Lui24PjyO1olvhH26ciH+2Jb1BxJnp+tA\nhujGA1xZV45g15RVToiieSwevMLbG0NpdeuRcJSNbBcOKcV5IOG3op9miR/y\nHCZyx0TE/ND4j+yXiYbf6WvNtFZHWmZayyPOfkCU4i455Fl2w9dvPqgJUI3g\nnwePPoEEbl/bT0ijtNADDYila63agTvOHbMXEHjrTKrNBsbjAbs9VQRIRti5\na5YEFRTA2OFwKfyZSmbujKjAz8TV/rBjH9iMCifxjuOSEhKhZFEJfbX6HvRH\nf9EuU8EAVM8dpGxgp2Jd1ovf8RXZvB+otdq9nl6SaDoBjeMySbczVFSG1j9W\nCi17JyjwKEGPw/vmiLm7qwN1rJL14WrFc1gtHEDk11WGIgcFdXy5FzELqmUc\nPynAej6SxtpPE+Mx7QLYXKWgztITkg+ykhpWaAfUfmS4M9kfXwNaHsa6idIs\nUsjvratlVc20Q6HFrUJVTx/hQqL/7/4JL4s+IyeRqN7LZEJFjD2VDNzoQBKx\n6T5lsS338goVkgLo/Znl42zJTZ0cmxY5nxd6Vdiaph8ihkXu1f5zzIB6GjWL\nJBJ3\r\n=EOju\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHTApVMXQiQI8m8R+0u41ZRCMIL9BYiQMgcwRBQ39+dtAiAOlhg8nIL+3KIr8qYLSk+SfTf7P6389UUQQj+kKf+fYA=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.32.16_1561955090163_0.7007862781607066"},"_hasShrinkwrap":false},"1.33.0":{"name":"warthog","version":"1.33.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:seed":"cd examples/1-simple-model && DEBUG=* NODE_ENV=development WARTHOG_MOCK_DATABASE=true yarn db:seed:dev && rm warthog.sqlite.tmp","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.2.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"9428bfc721efd60bb2122fa7982aaed850ae8ad9","_id":"warthog@1.33.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-x39D6gZ1hwD4zEBg/sm2sO41WY+sqTvetji3yNtRPRdu+WwXLuXUdVjrANUgzFlJpyVXiR/vrNbtX2D5kb/Aqg==","shasum":"5148995151678b0017a9ae9e465f857f935cfc6e","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.33.0.tgz","fileCount":217,"unpackedSize":321472,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdGrZXCRA9TVsSAnZWagAACZsQAI6r/gRQ+I3DmQQxMfs6\nQDp1EnyOIcRjgprEPWHKqNo6nBT/8NktyzSPxFF4vJG2/m0TeuNaxlw67P1y\nUbwQDP6CNxndP+4DnzqGTyKOBHHcOfy0Svo9NPIpPnV9GPd2EN0XY6tYF7Kt\nf4O9bs3wB49HLd6mjd8fRbGi3ovn+a+tbhhaxRIGDcLdCUvkL1O9sCky0JfR\nI6bKGxE8mWayfpQaD2KQ3YueZHlZtvR8fh2dkjUiFFDjYRQGWGu7XsEzumiO\nuVTgFwxv7oo8Mh/2eYSbggiLMtLx8OnV/ADjECMKQHXLrtTuGZqtPjelyTzl\nBAlpz5938C85hqmoOI/GYlSDIFOu5b3H8Q2sT+kgYlJAT4ZXDxM8WQ4zGUfm\nlR7LCl/G9MbDnCLeC7m3hQi3e55CfduNOyKJDZeUhDoDEjZ31mR6+3t9rgHK\n49uGPjs8ij8yAMxWDlKAqNSULtp1jeCc11+9Pe7HvjpN2eJT2b4n468RrLEo\nZdVlocPq6YxJ6JdR3rjBb6NYluG01giqBG+TH+0vDOOqajU4jT2rgr+BiJIp\n/+/yiaKO9A4pzIcWBRBcUjm2xnaCLHcnT6jSQJeshQOsy+P4WRxmQsNi9I+d\n2zsX3b9lxiuslXUt7iL3B4xmGMdlhQOoV9plRAr/y1gIN3w9YTiKWfN/ClEF\n7HAq\r\n=KugH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBrwtwwHoUjLJU1jtJSzVB54Ru0YwUpiSQHIGN2z56KqAiEA1AweHHOk161vkfky18WLEblcW/CStq0S9CD2FKZ3N/Q="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.33.0_1562031703050_0.8343124916099713"},"_hasShrinkwrap":false},"1.33.1":{"name":"warthog","version":"1.33.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:seed":"cd examples/1-simple-model && DEBUG=* NODE_ENV=development WARTHOG_MOCK_DATABASE=true yarn db:seed:dev && rm warthog.sqlite.tmp","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.2.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.json"}}},"gitHead":"7de11446199ed33f321470a0e5ff8c7a482f67d0","_id":"warthog@1.33.1","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-B6xi1AMJvkr4ZBsu2A1BkFtUK7Yy3Hb7ycWuq9Uyt8DJG1igsW5JHT/EB42RKttQ7vgnR07EKNG3qWBEnLbEcg==","shasum":"129b65e956bd8b9ee0e341ddabc53bd98f2444d0","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.33.1.tgz","fileCount":217,"unpackedSize":326315,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdGuwQCRA9TVsSAnZWagAA+/YQAJmTvmY7PjpcNKArVg2O\n6UN+xxl7n9kvvqININIyVgK00AgFCyQeTsG3VEvEG3Y12IQ/nI9e/bKNX2a6\n5g5Ib6vdb0Gs0S9RWtkbORICa9wwrjOhi3c5SWDDOPoCwpN4xjCZ6Cvd7Z9u\nTed+bCmsYXCa0EdYwgC4yKPjEBkSllFltR1Mht+Bjo8QyBXp7EAPQi+ogyAd\ncASwyOmlJxIKVEY49dMSlLhdCa/8TwIOaod0a3HcDTGgg/ehdlrN9d1Dd82r\nqlfOB1opujFDc+NPuNAuihpyfISi2fn8c6RYrVsBYtVoB5ZzjF7OOkniJQO0\nBSt83qLuTLsY9gLU3BXJ4p+PlWaCbS8RwPTwd5x7n9xizzGjKYbSYXJ082hp\ni3sqLfuyRu+pBnsT6Y2ZS9+P1N5rem5UwHKJIsGfYXxZloPOpmHIS2xdnvL8\noDXk44kFzgZOOCJxYsw2uiIOx9HAQ808QXtivmwq9xa4fq8A6BRl3AtoaCga\nus04QdUKuUTq5clEQjy/03ZWtycqRu2agbiaG3yI9how50iM65DTxEXr644e\nzXXciTzcG0lqqboe1orDbix8+4PCplh1k92DOy8EaCMBABsOsRqW7X8tqjdp\n2Xw9qGtylp2lIGs+/vHdxxLw/NAHAnV7AlGul63H2YzciGSXyjZZBbithiQ/\njKID\r\n=TAN9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCrFcFSCxQF0HgjdYczxBZnxflNa3V68XjjfjmGhwxqkgIhAKiiN7Fnin2Wf5+d+ONHeC9DV+r9JlOBm8HqGuCVvMlN"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.33.1_1562045455552_0.801850400674397"},"_hasShrinkwrap":false},"1.34.0":{"name":"warthog","version":"1.34.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:seed":"cd examples/1-simple-model && DEBUG=* NODE_ENV=development WARTHOG_MOCK_DATABASE=true yarn db:seed:dev && rm warthog.sqlite.tmp","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"88314086a9b909c33ecff743ee5a2661bb9a3b05","_id":"warthog@1.34.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-50ZGRKlRESSFx466an7pj52OZQQl7IQIzx3DghSCrG0Zp+kE+AxMy0BDUoEvaN5DpnNfF4vaHt8ZoEcTSkRIMQ==","shasum":"41a9f1960214069a8a3ff4330859104d71ed69f7","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.34.0.tgz","fileCount":220,"unpackedSize":335803,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHTMZCRA9TVsSAnZWagAAgyMQAIh1faMzN1fkjx7kfTvO\nIPlQ+/r9p2g0qcwCL0wq+SqEIzf9/jemCAztenpqDS1GHHOVi4vop9oW1WI/\nYsgFE7NnSu8L0BpQOM0Pc5ph/us53MoilGqmVAiZ4TQ18HLDETc91DT3dd2g\nrwAGAn3mb6Z/XNvUyMivaXmC1mb9orA8zv4PkNe/aMZo723TUne1i+OlkrXf\n2znEILd+n/Vw1V/qY2e0ujwR8hFsu1bap/qKUhOrGc0GG2hgP6aMyP5VAVoa\ntQPyo/W2+HMISvO0s+vog922bvsMUyXZwEm3+SCJVE3G76vLvTOuQX3ayT4N\njpcW0PmSCTHSFXVqTP/MAmq6T4xXe5lDX2yC9P2xGV5UTGiLBvONvRHz2R8L\n6SMaRpf6WoMit1KqLdu8BlVSRZSQfND63PR3PSDYwdoW4xGpUcOfNZii6Dbd\njoh+os1mvpDnKLkhbgzl3rxyvfRq5B94fF3cdPxrY0FaFDRWcUJwriB7gvFd\nS1zhtKztx7DOx4YSCPi0OJLhxu1Vl8GVl7Mrb+GBarEdhGLbJOsQlUjdnGrq\nGEEIjI0cBhmtRhsXEPw8BcrsBn6Y/GZ9qpHZxGEzBoUmMfmiY4tNgOYJRF8h\ncpYkmfZdnkhFPEObO8EmwjXGEOq7nRajeS3LEeTpVEXNr4Ys5LAdYaZqTcZ6\n5h+V\r\n=weQi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDvdNX5p1aI0up7Zb34XPj0z7yIQNfuBtmupB/+YpLOfQIhANC6/R3KhEjUhfYxfzm3ekvWAXYlOVpKxucrH/x8yrRa"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.34.0_1562194712948_0.49526976518631627"},"_hasShrinkwrap":false},"1.34.1":{"name":"warthog","version":"1.34.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:seed":"cd examples/1-simple-model && DEBUG=* NODE_ENV=development WARTHOG_MOCK_DATABASE=true yarn db:seed:dev && rm warthog.sqlite.tmp","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"638138dbe25b9ab278ca7e7154bb598bff9ac27a","_id":"warthog@1.34.1","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-+gC+LH2/I9tvOYptmci6/xQs1qnzbN8QyqHzJGafKgMuO0CT3jHQ5rx8VLzDBccDfjuAorPvhSK9SZFKmpdbxQ==","shasum":"99e192aa9e36cf82bec7d647e128a1e8dc7aaee0","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.34.1.tgz","fileCount":220,"unpackedSize":337521,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHuKYCRA9TVsSAnZWagAACdYQAJkpxfNqNwkUXIhsSS2f\nawI928V0IUT/gKKZZhjTMONE9RN1Zgn89aCzLFqmzGObFM+r/XSdm3+ANoT1\n19JMuJizsbVC2lxGQbAphZSQmC2lh2eZKKtBa9mcatpSsmS2GhyQHtS3K4MY\nvv+yElw93snFwPZNCopq+T+PrDmlQKB2O2E4+EuDRPIV2+MQJM2G0QoaMF6P\nfjrc9ysByNC0p0fMeL0sJJcZRkW/JfWMc/A1WQxtogWYACroYeYbAcxyA7rT\nmArb+GZgw0O1G4y8dm9rO5sWJCpvMYfTJrlzFJmFWGZtR/uyiNrvr/m+GPVu\nLp1MUkkYb59OVS7R3fwMs9lFcEoNiGFULa48BXY4cuGXh/AGOPLN1m2IM7VF\nw7s/BrGIwIULP6cSSzD1cjFEILy32MMOFflvlbvXxY4vrSHwMuxk20OE/Ma1\nTDkrBhZaCBkUelYOK9sdkD4dMl/Ewh7YfZcE6yqGVhfbDC950xAcbYh/9ujp\nwDfZLg4iePxs9p5HpQXr9A0vXtMtFgIUsowGSMrLtEd8dm7bI+8k5fZPbMW1\noCrPeR0mTDKVq8IevS5EtjZZoiA+HGw8dJ59TPJsjj1GOWEfnxFjGNkU1kB1\nZukmI325LVn9oPM2/ORGv4dUQSy2PpZTC9R+G4XKpAKHCzUMsnXYkqytH6eW\nDhxn\r\n=UnAg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCm+jRl7d0KeyXLtKXXVbAppkQzaM0SwjkBro1gU3sHNQIhAKQjwhNwHIQhE/C192ze+eZpcX2rB1QwoLGWaSz31Vqn"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.34.1_1562305174761_0.335431777401517"},"_hasShrinkwrap":false},"1.34.2":{"name":"warthog","version":"1.34.2","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:seed":"cd examples/1-simple-model && DEBUG=* NODE_ENV=development WARTHOG_MOCK_DATABASE=true yarn db:seed:dev && rm warthog.sqlite.tmp","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"90c1ef716efa9d9105f33ad0acf1c041faab1316","_id":"warthog@1.34.2","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-IYTp1AOpcpeGw801CabIaHNfvFCIRuyOvEp8Of8h4GCqdkp7P7y3Ev/DdUdgfnme331H/mrDIqvFJfMA8Ag8Ug==","shasum":"e40fc293a3c5c4d8c1ac84613e07ad67ed03d689","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.34.2.tgz","fileCount":220,"unpackedSize":337443,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHumGCRA9TVsSAnZWagAAaa4QAIr0SWtBOADciAXSKAwl\nfYmKQ96Ip25BsaNuWsyQCdk4ie9ZzWYYjKYz5ADS5Q2yzffG6nPLStgnSWm0\nrGyWcDlbQKqtlJg6aSM44vwNabkJWq7sKikh0ol+2FypMPzcijzs4kCXr7Iz\nXQzNKragkS21gyhU57OJEKUZvnUH3D/dijNMsoXgQj4XfW5BDeGc1hCDAwgv\n9Os6peMA1ZzisW0ZC04M8/F3pAVnMI6o/uTvNQ1f/ttRJN77EAGvj+dTz1aT\nek7ic2hMTaIT77yjPU6hkzVKLGwau3iP/0p+gYYuXKW37idkAVMNucMw8B8S\nxel/ZaYBywC/uFAc0d4G0M9li0LFCwfaOB+RnYG5ExwwllLBKAW7N4xnFfF0\nmvIzyimjxrX78szctxu0RnXakGXhyIksyRVHt6q4wXiH3bjrl6m4PgStjXpi\nofqdyyChfFFNaByZRi0EnnAOWvhFmbTKKCL65OsjRV8i1JhPSp226CQgJ8Ts\nomL+Jzgu/cwaJADcuyG9tTPf4+h7gcUA7NLpDhNKKhjIqQ+hcrOLZemqi9QU\npzNmpNx8e7GR8GbUdQ5/irR56zVZ490A/n++uQL67Ce+4ECYKnuVeJeybjoE\noNQOjioehawaCsC32bv2ZIo2UT2/GlKEfokQ71/9Vby/bIao+30rU6Ok6WCQ\nsKjc\r\n=ecTw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCH/fuDwcbmyfzWSYoGl/km0aUF+wjuA617YM8OezBX+QIhAKd2ouAFhRHKEVV4P2uayFAmEb92PNjtNsFJ1yu+C0zU"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.34.2_1562306949428_0.3386209273229843"},"_hasShrinkwrap":false},"1.35.0":{"name":"warthog","version":"1.35.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","test:seed":"cd examples/1-simple-model && DEBUG=* NODE_ENV=development WARTHOG_MOCK_DATABASE=true yarn db:seed:dev && rm warthog.sqlite.tmp","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.11","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"0dcf4722f133cb2e34c1dc32d72b04a36fb64c81","_id":"warthog@1.35.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-WW5CQMz53rp++gw0wbMYT8l1d7tV/0TWfF9gB43L+QU95YwQ6xNPGcv0pnZfAruSwdxzI75gLt407bX6va7m/w==","shasum":"1a1e8ce9539502486cc6ed39decd87934f407cd7","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.35.0.tgz","fileCount":220,"unpackedSize":338658,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHvhNCRA9TVsSAnZWagAAb/MQAKPAcChtD91vBKGVJocH\nWTYxGGQXOfW2aDjEtQFKBouPurCxoghZbeQMsjQAzw2j3KCI/TRvME7c4VgQ\nMHbXgcoGIOEpntK76usFHYl28pk8YfUfFIY8Nijm9YFbTmkPgQlnv0gaPAPB\nOd0UZIW50jus/hmJJlIROO9kXre5OblBqkCrZpB0w6o0YMuweqzH9MOt6Zsc\nt9j9QNZpJqEtXQ5GD+AHPw0RKbi8XMsBRQcNOtUPYXbEJGgyVa5DTpImrMct\nPHG8PnLqHo25N09PN1kzWmgAWqWPfec9u98Wh/t92la0V8yXT10/Aqv0dKdr\nlVQdgavojt7atMmCX7yIvUzty52uopBtVwbmRElcumqRbQbx2VUeMc3HJ1n8\n/TLJ6dPSdjgmPvGz82XUTNR20OA/YzLUxA+lfBO9H2oewiAFQd4Nsk62ClVA\nES3d3Sx05QCoBTDHnpqDui7vZtuirJg8Q7C4EBsxRkP/kXFK/va7FLdkikWL\nFUXYPwgwqZ3B1Uky8YZ3RNWcOeMWnhf+iFsKYBa5/gyufUbuLMECnuhYPbPJ\nKsFWttPLNj5KRXb3WGxZgIMWjufIRie0ii1oylL5KlgCkwuPH8HdiAsUuVjd\ntm3QvVrreK2CbMt5wniRD74eTfgnIB3dX08xe50syhk6+Si0cuIFXZg4LmCR\nHxr2\r\n=ehFj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHQCwi41Mp69MSO6xtrvVCqh91+XQFw+jAr93xlPyujAAiAyWvNAFuvGqLSNWeOvb2Zp8MoepQcAzrLtpXvPpfseLg=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.35.0_1562310732826_0.7616188557287127"},"_hasShrinkwrap":false},"1.36.0":{"name":"warthog","version":"1.36.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"c58aaee54a6bc9e5912bfcac74267aafa1856178","_id":"warthog@1.36.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-BAbHQ8g7OJ5DeLQhMWokB0r5v5ulvmamx2kHkteHTjwGpthK34qVJlAmZE3rkVurfFdHabKPFlCLuW/Rk004yw==","shasum":"9c5723bb5136cd38b12f15ec091a58a44b968b40","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.36.0.tgz","fileCount":256,"unpackedSize":489286,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdPJXICRA9TVsSAnZWagAAMMoP/iTY5SPm75LKJZu6JGGQ\nrb/BuwsbKSLFR9oeacYM0NzP2T8OhOfMLZy9ehcwCk5gfsrKIaXMNV0W5DY5\ny8dQL9HVVpl/ZH7Vrw3xaH4kx5RdA+E2m83pCDrB9dE0wWLpX64PcFQJUutZ\nUwuhPsSpxQM1pE7UQjrrYhqZomkCGwgexlWZxLnevmjMskuxB6iHpr6u1XlJ\nlR4ppeHtuxGXi0t954sslEKo2hQ962Vjs3INTki3cTsbZpSZ6UbXyfyUoAvj\n8AfTClHFzajcI9c59omvVYMuK0FRF946Y7YqblxzpWpl4OZR2CD5IKHSKM1y\n0zEW9vw11v6evWZDa/8QseDuYSSMDCpPTBEHwzkhkPzQG/18G60FzESOnWqb\nqny97aR8j5c8+WiO/GkSskjaQ50IeDxZZ0Yp17c/Xzdxnf4ynufECQeDcz8B\nHu9UQwtUB6xWdlXYhOEBba2J+55IuOM8sOQSXFdIOMQZZ/moMNkaPzrAD9FP\n1GBlDRgL8LH5VYR7k49wYzgi6lfsL4vahF/fGXIw9lB/KowCE8vZ3CkF71En\nl0bwxlMfeiV6Ky2RKbDAj13gr3hFgltjwM2A2IPftMLOPDWfod0zEhy2q00M\nhRhC/PP2O+MDgUZSWfzO09H++TXo1ni7h8xcxaUYNLkkSvtDJoTIsi+TV4Sx\nwKTt\r\n=e+a7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE73Pvou2pz9T1d1Gx02uW+Uz9umNB7oqSKtLuEl1sM1AiEAq0gqTJj2i275Qdj3AVrJDbWRkhZvs9aLcPJZinUZWHU="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.36.0_1564251591850_0.6874762014480948"},"_hasShrinkwrap":false},"1.36.1":{"name":"warthog","version":"1.36.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"7721d9e0ec4ee824810a1d1ac791406b7983cf79","_id":"warthog@1.36.1","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-TWg1yD4M2BTmpe0+5fyuzjFPU8UYnq8MvFQCUfK63tfBw9opLuYVvciXItp+jte48g0uhxLz5opgQdSHIa0ADQ==","shasum":"1dfea827001ad845f74a6c3e6da8413b49b2fdd7","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.36.1.tgz","fileCount":256,"unpackedSize":509883,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdPnV5CRA9TVsSAnZWagAAbVcP/RdEjMaX+exv96YOJuyG\nz9ETl5GRIsfVh2PqZUlYJqG8ukWS4aMtm5t7N5wKLaXGIK8zqnkb8A4GejbH\njuCz5x70mFzYq0mR2Cuu9glgy7TIqNjM0RYt4CP1dVQDHOV8OEFEem9Jb3SJ\nBKpWBf+y7fzBtgb4khQirAb1RpEAnH0ZvntfvE9O5P36eBhTMuXfQ6LUi9Lw\nycWEQ7l6gnhwLFe1urSFZ20mlq4XxZ55Ue3A+vD/d4fzf9jry0esnOSSVkO/\nxs67eXQbVXNCHd+siB0XVgFtjDlotL6NsB7HO+0WvvmUc3y5k50h8ZmIzvYt\nGcDf3jUxCvsKukWZYLmcvE91FjN5QV/RJBx11N3g9fac9TfAR9+QgFUt+BGB\njrJB214c/UBM5kUmrcXSE32VSZnEDPpBJzl2Sf/P/wkgfMJacZm8huzdL/CZ\ngRBHnK6u+3uKWxHgOEFYtpB5SSQvaNvFZg/5zV0p7J7SVA2W9b9udJbnrdqH\niLPputwG3o/zFvf6H1GkaW1c1IZG4dXZ5XXQjDEIQgwwVPJvoV9DNw4bDrCz\nPneMH0WvH66lPxypjtxyk/J0muRYUeP1ixbu8/duj1l6HgPxVxOXigRizwUa\nqQF05C2oj3kfvCT5zKRxf4kNJcc/o9VlzikTBXytUx6qPn2EYHyATMuk6lSk\nlE9a\r\n=mMOl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCHs3QhNxRQtzy8y5WwenA3s5Wu0s3MTseSiv+TIS/i4wIgQMmct+RJfEtpEnT7Wlq3QNCFF2zzzsiwi56PR+rxriU="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.36.1_1564374392008_0.8806602298520518"},"_hasShrinkwrap":false},"1.36.2":{"name":"warthog","version":"1.36.2","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"126c6841e4610ae0f9a053da9b016ad7f10b6993","_id":"warthog@1.36.2","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-duJpk0Is/pqN6tLP5H97XaOE76/VFYeQ3fYJHq+84FEOtsO2tLoVqh2naOphBFNSoxc2Xbu0v1beR7HBtyPEow==","shasum":"e2ffd32046e488e931271b9b6fade0d8aa97c788","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.36.2.tgz","fileCount":256,"unpackedSize":511426,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdPnwSCRA9TVsSAnZWagAAb9EP+QFKAyU8wiPUqdhamDgX\n1jNO0CrNTPQ/6unoRb/yUURjR8eZZnhGeRDCvfQ0+8a84y4vR4Ua2jehQY8f\nT3l0oe7mn92optVikiEPquzc7CbNQ3d1hafRY0qiECPUz0MwCoPYswUaoAah\nSolRJRDaLxkTqMrKgvxXyIxbEduJ8JLUSLC51lgwJIF22dyAnPBkIzlQWtye\nlEspFDfBvmddhn4ogeWa11ZAmiG7JXJs3KGjZk/oFvWCDONRxzVVJOLtmY3b\nvu6x3TT8H/AEmxmmQHjlMQCroTjCzvV++IRdE5REc2vGNcvFwFDxiJwaTbu/\nM6ISQ9HqH3p1cKqAvlH4CkJ17G1zXlKk+rb9iI+b17TolMvuUWznBUvxNpnL\ndq/pt9bhHME3ZoBABDHnlqKxffsP58tpZeV7LxMWrxw6ziBOGoNoQnHAVPjC\nF/iRXVriu3zGKdx/xYelLSgwQwpgcy3ImsmiiDv0LLZBum+S1i5qtcWK8Y6u\nz1B9Lg+tFZH3ixlFb9a8aPSZyHoN6ZkchDIfHa3mx4IYESiZ+obke+H0GBeP\nOvcMA86iWqQ80TrfqEtgLGY/cwjzLz/xarZG3ORCaktppjMbO/Q9HtGueCHC\nkQt43nvk43/U0ABrYCuxZpcdjXo/L2JcWKIsdCnQjRqwxyT1eNj2tz0h+ZmV\n2TZW\r\n=XKqh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID6IOoXQybk5Y+MEdbqMpaShqEleybshj0RFWr/+G58cAiBV8VRPdeemqMxRXgK/N0eHhUDBvVIF25WBjHMXok143w=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.36.2_1564376081889_0.13223408675356874"},"_hasShrinkwrap":false},"1.36.3":{"name":"warthog","version":"1.36.3","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"b785d9b7053a36655c7804f9bd93a42dd56c1317","_id":"warthog@1.36.3","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-w126Ek98r5HRevRJz/NYUJhh1sAx7X9jLTChxdvVptFsJa0SIjRNm231GdeWS+FFqhxt/+auo/mb+jLIgj6OpQ==","shasum":"71ce4d4ba0408778c23028d1a2778ea3238702bd","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.36.3.tgz","fileCount":256,"unpackedSize":512427,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdPoDGCRA9TVsSAnZWagAA8OoP/3hhrzLhjQDNMC10G97+\nJCGzND+PxgonG9aOr1IAJE7jkJbS2qXCYM2LpsG4QKo8RpTpU6YWaIcKkQxP\nJOoWR8D7I2H8Mfj0OfM7+6JrLBuZ6WSNV00odCpIbnsla5SsQnuPeVLidrDG\nsbeSAcddaZcaW7nUXK9OaLNNnomzkfxRW68egxX5u3U8pdbAD2Fgv1OPn1wj\n/ECjL/51Isl6/4p9DOY1osuL8wKMlUl+buKlk3BFvhA1pm9aXHG0n8Mx9fy8\nxFaHpa4sfN59JrpXOPw/32MkO1QUCZLhTPWYGRdX7g9K4iYSxLUfLin4mW6p\nUxnrdrJZ5cTCLpBjWHiFrXlB/REWhhRYU1N4zHm2ZON5tXUNNbkzSkQmLTHB\n9wEbCaaLCV6Fj7bvWrzkoWAplP5KSm8Ax8wBdIcuqDdfvSJWu/8LqmSF4UVG\noLOTL1za5rGrYdKwjHJauYUzNjBUIOh4cQVgiCKv7gw8gYmydc+6/oa2XVbH\nY917kkjGE/uDyiFwx4e5PpdvnBt50E2R6wiQ7fVVTgP7S9wRj2gUjp4F5Q98\nZLzCz5Sy81F2ctuN3rqtIJyBaxazWlsso2xeN0OJw7FHMefWx8fsb8evspR3\n6QJk9QW3CJZtEmDkVJFFqbOGJUr3/dG5A4Vjel3UaUYT4a0QJcnwkOhJYHsR\nPlvE\r\n=LnAL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDev8fRePaq+N9tGqsyxMMDzsXtq1wXYV57OWewHYAQngIgZiC99e7L4vt4RrSSMT148B5SbpMhkTx5e0FeM9urmYo="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.36.3_1564377285699_0.07208914826915613"},"_hasShrinkwrap":false},"1.36.4":{"name":"warthog","version":"1.36.4","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"841e88d02b6fea12d25ec507b54901ff45f4e82d","_id":"warthog@1.36.4","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-abtU5xKDBPk6KGzG4KHA5Ur/VYzMu8wr4xHdDdH05RXqu8K2Nu8wHdR6qD8v+DzSLvBhE35uhOTMdqHApIkQsQ==","shasum":"595d92a71e6e3ac02e1a9d24bf75867313d47db5","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.36.4.tgz","fileCount":256,"unpackedSize":512209,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdPosDCRA9TVsSAnZWagAAQecP/12iHKiANo/JhW0QjMqs\nTcJ1UBH//xjuN+RH917VlvHYW+lWKJkv6ocbQJrhh4PYbcQgx6tShub8yAdW\n0VdAzSbtyFbaDUVgg/7KOA3t/Y4tT0laQWAbxxBlhNx+srxZOHOlkbNk8epn\n553U84rMtiC3YdjyzfbTk/GstupeZukZDPz7+BvGlyXNzLadN4X5sJzIjjoZ\n1NbJ7IZO06DcNP6Vw9F3VVKWTNeLG3h+5TtnrbRvX02dB3o3N2Z1LnfrvAL6\noh15mA1N6L5qLnKOsV/nnaCjoFbKaHO5l2lsKpphv0I4coHIceYIlquxtKy0\n9GIuR93oA/VeyGc18MP49NDKWboax2piI0TWajmI84kMrzUNGAGxb7xQFZcb\nWEB8p+sFwfKJJu8q7JzEtFSGwSsnzH3ofkfJrHawEEF80/5EeQfbNG5rn0Fr\nkMsSyYD03rjBynIlkKViVWsWGQT8zPz4UPMN4jXuF4CuOYMyoJkhLWv0bxVT\nBwlR+/4bPZd6I9hVi/RxDBDDMbKcNiwO3+YMvV0NG7Nqjxes2+uMGVUoP8hu\n4xoOsb9xpmz/rXv83YXa0OpUVimkgLP9TYfkKLC4X1JIX4pcCb95heQzxnSt\n2YRBXJBZbCMFSn1QNg/Vl0dvGHmJgvuIsjGuc2EQ+nheb5vtAPEVyT9tAKAm\nWUWi\r\n=cqD7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFHIxoydieykJ2MWlTi/8ThFCACSKzgNTBw5b4vTeznyAiBjxyqPaqDSNnoCNIRspXrn8V6NsinI3vzIeorTI/w+0g=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.36.4_1564379906890_0.1941918900007651"},"_hasShrinkwrap":false},"1.37.0":{"name":"warthog","version":"1.37.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"yarn tsc","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"55fea4ffb0ec5d12ea540c33b2d40d0d8dda5e8e","_id":"warthog@1.37.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-Bs2UWpB0FF+aEk8Yu4KOiMG1M5k1QytNAAWAd18AdAZn3L+tneWlMQxw77w1UX3vwyJmGGiquIKdP4ZbAAQitQ==","shasum":"13963f86447c87bd269b7b44dd292c0dffca0eda","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.37.0.tgz","fileCount":256,"unpackedSize":514498,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdP6piCRA9TVsSAnZWagAAss8P/3Glzb6Msfm+OIQcWQ7r\naKmTZITR/xfNIQYWRAX0BJsQ4SbIEfDAUO/q3slHdP8SIb5TbRpWudq1hwEf\nO46o91Nc0B5JKkgVJmFsxCj/i/9//75Mhei50FgrCGgkhlMzfLIj5Tzg2/Q2\nwjTd6t/wUesS0cNuLWN17vqL9f3VMsTbZUUIAf57ntOY+f08fxZac+e1/xXS\naxmYfhG77mUbP/txhZHkX7r/cxKQPrGRww7K4gc45WAVUPNvUMUaqjnZyCYE\nfKwdv1UgheYNzk1ywCadiFaRygnKev7ibKOek2ET0c71todytys8bLu46059\n0jvgq079BifrWqmnNnq+Y6DzKZAtZB6Dk9b+BFmPTFAljkDB+gHQYsuwmu59\nH3jm21Z1P4O34clukVGuRnB8Vj6sQyKMk9RHF/+f2nvJ3iHeqJjW12rP/yYM\nXF4ZX0MwC+NyZM/+Z4Vd7WvnyA4XQzcWCl5q59dokRnsvdVLvmetcpvyW4L7\nUpy5azhQ4CS3yC6WV53BoNzVpBdbmMGm/Tw93PDocpN3vm75hUO4jaQfo0ti\nbB8CgV9k1r9Bp83xZL+yZ5xRfC9MzX/LJto1HVOGLsMbQWh3WtV106XsSMDa\nW+7FpCFivoKl2Kf1zL3VDxJX7ySBxKLjeZ8CmISzwLMveta/TggnH2Jn1w1E\n5/CJ\r\n=JIhK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC8hMkopbaVshXk1OQnhpb96woZ9Z+UFjFvZzKEYxQvLwIgUEpxfUV5TGaDZPfPygWxrGDIQbLPHiOumXgcRpTeixo="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.37.0_1564453473051_0.4510506048878866"},"_hasShrinkwrap":false},"1.37.1":{"name":"warthog","version":"1.37.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/src/index.js","types":"dist/types/src/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"64598f107a16ec3f8877979642dd11af188d69cc","_id":"warthog@1.37.1","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-wmjEM2GfYif+N2hE5bZ0DXf4udamRs6xN2ys7QtBilMX5HP7YMtGiDpNHcP1ITUlwAozpSkZjxaUnj0QKNyTmQ==","shasum":"d7c00418aaaca566e23142bb73eff9016e4e11f1","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.37.1.tgz","fileCount":256,"unpackedSize":514523,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdP67DCRA9TVsSAnZWagAAB/MQAIQw27EDLy9ipwXNU4F5\nfMAkbstn6g51QS96VP6+dkMMyxukA7oH8Vf6BmJXM4GYBnaqErxIj70X6uR3\nsF9IfZVYOobBAIHs3JqsRZllLX4Jfr52xm/t+gNjs/McTLDBlEBD9SOw9TEW\n05ZtJD13sFBxf839rqMrtRowM3ABhbvsn7lC0GpWsPeFGu5ncqvsAq4khM8t\nDsQNbqwWisxZMT3TNb90dOgtD2bmY1bEKuQZwtzI0mV/d5Ilj9nYd7EgqIQZ\n7Cs39H/phZWDVOgaEK9FfgTBBotCJy+JgbLMYknXXuAMvNsuEyKuu1h/qpBr\n4sUYET0pKOCl4MPXh+Hy01MRpVEvE8ali/Qut+wJATJnpP8XEvbcGfAsDYzx\n1yPOSo9QaWQqarUrM5QMcxwa564Tgy4Pt/G0+xn5AmcWIp8qMzlU9OgoMhWU\nFAxu0nGkNn74lSWMuwhC4OB7kl8LQ4lsqhxZy/1KbVhd90YjkTjsqyls3P53\nYvVmEcM2l8yPvOK19WkuVRn0h6VVCEX1Y1qDKqk4WThrYmQUnt9A28rmMY3d\nGtqCebYdDcwpxdyqvV4bmCBIArLXQIXyDGLBEfMcQvMB+EGcMK1xS3LNUe4d\nemsL4laKsr+zLpEULLhc7Glr+yX9h7q/uej6eAu5eQXaRWLDQ7OB2VdZd5Ky\n7uYk\r\n=ciz5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIESM2T9K96UfodF0xLYQquwzmaNdjGhdcW+MgrGhjgneAiBe38fbM6BiAKIpKUJ7j70Eujjmv04mlOuDt5bU+3VNPA=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.37.1_1564454594634_0.0824320853149294"},"_hasShrinkwrap":false},"1.37.2":{"name":"warthog","version":"1.37.2","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"3bb220effbd50d9645a7acd33e82b6483cee0eb0","_id":"warthog@1.37.2","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-jm6UOvmHNou1IG6/wXKKmitcjcktMUKJrBes3LAiOIijb3fafwwIAPyxROTt22W+2SALGCW8Gn+GWtVmlmDSyw==","shasum":"f4ca51ef3b9fca9ac9696dd92e90699b45a53516","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.37.2.tgz","fileCount":208,"unpackedSize":323545,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdP6/9CRA9TVsSAnZWagAA6LYP/29kdZC611e87BZIkmy1\n5S4E3vM5v0bdcPNwzKQb7zUGN2iPPIlw93rILVn7I9J+3DmgvT3syQmbam5n\nWtdXPD9g++ZvW4m/qr02YpvnyTk+/iJcU3HviKCXxUIm2miwgD5IGRhV18ts\nqfBQ8uJHICD9VeNodHn/SO5t3azhtSi14ipulMTIBnm9xtJ+3w6kNg7M7kLT\nro+KhD0Owv2X9A+GrGJ5MLMBVpAC6z1P0ViQvhysKYAW5JFR1BO+arlqsxEf\nHKJw4Uf7J+W+8qIUp+HaTBInvbej8lYfFH7AcxNiYFgSPpCELJR3pU7JRW1c\nQs/lcfD4E9aRpuTThyuKr1pAvCgKVI5q3XuiUqenGqJ2NnAIKUhOO3e+Lu0U\ng0HchkbsN0EN7egsAxhMu0eP5Eia3XUjwoP5fRVpdwhMTIQHMnFfgp9BxHPC\nQ8KTAGMOMf6o4nnVHp1gGNoinYpVQBbTt++y86aoQXykX8STN0rgs0ipBCEe\nSYuMBonJg1shGGtCG4iAAF6USR3Fk0cNyk7Tr4LhwLtEGT0lmIT8NBawQIaw\nj6RzBtLc6tj9TYGigFTgPeIOEPUIOop70DTPsFjtrKMIsQGqfEyq9z4ttMk2\nzyKNp4NniDn1hvAg4of3g2N0VAkPZsXhqBeJLEbqFz+tk39HQReC/VEspr+A\nt9vf\r\n=/WWu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD+Ym+GJEAtD9mxQVXabEir2RWiwbZ3qAmZF/Br3eD6/gIgMcT0/rQfvgZgycX9xJVFZOyz7axpn+ox7RCB1/f6BuA="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.37.2_1564454909269_0.9199725053728993"},"_hasShrinkwrap":false},"1.37.3":{"name":"warthog","version":"1.37.3","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"744efb743f54bb83c8c3e46d96f20c3c4ae0542d","_id":"warthog@1.37.3","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-nQPjEhhb2f3UnR04f772XgTE8wdA3rhoq9p7adqolRZzKmNzMO6VDQ44E/ZIrEjH+KRUbWMVUewtsAobIJW0Ug==","shasum":"6abec1202f03e7405245a85dbc60b32a341d003d","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.37.3.tgz","fileCount":250,"unpackedSize":451710,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdP7vyCRA9TVsSAnZWagAA4LIP/0Cdt/xMKHKmjmVhtM8b\nNb5EMwbAFafZsb8foKLhdtWBuRIWw1XvCzP2kgxbKQCzkk08ubKh1M0XvpfL\nRnZ2o5Mf+j0tZ29I7ZF0XvWqhpVsc91wYQC36c8dX5QjOxDU40hFDmdNueFE\neu/wO1+HZtEM5pB7yE2OzZDdJ+JZYGgbmL5w3LKtfHCQ/SaobI0wS6siwDyg\n/VWKhd91Y3CxHkeWdE1oahOx5xbD1uRwlVqP7QRt1DmsifVlyPAT1mokMFIY\nqCqyfHCcj5S22qqFS2L1QuKc7U9/0eoFvk0pcq2hMxj4+C6l22rsAcos+Aiy\negHrETLNC+fgYq8fRh5UcPWvZteGzbXMjBtjan9Vv7TqblQjsU2w66c8TJ6r\nQ43SJ/mRN3Rno5ypc7VxQVU8b3Xi+/puY6E1u27m9zCQ5rFf9tdcJcNjRkuP\nes+nNZ+IC0Ii5PuYNCCjw2k+e1aMIsTQfM9IvF9edHpUk34UIhC0/8sSiZXw\naxPiH+ijh9wwvqvR1Gg87hMnTqJBEFNn1qMJfUwOPCwOIrJY+kaFLVFwVMX1\nXNzlRQL7M/MqI7zsYcweyleYcBZdDSqQ/O9epHpdDbioFhN1q0flET6MpwGe\n7noapUjlXoCCFRXlKkopfMpZi7wIEZDBYm0thXd5XiIWJVs5fVq/XqTRIXiU\nyhSD\r\n=istL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGyVYKyJxXSUo3NDH1BswK5fynnOAIy2PSjMxo8Rtd8YAiEA312zg7dgbIXf9w+pn24JMyea6ocO+/eZjWhhEZNqSQE="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.37.3_1564457970096_0.02125791240730046"},"_hasShrinkwrap":false},"1.38.0":{"name":"warthog","version":"1.38.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"c60071e7e088f33b3784b3134890520392acf6c0","_id":"warthog@1.38.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-gFBaqpZS1uoBRPjU+g3ReeJpyHTC013L0pyVQDHMscmtOpYFNbGOfpPml6e89Zz2NeNMha9SUmAFwE++O2d0MA==","shasum":"0830238856de5fc79313e5a126fbc4a3653c53f3","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.38.0.tgz","fileCount":250,"unpackedSize":452709,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQRAyCRA9TVsSAnZWagAAhzAP/3+Kg2gMtZmd4FYTvW6e\nkT5ClsXmxh5vMHTwxjw4tVga1cz2Up1kMAHyrzv6wDsMuDz4BX6GEKj8/5Yo\nE2HAzUX6faz49UILbN0r9urAxVFpI67NPPGSz+lfTRlRqM6C3fLiaTo9E/dk\ngM5FyLePEKCYEJ8Idt0egK61eYQLVSba2F6AJspTXDb0ZhQzB3tXpDe6evFz\nS6FAfdp+9BvSzqhWaFab/evqlaZxTIPgPYi+Mp1DksbOM8E0E7/7A3Pe+osV\nPTlB4AdFvsGuUSqYfcE1K4LUmijGetrtSdYd1jiPsqMxhAUUrpej2BDxEoPb\n38ar0KpGtmHlF32bkFYw7BVAFogBlebh0rOGsbrfYosScjPjv7xk0IjzA960\nRCRsPxmY2pv2RvKbg4sQctlOANqnDi+vBoUsYr1CiI5nsIYNGr2KydAjFbFy\n/eBw2b0JntSOjX0AKzFbZg1c+zuUMZWlH38tNHhLPzOHRMSRJAYOm7z3EIwm\nNJmVghAQVZjrDmNlDCXkoPoSor7FymHSPHw9Q0+/BZqo7gPL3Duti94uQnBW\nQKKkN2d2QBp+zafzujwjXju0b/fQpDiwYPH9YR2nvR5VMR3X4+Ai6paogriW\n4D8z4gMw1vLC3CSGOk9X1mcuXp1dNAthk93Fb/BqqPbQRw1WubbHD3y8EAqB\n60LY\r\n=SASw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICrnF6YW3RBD6okEt3++zhrvYSn4uL2fCbht0apZsMqoAiBz+NCy+94tRZmawxUxV/aNQ/flfpH9e+53hljnF4za5w=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.38.0_1564545073136_0.8759161481728281"},"_hasShrinkwrap":false},"1.39.0":{"name":"warthog","version":"1.39.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"aa3ee0ce25501bd7f6e58010fe0475f7b18d38b3","_id":"warthog@1.39.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-mOJ9JU1pN1klfAbsTPouE5cbvxQ2+dvIrULW0m2zozIZe8usaZ1AglzC44+6Qtez7xJ/K5s3qiyoLIFOCGq2Hg==","shasum":"d1026a942a3a9307f5cbcd8b4e33d3b8d3834215","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.39.0.tgz","fileCount":256,"unpackedSize":463319,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdSmdBCRA9TVsSAnZWagAAum0P/2PY+zLz3PxtZCRzUzsZ\nZdtCcubx/D6elV1tbPcRJ5TE2FoBlrM0LlCKKOrDZjxt5Y/dmRKl8IBjeyGK\nBnUmPZPIsUkDD/VZZKCWjrOtPB+BV4FfS1SV1VH1nGqXq4EgqGwEuxPyGZnW\n+oSavQ66JKN7gVgV1rkMQ8GZhqeDONhJp1EL/NHQRT/vJSsSUzROde8B6ZxB\n1Jzsh4RPXNxivYWiw+9ijQEewbStC5AxlRK5CrTJ9Y4KULSo8p0DL45djirm\nUHiP7hqvMD3mz9kO36IguME3W4ZCiga8//mlpuTl0p7YL0rhJlDGjKed5swK\n1/tIprVQRgI8y3zRJJCQQSfML7xNggThSKhbWcyJ13sBddzOKfCf5gRmV+tz\nxd6a3HZ20OgVIntcPXlVE+X1zcMKGlpVODqxRXfsJGIiJvTbjIKKR3XoUrqv\n0lZSJIj5tHTbj9/nxSeiMejFRfY66s8H/KcXK+7k/R9+xdMlizHJ3d3KJs+k\nGESoTWpWOYCCG0i4ELSXSDcpL3wvICo+ZTSSu40/2SED0dT+RxIIVxwRtMT8\nHT9YM8pekkuadJMOTW88+64Fb6ykmC1Lo86nDUK7ft7CIFbxoUZf8Ks2kIj1\nSxdMgS2QoPsd+TG2aaQEMoDH8zJWC8NKLqvuiOr+Bai0JENcNdo7poPDdn6x\ns3Sp\r\n=JPpG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCmEn+Kz1+J/+6uaJ0bLzj8cWUub4MolMaFGV9oACX7+wIgDjewddt3mT9NmfygNK/t4C+KUnlcnImPUG3tGYnE5Z8="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.39.0_1565157184638_0.2868045261732455"},"_hasShrinkwrap":false},"1.39.1":{"name":"warthog","version":"1.39.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"35348d353ee8abafd20b2ddafea093bb7ea326ba","_id":"warthog@1.39.1","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-4c7ysdZlty3C/SoKp/pnfOxHwns4xdyawwW8ymxVI9ZVuQW0XM2F5OnT0mqNmReuDb92aHVnF3pl2cEVeN/UPw==","shasum":"61affad8f6270607c6629cbd4c4a43199a039562","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.39.1.tgz","fileCount":256,"unpackedSize":462670,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdU1t8CRA9TVsSAnZWagAAlswP/1uT5oJ0uCmwpgxZ9goG\nQeWEN00Gz6H58rTtjNiUwMqBquGzknWZHuAL/D5mx6UyEr7jmfFORpv2Zodn\nkGnnusaMzys2ySA3Zsm+h6ikOhp9TgTMdiKTvkQK/8cmZ6LGYDo1rEOPTVqV\nP/PNcFS6aNe3KOeXstviDQ/EnEf7SUl5+ocDgEU3aClPKhLXuPmN0hz+Hubc\npGBgLiaDd0lvBHYC5Q0hYoqBbYuOyiE6E20QMYD0UxDtgsaNH+4k5NCi5/O3\n4ku2gvXVgR4PiapSqpFiPtHUDRShMeZJi1teibmwA+zGvBRsopLpQnWCOpEC\nQ2v7G3uip2hKI8CQm5Xw5lj9kBoCNNKfZhA2LosqKLERrI9IC46KPu65t/eR\n7sRe3qmfpJabM+jniCc47PQKIZyckBJ93uDzaIox5h0OGf5rGombLl13goix\nSstfQXoaDhrHZ9EWI0gM3YRdmbfWrAf5Fr/MExzBMI5zEnESEgjThWHpvWiZ\nRzEs+NUdKB/ga2BvGpTLMSDnk4G4DE9rDWPBTh6gfAnEDnpU/y/IGGg+C3Ny\nCcjyDT2lknj//gRt2I1Zry2J4YGGm9REQOAszJRLs1FTxFnHKcgjOO429XA0\nN39KZHyfT30f3Cer2CnuXeFI6ty7Fz1LilXHycspY16LRHuUlLm1gE5OfDCQ\niZ2D\r\n=J0mC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCxduU3EqTWXt6YNOUzOapkQeoBYhnAeQ5jywT39s0ToAIhAOi2pKwsgOpn5Q36YOuVA5QRe7zEljmXiUIG/sHPo8fH"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.39.1_1565743995488_0.1569155900007453"},"_hasShrinkwrap":false},"1.39.2":{"name":"warthog","version":"1.39.2","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"8b37e2bedc35e4ce469f4743de3a3602d1add2f7","_id":"warthog@1.39.2","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-pKHepMptCHRPs5NiA4184Er0DNbsWkrjyzv1zAyrvl4ERjgmIZeA4c4MKS2/YugrSZwNigm5Ose0PpUqCE3XVA==","shasum":"79012ef456bfbca0d7457ea6f209cc96c74ef124","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.39.2.tgz","fileCount":256,"unpackedSize":463004,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdU2fGCRA9TVsSAnZWagAA4pgP/0ZGZElPLrWrPT6mRv3P\nTIICq1NyV9op0ETkliOf0YvnWAaqfjOiGqoTRq12wb0EywV/ydac+g/ZczyA\nPw5KckchhYa9qg/1lfjSaDVQjBqjl6/9Ho2yeZ3Q2RzB6n9PE/3Mu6mNcyg5\nHsrYn/uB5zXl569Zz9KQVP8RsV4Dn4QuUEzPlWRgxeAyfglxvv6PFck6uKx6\nDzNsejCvKmCoN0Traewzi/dtavJwPxbcb98Euc+9xogpiEadhfSuLgvlC1Mb\neuycwChHIQJyKUJ02WYa/YfG3rRnK23sVhdxIEioOCqIrhDK8OgK8HWaqbIR\n34LMcNHbKNoHvSLNlPS6jFlEwO56rRbEWpCKV/iRpUiPkAKaIEs5DnC1j7Lt\nj1ei4boM6JEX9hPbTGqD0CKP7WMa1XH/Gjx33YoM1OslUkWsPMKu/HKm01m8\nwCRSVJyjJzYrv9iI/TaNQl/QCi3XNi61mGmO8kGSFR0zmmuemxAm2paidXpp\nKNGOxhQ79ydj/IRS4Rl46qJmZCbW1fwZvOMKex2EIi7RM3N7kXH8rSQ6QVe+\nN6qW2uIlc5KLNzYoq24+wCdhJ6V7YmZyM7vALfIm/TWDu4E4VdH52aysovhd\nggFx16k36Mse+xMcTokx+53eK2wqEsmlzUKbgliwj6GlXKz6dEZXIg1hXLEA\nX9tV\r\n=uYr1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCwoDXjXhS0EVZ0FbfdHmX6s9owy+3qWl7FBlJibGgmEgIhAIMDIWcaO49q7Mfmetf65NKlkd/veRi/oryLZ4AbmLhu"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.39.2_1565747140491_0.8706738567451755"},"_hasShrinkwrap":false},"1.40.0":{"name":"warthog","version":"1.40.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"7ab60ce662a52c954fd61a9e88143b42d5c06f97","_id":"warthog@1.40.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-ZLSRBb4GWHbjpTn5OrlsIR8BVH96QKw6EbgnwUJXdHQszRgLDhaWA+6dacYumML7nHqEfOH9lMMKXBcpKHua0w==","shasum":"8fe113a6d83cfaecd289cb022a2cf8db3a61a20a","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.40.0.tgz","fileCount":265,"unpackedSize":484562,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdVDKoCRA9TVsSAnZWagAAIkwP/ieTe0Xs6ERqNpUMWvpV\n9UYFEWYaUjgN87QPa7Fn4zo74s9E1stt+SkP9lGk07ukW+1VVU84GwMr6Rot\nlOrOMgCOmpdxWKSoM+XH1L8JpXzRCmYE7tGVJPg7C668xwEv39pirF6k0QEh\nVh49eyJEdXr5mAvj3XdssUUgTd/qkK8ZsYdtpMLwBBFazfcAU6cjCYoqgQRC\nIEv0ZQ02L/waIt4ljyIg4DMf9hwQn0LPCVpCDtng5Sl6Xkuf7nTxb+/rv3id\nVl0rMIuUecEu84e9Ne+q6vSt1t/Yfj0eOsyCpl5XfgzwvMIKg4kZTb40SryU\npzc3XdpkAIAhp5RkcarRaQJ991UVXyRiNKn82v+7zWxgySdhDdeR4Vrizqcj\nPyaJxsB2Q2bZy2lhKtwJTs6nA2HRXBuTuFmZ409qTIfHF6s84O3rxC0nRdBx\n1vs393RtUP/N5AGg8ZbQFv6FNPMqQjVYRznFyFjTKLoyzvkfQ5sKp8WeSq0Q\ner5ol6gMr9ITEuXUAtlsTahBZPo6S5C/eY1iFvXv3JGa27wn93V34j9sbTxA\nVtOeD0HuGAFzLelmhVuTmAjJlvTEDirda+LWfY1C0Z4DjdTTDjtRTTk5AvHL\navtzg+Pmf7k83y9zCaCYbcrmC2V4fZnw7wKiF1VK29fwyJ89XvnmmTXghlsh\ni01c\r\n=C8EP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFwnuzCUjIfiwUlCeDTZs5ZunZ56Xf4uufqThKJp88zMAiEApc8qoEFQCldOaunanq20pOSVnu/XZq6jje0uuyfc+AE="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.40.0_1565799079570_0.40608814249226666"},"_hasShrinkwrap":false},"1.40.1":{"name":"warthog","version":"1.40.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"6d1e433e13ecce812d5a85e82c2b330c7a56d93f","_id":"warthog@1.40.1","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-llCduCn1rtQ3xt47qDcBzwW8uYpLcEYvNlNlYaQMYxAhTbvUBFsckTeOeGvl4fvdLlc43ovkc4+/UX/SNjPqrw==","shasum":"88fd681d0d2cba97015269714f1376fb4d5a3740","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.40.1.tgz","fileCount":268,"unpackedSize":488184,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXMs3CRA9TVsSAnZWagAA984P/jGpqq3NkqczcZ3i5vbl\nnprS6KYTDqRsahaSxKk994+RahxIeEdBSKLoWjbqfwuScOHbobDMl/5c+VEH\naQ3xXyY2EjUXfjn+w4j9bGSm/kwfJuCT9tCSi1kCsjGD20VcN3nEcKhySw2A\nue8VHgu+xjao1GfKDIACJw7Lb2CdRfRJOlPw63f7JtKWdSF6zSYDhJveBh/H\n9MT3HJDtB4DGtPg1Z3x3h9q6M9m0GW//XT3z8DhlAaDQk2b3QRkGSWfGltWs\n/8gdfwKbmZDWBEaEXn7KUEJ0O5r0TtFivwHLlnkyVglrC5EiwVeqKdth/3wq\nkuGPacgKci9/4khlcnp4FotAcDLofgtq7NG0EguyibR+kugGRHV6tlKJVMTi\nWbHkWZU5Sj0L9okA6e4WRawuPh2kKL+l81UUZkOxZW3TNXVSuELBhX86GWLy\nQxE5rUqvyEMoSYXt3lihJu7YZ6Og2rEmRGQNoVLriKyjB4/RcH+GG3NMF2Fj\njZM4oqLmKxAs8j0MRO1fTaPNNenbw+iET+yjBALWqgTSXy0+ZsPD6qsSBIQG\nXCIqXOsgrAn+ZF54bnekXczdtUR4iE73B+HrBwWETrG7ZX8NSsAe+ICEOg12\nFyAS8MmKvhhdtcmb0cwqTQDvnkH0xKvq8lXejXRxyvpABLXdDeTrUxFVloAU\nCPpI\r\n=hrvQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDBBaXMuJ/02rEV3uXRb0nMW6OYCCrKlengWLVTYbNPZAIgCUJa6b2Gl5GB6LAU7AcguWw75XcwxOwsH3Dql1bMLKU="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.40.1_1566362422448_0.8555272832615524"},"_hasShrinkwrap":false},"1.40.2":{"name":"warthog","version":"1.40.2","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"d271d2a026316032e1c91561597e1356b82db5fe","_id":"warthog@1.40.2","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-C5Dk986QRYCBP2YS6TmFUp+KCsqGp/wQspY2Ou304b+3C9mYdXzOSM/NNSYLibcwOdLpi6sBi/57SsvSssHLpQ==","shasum":"91388e43966d40e65d70c423231af93bb60c85b0","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.40.2.tgz","fileCount":268,"unpackedSize":488462,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXODsCRA9TVsSAnZWagAAkc8P/3ZZqktks9Kzo91GRX0I\nQXxkr/s6VWfb5jtkWqbxAW6fvyfue6SD/HUT4l0zYnoV+ds3Z7DF+LWH/HsB\nxUoX5RyyjM4jpyOkzrq7kJeK3nKkd/VSlt7ivw025uoI04rRyvc6EoEeXcdI\nEVrdy0cS6B55NYtdkb+S947cR7vyCl7aGLSeSAkGthNclp0qAC7Qg/LBtaeL\nGKOBUiLFV4tPfGqirBb1s6VwS91sjHZ0CMJR7Ku1VtETyaaDTKLnSjPueq1+\npyCc7n4Ihxl5cxDsKWl6Jre7AdyBhqtTsQSoVU0KGMI0YrH0wtSeLD0Q0a5P\nEaP7FWIACDV1VIWDJVikO6kos5K1XnmNDSTnIciDoCZwMFZvVrlPyOE9Hyk9\nOMjmIwFm5/LJUba8uzAOcCP5oZGL9pDZytvntzhhR8qiIUW3WzqMMyTW5HT9\nrQvpEBaWIAxk4fVdQY13XZKMODLtGJhuZz1jlO3q6SmkP9A4mJNu+opGP3gr\nx8mNJqjPj1MkIoKLFGe+bb5Om83q9BjMnzQvTSrOcOjYAWNVPXXN4zqw00dK\nSrT6LOriCN0HoL2fE1pY/KbE9YtbbLYuviDz7EOuztt0mzF5Y6rOObLMX4dQ\nDs859Y16I4IrtPKi/xubxq15CfZhv4dtSc4rru6oWJNnEecsj+tE0TBo56eT\n1IFR\r\n=5zhW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDhBAXSwwbLlLYEL3opNzlaeEBtlO+BEnfSyHTJPfhQpAIgBIJNowk3gQofTIDdH61TPIZfS1hoyOBwPBTiOmf5ud0="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.40.2_1566367979465_0.49591721608681794"},"_hasShrinkwrap":false},"1.41.0":{"name":"warthog","version":"1.41.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"25767b8b728f67a2bda3f6048e627e8e374fd90e","_id":"warthog@1.41.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-52ffvI1bzP0I1YSrfoZmyYswNEev8hG87z5mDHDwuDIsAWLllcwHNCXZGwqM/VQ1/mZAgBpdXH7cEw1yTb6cjQ==","shasum":"01a54bcf7bbe3fb01eda451f01bad9035f79efc7","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.41.0.tgz","fileCount":268,"unpackedSize":490644,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdbyCUCRA9TVsSAnZWagAA21AP+wUK58dnF5C57TGlGxuW\n8cD0JhrTpQdXlFDtxQ4AxSSFKfT8pp1gaBXE/Ka4Xh5n3jshCXMoL0CvwW5A\n+uXnkKb0wiV6VIqQXA2xWU8+tHCIrl+MgyEEn4yCQHcdyHbm034+Y2fQAnrM\n5JpNYNLYjDuj1srizcpqL7x/Aj4AAQhD5bUREK++Gw/2Rfr6ckmYPDYO6mCm\ne3ZyOpXcniwBuVLNJnDOK1BE+S/osDZClL9nL3A+SdgLONGj3GaDvDdHMBDu\nQswl/iO3f4f6RUnnl4QUZnFZ4EfREvpvqIEb59Kxqvp4hbZ4YgKtc9coWgaZ\nGqoOsLSVfmzxxH+MtanJwFjeC8VnAdyo/CsfDabdMidN/6G/nyjc4fwvfKO2\nWn9RMd2J0PBDymgDE6bcVuG878mQ9ATni9KTpMLPxBVWUvXYwO1aDSkWhN9/\nQkuc++d15xVkIMZ1gn4zjLZBqB37l6mhInvCi5Gf8GToYN/xZ6RA1Q39fr6a\nRIVMATAz42IIdmRHnxd16Vz5aV5enVOHj6vYD6kUbCDejUD5Pm02AMX2LCAp\nw+Be+JK3KnLpd/0NZ+BC11dUVOI8D0iIQBUUPNZnzsB4lC+c5VffSSdFHt3O\nCZUKtrGYckyxkLUi0EoV1GFA5edRXpW/nZk3Eb0lC8bU3jMg6HvVFLOPu1aC\nbVqk\r\n=tMko\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEhU+niN38TMqpGXP7d4M5ErzVWwDYFMANBRXQGKrztbAiEA8FkONb1hVJ7QJgfyu1Aj4PrmOKArpQw3l2WwaBAX8W4="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.41.0_1567563923960_0.5077897198993795"},"_hasShrinkwrap":false},"1.42.0":{"name":"warthog","version":"1.42.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"f52de4907ff6a6e25ec4c661e148785f462e217e","_id":"warthog@1.42.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-/LJv4y1TmW5mdYm5irYwoMdqpc4eCZASZnineiAMQ+mmNuRK1i0Odg2sYhdmZyR2O6SdTrM0PwpWwJ3ob/EsDg==","shasum":"a6be3c7815a84b57ae857dcc2f38f60dca4f8798","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.42.0.tgz","fileCount":268,"unpackedSize":491842,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcGpTCRA9TVsSAnZWagAAN3MQAI98arArA8Wb67SVy40v\nHoB7vqr6SFOyz1zr39yZawmQ9FomQWDHdBi66kenV/XXWmMDW7J3MjvCMS6Y\nBkoUiy2XBkt5y5EplhZGDL4BjPSwnypFm8AzW+UgeCPQdoTWo5pbkOThLFFB\ntTlRSuuI4hh8cCiHKXi850Wg/jQSmvvSmm4dEkblD0VMRqHbWwmEMAs4L4zw\nWHlAMClRGsuugMO7S0JuHjUdu9fby+T03fCB3xGf7UIZB8j8H/ZGd3VKNAT8\nwcVxE/afS9uAb/JSt31MnW/j0eb/YGirMSBcHaRwAQjqhr810ZxSrSIBMurV\nhCSqqYVvU7zt6NgjBP5EGA81iVanzaZ9/Nbw/rAh84Yn/4WTW0fu+dEkKtLj\nA3v/ffQ21hskF4f4sFVqdP6qBnMOzFoWgivrmqIZh9huAw57vdXiKIaSYcXY\n/nuS3y7ADySFLdfY7L2/eKisWtpl/UPxTI2moEePI9CIeMf1LOasgEFaKOUb\nssb/7uuaoLSfE52g1NZT4/RiWnspGKaBhU4+agCcCA8FVV35RVqmyDvUeywe\nxOT64mRDPxrC/REyvNNXGL7vzM8C5WMp84mRfFuQCpPiU/zMNbAMEWcPzYlM\nihTjmFZwAOdcMWnVKPZ99Qx/NOsdOld2RjAQhHP0k3UuOLyiKQpghFnk/qSl\ngdiz\r\n=vI/l\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCa23SanMYYU15DE5nym8prqlWt1OiPcCqjyGuhnu7IGwIhAPsHjZYPkDe/t3/J80nD9W5OIAhu2uB8OkGVFHyx7kP8"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.42.0_1567648338381_0.23602317458197875"},"_hasShrinkwrap":false},"1.42.1":{"name":"warthog","version":"1.42.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"e3661c8407563e6287a3f1000fd84c4369e5a4d4","_id":"warthog@1.42.1","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-xYj8jeuRzFcYi95NDQN7D0EqSTCNneHSOl4+3BmA58aLIj4KqsBPn386WaVNaDC6wv3y3SpBOCPTClSqVmlKbw==","shasum":"bd6ea5138ae42afc00548278fdea0458c44ae38b","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.42.1.tgz","fileCount":268,"unpackedSize":492064,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdeY0eCRA9TVsSAnZWagAAVvoQAKT/pyRqJx19YFCuczgL\njQxEj0KH2l5vOUB1Ppg1y/B2LTuK1oy4Xv/4sN3DJQ77KuIvgTjqCvkzpFYr\nSb4ob4l9BW5cRHUAXCDcWl7MY9j8qstOVKaNQLQ76LZi/iQF/sEa6AUT0A6K\nJpVDaoou+RLcVXQUmQX+jM5Y+tf/HHHbRp6a+LTyBwi7Pzuvl/CSwnko/Ir+\ncLWb4Ll3NcYnPFu/rj6KupqxVV6dr0db+KvjiJphJIHYk3PZvk49hpR4rL5l\nNt3PoQM6gHOlV2rJkO/1iGVQ8dZfBxBV3C7StGcSzjSxiQveyCKVCJcOsS5i\nVWdMIwvPvwN0k3Vmq9IV/l41CyWAwpPU1Ww9/2+doYSdeUWvOdGi3piFl5U8\n2z65LoIGyiUcMwT1d+2dKiCHWKJ/QBMMjuNtHESzCpR05CEOGvxrpCWJuccL\nDpFRhf0WFHu3mGNHgJxUOV+HcqjXW3X3mHArNeS7qwiBKVAP5bdXOeLnN2gl\n+qFu6plcwtFKbkWebdJQzeyPIBblhfTp7Xcbp62ibYsdBAvEVaFHXDkmG0iM\nBTF6g3ba7Kmw46r62soBcgSklpmA2wT3A0z7eXQ5KoXtzKTVoP5clEyduO2+\n3+L4y+/ZMZIXT5yJ1GsDxIKCGtxF74x6iG92ahW0YODvJqnpsY6vcm2I6kxu\nJtbD\r\n=W/uW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD3lbzgwvRRafLTtc0hqB4ElJMpVoZAVRs0vHt2gm5ZtgIgZaA8qpMXkvsHXl1ZFxbL8WE8iavO4F0s3YSxDi/vv/Y="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.42.1_1568247069919_0.9653526570968529"},"_hasShrinkwrap":false},"1.42.2":{"name":"warthog","version":"1.42.2","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"a935ba9646deedd8dab54aeb15c446c21c9f9205","_id":"warthog@1.42.2","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-lsz2aMU3s2tyIvnWxajVSIOS/CVS5IYd+iaDWjokUU/ELoBEK0I74t4fDF1LJbRh3qrhBVdfUef4R0QuQ1GTdg==","shasum":"028e217351a3585c1f15f53c5a28f55f00ac8460","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.42.2.tgz","fileCount":268,"unpackedSize":492054,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdedJiCRA9TVsSAnZWagAAWtMP/2EpFSjcqUqXm+L5Qcn6\nafXlG08L6rllmIMGoH8ULZCDPVP2yBFcPhkh+G1/7rHDkZHYXbG0XPgwUEG0\nyBiZvxE66lYoj8b1AH9rnsmVw/7pQoqA6Oo1X468oIbFkINKWTAIKAiG7Q9G\nvy6zELPxwnlUzX/BVbujixzPRWW0Uykw9bdt52BOAUHa++4BN0lsUs21HNkP\njO9QZjzU7oMghGIq2R4ETJei7aYXEntsEpKcOCjh5vvVbrwX2f5VCdXgOGlq\ni8x5qTU1/DyTlUweU8zzvdTj2gNP1ZYWSeb06iXaF5S+pVY3SBv5Utbqz5r/\nMC8UcYzbnJz3SAS5MOiZByIUSwb9QSqo5XIs8xaTRweCdumGUgfplkb0/Hbt\n6UrBFK1dtqcIr0an/kdXbydtQnJGsSkqaQ09MP2dgbLnHXjs3NhoFagy4zNv\npsyrvsFW7eJirO9tH1/7xQUIi7WkqIi7XFBOM2EbhsSGWEHt6hmvD0rFtx9I\nuDn7DwWbfggsiXkVNS3o3hN6Xus/yNauxQwNKEIZ3+SEzD72HyO08SiN09i9\nHMdLMug01WrVjfudW6ygqxGAZlrXuUo9iHiLdlp9Dgqs6rGCk+/WaKQ+JNyF\nRHeDW8bvn4iBsTpNBIUjl9f3uK0YrSwnTwHCH5YjRQdmU2hEQNR1dlQZEQ7W\nRuRq\r\n=ghz+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD6z+UGClB+DQIhVe+oABepJZutysIlAGlq2R5fLaX4iwIgfoSNaX8sEHL1zAbFFl7cDe/YNcmyFxsPkRRldGH/Mx4="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.42.2_1568264801443_0.3427027162590077"},"_hasShrinkwrap":false},"1.42.3":{"name":"warthog","version":"1.42.3","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","nodemon":"^1.18.9","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"b70671cdac03278e9c6cdd2be430c39c1f854520","_id":"warthog@1.42.3","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-bbMBPwzEJSQDe7N/LAdiqTcNjQZSLlIO3Nhdc+uvmsaB2zJP7nyDsCixEcIxEtv9NBYb8FuIIlyVAU5cVdmOEA==","shasum":"ed393f51a1c9a60aaed2b649f779b65aa84c5bb9","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.42.3.tgz","fileCount":268,"unpackedSize":492751,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdew5eCRA9TVsSAnZWagAA6t0P/16MuRM0MERdgFkFqnG5\nqkMJf5l7gf+sTH9hKIvIOss1mo07vlRCZ3HyEvgDmI4Lhvk8xdjPG6zMVH9O\nKY6zd6Ge/+PPlE5f2woZR5FPEMpeS5/SvTF5rf/Xs0sVwD/RZLa9zLC6RiSR\n2o1lctl9E8QJIi5T9zuMEgnfFPrKTcymCs/Kq4+JiLtXp0RjvhAc04ncvQNd\nXlirVOkdbFRMoRjzS2aUPrdQjGACnYA73NPJ7UAHlQTnAih4vXyE5yjVG+2P\nJ7uRmY4+BHgVDsXkR+Va2TAlRWnVQbEm5uRqT4KMUXKTXI1fGurAH5N4VvWQ\ncyqFyn8BNx/GYPLEXGiqa1FdBJd40y5OSSo43Yt9BBZCaQT1Qh0gc/bw7i6G\nmH8G75offmH5Kyf94FtW8zK5kkJwj/2n0gro8M7KtteJLXPZ7T6zrFp9jAq/\ncSfrVvUl8w1wChLWsxDF2zmSWVu1+aanMQAf2ZmnB88xWCw9hqByJuCQMLnw\n9wFwPItB5HqnG36SKyB65A9nfCnMSIKfrKl2GPa79C37W5W/JvlqpaltWWYd\nePUm/7atsGsvjUGco2fgAbJ9dgnJHmVv5kxR6dX1czPRSlww0sIck2KkmLVw\nPJtkpBrKB9t2dTreO9YNg1RJXPxsWY1kUa6sz21DEHKXzK9S8NSqJOqcp4ts\nprk0\r\n=I9rw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG6G1VcXS1q5Yrm6FMHu3A3+TgPMZy5QQg70wMCbfq9gAiEAirV4r+K05GgOzRKxeUBtcle8Z/D0cCM1slDvq7++Q1I="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.42.3_1568345694104_0.011498058541268952"},"_hasShrinkwrap":false},"1.42.4":{"name":"warthog","version":"1.42.4","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"f42e30790388ce41cf1f18d28f14ee004220f918","_id":"warthog@1.42.4","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-8jkK7/481voAhLGO7Me3cew+ISrTtIoxHItAF2kWAQJloqEJQ75lOrHdteNgnupESiec3wS8Dp54Fw1m7g1Hqw==","shasum":"ef64a7e61e26de9c284af60ea93a5ac79758d524","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.42.4.tgz","fileCount":268,"unpackedSize":492725,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdfVqTCRA9TVsSAnZWagAAg+EQAJZuIhuOcEeSl7Ofc8FU\noDuvrtsF3ly4yNRHqWTtchOqyt2WIG2N4fXRWQygxohJsts4JiJXbrf4qxMf\n3F/glQJldlTFNyHDTqQzUK6iZA4Tf/nyJeJLwcUsL79+cRkS7irYSeSinRFh\n4Ez0xAV57Pdy40+QJmBaRafby8SUW6use88oZc9ZaXfI0Miwi0jspxluXQep\nbSS0GAeP4xLYsCN6H9BtJmajKYPD8adDOFY9SntiRRaa492cix0eUuvJ1+UJ\n3KahOIilyyFPSwxGLP0hXXsimcib7BdNNaXgklqFvLvmJfLsaXMEEeHdCJCC\nmJbIa/kh9oH16cObCB4LNh6eFldHa+8opnNJM/Ft0KxvxGkSlNTO6rf3jSp1\nnjry6BIQnAZbosJMDMnc0KA4sVU6E8OL/qTJ9iUGnM/MLh+0CfGZrR6X/rr1\nA2W5lzZ9RImY3ZtpDZxRbykAU5gYGevg6PV5GEgIl62+UUjPjspQKJtZKQFL\nLw6JVKxmF+bfM5nuYpmf7eWQaeFa4LR459L4+IB2ICLXnmPPkqegmK0fXchA\nl/m7fsF8ICL+ye8TwwhgHaj18xy2lQ43n9z/a0uzZG5IbQ/22lxosFFLiHT8\nm7/RcVCa7EhY34ss/AKfvO7pC4qKWUC1ye3YJKiiLLMwq4GO0yrXSOiiGfXg\np0oe\r\n=1I49\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID6soW30+Swgi2JMz750ox7dlcGjvZWdjawcGGe2UPo1AiB01qdO3wi6Yxd6s+zCF1fRQOCNxHtFIqCd3Q0PKqFBJQ=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.42.4_1568496274675_0.7243819350355394"},"_hasShrinkwrap":false},"1.43.0":{"name":"warthog","version":"1.43.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"5751cf45d7de1950a4570dd694a0d374f3487adf","_id":"warthog@1.43.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-rnwWaQcW6ntrmxPM2yvyYNJyz66IerURZ6N6nnBNBNIQ0xEsw/vdJyZXkktiqn/pvlAJQlCP3YllRoVSD1Imlw==","shasum":"42125773cb735e655890a506c23336079fa37c1d","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.43.0.tgz","fileCount":268,"unpackedSize":493037,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdiR0UCRA9TVsSAnZWagAAbjoP/iJD8v/+yM4O2SYS0udI\nw4/yy21M4LsgunWqA+eTR5U847rFK0Duq5iXVsMZ6BSMWkFHvthOA+Ty4DZY\nTuUB+zw3s/ejialDuKkU9GdzYFiom90Rxg8AlWRTvP+2iie8QFkCNS/zA/vV\nqGp9ORpSTNjjfuXsBEJL5hySAJU1q0lVYnsiOUYF0n0R15zUueLQDWzgrM68\nBDUCTY9MikR4hep12SfkN5MsEOfmsejBhHcVmKh3NYtOwURcTxemABwHipC4\n6a8Wu/lIvyRAkY6c5DckTdxd3Q78/cWj31Ufhzzuuno9qhsDH/oXl9bP1SL8\njQ1NozE3AmNg6onQkALo5vvrrcxd0vJYubKWaaejQH6t9+vh7V/Nq/HzrRYX\nF0fpGVd+hlrBPaHBiNi7XuiZj7XaBR8HoFMPsBa5dfxBU6++3o9vckbJlOIR\n/GkdEt1sKXAWRFg04IzM4XloApJKbf1q4s29AHaBbF2ZeyRdq74qG68zjJtL\nKjkau+Rwqnmnqc5VolfOXXCHjondQIYqVlfeHLa3FEvR0s9sXHzPrCMRjXb0\nhApkHTFM9LPDkNZqVUuenDppidzdTZZ1Sh0dYSSo2vh2zBlEeUcDH54W02Un\nCVLhKU2aLwyFkPr5HNIsz/7tTJqbqPvHTUhSjkl0gqVlVm1kMSTiPydQyCF9\nwTKR\r\n=pkK1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC+wKnFSsAlw8esus/l7aY2YY7oL042e484JG9ylY7QeAiBTZI6BPAHqpeCYgywizpEe7knYZlSYeeJ9eiYA4qXADQ=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.43.0_1569266963253_0.5594989866867508"},"_hasShrinkwrap":false},"1.43.1":{"name":"warthog","version":"1.43.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"78e938e2b47bab829657d6f021369bc569c370b3","_id":"warthog@1.43.1","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-uD4oeEscbz8DH/zZbLyC/yr60TAkOP8gvhI+eJVeD8RotmsBZQtD08FsiQXJkgy5vGI80Ri6gWdJDVjHq0N23A==","shasum":"b65abac6d10921dfafa66e5f703166bdeea309e3","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.43.1.tgz","fileCount":268,"unpackedSize":493103,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdmjuECRA9TVsSAnZWagAAWUIP/jyW7+UL5Gk6V34qQoM0\nU/DaA5OKyiuerYN3Oa6Z7k9hqkekjrA7H8XIC2xEVdqWXndGb4MioZb050Mc\nCdOo+H3QuSOg3P6QvMyf0xjzqHQro/48yFfHXYepxksACK6zrCqzx9VYQVli\nc2eGPHWW+tIs7br90T7jLgvBPt+zD2NX24uBZMzXqEmdxVIaCOWw43l1RhrQ\n+ZDnYPR5MasDdZBkoc8IQD3EYj+5SG7pBqGEcuwWo9gBOmtdYKKVSZLnA/xe\nFC6w/nf/7varBdhxiwxr1dIEwBsY0EU2GphMS5Mi7rpo7UrZZrArwhi7OSPf\nNETfL8/+wvYsoklkGUjkodkEbptWilsArc78+30i/viyY9Qt0B7fiMgaf6Wh\nocuNgpYLw/NxrZNylUL50DM31m4MFYavcDnpV9lg/Dwb7DSRsVCXSIwAWdsg\nhT77HpQmt6HhLX5h7DH3zk84gjPHFaVjd5eFNaVL4qpV0loXdZwC2WnnXyYu\n2aGWQhBi338oi7WCWQMKdi8f4RvWJcKPMI0YeDZI+D6h5WuSjDdAdu/oc/40\ndvLdM6iwIDz+3BMoxHAyvi3vQFHfd1iIeZH0mmVEmJ4emBokJbRODH8JjK5Y\nS2OoOJU5w4+1oxCIzMujBbUMNuKkWjbBDhs82kQSlcIxKefMjyhBuAP+Mrjw\nNi5X\r\n=748m\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHvnDso0EVv+Hc/Ll2InKw0MZAPJzoFQ4Ldl7OFNkt2WAiB2xFSs6SS6YBKD38M408NdDNK6rQgn6FQccc478S+AlQ=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.43.1_1570388867225_0.06958211479708476"},"_hasShrinkwrap":false},"1.44.0":{"name":"warthog","version":"1.44.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","condition-circle":"^2.0.2","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"677d04c598f53044e9fa8a452d19b2936db42ba0","_id":"warthog@1.44.0","_npmVersion":"6.5.0","_nodeVersion":"10.7.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-7i6+yL2JH/vO1ij85Oia2LRPiygy2fAnaJ8SCVfV4MLH2RTxFz3GMjuMNmJBlB4IgxyDDrGLKtuU0FAkJqDTiQ==","shasum":"45fb1158e15a3495da52a28318ad7fb18f4e5aba","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.44.0.tgz","fileCount":268,"unpackedSize":493106,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJduQefCRA9TVsSAnZWagAAanQP/2AZ/fvI5w0IUe0Oxcvg\n4LqzQ46KY63El+EPtT4Iz2y7/1Psp/c0JJ/uElEmk1zhLdcHjCWHF08z2MLm\njtoM71I+4GQxbvSWoyxEVo0l61i44HBSziwix58d28yfITG4gJipzGRNL1/5\nCAaOOdvAdqAYtQGrt7N6FbIEn4ix/SEO2Eup6VL/x3fUBthq3QTXv+feCgG1\nppt/KelZ6CeDqpTH5Si9TVCbCkxuvy+htU4np3El9r4PEDurKyetWShdJ1UT\n+nlBRVqfBwi13cwEK6M2SlZbnHky7YA9jiuK1iNvGUZjXZctoCqpIljvp0zH\nIkGiFp5KtMT35dxWFZnhx8871xaQr5xT/mnMe9sTnL1oqJi3pcamx7a76eS+\nWfavbAwWDWvVFdHglS3p11y24i7a84yBzF6dn+Xe3RMbnTiQ9oaJ391pxwFL\nO7XYL+uZeUQDg6pheILmTiRFPXr9pdpwa3Gp7BT3BMZAkNMp4oXJMLUUgrG2\nHtYgJIiuuF0U12wishkbOdyeGTX3iRr/Aclzpjrb35FqDgdYWiTiWoVA7ggz\nQR05ilON3tfl73TFVlBqfl1QipeinxGwHNnDhoL+wvgMX+bOkpZYgoGE72Vj\npdieHUrXwSg5X1J/81uFeZkU1aNDFdpY1z3hTnTGcfLtbx9x1EFFE6ijwONj\n3sJS\r\n=Wrlz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDviLSSHdiyu/bpoFmDuPCSK8WBeEcwWhPD38Vulr/wCAiAElhLtfXpz0bYGjn0kBMD+etTeKthCjNbDWWisudeOww=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.44.0_1572407199426_0.22417315727943365"},"_hasShrinkwrap":false},"1.45.0":{"name":"warthog","version":"1.45.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.2.0","@typescript-eslint/parser":"^2.2.0","condition-circle":"^2.0.2","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"ceb540154556023a814282f33d4d63ba2632ad1d","_id":"warthog@1.45.0","_npmVersion":"6.5.0","_nodeVersion":"10.13.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-txzhYPzd0bbZJd+sBl4lF2cc9mb83lq7KaOoH25edmdauJ5AsxAIpt5Er8rCRxZ0+rRUNSuBiLWn8xHVO2gkDw==","shasum":"944fc3ce698f8db0d0d2f74b1a0e5130468a7dbd","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.45.0.tgz","fileCount":268,"unpackedSize":493146,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdulQUCRA9TVsSAnZWagAAXNEP/iSfM21LI+hJrnEuX+Wp\nPfAAInmBnWXD5ohgjbRwMpMb20Sus6GqZh84QMb0ZAMmFZJnd9z6PBncZTl9\nfVhqN7D5bCN15QGe6bEyYzCN2QZBAkFQs4uLKUy6n0CYnCEumb2iQq2GMnqb\nAEAj/u8oxJy8rFxfBHz7D/37ayUNrU5CvtIA0gRVCjYtw3ph4TizpNYYJntt\ntJd4aNMr9tjfF62eYyCHG2Adouw9psVeF14FDDHCoFKUjdCZUaR6U9C7vzK+\nVarD3ZDw2dsb9uYDAVvhKnlVxcR3A7llBa7TThpfHHUnxLmgpKF2nFo9nbl+\n8nCYvSguniSjB6mUXlklbr2s+EvFkexw8M/fbvuJvUHNBOT4+usn0riD+Mla\ndI+FWfEFOkBCOF0KSDqhW0LfU8LMVIuMrNKskcw2T+ri0ZyHKdOCyLNBksVk\nQQkmVjErsfmJox+OApwjwh3r2w3+IJg2CkVgRpXHjJgdu1emtO6KUQCpII5P\nbU/8iu2gzExRf+aq1zo/pr2fO62aS7WZyWz5R9Ue8dSWUIgfxcKu3TtNZq+k\nju//jRs8t4/bBWHEmkiZghrRTehyRwRxCVsiYN2nzKSwwXY3FoM8OgDLGlly\nNJV+9Z4rLJ0Oq1P7ZSAJTHOVQuh3GC9zntP4SQ89YQjAwTcAcK4HfhFTYgn7\nIQwT\r\n=g7Ej\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAOQUDf1AORowbNXfQmZN8NjR8AzD6FU+29uIatOX5PmAiEA+2cEjJcMlnI5gfjYEhDlYebQkbVcn8kQQBi5HWOb2qg="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.45.0_1572492307577_0.8414124384699122"},"_hasShrinkwrap":false},"1.45.1":{"name":"warthog","version":"1.45.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.2.0","@typescript-eslint/parser":"^2.2.0","condition-circle":"^2.0.2","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"8f68e42ee9f2c91bbd44cfb2112f1f8c598f1590","_id":"warthog@1.45.1","_npmVersion":"6.5.0","_nodeVersion":"10.13.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-fv5XynsXHKnpFEIS5YpuZJl1lpfxaBYMelhnKju412ZYoW747YLZEwpYWyoPmu4qv16bi2GROBFt9oEVOiEFxg==","shasum":"4c98e94d4aa7ca815521391d39d624739bb1345e","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.45.1.tgz","fileCount":268,"unpackedSize":495232,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdulo0CRA9TVsSAnZWagAAYG0P/3rwMyO9PqaCH3ai/bYp\nod+FAW9eCjaYkeUkZ4j2ewcH3wKueXf9eGiOeUHMm9aKCwO4uFdC6lsbZ5XD\nzEgcLnZyHVHynvWz8Vd8ILvKkxF0NU4VCPTwThD93xkXH/wM9xWOZXOimz9T\nfgp95z2Z/WtqakhDtp7vTuoT3+3r49FP6x/Jqylc4zp6MGkOlY/bLSRNBU9X\naBk9RyK0UDW00sbLqMgMuQzNksBGb9FNz3P/5C+UG89wPFb08ndb90WorWyk\nlr85Zsrf4i9gLSlcfbkxx+SPQrHTtREi5KBa5q1+r/bca/eXPVX9V851xC7M\nl9jDgut3QyPed6IzVyrRtrUMvoxWz6XNqK+RpiATMSw28DiLEMMdg7XGK/ln\nePa7qBk71dpRS7Hs5Th0/dYR9AbuI/dKlf1T1OUd3zbHr0o6fO0VPxx8AJhr\nzfeV7AM6xtHVHpXHRKEAZSUdM6F3mFI9XcsW7UbF/UI6QaZjyF38DJkMXi/f\noyqjQhhN3JRjLDM0basVib7PxQRl++k02DyduAs9b9p9CC6qXkuY8RINGDmL\nWZCM6Uw6ZAYd5FsL8/lnU4KcfOEhendu6LTQ4SF57uEsDeNnDQDzke4rt1eU\nnsKOHlOubNTY3P+WXouFiorgBCg9wUxXbEOikRLG138fzTOXa+xH5+vSk90q\n5lW2\r\n=jGNh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCRWWBTG4fRShipq4j2xGbkO/mJaoDwSpP0ZdJJO4mcbgIhAJNY+P5J33lCL9WxR7dxWl/ppJdomOo9ybcODVzr91Ew"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.45.1_1572493876078_0.3634168259018935"},"_hasShrinkwrap":false},"1.46.0":{"name":"warthog","version":"1.46.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.2.0","@typescript-eslint/parser":"^2.2.0","condition-circle":"^2.0.2","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","npm-run-all":"^4.1.5","semantic-release":"^15.13.2","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"release":{"verifyConditions":"condition-circle"},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"52420feb31504652ef1d4f5dc26759cf6bdc46af","_id":"warthog@1.46.0","_npmVersion":"6.5.0","_nodeVersion":"10.13.0","_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"dist":{"integrity":"sha512-qtbwY72eIVasLqMancmYpvVnOd+JPSLoLhS/nwrPIyhKIwDF+1BNSm4w9hjSet+/u5FQHk3h6WAkH1Wc4XvGuQ==","shasum":"383089bd276300216bc0c0e2fe3f1cb62d91d7b0","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.46.0.tgz","fileCount":268,"unpackedSize":495232,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdumNTCRA9TVsSAnZWagAAGYoQAJzHs+WSS5ki7Qre4Hcy\nm3fOL75WGx+XOJ9F8HfXWKpmKr1oVEF3rD0CxwWfz2luE/vOdl8CSrMNG6FH\nGDS1ZOXsToDkCRjVQLPiZP2v1yxEyzgomPflqkfWyooJshYKrf1PKghNylvA\nF5HgOalaynulU2EU6xCTeVEJ+vfX0WpcJXGiTk5hRJnn+5AEI1CRMuEkb6oq\nNX4N18IuknbWdD0xEow+xWMLMYunx7/v7ybG6CvaJZ0JYTpfvVcZMrZAsnXn\nkGHuwskNfdzDL56zYXjcoDCPhGDEZRndiMTnqXnWwxBz1Q8Dzbiswp13gG+T\n2RnQEOQIzG85+HpvzgQoODeibD0PfzxnPFHWp/4015EBW3bHn2d7UkfREJH1\nINi0PIbafmTgRTvaPRIR7WCuUJ0vKt4/w5JGTIjxr18hJT5Il4OktK6NIyMi\nBjzl6324oRGTXfvTRKVwzfhv2VAaPaROTSUoI2kOHfH3QW9/YeO7OLjI16Hg\nXKPipVn8eA6hLCvgEre4BRZUhqI1OPUQeDWnYDFWZ4NJtvZE7DBBHIjlMcHj\n4QXCi7doEdETQ1rvk6No3lr6P1FMRgM/rt+GODyQaDHzCYrQ+RQpIYY7AsMA\nD3rgnwdUxoacEWlZA4pbKd8bmG2XUsb1ORILOWtzIEBJo3tv0JPxtV9aJCJE\n01u0\r\n=3M2T\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA/UwkE9yc9P/GM9wTXjXdhGN2i8w7A7J5yDwRrZtEZOAiBu68uiW3RRCVeTlJOofmTzPnnWnC+rrs9aZa0aDAJmoA=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.46.0_1572496211502_0.8434709635397069"},"_hasShrinkwrap":false},"1.47.0-beta.1":{"name":"warthog","version":"1.47.0-beta.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.2.0","@typescript-eslint/parser":"^2.2.0","condition-circle":"^2.0.2","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","npm-run-all":"^4.1.5","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nYou must have Postgresql installed to use Warthog. If you already have it installed, you can skip this step, otherwise there are 3 options:\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n### Homebrew\n\nIf you're on OSX and have [Homebrew](https://brew.sh/) installed, you can simply run:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) or use the Google machine to figure out how to install on your OS.\n\n## Usage\n\nThe easiest way to start using Warthog for a fresh project is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. This has a simple example in place to get you started. There are also a bunch of examples in the [examples](./examples/README.md) folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n### Installing in Existing Project\n\n```bash\nyarn add warthog\n```\n\n### 1. Create a Model\n\nThe model will auto-generate your database table and graphql types. Warthog will find all models that match the following glob - `'/**/*.model.ts'`. So for this file, you would name it `user.model.ts`\n\n```typescript\nimport { BaseModel, Model, StringField } from 'warthog';\n\n@Model()\nexport class User extends BaseModel {\n  @StringField()\n  name?: string;\n}\n```\n\n### 2. Create a Resolver\n\nThe resolver auto-generates queries and mutations in your GraphQL schema. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. So for this file, you would name it `user.resolver.ts`\n\n```typescript\nimport { User } from './user.model';\nimport { UserService } from './user.service';\n\n@Resolver(User)\nexport class UserResolver {\n  constructor(@Inject('UserService') readonly service: UserService) {}\n\n  @Query(() => [User])\n  async users(@Args() { where, orderBy, limit, offset }: UserWhereArgs): Promise<User[]> {\n    return this.service.find<UserWhereInput>(where, orderBy, limit, offset);\n  }\n\n  @Mutation(() => User)\n  async createUser(@Arg('data') data: UserCreateInput, @Ctx() ctx: BaseContext): Promise<User> {\n    return this.service.create(data, ctx.user.id);\n  }\n}\n```\n\n### 3. Create a Service\n\n```typescript\nimport { User } from './user.model';\n\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n}\n```\n\n### 4. Add config to .env file\n\n```env\nWARTHOG_APP_HOST=localhost\nWARTHOG_APP_PORT=4100\nWARTHOG_DB_DATABASE=warthog\nWARTHOG_DB_USERNAME=postgres\nWARTHOG_DB_PASSWORD=\n```\n\n### 5. Run your server\n\n```typescript\nimport 'reflect-metadata';\nimport { Server } from 'warthog';\n\nasync function bootstrap() {\n  const server = new Server();\n  return server.start();\n}\n\nbootstrap();\n```\n\nWhen you start your server, there will be a new `generated` folder that has your GraphQL schema in `schema.graphql`. This contains:\n\n```graphql\ntype User implements BaseGraphQLObject {\n  id: String!\n  createdAt: DateTime!\n  createdById: String!\n  updatedAt: DateTime\n  updatedById: String\n  deletedAt: DateTime\n  deletedById: String\n  version: Int!\n  name: String!\n}\n\ntype Mutation {\n  createUser(data: UserCreateInput!): User!\n}\n\ntype Query {\n  users(offset: Int, limit: Int = 50, where: UserWhereInput, orderBy: UserOrderByInput): [User!]!\n}\n\ninput UserCreateInput {\n  name: String!\n}\n\nenum UserOrderByInput {\n  createdAt_ASC\n  createdAt_DESC\n  updatedAt_ASC\n  updatedAt_DESC\n  deletedAt_ASC\n  deletedAt_DESC\n  name_ASC\n  name_DESC\n}\n\ninput UserUpdateInput {\n  name: String\n}\n\ninput UserWhereInput {\n  id_eq: String\n  id_in: [String!]\n  createdAt_eq: String\n  createdAt_lt: String\n  createdAt_lte: String\n  createdAt_gt: String\n  createdAt_gte: String\n  createdById_eq: String\n  updatedAt_eq: String\n  updatedAt_lt: String\n  updatedAt_lte: String\n  updatedAt_gt: String\n  updatedAt_gte: String\n  updatedById_eq: String\n  deletedAt_all: Boolean\n  deletedAt_eq: String\n  deletedAt_lt: String\n  deletedAt_lte: String\n  deletedAt_gt: String\n  deletedAt_gte: String\n  deletedById_eq: String\n  name_eq: String\n  name_contains: String\n  name_startsWith: String\n  name_endsWith: String\n  name_in: [String!]\n}\n\ninput UserWhereUniqueInput {\n  id: String!\n}\n\n# ...\n\n```\n\nNotice how we've only added a single field on the model and you get pagination, filtering and tracking of who created, updated and deleted records automatically.\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => object`                                                     | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                     | value                                       | default                     |\n| ---------------------------- | ------------------------------------------- | --------------------------- |\n| WARTHOG_APP_HOST             | App server host                             | _none_                      |\n| WARTHOG_APP_PORT             | App server port                             | 4000                        |\n| WARTHOG_APP_PROTOCOL         | App server protocol                         | http                        |\n| WARTHOG_AUTO_GENERATE_FILES  | Auto-generate files                         | false (true in development) |\n| WARTHOG_AUTO_OPEN_PLAYGROUND | Open playground on server start             | false (true in development) |\n| WARTHOG_CLI_GENERATE_PATH    | Where should CLI generate files             | ./src                       |\n| WARTHOG_DB_CONNECTION        | DB connection type                          | postgres                    |\n| WARTHOG_DB_DATABASE          | DB name                                     | _none_                      |\n| WARTHOG_DB_ENTITIES          | Where should warthog look for models        | src\\/\\*\\*\\/\\*.model.ts      |\n| WARTHOG_DB_MIGRATIONS        | What DB migrations should TypeORM run       | db/migrations/\\*\\*\\/\\*.ts   |\n| WARTHOG_DB_MIGRATIONS_DIR    | Where should generated migrations be placed | db/migrations               |\n| WARTHOG_DB_PORT              | DB port                                     | 5432                        |\n| WARTHOG_DB_USERNAME          | DB username                                 | _none_                      |\n| WARTHOG_DB_LOGGER            | TypeORM logger                              | advanced-console            |\n| WARTHOG_DB_PASSWORD          | DB password                                 | _none_                      |\n| WARTHOG_DB_SYNCHRONIZE       | DB automatically migrated                   | false                       |\n| WARTHOG_GENERATED_FOLDER     | Where should generated code be placed       | ./generated                 |\n| WARTHOG_INTROSPECTION        | Allow server to be introspected             | true                        |\n| WARTHOG_MOCK_DATABASE        | Should we use mock sqlite DB?               | false                       |\n| WARTHOG_RESOLVERS_PATH       | Where should Warthog look for resolvers     | src/\\*\\*\\/\\*.resolver.ts    |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Complex use cases/ejecting\n\nWarthog makes building simple CRUD endpoints incredibly easy. However, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well.\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should just use [the TypeORM decorators](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md)\n\n### API-only\n\nIf you need to add a field that is only exposed via the API that is not DB-backed, you should just use [the TypeGraphQL Field Decorator](https://github.com/19majkel94/type-graphql/blob/master/src/decorators/Field.ts)\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## Contribute\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\n## License\n\nMIT © Dan Caddigan\n","readmeFilename":"README.md","gitHead":"d46be96e36ded90e1dd3c0000935eb0d75772947","_id":"warthog@1.47.0-beta.1","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-TqdUk3VVE/hNsihGvXUrZGdtzvLA+yI/X+Dy09GI2PfGIg7n7Q8+rbrRblbAhCQGymjuD02EGOvojC1Iab9o+A==","shasum":"2777fbd66b497c1dc2c2b45ca3980bad13965562","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.47.0-beta.1.tgz","fileCount":268,"unpackedSize":495317,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdxypdCRA9TVsSAnZWagAAmL8P/RCuCEmr/AYvG3PHjwuQ\nkc7sU6XXUuH2OMkBgzB/Bk3jmr+5iEL8WtOUmN5SswMNr5kU1b5qiabgBlmr\nJeR3t5htez9dp75reJeO1wIC07YB+GmN9D63OwyybH+vmjVdCqLrkWO6wDA5\n/b2/DHBRj2SX4J9nLw8MPTWSDEiA9+lU2cOg1VStTzuqxVRhd16IHwLaBXRa\n/pS5rk5QgxI0XDg8vg951hmfBUIxRFWfkkkqNRbMyja/8qQV5NA3tZkLQXdr\nlvo205omCUndaKn7R6EMCZJKBmm94JL3fYLD52SX6QWV4KN/TIG6T1E7eZ7g\ndO6lXTNKNmuYfAEjGg+c5t0MN5qiBMYEqBIwUoFyF4m6O4E8ZbhXQbmL7ubI\nNx79wv6DKGVE/f0yFWXhLkIMDFWo81dAk8FviiJxkENEDMS+D4gbWuhnmXwu\nu1lQPNHCzlGKRKu/l0GN5hIuV3tBaDd8ZmortJBFk6K4SN9icZYpQ8KjJWqQ\ndABkiwqmSl3b10BoDBEM2hAtr9Djx0hh9g0uH7XrvFNvskvvsKndrZELMRzk\nO0BXPjVIbdnur9XbcaKiANkMJ1Y+hqaFxXtgG6ZkCcK9wmyrg36PQR4c5g+l\nsiDQ/+Osmiz7ODX7UGwfK+/6Xsk+FjScvkM2MYz7GYlSHfJEr+t9Nw6blngR\n4+l7\r\n=ms8+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDWN9DuMv2LHahgkUZ3MTR5HPrSlRSPYJ5a8x5eTZNQdwIhAKWCBPHBWxZ5rFLRbx907fKg5VsDCQH+S7iJDz+QKMRJ"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.47.0-beta.1_1573333597195_0.19650469962503148"},"_hasShrinkwrap":false},"1.47.0-beta.2":{"name":"warthog","version":"1.47.0-beta.2","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^2.2.0","@typescript-eslint/parser":"^2.2.0","@types/supertest":"^2.0.8","condition-circle":"^2.0.2","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","npm-run-all":"^4.1.5","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*","examples/**/*"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"5e80885efa873a1ba723ca29151a94bddc08ce28","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nYou must have Postgresql installed to use Warthog. If you already have it installed, you can skip this step, otherwise there are 3 options:\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n### Homebrew\n\nIf you're on OSX and have [Homebrew](https://brew.sh/) installed, you can simply run:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) or use the Google machine to figure out how to install on your OS.\n\n## Usage\n\nThe easiest way to start using Warthog for a fresh project is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. This has a simple example in place to get you started. There are also a bunch of examples in the [examples](./examples/README.md) folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n### Installing in Existing Project\n\n```bash\nyarn add warthog\n```\n\n### 1. Create a Model\n\nThe model will auto-generate your database table and graphql types. Warthog will find all models that match the following glob - `'/**/*.model.ts'`. So for this file, you would name it `user.model.ts`\n\n```typescript\nimport { BaseModel, Model, StringField } from 'warthog';\n\n@Model()\nexport class User extends BaseModel {\n  @StringField()\n  name?: string;\n}\n```\n\n### 2. Create a Resolver\n\nThe resolver auto-generates queries and mutations in your GraphQL schema. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. So for this file, you would name it `user.resolver.ts`\n\n```typescript\nimport { User } from './user.model';\nimport { UserService } from './user.service';\n\n@Resolver(User)\nexport class UserResolver {\n  constructor(@Inject('UserService') readonly service: UserService) {}\n\n  @Query(() => [User])\n  async users(@Args() { where, orderBy, limit, offset }: UserWhereArgs): Promise<User[]> {\n    return this.service.find<UserWhereInput>(where, orderBy, limit, offset);\n  }\n\n  @Mutation(() => User)\n  async createUser(@Arg('data') data: UserCreateInput, @Ctx() ctx: BaseContext): Promise<User> {\n    return this.service.create(data, ctx.user.id);\n  }\n}\n```\n\n### 3. Create a Service\n\n```typescript\nimport { User } from './user.model';\n\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n}\n```\n\n### 4. Add config to .env file\n\n```env\nWARTHOG_APP_HOST=localhost\nWARTHOG_APP_PORT=4100\nWARTHOG_DB_DATABASE=warthog\nWARTHOG_DB_USERNAME=postgres\nWARTHOG_DB_PASSWORD=\n```\n\n### 5. Run your server\n\n```typescript\nimport 'reflect-metadata';\nimport { Server } from 'warthog';\n\nasync function bootstrap() {\n  const server = new Server();\n  return server.start();\n}\n\nbootstrap();\n```\n\nWhen you start your server, there will be a new `generated` folder that has your GraphQL schema in `schema.graphql`. This contains:\n\n```graphql\ntype User implements BaseGraphQLObject {\n  id: String!\n  createdAt: DateTime!\n  createdById: String!\n  updatedAt: DateTime\n  updatedById: String\n  deletedAt: DateTime\n  deletedById: String\n  version: Int!\n  name: String!\n}\n\ntype Mutation {\n  createUser(data: UserCreateInput!): User!\n}\n\ntype Query {\n  users(offset: Int, limit: Int = 50, where: UserWhereInput, orderBy: UserOrderByInput): [User!]!\n}\n\ninput UserCreateInput {\n  name: String!\n}\n\nenum UserOrderByInput {\n  createdAt_ASC\n  createdAt_DESC\n  updatedAt_ASC\n  updatedAt_DESC\n  deletedAt_ASC\n  deletedAt_DESC\n  name_ASC\n  name_DESC\n}\n\ninput UserUpdateInput {\n  name: String\n}\n\ninput UserWhereInput {\n  id_eq: String\n  id_in: [String!]\n  createdAt_eq: String\n  createdAt_lt: String\n  createdAt_lte: String\n  createdAt_gt: String\n  createdAt_gte: String\n  createdById_eq: String\n  updatedAt_eq: String\n  updatedAt_lt: String\n  updatedAt_lte: String\n  updatedAt_gt: String\n  updatedAt_gte: String\n  updatedById_eq: String\n  deletedAt_all: Boolean\n  deletedAt_eq: String\n  deletedAt_lt: String\n  deletedAt_lte: String\n  deletedAt_gt: String\n  deletedAt_gte: String\n  deletedById_eq: String\n  name_eq: String\n  name_contains: String\n  name_startsWith: String\n  name_endsWith: String\n  name_in: [String!]\n}\n\ninput UserWhereUniqueInput {\n  id: String!\n}\n\n# ...\n\n```\n\nNotice how we've only added a single field on the model and you get pagination, filtering and tracking of who created, updated and deleted records automatically.\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => object`                                                     | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                     | value                                       | default                     |\n| ---------------------------- | ------------------------------------------- | --------------------------- |\n| WARTHOG_APP_HOST             | App server host                             | _none_                      |\n| WARTHOG_APP_PORT             | App server port                             | 4000                        |\n| WARTHOG_APP_PROTOCOL         | App server protocol                         | http                        |\n| WARTHOG_AUTO_GENERATE_FILES  | Auto-generate files                         | false (true in development) |\n| WARTHOG_AUTO_OPEN_PLAYGROUND | Open playground on server start             | false (true in development) |\n| WARTHOG_CLI_GENERATE_PATH    | Where should CLI generate files             | ./src                       |\n| WARTHOG_DB_CONNECTION        | DB connection type                          | postgres                    |\n| WARTHOG_DB_DATABASE          | DB name                                     | _none_                      |\n| WARTHOG_DB_ENTITIES          | Where should warthog look for models        | src\\/\\*\\*\\/\\*.model.ts      |\n| WARTHOG_DB_MIGRATIONS        | What DB migrations should TypeORM run       | db/migrations/\\*\\*\\/\\*.ts   |\n| WARTHOG_DB_MIGRATIONS_DIR    | Where should generated migrations be placed | db/migrations               |\n| WARTHOG_DB_PORT              | DB port                                     | 5432                        |\n| WARTHOG_DB_USERNAME          | DB username                                 | _none_                      |\n| WARTHOG_DB_LOGGER            | TypeORM logger                              | advanced-console            |\n| WARTHOG_DB_PASSWORD          | DB password                                 | _none_                      |\n| WARTHOG_DB_SYNCHRONIZE       | DB automatically migrated                   | false                       |\n| WARTHOG_GENERATED_FOLDER     | Where should generated code be placed       | ./generated                 |\n| WARTHOG_INTROSPECTION        | Allow server to be introspected             | true                        |\n| WARTHOG_MOCK_DATABASE        | Should we use mock sqlite DB?               | false                       |\n| WARTHOG_RESOLVERS_PATH       | Where should Warthog look for resolvers     | src/\\*\\*\\/\\*.resolver.ts    |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Complex use cases/ejecting\n\nWarthog makes building simple CRUD endpoints incredibly easy. However, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well.\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should just use [the TypeORM decorators](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md)\n\n### API-only\n\nIf you need to add a field that is only exposed via the API that is not DB-backed, you should just use [the TypeGraphQL Field Decorator](https://github.com/19majkel94/type-graphql/blob/master/src/decorators/Field.ts)\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## Contribute\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\n## License\n\nMIT © Dan Caddigan\n","readmeFilename":"README.md","_id":"warthog@1.47.0-beta.2","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-qUZkmHzZ/hJsHHbCk0680ZQXGefap/nhn7mrRdOHDtSFb47e7oLPzrrWdwZFDXBw61SZOUvlW5D+KZahMObS0A==","shasum":"f815b55f0930ad1842a9e4b07ecb4cbd0e2e54f2","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.47.0-beta.2.tgz","fileCount":277,"unpackedSize":526893,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdzNUfCRA9TVsSAnZWagAAm8cP/Ri9thw22jlfyeL+UR54\n9Mn9CfSxNi97t1Z34s1ffiaJPUTH/oD55ICDyCWib0SX3bj9b/kewZOtg0Q/\nKiT+lem/+aOajFOCdjHCkG88Zau+g6RFORZkaVwKjeQZzBLH+sE44N8IpDqz\nx1GyQqJpvQoHnCDLR2+NxIDTfAjn8DUE4usKUiKkQuS0s6l89yxzohfiksfB\nMyhi22VbPeIDmx+9bnVxP7uxHek6vsVNGyJaEObDviHlUyD/iQJZ8ITda2G/\n7TKphxDGm61uv4KzbpBfl4VI9Nj6ppm8ESKgVsvJsqwErbCFd5/dzOAjpnxf\nZc/Z+mCAaOcgli9jXo6mSSJJQyP4PoKER+lq1MqzQQwT3I2YXFpGw8K00Onx\nINwUFDTWfc/hzbv17uQN09yBaovHaVs9lZHkxEaICFg7mni1nKFVJOObw+mL\n31MuYmTb9HPiEF3O1p3MP08FuWXWhk17oIuxjOnYadfmWwD9RikXVFZS0dc0\n4xSXAr6M4/4hLNIZcBHX1zz8kHLZQTT9mWDRN0+SRg1tSJwz6pv7aApIPEUU\ni/6NtuyAXLOnkD3Gk0ZQ5ycArazb08QYy4LfYwrbwMBmD6uWnnhSc1kdtv8u\nk2hZJb2mqyDR2GXdKzlrfIjy/kk2m8oIIjbiDwO9bzSSpUKI+AZCwWa+yUC1\ngSwH\r\n=fXl2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD/37k7UBGnbe3tCL4QTBemwnhFEaQh6/CBfvowTioz6QIhAMAsrxJZGRnKG9HxpbtrgldBNZK2Vp37KTDxhRrTSpYo"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.47.0-beta.2_1573704991372_0.9458619376650224"},"_hasShrinkwrap":false},"1.47.0-alpha.1":{"name":"warthog","version":"1.47.0-alpha.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.2.0","@typescript-eslint/parser":"^2.2.0","condition-circle":"^2.0.2","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","npm-run-all":"^4.1.5","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nYou must have Postgresql installed to use Warthog. If you already have it installed, you can skip this step, otherwise there are 3 options:\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n### Homebrew\n\nIf you're on OSX and have [Homebrew](https://brew.sh/) installed, you can simply run:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) or use the Google machine to figure out how to install on your OS.\n\n## Usage\n\nThe easiest way to start using Warthog for a fresh project is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. This has a simple example in place to get you started. There are also a bunch of examples in the [examples](./examples/README.md) folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n### Installing in Existing Project\n\n```bash\nyarn add warthog\n```\n\n### 1. Create a Model\n\nThe model will auto-generate your database table and graphql types. Warthog will find all models that match the following glob - `'/**/*.model.ts'`. So for this file, you would name it `user.model.ts`\n\n```typescript\nimport { BaseModel, Model, StringField } from 'warthog';\n\n@Model()\nexport class User extends BaseModel {\n  @StringField()\n  name?: string;\n}\n```\n\n### 2. Create a Resolver\n\nThe resolver auto-generates queries and mutations in your GraphQL schema. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. So for this file, you would name it `user.resolver.ts`\n\n```typescript\nimport { User } from './user.model';\nimport { UserService } from './user.service';\n\n@Resolver(User)\nexport class UserResolver {\n  constructor(@Inject('UserService') readonly service: UserService) {}\n\n  @Query(() => [User])\n  async users(@Args() { where, orderBy, limit, offset }: UserWhereArgs): Promise<User[]> {\n    return this.service.find<UserWhereInput>(where, orderBy, limit, offset);\n  }\n\n  @Mutation(() => User)\n  async createUser(@Arg('data') data: UserCreateInput, @Ctx() ctx: BaseContext): Promise<User> {\n    return this.service.create(data, ctx.user.id);\n  }\n}\n```\n\n### 3. Create a Service\n\n```typescript\nimport { User } from './user.model';\n\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n}\n```\n\n### 4. Add config to .env file\n\n```env\nWARTHOG_APP_HOST=localhost\nWARTHOG_APP_PORT=4100\nWARTHOG_DB_DATABASE=warthog\nWARTHOG_DB_USERNAME=postgres\nWARTHOG_DB_PASSWORD=\n```\n\n### 5. Run your server\n\n```typescript\nimport 'reflect-metadata';\nimport { Server } from 'warthog';\n\nasync function bootstrap() {\n  const server = new Server();\n  return server.start();\n}\n\nbootstrap();\n```\n\nWhen you start your server, there will be a new `generated` folder that has your GraphQL schema in `schema.graphql`. This contains:\n\n```graphql\ntype User implements BaseGraphQLObject {\n  id: String!\n  createdAt: DateTime!\n  createdById: String!\n  updatedAt: DateTime\n  updatedById: String\n  deletedAt: DateTime\n  deletedById: String\n  version: Int!\n  name: String!\n}\n\ntype Mutation {\n  createUser(data: UserCreateInput!): User!\n}\n\ntype Query {\n  users(offset: Int, limit: Int = 50, where: UserWhereInput, orderBy: UserOrderByInput): [User!]!\n}\n\ninput UserCreateInput {\n  name: String!\n}\n\nenum UserOrderByInput {\n  createdAt_ASC\n  createdAt_DESC\n  updatedAt_ASC\n  updatedAt_DESC\n  deletedAt_ASC\n  deletedAt_DESC\n  name_ASC\n  name_DESC\n}\n\ninput UserUpdateInput {\n  name: String\n}\n\ninput UserWhereInput {\n  id_eq: String\n  id_in: [String!]\n  createdAt_eq: String\n  createdAt_lt: String\n  createdAt_lte: String\n  createdAt_gt: String\n  createdAt_gte: String\n  createdById_eq: String\n  updatedAt_eq: String\n  updatedAt_lt: String\n  updatedAt_lte: String\n  updatedAt_gt: String\n  updatedAt_gte: String\n  updatedById_eq: String\n  deletedAt_all: Boolean\n  deletedAt_eq: String\n  deletedAt_lt: String\n  deletedAt_lte: String\n  deletedAt_gt: String\n  deletedAt_gte: String\n  deletedById_eq: String\n  name_eq: String\n  name_contains: String\n  name_startsWith: String\n  name_endsWith: String\n  name_in: [String!]\n}\n\ninput UserWhereUniqueInput {\n  id: String!\n}\n\n# ...\n\n```\n\nNotice how we've only added a single field on the model and you get pagination, filtering and tracking of who created, updated and deleted records automatically.\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => object`                                                     | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                     | value                                       | default                     |\n| ---------------------------- | ------------------------------------------- | --------------------------- |\n| WARTHOG_APP_HOST             | App server host                             | _none_                      |\n| WARTHOG_APP_PORT             | App server port                             | 4000                        |\n| WARTHOG_APP_PROTOCOL         | App server protocol                         | http                        |\n| WARTHOG_AUTO_GENERATE_FILES  | Auto-generate files                         | false (true in development) |\n| WARTHOG_AUTO_OPEN_PLAYGROUND | Open playground on server start             | false (true in development) |\n| WARTHOG_CLI_GENERATE_PATH    | Where should CLI generate files             | ./src                       |\n| WARTHOG_DB_CONNECTION        | DB connection type                          | postgres                    |\n| WARTHOG_DB_DATABASE          | DB name                                     | _none_                      |\n| WARTHOG_DB_ENTITIES          | Where should warthog look for models        | src\\/\\*\\*\\/\\*.model.ts      |\n| WARTHOG_DB_MIGRATIONS        | What DB migrations should TypeORM run       | db/migrations/\\*\\*\\/\\*.ts   |\n| WARTHOG_DB_MIGRATIONS_DIR    | Where should generated migrations be placed | db/migrations               |\n| WARTHOG_DB_PORT              | DB port                                     | 5432                        |\n| WARTHOG_DB_USERNAME          | DB username                                 | _none_                      |\n| WARTHOG_DB_LOGGER            | TypeORM logger                              | advanced-console            |\n| WARTHOG_DB_PASSWORD          | DB password                                 | _none_                      |\n| WARTHOG_DB_SYNCHRONIZE       | DB automatically migrated                   | false                       |\n| WARTHOG_GENERATED_FOLDER     | Where should generated code be placed       | ./generated                 |\n| WARTHOG_INTROSPECTION        | Allow server to be introspected             | true                        |\n| WARTHOG_MOCK_DATABASE        | Should we use mock sqlite DB?               | false                       |\n| WARTHOG_RESOLVERS_PATH       | Where should Warthog look for resolvers     | src/\\*\\*\\/\\*.resolver.ts    |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Complex use cases/ejecting\n\nWarthog makes building simple CRUD endpoints incredibly easy. However, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well.\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should just use [the TypeORM decorators](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md)\n\n### API-only\n\nIf you need to add a field that is only exposed via the API that is not DB-backed, you should just use [the TypeGraphQL Field Decorator](https://github.com/19majkel94/type-graphql/blob/master/src/decorators/Field.ts)\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## Contribute\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\n## License\n\nMIT © Dan Caddigan\n","readmeFilename":"README.md","gitHead":"82b3380a31d26777cf89780fbacd81c21e19a452","_id":"warthog@1.47.0-alpha.1","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-jp3sWPhP3ET1CXqCNrka7reRGg50rR+2jM62PA7JhB6wMMJzGs4IhktTeIlOhTFebVf1F+sfWWBEctGtWDJTZw==","shasum":"0a395533227f0764f8954174aae87203ea711c51","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.47.0-alpha.1.tgz","fileCount":268,"unpackedSize":495318,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdzNjUCRA9TVsSAnZWagAACg4P/j5up1K5puWh6OpIqU9y\nYw7kE/w2b8Oq+JBEs99KVHRZFIdxr9umj9btjKaWyOdZCRKJcKnUxlCCC3iD\nq+DqRXin2Iy41PoT3Ask8Ee6W6qMx6YQylU42xy17MEGrbNv6shH22DwGfR3\nUKTVplgKMOylE0E/SSq0VGOmZTWASkKt67+pA8xv27bG5pzxSNHbcYkB5fgo\neW5rEkSVYpEWNUG8Atp3lCK+0aRixoHKYGCDoqflgE2uHrELWke33bjeuJci\nhWwhw2tJO4FQxuFRmrk1xJRj4MoF/TOQctRqtUrOfb/a0tIHGeIhcTVU4/Ry\nfyNBvH8gLHovas3nSfEGMRwg4EnTsUI6K5Tih4PhMG0F6/W/9SGUFpwJVADD\n4TtcAKAD0wCGoc1ndu9L0cl3FvI/k22D1PZTRZ6N6KLovD6CUhM8nEEQ7eHi\naniLjRmbEEr8I9ouRXJORZFVY95fBqGDABE1alX9J3i52zpNPL4n83nc+g/J\nxu+9n+7FXu1Th+rzEkw0aHTyqURUu+VzHF1znA4/+QWGMF2kOGEgX/dwLjN2\nlD5zMLM/EcYgt8Ke36RRI73gTbw4nlzgT9Ba88oIPGZ2TJZHa6ZRPYe6vB34\nFlXziCxfwk4SYCTy3j2xzxPuZ8kobf2Ae9xIMi/76/BQFT8UhPp4jBg1VEjD\nZJ9W\r\n=827d\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIADYnCDarp8DuOcPF18P0jEOjf8q0HsNlk+emW4a1W4hAiEApls9yyKeB69nUrT9pJrdfa6HG0dLwsubOv0rAteCfQk="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.47.0-alpha.1_1573705939950_0.3548987199441942"},"_hasShrinkwrap":false},"1.47.0-alpha.2":{"name":"warthog","version":"1.47.0-alpha.2","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^2.2.0","@typescript-eslint/parser":"^2.2.0","@types/supertest":"^2.0.8","condition-circle":"^2.0.2","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","npm-run-all":"^4.1.5","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*","examples/**/*"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nYou must have Postgresql installed to use Warthog. If you already have it installed, you can skip this step, otherwise there are 3 options:\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n### Homebrew\n\nIf you're on OSX and have [Homebrew](https://brew.sh/) installed, you can simply run:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) or use the Google machine to figure out how to install on your OS.\n\n## Usage\n\nThe easiest way to start using Warthog for a fresh project is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. This has a simple example in place to get you started. There are also a bunch of examples in the [examples](./examples/README.md) folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n### Installing in Existing Project\n\n```bash\nyarn add warthog\n```\n\n### 1. Create a Model\n\nThe model will auto-generate your database table and graphql types. Warthog will find all models that match the following glob - `'/**/*.model.ts'`. So for this file, you would name it `user.model.ts`\n\n```typescript\nimport { BaseModel, Model, StringField } from 'warthog';\n\n@Model()\nexport class User extends BaseModel {\n  @StringField()\n  name?: string;\n}\n```\n\n### 2. Create a Resolver\n\nThe resolver auto-generates queries and mutations in your GraphQL schema. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. So for this file, you would name it `user.resolver.ts`\n\n```typescript\nimport { User } from './user.model';\nimport { UserService } from './user.service';\n\n@Resolver(User)\nexport class UserResolver {\n  constructor(@Inject('UserService') readonly service: UserService) {}\n\n  @Query(() => [User])\n  async users(@Args() { where, orderBy, limit, offset }: UserWhereArgs): Promise<User[]> {\n    return this.service.find<UserWhereInput>(where, orderBy, limit, offset);\n  }\n\n  @Mutation(() => User)\n  async createUser(@Arg('data') data: UserCreateInput, @Ctx() ctx: BaseContext): Promise<User> {\n    return this.service.create(data, ctx.user.id);\n  }\n}\n```\n\n### 3. Create a Service\n\n```typescript\nimport { User } from './user.model';\n\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n}\n```\n\n### 4. Add config to .env file\n\n```env\nWARTHOG_APP_HOST=localhost\nWARTHOG_APP_PORT=4100\nWARTHOG_DB_DATABASE=warthog\nWARTHOG_DB_USERNAME=postgres\nWARTHOG_DB_PASSWORD=\n```\n\n### 5. Run your server\n\n```typescript\nimport 'reflect-metadata';\nimport { Server } from 'warthog';\n\nasync function bootstrap() {\n  const server = new Server();\n  return server.start();\n}\n\nbootstrap();\n```\n\nWhen you start your server, there will be a new `generated` folder that has your GraphQL schema in `schema.graphql`. This contains:\n\n```graphql\ntype User implements BaseGraphQLObject {\n  id: String!\n  createdAt: DateTime!\n  createdById: String!\n  updatedAt: DateTime\n  updatedById: String\n  deletedAt: DateTime\n  deletedById: String\n  version: Int!\n  name: String!\n}\n\ntype Mutation {\n  createUser(data: UserCreateInput!): User!\n}\n\ntype Query {\n  users(offset: Int, limit: Int = 50, where: UserWhereInput, orderBy: UserOrderByInput): [User!]!\n}\n\ninput UserCreateInput {\n  name: String!\n}\n\nenum UserOrderByInput {\n  createdAt_ASC\n  createdAt_DESC\n  updatedAt_ASC\n  updatedAt_DESC\n  deletedAt_ASC\n  deletedAt_DESC\n  name_ASC\n  name_DESC\n}\n\ninput UserUpdateInput {\n  name: String\n}\n\ninput UserWhereInput {\n  id_eq: String\n  id_in: [String!]\n  createdAt_eq: String\n  createdAt_lt: String\n  createdAt_lte: String\n  createdAt_gt: String\n  createdAt_gte: String\n  createdById_eq: String\n  updatedAt_eq: String\n  updatedAt_lt: String\n  updatedAt_lte: String\n  updatedAt_gt: String\n  updatedAt_gte: String\n  updatedById_eq: String\n  deletedAt_all: Boolean\n  deletedAt_eq: String\n  deletedAt_lt: String\n  deletedAt_lte: String\n  deletedAt_gt: String\n  deletedAt_gte: String\n  deletedById_eq: String\n  name_eq: String\n  name_contains: String\n  name_startsWith: String\n  name_endsWith: String\n  name_in: [String!]\n}\n\ninput UserWhereUniqueInput {\n  id: String!\n}\n\n# ...\n\n```\n\nNotice how we've only added a single field on the model and you get pagination, filtering and tracking of who created, updated and deleted records automatically.\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => object`                                                     | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                     | value                                       | default                     |\n| ---------------------------- | ------------------------------------------- | --------------------------- |\n| WARTHOG_APP_HOST             | App server host                             | _none_                      |\n| WARTHOG_APP_PORT             | App server port                             | 4000                        |\n| WARTHOG_APP_PROTOCOL         | App server protocol                         | http                        |\n| WARTHOG_AUTO_GENERATE_FILES  | Auto-generate files                         | false (true in development) |\n| WARTHOG_AUTO_OPEN_PLAYGROUND | Open playground on server start             | false (true in development) |\n| WARTHOG_CLI_GENERATE_PATH    | Where should CLI generate files             | ./src                       |\n| WARTHOG_DB_CONNECTION        | DB connection type                          | postgres                    |\n| WARTHOG_DB_DATABASE          | DB name                                     | _none_                      |\n| WARTHOG_DB_ENTITIES          | Where should warthog look for models        | src\\/\\*\\*\\/\\*.model.ts      |\n| WARTHOG_DB_MIGRATIONS        | What DB migrations should TypeORM run       | db/migrations/\\*\\*\\/\\*.ts   |\n| WARTHOG_DB_MIGRATIONS_DIR    | Where should generated migrations be placed | db/migrations               |\n| WARTHOG_DB_PORT              | DB port                                     | 5432                        |\n| WARTHOG_DB_USERNAME          | DB username                                 | _none_                      |\n| WARTHOG_DB_LOGGER            | TypeORM logger                              | advanced-console            |\n| WARTHOG_DB_PASSWORD          | DB password                                 | _none_                      |\n| WARTHOG_DB_SYNCHRONIZE       | DB automatically migrated                   | false                       |\n| WARTHOG_GENERATED_FOLDER     | Where should generated code be placed       | ./generated                 |\n| WARTHOG_INTROSPECTION        | Allow server to be introspected             | true                        |\n| WARTHOG_MOCK_DATABASE        | Should we use mock sqlite DB?               | false                       |\n| WARTHOG_RESOLVERS_PATH       | Where should Warthog look for resolvers     | src/\\*\\*\\/\\*.resolver.ts    |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Complex use cases/ejecting\n\nWarthog makes building simple CRUD endpoints incredibly easy. However, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well.\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should just use [the TypeORM decorators](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md)\n\n### API-only\n\nIf you need to add a field that is only exposed via the API that is not DB-backed, you should just use [the TypeGraphQL Field Decorator](https://github.com/19majkel94/type-graphql/blob/master/src/decorators/Field.ts)\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## Contribute\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\n## License\n\nMIT © Dan Caddigan\n","readmeFilename":"README.md","gitHead":"cc8107a88f1732cffa563ca0dd3bd85d92f18ab6","_id":"warthog@1.47.0-alpha.2","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-QJGhsvSgiepC7djBlfnbVJot3wFyo9HYbyurhMbY0f/ekt7CQjm18QBBzkHvv07YrXj8R1N6DSGYKTdpOtOT/A==","shasum":"76bcea2a608860c07b55e05758eff425470c9a19","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.47.0-alpha.2.tgz","fileCount":277,"unpackedSize":526894,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdzNpTCRA9TVsSAnZWagAA28gP/1Q20KOmi4lW8ZB07mXj\nNKYrn3nnimc/J+oPYrPuqJuXcCWmfjQ78TT5H4+qqmh/2TDWGPp2Tv4SyePv\n/RqmcpmecdAoR6mD89TSI9y9f1bC0zcVZEPBXbn9mepjU/paCnxOUFKXTTFh\nPzdwZJP8twIxRi2hA2Z7TwgboKklhBPpQSoBPCKtTOlczENI2+uNGkINhp3f\nV8hSfLO0QpPMjgEiHN9hoCxLqeme7Kkw42SRWdwUs4e857wq5sL6DEy4f1u1\nqP2Fu1RK1pSpkbP7e09XY1kYt2JvT2fApoIxq4CUPS92yChjKBNfKSVqHWfX\n7Q7qG5LoaPlfxcZEJyO7g95n1fKBf2JiAieoGqGRPSt10I2TNVIqamC5Fqh7\ngk3f2vv82bNRBFHjgR8c24/IaQXbk0FqwijIJSQ3uR/JqRxSpaQxU8d5YwWs\n6//5H+4sVrl6aW+7gSWg3HTbpLg05EZ1RwJdvnhZ4Z3fZ6e3JzdIxWPFjRxz\nWHDw2iFFdvzjNdNx9IsRfsScJvs1ji6ZLMf5mGg+So3IKDR3ja3rbepVePB8\nRAD2gkYeUYNwKU9e1yi1SyAK4L+gofdWt9cbsmGArzth3sGIEMqxhIHn5d9U\nmCpQY0HWXUWOYl3KDxqUzSciKCFS5FzYdsqTYGXZyweQvu78kulHvl+nlD12\nUs1i\r\n=/7s6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDz/vH49s9X8zH3XFsntTrc0YUBpAvbAifKxoSd+R6P7QIhAOpK0aRXw9UDq1GNcilEm7BHinAeecjeUz/VvfRXcwe2"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.47.0-alpha.2_1573706323498_0.8036902035480655"},"_hasShrinkwrap":false},"2.0.0-beta.1":{"name":"warthog","version":"2.0.0-beta.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^2.2.0","@typescript-eslint/parser":"^2.2.0","@types/supertest":"^2.0.8","condition-circle":"^2.0.2","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","npm-run-all":"^4.1.5","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*","examples/**/*"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nYou must have Postgresql installed to use Warthog. If you already have it installed, you can skip this step, otherwise there are 3 options:\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n### Homebrew\n\nIf you're on OSX and have [Homebrew](https://brew.sh/) installed, you can simply run:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) or use the Google machine to figure out how to install on your OS.\n\n## Usage\n\nThe easiest way to start using Warthog for a fresh project is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. This has a simple example in place to get you started. There are also a bunch of examples in the [examples](./examples/README.md) folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n### Installing in Existing Project\n\n```bash\nyarn add warthog\n```\n\n### 1. Create a Model\n\nThe model will auto-generate your database table and graphql types. Warthog will find all models that match the following glob - `'/**/*.model.ts'`. So for this file, you would name it `user.model.ts`\n\n```typescript\nimport { BaseModel, Model, StringField } from 'warthog';\n\n@Model()\nexport class User extends BaseModel {\n  @StringField()\n  name?: string;\n}\n```\n\n### 2. Create a Resolver\n\nThe resolver auto-generates queries and mutations in your GraphQL schema. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. So for this file, you would name it `user.resolver.ts`\n\n```typescript\nimport { User } from './user.model';\nimport { UserService } from './user.service';\n\n@Resolver(User)\nexport class UserResolver {\n  constructor(@Inject('UserService') readonly service: UserService) {}\n\n  @Query(() => [User])\n  async users(@Args() { where, orderBy, limit, offset }: UserWhereArgs): Promise<User[]> {\n    return this.service.find<UserWhereInput>(where, orderBy, limit, offset);\n  }\n\n  @Mutation(() => User)\n  async createUser(@Arg('data') data: UserCreateInput, @Ctx() ctx: BaseContext): Promise<User> {\n    return this.service.create(data, ctx.user.id);\n  }\n}\n```\n\n### 3. Create a Service\n\n```typescript\nimport { User } from './user.model';\n\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n}\n```\n\n### 4. Add config to .env file\n\n```env\nWARTHOG_APP_HOST=localhost\nWARTHOG_APP_PORT=4100\nWARTHOG_DB_DATABASE=warthog\nWARTHOG_DB_USERNAME=postgres\nWARTHOG_DB_PASSWORD=\n```\n\n### 5. Run your server\n\n```typescript\nimport 'reflect-metadata';\nimport { Server } from 'warthog';\n\nasync function bootstrap() {\n  const server = new Server();\n  return server.start();\n}\n\nbootstrap();\n```\n\nWhen you start your server, there will be a new `generated` folder that has your GraphQL schema in `schema.graphql`. This contains:\n\n```graphql\ntype User implements BaseGraphQLObject {\n  id: String!\n  createdAt: DateTime!\n  createdById: String!\n  updatedAt: DateTime\n  updatedById: String\n  deletedAt: DateTime\n  deletedById: String\n  version: Int!\n  name: String!\n}\n\ntype Mutation {\n  createUser(data: UserCreateInput!): User!\n}\n\ntype Query {\n  users(offset: Int, limit: Int = 50, where: UserWhereInput, orderBy: UserOrderByInput): [User!]!\n}\n\ninput UserCreateInput {\n  name: String!\n}\n\nenum UserOrderByInput {\n  createdAt_ASC\n  createdAt_DESC\n  updatedAt_ASC\n  updatedAt_DESC\n  deletedAt_ASC\n  deletedAt_DESC\n  name_ASC\n  name_DESC\n}\n\ninput UserUpdateInput {\n  name: String\n}\n\ninput UserWhereInput {\n  id_eq: String\n  id_in: [String!]\n  createdAt_eq: String\n  createdAt_lt: String\n  createdAt_lte: String\n  createdAt_gt: String\n  createdAt_gte: String\n  createdById_eq: String\n  updatedAt_eq: String\n  updatedAt_lt: String\n  updatedAt_lte: String\n  updatedAt_gt: String\n  updatedAt_gte: String\n  updatedById_eq: String\n  deletedAt_all: Boolean\n  deletedAt_eq: String\n  deletedAt_lt: String\n  deletedAt_lte: String\n  deletedAt_gt: String\n  deletedAt_gte: String\n  deletedById_eq: String\n  name_eq: String\n  name_contains: String\n  name_startsWith: String\n  name_endsWith: String\n  name_in: [String!]\n}\n\ninput UserWhereUniqueInput {\n  id: String!\n}\n\n# ...\n\n```\n\nNotice how we've only added a single field on the model and you get pagination, filtering and tracking of who created, updated and deleted records automatically.\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => object`                                                     | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                     | value                                       | default                     |\n| ---------------------------- | ------------------------------------------- | --------------------------- |\n| WARTHOG_APP_HOST             | App server host                             | _none_                      |\n| WARTHOG_APP_PORT             | App server port                             | 4000                        |\n| WARTHOG_APP_PROTOCOL         | App server protocol                         | http                        |\n| WARTHOG_AUTO_GENERATE_FILES  | Auto-generate files                         | false (true in development) |\n| WARTHOG_AUTO_OPEN_PLAYGROUND | Open playground on server start             | false (true in development) |\n| WARTHOG_CLI_GENERATE_PATH    | Where should CLI generate files             | ./src                       |\n| WARTHOG_DB_CONNECTION        | DB connection type                          | postgres                    |\n| WARTHOG_DB_DATABASE          | DB name                                     | _none_                      |\n| WARTHOG_DB_ENTITIES          | Where should warthog look for models        | src\\/\\*\\*\\/\\*.model.ts      |\n| WARTHOG_DB_MIGRATIONS        | What DB migrations should TypeORM run       | db/migrations/\\*\\*\\/\\*.ts   |\n| WARTHOG_DB_MIGRATIONS_DIR    | Where should generated migrations be placed | db/migrations               |\n| WARTHOG_DB_PORT              | DB port                                     | 5432                        |\n| WARTHOG_DB_USERNAME          | DB username                                 | _none_                      |\n| WARTHOG_DB_LOGGER            | TypeORM logger                              | advanced-console            |\n| WARTHOG_DB_PASSWORD          | DB password                                 | _none_                      |\n| WARTHOG_DB_SYNCHRONIZE       | DB automatically migrated                   | false                       |\n| WARTHOG_GENERATED_FOLDER     | Where should generated code be placed       | ./generated                 |\n| WARTHOG_INTROSPECTION        | Allow server to be introspected             | true                        |\n| WARTHOG_MOCK_DATABASE        | Should we use mock sqlite DB?               | false                       |\n| WARTHOG_RESOLVERS_PATH       | Where should Warthog look for resolvers     | src/\\*\\*\\/\\*.resolver.ts    |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Complex use cases/ejecting\n\nWarthog makes building simple CRUD endpoints incredibly easy. However, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well.\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should just use [the TypeORM decorators](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md)\n\n### API-only\n\nIf you need to add a field that is only exposed via the API that is not DB-backed, you should just use [the TypeGraphQL Field Decorator](https://github.com/19majkel94/type-graphql/blob/master/src/decorators/Field.ts)\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## Contribute\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\n## License\n\nMIT © Dan Caddigan\n","readmeFilename":"README.md","gitHead":"49cbd99c23ce2c5630d0f07ebf4cdc171ab6e131","_id":"warthog@2.0.0-beta.1","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-spE2LoC+v84O7qmIBT/EQ0dsXRDt64/3ZetExXN8CR0wtfshHKgXehFx+inxtb/gPLqinK3EzGP4B17k2MNHDw==","shasum":"7f76ed6c570a0c82193fdfa2f8110af6739b8e7d","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.0.0-beta.1.tgz","fileCount":277,"unpackedSize":526892,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdzNt1CRA9TVsSAnZWagAAH/YP/if1GlFWwwrurQciq5MT\niqK+XWHmHDxL1Hh5k67wdnbGTL6E10f3cPr7HB3jRONXHVsYnPgpV8vAVHfU\n5FQYstF15kmHf2BonTxoYIUC1ljXdo8VO5STNo2IGjq4/Xpd9fxX8TT2QpI8\nvEF+rbj7Av9QvtHpgDNNeW4W2AyvFPz+U9P3bOd4y1deLwzDmxQQU2tjX8Mv\nDx8r4S2uq9wEFUx8+dHCYfw/nMtM+cyGQPZ2fPDBDJ4obArUp0XkfURYXscJ\ncWDO2xCCCX+DiTNjH/uQROl9AR9Mbe0eXgFvpACL8T7e37ME7FU2cGb5HaJ2\nYSU4Dwz3w/MHrwLMStrTkHESctkC1LivNaeIR6pDFSVDI1yGHZ+uhvfaCang\nNPNAe/E1+VW45Q7je8nqrj2c9Nk2NSFsGL8YlS0Jwura2jrl/4G46oQS79GP\nlMgEkGMHAFeFmMbvV0KbEcuYIzaIkEs1HxAWjTJ8AqdpjukueoLzjYLiQi2b\nPCGXeuBQPMsHQ28WzTSEJs1MX5TfFhdD5C4UpRnlm5nbMDzpTb8isaKqPdcd\n8FS3nlgCPCmlEd51Xabmyx5pWIHstJfCQfLSXXuKSZeMQ6eB2CUu0DIdxtVj\nKQ8EEUCWFrpqXe1GSkpMjeWxJmIuPWkfzCN6yq3bEEzRfIIX37vLZnuYn2GM\nsBuD\r\n=PD2C\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC59COTM9aL1P56Y3k7BmEiG6KDnxXS9RrtJPwjIDATEAiBKvJr38sxJRbJ+Ka6PzEDpNGhSLJUHQxiRVrif6ChJIA=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.0.0-beta.1_1573706613281_0.06906862197384545"},"_hasShrinkwrap":false},"2.0.0-beta.2":{"name":"warthog","version":"2.0.0-beta.2","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@typescript-eslint/eslint-plugin":"^2.2.0","@typescript-eslint/parser":"^2.2.0","@types/supertest":"^2.0.8","condition-circle":"^2.0.2","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","npm-run-all":"^4.1.5","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*","examples/**/*"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nYou must have Postgresql installed to use Warthog. If you already have it installed, you can skip this step, otherwise there are 3 options:\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n### Homebrew\n\nIf you're on OSX and have [Homebrew](https://brew.sh/) installed, you can simply run:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) or use the Google machine to figure out how to install on your OS.\n\n## Usage\n\nThe easiest way to start using Warthog for a fresh project is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. This has a simple example in place to get you started. There are also a bunch of examples in the [examples](./examples/README.md) folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n### Installing in Existing Project\n\n```bash\nyarn add warthog\n```\n\n### 1. Create a Model\n\nThe model will auto-generate your database table and graphql types. Warthog will find all models that match the following glob - `'/**/*.model.ts'`. So for this file, you would name it `user.model.ts`\n\n```typescript\nimport { BaseModel, Model, StringField } from 'warthog';\n\n@Model()\nexport class User extends BaseModel {\n  @StringField()\n  name?: string;\n}\n```\n\n### 2. Create a Resolver\n\nThe resolver auto-generates queries and mutations in your GraphQL schema. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. So for this file, you would name it `user.resolver.ts`\n\n```typescript\nimport { User } from './user.model';\nimport { UserService } from './user.service';\n\n@Resolver(User)\nexport class UserResolver {\n  constructor(@Inject('UserService') readonly service: UserService) {}\n\n  @Query(() => [User])\n  async users(@Args() { where, orderBy, limit, offset }: UserWhereArgs): Promise<User[]> {\n    return this.service.find<UserWhereInput>(where, orderBy, limit, offset);\n  }\n\n  @Mutation(() => User)\n  async createUser(@Arg('data') data: UserCreateInput, @Ctx() ctx: BaseContext): Promise<User> {\n    return this.service.create(data, ctx.user.id);\n  }\n}\n```\n\n### 3. Create a Service\n\n```typescript\nimport { User } from './user.model';\n\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n}\n```\n\n### 4. Add config to .env file\n\n```env\nWARTHOG_APP_HOST=localhost\nWARTHOG_APP_PORT=4100\nWARTHOG_DB_DATABASE=warthog\nWARTHOG_DB_USERNAME=postgres\nWARTHOG_DB_PASSWORD=\n```\n\n### 5. Run your server\n\n```typescript\nimport 'reflect-metadata';\nimport { Server } from 'warthog';\n\nasync function bootstrap() {\n  const server = new Server();\n  return server.start();\n}\n\nbootstrap();\n```\n\nWhen you start your server, there will be a new `generated` folder that has your GraphQL schema in `schema.graphql`. This contains:\n\n```graphql\ntype User implements BaseGraphQLObject {\n  id: String!\n  createdAt: DateTime!\n  createdById: String!\n  updatedAt: DateTime\n  updatedById: String\n  deletedAt: DateTime\n  deletedById: String\n  version: Int!\n  name: String!\n}\n\ntype Mutation {\n  createUser(data: UserCreateInput!): User!\n}\n\ntype Query {\n  users(offset: Int, limit: Int = 50, where: UserWhereInput, orderBy: UserOrderByInput): [User!]!\n}\n\ninput UserCreateInput {\n  name: String!\n}\n\nenum UserOrderByInput {\n  createdAt_ASC\n  createdAt_DESC\n  updatedAt_ASC\n  updatedAt_DESC\n  deletedAt_ASC\n  deletedAt_DESC\n  name_ASC\n  name_DESC\n}\n\ninput UserUpdateInput {\n  name: String\n}\n\ninput UserWhereInput {\n  id_eq: String\n  id_in: [String!]\n  createdAt_eq: String\n  createdAt_lt: String\n  createdAt_lte: String\n  createdAt_gt: String\n  createdAt_gte: String\n  createdById_eq: String\n  updatedAt_eq: String\n  updatedAt_lt: String\n  updatedAt_lte: String\n  updatedAt_gt: String\n  updatedAt_gte: String\n  updatedById_eq: String\n  deletedAt_all: Boolean\n  deletedAt_eq: String\n  deletedAt_lt: String\n  deletedAt_lte: String\n  deletedAt_gt: String\n  deletedAt_gte: String\n  deletedById_eq: String\n  name_eq: String\n  name_contains: String\n  name_startsWith: String\n  name_endsWith: String\n  name_in: [String!]\n}\n\ninput UserWhereUniqueInput {\n  id: String!\n}\n\n# ...\n\n```\n\nNotice how we've only added a single field on the model and you get pagination, filtering and tracking of who created, updated and deleted records automatically.\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => object`                                                     | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                     | value                                       | default                     |\n| ---------------------------- | ------------------------------------------- | --------------------------- |\n| WARTHOG_APP_HOST             | App server host                             | _none_                      |\n| WARTHOG_APP_PORT             | App server port                             | 4000                        |\n| WARTHOG_APP_PROTOCOL         | App server protocol                         | http                        |\n| WARTHOG_AUTO_GENERATE_FILES  | Auto-generate files                         | false (true in development) |\n| WARTHOG_AUTO_OPEN_PLAYGROUND | Open playground on server start             | false (true in development) |\n| WARTHOG_CLI_GENERATE_PATH    | Where should CLI generate files             | ./src                       |\n| WARTHOG_DB_CONNECTION        | DB connection type                          | postgres                    |\n| WARTHOG_DB_DATABASE          | DB name                                     | _none_                      |\n| WARTHOG_DB_ENTITIES          | Where should warthog look for models        | src\\/\\*\\*\\/\\*.model.ts      |\n| WARTHOG_DB_MIGRATIONS        | What DB migrations should TypeORM run       | db/migrations/\\*\\*\\/\\*.ts   |\n| WARTHOG_DB_MIGRATIONS_DIR    | Where should generated migrations be placed | db/migrations               |\n| WARTHOG_DB_PORT              | DB port                                     | 5432                        |\n| WARTHOG_DB_USERNAME          | DB username                                 | _none_                      |\n| WARTHOG_DB_LOGGER            | TypeORM logger                              | advanced-console            |\n| WARTHOG_DB_PASSWORD          | DB password                                 | _none_                      |\n| WARTHOG_DB_SYNCHRONIZE       | DB automatically migrated                   | false                       |\n| WARTHOG_GENERATED_FOLDER     | Where should generated code be placed       | ./generated                 |\n| WARTHOG_INTROSPECTION        | Allow server to be introspected             | true                        |\n| WARTHOG_MOCK_DATABASE        | Should we use mock sqlite DB?               | false                       |\n| WARTHOG_RESOLVERS_PATH       | Where should Warthog look for resolvers     | src/\\*\\*\\/\\*.resolver.ts    |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Complex use cases/ejecting\n\nWarthog makes building simple CRUD endpoints incredibly easy. However, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well.\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should just use [the TypeORM decorators](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md)\n\n### API-only\n\nIf you need to add a field that is only exposed via the API that is not DB-backed, you should just use [the TypeGraphQL Field Decorator](https://github.com/19majkel94/type-graphql/blob/master/src/decorators/Field.ts)\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## Contribute\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\n## License\n\nMIT © Dan Caddigan\n","readmeFilename":"README.md","gitHead":"e3b68d2e41f0313d9b8ebd24caa284063c58f9c4","_id":"warthog@2.0.0-beta.2","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-eQ60GxZv3b1EO7NwVuAmswrdylEHCKsn5sm4Yi1scJtJkrH+SG9xu/1K/lsZc6DrcMmA+VdEJLb/Wf9QO61kuA==","shasum":"845a1b1bdd8c12cae00ef8ac325f4fc0f597600f","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.0.0-beta.2.tgz","fileCount":277,"unpackedSize":526838,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdzOzECRA9TVsSAnZWagAAUYIP/RZzDEYu+PbhSV5Ci6j8\nUfOmfls0S2hIwP0V0r3q0++2KkZC8tav9W6u07f7w+8YQujupYWn0rk9hbsr\nhYHamq9HQGhJdrv7i0PwU94WoCY8lIPG3nMjunXuTcRUpoijVM4XrcG891oS\n34Cc+kOj99OHnN6UM8/iAzDDDVUQRC0rL2J4e2wrtPu4cBld5Xta+OJ3Vt8L\nJ6w5ihKf+IqQWygcX1GKJINYKBeTSB91lApT02CTClUlM1oz14tuzgsK071i\nBwouk9MukVI1IgD2YV0Tlb4iTEqy/jOSeGWzUaIfPamVc9nitriEPXeR4Eyx\nab5BnDyFwMONw6Z2yMiXpdlIq2+DzTiTlGoMrKwPQuk08Z8u9thVI/RmlfNQ\nQVdLTilXwR3qPX2TltcX51BQsG1PGZLXIyiO8FeHil/IvGODLVuXpAMGnPMG\nnQW1Cdd8Dc/+5d2LDKi/GN8skJQ1Pxu+zl8yvsn2F37f+XMmyMnYJuPpdqyJ\nuSdU6NP9a5FJPM/H+gfWMmrSfYUpngUH/GDwj25iv9N/QpfLLWgWTp0M0feZ\n/E53uU7nGN2qRd6cMdZkf+d0rzR+1RCM3aCe6o/Cv+s8jHqdooN5atfJQxNM\nEz3/1/E8KOHrgXR97ktx0EzC5bZHk55pzmjimLPDQCmqwahtnNytOj/lwtU4\nv/0s\r\n=4r7l\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDBtMGU0VDvCclx2uxqGdqFG2MFb/V151Xhr8XWDyZOAwIhAOGDkIi+MwGBvEuRsRyOrQAM/cbVN0I8gEjMEo/M/mHT"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.0.0-beta.2_1573711044329_0.8106428461046298"},"_hasShrinkwrap":false},"2.0.0-beta.3":{"name":"warthog","version":"2.0.0-beta.3","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.5.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.2.0","@typescript-eslint/parser":"^2.2.0","condition-circle":"^2.0.2","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","markdownlint-cli":"^0.19.0","npm-run-all":"^4.1.5","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"ignore":["**/generated/*","examples/**/*"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nYou must have Postgresql installed to use Warthog. If you already have it installed, you can skip this step, otherwise there are 3 options:\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n### Homebrew\n\nIf you're on OSX and have [Homebrew](https://brew.sh/) installed, you can simply run:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) or use the Google machine to figure out how to install on your OS.\n\n## Usage\n\nThe easiest way to start using Warthog for a fresh project is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. This has a simple example in place to get you started. There are also a bunch of examples in the [examples](./examples/README.md) folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n### Installing in Existing Project\n\n```bash\nyarn add warthog\n```\n\n### 1. Create a Model\n\nThe model will auto-generate your database table and graphql types. Warthog will find all models that match the following glob - `'/**/*.model.ts'`. So for this file, you would name it `user.model.ts`\n\n```typescript\nimport { BaseModel, Model, StringField } from 'warthog';\n\n@Model()\nexport class User extends BaseModel {\n  @StringField()\n  name?: string;\n}\n```\n\n### 2. Create a Resolver\n\nThe resolver auto-generates queries and mutations in your GraphQL schema. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. So for this file, you would name it `user.resolver.ts`\n\n```typescript\nimport { User } from './user.model';\nimport { UserService } from './user.service';\n\n@Resolver(User)\nexport class UserResolver {\n  constructor(@Inject('UserService') readonly service: UserService) {}\n\n  @Query(() => [User])\n  async users(@Args() { where, orderBy, limit, offset }: UserWhereArgs): Promise<User[]> {\n    return this.service.find<UserWhereInput>(where, orderBy, limit, offset);\n  }\n\n  @Mutation(() => User)\n  async createUser(@Arg('data') data: UserCreateInput, @Ctx() ctx: BaseContext): Promise<User> {\n    return this.service.create(data, ctx.user.id);\n  }\n}\n```\n\n### 3. Create a Service\n\n```typescript\nimport { User } from './user.model';\n\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n}\n```\n\n### 4. Add config to .env file\n\n```env\nWARTHOG_APP_HOST=localhost\nWARTHOG_APP_PORT=4100\nWARTHOG_DB_DATABASE=warthog\nWARTHOG_DB_USERNAME=postgres\nWARTHOG_DB_PASSWORD=\n```\n\n### 5. Run your server\n\n```typescript\nimport 'reflect-metadata';\nimport { Server } from 'warthog';\n\nasync function bootstrap() {\n  const server = new Server();\n  return server.start();\n}\n\nbootstrap();\n```\n\nWhen you start your server, there will be a new `generated` folder that has your GraphQL schema in `schema.graphql`. This contains:\n\n```graphql\ntype User implements BaseGraphQLObject {\n  id: String!\n  createdAt: DateTime!\n  createdById: String!\n  updatedAt: DateTime\n  updatedById: String\n  deletedAt: DateTime\n  deletedById: String\n  version: Int!\n  name: String!\n}\n\ntype Mutation {\n  createUser(data: UserCreateInput!): User!\n}\n\ntype Query {\n  users(offset: Int, limit: Int = 50, where: UserWhereInput, orderBy: UserOrderByInput): [User!]!\n}\n\ninput UserCreateInput {\n  name: String!\n}\n\nenum UserOrderByInput {\n  createdAt_ASC\n  createdAt_DESC\n  updatedAt_ASC\n  updatedAt_DESC\n  deletedAt_ASC\n  deletedAt_DESC\n  name_ASC\n  name_DESC\n}\n\ninput UserUpdateInput {\n  name: String\n}\n\ninput UserWhereInput {\n  id_eq: String\n  id_in: [String!]\n  createdAt_eq: String\n  createdAt_lt: String\n  createdAt_lte: String\n  createdAt_gt: String\n  createdAt_gte: String\n  createdById_eq: String\n  updatedAt_eq: String\n  updatedAt_lt: String\n  updatedAt_lte: String\n  updatedAt_gt: String\n  updatedAt_gte: String\n  updatedById_eq: String\n  deletedAt_all: Boolean\n  deletedAt_eq: String\n  deletedAt_lt: String\n  deletedAt_lte: String\n  deletedAt_gt: String\n  deletedAt_gte: String\n  deletedById_eq: String\n  name_eq: String\n  name_contains: String\n  name_startsWith: String\n  name_endsWith: String\n  name_in: [String!]\n}\n\ninput UserWhereUniqueInput {\n  id: String!\n}\n\n# ...\n```\n\nNotice how we've only added a single field on the model and you get pagination, filtering and tracking of who created, updated and deleted records automatically.\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => object`                                                     | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                     | value                                       | default                     |\n| ---------------------------- | ------------------------------------------- | --------------------------- |\n| WARTHOG_APP_HOST             | App server host                             | _none_                      |\n| WARTHOG_APP_PORT             | App server port                             | 4000                        |\n| WARTHOG_APP_PROTOCOL         | App server protocol                         | http                        |\n| WARTHOG_AUTO_GENERATE_FILES  | Auto-generate files                         | false (true in development) |\n| WARTHOG_AUTO_OPEN_PLAYGROUND | Open playground on server start             | false (true in development) |\n| WARTHOG_CLI_GENERATE_PATH    | Where should CLI generate files             | ./src                       |\n| WARTHOG_DB_CONNECTION        | DB connection type                          | postgres                    |\n| WARTHOG_DB_DATABASE          | DB name                                     | _none_                      |\n| WARTHOG_DB_ENTITIES          | Where should warthog look for models        | src\\/\\*\\*\\/\\*.model.ts      |\n| WARTHOG_DB_MIGRATIONS        | What DB migrations should TypeORM run       | db/migrations/\\*\\*\\/\\*.ts   |\n| WARTHOG_DB_MIGRATIONS_DIR    | Where should generated migrations be placed | db/migrations               |\n| WARTHOG_DB_PORT              | DB port                                     | 5432                        |\n| WARTHOG_DB_USERNAME          | DB username                                 | _none_                      |\n| WARTHOG_DB_LOGGER            | TypeORM logger                              | advanced-console            |\n| WARTHOG_DB_PASSWORD          | DB password                                 | _none_                      |\n| WARTHOG_DB_SYNCHRONIZE       | DB automatically migrated                   | false                       |\n| WARTHOG_GENERATED_FOLDER     | Where should generated code be placed       | ./generated                 |\n| WARTHOG_INTROSPECTION        | Allow server to be introspected             | true                        |\n| WARTHOG_MOCK_DATABASE        | Should we use mock sqlite DB?               | false                       |\n| WARTHOG_RESOLVERS_PATH       | Where should Warthog look for resolvers     | src/\\*\\*\\/\\*.resolver.ts    |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Complex use cases/ejecting\n\nWarthog makes building simple CRUD endpoints incredibly easy. However, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well.\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should just use [the TypeORM decorators](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md)\n\n### API-only\n\nIf you need to add a field that is only exposed via the API that is not DB-backed, you should just use [the TypeGraphQL Field Decorator](https://github.com/19majkel94/type-graphql/blob/master/src/decorators/Field.ts)\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\n## License\n\nMIT © Dan Caddigan\n","readmeFilename":"README.md","gitHead":"aa3ff8f7cb2fd1779f37779f8a7643d4dd782a6b","_id":"warthog@2.0.0-beta.3","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-ZmfHNkhCFCCRt2Ek+FWFB3tJpq1bTL5OlVx04b23hKN05ItI2nINmaF3xIJfsICNp7XLP9K7Qcd2hkYEljtc6A==","shasum":"c26a3a9abf92f58951d2a7d70addd44f9e512468","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.0.0-beta.3.tgz","fileCount":277,"unpackedSize":526922,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd0FeQCRA9TVsSAnZWagAAPx4P/3Gd4cA8C3iFWctPquGn\nD5+Pe4ED7hNd6rtKrSnMn7PJVJ6DcSy37qxxy/twOjKoxa0yRo9k8HxLcDFy\nKzuoCmVrjKl30TcuXPkKyMAqm7tucWvXPsRm+gn0DHq8tLflDPiuNCUWB1Ey\nGkJ/nuuwpaL33s3xqoc0jf2Y3V7wTOCw/4y6IOpSViguAnKCMUPLeq9U9gbl\nJdArnTvbK3+YDBLFitFult6TZqK+62p9Qh11hxgUI4/r3COuE8phIAbNFfP0\n927q1T0CJhibBUBIW8uBJUtgdDgsgjFEmsJe1hn9Kss935hQAgFKSGtoGu9j\nJ7rwh/1KERQy7XYNbr2oBjkNg3G5mov43y+7t+Swk/wL1TLNxD6XGmQlEAWZ\n9PxCvjJGHPjn4yxIJrUMxCVSVJk69HT31FMvl0xVlzCC6Phw/JIPzmoZ/UqQ\nOj6JTFvydNqXC0QGUZmFECJDp44kWnqyEYbnyH893S+TEP/eQM6wvi2ka4Pi\nnZ4p8ZQ3uv6XxtocCnMCXPUimGiV0RZ9Cbulsy32qKtiYsCS5D5r63GLov9t\nezHLSw4favYMOqz/URRLoRvVpaR9r522dwqtC5EIEeT8D91sjTMPMLOA4p8V\ndBY1PGNJb6AZfJjY+ZX3J9+VNZYsB0Eagz7cshx9zvU4qFTQcXjjgvJU4JMq\nhWJ/\r\n=zFgr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGDjAD8aW75rOKzORDeoWEdT9iR2pRM5+ggemhZb4qZeAiEAw3DkPLgpyL8KhdVpStzxvTRoYhO2X76SbO8Q8/IQDpE="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.0.0-beta.3_1573934991762_0.7438599492613558"},"_hasShrinkwrap":false},"1.47.0":{"name":"warthog","version":"1.47.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.2.0","@typescript-eslint/parser":"^2.2.0","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","npm-run-all":"^4.1.5","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"a43fc4475251430bca11ea339206e4e67d9dd660","_id":"warthog@1.47.0","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-zjg2MwKxGQyhS3sSGeWQQkYCEyKxCBTYxgW2mcfn/YTHL72wbtrBFcbgevpRIOfMfii/gyo727KZraUOfwZv1w==","shasum":"7c2bcf498f710140be9b207e16da0992ad8f6419","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.47.0.tgz","fileCount":268,"unpackedSize":499230,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd0FlXCRA9TVsSAnZWagAA9zoP/R2wHpRSlrytmRirF9gb\nEKYALM8Dl9337PDqAhddzodNtz9lc6n116/6W/zMZeAaVGFESkW22ZIRyb5O\nhlwxhmZclKKq+8ZC+UzUdxtamCbFaa1hjuNEdoIevuo4PaossMUBf3f9EndA\nL5UNzuYSd6lLDJurX5/Wl2C4i/pqX5s8xiLQXpHY8POL0I5684SqF3WJmnsb\nxoYyGbdB58qqHuDYvy7mKSky+rtTwjw3eGgU2/zcDBqg0mYzHC4j/3qRxK4/\n0EHin2GKDXNyDkmLGPQJTKTbvq547uyOXSboqT9UwNWD8EU+8CxzVe2sWZ5A\nVK76Dxc/MaRwEAroh1kfmJEa533vXYrSXMIVWLHbrOhyU/42lxPjNJuet2tZ\nR+yxOxcpZj1HF6+iQehxHneZJkTR+7bL1QvMrXPmkcFh6Os4gZ03VtxdqUql\nxlkrewkNZbOly6+jnYNXd+FDIJhpNcGpxqMAGZUwwzUXP5A3YMSuBW5saLd2\nlqIx+4xARmepAIUjmShxdeluv5g3clZleiyYLw2dcpJHo1eWHG2qmMxa8FgN\nYCwEbBksIkNlIjy0xF2OCplRyguVd3d3X1nU9ZHr1nweMDH7V/BeqPqiTLsT\nb8WEW6Ts/7REZ/K5C2LVLRxDSFAO0L7hr1H5u3tG1zrZ0zHyNb+MmEKDoQJ/\nm9/q\r\n=4kZk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAov0vw1de+B1C4kKeLJoLyfGZyZqmDbJsNSHMuX8FjEAiEA9I4NShthP6EmwXhYwu+ZfGfFiGkeZ2GTmUPyAsuV1R8="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.47.0_1573935446731_0.5099348468220559"},"_hasShrinkwrap":false},"2.0.0-beta.4":{"name":"warthog","version":"2.0.0-beta.4","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nYou must have Postgresql installed to use Warthog. If you already have it installed, you can skip this step, otherwise there are 3 options:\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n### Homebrew\n\nIf you're on OSX and have [Homebrew](https://brew.sh/) installed, you can simply run:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) or use the Google machine to figure out how to install on your OS.\n\n## Usage\n\nThe easiest way to start using Warthog for a fresh project is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. This has a simple example in place to get you started. There are also a bunch of examples in the [examples](./examples/README.md) folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n### Installing in Existing Project\n\n```bash\nyarn add warthog\n```\n\n### 1. Create a Model\n\nThe model will auto-generate your database table and graphql types. Warthog will find all models that match the following glob - `'/**/*.model.ts'`. So for this file, you would name it `user.model.ts`\n\n```typescript\nimport { BaseModel, Model, StringField } from \"warthog\";\n\n@Model()\nexport class User extends BaseModel {\n  @StringField()\n  name?: string;\n}\n```\n\n### 2. Create a Resolver\n\nThe resolver auto-generates queries and mutations in your GraphQL schema. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. So for this file, you would name it `user.resolver.ts`\n\n```typescript\nimport { User } from \"./user.model\";\nimport { UserService } from \"./user.service\";\n\n@Resolver(User)\nexport class UserResolver {\n  constructor(@Inject(\"UserService\") readonly service: UserService) {}\n\n  @Query(() => [User])\n  async users(\n    @Args() { where, orderBy, limit, offset }: UserWhereArgs\n  ): Promise<User[]> {\n    return this.service.find<UserWhereInput>(where, orderBy, limit, offset);\n  }\n\n  @Mutation(() => User)\n  async createUser(\n    @Arg(\"data\") data: UserCreateInput,\n    @Ctx() ctx: BaseContext\n  ): Promise<User> {\n    return this.service.create(data, ctx.user.id);\n  }\n}\n```\n\n### 3. Create a Service\n\n```typescript\nimport { User } from \"./user.model\";\n\n@Service(\"UserService\")\nexport class UserService extends BaseService<User> {\n  constructor(\n    @InjectRepository(User) protected readonly repository: Repository<User>\n  ) {\n    super(User, repository);\n  }\n}\n```\n\n### 4. Add config to .env file\n\n```env\nWARTHOG_APP_HOST=localhost\nWARTHOG_APP_PORT=4100\nWARTHOG_DB_DATABASE=warthog\nWARTHOG_DB_USERNAME=postgres\nWARTHOG_DB_PASSWORD=\n```\n\n### 5. Run your server\n\n```typescript\nimport \"reflect-metadata\";\nimport { Server } from \"warthog\";\n\nasync function bootstrap() {\n  const server = new Server();\n  return server.start();\n}\n\nbootstrap();\n```\n\nWhen you start your server, there will be a new `generated` folder that has your GraphQL schema in `schema.graphql`. This contains:\n\n```graphql\ntype User implements BaseGraphQLObject {\n  id: String!\n  createdAt: DateTime!\n  createdById: String!\n  updatedAt: DateTime\n  updatedById: String\n  deletedAt: DateTime\n  deletedById: String\n  version: Int!\n  name: String!\n}\n\ntype Mutation {\n  createUser(data: UserCreateInput!): User!\n}\n\ntype Query {\n  users(\n    offset: Int\n    limit: Int = 50\n    where: UserWhereInput\n    orderBy: UserOrderByInput\n  ): [User!]!\n}\n\ninput UserCreateInput {\n  name: String!\n}\n\nenum UserOrderByInput {\n  createdAt_ASC\n  createdAt_DESC\n  updatedAt_ASC\n  updatedAt_DESC\n  deletedAt_ASC\n  deletedAt_DESC\n  name_ASC\n  name_DESC\n}\n\ninput UserUpdateInput {\n  name: String\n}\n\ninput UserWhereInput {\n  id_eq: String\n  id_in: [String!]\n  createdAt_eq: String\n  createdAt_lt: String\n  createdAt_lte: String\n  createdAt_gt: String\n  createdAt_gte: String\n  createdById_eq: String\n  updatedAt_eq: String\n  updatedAt_lt: String\n  updatedAt_lte: String\n  updatedAt_gt: String\n  updatedAt_gte: String\n  updatedById_eq: String\n  deletedAt_all: Boolean\n  deletedAt_eq: String\n  deletedAt_lt: String\n  deletedAt_lte: String\n  deletedAt_gt: String\n  deletedAt_gte: String\n  deletedById_eq: String\n  name_eq: String\n  name_contains: String\n  name_startsWith: String\n  name_endsWith: String\n  name_in: [String!]\n}\n\ninput UserWhereUniqueInput {\n  id: String!\n}\n\n# ...\n```\n\nNotice how we've only added a single field on the model and you get pagination, filtering and tracking of who created, updated and deleted records automatically.\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => object`                                                     | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                     | value                                       | default                     |\n| ---------------------------- | ------------------------------------------- | --------------------------- |\n| WARTHOG_APP_HOST             | App server host                             | _none_                      |\n| WARTHOG_APP_PORT             | App server port                             | 4000                        |\n| WARTHOG_APP_PROTOCOL         | App server protocol                         | http                        |\n| WARTHOG_AUTO_GENERATE_FILES  | Auto-generate files                         | false (true in development) |\n| WARTHOG_AUTO_OPEN_PLAYGROUND | Open playground on server start             | false (true in development) |\n| WARTHOG_CLI_GENERATE_PATH    | Where should CLI generate files             | ./src                       |\n| WARTHOG_DB_CONNECTION        | DB connection type                          | postgres                    |\n| WARTHOG_DB_DATABASE          | DB name                                     | _none_                      |\n| WARTHOG_DB_ENTITIES          | Where should warthog look for models        | src\\/\\*\\*\\/\\*.model.ts      |\n| WARTHOG_DB_MIGRATIONS        | What DB migrations should TypeORM run       | db/migrations/\\*\\*\\/\\*.ts   |\n| WARTHOG_DB_MIGRATIONS_DIR    | Where should generated migrations be placed | db/migrations               |\n| WARTHOG_DB_PORT              | DB port                                     | 5432                        |\n| WARTHOG_DB_USERNAME          | DB username                                 | _none_                      |\n| WARTHOG_DB_LOGGER            | TypeORM logger                              | advanced-console            |\n| WARTHOG_DB_PASSWORD          | DB password                                 | _none_                      |\n| WARTHOG_DB_SYNCHRONIZE       | DB automatically migrated                   | false                       |\n| WARTHOG_GENERATED_FOLDER     | Where should generated code be placed       | ./generated                 |\n| WARTHOG_INTROSPECTION        | Allow server to be introspected             | true                        |\n| WARTHOG_MOCK_DATABASE        | Should we use mock sqlite DB?               | false                       |\n| WARTHOG_RESOLVERS_PATH       | Where should Warthog look for resolvers     | src/\\*\\*\\/\\*.resolver.ts    |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Complex use cases/ejecting\n\nWarthog makes building simple CRUD endpoints incredibly easy. However, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well.\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should just use [the TypeORM decorators](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md)\n\n### API-only\n\nIf you need to add a field that is only exposed via the API that is not DB-backed, you should just use [the TypeGraphQL Field Decorator](https://github.com/19majkel94/type-graphql/blob/master/src/decorators/Field.ts)\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n","readmeFilename":"README.md","gitHead":"dff0567350480f4b687fccf00fa313f9dd3bf521","_id":"warthog@2.0.0-beta.4","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-vD2KOTjxKTVVVa+gwW8/d1mnvT3rYps2oBT9rDVXonXInPhRmpzLcwNbM6iNjccMsdcXKdQdFoZNkFP771G7ag==","shasum":"f0aa8b94ffecac4d94c4d7b4261869eb06d7414d","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.0.0-beta.4.tgz","fileCount":277,"unpackedSize":530681,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd0JX1CRA9TVsSAnZWagAAzMMP/icQ2Lk5Iu/yC33gw52N\nIszrc+00O9ro52U6rKAADh2/9yOACzfY7TYMvmP4gSm4nbLBfdyAu0s5X3Qg\n801KkljPfx3wqrNohqsFXAKkIIIJCdxaXLyhcNHybcVuEgXxO6/iXXDoZ0Gz\n60GaJpYCc72L26RGVmUrJEncE8fBzHwjAkQ2un9YgrJ6g72XjiF0RlebHZWB\nqxGD58OJ6ETBmFYnbya6ZLXwyjOCFFxfwlH6baMPWqpW88KgrYr89DG83Pdx\nfj8p+ttg9vPoUReg/wtd7MpTZLATQqHtfJEGWpsJyYVUtU2pHJ4jliw34CG8\nKlgOtSqMZDfW3BRgaVftWRmwUMweFv8+5NX6DxvW2mRnzf7XG8CFzUqpjHYM\ntykGPyj/fQKcs6EASouGmljxTCg/dxdcQUqLG55dTi6CPBXV+pcz+DyNtGjU\n5aylGz25i80MADoRayK80Z+8MUMT10w+IZ9UPgOFL4gdh70ISu5SO3VgbAGG\nwJvEIUnrdc0D+lODm+hySvVLuM5axFZEOn/p+Fw2cPwqKlm761KUBgDJTlID\nK1Lm4kco9jt6U5CMXpWk+LPvOtU2DhXT9V60QQV0pnyhDtoKxSn83Trz3/yW\nsKRzREvO5QIpNtuQ1JmdHLKwVb1te2fpl9OYliV7iryA1E9tn5GwFlAlSomv\nD24M\r\n=rz1W\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDNca+KohDixyvLfnJ3zj6WGudqqDGyg5FTAse302s62gIgFs3/B4fLpR6jALdOdhLUoGbdjMj1XkXZthrBppIJiIY="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.0.0-beta.4_1573950965305_0.7894781718648163"},"_hasShrinkwrap":false},"1.47.1":{"name":"warthog","version":"1.47.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.2.0","@typescript-eslint/parser":"^2.2.0","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","npm-run-all":"^4.1.5","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"]},"ignore":["**/generated/*"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"83ee9bb47a5cf7f9f6ab47481e09d8792165b631","_id":"warthog@1.47.1","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-cFFxWnS+zcoEt/Ao/xsQeOeporjyByL1r4ymSlcKqiO4OuCFvY3WFz1jIGcfktbL8u5WQ67zEpD4ju1oSekf3Q==","shasum":"1bf85c5f1246980f88fa17fa44cd5cd180491a37","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.47.1.tgz","fileCount":268,"unpackedSize":499611,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd0Ja2CRA9TVsSAnZWagAAVX4P/0UHggZlmZzf2d/JK6cn\niMB2C0XBnopt4RUgUGvZPXrooV38lD43V5/OwRB7bqgzTcPcVMfd/Sb72kLl\nTpm6qUyux4eEh30nZen7Co7dcXxWpEzxSJ7REQvE8of1eur7xfQB2j+20qJu\nlftX6n/WBmSHZrqxV7vH0Y5A0PwKtGfz/fPUGwRNd20RumTjQp2CR8bgdDt9\nNzcziU56q0PJJOa2uTrEDA5CvaUSW5p8NsGqoFiXS8BAuV9SOGe/mujNyGup\nOptApHCWWn6PaO/AmqH4fUQ5P83hNx73IR+FBLbQqMCPSztEpToLDk3iR3ls\nAuSMXXOCK2pXQKvCtxoJyRnrTBhsYt65i7CBALWT1L3A7UDACp7mXQz1a28e\nM17Sotc4FW4jBLhyLVNbyf+5ehTGPkFglwnSXQOlAeDNXLz34tSjHze+j5na\nC7ksKk7JGcYREo04CEn071Or/Q5LD80fkebReU+TjIJRdiedQoJuysPesYph\nmQFV9rXWAL4OB00T1xjYdfBCa6o3Z5VDMwtf0YUPyv+zgUH/JSyICrvQeaTh\nLxnCq46UYyoDT8M7xsWc77hWYOJcNWITamIqnJFeyz/lgC8bymcXux/ATUIa\nxBWulPpv1RCqitXe6VF6XVktrq76/seXO8vHdt09WvQZBtA32asSGRkRyH+b\nyZsA\r\n=KNI7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDF0ZJIAfXRwKXya+N+BMpCnzb0wDfh4EOsVHdksT/DEQIgBKFyz3KJ1kNwySv0IOAe9ADXusEVoGBvmtBVtc+EJGY="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.47.1_1573951158407_0.08582892953121402"},"_hasShrinkwrap":false},"2.0.0-beta.5":{"name":"warthog","version":"2.0.0-beta.5","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nYou must have Postgresql installed to use Warthog. If you already have it installed, you can skip this step, otherwise there are 3 options:\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n### Homebrew\n\nIf you're on OSX and have [Homebrew](https://brew.sh/) installed, you can simply run:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) or use the Google machine to figure out how to install on your OS.\n\n## Usage\n\nThe easiest way to start using Warthog for a fresh project is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. This has a simple example in place to get you started. There are also a bunch of examples in the [examples](./examples/README.md) folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n### Installing in Existing Project\n\n```bash\nyarn add warthog\n```\n\n### 1. Create a Model\n\nThe model will auto-generate your database table and graphql types. Warthog will find all models that match the following glob - `'/**/*.model.ts'`. So for this file, you would name it `user.model.ts`\n\n```typescript\nimport { BaseModel, Model, StringField } from \"warthog\";\n\n@Model()\nexport class User extends BaseModel {\n  @StringField()\n  name?: string;\n}\n```\n\n### 2. Create a Resolver\n\nThe resolver auto-generates queries and mutations in your GraphQL schema. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. So for this file, you would name it `user.resolver.ts`\n\n```typescript\nimport { User } from \"./user.model\";\nimport { UserService } from \"./user.service\";\n\n@Resolver(User)\nexport class UserResolver {\n  constructor(@Inject(\"UserService\") readonly service: UserService) {}\n\n  @Query(() => [User])\n  async users(\n    @Args() { where, orderBy, limit, offset }: UserWhereArgs\n  ): Promise<User[]> {\n    return this.service.find<UserWhereInput>(where, orderBy, limit, offset);\n  }\n\n  @Mutation(() => User)\n  async createUser(\n    @Arg(\"data\") data: UserCreateInput,\n    @Ctx() ctx: BaseContext\n  ): Promise<User> {\n    return this.service.create(data, ctx.user.id);\n  }\n}\n```\n\n### 3. Create a Service\n\n```typescript\nimport { User } from \"./user.model\";\n\n@Service(\"UserService\")\nexport class UserService extends BaseService<User> {\n  constructor(\n    @InjectRepository(User) protected readonly repository: Repository<User>\n  ) {\n    super(User, repository);\n  }\n}\n```\n\n### 4. Add config to .env file\n\n```env\nWARTHOG_APP_HOST=localhost\nWARTHOG_APP_PORT=4100\nWARTHOG_DB_DATABASE=warthog\nWARTHOG_DB_USERNAME=postgres\nWARTHOG_DB_PASSWORD=\n```\n\n### 5. Run your server\n\n```typescript\nimport \"reflect-metadata\";\nimport { Server } from \"warthog\";\n\nasync function bootstrap() {\n  const server = new Server();\n  return server.start();\n}\n\nbootstrap();\n```\n\nWhen you start your server, there will be a new `generated` folder that has your GraphQL schema in `schema.graphql`. This contains:\n\n```graphql\ntype User implements BaseGraphQLObject {\n  id: String!\n  createdAt: DateTime!\n  createdById: String!\n  updatedAt: DateTime\n  updatedById: String\n  deletedAt: DateTime\n  deletedById: String\n  version: Int!\n  name: String!\n}\n\ntype Mutation {\n  createUser(data: UserCreateInput!): User!\n}\n\ntype Query {\n  users(\n    offset: Int\n    limit: Int = 50\n    where: UserWhereInput\n    orderBy: UserOrderByInput\n  ): [User!]!\n}\n\ninput UserCreateInput {\n  name: String!\n}\n\nenum UserOrderByInput {\n  createdAt_ASC\n  createdAt_DESC\n  updatedAt_ASC\n  updatedAt_DESC\n  deletedAt_ASC\n  deletedAt_DESC\n  name_ASC\n  name_DESC\n}\n\ninput UserUpdateInput {\n  name: String\n}\n\ninput UserWhereInput {\n  id_eq: String\n  id_in: [String!]\n  createdAt_eq: String\n  createdAt_lt: String\n  createdAt_lte: String\n  createdAt_gt: String\n  createdAt_gte: String\n  createdById_eq: String\n  updatedAt_eq: String\n  updatedAt_lt: String\n  updatedAt_lte: String\n  updatedAt_gt: String\n  updatedAt_gte: String\n  updatedById_eq: String\n  deletedAt_all: Boolean\n  deletedAt_eq: String\n  deletedAt_lt: String\n  deletedAt_lte: String\n  deletedAt_gt: String\n  deletedAt_gte: String\n  deletedById_eq: String\n  name_eq: String\n  name_contains: String\n  name_startsWith: String\n  name_endsWith: String\n  name_in: [String!]\n}\n\ninput UserWhereUniqueInput {\n  id: String!\n}\n\n# ...\n```\n\nNotice how we've only added a single field on the model and you get pagination, filtering and tracking of who created, updated and deleted records automatically.\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => object`                                                     | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                     | value                                       | default                     |\n| ---------------------------- | ------------------------------------------- | --------------------------- |\n| WARTHOG_APP_HOST             | App server host                             | _none_                      |\n| WARTHOG_APP_PORT             | App server port                             | 4000                        |\n| WARTHOG_APP_PROTOCOL         | App server protocol                         | http                        |\n| WARTHOG_AUTO_GENERATE_FILES  | Auto-generate files                         | false (true in development) |\n| WARTHOG_AUTO_OPEN_PLAYGROUND | Open playground on server start             | false (true in development) |\n| WARTHOG_CLI_GENERATE_PATH    | Where should CLI generate files             | ./src                       |\n| WARTHOG_DB_CONNECTION        | DB connection type                          | postgres                    |\n| WARTHOG_DB_DATABASE          | DB name                                     | _none_                      |\n| WARTHOG_DB_ENTITIES          | Where should warthog look for models        | src\\/\\*\\*\\/\\*.model.ts      |\n| WARTHOG_DB_MIGRATIONS        | What DB migrations should TypeORM run       | db/migrations/\\*\\*\\/\\*.ts   |\n| WARTHOG_DB_MIGRATIONS_DIR    | Where should generated migrations be placed | db/migrations               |\n| WARTHOG_DB_PORT              | DB port                                     | 5432                        |\n| WARTHOG_DB_USERNAME          | DB username                                 | _none_                      |\n| WARTHOG_DB_LOGGER            | TypeORM logger                              | advanced-console            |\n| WARTHOG_DB_PASSWORD          | DB password                                 | _none_                      |\n| WARTHOG_DB_SYNCHRONIZE       | DB automatically migrated                   | false                       |\n| WARTHOG_GENERATED_FOLDER     | Where should generated code be placed       | ./generated                 |\n| WARTHOG_INTROSPECTION        | Allow server to be introspected             | true                        |\n| WARTHOG_MOCK_DATABASE        | Should we use mock sqlite DB?               | false                       |\n| WARTHOG_RESOLVERS_PATH       | Where should Warthog look for resolvers     | src/\\*\\*\\/\\*.resolver.ts    |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Complex use cases/ejecting\n\nWarthog makes building simple CRUD endpoints incredibly easy. However, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well.\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should just use [the TypeORM decorators](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md)\n\n### API-only\n\nIf you need to add a field that is only exposed via the API that is not DB-backed, you should just use [the TypeGraphQL Field Decorator](https://github.com/19majkel94/type-graphql/blob/master/src/decorators/Field.ts)\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n","readmeFilename":"README.md","gitHead":"115f24d8b59a18bd24433a344572eb0094cc9b36","_id":"warthog@2.0.0-beta.5","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-AdMjS1cHipTggIEEwKcFgKh8SRnNUaOd/j51DOgyyimdAwts4M7ieszo1rY2F2M0jSDI9xe9TA+84yfw10MI2g==","shasum":"18de27ae42c43a2a080385e4bed6f754256e802a","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.0.0-beta.5.tgz","fileCount":277,"unpackedSize":531062,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd0JgQCRA9TVsSAnZWagAAc0YQAJ5dBC1j23Io8o+Ayukb\nAoiXzVajjmCtlMSAOGQh20qNmemg2/YyKsLfCg4TRJF31qDu3F96+Q9TZtlx\n6VDHdLZS7AJxYVOuPJerHPka++GiVzEtsWn5b86IswCqp+srBZ7vZW1j5Ufq\n2zaTW/dk6LpohC74Eka043kZV9uR/6nqA71kvPJnc1tWkd4giPgiPs5vw8d/\nGrVC/OhB7TaFduaFP8EGzbJ3Nfj5ydfjinAr6CsG233jxuIow83Bhjm+OtY3\nTo0XS8IAZ0uHmMCySZbS0fk8WxjFPQlKT4WWdlfqQXbwk48dUZFw9CxMbbRx\nvqfj1cunN6UivVlqj4qa4wIbo3v5WhwZ5Pgtd2gWvpt7srrjtqrpn3GmDsys\nRvbpo/B6qQtM7eTfqskMR0h+l8DStAS/K4Mg8GcFeakz9W/TMJQQtiBVVmGr\nHMXZoQ2qOKFhTiGJshwEL7Wzug0zY1YhZlTK8aqYmGcEbwbuqr03IumsYmgC\nHVeDjMlb0bAnM48oiAMyjTbu7XSM8DyPi5515JyzK5Rf3Anga37aCMt2WYJu\nXrIdHBvMETXgYRSXKFtCwL4N6QCVLnUf7bmIlZT5XK5THYR1U2sbX4q3ubMG\nY8PUsomwB6c8DoIAq2zqsUT/x3sM5QzPV7kdPl3bfCpoqosCXzpzU5wvEBYF\nVOHs\r\n=C9QM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID05uDREaxrqxRoyFraK321ZZTy/37JBTuTLWLtpKp1pAiBhJYLoH467DnWCEXwnNiNaHabExmubQR8vnLbnEnrViw=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.0.0-beta.5_1573951504006_0.5509036576495121"},"_hasShrinkwrap":false},"1.48.0":{"name":"warthog","version":"1.48.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.2.0","@typescript-eslint/parser":"^2.2.0","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"ignore":["**/generated/*"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"45eacec9bf2c216f20f1cd41150479d4ea7862ad","_id":"warthog@1.48.0","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-JU+/YpGnVuDDNNzwzl8ztgs2Qju5B0MvpNhrvZ5D59STe8hHYI1PV09p1ZjVY18L2xDbxn6m/+bSEWY1drK3fg==","shasum":"4c7900bd7db36d592b1e880c9534d5b6273bdfc0","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.48.0.tgz","fileCount":277,"unpackedSize":520200,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd0KgxCRA9TVsSAnZWagAAjBMP/02gzpHL4uRjBYlSCOIB\n6KFmFa/DTT/XBS0u6F7KL1kCemgK/RgEMoe9PWMWU1jwTYa8rMypUg5+YvYU\nHavEE6jTx1/tOfbz7yMyhEWldU/FEfucFpojbP1I7QhHYiFElA615nmg5Dwd\nLm2uusuYn502qIBmhPDwVdqh8vzJoI4xtenT9ongEATdIqOol1DgE3uC6nhm\nu9CZ/qFEVdfij3nkSSecdDNYUoGi7ONttjfe6ZJReRPhiLSrFLqlOSET6E92\nqPVHkVBc6fy5ifzrHP9SJ4/hdVcseILsbTlanLhD/YrDFxiMaEv2kVELFMTU\nnaP8o8DRef2kMI+i8rlDJ/OQB1lEs39391H656qfjwOegJ8/JOaABHNW3kOj\nBz7k0nrrIKOEcUI06ztA/9OXcKXfi9XgsUstqTJqJ64i3SClAMvEk68imEJu\ndWCo0kWfc1dbEzqieHDfyR36GvncJSBWdkVZMX/fA2q2ZkRU7MprWtapNTJJ\nj4BGXRf3UkkNNvR1D/8MUfQVOkswt7rDxgWxm4DJq3qjzk3rwImXloaiRv4Z\nFFf4yHqpUTL0CusMhxKxlyr7/S2MRqoLgiMrsb3VFzce3rF1wh/xnewBvHe8\n/vd99vfiNYfKnZQQvwDwTeCfG4NAzt45Cz/CMqj4aqneXSy82tGioAS7u+dy\nP2Ij\r\n=XuvU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCLx6qkKxLOXnRXBgXTpiohr2bYh/99FElcZOOF9NsG0gIhAML24No9ZobFX5bynwSzmo7npxKirfxnl91dRj78acYn"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.48.0_1573955633116_0.32896470174739645"},"_hasShrinkwrap":false},"1.48.1":{"name":"warthog","version":"1.48.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.2.0","@typescript-eslint/parser":"^2.2.0","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"ignore":["**/generated/*"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"bc6957093c6015c95147a892f76eb9c1a16d7a98","_id":"warthog@1.48.1","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-VMtXcSOaiNnYcmTnTVzbYFk75wP9ohHGhD9I1GbB1/n8aHUuTHAg00Z2vKaEOJIfdkiAQUsOpjaKAHNUEMH7QA==","shasum":"6a19449c9c9ad0def655920ed5c83ced6d6c9ea4","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.48.1.tgz","fileCount":277,"unpackedSize":520309,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd0LNhCRA9TVsSAnZWagAAd8AQAJtPqCF0hOqj6nIr3Xqb\nUfgyBJFu/bhZdlZ4Q604VyVzSTMXDWHAk0lQfBr23UE9Ib2qCiVjS74Z1x53\nsSay27/X9QqDL9nWM5yVuZdQu1lpyyOEQIodMruPqBdZJgMq25ZUuQ5U/+qQ\nYweWKqGz73gtbCwLtfXfuzbMNdcyNrILWs3Aodb1dpeSbRhViSk9wgXJmocH\n44m0wtkAXzXtcVjmTBM1wde+ahXAtyhRFmmwCVG+PMGiKra3T3BOlsU7Vp0q\nwtoMzmJnRBZf4Zo/n+KX4zXER35WZGrxfanLycJfCb/q2zhFKqc4iqRN+7Vd\n6+B19LDTzxT/ylS8TbAWs7yX0QBARPCY7qoRmCHnSo3Y4obJDkHY/W4QGOlq\nHsHxqlbuYhpQuOuf3G4kN+h4KCpclVzZWNJ9pZn8Obj50fYQQzoFALs4KR8K\nK9q4YbtgVnLn9Tg5KAh1GJMgz5gUdT4BZJ8YQR6FLYSp9tKVTBokDrzk/hHC\nyRSID2eECke3cMLa/IOmJLstsT178bGcc7NFD6CknB07Hiiqc08Clw0uKk8b\niLqW2481CJdFsc1n82bU0cz9fFCaV6VQioAhH0fmcZ2mi86X59UgEDStyRDp\njkrvmXvJJfLf/hDQakvR4Qo0NKqVYECJuz5G4O7e/0+D9KFw2tNEn2EgBkyx\nL5qL\r\n=v3RN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCO6zUnTsVLauf73VRIs1VC/MapxPVBjRzf2uZ2ldJjnwIgPLXfMAZWMl7IzBStClX/bFDskkH+k3Oz6L/VseBVedc="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.48.1_1573958496514_0.3122376368099662"},"_hasShrinkwrap":false},"2.0.0-beta.6":{"name":"warthog","version":"2.0.0-beta.6","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"856f2f5f57e333c5400d84e7265631ff6945a7fd","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nYou must have Postgresql installed to use Warthog. If you already have it installed, you can skip this step, otherwise there are 3 options:\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n### Homebrew\n\nIf you're on OSX and have [Homebrew](https://brew.sh/) installed, you can simply run:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) or use the Google machine to figure out how to install on your OS.\n\n## Usage\n\nThe easiest way to start using Warthog for a fresh project is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. This has a simple example in place to get you started. There are also a bunch of examples in the [examples](./examples/README.md) folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n### Installing in Existing Project\n\n```bash\nyarn add warthog\n```\n\n### 1. Create a Model\n\nThe model will auto-generate your database table and graphql types. Warthog will find all models that match the following glob - `'/**/*.model.ts'`. So for this file, you would name it `user.model.ts`\n\n```typescript\nimport { BaseModel, Model, StringField } from \"warthog\";\n\n@Model()\nexport class User extends BaseModel {\n  @StringField()\n  name?: string;\n}\n```\n\n### 2. Create a Resolver\n\nThe resolver auto-generates queries and mutations in your GraphQL schema. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. So for this file, you would name it `user.resolver.ts`\n\n```typescript\nimport { User } from \"./user.model\";\nimport { UserService } from \"./user.service\";\n\n@Resolver(User)\nexport class UserResolver {\n  constructor(@Inject(\"UserService\") readonly service: UserService) {}\n\n  @Query(() => [User])\n  async users(\n    @Args() { where, orderBy, limit, offset }: UserWhereArgs\n  ): Promise<User[]> {\n    return this.service.find<UserWhereInput>(where, orderBy, limit, offset);\n  }\n\n  @Mutation(() => User)\n  async createUser(\n    @Arg(\"data\") data: UserCreateInput,\n    @Ctx() ctx: BaseContext\n  ): Promise<User> {\n    return this.service.create(data, ctx.user.id);\n  }\n}\n```\n\n### 3. Create a Service\n\n```typescript\nimport { User } from \"./user.model\";\n\n@Service(\"UserService\")\nexport class UserService extends BaseService<User> {\n  constructor(\n    @InjectRepository(User) protected readonly repository: Repository<User>\n  ) {\n    super(User, repository);\n  }\n}\n```\n\n### 4. Add config to .env file\n\n```env\nWARTHOG_APP_HOST=localhost\nWARTHOG_APP_PORT=4100\nWARTHOG_DB_DATABASE=warthog\nWARTHOG_DB_USERNAME=postgres\nWARTHOG_DB_PASSWORD=\n```\n\n### 5. Run your server\n\n```typescript\nimport \"reflect-metadata\";\nimport { Server } from \"warthog\";\n\nasync function bootstrap() {\n  const server = new Server();\n  return server.start();\n}\n\nbootstrap();\n```\n\nWhen you start your server, there will be a new `generated` folder that has your GraphQL schema in `schema.graphql`. This contains:\n\n```graphql\ntype User implements BaseGraphQLObject {\n  id: String!\n  createdAt: DateTime!\n  createdById: String!\n  updatedAt: DateTime\n  updatedById: String\n  deletedAt: DateTime\n  deletedById: String\n  version: Int!\n  name: String!\n}\n\ntype Mutation {\n  createUser(data: UserCreateInput!): User!\n}\n\ntype Query {\n  users(\n    offset: Int\n    limit: Int = 50\n    where: UserWhereInput\n    orderBy: UserOrderByInput\n  ): [User!]!\n}\n\ninput UserCreateInput {\n  name: String!\n}\n\nenum UserOrderByInput {\n  createdAt_ASC\n  createdAt_DESC\n  updatedAt_ASC\n  updatedAt_DESC\n  deletedAt_ASC\n  deletedAt_DESC\n  name_ASC\n  name_DESC\n}\n\ninput UserUpdateInput {\n  name: String\n}\n\ninput UserWhereInput {\n  id_eq: String\n  id_in: [String!]\n  createdAt_eq: String\n  createdAt_lt: String\n  createdAt_lte: String\n  createdAt_gt: String\n  createdAt_gte: String\n  createdById_eq: String\n  updatedAt_eq: String\n  updatedAt_lt: String\n  updatedAt_lte: String\n  updatedAt_gt: String\n  updatedAt_gte: String\n  updatedById_eq: String\n  deletedAt_all: Boolean\n  deletedAt_eq: String\n  deletedAt_lt: String\n  deletedAt_lte: String\n  deletedAt_gt: String\n  deletedAt_gte: String\n  deletedById_eq: String\n  name_eq: String\n  name_contains: String\n  name_startsWith: String\n  name_endsWith: String\n  name_in: [String!]\n}\n\ninput UserWhereUniqueInput {\n  id: String!\n}\n\n# ...\n```\n\nNotice how we've only added a single field on the model and you get pagination, filtering and tracking of who created, updated and deleted records automatically.\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => object`                                                     | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                     | value                                       | default                     |\n| ---------------------------- | ------------------------------------------- | --------------------------- |\n| WARTHOG_APP_HOST             | App server host                             | _none_                      |\n| WARTHOG_APP_PORT             | App server port                             | 4000                        |\n| WARTHOG_APP_PROTOCOL         | App server protocol                         | http                        |\n| WARTHOG_AUTO_GENERATE_FILES  | Auto-generate files                         | false (true in development) |\n| WARTHOG_AUTO_OPEN_PLAYGROUND | Open playground on server start             | false (true in development) |\n| WARTHOG_CLI_GENERATE_PATH    | Where should CLI generate files             | ./src                       |\n| WARTHOG_DB_CONNECTION        | DB connection type                          | postgres                    |\n| WARTHOG_DB_DATABASE          | DB name                                     | _none_                      |\n| WARTHOG_DB_ENTITIES          | Where should warthog look for models        | src\\/\\*\\*\\/\\*.model.ts      |\n| WARTHOG_DB_MIGRATIONS        | What DB migrations should TypeORM run       | db/migrations/\\*\\*\\/\\*.ts   |\n| WARTHOG_DB_MIGRATIONS_DIR    | Where should generated migrations be placed | db/migrations               |\n| WARTHOG_DB_PORT              | DB port                                     | 5432                        |\n| WARTHOG_DB_USERNAME          | DB username                                 | _none_                      |\n| WARTHOG_DB_LOGGER            | TypeORM logger                              | advanced-console            |\n| WARTHOG_DB_PASSWORD          | DB password                                 | _none_                      |\n| WARTHOG_DB_SYNCHRONIZE       | DB automatically migrated                   | false                       |\n| WARTHOG_GENERATED_FOLDER     | Where should generated code be placed       | ./generated                 |\n| WARTHOG_INTROSPECTION        | Allow server to be introspected             | true                        |\n| WARTHOG_MOCK_DATABASE        | Should we use mock sqlite DB?               | false                       |\n| WARTHOG_RESOLVERS_PATH       | Where should Warthog look for resolvers     | src/\\*\\*\\/\\*.resolver.ts    |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Complex use cases/ejecting\n\nWarthog makes building simple CRUD endpoints incredibly easy. However, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well.\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should just use [the TypeORM decorators](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md)\n\n### API-only\n\nIf you need to add a field that is only exposed via the API that is not DB-backed, you should just use [the TypeGraphQL Field Decorator](https://github.com/19majkel94/type-graphql/blob/master/src/decorators/Field.ts)\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n","readmeFilename":"README.md","_id":"warthog@2.0.0-beta.6","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-uQFCRsZ625nRNuwf5PY9kEdzDxGL68UxbZBMpZKoDq/IBTGnb/Io5HXfi4lsR/Bz4JC8gWwzT/kqbcDBPySEhQ==","shasum":"b2192b0b8c3cbbf5971a162bc65714ec2b77e7a1","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.0.0-beta.6.tgz","fileCount":277,"unpackedSize":531171,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd0LORCRA9TVsSAnZWagAAkLAQAJFUspbblYWYT4NjmuIb\nddL1GJxrIu9nGd3VBLcgcjnoYnXRb1BZwyuUpfQPrvwxon/tOdbvpvLw4mKn\n+V/OothCHBSXpy5vw5dlIQllvH+vJ57X6kJ07t9MHjTc3rH7QoMkeTdcE1FW\ngFG7zzFtJsudIQ39fdTvQq+Wwmx66d3AOLE4DsswmwQuH4Rnlirratxz5y0l\ngonwDnpVaCKtvMMMKQniF9PcjYFGIpWEAIAwn4A5VIfF9Xeq+vLeKVqw8YC3\n9Bj60L1GlVLRX3b5ZUqQAaJnka88DF6UwfbmM87DXJkIevxVL7UI6DBpUtiq\nH+0NRBoNegrFho2dxXeyxyUVlrGiY4diEM2eS1h2dh8/G2WDzGAfKhPlPe5i\nc2h5jLmySrl/HYUZtUUGXLJxZG7suuz3jsb9rPAUbPAh6vG+25ihH4TV087h\n4Qaf2wJAp0C88fntzRIhXZB16XWw9NaMjYLSC7AJxLdSBv4l9WuzkhKiBC3+\ngWddRpdh8EbfxCVj5vV3EC6YGSW6k0gVq4N0Hbsv3Feb6/JqklaHBJH9QYtS\nhMvccV+f/mcC4HseY4tVMgdpZ0mQhMCyVgOm9SoAnZ4xYZnwQSM8S2fp1DSs\nHcLBibtsgvYMWDO/VWZRC2K1XklaH99BCBaXQCm6RiiUjJJ6Wxm2enYP/Bex\nWBzm\r\n=UJIU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID4w/HJzSIqn4zQNJMyt4XqSGzS22QunwyB+3nMv9Br8AiAmpp14MZUmz7i9ucIXGga0jwFsoBc5vlazDrIWCZmm0Q=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.0.0-beta.6_1573958544601_0.37962134002086056"},"_hasShrinkwrap":false},"2.0.0-beta.7":{"name":"warthog","version":"2.0.0-beta.7","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"f0b18c3ac280d68dfdca0e2e0b36e3680864590b","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nYou must have Postgresql installed to use Warthog. If you already have it installed, you can skip this step, otherwise there are 3 options:\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n### Homebrew\n\nIf you're on OSX and have [Homebrew](https://brew.sh/) installed, you can simply run:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) or use the Google machine to figure out how to install on your OS.\n\n## Usage\n\nThe easiest way to start using Warthog for a fresh project is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. This has a simple example in place to get you started. There are also a bunch of examples in the [examples](./examples/README.md) folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n### Installing in Existing Project\n\n```bash\nyarn add warthog\n```\n\n### 1. Create a Model\n\nThe model will auto-generate your database table and graphql types. Warthog will find all models that match the following glob - `'/**/*.model.ts'`. So for this file, you would name it `user.model.ts`\n\n```typescript\nimport { BaseModel, Model, StringField } from \"warthog\";\n\n@Model()\nexport class User extends BaseModel {\n  @StringField()\n  name?: string;\n}\n```\n\n### 2. Create a Resolver\n\nThe resolver auto-generates queries and mutations in your GraphQL schema. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. So for this file, you would name it `user.resolver.ts`\n\n```typescript\nimport { User } from \"./user.model\";\nimport { UserService } from \"./user.service\";\n\n@Resolver(User)\nexport class UserResolver {\n  constructor(@Inject(\"UserService\") readonly service: UserService) {}\n\n  @Query(() => [User])\n  async users(\n    @Args() { where, orderBy, limit, offset }: UserWhereArgs\n  ): Promise<User[]> {\n    return this.service.find<UserWhereInput>(where, orderBy, limit, offset);\n  }\n\n  @Mutation(() => User)\n  async createUser(\n    @Arg(\"data\") data: UserCreateInput,\n    @Ctx() ctx: BaseContext\n  ): Promise<User> {\n    return this.service.create(data, ctx.user.id);\n  }\n}\n```\n\n### 3. Create a Service\n\n```typescript\nimport { User } from \"./user.model\";\n\n@Service(\"UserService\")\nexport class UserService extends BaseService<User> {\n  constructor(\n    @InjectRepository(User) protected readonly repository: Repository<User>\n  ) {\n    super(User, repository);\n  }\n}\n```\n\n### 4. Add config to .env file\n\n```env\nWARTHOG_APP_HOST=localhost\nWARTHOG_APP_PORT=4100\nWARTHOG_DB_DATABASE=warthog\nWARTHOG_DB_USERNAME=postgres\nWARTHOG_DB_PASSWORD=\n```\n\n### 5. Run your server\n\n```typescript\nimport \"reflect-metadata\";\nimport { Server } from \"warthog\";\n\nasync function bootstrap() {\n  const server = new Server();\n  return server.start();\n}\n\nbootstrap();\n```\n\nWhen you start your server, there will be a new `generated` folder that has your GraphQL schema in `schema.graphql`. This contains:\n\n```graphql\ntype User implements BaseGraphQLObject {\n  id: String!\n  createdAt: DateTime!\n  createdById: String!\n  updatedAt: DateTime\n  updatedById: String\n  deletedAt: DateTime\n  deletedById: String\n  version: Int!\n  name: String!\n}\n\ntype Mutation {\n  createUser(data: UserCreateInput!): User!\n}\n\ntype Query {\n  users(\n    offset: Int\n    limit: Int = 50\n    where: UserWhereInput\n    orderBy: UserOrderByInput\n  ): [User!]!\n}\n\ninput UserCreateInput {\n  name: String!\n}\n\nenum UserOrderByInput {\n  createdAt_ASC\n  createdAt_DESC\n  updatedAt_ASC\n  updatedAt_DESC\n  deletedAt_ASC\n  deletedAt_DESC\n  name_ASC\n  name_DESC\n}\n\ninput UserUpdateInput {\n  name: String\n}\n\ninput UserWhereInput {\n  id_eq: String\n  id_in: [String!]\n  createdAt_eq: String\n  createdAt_lt: String\n  createdAt_lte: String\n  createdAt_gt: String\n  createdAt_gte: String\n  createdById_eq: String\n  updatedAt_eq: String\n  updatedAt_lt: String\n  updatedAt_lte: String\n  updatedAt_gt: String\n  updatedAt_gte: String\n  updatedById_eq: String\n  deletedAt_all: Boolean\n  deletedAt_eq: String\n  deletedAt_lt: String\n  deletedAt_lte: String\n  deletedAt_gt: String\n  deletedAt_gte: String\n  deletedById_eq: String\n  name_eq: String\n  name_contains: String\n  name_startsWith: String\n  name_endsWith: String\n  name_in: [String!]\n}\n\ninput UserWhereUniqueInput {\n  id: String!\n}\n\n# ...\n```\n\nNotice how we've only added a single field on the model and you get pagination, filtering and tracking of who created, updated and deleted records automatically.\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => object`                                                     | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                     | value                                       | default                     |\n| ---------------------------- | ------------------------------------------- | --------------------------- |\n| WARTHOG_APP_HOST             | App server host                             | _none_                      |\n| WARTHOG_APP_PORT             | App server port                             | 4000                        |\n| WARTHOG_APP_PROTOCOL         | App server protocol                         | http                        |\n| WARTHOG_AUTO_GENERATE_FILES  | Auto-generate files                         | false (true in development) |\n| WARTHOG_AUTO_OPEN_PLAYGROUND | Open playground on server start             | false (true in development) |\n| WARTHOG_CLI_GENERATE_PATH    | Where should CLI generate files             | ./src                       |\n| WARTHOG_DB_CONNECTION        | DB connection type                          | postgres                    |\n| WARTHOG_DB_DATABASE          | DB name                                     | _none_                      |\n| WARTHOG_DB_ENTITIES          | Where should warthog look for models        | src\\/\\*\\*\\/\\*.model.ts      |\n| WARTHOG_DB_MIGRATIONS        | What DB migrations should TypeORM run       | db/migrations/\\*\\*\\/\\*.ts   |\n| WARTHOG_DB_MIGRATIONS_DIR    | Where should generated migrations be placed | db/migrations               |\n| WARTHOG_DB_PORT              | DB port                                     | 5432                        |\n| WARTHOG_DB_USERNAME          | DB username                                 | _none_                      |\n| WARTHOG_DB_LOGGER            | TypeORM logger                              | advanced-console            |\n| WARTHOG_DB_PASSWORD          | DB password                                 | _none_                      |\n| WARTHOG_DB_SYNCHRONIZE       | DB automatically migrated                   | false                       |\n| WARTHOG_GENERATED_FOLDER     | Where should generated code be placed       | ./generated                 |\n| WARTHOG_INTROSPECTION        | Allow server to be introspected             | true                        |\n| WARTHOG_MOCK_DATABASE        | Should we use mock sqlite DB?               | false                       |\n| WARTHOG_RESOLVERS_PATH       | Where should Warthog look for resolvers     | src/\\*\\*\\/\\*.resolver.ts    |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Complex use cases/ejecting\n\nWarthog makes building simple CRUD endpoints incredibly easy. However, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well.\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should just use [the TypeORM decorators](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md)\n\n### API-only\n\nIf you need to add a field that is only exposed via the API that is not DB-backed, you should just use [the TypeGraphQL Field Decorator](https://github.com/19majkel94/type-graphql/blob/master/src/decorators/Field.ts)\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n","readmeFilename":"README.md","_id":"warthog@2.0.0-beta.7","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-BlK6HvKMj2njXZW7Py9Jj+fSyEFG4kaDtbgoo5nO8DTB793+6if/Pa/0zZ3IQzReHapue7kFHDt5BuXsys4Drw==","shasum":"f9bdb65045b53db17eb4f84b48b1964c177f8db2","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.0.0-beta.7.tgz","fileCount":277,"unpackedSize":530041,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd1et4CRA9TVsSAnZWagAAJAMP/A2d/9duGsLLtcBDuil8\nfy2r+AoQXa0mnxAVwG/RmOQyRTQR2S/3sSGIsmyoy5HRzff8WPiN5lOa59A5\n+SmrdXPR+FBLQHGDuEqW6oi5ccvdQDO/OxxJ1/ntYSW7+B1/9f9k/o3+7rjO\n+Pk8zxlPfW/hjI4OKkb1S81FfsNPMsIcBvW7yIjL3v9Mwi63FEeerb6AoYR0\n562Wrds6hzP92thbKwYZgp1dSTA4FAV5HquSlvLumJzq9BZlwBvwKyIT+RPV\nxKuD2SPN8YKOMVupgg19AkUpPix0/3cWij8LfPlmVnXZyj+RmmQ6Iv+LjGUg\n7D6Kce3jrF4cuWim/k4cnARN4+cqxKmRbmuQiYpEDfWfL4KAxE27P/Un+luw\nASBtLDKVrcITrcSTUpQO2ZDg+DguUiM+jRPQ2LLTnj2ToE1pXbmMKBDctXuO\nmxbe42x8xEOwu80K8ZqStZDZqMqv5V8whBzm/iVxuk3WjunsDERcc+XCvslw\nPj8pfIKObyh8BZNaICryMduWXJPXvmfbd6HBOMDC7A7gHUQwvcKuuEJi5yLC\n9+ap9xyJc2JgF4QZ8u1rBB7XNXxTH3844puFmEECVGyh++RFwiKOqydIw5aM\nokzPGbvV4wtv0lqPpcEVK0dbMpi94YHz6vc/DCCVAMaVrWnlKH7wVksdjI3M\n8n02\r\n=n6Y0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB5BAmNrhrn2jEwSib5C2IV/RzrgB3wL4YrjMh/+Oe7aAiEAlrucTfo61GCl0jFMo+qf9Ob2afo0qiex6e53PBwCp8M="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.0.0-beta.7_1574300535576_0.13008885850788166"},"_hasShrinkwrap":false},"1.49.0":{"name":"warthog","version":"1.49.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.2.0","@typescript-eslint/parser":"^2.2.0","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"ignore":["**/generated/*"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"4c7b81835bed0cfeaa905605d0373dd0eaac3f82","_id":"warthog@1.49.0","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-NarTzVh6xXiOB23OKpKYP++Q6SjYWnrEa7DkR+5opy4haz4Cu8dCXrU5DkCEFIPXttVhytrLYaa3bfR4241dww==","shasum":"e41c5ece1b43386e8ec4dd539761e3553093b3b6","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.49.0.tgz","fileCount":292,"unpackedSize":560269,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd1hlpCRA9TVsSAnZWagAAmbYP/iowogxoXGKVzyLRkK3D\nt4QyblZt/PsNUY9LSJ0ex5K2VfP5L5ylfTVTylbtQPriqSagjjrSixYMgkPx\nQ9o8Nb4G2RH7Hus6391rf0mMmrGxPWtxoNnL12vyiXkBf2kUM4VGW6UjAktE\n9My2p7bbm0opSqV7CVPKgwXXsSLpkEeMz1hddLmKN4LIPtKrdsRtV57Fz0wy\njiyT0IxNYojCMWFjbDGy+lkaHQ7TB87jU2oruNB6v+no/7o/wXMIQDBf7ApR\n+mZ2Av3CMov8eXSyoH5dRTtSKPOeNmthBo4uoFOuzY/KCO1gMKkyJRtqSVqO\njs543XGjtwTF9vMke67eFMHT6/SKvzn9dINnX4PrxuH2PmfH2YiR+j9AgdfE\nhDp66aBCs7ObA9jTbLF6GsrqF/x0BkUnVqvA8nfHo0vrv8zQC9k/oAUbV33K\ngFCIMR1h1SHHlPKWBGbDqY9EmZihA4G0BrVpFCJ05zbxFR7vl/8S0KOOnnd/\n8z472v6Hi2UdudLhGnhQTqg64BhAhlEinwxzRPgC3MmyyKF7Ppc1XxRwZr9r\nQ1a/ImJPVnDV/4tclab8drlHbXTBsnmeI1NkB3jG0qyCo3CprfNbfpP16uI6\nNi9PbSRK/Kkma0u4tFZo7z773AQ2R8V/A53G2lkL3imwEVZzbxRnvFsQU//g\nkk8Z\r\n=YHiK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCE+yPNCQi6LUBLEqo65QhRg6Td2PtoLrHLKjIvv5THBgIhAPQcB3ODUKt58saLr4u9P9Tyx6Qc3X/bA6U3sc9h94TN"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.49.0_1574312296773_0.46177527735630663"},"_hasShrinkwrap":false},"2.0.0-beta.8":{"name":"warthog","version":"2.0.0-beta.8","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nYou must have Postgresql installed to use Warthog. If you already have it installed, you can skip this step, otherwise there are 3 options:\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n### Homebrew\n\nIf you're on OSX and have [Homebrew](https://brew.sh/) installed, you can simply run:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) or use the Google machine to figure out how to install on your OS.\n\n## Usage\n\nThe easiest way to start using Warthog for a fresh project is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. This has a simple example in place to get you started. There are also a bunch of examples in the [examples](./examples/README.md) folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n### Installing in Existing Project\n\n```bash\nyarn add warthog\n```\n\n### 1. Create a Model\n\nThe model will auto-generate your database table and graphql types. Warthog will find all models that match the following glob - `'/**/*.model.ts'`. So for this file, you would name it `user.model.ts`\n\n```typescript\nimport { BaseModel, Model, StringField } from \"warthog\";\n\n@Model()\nexport class User extends BaseModel {\n  @StringField()\n  name?: string;\n}\n```\n\n### 2. Create a Resolver\n\nThe resolver auto-generates queries and mutations in your GraphQL schema. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. So for this file, you would name it `user.resolver.ts`\n\n```typescript\nimport { User } from \"./user.model\";\nimport { UserService } from \"./user.service\";\n\n@Resolver(User)\nexport class UserResolver {\n  constructor(@Inject(\"UserService\") readonly service: UserService) {}\n\n  @Query(() => [User])\n  async users(\n    @Args() { where, orderBy, limit, offset }: UserWhereArgs\n  ): Promise<User[]> {\n    return this.service.find<UserWhereInput>(where, orderBy, limit, offset);\n  }\n\n  @Mutation(() => User)\n  async createUser(\n    @Arg(\"data\") data: UserCreateInput,\n    @Ctx() ctx: BaseContext\n  ): Promise<User> {\n    return this.service.create(data, ctx.user.id);\n  }\n}\n```\n\n### 3. Create a Service\n\n```typescript\nimport { User } from \"./user.model\";\n\n@Service(\"UserService\")\nexport class UserService extends BaseService<User> {\n  constructor(\n    @InjectRepository(User) protected readonly repository: Repository<User>\n  ) {\n    super(User, repository);\n  }\n}\n```\n\n### 4. Add config to .env file\n\n```env\nWARTHOG_APP_HOST=localhost\nWARTHOG_APP_PORT=4100\nWARTHOG_DB_DATABASE=warthog\nWARTHOG_DB_USERNAME=postgres\nWARTHOG_DB_PASSWORD=\n```\n\n### 5. Run your server\n\n```typescript\nimport \"reflect-metadata\";\nimport { Server } from \"warthog\";\n\nasync function bootstrap() {\n  const server = new Server();\n  return server.start();\n}\n\nbootstrap();\n```\n\nWhen you start your server, there will be a new `generated` folder that has your GraphQL schema in `schema.graphql`. This contains:\n\n```graphql\ntype User implements BaseGraphQLObject {\n  id: String!\n  createdAt: DateTime!\n  createdById: String!\n  updatedAt: DateTime\n  updatedById: String\n  deletedAt: DateTime\n  deletedById: String\n  version: Int!\n  name: String!\n}\n\ntype Mutation {\n  createUser(data: UserCreateInput!): User!\n}\n\ntype Query {\n  users(\n    offset: Int\n    limit: Int = 50\n    where: UserWhereInput\n    orderBy: UserOrderByInput\n  ): [User!]!\n}\n\ninput UserCreateInput {\n  name: String!\n}\n\nenum UserOrderByInput {\n  createdAt_ASC\n  createdAt_DESC\n  updatedAt_ASC\n  updatedAt_DESC\n  deletedAt_ASC\n  deletedAt_DESC\n  name_ASC\n  name_DESC\n}\n\ninput UserUpdateInput {\n  name: String\n}\n\ninput UserWhereInput {\n  id_eq: String\n  id_in: [String!]\n  createdAt_eq: String\n  createdAt_lt: String\n  createdAt_lte: String\n  createdAt_gt: String\n  createdAt_gte: String\n  createdById_eq: String\n  updatedAt_eq: String\n  updatedAt_lt: String\n  updatedAt_lte: String\n  updatedAt_gt: String\n  updatedAt_gte: String\n  updatedById_eq: String\n  deletedAt_all: Boolean\n  deletedAt_eq: String\n  deletedAt_lt: String\n  deletedAt_lte: String\n  deletedAt_gt: String\n  deletedAt_gte: String\n  deletedById_eq: String\n  name_eq: String\n  name_contains: String\n  name_startsWith: String\n  name_endsWith: String\n  name_in: [String!]\n}\n\ninput UserWhereUniqueInput {\n  id: String!\n}\n\n# ...\n```\n\nNotice how we've only added a single field on the model and you get pagination, filtering and tracking of who created, updated and deleted records automatically.\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => object`                                                     | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                     | value                                       | default                     |\n| ---------------------------- | ------------------------------------------- | --------------------------- |\n| WARTHOG_APP_HOST             | App server host                             | _none_                      |\n| WARTHOG_APP_PORT             | App server port                             | 4000                        |\n| WARTHOG_APP_PROTOCOL         | App server protocol                         | http                        |\n| WARTHOG_AUTO_GENERATE_FILES  | Auto-generate files                         | false (true in development) |\n| WARTHOG_AUTO_OPEN_PLAYGROUND | Open playground on server start             | false (true in development) |\n| WARTHOG_CLI_GENERATE_PATH    | Where should CLI generate files             | ./src                       |\n| WARTHOG_DB_CONNECTION        | DB connection type                          | postgres                    |\n| WARTHOG_DB_DATABASE          | DB name                                     | _none_                      |\n| WARTHOG_DB_ENTITIES          | Where should warthog look for models        | src\\/\\*\\*\\/\\*.model.ts      |\n| WARTHOG_DB_MIGRATIONS        | What DB migrations should TypeORM run       | db/migrations/\\*\\*\\/\\*.ts   |\n| WARTHOG_DB_MIGRATIONS_DIR    | Where should generated migrations be placed | db/migrations               |\n| WARTHOG_DB_PORT              | DB port                                     | 5432                        |\n| WARTHOG_DB_USERNAME          | DB username                                 | _none_                      |\n| WARTHOG_DB_LOGGER            | TypeORM logger                              | advanced-console            |\n| WARTHOG_DB_PASSWORD          | DB password                                 | _none_                      |\n| WARTHOG_DB_SYNCHRONIZE       | DB automatically migrated                   | false                       |\n| WARTHOG_GENERATED_FOLDER     | Where should generated code be placed       | ./generated                 |\n| WARTHOG_INTROSPECTION        | Allow server to be introspected             | true                        |\n| WARTHOG_MOCK_DATABASE        | Should we use mock sqlite DB?               | false                       |\n| WARTHOG_RESOLVERS_PATH       | Where should Warthog look for resolvers     | src/\\*\\*\\/\\*.resolver.ts    |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Complex use cases/ejecting\n\nWarthog makes building simple CRUD endpoints incredibly easy. However, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well.\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should just use [the TypeORM decorators](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md)\n\n### API-only\n\nIf you need to add a field that is only exposed via the API that is not DB-backed, you should just use [the TypeGraphQL Field Decorator](https://github.com/19majkel94/type-graphql/blob/master/src/decorators/Field.ts)\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n","readmeFilename":"README.md","gitHead":"003ad9ec0fbd28a2cce2e2c41de65f73fe7149cc","_id":"warthog@2.0.0-beta.8","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-83wFUeJASrHNZmujiT2sTqX7kCZJ2eAs0BVlNyquZrTomcyPxvrqHtGC1T8eDKA0VM5TBO8nU1St4NY6A27DcA==","shasum":"1877f827d890f590df5b1107d60ecb4a050069be","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.0.0-beta.8.tgz","fileCount":292,"unpackedSize":557997,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd1h5SCRA9TVsSAnZWagAAV88QAJsYXaOupnz0af9/hBrI\nGy3LKRFqi0LSy5p0zLV8CGpFOgVWdQ5dNjkR9HH/SF598QIFNmml1h4QygGs\nLSU9mpZboOvJi/aVreplvpbUFXm7J5TGsdR95egV1ovYmdA+D2fKfwj8nTRQ\ne5Tuhdu67oxVXAC+XqMJmbADZ5VRufqt9ie/ITgNZ9BmbYT+epj6XP2KYc9x\nbm9wanLR+j1qYBnO/9lfNU+8X1/QTCpyTsFVpNnVhj4C89k8qIxpwNENTwfc\nJaVdgzhEN8Yb15Vma5i/s0Lu/NbfaKuVRpFTbGaAs9Qj6ijzT5WyZYMNjWUi\nmSB5JbzGbFrVQuC4P+yB+MFeU17W9cXdbKXZ9Wz28kuDWq47HP9094OxC+6Z\no77bRhA5kvwSQ04/Xf0bm9nT1kf3l06yGdjQYmq6x3TTsgHgg7LOBVyTXopB\ni7JCS+rnAssI9c4db4eMBBjr5V6Wuv8l2z9Sn3+2tab9W76oCFg44oB3gLu9\nQyyAOhldQXfgN8yTWe0iKTdZ90ErlpSnzVrw49QmE+H/7GzxI0gj5ebw5Tat\nRkXJl7XEeJyGxtSc7KFu09M5XBrmUKqcq2otUGj4z0HlG7Wmv0HM/IBUQ/76\nxGihXkB/NWz0qyFIUBFpiUlTPifTyIarXS2tEPKPGOZquUeWQaISzOVTsEQ6\njNFE\r\n=rjl0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC3WHuiIFl44u6yMaE10O2uiuv8tVewVy1JFmsAPxspqwIhALtngU6X6BURX3bjoKZ2KChOvNckCsRIc02iFW4H4wTY"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.0.0-beta.8_1574313554379_0.37382852164450386"},"_hasShrinkwrap":false},"2.0.0-beta.9":{"name":"warthog","version":"2.0.0-beta.9","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nYou must have Postgresql installed to use Warthog. If you already have it installed, you can skip this step, otherwise there are 3 options:\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n### Homebrew\n\nIf you're on OSX and have [Homebrew](https://brew.sh/) installed, you can simply run:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) or use the Google machine to figure out how to install on your OS.\n\n## Usage\n\nThe easiest way to start using Warthog for a fresh project is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. This has a simple example in place to get you started. There are also a bunch of examples in the [examples](./examples/README.md) folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n### Installing in Existing Project\n\n```bash\nyarn add warthog\n```\n\n### 1. Create a Model\n\nThe model will auto-generate your database table and graphql types. Warthog will find all models that match the following glob - `'/**/*.model.ts'`. So for this file, you would name it `user.model.ts`\n\n```typescript\nimport { BaseModel, Model, StringField } from \"warthog\";\n\n@Model()\nexport class User extends BaseModel {\n  @StringField()\n  name?: string;\n}\n```\n\n### 2. Create a Resolver\n\nThe resolver auto-generates queries and mutations in your GraphQL schema. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. So for this file, you would name it `user.resolver.ts`\n\n```typescript\nimport { User } from \"./user.model\";\nimport { UserService } from \"./user.service\";\n\n@Resolver(User)\nexport class UserResolver {\n  constructor(@Inject(\"UserService\") readonly service: UserService) {}\n\n  @Query(() => [User])\n  async users(\n    @Args() { where, orderBy, limit, offset }: UserWhereArgs\n  ): Promise<User[]> {\n    return this.service.find<UserWhereInput>(where, orderBy, limit, offset);\n  }\n\n  @Mutation(() => User)\n  async createUser(\n    @Arg(\"data\") data: UserCreateInput,\n    @Ctx() ctx: BaseContext\n  ): Promise<User> {\n    return this.service.create(data, ctx.user.id);\n  }\n}\n```\n\n### 3. Create a Service\n\n```typescript\nimport { User } from \"./user.model\";\n\n@Service(\"UserService\")\nexport class UserService extends BaseService<User> {\n  constructor(\n    @InjectRepository(User) protected readonly repository: Repository<User>\n  ) {\n    super(User, repository);\n  }\n}\n```\n\n### 4. Add config to .env file\n\n```env\nWARTHOG_APP_HOST=localhost\nWARTHOG_APP_PORT=4100\nWARTHOG_DB_DATABASE=warthog\nWARTHOG_DB_USERNAME=postgres\nWARTHOG_DB_PASSWORD=\n```\n\n### 5. Run your server\n\n```typescript\nimport \"reflect-metadata\";\nimport { Server } from \"warthog\";\n\nasync function bootstrap() {\n  const server = new Server();\n  return server.start();\n}\n\nbootstrap();\n```\n\nWhen you start your server, there will be a new `generated` folder that has your GraphQL schema in `schema.graphql`. This contains:\n\n```graphql\ntype User implements BaseGraphQLObject {\n  id: String!\n  createdAt: DateTime!\n  createdById: String!\n  updatedAt: DateTime\n  updatedById: String\n  deletedAt: DateTime\n  deletedById: String\n  version: Int!\n  name: String!\n}\n\ntype Mutation {\n  createUser(data: UserCreateInput!): User!\n}\n\ntype Query {\n  users(\n    offset: Int\n    limit: Int = 50\n    where: UserWhereInput\n    orderBy: UserOrderByInput\n  ): [User!]!\n}\n\ninput UserCreateInput {\n  name: String!\n}\n\nenum UserOrderByInput {\n  createdAt_ASC\n  createdAt_DESC\n  updatedAt_ASC\n  updatedAt_DESC\n  deletedAt_ASC\n  deletedAt_DESC\n  name_ASC\n  name_DESC\n}\n\ninput UserUpdateInput {\n  name: String\n}\n\ninput UserWhereInput {\n  id_eq: String\n  id_in: [String!]\n  createdAt_eq: String\n  createdAt_lt: String\n  createdAt_lte: String\n  createdAt_gt: String\n  createdAt_gte: String\n  createdById_eq: String\n  updatedAt_eq: String\n  updatedAt_lt: String\n  updatedAt_lte: String\n  updatedAt_gt: String\n  updatedAt_gte: String\n  updatedById_eq: String\n  deletedAt_all: Boolean\n  deletedAt_eq: String\n  deletedAt_lt: String\n  deletedAt_lte: String\n  deletedAt_gt: String\n  deletedAt_gte: String\n  deletedById_eq: String\n  name_eq: String\n  name_contains: String\n  name_startsWith: String\n  name_endsWith: String\n  name_in: [String!]\n}\n\ninput UserWhereUniqueInput {\n  id: String!\n}\n\n# ...\n```\n\nNotice how we've only added a single field on the model and you get pagination, filtering and tracking of who created, updated and deleted records automatically.\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => object`                                                     | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                     | value                                       | default                     |\n| ---------------------------- | ------------------------------------------- | --------------------------- |\n| WARTHOG_APP_HOST             | App server host                             | _none_                      |\n| WARTHOG_APP_PORT             | App server port                             | 4000                        |\n| WARTHOG_APP_PROTOCOL         | App server protocol                         | http                        |\n| WARTHOG_AUTO_GENERATE_FILES  | Auto-generate files                         | false (true in development) |\n| WARTHOG_AUTO_OPEN_PLAYGROUND | Open playground on server start             | false (true in development) |\n| WARTHOG_CLI_GENERATE_PATH    | Where should CLI generate files             | ./src                       |\n| WARTHOG_DB_CONNECTION        | DB connection type                          | postgres                    |\n| WARTHOG_DB_DATABASE          | DB name                                     | _none_                      |\n| WARTHOG_DB_ENTITIES          | Where should warthog look for models        | src\\/\\*\\*\\/\\*.model.ts      |\n| WARTHOG_DB_MIGRATIONS        | What DB migrations should TypeORM run       | db/migrations/\\*\\*\\/\\*.ts   |\n| WARTHOG_DB_MIGRATIONS_DIR    | Where should generated migrations be placed | db/migrations               |\n| WARTHOG_DB_PORT              | DB port                                     | 5432                        |\n| WARTHOG_DB_USERNAME          | DB username                                 | _none_                      |\n| WARTHOG_DB_LOGGER            | TypeORM logger                              | advanced-console            |\n| WARTHOG_DB_PASSWORD          | DB password                                 | _none_                      |\n| WARTHOG_DB_SYNCHRONIZE       | DB automatically migrated                   | false                       |\n| WARTHOG_GENERATED_FOLDER     | Where should generated code be placed       | ./generated                 |\n| WARTHOG_INTROSPECTION        | Allow server to be introspected             | true                        |\n| WARTHOG_MOCK_DATABASE        | Should we use mock sqlite DB?               | false                       |\n| WARTHOG_RESOLVERS_PATH       | Where should Warthog look for resolvers     | src/\\*\\*\\/\\*.resolver.ts    |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Complex use cases/ejecting\n\nWarthog makes building simple CRUD endpoints incredibly easy. However, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well.\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should just use [the TypeORM decorators](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md)\n\n### API-only\n\nIf you need to add a field that is only exposed via the API that is not DB-backed, you should just use [the TypeGraphQL Field Decorator](https://github.com/19majkel94/type-graphql/blob/master/src/decorators/Field.ts)\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n","readmeFilename":"README.md","gitHead":"66a92b5365f37261139ee7081a50b4786f31b0ee","_id":"warthog@2.0.0-beta.9","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-uD+JpLH3B3fKKI5PrnEYEVRLjgwORHBNReuTmN76j2q/Tn6qe7Ky4K7Uxs8SOSOPiYiZpxTTAn4BEY3OM3fZlg==","shasum":"2e626979002e9bbd8541e5bce40d68e261b98fa1","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.0.0-beta.9.tgz","fileCount":292,"unpackedSize":558480,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd1wjbCRA9TVsSAnZWagAAwoMP/RXSiyvHDsGBKnsPlanp\nL4rurkcHyCAT2/6NEIHu+BcBXXamqKbAUaiIW1yoBqw7UcfGkLY24nm7xWPH\nOiKtfyj3KA4UijNv4Hm13+IG4Jk/1L3B3am98xTLGBI/IFzeq24ML1IyClJM\nqz1BTm56z3aD+6LvCLokVvG7ilyzATRXzwGDbmy/UUwEq1mgR1QTeZP1YV/6\n6wseqKPQWI++0oYMB5n5gzq/vS/sCayDaiTS0OswAuiNtgI17vNGt9kSnETQ\nZrU9HNAN1fbik+/gU2JW7dW4XHulM2WSHjSUJi0XycnXcOGSjdYkXNp37IAD\n9SYbXENNEfMqbAGmMtsrw0ev+jyy0h3mVQb/gxmruaBi2O5tHpBKg0v+qSNX\nqObORKVGaKCXDCF8ThGz/aP2y2b18wHxzz9V0ip43GiitmkTFqLhIRPRg2Fe\no6N1c77hP0j74o4RKRw4o7/142fT1/3gyJwbiRc08+/rz9ke/BqM3Mk283ID\n07cDRXXWkSwNlKx7OcIKHEI4d/LBQOYJb7Sot7j4MeB7uDFKUMqcKEoSryYl\n4sHvz3o9gx8hjmizUB+6BYpSuVMLADKa5/eULiAE15fqfx3hSVSKlEiiLjrw\nlpcZOyppJ4259TCGuK67gxjIz5b15WReZ1SymGPnxeadf1KNEPeAyjaHDnzF\namUH\r\n=pf3M\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGddPDoM4TfgTZPmpm78EmcVg1nh9mVbi2roMV1Pt0qKAiAmTADarMVA6qj7Zh5hjERBOoENmY9mluJDriBrwsIOJg=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.0.0-beta.9_1574373595009_0.6790617349061656"},"_hasShrinkwrap":false},"1.49.1":{"name":"warthog","version":"1.49.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.2.0","@typescript-eslint/parser":"^2.2.0","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"ignore":["**/generated/*"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"939ce9c13eba8bb7f8da0b13c34492ad09161d00","_id":"warthog@1.49.1","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-BWGM5XoIp+SF+A5qHbPlwcy5c1mfbSk//yimpQgmOTtYI3jvKof1A1jDx+7UbXsuswbJ7PrW9s5L8LtdrwPfpw==","shasum":"6a5d15bf5ba99201395ccb30060a7e64bdb24f2b","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.49.1.tgz","fileCount":292,"unpackedSize":563918,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd2N13CRA9TVsSAnZWagAA7qcP/R3GUSB8Uy8vp+/Gl+J4\nWz+WFBVgdK4O3NTqL2WlR11/l2nIo/MbjYvE4HOQdnUjXZHMA5DiX1th9/wp\nimaW7YLXATCDS5EgFNys4QzOtHm0IJ/sttzxQE+VOrK+RklhRubfn1e7Wl0+\nB6+9ziI6Su4qC9B59+p6CA0yaXo1bm/pM/5vyy5moHENJMnLVJwShQ60ZB62\nYGPqSOMpVuU4iUFn8bVFX6KGV+3QCU064uLjEkG3AsjO4r92JMyvxZpet1RZ\nqxOcVqRzyzHCYXDXJwq+qHIqlrVdNl1QfZQzaKHd+Mmuygpyio/phMbObZrm\n4BBCsLQx+fVvHA0VpnNm/dh+Wrqb6YZO3qXCDf8duAgwHukAak03AsUakMyK\nGrb+U6/bFlxzol6zzyuu6jO5d3Iv9VFaIfYXCSoTOC7O6kougYLQdApEbv6H\nEKY2ica1LUpBUBiE5MrjGq7SrWKGSzLF+9z5y27OMdIn8xZw4sagkz9GmZxb\n48Vsem9uaLfSvpn3wV+H8wE/ApQILACLgAvuTvB1XhYZHCrMZ2/yDodj5arl\nC0gYHmE9TlPH8plHDztzINIsGH51DeMpH6Pj+fny2fYADa1YStQg+0gC7sSU\nIx4igNyvotjjfZUTYbG2crbzVV5asZWIePtOVRw5u3tB3Xbc83jmPK1JMl5a\nw2ky\r\n=EvAH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCZaLout8ETQ182dWoTm9qk+7WImj0gWntEmPjXLySSdAIhAO1ihIq+rjNQ6LoMzp3E8wFyeYAehsG1ytdTBz2kvRuH"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.49.1_1574493558514_0.2594302780440867"},"_hasShrinkwrap":false},"1.49.2":{"name":"warthog","version":"1.49.2","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.2.0","@typescript-eslint/parser":"^2.2.0","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"ignore":["**/generated/*"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"8f3adb13683d2967384a511883e0d0d40dbbe420","_id":"warthog@1.49.2","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-Xf8jrqDesccIPEvHjBLRQ8g8ZI6SjPiaE4wIVctFwJS2ChtTpOWPrXkUXrH/jDyoO2wu++GthUpnY83jZUadPA==","shasum":"89cc99abc170556bb4e4e2a17d293f1f4a455c4e","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.49.2.tgz","fileCount":292,"unpackedSize":566099,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd2xArCRA9TVsSAnZWagAA87IP/1TIgqsT94MA+OMYFwbX\neBDsLp9dbojlhP9yL1R0C6lfYtI62ofPOuYPjfQgd+i++Lylby0J4IqiXC/g\nDJvlVV7pJQJE3CYVEzBY3cpn08ceV/93XRbdkz+YuXHpu1Ai0aIwsmZEt8pe\nrB+l2uR78eJqbfhesg/Cp1SbhJiJ6DubC++LEjEj7zitaDBLMqJqf8aHl14m\nLYDdU4xxEY8p6SlK/Q3iPRe6I4SV13dby0kXsVO+Ih3YajaQU0oEdq9nslik\ns7cWyZ0IP7UXmYtIb3nTd2wVSC2ZhpiFUGbhlseLjATJ0qA2ffcIBdXaVLZ4\nqgvb0TjrzKuqxqRRxCTJ7fk2RQBJVS6F4nhjY+z0DGgMt3haY0UagfKw2VBW\nYPGxeKM2j894yxd3jdldxUbOEbH9cxU6WDf9JDYtipvHElvZJITcTM8MX5+A\nvbMzuTuzWElPuoAFzeFG8iiBt13dqVHnXoJp5V22RTOouq/EttIrr43gyCR7\njqr/F7cHFyWcg0e6J65d+kizU0msfgC6oA4unsqlqenZZvVmzTHym0aMd4Ek\ncFhGXSSmuUE26BLJIwTpWK/ttk23AEACgpXqy9/NrcPN9zcRLW+ZNWLFt69D\n+goL8oOCw72Tf/0PBbd9/+02TJIefVdkrSnVqDPVi0meSjP4CVXpD6sl3d2w\nsKht\r\n=Hkwt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC2WgEz7pKPok4C0UbRJmTySJElKYnPZuo2cY94GWDd/QIgZJg5U8K22YoIImxTjlYMG9XggTF1MtH93+JfaKzi7Qk="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.49.2_1574637611222_0.8516532775172323"},"_hasShrinkwrap":false},"1.49.3":{"name":"warthog","version":"1.49.3","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.2.0","@typescript-eslint/parser":"^2.2.0","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"ignore":["**/generated/*"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"81e2accc9c6730947b4f91dd5845cdd9f492784d","_id":"warthog@1.49.3","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-ftlnCuHNPTXjsYcGSNuQuArtaI6CCWTQ2G+1CQwSv4Fku62IoHMwv/sEKdvtyaSdRhPL33n8GVa69z4O7DnNsw==","shasum":"4e45a40ccd0611782bdea154e0f37b7b814522e2","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.49.3.tgz","fileCount":292,"unpackedSize":567958,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd22jaCRA9TVsSAnZWagAAtIkP/2g1KZ/l4wovu20ZzR1h\n9jbOYMs1O6SLJEtcEoIcEoAAZ/37M2Kv670gMoRNSque8NjT/bQIgBMp7LWR\nZL/1GxbuBk/lBi63hUfPtduV4D64i6AEgBy/InoEGxTt1MHP5dEYTWNm3pKv\nwsCASKt42FNRu/Omg/3srtvMOKBNIDQ9whVvMN1xKd+RCExnrcwPRiKqwibI\nGlpSQ4RONP/KMPPkyRYuO8kbopsokiXkwXCEkChhU+T89qhEEUfu10UTeJmx\njzDfTtbWqvUBp2HROy1MQlCyLhCvx1Y49y4BbUIH/+7V0dQAKG7z8NOH97O2\nldNtr217HipISd3Yy+9fSwbyDogrh82WWo2lSm/L3qPk3iV/UkpBH17cMpqk\nHqIeewvr7mkYxGJcItoPirBLQxW3QzD5j41q85QIMQBiVgsiufK5o1RhnEHG\noDfNsT9IEloIUuPpKw4Bmti8TqXHz2SbTcCBcah+bgSo64ozULUV9eVgNkhp\npYIsd2E817FbnwfZQk3EgMWbpaubi7xR7VrZ9JvbSYrQmbfXLZdV4O03OanU\nlkntAflZvTtb7yTqWgA2RFHvzKPb/H95GaJ6PC+FutB70TV2XjuCnoNZLXV6\n1Gn34P1Gd4HNfHmv7wjBKHfEoix8dg5yuV0XgrdM67ji6StnhTDzEVUfT452\n+AQV\r\n=RP8X\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDpvkp/tYjp99qhAgkAsnWopAP6/qA6l9UWYOMSTozFAAiEArAXPlltJIbp+b2Om6A8W+3lmQojFxtAOytloGynBQN8="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.49.3_1574660314139_0.5630638638968988"},"_hasShrinkwrap":false},"1.49.4":{"name":"warthog","version":"1.49.4","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.2.0","@typescript-eslint/parser":"^2.2.0","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"ignore":["**/generated/*"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"f11c724d5655c93b9bbb483a966e98f228e0ac76","_id":"warthog@1.49.4","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-XBRZfYh1N4QsraUesi0PhxOTkMyqQV4+/OYH6VReoRqlwGsZ/DWf9QEjbRuMaajz8AXRuM7FwiYSl1VnZ8ouww==","shasum":"7d3a62860cd758150c55d2cf79147a95a82a4b92","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.49.4.tgz","fileCount":292,"unpackedSize":568098,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd22mHCRA9TVsSAnZWagAATWMP/AlCYP+sWJ/wb7aLiJIX\nIPQ4myxNWq4ouKoaf214Ht2SQLvMhJux1HCFvlyCEUzdx9oYAR4k+C+CWNdj\nQ7MH1R5oVh1rsfQeclNl0/zRj7iTu4TCc7F7+wSqFJzrxhff+sTeplMChPlY\nI8dehpS3az+MKRS6jnRMqa31r4BcTCuWApfkL4EYqXKNlnlirmUFRitS6QLh\nenFuIKURgJZGPUmoaq2cUvAlDGRTMQVH9bNA+yXtp27AnmGj3BQbsZj/Qm+6\ntDLMhYgTvQ0VSKzwQftAA2WX/wV8xdpfRpTUbKPwrM/tJ6tRMlOZjorgCEMc\nnN1/Oc7LSsQo45tqoAazJZbCBGJCY0H755xMAPKbGoS7qL52zyyNn1WgWkcD\nWiLKeMjzFqhwlLLOzzauNxCug/vP6/HvMYnoCyBCZm+f/Mv0FGbVrxMHjcg4\nqJk9Jb7MapQd0rEcD4N49v+iOQGc3pzOJjSay37m38+j/Na6JbRcBJkRV/o0\nHPUQnwJczw4Kf4M9OrY92CSYymYKDePwQA6VOJy3ROLwqQAy+HH0+XLS3nUG\nC4Pw2qJNItRI13rDQHvVEAsG5uMwjZRaJvzDk5kWopSfe+cZq+tRD8NwDM7i\ng3NbpfCarj7W3ccU4fEluWqQT5buJsOl0s0OhevfKhM6V5apJH8vHu98gaGr\ny6NB\r\n=qSTs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBRydg/R8ZUYAZJqy4F3edmqZ98H370t4JyByncyZXIOAiEA6w6bTPVy41SYWi0HWFT09HuudX4qCioJ/1d9rEoT578="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.49.4_1574660486615_0.6731166143620615"},"_hasShrinkwrap":false},"2.0.0-beta.10":{"name":"warthog","version":"2.0.0-beta.10","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nYou must have Postgresql installed to use Warthog. If you already have it installed, you can skip this step, otherwise there are 3 options:\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n### Homebrew\n\nIf you're on OSX and have [Homebrew](https://brew.sh/) installed, you can simply run:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) or use the Google machine to figure out how to install on your OS.\n\n## Usage\n\nThe easiest way to start using Warthog for a fresh project is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. This has a simple example in place to get you started. There are also a bunch of examples in the [examples](./examples/README.md) folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n### Installing in Existing Project\n\n```bash\nyarn add warthog\n```\n\n### 1. Create a Model\n\nThe model will auto-generate your database table and graphql types. Warthog will find all models that match the following glob - `'/**/*.model.ts'`. So for this file, you would name it `user.model.ts`\n\n```typescript\nimport { BaseModel, Model, StringField } from \"warthog\";\n\n@Model()\nexport class User extends BaseModel {\n  @StringField()\n  name?: string;\n}\n```\n\n### 2. Create a Resolver\n\nThe resolver auto-generates queries and mutations in your GraphQL schema. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. So for this file, you would name it `user.resolver.ts`\n\n```typescript\nimport { User } from \"./user.model\";\nimport { UserService } from \"./user.service\";\n\n@Resolver(User)\nexport class UserResolver {\n  constructor(@Inject(\"UserService\") readonly service: UserService) {}\n\n  @Query(() => [User])\n  async users(\n    @Args() { where, orderBy, limit, offset }: UserWhereArgs\n  ): Promise<User[]> {\n    return this.service.find<UserWhereInput>(where, orderBy, limit, offset);\n  }\n\n  @Mutation(() => User)\n  async createUser(\n    @Arg(\"data\") data: UserCreateInput,\n    @Ctx() ctx: BaseContext\n  ): Promise<User> {\n    return this.service.create(data, ctx.user.id);\n  }\n}\n```\n\n### 3. Create a Service\n\n```typescript\nimport { User } from \"./user.model\";\n\n@Service(\"UserService\")\nexport class UserService extends BaseService<User> {\n  constructor(\n    @InjectRepository(User) protected readonly repository: Repository<User>\n  ) {\n    super(User, repository);\n  }\n}\n```\n\n### 4. Add config to .env file\n\n```env\nWARTHOG_APP_HOST=localhost\nWARTHOG_APP_PORT=4100\nWARTHOG_DB_DATABASE=warthog\nWARTHOG_DB_USERNAME=postgres\nWARTHOG_DB_PASSWORD=\n```\n\n### 5. Run your server\n\n```typescript\nimport \"reflect-metadata\";\nimport { Server } from \"warthog\";\n\nasync function bootstrap() {\n  const server = new Server();\n  return server.start();\n}\n\nbootstrap();\n```\n\nWhen you start your server, there will be a new `generated` folder that has your GraphQL schema in `schema.graphql`. This contains:\n\n```graphql\ntype User implements BaseGraphQLObject {\n  id: String!\n  createdAt: DateTime!\n  createdById: String!\n  updatedAt: DateTime\n  updatedById: String\n  deletedAt: DateTime\n  deletedById: String\n  version: Int!\n  name: String!\n}\n\ntype Mutation {\n  createUser(data: UserCreateInput!): User!\n}\n\ntype Query {\n  users(\n    offset: Int\n    limit: Int = 50\n    where: UserWhereInput\n    orderBy: UserOrderByInput\n  ): [User!]!\n}\n\ninput UserCreateInput {\n  name: String!\n}\n\nenum UserOrderByInput {\n  createdAt_ASC\n  createdAt_DESC\n  updatedAt_ASC\n  updatedAt_DESC\n  deletedAt_ASC\n  deletedAt_DESC\n  name_ASC\n  name_DESC\n}\n\ninput UserUpdateInput {\n  name: String\n}\n\ninput UserWhereInput {\n  id_eq: String\n  id_in: [String!]\n  createdAt_eq: String\n  createdAt_lt: String\n  createdAt_lte: String\n  createdAt_gt: String\n  createdAt_gte: String\n  createdById_eq: String\n  updatedAt_eq: String\n  updatedAt_lt: String\n  updatedAt_lte: String\n  updatedAt_gt: String\n  updatedAt_gte: String\n  updatedById_eq: String\n  deletedAt_all: Boolean\n  deletedAt_eq: String\n  deletedAt_lt: String\n  deletedAt_lte: String\n  deletedAt_gt: String\n  deletedAt_gte: String\n  deletedById_eq: String\n  name_eq: String\n  name_contains: String\n  name_startsWith: String\n  name_endsWith: String\n  name_in: [String!]\n}\n\ninput UserWhereUniqueInput {\n  id: String!\n}\n\n# ...\n```\n\nNotice how we've only added a single field on the model and you get pagination, filtering and tracking of who created, updated and deleted records automatically.\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => object`                                                     | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                     | value                                       | default                     |\n| ---------------------------- | ------------------------------------------- | --------------------------- |\n| WARTHOG_APP_HOST             | App server host                             | _none_                      |\n| WARTHOG_APP_PORT             | App server port                             | 4000                        |\n| WARTHOG_APP_PROTOCOL         | App server protocol                         | http                        |\n| WARTHOG_AUTO_GENERATE_FILES  | Auto-generate files                         | false (true in development) |\n| WARTHOG_AUTO_OPEN_PLAYGROUND | Open playground on server start             | false (true in development) |\n| WARTHOG_CLI_GENERATE_PATH    | Where should CLI generate files             | ./src                       |\n| WARTHOG_DB_CONNECTION        | DB connection type                          | postgres                    |\n| WARTHOG_DB_DATABASE          | DB name                                     | _none_                      |\n| WARTHOG_DB_ENTITIES          | Where should warthog look for models        | src\\/\\*\\*\\/\\*.model.ts      |\n| WARTHOG_DB_MIGRATIONS        | What DB migrations should TypeORM run       | db/migrations/\\*\\*\\/\\*.ts   |\n| WARTHOG_DB_MIGRATIONS_DIR    | Where should generated migrations be placed | db/migrations               |\n| WARTHOG_DB_PORT              | DB port                                     | 5432                        |\n| WARTHOG_DB_USERNAME          | DB username                                 | _none_                      |\n| WARTHOG_DB_LOGGER            | TypeORM logger                              | advanced-console            |\n| WARTHOG_DB_PASSWORD          | DB password                                 | _none_                      |\n| WARTHOG_DB_SYNCHRONIZE       | DB automatically migrated                   | false                       |\n| WARTHOG_GENERATED_FOLDER     | Where should generated code be placed       | ./generated                 |\n| WARTHOG_INTROSPECTION        | Allow server to be introspected             | true                        |\n| WARTHOG_MOCK_DATABASE        | Should we use mock sqlite DB?               | false                       |\n| WARTHOG_RESOLVERS_PATH       | Where should Warthog look for resolvers     | src/\\*\\*\\/\\*.resolver.ts    |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Complex use cases/ejecting\n\nWarthog makes building simple CRUD endpoints incredibly easy. However, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well.\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should just use [the TypeORM decorators](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md)\n\n### API-only\n\nIf you need to add a field that is only exposed via the API that is not DB-backed, you should just use [the TypeGraphQL Field Decorator](https://github.com/19majkel94/type-graphql/blob/master/src/decorators/Field.ts)\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n","readmeFilename":"README.md","gitHead":"0ce6815df996c06a7ea8c86327b7c95a1f7154a7","_id":"warthog@2.0.0-beta.10","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-ZHqA4obmB75I0jVbiDorY/7q6CnLBR2HuCyFznmmhtCm4oP7jck0WRArUSpLpHJrI9Szvzh9jjH6PCi0XcyWfA==","shasum":"1de14a87e947d6fd01c9917c1a1d97adcc387850","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.0.0-beta.10.tgz","fileCount":292,"unpackedSize":560275,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd22p6CRA9TVsSAnZWagAAts0P/ieE26g6LugSIQkRNoUp\nypgCAcBxBHvrckH/mAl6/WRCOePiyQo+8tCUOhr0pXbtaYsW9wTuLbTqpYj8\nLQJ1PZAhgm5U0Q+CLj7EhurHzeCjxdj8qZ8CWOE5AUQyfjhj6bSZKelQw3W3\nKsROMbbHrUKae5Bhu2z9wJmH6BcmuklS+qGRKGscSOlWsYXYRBLbrWPdFhgk\nZu7fjUagc2T/QHLpi0wDVcjjSIpUxKtKJwCa6foi/3NeciZlDPqd0tEunHQ2\nBQyab5gljwwQ7OGMdDpcdv9EmDT+Zi2VmwR8SdpPV4KXf5xaQ8G5/v2vntS/\nvDcCOOxM/dbxbshYvUq3FxeivCAuAs1MESzFHwwbb5SAZfkfVH3JVAePV4HX\nBRi1b6oG5I4hfwBtDGtEPOXJf28/xRQWFicXhj4nbZ+tKXr4LKN+u08MCv5S\nD1MwOKAqnW3SoHI2Z0gtvZ8Hwx5Gsy82za1zk6vaNXLraMtPYCYpEDQcVryN\nUXI6wLZbDUVJHvi5IQrg7fr++UdM8h0hgMJ2snUITpG6Y8ilXJEeoqwY/Bpv\nzxdRqe+Su5Bi1wQnULsgHMtZprvztZf3wnibDI33h3fYrKwU+sU+TwsjXbFO\nbT5nrnAEimVPJBv9Ibu6T+Qa8fxEXRg1qcS/urRN9cwpexyYL1yu09L3FvIy\n9WB7\r\n=7rbP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCVxx8hGT47BN1b/4R2z5EB1/H7TRV8soa/fN9hX1VEDgIhAIttQwTbr78plgTEtxyE3yeSPqDDKeq1eDkHqPdZ0B6B"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.0.0-beta.10_1574660730207_0.9629597970881292"},"_hasShrinkwrap":false},"1.50.0":{"name":"warthog","version":"1.50.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.2.0","@typescript-eslint/parser":"^2.2.0","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"ignore":["**/generated/*"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"80d023331e3129cff1b5bab41553cf40ae62c177","_id":"warthog@1.50.0","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-TpYj6aL+gpncm4hEZSDljfUSjZW5kYrcWCp9tIi84RrdBmNJ14FEkvm/4yh/NW4opAL5bp9oucxMujrUfGMyKA==","shasum":"0f0ad4889a5fb35798bd3620dd65710db7a9a36b","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.50.0.tgz","fileCount":302,"unpackedSize":584370,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd4Lo3CRA9TVsSAnZWagAAIOkQAKQweEf25dKjyBgstwxS\nw0lgyytsLRK+C4OkUoQ71FKJAI287RkuC1SMyB1xDS1JxfQ0htYQeCwP2DxV\n0MG2v2SYitIKcl8np9pMxaCBGwlKUUrefrlYeOsqVgHrQsbBaQNWMWRnwqqg\nhhfFvy6RCj+t7hhhpct/mVIk3AiN/7vcAb3PpLbkrlbClbeG00EQ9LsEBf4H\n1s9f/SC3o7psm8zVpzucXgTjs23QBLHjxBlL395rzu3/PRDOibeEfl3aQAs/\n2tGoMcLsIFWdd7ajrJ9/8al/2PBFweLX/L1f5kddSPj7Dw3zIDBR7QrO2j41\nw6HrpJVfnvxHuPUioWJtclSQst6cCsKycm5J8QdZBtq5cugw6MWVP8mW09La\nNiW3x2ZuUfqK6Txjmy8eAHuLs8zqM/4KmR0USVHelFOQ3IUYZKz0nOiFpfk9\nTHMZWiB1AoTTJnlUluQNgAowWN3whQe9Yl2bKxdXB0FQNow0Tss1JzJnsSYn\nAZ8AvPTngMt4Far4V2oLPOSfuFEEU1HUi+u+ITyRcPcmCidlwo0JYAbbSP1c\n4Q2rcCLAUmnYRSgJeGC49C/mMSpsUDYb1sTOXFu5ap/cwmZl92hpFI+zFMJm\nn4dN48vVkXvqaicf8mK+dGVeMwPM0COAryxSw3SO6zCd6TIDY6RnMR8UGR1l\ndSNe\r\n=SEMj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDivPC6fipy9TJP3XNVqD8FjZyH4NfB26mSj+WQ6OR2RwIgCeeTXfvKOHRJ0EmLPj14/UXZRD3pOEpILTqV6I9tusc="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.50.0_1575008822884_0.6815744589830952"},"_hasShrinkwrap":false},"1.50.1":{"name":"warthog","version":"1.50.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.2.0","@typescript-eslint/parser":"^2.2.0","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"ignore":["**/generated/*"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"6b1054eba5fd812b582543a3563c8c53d1efbb44","_id":"warthog@1.50.1","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-bKCSW2ZNmAZ7Qfxfr2zj7CB4iHPbgi69zRwAq9FfQwsPT1d9jqXu2zywlQaf0Wpw6D5sEQOexsdvs9yxdnU25A==","shasum":"3f5215b7485832ab28a786ae755255c0f6897fad","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.50.1.tgz","fileCount":303,"unpackedSize":584810,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd4MWaCRA9TVsSAnZWagAA09sP/1Y7vcg9b7lEg5NMIItz\nBDseJYMdNuM34lksDZMkC38m2l6ZBDU/Y0d6/kKmLvJ4vGlzRrSNCOpvsifw\nqQFhwa0JdQHJmj+i+xtkMTXUChq9iUmLaxojOWYqiXo4fn7R6xAhyaOJOS2P\n5AHx+yeeoJCAcojumx0sJdbXEqM5QcsxSfHjh2Ckn2fF6JAUkLPMllHzrr/+\nGCTX5OQpRrKXfCyC4tGlEC0/mh214tKBVRsACj4r+di3wWXnu0La8gRAr96x\niIfgjCY25F0BKMxhPYPauztVPbbs4tWybjPw8Udcca5tZKo4o8EQsvAQz+Xj\n8AmCeGdTLs/PQYmhKFnxYo5MzV+Bq3EhjA1kGSv7aTzWVf8DEdA2wGUZZjJ/\nSQbJIdBW45U/u9euNwboHs1bxIhcWd2TD/5x+LZYonYqMkjKWVOAmPjebott\nv6AXme/tecKT9I/trEHpD1acgbFleZXI+FoosMGJE2WVIR8wFBIC2EQd7Iyh\ntBa2mDlBNFpgwJ7m/RFCRxbbW8wE+0WfLuOdYbqjg2DTTapBP8NzaBicKIbe\nPwvjKSXKPxcMhhMKE8+sh2K60qCsVt3eEzuDOotRuzF5Dng9T2KGmKkXlk1Z\nQwVNFK5bQFoEXoe/ay2OgWRDl3SmEsSYPIif+73IP4VgXXzo1EtWR3bIALup\n1PLD\r\n=4/nz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCe39SGDhpk3u7uzdR5wU7/o4SumizPYKA44BDDWkEJFQIgXrGNTKW6T24eVKDgRyqjRy21vEBqUmdz4Ytw2v4NETM="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.50.1_1575011737693_0.5926309970811692"},"_hasShrinkwrap":false},"1.50.2":{"name":"warthog","version":"1.50.2","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.2.0","@typescript-eslint/parser":"^2.2.0","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"ignore":["**/generated/*"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"gitHead":"45d36bc480aeccd7750f0acbdbbe0a4ca918829d","_id":"warthog@1.50.2","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-PhmwEyrTP5RUtiodJkraRe0H1ATfzzHJ/52SewyOJQyk8sansANpETFIgYDl9NSX6xTtfFGLjXrtPLGpFQThMA==","shasum":"8ccf718af29ce06baa3c486ce29e0edb69322391","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.50.2.tgz","fileCount":303,"unpackedSize":583346,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd4MxwCRA9TVsSAnZWagAABaIQAISvqOrLjc8kIaFMXNQ5\notvoj003DHeMOzxLbLljGQhllNbFi2JLUZ5sQn28E6DpiDfuyqvj6sUH2ilq\nDrQYChH7N3wo/Tv6QG9UYDsMuXqpNonUibvYUS88tobO/g/Ju5v7qJ+0/w85\nhljlMKJitGuAfNB0WHcsxP32Q4QEspskMlLL8MC4fJW6zsXAK2WDiajlp7bZ\nkOaZboO6+r7RdUgyTCcd0jKwnwlcKtQTIa2YlhvZeiXR6HcFxaR1nx5KzWUG\njgBXcaw9cu5BJno8cxSysYWpzIVnIn+yWKvI28Szp806DXRXjo+gt1h4Oyp6\nLw/bYak6YMbQ+DLbpOFVslWiNKX53rBBOlWj69obg6xdb6UdcK+w2TolhKzJ\nI3TTBjwvNjyHd30OLLXyQJd2i6I2CMtVpm2EXINE9UHcPA+q3KYeySxuYy36\njFbdItseRxZjUjb8CyFHst/D1Le6NSjRZqtV5iyIoO0Pi4jTPbfgKn1BIcP4\n2vNv1V7KutHu1jvmX6L1eZiFwGYbVqfaepqvdy3UWsbz1FZehI/4zJjEDV2/\nRVXFkcJqtwh9pImM8PKDNgAtMsaB2Q41HOOXYBcDST8p630PQH324Qz7twg5\nsvHtP4Nsc7QtV16qrjBCVxPaDyEaFUjmZ2d0tGg6UVxz6UUCminv7dXDgzL1\nbJim\r\n=0RTZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDeGSdty2W07OIj4sxR4FW8vSMoXLuIY54LewB9JD1XcAIgIqxFiyR7sjDgRMPLLlJ2SYr0SovyZCR7PjmYi+U46DE="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.50.2_1575013488427_0.8442232994507735"},"_hasShrinkwrap":false},"2.0.0-beta.11":{"name":"warthog","version":"2.0.0-beta.11","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up. (Note: Postgres 12 is not currently supported)\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Usage\n\n### Cloning the starter project\n\nThe easiest way to start using Warthog for a fresh project is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Installing in Existing Project\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Install Warthog\nyarn add warthog\n\n# Pull down several nessesary files from the warthog-starter example\ndeclare -a arr=(\".env\" \"warthog.config.js\" \"tsconfig.json\" \"src/config.ts\" \"src/index.ts\" \"src/logger.ts\" \"src/server.ts\")\nfor i in \"${arr[@]}\"\ndo\n  if [ ! -f ./$i ]; then\n    curl https://raw.githubusercontent.com/goldcaddy77/warthog-starter/master/$i -o $i\n  fi\ndone\n\n# Create a .env file with your app and DB settings (modify these as needed)\nprintf \"DEBUG=*\nNODE_ENV=development\nWARTHOG_AUTO_OPEN_PLAYGROUND=true\nWARTHOG_APP_HOST=localhost\nWARTHOG_APP_PORT=4100\nWARTHOG_DB_DATABASE=warthog-starter\nWARTHOG_DB_HOST=localhost\nWARTHOG_DB_PASSWORD=\nWARTHOG_DB_PORT=5432\nWARTHOG_DB_SYNCHRONIZE=true\nWARTHOG_DB_USERNAME=postgres\" > .env\n\n# Create your first model (See https://github.com/goldcaddy77/warthog#generate-command-in-depth for more info)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn ts-node --type-check src/index.ts\n```\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => object`                                                     | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                     | value                                       | default                     |\n| ---------------------------- | ------------------------------------------- | --------------------------- |\n| WARTHOG_APP_HOST             | App server host                             | _none_                      |\n| WARTHOG_APP_PORT             | App server port                             | 4000                        |\n| WARTHOG_APP_PROTOCOL         | App server protocol                         | http                        |\n| WARTHOG_AUTO_GENERATE_FILES  | Auto-generate files                         | false (true in development) |\n| WARTHOG_AUTO_OPEN_PLAYGROUND | Open playground on server start             | false (true in development) |\n| WARTHOG_CLI_GENERATE_PATH    | Where should CLI generate files             | ./src                       |\n| WARTHOG_DB_CONNECTION        | DB connection type                          | postgres                    |\n| WARTHOG_DB_DATABASE          | DB name                                     | _none_                      |\n| WARTHOG_DB_ENTITIES          | Where should warthog look for models        | src\\/\\*\\*\\/\\*.model.ts      |\n| WARTHOG_DB_MIGRATIONS        | What DB migrations should TypeORM run       | db/migrations/\\*\\*\\/\\*.ts   |\n| WARTHOG_DB_MIGRATIONS_DIR    | Where should generated migrations be placed | db/migrations               |\n| WARTHOG_DB_PORT              | DB port                                     | 5432                        |\n| WARTHOG_DB_USERNAME          | DB username                                 | _none_                      |\n| WARTHOG_DB_LOGGER            | TypeORM logger                              | advanced-console            |\n| WARTHOG_DB_PASSWORD          | DB password                                 | _none_                      |\n| WARTHOG_DB_SYNCHRONIZE       | DB automatically migrated                   | false                       |\n| WARTHOG_GENERATED_FOLDER     | Where should generated code be placed       | ./generated                 |\n| WARTHOG_INTROSPECTION        | Allow server to be introspected             | true                        |\n| WARTHOG_MOCK_DATABASE        | Should we use mock sqlite DB?               | false                       |\n| WARTHOG_RESOLVERS_PATH       | Where should Warthog look for resolvers     | src/\\*\\*\\/\\*.resolver.ts    |\n| WARTHOG_VALIDATE_RESOLVERS   | TypeGraphQL validation enabled?             | false                       |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Complex use cases/ejecting\n\nWarthog makes building simple CRUD endpoints incredibly easy. However, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well.\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should just use [the TypeORM decorators](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md)\n\n### API-only\n\nIf you need to add a field that is only exposed via the API that is not DB-backed, you should just use [the TypeGraphQL Field Decorator](https://github.com/19majkel94/type-graphql/blob/master/src/decorators/Field.ts)\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n","readmeFilename":"README.md","gitHead":"acc1e6d359d215d7e7c26a31ba8771dad67b23f1","_id":"warthog@2.0.0-beta.11","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-XJ4j8yiIOyc52NDPYGa413kfzcA2jjwLdOV14BIZSTIkayEPoP9avvxrwCeSSgVsJ85STeozVkgwdjINzc2FMA==","shasum":"a65397f93cdc29e3ba2c2ab5bd9d6562a86bbd0d","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.0.0-beta.11.tgz","fileCount":292,"unpackedSize":568765,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd6KNgCRA9TVsSAnZWagAAOzkP/RCBSA+JmCwlGyzQWnZk\nn1B/QeAWz5DUhJgU3BBJnX+HqD+3x7CezoZZhtKP7786BvYv1wLjZeTmYnJb\nWWH1ZerLksdnZREm84lxpayuTB0QyP9oLbnDZafw2lN4idClYilc0Gc9POWj\nEN/Yt6OOXtP7yylleKFBByDTY7JQtsPOsTegxg7HMdBn1qNJbBAoNfVJ+gJ4\nRavLqCAjo94MWVni3/Z3tinw5hlmVC4muTb3an/onKuDGw6B5E8tXOYIRSGR\nLiq0k0XFdsfqOoxUId+/3e11AGKo+LblD5C+S3RG8bJZUDM8j+jAKEA/P/pc\naNpi3IzKWuMMpF9YiVEt3t/fvbkGxpCumhTRI+h/omjqnju5LOjmSRf346QX\nbfg8XcczqIoxEmMKbivKnt9Bq3mwO9j4nm9LkY1xnKdN8gmPU2QEegxcS53C\nJyZz/oKx5R2x1dLm+QjVHcF0PiqFRbsOVlASzzUW/V8E3wO8KLIuvMV/TxFr\nlNX0l4h+UTC3xOPh4LDAg/YP6zUyntGiyVHr4uLtQjzSOsty8WjvV+SA3zWg\nNIgJCkXl3MfHRs+UT1FDCg31npUOztPO+XJxltEJQ+y8fjwJ+jQPgnaEz4XX\nW0o/kZlvoVtpVrKc6K9kE/tQx3DsbVZc9ntArM66zLvGrzeaZrZGMkA+yFI5\nqM0E\r\n=8EU/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHlzbxJVhc8lD5TFFv8py3OvffkfOck3UhySG5ds4OO/AiBYNafhf9La+2hgeH6ncg8lUZcppM2ghrM7Dtq91WeI6Q=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.0.0-beta.11_1575527264012_0.2558348318608219"},"_hasShrinkwrap":false},"2.0.0-beta.12":{"name":"warthog","version":"2.0.0-beta.12","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"gitHead":"d69df23fe717d3af6a38a0e23c6cc122ce49e94c","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up. (Note: Postgres 12 is not currently supported)\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Usage\n\n### Cloning the starter project\n\nThe easiest way to start using Warthog for a fresh project is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Installing in Existing Project\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Install Warthog\nyarn add warthog\n\n# Pull down several nessesary files from the warthog-starter example\ndeclare -a arr=(\".env\" \"warthog.config.js\" \"tsconfig.json\" \"src/config.ts\" \"src/index.ts\" \"src/logger.ts\" \"src/server.ts\")\nfor i in \"${arr[@]}\"\ndo\n  if [ ! -f ./$i ]; then\n    curl https://raw.githubusercontent.com/goldcaddy77/warthog-starter/master/$i -o $i\n  fi\ndone\n\n# Create a .env file with your app and DB settings (modify these as needed)\nprintf \"DEBUG=*\nNODE_ENV=development\nWARTHOG_AUTO_OPEN_PLAYGROUND=true\nWARTHOG_APP_HOST=localhost\nWARTHOG_APP_PORT=4100\nWARTHOG_DB_DATABASE=warthog-starter\nWARTHOG_DB_HOST=localhost\nWARTHOG_DB_PASSWORD=\nWARTHOG_DB_PORT=5432\nWARTHOG_DB_SYNCHRONIZE=true\nWARTHOG_DB_USERNAME=postgres\" > .env\n\n# Create your first model (See https://github.com/goldcaddy77/warthog#generate-command-in-depth for more info)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn ts-node --type-check src/index.ts\n```\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => object`                                                     | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                     | value                                       | default                     |\n| ---------------------------- | ------------------------------------------- | --------------------------- |\n| WARTHOG_APP_HOST             | App server host                             | _none_                      |\n| WARTHOG_APP_PORT             | App server port                             | 4000                        |\n| WARTHOG_APP_PROTOCOL         | App server protocol                         | http                        |\n| WARTHOG_AUTO_GENERATE_FILES  | Auto-generate files                         | false (true in development) |\n| WARTHOG_AUTO_OPEN_PLAYGROUND | Open playground on server start             | false (true in development) |\n| WARTHOG_CLI_GENERATE_PATH    | Where should CLI generate files             | ./src                       |\n| WARTHOG_DB_CONNECTION        | DB connection type                          | postgres                    |\n| WARTHOG_DB_DATABASE          | DB name                                     | _none_                      |\n| WARTHOG_DB_ENTITIES          | Where should warthog look for models        | src\\/\\*\\*\\/\\*.model.ts      |\n| WARTHOG_DB_MIGRATIONS        | What DB migrations should TypeORM run       | db/migrations/\\*\\*\\/\\*.ts   |\n| WARTHOG_DB_MIGRATIONS_DIR    | Where should generated migrations be placed | db/migrations               |\n| WARTHOG_DB_PORT              | DB port                                     | 5432                        |\n| WARTHOG_DB_USERNAME          | DB username                                 | _none_                      |\n| WARTHOG_DB_LOGGER            | TypeORM logger                              | advanced-console            |\n| WARTHOG_DB_PASSWORD          | DB password                                 | _none_                      |\n| WARTHOG_DB_SYNCHRONIZE       | DB automatically migrated                   | false                       |\n| WARTHOG_GENERATED_FOLDER     | Where should generated code be placed       | ./generated                 |\n| WARTHOG_INTROSPECTION        | Allow server to be introspected             | true                        |\n| WARTHOG_MOCK_DATABASE        | Should we use mock sqlite DB?               | false                       |\n| WARTHOG_RESOLVERS_PATH       | Where should Warthog look for resolvers     | src/\\*\\*\\/\\*.resolver.ts    |\n| WARTHOG_VALIDATE_RESOLVERS   | TypeGraphQL validation enabled?             | false                       |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Complex use cases/ejecting\n\nWarthog makes building simple CRUD endpoints incredibly easy. However, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well.\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should just use [the TypeORM decorators](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md)\n\n### API-only\n\nIf you need to add a field that is only exposed via the API that is not DB-backed, you should just use [the TypeGraphQL Field Decorator](https://github.com/19majkel94/type-graphql/blob/master/src/decorators/Field.ts)\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n","readmeFilename":"README.md","_id":"warthog@2.0.0-beta.12","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-U6XnjXOXZ+f/5OdMdnwrFwh0aviYqAz0y8oaxMy3BK6UKo+mXpiSjAKIrnsK7h4jO3d5n/S3IK4FWKF7RS24pA==","shasum":"debe26a13250bb285b4fdf7f96b18cec1cc8baaa","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.0.0-beta.12.tgz","fileCount":292,"unpackedSize":568765,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd7JzeCRA9TVsSAnZWagAAgicP/0dstOoGmjxnKfso+2oP\nU2VXsrJDA7F0XL4r3PbyWrUEeNPQmVBuEdLu3JRBTBOljFFgMMIJEvDe2OoH\nWZ83h2CJO3PJgfaQvj8tp49Oyphpronl9oaNOWEMIeYWz+gNeHPFsQ5t0ueX\ny5sPdT6AB89xtxPol6vr05RQukXwpKE7hq7BmOVA9CYnhX5bj5BG5ghXmPR7\nvrkS0L2PRAela2qpxzBn3XKT/uivOVMVIQKXhEN+kXTr6h1mVSImhx1JYBQ5\nywZR0CoSd+XkDJFy73w4heAcg5H+duj3SbSxX1BscrN90EaOLNy0lvErirRz\n+mayM5FMC7bhkZkyoJoEbnvEEEdxd78lyXHMwYLW7f5Ha8EZ7kpyUC2baRWj\non6ivneeAFUy0K+MR1lUuAOz9xqOuO6tPzaMm/wNNg4GfH7Ce52s4Za48Sg/\nmX5zfROqHIW6Zae8TGPkaDJfUAZ+ntGiOwotyPunDqJKqfse3sxqvbLInVXK\nYNZwb57nJ89dsLYxolFCg+rUEQsKhn0E6rHwo315vU2IajOd1df7M3jO3FSa\nHsUNwtYPMtvebfbUhPwfSN1R8+VTYIpOO7rjsSNM3znFrYwvkuq25bwvOa74\nHu6hdjUKtDf196nQo/twLoCysdtTqzG+axBwf5VypHGScZbGuPYkZZqzU1of\npC1c\r\n=fWjn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDAAecIV5stHGaaNkw1XNW6Qs1nxHjdabqJqjvWMJHwzAiEAibfSlaXSqV0aPJTeVf08tVkm9Psn40j8z9YelWZPkhQ="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.0.0-beta.12_1575787742279_0.3505425141322367"},"_hasShrinkwrap":false},"1.50.3":{"name":"warthog","version":"1.50.3","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.2.0","@typescript-eslint/parser":"^2.2.0","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"ignore":["**/generated/*"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"gitHead":"2b2bff29578e0c6bae17fa384a3d255da31efe21","_id":"warthog@1.50.3","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-/jm3tKPKLWZVtX6skEjowchH0qV20JIxJq0e5un4WZd+KGdQhpz2QZo4ueNuBoNh96qh/gLADHudf879t3OMWQ==","shasum":"6c3e35779ce531a91d74ca71710934e07aaafc7e","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.50.3.tgz","fileCount":303,"unpackedSize":583509,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd7TNMCRA9TVsSAnZWagAABucP/i6wQaHv6xtJ8/L1eG17\n+VrzpzYLKrT8GfysFPhi43bFVNm6bn3fMiJIlvG6q0UJXq33BLdV8cV038OL\ncRkR/mCCPPIUPuRc0VekfBHqkwamUb8B/msR/hdtxCJUxzmJY0BETBH6m24P\nkfCH96UOG/2QGJ42IkvNyUEf70cTfHb86PnvIcbMUSjcd0mW6KczNoeCfN8y\nBa2cqVwQ2rAuCe1DMGAFZM8Q2Tk9YqSr+eiCRoPCaaKE/Pr2tsSOjEoTVVco\njt9qBGnRibbPLb+pV2B+kqSzlrausEM+M/JXtCuhD/7Ypu6ihkfHfrQMphgz\nU49Y21patVueH8MDOJCx3B6O1U0lhAHQjzqw36mYcquZC9reHhH3OWu63YiT\nM7JxC03IM8jlH7Jn6vBARW1dNsS3bavoW6DTVB5jHetpaFLWnfH81Tm0uEIB\n9lN1CiBpkOYNYT7eVYhHspnVsG4LL4+xO0i+mXWQIZCsfVxt92h/gSvj1n0q\n5ivp5tQFn+QgVR9xzibNjesMFe6Lbl8xN+2juF2YDJe8+4Ukdo9/F46/BJA/\nMAZ4m+tNKn9aoU+1Ja8HO0EulLU1M6rcPft9HUgcR1nFA4L4lkC3HcxRILQ0\npteev2C7BbuZTY3VdPaE3PmUTZusrzjiHUvxm2iPHP9eS/Cjbrkjs+LAe4dY\nhzvV\r\n=E4PB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAgdpg/24sxfa3UHI2CiijeXUncoOFZiWVaLohUg7I7dAiBu+D10JU8MTDZdwmZmtCXwllA7AhE8m0iOeiwO6Cs7Pg=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.50.3_1575826251856_0.384542802176165"},"_hasShrinkwrap":false},"2.0.0-beta.13":{"name":"warthog","version":"2.0.0-beta.13","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up. (Note: Postgres 12 is not currently supported)\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Usage\n\n### Cloning the starter project\n\nThe easiest way to start using Warthog for a fresh project is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Installing in Existing Project\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Install Warthog\nyarn add warthog\n\n# Pull down several nessesary files from the warthog-starter example\ndeclare -a arr=(\".env\" \"warthog.config.js\" \"tsconfig.json\" \"src/config.ts\" \"src/index.ts\" \"src/logger.ts\" \"src/server.ts\")\nfor i in \"${arr[@]}\"\ndo\n  if [ ! -f ./$i ]; then\n    curl https://raw.githubusercontent.com/goldcaddy77/warthog-starter/master/$i -o $i\n  fi\ndone\n\n# Create a .env file with your app and DB settings (modify these as needed)\nprintf \"DEBUG=*\nNODE_ENV=development\nWARTHOG_AUTO_OPEN_PLAYGROUND=true\nWARTHOG_APP_HOST=localhost\nWARTHOG_APP_PORT=4100\nWARTHOG_DB_DATABASE=warthog-starter\nWARTHOG_DB_HOST=localhost\nWARTHOG_DB_PASSWORD=\nWARTHOG_DB_PORT=5432\nWARTHOG_DB_SYNCHRONIZE=true\nWARTHOG_DB_USERNAME=postgres\" > .env\n\n# Create your first model (See https://github.com/goldcaddy77/warthog#generate-command-in-depth for more info)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn ts-node --type-check src/index.ts\n```\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => object`                                                     | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                     | value                                       | default                     |\n| ---------------------------- | ------------------------------------------- | --------------------------- |\n| WARTHOG_APP_HOST             | App server host                             | _none_                      |\n| WARTHOG_APP_PORT             | App server port                             | 4000                        |\n| WARTHOG_APP_PROTOCOL         | App server protocol                         | http                        |\n| WARTHOG_AUTO_GENERATE_FILES  | Auto-generate files                         | false (true in development) |\n| WARTHOG_AUTO_OPEN_PLAYGROUND | Open playground on server start             | false (true in development) |\n| WARTHOG_CLI_GENERATE_PATH    | Where should CLI generate files             | ./src                       |\n| WARTHOG_DB_CONNECTION        | DB connection type                          | postgres                    |\n| WARTHOG_DB_DATABASE          | DB name                                     | _none_                      |\n| WARTHOG_DB_ENTITIES          | Where should warthog look for models        | src\\/\\*\\*\\/\\*.model.ts      |\n| WARTHOG_DB_MIGRATIONS        | What DB migrations should TypeORM run       | db/migrations/\\*\\*\\/\\*.ts   |\n| WARTHOG_DB_MIGRATIONS_DIR    | Where should generated migrations be placed | db/migrations               |\n| WARTHOG_DB_PORT              | DB port                                     | 5432                        |\n| WARTHOG_DB_USERNAME          | DB username                                 | _none_                      |\n| WARTHOG_DB_LOGGER            | TypeORM logger                              | advanced-console            |\n| WARTHOG_DB_PASSWORD          | DB password                                 | _none_                      |\n| WARTHOG_DB_SYNCHRONIZE       | DB automatically migrated                   | false                       |\n| WARTHOG_GENERATED_FOLDER     | Where should generated code be placed       | ./generated                 |\n| WARTHOG_INTROSPECTION        | Allow server to be introspected             | true                        |\n| WARTHOG_MOCK_DATABASE        | Should we use mock sqlite DB?               | false                       |\n| WARTHOG_RESOLVERS_PATH       | Where should Warthog look for resolvers     | src/\\*\\*\\/\\*.resolver.ts    |\n| WARTHOG_VALIDATE_RESOLVERS   | TypeGraphQL validation enabled?             | false                       |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Complex use cases/ejecting\n\nWarthog makes building simple CRUD endpoints incredibly easy. However, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well.\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should just use [the TypeORM decorators](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md)\n\n### API-only\n\nIf you need to add a field that is only exposed via the API that is not DB-backed, you should just use [the TypeGraphQL Field Decorator](https://github.com/19majkel94/type-graphql/blob/master/src/decorators/Field.ts)\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n","readmeFilename":"README.md","gitHead":"c7dc24a23278255223f33f4ad74581d9150b4dad","_id":"warthog@2.0.0-beta.13","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-MA8Aaw2qLU/ySRHXk0FwcLfoUrT1XOGcB5LbSa1E7cR1FC+xpzHqe3PS0pHr+/haEZlB9efyRZAoFgdlKSCZTQ==","shasum":"ad5e846dc59bf9b2f871bd304b933bf7d6b06cab","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.0.0-beta.13.tgz","fileCount":292,"unpackedSize":569085,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd8bCACRA9TVsSAnZWagAArhIP/A41g/tZWLNgqpBdIBEJ\n5ePGuvs+l6p9kPSxzpxy0SqbEQrJ5pKBFM4guP2FeeMMr8d65JMbjb0Vof5t\n4o9sinMmXr3NDui8e7CNh5DysTjNeqgIX+nDBxDLmZS/qkxeHev1+MP96XJH\nNmo8jRYEDVtGRxV0yWxYK+wJFc72lFWXwqBrEDWRw1vMqkgwtohabv3Ti2L9\n2ixOU8PfaT4xikA1wFSMoqP4gr6pfgBSeGkCzo3fB/36M/nhAD+C7YpH6s2x\nSBqMiC53ZddylQC6ejlOOTV1bo6S/rV8qBZCOyjhNSxiURpeeyneArp56+41\nwrWJsTLWf7CyGbXwoPXstBzAd5bl9OV2cIZ2a8Gro5684HanTyxi2IYUJm2H\nQiXokZ6Firz//uHocx62tCWk6pefvdVMas+/DOaeS4BuZIxvszC0ngFpoKjv\nZnE8lVO/K8bskZQVwERasQVyC7Cg67o7TKJZ1XSFoBsU9YRsJleYx0vCb1+u\n+6q8FP0F1Tn5ng6P03xr7vG2DgRWTqRnVFaVdpuyzezx8fuoGNf9nSslist3\n7oQfPV6z9ljdpaPQdyq1axmG9aBsFEmKarqHZYrFnSMljhz1aFp4fu4eDRuv\nV6v8ccGZnoFB7DYHI4SKnKxBibyl8uB2hEHr/mor8j3bHyc8taClU+X5Q7TF\nDR6d\r\n=PK4h\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDnIWbiwVwCAnhxVAaMs3eiJElaetyXZ2l/8pVXS4x3OgIgI+BSKQgXlucWBaY0PIKl5EFefMRHo+UGLsC5aLbOSYI="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.0.0-beta.13_1576120447954_0.8996890570852296"},"_hasShrinkwrap":false},"1.51.0":{"name":"warthog","version":"1.51.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.2.0","@typescript-eslint/parser":"^2.2.0","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"ignore":["**/generated/*"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"gitHead":"493c1b2f98bc7e47078d70af52fc2156773d3ce8","_id":"warthog@1.51.0","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-DMQNXLalnbGovF494x7JCtEqoOug+9mJbMjnWD5xXMKZobPrAHyCbaXbC9Cho7/4mBsoNj8FpYdnYUCJ/9ljrA==","shasum":"412d586643a1e13ad2bf965b50a3725e1def1f5d","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.51.0.tgz","fileCount":303,"unpackedSize":584386,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd+a20CRA9TVsSAnZWagAAZcYQAJPoLS3q5k7+k8Uss160\ntfIEMBnp6og5W5K2OLcFd2LYXUNFB0i9T+KjFHXXMxLSkZFbWkS7Zh0uZQ83\nm9qa25R3mWPGARWAmzkilIRQAR010QWtYC2GQDDoKZfGI5vT0XjbFeewyVhL\n79FUOEwFU5LE88yYSydmmvb3emMRnwc9FhSeFc5K+wieUY+sMzft4K01wkoJ\n/QmkXAVafSko6bA96igGFvXy/62Wk0DojFiW/m2HHOheZAkC9lZGicy3fGZE\nk2deKGfmvFV/zM0aBY6rWaCe5m+ekdJQ517tdmz+zt5xNbcvfDZ2fI2yDx81\nEfR0iBnIMECxYEcQ6GE9wKxwveow2P/USfiAWuvxu8Rx9K/oVNFuQRR2+rNh\nmb9Y4cMSJ2YE6z3nGndL3FrhEzF25OX0wejo9N66AvztaAsw8PDZjciwfVKW\nAH0P522JyAcPtFpGWAzhvdNb5fG+TXdcmHSZ642rELl6JykmWTgePUcIkSZ6\n80UDa5wYbsxrGvvkAiweOdFL0MC5q/CAvHfAHgr+s2kY77U8FD1nCGICt2aM\nFUPuYY3Ko46OFXF1n77Btao28CVfsHhPOSOqcIftHcIFJj16RJMGWGYVXsXG\nhQi9uuZwa+Jy9wf0CEyH8q4DQmF+I6YjduzsDKJXpLFAciNoa1pwK4SCBSfO\nb/9f\r\n=ri48\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC7DQ+Ex7mdWxr62wRz5iV/oEzYupJm8n+UksXyD4NeSwIgdn5gE9VxXR0WI38F7RjeDXE9GCVMD2LNi8wDGyAPg0M="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.51.0_1576644019732_0.6834195779731038"},"_hasShrinkwrap":false},"2.0.0-beta.14":{"name":"warthog","version":"2.0.0-beta.14","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up. (Note: Postgres 12 is not currently supported)\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Usage\n\n### Cloning the starter project\n\nThe easiest way to start using Warthog for a fresh project is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Installing in Existing Project\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Install Warthog\nyarn add warthog\n\n# Pull down several nessesary files from the warthog-starter example\ndeclare -a arr=(\".env\" \"warthog.config.js\" \"tsconfig.json\" \"src/config.ts\" \"src/index.ts\" \"src/logger.ts\" \"src/server.ts\")\nfor i in \"${arr[@]}\"\ndo\n  if [ ! -f ./$i ]; then\n    curl https://raw.githubusercontent.com/goldcaddy77/warthog-starter/master/$i -o $i\n  fi\ndone\n\n# Create a .env file with your app and DB settings (modify these as needed)\nprintf \"DEBUG=*\nNODE_ENV=development\nWARTHOG_AUTO_OPEN_PLAYGROUND=true\nWARTHOG_APP_HOST=localhost\nWARTHOG_APP_PORT=4100\nWARTHOG_DB_DATABASE=warthog-starter\nWARTHOG_DB_HOST=localhost\nWARTHOG_DB_PASSWORD=\nWARTHOG_DB_PORT=5432\nWARTHOG_DB_SYNCHRONIZE=true\nWARTHOG_DB_USERNAME=postgres\" > .env\n\n# Create your first model (See https://github.com/goldcaddy77/warthog#generate-command-in-depth for more info)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn ts-node --type-check src/index.ts\n```\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => object`                                                     | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                     | value                                       | default                     |\n| ---------------------------- | ------------------------------------------- | --------------------------- |\n| WARTHOG_APP_HOST             | App server host                             | _none_                      |\n| WARTHOG_APP_PORT             | App server port                             | 4000                        |\n| WARTHOG_APP_PROTOCOL         | App server protocol                         | http                        |\n| WARTHOG_AUTO_GENERATE_FILES  | Auto-generate files                         | false (true in development) |\n| WARTHOG_AUTO_OPEN_PLAYGROUND | Open playground on server start             | false (true in development) |\n| WARTHOG_CLI_GENERATE_PATH    | Where should CLI generate files             | ./src                       |\n| WARTHOG_DB_CONNECTION        | DB connection type                          | postgres                    |\n| WARTHOG_DB_DATABASE          | DB name                                     | _none_                      |\n| WARTHOG_DB_ENTITIES          | Where should warthog look for models        | src\\/\\*\\*\\/\\*.model.ts      |\n| WARTHOG_DB_MIGRATIONS        | What DB migrations should TypeORM run       | db/migrations/\\*\\*\\/\\*.ts   |\n| WARTHOG_DB_MIGRATIONS_DIR    | Where should generated migrations be placed | db/migrations               |\n| WARTHOG_DB_PORT              | DB port                                     | 5432                        |\n| WARTHOG_DB_USERNAME          | DB username                                 | _none_                      |\n| WARTHOG_DB_LOGGER            | TypeORM logger                              | advanced-console            |\n| WARTHOG_DB_PASSWORD          | DB password                                 | _none_                      |\n| WARTHOG_DB_SYNCHRONIZE       | DB automatically migrated                   | false                       |\n| WARTHOG_GENERATED_FOLDER     | Where should generated code be placed       | ./generated                 |\n| WARTHOG_INTROSPECTION        | Allow server to be introspected             | true                        |\n| WARTHOG_MOCK_DATABASE        | Should we use mock sqlite DB?               | false                       |\n| WARTHOG_RESOLVERS_PATH       | Where should Warthog look for resolvers     | src/\\*\\*\\/\\*.resolver.ts    |\n| WARTHOG_VALIDATE_RESOLVERS   | TypeGraphQL validation enabled?             | false                       |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Complex use cases/ejecting\n\nWarthog makes building simple CRUD endpoints incredibly easy. However, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well.\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should just use [the TypeORM decorators](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md)\n\n### API-only\n\nIf you need to add a field that is only exposed via the API that is not DB-backed, you should just use [the TypeGraphQL Field Decorator](https://github.com/19majkel94/type-graphql/blob/master/src/decorators/Field.ts)\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n","readmeFilename":"README.md","gitHead":"47401378ba284267db01cca50a5e3023622595d3","_id":"warthog@2.0.0-beta.14","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-i2TQjHnUUym12uT1BR8VAvJfgX+6KShv1fHBlhW/HUhgXhswuYtLNND4zVlYEhiatJev/3/jCQhMqYkyeSIjOA==","shasum":"861eec80bf766809b25d6ca3972663d035903f68","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.0.0-beta.14.tgz","fileCount":292,"unpackedSize":569962,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd+wTqCRA9TVsSAnZWagAAmIYP/ArFOb8oRxAu83oCJUli\ni0WBZbKC6ByYJ2Ikm7K5ZSHEJZaQ89Ta0Wu03PR+IOTqHnXGZxVsHKECoeNf\niZbolGbNtGe4UncGojfBehjgM2yxdZPwddQ1cTSeLa2wEVTB+rK/1lxLf44s\nBm1aDlQfXtazdMBASfNNk+6kF91nV8aCxxEBx5VNZls74dSHw7AD3rsiYk+9\nnHr0HfJ1KnuWt48uc7akQEbgxWwfRiVtfuI0A+nuTRMydLq9vP4rRKebneIG\nLB8aAxeD5veVo99n6z/egiJAwUoVMdNrW0rF55Mm/GcLuU9WAgnKk+aRI87h\ns6Wbf+DrqnCdkjoUOTOLVNI2eLJaXqhtxi7KLRGiS/cWNwpaT3hkzbYQyVh1\nD2uE84s2DrOBOniq310JbI4H9B1QikT0XuN3FunJRHMVqympDQsHEWtaxip7\n7cF+BkJSfESdsfaOpvLvAEmHSN1d9MHXNNeye03+/OWSp1Z6b21YYkHwllxU\nJbwoQglv9wLegDJzRSNbJzgGg4LK2OmH9wjDwoyRhEq/CECBLCq/BhdLFAUX\n90sfSpOkV7Rjf4ju8h+bWhEOe2aCQ1YKNFOnigKbxjL8Fkwda4/lAZmj777o\ndplXQHSUArKn61L9j1wSEP+t87Jxw+4Xnxou1iaztOwOHZrERDnqheRqYTZ5\nerkY\r\n=IEL4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDGaEymNAVALjVe3RlHR3+ISlzyM5iQX/zyRPxVfuS/5AIgLFw2PqR7r+dx3NgkkflWadXKe130Dx78b97yJpjyg/s="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.0.0-beta.14_1576731882238_0.46303965424178606"},"_hasShrinkwrap":false},"2.0.0-beta.15":{"name":"warthog","version":"2.0.0-beta.15","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up. (Note: Postgres 12 is not currently supported)\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Usage\n\n### Cloning the starter project\n\nThe easiest way to start using Warthog for a fresh project is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Installing in Existing Project\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Install Warthog\nyarn add warthog\n\n# Pull down several nessesary files from the warthog-starter example\ndeclare -a arr=(\".env\" \"warthog.config.js\" \"tsconfig.json\" \"src/config.ts\" \"src/index.ts\" \"src/logger.ts\" \"src/server.ts\")\nfor i in \"${arr[@]}\"\ndo\n  if [ ! -f ./$i ]; then\n    curl https://raw.githubusercontent.com/goldcaddy77/warthog-starter/master/$i -o $i\n  fi\ndone\n\n# Create a .env file with your app and DB settings (modify these as needed)\nprintf \"DEBUG=*\nNODE_ENV=development\nWARTHOG_AUTO_OPEN_PLAYGROUND=true\nWARTHOG_APP_HOST=localhost\nWARTHOG_APP_PORT=4100\nWARTHOG_DB_DATABASE=warthog-starter\nWARTHOG_DB_HOST=localhost\nWARTHOG_DB_PASSWORD=\nWARTHOG_DB_PORT=5432\nWARTHOG_DB_SYNCHRONIZE=true\nWARTHOG_DB_USERNAME=postgres\" > .env\n\n# Create your first model (See https://github.com/goldcaddy77/warthog#generate-command-in-depth for more info)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn ts-node --type-check src/index.ts\n```\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => object`                                                     | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                     | value                                       | default                     |\n| ---------------------------- | ------------------------------------------- | --------------------------- |\n| WARTHOG_APP_HOST             | App server host                             | _none_                      |\n| WARTHOG_APP_PORT             | App server port                             | 4000                        |\n| WARTHOG_APP_PROTOCOL         | App server protocol                         | http                        |\n| WARTHOG_AUTO_GENERATE_FILES  | Auto-generate files                         | false (true in development) |\n| WARTHOG_AUTO_OPEN_PLAYGROUND | Open playground on server start             | false (true in development) |\n| WARTHOG_CLI_GENERATE_PATH    | Where should CLI generate files             | ./src                       |\n| WARTHOG_DB_CONNECTION        | DB connection type                          | postgres                    |\n| WARTHOG_DB_DATABASE          | DB name                                     | _none_                      |\n| WARTHOG_DB_ENTITIES          | Where should warthog look for models        | src\\/\\*\\*\\/\\*.model.ts      |\n| WARTHOG_DB_MIGRATIONS        | What DB migrations should TypeORM run       | db/migrations/\\*\\*\\/\\*.ts   |\n| WARTHOG_DB_MIGRATIONS_DIR    | Where should generated migrations be placed | db/migrations               |\n| WARTHOG_DB_PORT              | DB port                                     | 5432                        |\n| WARTHOG_DB_USERNAME          | DB username                                 | _none_                      |\n| WARTHOG_DB_LOGGER            | TypeORM logger                              | advanced-console            |\n| WARTHOG_DB_PASSWORD          | DB password                                 | _none_                      |\n| WARTHOG_DB_SYNCHRONIZE       | DB automatically migrated                   | false                       |\n| WARTHOG_GENERATED_FOLDER     | Where should generated code be placed       | ./generated                 |\n| WARTHOG_INTROSPECTION        | Allow server to be introspected             | true                        |\n| WARTHOG_MOCK_DATABASE        | Should we use mock sqlite DB?               | false                       |\n| WARTHOG_RESOLVERS_PATH       | Where should Warthog look for resolvers     | src/\\*\\*\\/\\*.resolver.ts    |\n| WARTHOG_VALIDATE_RESOLVERS   | TypeGraphQL validation enabled?             | false                       |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Complex use cases/ejecting\n\nWarthog makes building simple CRUD endpoints incredibly easy. However, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well.\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should just use [the TypeORM decorators](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md)\n\n### API-only\n\nIf you need to add a field that is only exposed via the API that is not DB-backed, you should just use [the TypeGraphQL Field Decorator](https://github.com/19majkel94/type-graphql/blob/master/src/decorators/Field.ts)\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n","readmeFilename":"README.md","gitHead":"2dca84b5bd956da35fc8cfe81572c746914ac99e","_id":"warthog@2.0.0-beta.15","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-5TZtcfk3g6ZeRJEEOwlOFVzodYqD9qjoLsmwlwplN+Kzv2JdmySa9u7DcmIF2OI7O333CkVis0Ty5XEZ3xdCTw==","shasum":"790c39611a4dd097ca71ece0795ce9b9eb3388c2","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.0.0-beta.15.tgz","fileCount":292,"unpackedSize":574346,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd+w1WCRA9TVsSAnZWagAAUAkQAIGWGvLLB8O9PRoeRbEG\nP9Ai+WUASxVOL8RIjCEEo3hNms4WX4Kfi+GnfTChJwpbCXfv7TeKCq/2lKZo\n1PBT4kXyMoKBktbenkxKUywjbfujfxWttUze32R53+LWpgXQ35YMOlLD2fv4\n0yh+bThw/kAnmK6+EZeCb3KFes28ct5yLs52cA3mgaKv787pltzV9NO5RtOK\nWUi+gvemIHkUTWBukkwcWsRSrEYmBILzY2kP+udkh3OQ0NJyoGG0cbInigIz\n9k02puBzmUrP9fKAo4uiuYlev9AYqCoFiPqPySoCDxtBRSTZngATDYIcbVf+\nxBhFy+SZk+2p3C/JmdGZsuJ4539umwC5j7aYgy9ze7kKwkNFaVe+Lk9CiJLF\nYemIIyN3WiVHRhv6aNjkTBxz3bcqUQd6kz8sVKEttba6t7enyk8D/e75bhYr\nvdCDd8ZyiHKULj0zgapXnsj8JlYEpdPDzauQrkeQUV3LbQDrI84pWtjLoNAn\nFGlHftTOrR2XhVr+ns+fL+Gtzzusv7PCuiX3yKl6LG/QaIzX3CzhOR5hByTE\nziI5gu1wpjji6hyQf9r2zl+qgKjbdUIRbzLb8LwoAg0C93SmCuaIc7wyF5rI\n+s+SDN905H8CLX4nHyHfsVa0V+vElRte3tvrsRPnNNWgF8nZUpYV98ovhm6H\nTBdk\r\n=DoFj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDHn+ezP42I8ucMMXHuGlZOvDLY8y/IUbI3hSDgeLs21AiA0AeL0MpkOn8Yx0bUg10vU3FPCIIrcy8z4ija4OUHIfQ=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.0.0-beta.15_1576734037577_0.25970963621579757"},"_hasShrinkwrap":false},"2.0.0-beta.16":{"name":"warthog","version":"2.0.0-beta.16","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/master.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up. (Note: Postgres 12 is not currently supported)\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Usage\n\n### Cloning the starter project\n\nThe easiest way to start using Warthog for a fresh project is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Installing in Existing Project\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Install Warthog\nyarn add warthog\n\n# Pull down several nessesary files from the warthog-starter example\ndeclare -a arr=(\".env\" \"warthog.config.js\" \"tsconfig.json\" \"src/config.ts\" \"src/index.ts\" \"src/logger.ts\" \"src/server.ts\")\nfor i in \"${arr[@]}\"\ndo\n  if [ ! -f ./$i ]; then\n    curl https://raw.githubusercontent.com/goldcaddy77/warthog-starter/master/$i -o $i\n  fi\ndone\n\n# Create a .env file with your app and DB settings (modify these as needed)\nprintf \"DEBUG=*\nNODE_ENV=development\nWARTHOG_AUTO_OPEN_PLAYGROUND=true\nWARTHOG_APP_HOST=localhost\nWARTHOG_APP_PORT=4100\nWARTHOG_DB_DATABASE=warthog-starter\nWARTHOG_DB_HOST=localhost\nWARTHOG_DB_PASSWORD=\nWARTHOG_DB_PORT=5432\nWARTHOG_DB_SYNCHRONIZE=true\nWARTHOG_DB_USERNAME=postgres\" > .env\n\n# Create your first model (See https://github.com/goldcaddy77/warthog#generate-command-in-depth for more info)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn ts-node --type-check src/index.ts\n```\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => object`                                                     | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                     | value                                       | default                     |\n| ---------------------------- | ------------------------------------------- | --------------------------- |\n| WARTHOG_APP_HOST             | App server host                             | _none_                      |\n| WARTHOG_APP_PORT             | App server port                             | 4000                        |\n| WARTHOG_APP_PROTOCOL         | App server protocol                         | http                        |\n| WARTHOG_AUTO_GENERATE_FILES  | Auto-generate files                         | false (true in development) |\n| WARTHOG_AUTO_OPEN_PLAYGROUND | Open playground on server start             | false (true in development) |\n| WARTHOG_CLI_GENERATE_PATH    | Where should CLI generate files             | ./src                       |\n| WARTHOG_DB_CONNECTION        | DB connection type                          | postgres                    |\n| WARTHOG_DB_DATABASE          | DB name                                     | _none_                      |\n| WARTHOG_DB_ENTITIES          | Where should warthog look for models        | src\\/\\*\\*\\/\\*.model.ts      |\n| WARTHOG_DB_MIGRATIONS        | What DB migrations should TypeORM run       | db/migrations/\\*\\*\\/\\*.ts   |\n| WARTHOG_DB_MIGRATIONS_DIR    | Where should generated migrations be placed | db/migrations               |\n| WARTHOG_DB_PORT              | DB port                                     | 5432                        |\n| WARTHOG_DB_USERNAME          | DB username                                 | _none_                      |\n| WARTHOG_DB_LOGGER            | TypeORM logger                              | advanced-console            |\n| WARTHOG_DB_PASSWORD          | DB password                                 | _none_                      |\n| WARTHOG_DB_SYNCHRONIZE       | DB automatically migrated                   | false                       |\n| WARTHOG_GENERATED_FOLDER     | Where should generated code be placed       | ./generated                 |\n| WARTHOG_INTROSPECTION        | Allow server to be introspected             | true                        |\n| WARTHOG_MOCK_DATABASE        | Should we use mock sqlite DB?               | false                       |\n| WARTHOG_RESOLVERS_PATH       | Where should Warthog look for resolvers     | src/\\*\\*\\/\\*.resolver.ts    |\n| WARTHOG_VALIDATE_RESOLVERS   | TypeGraphQL validation enabled?             | false                       |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Complex use cases/ejecting\n\nWarthog makes building simple CRUD endpoints incredibly easy. However, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well.\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should just use [the TypeORM decorators](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md)\n\n### API-only\n\nIf you need to add a field that is only exposed via the API that is not DB-backed, you should just use [the TypeGraphQL Field Decorator](https://github.com/19majkel94/type-graphql/blob/master/src/decorators/Field.ts)\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n","readmeFilename":"README.md","gitHead":"1d70b34f693043a705884e2fb34ef454c2514186","_id":"warthog@2.0.0-beta.16","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-N2zRDQVSPXa1HmNdnQeQ3fGldMThTDsRsEGpblBN1hymHE2Cw6h4ahRw+dp/xvw1Ej/9BNZxZiNdOejLs0+htw==","shasum":"ba8e6f804ea35c5c747bc52e36507f2f106b5e56","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.0.0-beta.16.tgz","fileCount":292,"unpackedSize":574810,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd/QatCRA9TVsSAnZWagAAZW4QAJQ6n38TFTvV4xv4ZSB8\nwRQe+3zNAY2hsPzIWwsLzEn4xxOtDHRzAD+1qkpYilpuexG6vith4kwFrMmn\nkZs3KFnbe+xorONqpeITEpLk+gYgUK+fOvh6D4X9m0GIbW63oEMqp40bZTpv\nhRk8xZ2wfJdXseBA4gT3nAOKIbi9FP9saD/yoIsnKnnDGV3xz7HYQgYioPrz\nalYK6WdGTqZBN2TtycDZiI5iNrRXcHYuNHTAsTtIkKQ0XnLymQfLt5FmHLGW\net6Ljj/I9WDxpqeN5HCWRSs/kcq4PaMPwYW+YivVcG0JUYmkMQ5MDxXEkKdN\nsXUV4pVUjWF4KtePLmWC1oIp32QpDe59H9r1qDGPHssLzB1wknAgeMRmsx40\nRLtwLJdN+VwWvPBWwPCu49JdQaN+y4bQJPALdFBEgg442e+dBxm1/N1PR4NY\nY5Ymu5A1WfwG/5+29tgMwxFr09cZyaIhIK/8FU8V8O7gZXxm+Hsij8IDZ7js\nB57CdpGQfularNhdtB3t5vSOVK+DzdPgGeajI1vOrN4FpE/AUSdzzPpTGXVK\nfEjJLPrwyvwsXfyKKlValgJjy3bBQF6awyDKxL1FCrR7UAVHk9vZzu4wB5fw\nxtO1FbWoghTvXbNMvATxP/B7CW9zYYgOLet7tKHkYqSODNdt2b9SS+6NJt7W\nz5Nz\r\n=vM8G\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCq1pHMVtkvkbVTdi4tOyA9eQJzZAKc1jvyfzp1FkG76AIhANfjbf1urVIwHSZoMbh7Zn6nQn9htVYmp8L9OTr4qWOt"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.0.0-beta.16_1576863404993_0.06503985766888642"},"_hasShrinkwrap":false},"1.51.1":{"name":"warthog","version":"1.51.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^5.0.3","@types/debug":"^0.0.31","@types/dotenv":"^6.1.1","@types/express":"^4.16.0","@types/graphql":"^14.1.1","@types/graphql-fields":"^1.3.0","@types/graphql-iso-date":"^3.3.1","@types/graphql-type-json":"^0.1.3","@types/isomorphic-fetch":"^0.0.34","@types/lodash":"^4.14.119","@types/mkdirp":"^0.5.2","@types/node":"^10.12.18","@types/node-emoji":"^1.8.0","@types/open":"^6.1.0","@types/pg":"^7.4.11","@types/prettier":"^1.15.2","@types/shortid":"^0.0.29","@types/ws":"^6.0.1","apollo-link-error":"^1.1.5","apollo-link-http":"^1.5.9","apollo-server":"^2.6.3","apollo-server-express":"^2.6.3","app-root-path":"^2.1.0","caller":"^1.0.1","class-transformer":"^0.2.0","class-validator":"^0.9.1","cosmiconfig":"^5.2.1","cross-fetch":"^3.0.0","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.16.4","gluegun":"^3.3.1","graphql":"^14.1.1","graphql-binding":"^2.5.1","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.3","graphql-type-json":"^0.3.0","lodash":"^4.17.13","mkdirp":"^0.5.1","node-emoji":"^1.8.1","open":"^6.3.0","pg":"^7.7.1","pgtools":"^0.3.0","prettier":"^1.18.2","reflect-metadata":"^0.1.12","shortid":"^2.2.14","sqlite3":"^4.0.6","type-graphql":"^0.17.4","typedi":"^0.8.0","typeorm":"^0.2.18","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/express":"^4.16.0","@types/faker":"^4.1.5","@types/jest":"^24.0.15","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.2.0","@typescript-eslint/parser":"^2.2.0","copyfiles":"^2.1.1","dotenv":"^8.0.0","eslint":"^5.16.0","eslint-config-prettier":"^5.0.0","eslint-plugin-prettier":"^3.1.0","faker":"^4.1.0","husky":"^1.3.1","jest":"^24.8.0","lint-staged":"^8.1.0","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.0.2","ts-node":"^7.0.1"},"lint-staged":{"linters":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"ignore":["**/generated/*"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"gitHead":"2b82512a4aa6619a583cf96e6b00e3b0d5ba653a","_id":"warthog@1.51.1","_nodeVersion":"10.13.0","_npmVersion":"6.13.0","dist":{"integrity":"sha512-aRyijdNn0UVsEtMJ9t1L3d59yyaIdm0EjRoeJEe7oqPgUJFO8pTYy9r1TBX18TN58SgEAw8+hVz5GJ/d2vY2Ew==","shasum":"b66d45e52cded38e4082859b5f78b5b55aaf1168","tarball":"https://registry.npmjs.org/warthog/-/warthog-1.51.1.tgz","fileCount":303,"unpackedSize":584386,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeJjw2CRA9TVsSAnZWagAAKw4P/jwK7uC9/5oWLrVlCh64\nZUpUGtZt8WAH1/KD2qESNcKQPPMoWf5WlednhBBypdmjSFVENM/ou1/Dpndr\nayXkVDrP694iKvjJIm2rjs7CqGDo5iZjg+IQgGtMYKYy9q6G6nH6RLBJJ4/i\nJEOR0UatCHo2R6uDNPk3QCMEAmre2KKkk0m3O2h3+NuUi6BQ98c/DXpzczMl\ne/0UCWrH0e7ml2si8WcsLYxeNa1PFdmMxAfB7gZcRVqyW+gebmzemLUhH2HV\nXN/7wQyOm8zHJzmt1DYoa3yaXu2QVyqMvu4U5Yjq9CpsCp3pD7m9fJKBHx4/\nIYHgcdcUbhvM9ilw7GdTwpTAjFWl1rNglVJ+2CqkavvmjoP2XKGfOXleK6OL\n8gJJ9TGBN2+V7vyDq5UsgfmCCgyQX6ewTYop88cGIc8z/s0rPRrsh+HFFEfy\n9w+mJfrlJeJvdM9+BwsupV76O/VDH87FS35hSsOy6aVHJL5BzEIOeiHiet3s\nB8dFNuFPxtqkILXzMoQxu3ZLTGJpJWenWr5sdqipcbMVLFcbrWbR0t/yKN72\n4WjnzukAl6CrVclSQxTFfFHt0fMy4VnT3ioseJ231cJLgNUmuuyz0lF1hF3C\nlm6HlTN2yHAhEhrND78vgFI7I3sw2UFMJZAk5dmv0AXwsLJ1mDeDNU3W+eM6\nfkMf\r\n=SpB4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDnDDqAesJSy+jjUGrjI7QgvpYFTleuIe9Imvug++y8oAiEAqiaG4O3lfDzmJX2zsRUHyULbtd+oKAXf/6rBSAvFaqw="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_1.51.1_1579564086118_0.9111978494603796"},"_hasShrinkwrap":false},"2.0.0":{"name":"warthog","version":"2.0.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"jest --verbose --coverage --runInBand","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:prod":"yarn jest --coverage --ci --detectOpenHandles --runInBand --verbose","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"gitHead":"5b6689efabf30accad768c9020e67a019444f6cd","_id":"warthog@2.0.0","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-7DHK3IIvj6NtMzPWPxNU86rNhO5+uh5fZZxQCYGtX5G69uIfqU3s9gTGQw0dFypboOQFS5YvgeizywHhVwzd7g==","shasum":"340cc1f7607d0168680cf855618b3415d28a3a32","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.0.0.tgz","fileCount":303,"unpackedSize":593174,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJebuVfCRA9TVsSAnZWagAAm2YP/RY1aEBePUS0fHd0jfjl\nqAXLNRxsyw9+2s6KtJSnbHBPj8L5praeFmEKjTsWlub0tkSqHhrd2HpGS3VP\nTGvVQpoww6hQa+pNmQorR9/iXBYfsS9ouyrqLp1AMzG4H7tt38QSQSgE//Uy\nQFv5XzOEi3h53o1RsNTk8gQwigDkK+wGgJFjdos51LnPeIZEb2GXE4834P95\nyjfu3m0TOlvjClq8VZejV4OB5RbSVsxgOqE49ZQ2EVF9bsVvIOYW8SL5T3R8\niCRGFHKlelNIS09GtgrqhFO3/h3Yfr1OHzebfn+iHEdR735FGZjQOg5N1s0n\nHJmx64nFFr9l+UrDXsXqEURkq7qPTOeh5JpYGOQfhYdbtCOSXOlG2WDR2U8q\n17Phx2BtbXCkk9BOJj5rd1H9tt313jPxVYhxM3ge38hX4sCkNMmKWoJ3gA/6\n9qICbQwElAjwip5n/G7mYU6WrtSApxVhoTyWTq0aQZ1RXBZes6QDcbsv3CkQ\nWrGhakkNtH/+5qF3v9/AmAg9gyYQ3fAnG5lqRmBNCH1cDo0eGKtqzhtI8Dg0\nT0Kd/B97NLAhuBSM7wGrqEKFAVyA6XKWtXDiUkJ8fW5m9/DdxE/QuBWGxRuz\nq6AnQhAfdhX5ER2Usov9MHx6myG41el8BiLLDrCx8fMsXQDtjC1IULKhCtGs\neoeY\r\n=/5q1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDZDeg4lLIEnHqhiNDnlVyhRHbeNh56PUYOi9wk2U+6RwIgGoTQJpmBFUgbm1X9zadwxl94lYbJE7dJjL2r6WgMH2U="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.0.0_1584325982878_0.8659766379672678"},"_hasShrinkwrap":false},"2.1.0":{"name":"warthog","version":"2.1.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"yarn test:db:drop && yarn test:db:create && NODE_ENV=test jest src/test/functional/cli.test.ts --verbose --runInBand && yarn test:db:drop","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:ci":"NODE_ENV=test yarn jest --verbose --coverage --ci --detectOpenHandles --runInBand","test:db:create":"NODE_ENV=test WARTHOG_DB_DATABASE=warthog-test PGUSER=postgres PG_USER=postgres PGDATABASE=postgres PG_DATABASE=postgres ./bin/warthog db:create","test:db:drop":"NODE_ENV=test WARTHOG_DB_DATABASE=warthog-test PGUSER=postgres PG_USER=postgres PGDATABASE=postgres PG_DATABASE=postgres ./bin/warthog db:drop","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"gitHead":"c571bd942404f9bc0f7d8968763c6f45b5be1eda","_id":"warthog@2.1.0","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-2rcg41/B4h74Hu7SiqH+NZy4BVGN36AXaOkJsQ8dfT9t9cOzASlivG2u3jpFwBZ14dGDO4/1nwHp/0vyi5nWYA==","shasum":"8f3f846d87aeb36d11dd2e223dfc505ec303a25c","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.1.0.tgz","fileCount":303,"unpackedSize":593661,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJecutNCRA9TVsSAnZWagAAQuwP/00tMkNpQ0LqnJKq06ce\nS51K2f8NOGfDhceO4KZc0eY2doe2A+3oU/0qWWrW9kG9prAJPvMZ/c7fszAR\nk4DZCuERpdwxXfvZ5ROuPY3WCrXW1uuwp7euyqFpLAj8N0Zi1gFSHAXMpxzC\n2bSSy27Z4umUBSFqR/slLwmnZLHeb+BHbPIWpBSEJfKS83nCfQ6+8AtacB3X\nTz+v/JtNC+xhOfZufz15e1MX5MR9upzZ2TwoIaygYjoyclrkZ+ApWLa1Oit1\nhpV8+leZz1/eyW7G1mV99DJk5L/IQjxzBgEcd1LxoMdcd4qW8dT5YmMCUcLf\nlYz2PAhT2Mz5oJSF8vfesYsNtf+6NfJ05UCPChmdBGoHDaAnY6vjH5ULX8TK\nJQgCJcZiE1B3MeJJ5s1wvVAY09XSmcykIKQM0z6rygk5twTcGXmGioPIXbU8\nDG1k14SkNQgbxENjHvUV1lYX2ePBve8Zxdy9ulo9D6UJZQ1TeHOgSHNuhLqY\n92GNenVINrbrQG/xtz0kpopgBYKlYExOV4JZkfDmSRymE3VCCWxISa+f1pHm\nbwXwsFqVFAG5sqeuOTX33u9UL/acgcOJ5ig5rX9J2cNgUf4naQUB6/jkPzSK\nWxbZNQwWWvXJId7VttoZSGT6XZGrutfyRE2eMsb1NXWdI9N4UbMMkorae3vH\n0s6V\r\n=2nXq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID1ZwEk6IT/YUG4OXLFQEViz6KhHpK29WITZjYp6cKAGAiAyqCJ19k1nC2moq9vkwWWbU9+XU9TnbGC3H7Y8O390YQ=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.1.0_1584589644677_0.8446318315705468"},"_hasShrinkwrap":false},"2.1.1":{"name":"warthog","version":"2.1.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"yarn test:db:drop && yarn test:db:create && NODE_ENV=test jest --verbose --runInBand && yarn test:db:drop","//verbose":"--verbose flag must be used to accurately test the CLI writing to stdout","test:db:create":"NODE_ENV=test WARTHOG_DB_DATABASE=warthog-test PGUSER=postgres PG_USER=postgres PGDATABASE=postgres PG_DATABASE=postgres ./bin/warthog db:create","test:db:drop":"NODE_ENV=test WARTHOG_DB_DATABASE=warthog-test PGUSER=postgres PG_USER=postgres PGDATABASE=postgres PG_DATABASE=postgres ./bin/warthog db:drop","test:watch":"jest --verbose --watch"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"gitHead":"0bc5bf6a372640371e95d54cbc7316d5281210de","_id":"warthog@2.1.1","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-kmKtcAAZITP+O1BTGDVrV5lqPJJSMoG9W8tVGPmzSftO5polVuvLnOQBKCNqocMsvEoVKEQtrcfLVlx+he7neA==","shasum":"61a1919099b43983169c74fca5892dcecd77ab4a","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.1.1.tgz","fileCount":297,"unpackedSize":598442,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJedjm9CRA9TVsSAnZWagAAs3EQAIJtFbnret5F3nACZP0D\ngBRxJ3GYKb7nPWArj9nTsvTC+KfbSf1hDF2/qLVMi1ttkMQBOU0hgH/tSg43\nXN0oknuMsyYntZcqDqdhkDi7NcMHh5l07EtU+R6tCHNIs2yqOAIHvyAcTB/F\nU+4Na7wcRbyMcNg4fL72AU8NT2JGy2GGROOBpaSg7izYdnBeXNucckvDGhrO\nysGRq9wUyiDVdZy1rI4lvJDU0yS3rNRbgckuAn52FiJqV7smhnxcCXiyYHZO\nXFlNCdxmgwEd5oVHvedmEWWZkfYSDWWYiutWMg237NxrY5Rhwf6FnXM94xwF\n82Mq+vyC0ZFsEq2BVRBfJ3Nxi+XEjcsG122J7Tb52BH8iscVwsi4aPcmoATP\nJPPOhYBkZucFnrhnfBjyFK5DBWhbj7i8cJXRnyyaXvitVDhTGUaVSBvSW43Z\njUve8pYe2Rvj1yq8aZFaZOi7MuLVhbL9ETrF0Uel6T8Y5d67g/YFJscuzPdU\n6zRMtY3ExxH74JyJb2BXkOzK1y3CThL291Msp6BM9qGqeo/JS9iBeLCvY4ld\nHoKPa3Uu/1gKKvBegHHVl9zkx4RyWUG8dBiBDhwBSAtH8Jf+jRNdDCIfkWTq\nEGPbH0gMu7OSXVs/DKvylQ8AzBGQGz+vFyu97/k4w3O4HRpeAuqdRxcF/h+z\n1EMZ\r\n=r+Hb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDHReIeWf23nCNqcr58ZRhb0G+vrtYR8vAvTtwpXWE+RwIgVdPFRKIPUQp7aK2DpO2AwTEwO5m4e6cr3nzWxOc+un4="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.1.1_1584806332945_0.14697913137251728"},"_hasShrinkwrap":false},"2.1.2":{"name":"warthog","version":"2.1.2","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand && yarn test:teardown","test:db:create":"NODE_ENV=test PGUSER=postgres ./bin/warthog db:create","test:db:drop":"NODE_ENV=test PGUSER=postgres ./bin/warthog db:drop","test:setup":"yarn test:db:drop && yarn test:db:create","test:teardown":"yarn test:db:drop","test:watch":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand --watch && yarn test:teardown"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"gitHead":"4701ac2a1b72caee7607fedbf125aea823b041cb","_id":"warthog@2.1.2","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-HEDpSk1vX5BUe8WyzVxR0BXfetYMjohy3gK/qARtajp806t9RN9EpEAleGn3dENzhBiRDFb9l2t/Pknnlyv/aw==","shasum":"a028a78f3f82b7d80a24b9fdf9878faae581a791","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.1.2.tgz","fileCount":297,"unpackedSize":599150,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeeWJyCRA9TVsSAnZWagAAJjAP/3+tsVgdSZqHPd+qB9kR\n1Q8BMCCqiLJsDDTmTIX7AiHar3dekEM1CFfnxTYQgjWlW6qCtjYVi87z7v8X\nXg9KM8aiGQ7A72bAmVXpt+akAj3oqdALAtr3OuEK3gpgzoOy1NIJJRPxe3mJ\nk9oZ+30xnDWohLSTg954tpWF4ylXGYYbLbuQxLfCLRg5l5wj6WrTfC7xe/FR\nSjl7G7JNrwpGYMiSTxUn69/MYceipops3VPKSyYJGPa3GtR2RM+c/4b2Aftb\n8eW66t95gxKZoYH2upahtDSAbNUFZ8tfyxypJlVolNxK5JFQjGISgvduQ27B\ni8oUuVzcXwrWmhoDG6yco3tfdAcqyVJfKtVVtR4XUbgjqzuI2AQCONUIVlZB\nWGTqjm/Mc0ROOJIpA98bEadLT290hhcqXJTWvFaVAuFNlFF8P3c7UP9w+8CU\nhYufr/Bfm/OmdpzSLNa/jW1etEbjYoqR65CtfuI0b6IKRaVxtaB5xwkTYx4c\nsoXfZvyOMp8bNsp1xxHRUFPHf6ZSQ/jrxqSLaOLAqw4/YawnvnGN7bKdN2i5\njYl9ZIeKyzRCrR8dMqzGmAtrRU2EochSWBqtZG7jYTxO7ltjYs6WW+cQye6X\nsaOvzhoWJ2n5oIjQ629DCz6SxlXuDs7PhYnaWK0s4pmZDvXNe1oHe6lR/CHJ\njWJQ\r\n=goV5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCI+cVkJS+/heiZx5egEpwGSYRuf2fj/qfFtQojexP5dQIgbTWozsxsVuu3c7GT8m/P2R6vG/WvGMw/c2kyo0/MCn4="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.1.2_1585013361508_0.01032891874227948"},"_hasShrinkwrap":false},"2.1.3":{"name":"warthog","version":"2.1.3","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand && yarn test:teardown","test:db:create":"NODE_ENV=test PGUSER=postgres ./bin/warthog db:create","test:db:drop":"NODE_ENV=test PGUSER=postgres ./bin/warthog db:drop","test:setup":"yarn test:db:drop && yarn test:db:create","test:teardown":"yarn test:db:drop","test:watch":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand --watch && yarn test:teardown"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"gitHead":"0a79abfb906f925e9cae7b8859f12c3b41caad4e","_id":"warthog@2.1.3","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-BMK90qVt7UgS6yIbxo7vG4xXnscyXkXLo4pRKGyy1sxRtBBCrdAlOGOoCGFN9DaDMwwUBFzQ9hCFxdKvm0UTCA==","shasum":"a9556622b163a2cbaea5f9549ada403c65002767","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.1.3.tgz","fileCount":297,"unpackedSize":599296,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeeXJICRA9TVsSAnZWagAAmRUP/1SIe1nQk7B0a8ESWMoi\nfASCVx06WvWCy2M8zyi8DzgYm91EPtAjV7Bl6ISClpqlixYEP3oNEZr4Yt7q\narLw+J0KuBcslz/UyqA0WZ/JiRWMFceAjJ9mUc+R/pdNgz2Vx27p1p6TCznk\nB1viJbwNryXZ8b+DCDx2z6/OUsQVUmTxbE/8hAqNwEffI09TEC1faoyPbVuL\nBFgsINnuAv+8PPaF4yjtZpnXJmi/dURIapzowFLucwqFsglra1XOU0i2AD2J\nD44T4AZBt03QP3aNU6cLSC+od5Vwv0J20c8/NGmNZtkqbM/Kt9MqKC1y5iMt\n+XC5rVM3QRsI7wXBJVpkmvrUAavmwq9/lCTPrCwI9fK+v29vSVvZF+NPEW3+\nSnMUOSh1rjal8XNFM8Tdr1uc/8qkWlP6/iiKBAEM/F/4jrqFMbMzcxh3yrNW\nkE8NU45IVhUZTCU6Tg4Yagj9jvTdGOyqG/WchXsMLQP32JiJqb7Qo9MQg4e7\nYh7lu21bpNsgzn2ieMdxO6dgzkj4cxW92QpebX6a3RFqliAMcNYQ2oAMLyj5\nAaP4/O/A8BVgsqea+9N821TscU0OQYf9hiXD1fQz6EPZPL4JFxRaJrqGEEN+\nkRyDsjjyKp5l79/3uP8Fy4GVNaVm2o6qCAGdZbWjfII+jfQpbP7IbEveCgTH\n00nh\r\n=hRZk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIECa4DxHX9hz9NzVk+xdBTEEcXh6TCahgliFuLhqppYxAiEA74o8LCxYV0hzD9gyDdep1nzBahhWRrzu6PCBZRjQSkY="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.1.3_1585017415677_0.3629152856432114"},"_hasShrinkwrap":false},"2.1.4":{"name":"warthog","version":"2.1.4","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand && yarn test:teardown","test:db:create":"NODE_ENV=test PGUSER=postgres ./bin/warthog db:create","test:db:drop":"NODE_ENV=test PGUSER=postgres ./bin/warthog db:drop","test:setup":"yarn test:db:drop && yarn test:db:create","test:teardown":"yarn test:db:drop","test:watch":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand --watch && yarn test:teardown"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"gitHead":"465cc94f5baa8a6c30dd746af1de6c1cdef964b4","_id":"warthog@2.1.4","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-GaOBGSuZGjfRlIeqywCgnW5YqELRbH1EHevWEV+9QQ19GDLx//N3ROIp1rq6GHSW2P4Q334x2kDfmsMWxDIDdA==","shasum":"93ec53b515fa12a9de187fa430c10f96b93e6fd0","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.1.4.tgz","fileCount":297,"unpackedSize":599431,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJees4aCRA9TVsSAnZWagAAWdgP/1ABUWLJ2m0qnbiHglKl\nN4tD8PPZIHH+2E3HIsDjMiGD49/oikt6O6gx+xhxyANlsZnGBIZAHZ9y0UeT\nKn5+N9NwOkxiImxlKaD+xDiTKZS3Pz8rGfXJzZUA0nY3c2w237iao/1nzo0+\n36VHwjuOKGQwu+AQhmpioKLjDcZ9wZjSDmN5vHgSsRI6Pg01xNKmgu+jkWNq\n1vMyOVoyBoBYzsbIFIGh37HJo0+pTinshUnrvEVpj1Cw91RisERwB0jufiHL\nOBoRF639rU2BGWP5THasqDmz+QtgbDEjW4JR5hbnjv3diI51GTO2K/SAHeSD\nEdgXionCenrAVKuFzu8MOFsvTirAH3K5oEAvkssnD9Twa+de1RnXfsx3iw97\nYaxsv0YI9eNcp9t1hmaj+sckZ5yQ/Ids3vAopJaSyX7hea1A+VGyXKdRMFPB\np8i8UDJyq4g6ykxLSZdXYV3R1uhQICf5P+KhFgkApGQxlWO7tdccErMbFimW\nBwvHllBVv0G/bHnPnkD0eZ61lEedqoAGisS0nTwV5GQqXNnfuSQMY78llA0d\neHxTGXjf0O6UxT93mKCYXsK2mayrYnCqUblvDAz+1mhgEl5Pux8A3jYnbzdr\nEbLSVmE4u4iOdo7/3Jh//RTy4WMXvHz1YcfYbkogodOGXKUr6GIuaP3S1o1z\nQdbJ\r\n=hj/h\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCWrx8JvLqOfJlsroL4azRaLL3+D7aDzCzaGTLV/qlDJQIgOVIeCimd907r1OInQGM6D0Wxy2MKT7gFwMlk1jZIhNI="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.1.4_1585106457773_0.2688795572737004"},"_hasShrinkwrap":false},"2.1.5":{"name":"warthog","version":"2.1.5","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand && yarn test:teardown","test:db:create":"NODE_ENV=test PGUSER=postgres ./bin/warthog db:create","test:db:drop":"NODE_ENV=test PGUSER=postgres ./bin/warthog db:drop","test:setup":"yarn test:db:drop && yarn test:db:create","test:teardown":"yarn test:db:drop","test:watch":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand --watch && yarn test:teardown"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"gitHead":"89ca6ba871bbf30ddacbe2884c6869323a6261ac","_id":"warthog@2.1.5","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-x1ZuaCJxdmZuFmgRT3T0eEBXUAYrkiDJ8TFVyqyPh9Ob00K2eQN/jVcvRsAP0WhjRZ0DcGLc87ITmkMhaBwMfA==","shasum":"c5520beb65f57bd1d96094e5f39c77b633b960bd","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.1.5.tgz","fileCount":297,"unpackedSize":599459,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeetCLCRA9TVsSAnZWagAAXAYP/RGte8SzNY/CdtiEa2Gq\nta9ZQaDUCPhe4P1tEJjPwPulZIdBKUUGafTGap/IxsjnDKxiFXJimU523+Yc\nfMXehYJZK2owzCXYYurfnDsYWp7L6hRnDZYj/LGFn8vjDXWt67WDfYeTKF3N\nTsvwOt7NhV4fLNOc322EUL5zvBjQ140eBdiMdMKMb6IjIHhTe98yrfuONm1d\ngy3+VLuMdmJ3AMmezdGGIrjhlM6Y9m2SRL6rZiGZd0rszjHsNs+2GGkNMYvX\nPHH6VPRqN2dwkXAM6IQTTleO0MSLjbdGhP0Y9eVEgcBbyWRIXU4koZht8nCY\n3fwRzl6MZE+4bl8b62HkS3yycoDonk+ksPQ73TA3ClspnKeROVpJ+59iLsU3\n3kvsoT352+hyIirWAJ9TcbchywIVgvMyDQrEzJDg4QlJWt1ez/7Pww7Aezo8\nuBfRxYv82V07sZf+k46c93PSs0wElOuR3OZFLjQpnDvJWsdDA4fFz/i2J1Nx\nPnSJCz0zbk/HDTUEQElGOlfAcYet+rF4vjVNHF2kodvjODqPaATmcNraRqAM\nVkseazX4bjq5HCvc7vXQt44rPJQlLaEURxr7vAjTdjya/3GWY/vF6Lx0uRq5\nRo4iOfebr/8NUSmd+TMLTq9JcPuWPGlrXxZrJtTdxAXF1kQYOCny8gsjV/wD\ngNcd\r\n=rgkz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICqGS7Fm1AQXLKu/uRdnU6ouKn8GR/uckvGhz15iT/WxAiBtRcZxr3vWJkYR/JGf/jo1jkAxHWoAjMS7NP4QPX7TqQ=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.1.5_1585107082856_0.9546291342827449"},"_hasShrinkwrap":false},"2.1.6":{"name":"warthog","version":"2.1.6","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand && yarn test:teardown","test:db:create":"NODE_ENV=test PGUSER=postgres ./bin/warthog db:create","test:db:drop":"NODE_ENV=test PGUSER=postgres ./bin/warthog db:drop","test:setup":"yarn test:db:drop && yarn test:db:create","test:teardown":"yarn test:db:drop","test:watch":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand --watch && yarn test:teardown"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"gitHead":"2c9d16c210f69f46cc4197b4db008035424ca399","_id":"warthog@2.1.6","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-eOveamKnpWlsv26KAWmXnnIIsUP6Q6MkSt/bB2tvRe7fJAE4C16jQbyzs/moGtoR5YT58lP9ndnTVZfyo9USOg==","shasum":"1058b7f6e5bbc556e6741b0400a3a9be28ebede2","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.1.6.tgz","fileCount":297,"unpackedSize":599767,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJefABbCRA9TVsSAnZWagAAOTEQAI2RlUeX7BqdGTnyNZ84\nFaZKKNN6UG5/QtOkd0321tkIe7cXemhE8SeIpe6NqeuIry+AbBjSSWJxQvxP\ny6NRPvhWAuN6688IZ5B+Pr79enbc1XtO1IJDe4ZYpm3iWGk9BKIKXAf5q4cr\nS/BdvEKB5n8Z6RCMch82nYrGWT0wCqBpPruBfwBK1yzCyA1+D1eX0KBiZ5t7\n5vqtmkO4vI2IhSA2fKv3dd8rJY6RVwsAZKbB9s1mICaQl/fZr+3twFrbto77\n/8FyCrs6LCgZwXTfuXrtIeYgcLhXvVtshREdR0XmIvfORkgivz7H/1v0igPu\nbPYYHfadJH3z73UjKVbA4asb+Zzs+jVrvZfACZ2x6ufvZiEQebQDzA3t+lcr\nmCnHplfLrvnd264jRmsUJMB3Wgjt93vXiWfsCarvyOSIzok66femKUshUHs9\nhlH1eFz+W+gAYlXx7lzy8pH1fHQIRxibWf4YwsUQCM1hB8wXdBbrk9RLXPhs\n5sX92eaGx2WznRZPATKK6wXfi4MGBUt31kmblpn3vr4Cuc0dEmNYLA+hP7ms\ndJMVCO2fHwWcQgUjgpNM9A42Ru3tlwIrtbmZRqtwIagrlq9T4Fv2GV5N0sJm\n0/li4VeS2iNdrb3Gv3DviujYC23Hycmh/CgtF1AGsTnAuNoZykuQvsxBvwof\nXJW/\r\n=zUkY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHQV5dfywPWhPkYZaBtBItRphP6KreEO4p5LovNSUZeJAiEA6z3vZ9PAxaU8b2lp9ArjZoVD1XSWVjngZ4Ki51py2F0="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.1.6_1585184859240_0.6078213186349257"},"_hasShrinkwrap":false},"2.1.7":{"name":"warthog","version":"2.1.7","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand && yarn test:teardown","test:db:create":"NODE_ENV=test PGUSER=postgres ./bin/warthog db:create","test:db:drop":"NODE_ENV=test PGUSER=postgres ./bin/warthog db:drop","test:setup":"yarn test:db:drop && yarn test:db:create","test:teardown":"yarn test:db:drop","test:watch":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand --watch && yarn test:teardown"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"gitHead":"c69ff43b9acb13d54fef9ec145d4aa0bbd1722c8","_id":"warthog@2.1.7","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-N7cs7jgdjUDi/xyH/ZKX6LJKqK7FOzHRRemGeFOAjcku7NqfV2HifS64qaxVkVnX9L/gOBkl6b5v/1OIdHwDdQ==","shasum":"8e9256eda2f933414f0aedc80caddd854164e608","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.1.7.tgz","fileCount":297,"unpackedSize":599552,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeh0tzCRA9TVsSAnZWagAADnsQAJ3mXJO84cl1tVRYlWK7\nEmpJEqNZwztRuivAWiwRWrhYMyHkCqVUlgCXRPU4eQ8ZplW/XLG80S7pVtmA\nmwF1yNsk6KLy37QFCSV95F6B1npY0wMigf9Myru6Y2H5uWML83E0q1VKTIpQ\nt4xuCN2+w6dPQvyO0V45nvgRZACVmvMDc7AtcyeFi5MizcLj9pwWcrMKvaDz\ntun11nlsFiZJAYFBpARBeBMtAUbFS7lauA1VyYsyYb079Tc3os4Je0vcfR92\ndWS3ouJzMO5TbUpyxOlq5YKWKoJ1ryj6yrIT00MvibF+hkPc7/YU/NN01XW0\nMTEHjlPKS09/eoGzA3tHLNTiXxah4ZkY2kGn8MHIBPJg5ZCDBr1Vv0dVOQk2\nmKccpKzzkE7t4C+eljTnICc8XzIWtxPFvBo4j6adtTLSL4bUgfoPj7dIio9m\nye7v+Nfu/nT4el8n3WLf7Jco/H/SYq9XN4KC7LU8hR71zHnML2hXbVw1m4Zf\ndn5zpTuETt4xozzpGNy3yBjm4HAD3pF1fObsd6Gn0+tHrX5Lsgh/c7vuHNdf\n5KcV8an/4T9GIsHJA6ObKKF8U5C44fuM13qdHfXNdmg5kREQG/zz8kG+D7QH\n4A3ciNJ6DaHQ+oZlD+WiEInpOvgE+UjGE1tEukHB4sZT/QzsGJRxm539oeuS\nfUKZ\r\n=A6wc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC+fgb92WPByCnUwLM5J14EdjYSNwhKJ2trTKFJUiLMEwIhAK91OTS/66T2J2dsZMst8r/tzU4zA1Vyi7d9KYbT+2UE"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.1.7_1585924979276_0.7249489515930425"},"_hasShrinkwrap":false},"2.1.8":{"name":"warthog","version":"2.1.8","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand && yarn test:teardown","test:db:create":"NODE_ENV=test PGUSER=postgres ./bin/warthog db:create","test:db:drop":"NODE_ENV=test PGUSER=postgres ./bin/warthog db:drop","test:setup":"yarn test:db:drop && yarn test:db:create","test:teardown":"yarn test:db:drop","test:watch":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand --watch && yarn test:teardown"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"gitHead":"a3545871b1a3ed2a283d25f01d20ab3b22739bdf","_id":"warthog@2.1.8","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-E9XanHyQDPxPwPEiP2WnVX1P0sLqBmVDTjdhAoB63R5ftdl2B53nDcnCCJGVv9jrzydJ4DTO+xiLigCNyJbwMg==","shasum":"730236ba890c14fd8c85b10afe4701bd3875a7ef","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.1.8.tgz","fileCount":297,"unpackedSize":599910,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeiegZCRA9TVsSAnZWagAAQkAQAIiWLb+bHT2OABSwxwwa\nWI3gzGhD4IFZWJycuY5/U+SJNFw11PrdZEKEHL/+NDhhcsQmZvJPcZHth1FR\n8cLKte4PiKdAt5muuLhM3yYH5igQpCyb4jBT0JKGWkX86/cfZkXLmkgWlrlE\n/HGxP/c+Qe39ZI+wFa4r5uDRHaD/ALqnm/LdhzMPjIO3BQLM1q3AEEVem9sn\nqaTTXT1mRAxCqAyoIDsetWqFE12tOB1SUy3vdeV5oUXUGoabx6xX5fAb1OPL\nbLVGYBDM3mPO5559D5hribRPHFKuRlrNTbPZsFXNFr7HCKymjOKXWec4xYA1\nZbn1IqgOWbHVvkdAumqhlluRaf3vIsExA0/0QiUZr50QgNPoz3E117I0QM54\nexzw3tAeRhzKCoPATh9hDXFWIa4jdSnHDCnGpjHTwh9zHFs/MHDMbqivto25\npwPNTWBnB3q2YrfKGuFgaiJZDC79I30kwRYmhhpD75M6cqFcjYoKepQpTLz2\nbilHuAV7Z+79ptSQ4t/DVzG5BffJ/xZPzSbLO3IJSM7qAk85s206MrIhft+L\neeKE9pPvKBdvkQ7Q3TJXqyuE9x5OYDnvadh+sSg36UqSZOKYFB1HKSjKhJJg\nWaLdOsVNJ3JKIqDEl09sIHMcC05x/QlkHHb5H6BzsGDx9MQXI//sF+k6UQfu\nBLCX\r\n=1inR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCnJVMxn55tJjJ5bODnWxLWyi4qL8mRW5fDM32tSTOj0QIhAPbRrokeTexgP74o4PBrR3O7iDq+33WSILJEqWLVu9Dx"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.1.8_1586096153200_0.5597951549229807"},"_hasShrinkwrap":false},"2.2.0":{"name":"warthog","version":"2.2.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand $1 && yarn test:teardown","test:codegen":"./src/test/codegen-test-files.sh","test:db:create":"NODE_ENV=test PGUSER=postgres ./bin/warthog db:create","test:db:drop":"NODE_ENV=test PGUSER=postgres ./bin/warthog db:drop","test:setup":"yarn test:db:drop && yarn test:db:create && yarn test:codegen","test:teardown":"yarn test:db:drop","test:watch":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand --watch && yarn test:teardown"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"gitHead":"ecb638c8a2e54a953edc0da31989c6f6bfa00434","_id":"warthog@2.2.0","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-Gme2UpXs9yF1sCsdLtEmR5MI/L5bhqCsOSJ8F9+LCP1f347/No+9yTPEaHHEZDU4vjRFZujrce0FqtdHn9/Vjw==","shasum":"0ba045fca5860d4396ca840b3689b6e4a81a1131","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.2.0.tgz","fileCount":300,"unpackedSize":622536,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeie7mCRA9TVsSAnZWagAAFEMP/i94OAy3fcacPHxpZ0Au\nvJK6dyfoU7c5e6jxKcmG3n5Y3k+eHbdd5eNAzTDnVnxcRiz9vmiKXYB4dtmQ\nv5IxbzDaNcFTB96yfHuHQJPwVFqQg3+p834B3tqMknAMHIzDJndx+qhPoRTx\nHp3sKi5Tlpqi9fiL3o2yXHVIUPVlCPPbZMi6erNe3T7AK5ojnDkeH9VnIUx3\nuZGRJD5eJVfLONtBwO5ALrg+kIDlzygneO1hROY5ePcfaZzy4nAM4I6amPiH\nJjzw/AXXh9JoiJZsykXllHsnapcQAzHzo6njxRe9pdd5TBjRkTIKQS0os2vh\nbnS/ZGmA3hN/QIwLZ5IgDo7i60G27AQ4wliskdP3znaLAz98IFbL+QqnqdYN\n7a0dgC8atRxS0or64NDDZRkSr5LFzBISc200qAlPXJ0yF1geELb+5WGevLfl\nDogD8OqMK1Vc4La+kSqB5vFWk39Pu6gaENPVSfg5k/nBHxMujEhgBIzpzzLO\n4SLOwgSyz/c7QLPjIl/eP1yM+3vkxvduoTGPC+ww1Yeck+X14AIOjgz7tE45\nkLG5ZGHOn+IvmrhgvXCv0PbzIIaY892WHIHMENjOq5fkvhbtB1M4bPXFhLCg\nMlFHP5LEJ1zB9i8TNZxR7C3CT9UZ55OMwRxH3k4AJUtz3jImX3Ftc24v/kDm\n/+zS\r\n=EoND\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDmWA9U0PhcE7BJbttYfudXAsQNNIplVqZiPcLxF5/hZAIhALjO3JvL/inFGJbfA3Z3yI9W5jU3JVXjHNeKN9QxXL6b"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.2.0_1586097893925_0.0758361563051837"},"_hasShrinkwrap":false},"2.3.0":{"name":"warthog","version":"2.3.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand $1 && yarn test:teardown","test:codegen":"./src/test/codegen-test-files.sh","test:db:create":"NODE_ENV=test PGUSER=postgres ./bin/warthog db:create","test:db:drop":"NODE_ENV=test PGUSER=postgres ./bin/warthog db:drop","test:setup":"yarn test:db:drop && yarn test:db:create && yarn test:codegen","test:teardown":"yarn test:db:drop","test:update-snapshots":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand -u && yarn test:teardown","test:watch":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand --watch && yarn test:teardown"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"gitHead":"7ddea131eee0a8de4dee63d56f37a82fe74de762","_id":"warthog@2.3.0","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-gTYXWObZXyC4zrelQvaCM5RqjlX/vHRJTtEn3VVJDDFFM2iRvXiknQILXm2spzYNUoCaFYXplxUIb60W/6laoQ==","shasum":"9d3eee62c3b1a79bad0c0a2bc8328d0e8d087d34","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.3.0.tgz","fileCount":300,"unpackedSize":624132,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeigW2CRA9TVsSAnZWagAAfuoQAINjaNB+Ar0FZG3zc9AR\n7wxXm5ebbWUxjZxeVOi9L7iouGc4vl8pV4hn4MvumEDtteNHD3n/4nBgO/P+\nksVPBlPWVhKqWlcRGEinWwIenuVpVQQlXeWbHIE0M2RZtuIoTXpX2dN7Bupo\nqHBqOsVxQrAO23c/aeH425sWL8dut+/9v5tHRK9VcKRTGfngN1v8OEd35zTW\np1F55v6BvB01xZRcfhbcG4VoY2xq6RmsZHOy4uJT6uh8SDr6EBUbatS+mP7c\n9Z4jOXIqeOcuM8459QJ9X8PqaUFRvDs4u7X1LGv4yfH4yLrKlYQVPR1M8nla\nzJj3VReI+jmDA/s7ZIZ4IYUVBEHznq0BTVDfNHs2TCz3rIrVEnDkYxItSXBx\nTcAEVvpJovzL2ZjFFaU+pLjZA8cVKJNrjxk69WmtXzpvhPrkcmM2lA36fvc1\nqXhu8Ca9DwW5LNUSfZF01pe24WEkH3a4CppoZFLWMpdyWLUR8epZ9vdxa66t\n8BejId3+Lb/8nGOvJlU8vCwmps92+21O8wP5n6TS17TOOIFjlZ5diWDwOI2k\ng2x3dKE5VJY4LNve55P2eBRJZcig6a5xxTyUEuPYAuSf0C/dL2PAXcEHfw2j\nVVcAfA3dbMrGqUmLkADiod7t8gDF9GccaDWzs4YySyCHUkVThVT0A9ZmJ4XB\nbl3G\r\n=Pj5H\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBQ9k45ixM8D0iO3jyDXF+C4BJW0/soO/PmioXnouxypAiA/C7CxorPfAhyYum6dKpI73NqdjR4jy1V7Z81Clhk2aA=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.3.0_1586103734250_0.8356247325690107"},"_hasShrinkwrap":false},"2.4.0":{"name":"warthog","version":"2.4.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand $1 && yarn test:teardown","test:codegen":"./src/test/codegen-test-files.sh","test:db:create":"NODE_ENV=test PGUSER=postgres ./bin/warthog db:create","test:db:drop":"NODE_ENV=test PGUSER=postgres ./bin/warthog db:drop","test:setup":"yarn test:db:drop && yarn test:db:create && yarn test:codegen","test:teardown":"yarn test:db:drop","test:update-snapshots":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand -u && yarn test:teardown","test:watch":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand --watch && yarn test:teardown"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"gitHead":"ff241650759e33bab7d49282de81ae6a03de3611","_id":"warthog@2.4.0","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-GGKVMzZ3GqFRs7k5cvWbCrfOFv04g5Xg6qyNhpdfW8fOF96Dyd5f4lUpGmZbAJn4mI4ayxsPszw1J2C8U7DrVA==","shasum":"338c014faff22f7b1ed81c6dcd77ec619bfa0003","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.4.0.tgz","fileCount":300,"unpackedSize":624126,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeikSDCRA9TVsSAnZWagAAr74P/2LLIxK0NveJ+MjJ4Vts\n5DXaZIngV9MkKd8rLJA8S+apcFPX5Rb7c213t7bdEUZ+d1Z+aadq2fZgBZHr\n8NrFbtBXjQ69NnTmfRGicQYb9cadNLaXsZqMiGt4UtyETsSPts6cW+NLSJ0+\nctmL776tXRbFlWioUEMByIyO+TYQhbPWhGaSmAlhyJRMM049JSJ1jL/Q/Xzn\nDvpj/1YYSCoVjLkA6HvOOkV3dP0sXkcXaVIrChNP52IxyP4VjPkVkXQrMIEZ\ntBS0h+ahCnczUV/7Z4Gw94RYbaRxtX9DTbaGqGPI3MDfXlP+UtJsyHURq3H8\nC4bxY+xc4u9TZktS1vq8Mqos68xSBojCqf+DUO8OZNJLMUOgHh9zkUliJyq2\nuNj2OwmoCUEIkbDooPMMH0Ky6jvn5YZqSqTpDunw49B7fA/r7HFs0fMJUEb8\nBEQv/VBbBCRsQWV0tiQ7BC+URz8b+Oh4T3+5OU4hacq/gxRLCTIetc3TRCFM\ndPG+51UsDOZ3dS9NqoX7KgPeu+omW2zIdVoL1ENR2MW6vCA42VhpH4r4IA6D\nTUPrXfHK+bNdDix8STlbLNDXo8DDdpRpXtwWhxgTGzyV+UbQqdjDbviOD2qk\nYId5V92FAJdsVqFgEwiZtJuCgGu4aqpS2rgcyNpmtRb8KUYu3mxucwDsGkh2\n7AWH\r\n=Un0Z\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDQfUHOkh+h+hxMStohCJHzB9a+MgmOnlEriD0fp+A0eAiEAwycWrVxWI6XP8MXmfTphbJTdjWcsGjwP4+coy1gDZhU="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.4.0_1586119811051_0.6224180985498156"},"_hasShrinkwrap":false},"2.4.1":{"name":"warthog","version":"2.4.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand $1 && yarn test:teardown","test:codegen":"./src/test/codegen-test-files.sh","test:db:create":"NODE_ENV=test PGUSER=postgres ./bin/warthog db:create","test:db:drop":"NODE_ENV=test PGUSER=postgres ./bin/warthog db:drop","test:setup":"yarn test:db:drop && yarn test:db:create && yarn test:codegen","test:teardown":"yarn test:db:drop","test:update-snapshots":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand -u && yarn test:teardown","test:watch":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand --watch && yarn test:teardown"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"gitHead":"077cde166b2374945ae8fa44bc5ba40b8c287a97","_id":"warthog@2.4.1","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-OaqnUwXYpfgbLIRsHmdmCGXH8VBCGTvTwo5utkwf+oRDX9Lr5E8voSAMJBzWv4N/eimof62ie4kxQKkpjY2HPg==","shasum":"147d57be1b9065a04138ca2adf3b5dc432f75740","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.4.1.tgz","fileCount":300,"unpackedSize":623597,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeikfxCRA9TVsSAnZWagAAeIAQAJEB2keOOnsTLs4uEu2/\nxCrrtJeZieYvzBSl8z09vzexuJ1VYhOQ9S2EQS3sX50Zd7tXCtkwzIG6cp1R\nzvYs+inKudlUegkmmytMu6CwFB47Mdxup8HZRlOuJyz0ihzilv9nlnrifHQO\nM0RiFJkQVjRcbPFpJlSK5jbRMTE+sB+kSBoOXwViTFGeOQHUMywWEMBIeFdf\nhBBy0FKU4St4VeEyJ+mSkWgq9Xs6pV+Z/5ShJrTAljLqoGjfqoeVhfVF+e4m\nB6vywKQXZQ7v48edhrqnvwa/aVHw4BBLY4/nk1vIa7CeMqM7+dc/Tw9hG149\nVPU+LQEyp2powQ7WdwRwzak74kitCohVpiSdFyAUKHyxpPSEmx8g7r39+Ci0\nW2fFVBiqk2lMuVOzbmKQaWGRyCFQFNjtcll1KgA+ubATlt7XoOKQEuAR7a6R\ndZTJJIeokLVKIkijEhfr9h11TbBcP0PKxPVZuFdGMX+WQl6OLIkeqmfQeN8F\nwUZkIQo+PRveVes16dgmcdlPTyDQIH5RMwje8HE1VObBS0YWhbrGTzWASQ3H\n42YcujsP6BVKQ1cKeb14L2b0mBMGD94ibPOxZsnsDU3GtLEXa29C7GkGGG/c\nkkHocb6VaEPWzFIpQnbl+jqCVh/HPHgNI6zdSWAn8xQdG2xEVjjSxlVSegaj\nHcKy\r\n=+7CI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQClDosJrXNhiCgx3geKflcEp/WnIK4dcNZYRG/FHn6JYQIhANBOCj/gHFNYJqNN9Tu5wQzWV2DSnFzwO3j/VeP9FhPd"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.4.1_1586120689037_0.4380900876279461"},"_hasShrinkwrap":false},"2.5.0":{"name":"warthog","version":"2.5.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand && yarn test:teardown","test:codegen":"./src/test/codegen-test-files.sh","test:db:create":"NODE_ENV=test PGUSER=postgres ./bin/warthog db:create","test:db:drop":"NODE_ENV=test PGUSER=postgres ./bin/warthog db:drop","test:setup":"yarn test:db:drop && yarn test:db:create && yarn test:codegen","test:teardown":"yarn test:db:drop","test:update-snapshots":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand -u && yarn test:teardown","test:watch":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand --watch && yarn test:teardown"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"gitHead":"0de5f91fa4e50fa36dcfb11f2b2d2e4ee1516d2f","_id":"warthog@2.5.0","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-scUOqwfouXyLqqQAuUetQex4aiyzUuGHr8o4EJb/JLHK+Ir+HPHwwkRfr1q7senGE5PtDSzyqw0zbX6SIWDv1g==","shasum":"70e96f26e98e6409c1e8723a3b134f07ac477f2c","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.5.0.tgz","fileCount":300,"unpackedSize":627187,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeilO5CRA9TVsSAnZWagAAJ4IQAJoK8ZNbF23YcFUR294J\nk+WQMYgtKxua5cyA4m8ExsQ79Bbv2S8BfMtCltbYIKOqeDwHXSpfLF5SHq5A\nLtvrZhclBiTEianzcu9ILps+XdlYzLmfrGGvftfAntLNxIJmSIytIu7yS2Dv\nCh94oS4mPpAje1jc6vm06THFYv5Jakco+qvVW8sE2gy+496TrFXnym2ELU73\n059eWh54A5KUhr+j1LMZx7kkIU3q69tT9pWieFGnUdW0nL/YcX07/g9f1bwI\nFcJPJ97QK338RY6FfwCEvKtGUjL/vLuOhWjsDBmSD+5JXlkSn0EQB/wcUv29\nh6VPeE7Dd7RQhHglR//XfeAAAyDPzxiQJUl27KHVG4VhXeBwPuLZYOVoXSLN\n4EDAoafrO58Ur7pie/gOgKhKqmUQ5NVMPsSy21IDW8RxNZCIY1DP2n6ywVtM\nlLZ2shU3DVcZ9PyHr1Pptj6g65G/T3JGx74IYJoWReQz9CLMs/sGEc3bXgZq\nxtV1WQFhwC4VQ6Gb8YCzR8dHrWmcCKMBDMe/VJqAdyPo6fnBf76dcULwPZsF\nRJFOqUfVSB8ka39UmQP53N9jwKhSHg9YEO/MuXn3tT/1eS4lhmayOQ/n1CNt\nS3X+3vhyYQDzhLIK1XfeuJ/7gb4i65JeVldCTVq976S63J9EV7H9Fc2y23CA\nyJzg\r\n=+Ccy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD5HeoV48lqZfZEYAuQD0MJnH3DrQMS3UEsBAO5zb1bQQIgZSgO8dKmNpqD8BcRZIsobvvon2G5qgViT7rXMaPXNRk="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.5.0_1586123705240_0.5549313497978692"},"_hasShrinkwrap":false},"2.6.0":{"name":"warthog","version":"2.6.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand && yarn test:teardown","test:codegen":"./src/test/codegen-test-files.sh","test:db:create":"NODE_ENV=test PGUSER=postgres ./bin/warthog db:create","test:db:drop":"NODE_ENV=test PGUSER=postgres ./bin/warthog db:drop","test:setup":"yarn test:db:drop && yarn test:db:create && yarn test:codegen","test:teardown":"yarn test:db:drop","test:update-snapshots":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand -u && yarn test:teardown","test:watch":"yarn test:setup && NODE_ENV=test jest --verbose --runInBand --watch && yarn test:teardown"},"husky":{"hooks":{"pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"gitHead":"11ae817411b62d4f9e63098ffdbc48700aa64d7c","_id":"warthog@2.6.0","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-I0n+8+FULUqO464FVgfC8wLgqffsINWZ/4NNjBtbGG2whdn0vWOrg+FwyM+haY5jnncG3jtJ3Q4j1PrfH7xGiQ==","shasum":"cad6373a226b36a695f01a409ce345f570d11710","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.6.0.tgz","fileCount":303,"unpackedSize":637420,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJejSoJCRA9TVsSAnZWagAAoJsP/10o5qNCsNCAyuMWFeWY\nrg5nr9OkjoltIqvkkESFWIr50HbaNXknLKSe16fERHzBnenh3zgP4YY1qyE1\n0B0A5O3/SIAmoQBParCAnXTGX9qoxjqDcGgIXsyVUXr0ZWMqpScphO53wkkn\n3812jKEwK1BVttxRXocVOCJzOvmp1/nttXi6RM9DG42JFiMLe7cNBzeRde09\n9isCpmv6cVzXY9o2TGcaKQ766kM7rfRFdCRurulhpJ2AuubYOiqvjIzSeIna\n/V7cTiwMfm4M6350MOMbuZIxKxBonROQh/XRolEMdQAekh7Ix66h+6FWHbym\nlzRMQ0WcJFsf5hETL+yXH/s6p9k1e3nRwQn7qi5jy77rVo1x1Iog5m3+6Pgy\n1U0JPGlpkAQW2VSOmEOtexjiQlu+WBeaH23p7AomCFmyKJC5FdcoKVTBP2nZ\nfWBfKkS7BEtfDE72W0IwAfUpddH/6TT0WXiVBUCQFjS1yIqf5xixuGQuWJZm\nnMBSXzhmfLdSvyDoaFKRjnIlVVn2gTPYrh/yaWZSattQLT6evjdBKhTWewOu\nRQTFuXr3oIevK13eNHGq9/UBOoXxfcFC65eSR0C7rSK8Sy0Z64dZAyjrmftD\n1iv3VZAeIugY04HKJOQ54T5DNQid0Ea4+cQ7uyD4UU2cj6ST/zEBel8SWMBx\nckts\r\n=jhRo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC3x6SIacoaHGzIdSAFCHfKJOjvN5G8VtyLd37kP7S7vAIgGtpWp+qSGZG2UHfrtMf0xsuxG4FG9FT2uhCmnL+GAWo="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.6.0_1586309641150_0.3535365550153957"},"_hasShrinkwrap":false},"2.7.0":{"name":"warthog","version":"2.7.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"gitHead":"e8e9a1ddfba3b691eac8dc29e1c2718e5901b507","_id":"warthog@2.7.0","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-MnhW4HB4l7KrnU2FXkRNp94v239Z1MZf7bmsFK4zSsvCIKNwB1JGGQuXMpAIsEGMwTCVaKd+oDa4DrkYjWXahw==","shasum":"63c44d5de9d2006f4d040aee2a3bfa7c1b205634","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.7.0.tgz","fileCount":303,"unpackedSize":638479,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJemxeCCRA9TVsSAnZWagAAFPwQAIM5UP4YIejQNHP7SWSq\nOQzt9zuOu4UOXaLYWwUugYd9k7Zor3B920SnO2Tww2mqlqV9MIyoIr3kxHed\n9+HSOqsHiDSh8vpBaE23x6mSa6ehyFfXLryvRgfz0cHaLjyB2KrNDoGzisxN\nGUZKbbo9saeaaT5V33Lu/43Hra4TGFd7LINLzKUOeR7jgLoHUUC1oJoL9GOE\nGnLP4n1PTwTd5iDkdphbqjxzpGes4kw2EDEzcSAh2A292THjqP7PJHjiZX4U\nc9DbQ6AOig0uNWYPjVnGgqNz6v9YPsjIeSOMKXfWnOMzRFoPDJ63Hchs0rtl\nStNCDYYhpnR6hpCVOksB26rHByr1JiRlKltHa6KIs3kyR8X4HqssEJU6fmcR\n3ct6gUQA0Z+quXRRi7h46nhLhirpup0fGGDn0HY/nDhblkjoxUf8g/WXLRHf\nvS0mpt0tDOc7y0fSz4Qg4VNs9Euy/F2z5r/HYUoDOvE1IvZbsbmF/BMdBcNa\n5HYteJejrJ4r5NFrVTeTo4vhraG5qJHMi7sqHX9V3eFAOa+E83U9KnBzORz2\nHhr5Ts4Jc+cSRjOHTuZf4kj/fHrZtWwHjw5xVKcc9WBGoQauKY2cvqfNMyrb\n+N2up/Am9ItLnu793bo/Tz274iSghGaeDQPKFqJsv8Sqyc0U8x3X0HsUf9Yx\n+pMg\r\n=6/HE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDbqdE1Z2hKESWf0+5g7ueg5gc8OPNMiD8sIkMYCbOCeAIhALaYzAVvXhAnjghtziyRLSsh9VlS1+wHrXxcQc2jQTDq"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.7.0_1587222402153_0.07223369118132084"},"_hasShrinkwrap":false},"2.8.0":{"name":"warthog","version":"2.8.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"gitHead":"7856d292f8f1a41db5d9f9942d8d5a25cdb0c07d","_id":"warthog@2.8.0","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-NDnbfSDSMGl9MK2lCFnXGgPV/iqLiOagIelwIFtUHr84QzlZK9ezwEqINqY4o/gh65obRi7mNuO0aLh1FMId1g==","shasum":"0785641e3ffe12a3a8ae157670e1dc88b7894a8d","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.8.0.tgz","fileCount":303,"unpackedSize":639897,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJenPX8CRA9TVsSAnZWagAAoAIP/1mh6DuRWFuKMjazUlpd\nGrf7E/bO9yka6P6Dw/hGqxW7BLkbAauXHJbSGdnd5SdF4dMOgd4A0aFb8PNW\nZK0N3tya2OqY2YeoPxdAGC8N/me8Th2Bt+6HeS8YGD4H/fWfBCX1gm4wrG6S\ngtSjfKhIDyM7CVmlwLYTpZG+E1SC1kMM8l7BE85l1tlOEISMvX+Ofoz5loqA\nAa75cFMeqVmxyBrl3P6kj5hu6OXZESeaJAnndiNl/LIOhfL9M1JLzYrbn6U5\nhWACCgDSYaOyraj40rdspkcjxTMJ3fFAOIzejCwWXbtp6gLpJmdNoj8Zzi+7\n1GoHu3CYbr64sOXRGQd90VvKkbLWZSFIB43sOJQjh//dqOJnqpjOegiJgd3P\nNU4/VvXJUS3nKnGMnLLtWBzt12Qi7XIs2bFvs6IEcjcQLEDVC1ypBa6WdFPg\n1A1eEXcTuPYmmrVa9f/DhCYoMs4eOlDd+xEsh7cJU/7pNupkc39zV3ockLYm\n4c0emmCEx6Nym1RFxBBJ4MLW8DUH8SWdcV5qYDhXAda3A1dYKQyy7p65wQSm\nQcLigOkFucFu2CVN3aoJsib73QBLcE2AGJ3ChYQM4aBhEFt1Ilms+6gWujJM\noHXDyIPDjXZfwgG5z3kLzjKMN9zZxqTFAZPHsKQ7UoqP25r1AyhH/uuY32BT\nTJX1\r\n=BHdR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCrj9VECrlpa+jV2VuJ/z3+Q7i6tx3IhQ+2PuHB1i6zhQIhAI1pTA6ZKlpP3SaEEx6Ao5S0MeFyTgZiC8ZwfpdrcU2o"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.8.0_1587344891360_0.7566354981011569"},"_hasShrinkwrap":false},"2.9.0":{"name":"warthog","version":"2.9.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"gitHead":"601d5e2b443f550483bb16ae8b67f54333583718","_id":"warthog@2.9.0","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-RwdTpNkQaUPH9BfQy6Flkk5rCuFWRGB5/1ODAZKI9BPiLdOsq68GAkonb9PV/5Bd4Xa/3LB5fJRyusvif5Y5ew==","shasum":"6b006a1198b7a7e5a7b40e8fa5dee66ffd39cb48","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.9.0.tgz","fileCount":303,"unpackedSize":640916,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJenPbyCRA9TVsSAnZWagAAYRUP/joEpfsyn348gPJAKI/S\nxwZ0zexdlSUgaD/m0vGfngwrd622otpfGbflMxp423w7kWs7kWU5szjzkAd1\n6i8Mq5avGT3aYUcH41TvMsKoCskKAS4swsikdB0nFJXzmrwf8ZSL6XNbzN+S\n6zQSfuiHHUhBO8mVLErEv/yEO0MIWwCGqwwVvvkgWAlcgeDF65tBW7/pu4O7\nOPSgoq2djeSEFFoc3q++lF/KUdnRGQt78+WYNRHik+jXtTJcWNXBK+Jl8j9a\nWK595e4WFr1q1VyUpGOeZ031SQO8HYUYaLWT5sp3mOOQO1dN7aWU01w4BkCU\nQobcbOjwT7JHFQ+h+TwiL0cW5tAotXE1MwqgaG39DlvW4OkAlXT9coOdLze8\nc054TxW0d/o1EntyzHaHcRIlWcAGNSDb3pKD6QLr/KTj4N3Uhhw3KW+3kAHY\ndv6WI+sGpL0NpXtufBkQTquJcpYDyLv8iYzBBuCPPV3cXYbnEnihX92HXodQ\n77yME0LTQKjoTQBd7L0Nr2CoiTmD5GVWC+0fZDNrWuTRK3hf11UHPxOwWrHZ\n3cKBu3t+/7Nm3MAyd/BkANGfFBfTwSag3957zqLi0i/RlndNcumW0E5D8TJz\nKA19myNAYFw7wxoYVBd5SaDdB4r/1aYxJqAcUJ6WdndWDrMOSyVXyeq8Tsht\n7a+u\r\n=9Ksg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCKz+0rPYXMuZO+tI4mbsq7rCOt1BixB3+K5d0mHlzjDAIhAOoyctLBdkhDNTKyi+oAMw8RbInSTXjGqTsJFekMz46i"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.9.0_1587345137975_0.6782108575345507"},"_hasShrinkwrap":false},"2.9.1":{"name":"warthog","version":"2.9.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"gitHead":"cc81747a5e9b20dbb4998adb85f3697221e0fd94","_id":"warthog@2.9.1","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-dMMgdN0v2xWtl7mD/L9dTTBW0WgCFaidZJYmqlGAL2F9XIbvYffdr43K02oNP6E5LlnPB9xuF9Pa26OzByh41A==","shasum":"e662db6adae2968a4fedd527300ba0736103eb20","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.9.1.tgz","fileCount":303,"unpackedSize":640982,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJepPs+CRA9TVsSAnZWagAArUcP+wYUAnlly2sYWnwulhTZ\nVfFQRMPhSBDBTRIhvYZrLmNOKEb18+KG9Pn/oHVsbex2fDOP36JMC+DW6ybs\nvXQvII0b7C3WtcA9X1SstCxsv8lOVItGpYWwS5egJ3uWAg4FzvbBhkE9yBhx\nf8MDIyTNvwchX99IQp3Ntjj6NaAU/cK8By/85xXQdDsfD9rqUAGT7XVl+xGV\naRbQjP8Cy7dPq+BuCJNuhJnaIHiKZMQ/MfQ9T2muHY8q15/i1gDIg/7raYV7\nzY8pm42KWi68A8y+Vx+XkN44ncRJSdp/zoxfjpegUFsMh2kGcQbO6KKytuo/\n1LSnJc8UG92KXvhrprXzQplkZTRZswIsrag0nNuZzmxuWNCD+h+NyPVHPFwi\nCLCtSIlgbUcpLrK8Q3fZ1Fb+I088P3mm57l66n9YHH/JfvG5sDqm9r2lC0ss\n5vUuV66ZcRN+22xDzp+4ulLet7HR3JHVM8oPdottjZJQ2ot1Uga+AWnjYVF8\nXfaL12ivBX5pgO4RUZj2iwxXScNsu3LFCYgVlqTl1/QPa4Pdc+eG2Ayc8ni+\nf7Zw7XFWjMmHOPZW9IwkP9RsVmhysdrmTJmvg2GeZDLOLOlc6pU05vfXsTYy\nj2KKThdpFjSr7HfcWdmvDYM/Kvu2ltpDfJyXbJMBg5J34/HqNkhVtCes4zeI\niWt/\r\n=afGd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBGveKxh+JmrhIpCldqtF4Vftl7LNXpSn98YYpmtoQJnAiEAhaqk6L5vLOQH41QmZiGSmwNvSFpcv4b69zSxGTMDn14="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.9.1_1587870525542_0.4421309466635055"},"_hasShrinkwrap":false},"2.9.2":{"name":"warthog","version":"2.9.2","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","sqlite3":"^4.1.0","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"gitHead":"7149057b2187eec3f468e014bb38f6971aba7b23","_id":"warthog@2.9.2","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-pI2bu0vqgj0X8Jl/rtN6HUdPPdp8xJAcsGHrxzZgnf4hjV5Ucz8oPcjAe4WQ9ADbP8pvUiT5qoY/eOXzUkE/zw==","shasum":"0217c3ec6df79377bed0b341855f7fec44e4d9e5","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.9.2.tgz","fileCount":303,"unpackedSize":640967,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeuedjCRA9TVsSAnZWagAAssUP/RybuQVeNgM5FJjxpwQL\nLPE4w5vdfHsKhP2XKgGhHiLUvjR41pkcQhonSxcHTswojh9rJCPUSPwXNIat\nXr1YLUb+ZY8gyQWt6sFu4vjQ83jQiY1bXnKh5G3BpzZDbzl6jMXVmjW3d4ZM\nMu93KTGAlrUho8JTNEyZyOd4e2irDRCpdiJ07wmmuDcuH1FI8cHy11jtZLDB\nUcLZHlTSliuNhvKaJmHxX8depR6tyD6MoeZqpmUPC74RXiZNiuueVSk/1KWF\nfZMZx6DV3jpseHviUgYeH+5sVoBBOZNSO3EqKUljIaqvNyRDob31sgLq0Quy\n0ZokIwVCjldktXLVx3M1R14fCFRaXzlVRvYZ3MF0UDPVDUFnSFmiH5GhfCjL\nzVNgQGh5mafiCRcmNv5iMj+cNuHh5uEbZPHdqpg6Bua6rahiskB1/Lgtmppy\nJJC6Q+OgOKIg5IGYdxtSxORShdwQc4VIHIsZKOyK6/mBlcEVk2gkUhNoNYp6\nu5ygSIzG6NtZCwK8UgX7ZnZvJGmQWir1y/Q7iJskzlTYpkVPutat0yU9Qp9U\nSWZpAfLIDUO8qLoEy3k+j4uhwRGIuktAakWC/zP2G1tav+f4rMuc4lHZ12yk\nArZGOLFJibEkZZYljvDzSfLHBGhfzxABc5XzanLtAq7OiO0jdEleghjVCEA2\nVP2v\r\n=yE02\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD2ZsPbZMN9JvrJbaqL/N1l6HoL5ZBj2A1QgD1IBx1keAIhAOtBmrphGz1v+Cqa9/iZD+FxUjTK7JCA8ASBa5vMGrbW"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.9.2_1589241699036_0.6972848769922086"},"_hasShrinkwrap":false},"2.10.0":{"name":"warthog","version":"2.10.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["main"]},"gitHead":"03df36aa5125d8bdbf1874070a5b35f590901aef","_id":"warthog@2.10.0","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-Evj2B2LEPgoOY9ftAnJaBZnZGpI458zXkH58CrZtKeKL0IliGEUerNEvY5QA87MKd6N9azfFQV1t26NIEItT/w==","shasum":"6d64032222359ba52bd9d6449922801c70cc6b84","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.10.0.tgz","fileCount":312,"unpackedSize":667682,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfMhY3CRA9TVsSAnZWagAAKpEP/3k9KJkFUCIcpMJ6+VTn\n6+az+UQgpf1nuFkIO4ScJlwxq89CwdwZYz08pLJB1bxRNBp7HBI+g0fEgWD5\ns9TYVotpYdKnVknTUdhYRTN5e09OFjhcAthQXWGDGZMhvHyStSMf4Uz9Jxgn\nhPw2Xz7Wpn/5tWP5jo4Yqdjfqp5OV3ch+TelqtcSV5rxYp/Pm91Hlx3+G7Va\nhdvRxw7PCeCrKASOInVvsQI91mhFQHcwkD0p+8cpOSZq0P8+s0OWf+jG94vN\nWwgtpydgN2Pb6jkINycm6BRKEDO1ufSI5PuBzgv0m6uYqxumORrS2gVNQzN0\niulu4kIeSO+qtJU6+I5vRLbfm/biu+su6mmf3W78YY9Ye2YHoM0N4CEj8Bxu\nfprZiQ4Ii5Si+COPFeKtRuKfX5nqKrzxEcsJ2Ty0u9z52W6TuRIWh5tUWS77\nHO/4f+bqnrDKdOa7h/pOLP5fQy91xzBfqJR+nPAEy+lHZvcqTadLxunwcCvb\nFW3UBs8eLpZurS3CjS9oavx1Re4mQnoMGnzGt9nF7l1X9HIj6APqw8Ux8L5z\n0zi5173IH99Gh+Xnwy9Zbaxe1hgxs4m7pnv8Ox70H92YnEbRhA3sA6YjuLgG\n7GNGSkmBTbvZ5y4rsKND24GCPjT5Va/tmI9WP7BtlLr//fVYLaH3JS7NbyvD\ncnB0\r\n=uwUG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC5JmA7yqqEl2Aem9fzYNNY5PbNkBWTEXGQkcRy7t4/ZAIgdPZ3n1pFjaalJT8mOGjIKBhs0UJcbcWir+QsfT/Vb/I="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.10.0_1597118007035_0.6991594973627795"},"_hasShrinkwrap":false},"2.11.0":{"name":"warthog","version":"2.11.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/src/index.js","types":"dist/types/src/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/templates/**/*.ejs dist/src/cli/templates","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["main"]},"gitHead":"671608bfc1a860c84a03cfc21c98d96e3d9a5ddd","_id":"warthog@2.11.0","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-yn+EkFMzcpXmkAqYOzu2e/K/tgJp9l9eQsqr/mS/KpxQbKwJLdaH0ZNIao6JsqxylxOJkXn5b1ElhV8ytl/3QQ==","shasum":"f954d0cfcc8027ed6ca00306c620a46e7bf50c3f","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.11.0.tgz","fileCount":5,"unpackedSize":43947,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfQXXYCRA9TVsSAnZWagAAwPQP/26mZbcoyz/RWsMR/VBE\nSWDJCRItu48hW2tac6Cvy78XuJGYplQc6+BchszS468Bsdco6/gsI4gTNnBG\nhk9Nf0xvw8A6Uh/bzWt+KmHylVo6MOm5a9PuVhN/hGjMUrfRE7CQZ6w0a25i\nHn60Hh6MXvXehln18NpffAqnm126aR774PUtosYQ//7Tdf0mbyZ/75LSXCtw\njmpcMV4XtO0bAUBoFB9D/xvm9/xviCe2lyfGvR6YerniPVLvvMaowO1KzbZL\nTkhuIHTh0b0FR6VrKduNC1xPyz7PgRFnKce+Py+RAKRNLkrvxcVR6R+2AAZN\nGTkDWkymESAGyODSylhJaUPUOcBbZSUG0A3p187KoThpBnanUNvnqN3ND7dP\nmwv+R/1Q0/84xkDUC7r6YDkoHPrI9xm/29dtvBvzbgorWGBKUVCOFd6Aiajc\nsF9oGlA/qG2aAbxfpj/pk15LcdiItzp+oCHDsEOFysJJFgeiDgI+GKV+JGOH\ntEh6upqwAj9O8LXcMYGvJ8nLs+Q5BMW2U5YbARGQWLkeKhsIQKnPKu4tQkeY\nbo46fMP1R4vHOgqVvP/yJA6cEkkF87wDxhnT/+AEqCq9wW8R9ys9ry4n2EEy\nKt0+iPqEYAE5/MzkjxqvsHoBYUtzQ0kRBqCSzA/6Bm78yZH8Cyk2PgtHDdPa\ngAuB\r\n=53Ro\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICdOrE3yYl+CapA8T1jo9FmgRE54OAuUqLNJYy51pDfDAiEA3zmdckwYNC2nXJcsnQukGbnl9DxICPY8sJhud8qSIjQ="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.11.0_1598125528110_0.41730544738905717"},"_hasShrinkwrap":false},"2.12.0":{"name":"warthog","version":"2.12.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/templates/**/*.ejs dist/cli/templates && cp package.json ./dist","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["main"]},"gitHead":"fe53769ea895d30573f5f150d040b6b399299b2c","_id":"warthog@2.12.0","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-6GFMaT+RBNRHVe4pjNcB5PE7HTlGlAwGsAl3wrcdOugv8xtoK4A6j1cbzUVcAgVzkFEYFJXMvIQtmVFsKtOwDg==","shasum":"a162bfd9461fe925ab73a8b914dfd40845bb8f1f","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.12.0.tgz","fileCount":5,"unpackedSize":43219,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfQXzPCRA9TVsSAnZWagAAws8P/2M2h4ThZp+1hoDaDXea\nhEZr8ArVCE4Umo5JMuxv4+ofkJcwlQsRsFFHQVp811hwm7JKicG/4um8pnOv\nyziAb6RX1zRSWdVIo7icGBhw9g35WEVpzE3WCxY26nxjji5maFdlvB7y6XBj\nYGuoGFOM2LpxxmSDMyuDAp/N5MQhtDjT+rb1vk2wCE+SNMpvLeI1rR/Wy4/k\nIncNSOCba2/o/krNmw7KsjwFpi1pX5J20GVEa5GzudVguS9Al16GoTf5IEX9\nQ11yKZB/I9MPDXaS6kxdeaAIFYbT2KhNUe9lKmipVOQOrETpQz7ED45CjioU\nXIb7LivYPVcgwLJjiCI7FLXxQWEuK4U60Fy/CwE35yodiDqo7hHJS2NcWstU\nXoK+axMZLmJGvrGmyww6PRM5H3FpAvWEnrEjsHZbrb5bd968EPoB6MOAbkzH\ni5pRO96U6z5GExxacVff063bbSxRkU3RFWhfXcfyI2P338HELCxRbw/I3kfo\njqRqHlhNLyNcOjE8vv25hKQk2YbnT8uOaijbn5qUBAZjIBLS6VN4KkPBS/9h\nyN7Csz1dUVU0G6FTruW9EBflb+ouzMz2ncVrEw/mPOs/1ogPojUH33CaM7+T\nX0QIPpc3UR4VVVzeFO46ThnMAXoP5Osz4vL692Ep6lMDJufXEEhYfzzRHmb8\nNe7R\r\n=GFsl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDOpKGzQ1K2AqHv5L0pXjNfOhqSOaEFZMc44vYEdzW8HwIhAO+dOl2qYH+oUbLdrkyzYDVWM7Tbj8GV4CgSZOxsz+zS"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.12.0_1598127310582_0.555421263501682"},"_hasShrinkwrap":false},"2.12.1":{"name":"warthog","version":"2.12.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/templates/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["main"]},"gitHead":"f9f0d00b8301aa98459ef6c15081e414d2343641","_id":"warthog@2.12.1","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-MiF4ie7ezZ00M3b/KdPj5lWAH0uSs+v4ecF7IXQTPsmB6Bv6UKFGHsz7kC17GNZV/htkM8f3SkYPh+njZCe6Jw==","shasum":"f7cce565fc41aa81861a8bb019016f36ddd736ce","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.12.1.tgz","fileCount":247,"unpackedSize":425940,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfQYJjCRA9TVsSAnZWagAAKRsP/2M9cQplx1IwX0EZCRSW\n1EffL8QYA9e4OIgQyELXHan3Lvx/Nb4KhKtdSi2hMJJZgQcl53nrPI9cba8l\nnRL1dq3jAoh54iR8Kmw/PA58G5xiOSHievRUgtHF+XWm7ppw5iWJSnP5DVw/\nDoT97NsXaC8ZCJx3+XGZdAJ5VTAP7rgr6UuFuJolPxrGeo3oUxnAv9Zz1/Aq\noddgCwAxDeczLW9pm286TBSaU8EU78yVck//LfarqMoi4mZWj6NHSmp07vfY\n7fYEUzKFaf0LdtkIAeue8GMAaNBCIVg8feUPLGOHO5u93a2Xo+Ep2XAcFX3c\nwuZa0HvdLPDqA9TnN9h1NAk/se8zDuBAttCtSRv1tbuVTtyUX3GddVeCxu8U\n/w9nXAeQWhWPn5OxDXyPnunAaanQzLl6quQ3INke16HCEDTEcW3RL9WGPzQo\nFCWmWNyQw2jwkF2rgN/WvFX7jivPopuhJH59CubYhzVMQdHnqj6lvvCppAVC\nHQqCsZKs/A0YcPp2csLkcGtahafBsToxLfg8m0ocF10vI5jX42/r1+D/DFHn\nFnFHL1OA4PaaHl0EZOYUALDxTNm7RSi6ykT6B14N27Nl592vTKj1tQyNJAqS\nfnAUi4LCXNuI7p5J9u8oJNkWWbReoYdihfMQGrMbIgRnepTghQhNBNVvyPVr\n3Rtr\r\n=elQq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCnHsB7PTk0oo9xm3ad5QZeeoyfA0D9Sam6Afz3Igp9RwIhALbW9knls3XcQdyRLNHkAp/VkJLnXVR87khcH/rIx5qb"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.12.1_1598128738554_0.20070678790685736"},"_hasShrinkwrap":false},"2.12.2":{"name":"warthog","version":"2.12.2","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles src/cli/templates/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.1.1","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["main"]},"gitHead":"410dad00a5ed9abeee3ff7e2b287a3f917039830","_id":"warthog@2.12.2","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-rn6Z4pliJNZ1OE+gnmi66G1QY284IpDERVObGvIp/o9iWlkupfHP2lwG98fpziKFL3jiN3kqg+n0dooHYrahIw==","shasum":"8783ebf7e064551e13f5390243414e9ae41cf383","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.12.2.tgz","fileCount":247,"unpackedSize":426049,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfQYXNCRA9TVsSAnZWagAAaFAQAKFRX24T2S6nJ6ZPwGJX\nYAX3d+JpR8KY8HdaojegRY+/W2511QBo80T85IonW88vctiuyK4gzJlpkr1y\nQBB5IKWch8SvT5IJkE+vLlvUEICZgGwJKja/outticf+VH1LVneNMaCKB+J8\nwfLIlFQjHGB8apEZa9bR9qQqN2/XzOkK8HNT4mEXm/9UocDrL7pUx933nXyw\nTEnENbAHDVb2RrZsIxGtGUXp21MwvOw7QU4k2p1QHGKHIUVLKKDfZOAebWZg\nw62pAfnXEVEWAb/XrL7wQKRbtQ5pJo6xtU6XouEPd+hHb9db98yxEqVVa+xp\nXCXhk89ESC2CpqmFqCDgRUgGh9qKU+oHhw8e4gERnYfVTkwxXxCdhgwhQVyX\nsyBNF2OJjM/xCUZ13reSdFZwPY1qS+RGenpHPsARyhV3TtYQhQpX7xc8yooP\nNFV+DKtZghQCfHr93bCCOLQBOmc2xo0Mzg8rQEeGcCAK34yo678Y+cg+qczo\nLm4iZKrm6WCItM2OEGb7dZC61hmJAmOuwFtnxI7pkI4rH3IcA+v/TXRHja7O\nv0GKwh05mZSIiB2DM7B78YDklqgSHACJC8UjBVcLT31SrM+vhGPKTgp7JNuv\nRLgWC09JBmvO8Y6q+RhgdCTPhyA4ZOjzFjNsA7S1BTxhrtc+jwWZiQ82mcnf\ns20Q\r\n=kodL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDfhcPk6MNBio1C5vg9ZdcRfW+hVJ9eJXzJfJE3p2/I+wIhAJ0DiXPV4jUyQ56rIuAHgGPUWLjhFKuECA/50YzzwrpO"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.12.2_1598129612990_0.6210072977613696"},"_hasShrinkwrap":false},"2.12.3":{"name":"warthog","version":"2.12.3","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.7.2"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.5.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["main"]},"gitHead":"565bfe3d6b7f73a38dfdcd84255ddcb9f259e28b","_id":"warthog@2.12.3","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-RJRCcqCdggOU/EWlRrzhwWDjZg5uUypmEF+u2VDsuRgm5b/uMK/+QKKXBYE1A3a3JykanPYmJDZDlxeeU/Lfyg==","shasum":"822b2ebaae4a79bafada43a5460d73aee27b1341","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.12.3.tgz","fileCount":251,"unpackedSize":428236,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfQYuWCRA9TVsSAnZWagAAWRgP/2kTnYivcHaY1u1pLqKK\nvh2u9a0WYpMoTltKPmJs8qpi/RECClBypxQdhB6hOksW8HRz4S+khdrr/WGF\nfMsKFMNye/O7Bl8UqDBVkbL4po3jyKKmjMtQjxsLLy5BcWZL1G5YDi06YGBk\nd2tBpurZHzjDo7GMJBOU+M2AbHe2THIc6cmzjyoTofmhAH9EFF2pQn6Ie2IY\naXx62DYeTz2JF3D3IKMm+fFzS3r/fPk0inTMuGv0V2e3OB2k52slL7uIYcNb\nPRMt5ANiuhQq12EzpirzbBmT8cmRvQ0PLFBDXanHG5cQh0mwLJ3moUcJtIWl\nKjNPfw8Ftd0jXGDmE2QDZVfqkN1maOdqsUJmBDAqe7RIWZ/UzaIcabpidH65\nLlq+/w5vt2FKA6XscRfmAI7w8jOPSGB2QortelQRIXiMO4KzJ9Se24iyY0AB\nwaj1ro6GFvfUt/qjDC0Aygw5L+Gx/DRGJEe8te+MRTk/sWwRZ9cxOAUYy1rt\nJCRY8W+T0cg4kmOesYajsOld1FeoNXWa3CaTDUBJU3S/o6hFeuCkCFKmO3DQ\nG+3FYDi/ys9eFWJzSBXjwYpvOEP1SLBH4bReMehLkIr0bWG6fzWglvHB1rqC\n8xNPQKv3WQcBLN9thKE5DxcCK+imdZFJhKqfs7YI6YmEPIMed1Zuf4Frefpv\nm7p5\r\n=4Iyi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCt2Phb5nIa03OJg+DEi/ZYt9l8g0gLX5piOgVF04zSsgIhAIpRZ8RbGnEw65yJCEnQJTSgLn3ZF3QR/29Efq/N65Kl"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.12.3_1598131093955_0.7954997186393293"},"_hasShrinkwrap":false},"2.13.0":{"name":"warthog","version":"2.13.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["main"]},"gitHead":"7f1e447aa7d89e819c8d38d6b010e16c9451a9ea","_id":"warthog@2.13.0","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-OTXcTrEI+1kPdQH/I0tZ7EQXqaFL5Vczc9xiXWQZVqfBIHgAjNAJDwb4IIWl+FQtClvyP5wULQEOczFq61IOWg==","shasum":"fa5478927fa95735da90381de6c30fc5b2074ab7","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.13.0.tgz","fileCount":251,"unpackedSize":434907,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfQc3HCRA9TVsSAnZWagAAZ8YQAJVUhPj3ubYvfyNYV7V5\nENy3xqMzhe0QSZj3x2a/5YKqcS3fuspBSARoucA6UKO6NZrLg6CH+ik+obLR\nnlugin8kYGXXBBBuXFfv5giE2ChMY1LgkMnc3NLv1MrR0GSGtOyKaS2FHfh5\nYDFLyoIpsZJToSLJJbaX1xGtWiMie7cmuPvmsgV3TBUhdtZv2zsJkOZNBB6S\n/A+Y932yGJ9j+7r3JyvLjSrX94eHXJ/3X5WM0ydukBViUfRt5NHY+583ijVj\nLNEo0Tlw+Av+MlcL5TRn9EkwyusS6gTjAFF2oZCXBACXgpMLIfSb1JW7YWVt\n6r7mwVgryEvMST4pxu1/DV7m2CPkJ7xaUFEvdGygLfmuvZgmKEPGtlbXJ7F0\nP4/Tp6lp29ro1de/XP/olP71eBuunW2RQprM4SlafvhjSj8zVXKT7DESoAdX\njJGY8aR+qOe7lzILA+BWvhEtz3wu3X/azr+7/A/vXUPsm3rHF2Ut/nGWpYlj\n63bh2L3hPXLEW1IB0JXqZmV5+SOd0Znp0nt2UY20oBbFYIftF+PLFk479Ybc\nBlhx2vLg4DzLKKUDAby4bhzcmc4UkC35lXtelD/fQWh9WTaJ6yCMMXhTnWan\nFG5W3faFr1v7YKn307+gDOLLnjhixV7+nqnB60FZrhByukFLrqOLqcrpV2OG\n+mYR\r\n=Y4/t\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDZCNajUAn8G29r6xwrFnPxUmilyw/xTdu5/23HUdZvEwIhAK6tsxqEVYJSYLkrQgoHEJg5tLLfZtwrUjXOh0wULbn5"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.13.0_1598148038894_0.364885188480359"},"_hasShrinkwrap":false},"2.14.0":{"name":"warthog","version":"2.14.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["main"]},"gitHead":"6c77c2fafbeb323dae454ec3df64550a98bf317d","_id":"warthog@2.14.0","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-McSo15aaxWlLivmBMYoWP0/UeaJLCG3IWIGYW2Ap2gXwQKA5K/aSozEDOXPMEFcZgcBG+9qPFks+gymb2OPuow==","shasum":"c558813de7a2ca24890261b52cb838a5d2d2b888","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.14.0.tgz","fileCount":257,"unpackedSize":441689,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfQz0KCRA9TVsSAnZWagAAYJkP/iGnzBcZvGLslfZ9w/Mx\nVVvPq3QW0lmWA2bJxoUi+eT8PscFY9X/MLiozm5V3pB3+kOaL7Wv8fuGxWSy\nPaMXtwGV/e4V564Jfmf77poddbQGcffCnIEap3H10Ap8H6CIVTDlvbbeNAYX\ne4uE/4P9BldbM7r7kn7eJJP5Nvj27gtz2fFVDeWV/C1boy+prj3f+lczn6nm\n0YozaBCGwN5luCUQ3cjhkr45RdBuDOrd3q8UZHB8Brk4rHwSDMND/AOiDuzO\nRhmEcOLGzBhn3SsZ3sIv96lXQHNyYlwuAC6EW/jckHzQuqoxqL6XU3Pj9zmM\nsi2r9Sd1DH90PIWxdFrbPStaZe/+TSUxps+hhzp7uUvmn0KubCR8RgZqCEyC\nlOCP2WhZhwntEhqj8ryEsndBw6mutkMfg+FtEgRG1aH7n9E2eSER9AEmp11F\nW57OUzhmyYd3BAAx+pSFEz208QE9zMw8iStYTjlfASzIaKMPJO4xN7+cZL/R\n5A30tLZPBOt1DEZ6GvQluaNiT4Rkmuf/NfUxmBsAxkPcoomF3e51frEEIwif\nfeWm585JcuYP6rFPGdeVdhzpwHecfpuFDQgjusCUnmir//BmSQuOVkSw1Lz3\nQswFae6laczCAEjKzprmuKKgASGnVyv52IpvtJE451imwERVmjFVzO6QyyDZ\nSI4G\r\n=IDcN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDVzctxYpGZ0hYpcK7GgBIic3nNx7ulGRDlME0TnQmhTQIgQmNH3c7HRFTPuYJo1Q8aQPRfKt2YOFQMfJHnxE+C9Mg="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.14.0_1598242057369_0.1771358051560974"},"_hasShrinkwrap":false},"2.15.0":{"name":"warthog","version":"2.15.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["main"]},"gitHead":"bfa3e545c12221f2f27e06b487f816379265ec95","_id":"warthog@2.15.0","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-pVbnKb81DVPscDAGdT7dLGxKbV/fdmyuTm6fg97kXKKN4Ppi2QxhJ8gqxE9GlsxiVYXhip2j9RA9yeCBfqXphQ==","shasum":"05ee3fee1c6c07bbfcf49e75a2ad540649daf100","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.15.0.tgz","fileCount":257,"unpackedSize":447595,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfRJJ4CRA9TVsSAnZWagAAIWsQAJgrfVQNiliV7Ksnpwzh\nUVFYLM45V2AT+FCdVNYgY14wTPGHliSiNVl4VotNh8PM0LZs6hGxDypbykWx\ne0XAYtg9ijYGV2j161qD5bTxUQ4L8dP9lez/mfSv1ZS7evdMlN9Hku50TFrb\nEWDUmzbDsVREbMeZUogyFQQhuk66vys5fbZBpwC1epZjCGbQuV58MpxQa/nu\nDK2JifhCSBG8Ro5DUkjWs3xYILrttuxwo9Nrq9Udwm4BiMsmXYSVlz66PDBG\n4Ah/xzmMn0P2F01aWw4A1w5CZecwQmpRfS9bB3VygqQE1MkH05l/pYqv/P2E\nMMvXmRjuqs0Gc3UTCQAsuFSYuQmBbG0btFkfqOfT0FCOKpAwAHOysE5jUZ81\n7Jnp7Jlq3MNN4mqJAaVk6L1Pku9DlscCW6/Eyc0/ijQeFDPlACv3/Eqpuyus\ny4/6j8Ibuzn62aq5T97ML/kNqe39ch0z8NzS7opoTAvynCZjSOlT0mhIQwox\nzfBk1zIEF7Q9AqAT9sbCnJwY2WarfqAbB8xEOKjGHPVJQMKHD7qhen3bjwEC\nI5oLtfDzC+6ezkJBZqmShARr85TIbOx9JvO27sY4xoR315IY1vwfyoOp+R5R\nqIWXlC9LyHc8JxgQVicDGWc3dKaZThEsD5ZPMXGz2z0NI556EOEq0Evy8nPi\n6tRY\r\n=TGt5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCRNMnVqZiLtcBFyQS1TkGO0GcQpqVM29Fzo9wq7i6lPwIhAIAVIw0dkh9ypE1mKUV8z8oP6rPRqSjHMeQ4BjyO5JlY"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.15.0_1598329463593_0.48250338530559445"},"_hasShrinkwrap":false},"2.15.1":{"name":"warthog","version":"2.15.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["main"]},"gitHead":"052544d30d2716799b53916c00970e34996c3dae","_id":"warthog@2.15.1","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-tGE6gh0nx4hbzM37rd0HMQ/gsCzGYJpSwvB5xO1a8g6Qx7JdJ23rJ+6yCyNhzYbcaGPURHxiJo2ic5vdMHxXrA==","shasum":"aa9b3adc8d89f891fdc83bd99412ad920d10f787","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.15.1.tgz","fileCount":257,"unpackedSize":447599,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfRbZACRA9TVsSAnZWagAALhUP/0LJo0X4CRHYdbJenEGn\n7efDxWtgUCaJkLqx5NswCve33mbR1fioSF+OyeX5OKrHHjpYp3tIWOwLHsL/\n20YR+vNmcuxc22XVjv00AO1VVnqqID3N+azT3sCZ5AC29jnEU9obe3hEfPVb\nfc6ZC4SnczIenB0h8+dQNZYUn8HBDjT5kabLdsbR1QS38QKaSmejfUX06nyT\nEkugv0iipip5uZAwHR2Hl8pl5FobyYOpgwvekSouSCwR68i1vn/v5AVpbUaZ\n3aFXmvOOORU2xTxmVsjlDDCEw4tWgGa3TcXhcH07QmkYV+bVGENj8hSotdvs\nYfE+w2uh0+yR+c5+kh7NJx+XHCILCZ8eL8zrvMePlVlshH2fb72yfRYbt8Vh\nv3R/dLJT8t05zfGTHBzZrJr0kJdoAsNcxlSKv8wOlKIObaQVQ6XNMoxpycb6\n+eoO6wNl7yBZtAbp/tf/J3Xi8UxXRb69a0ub8ZS849mRXq3k5AW+tN1IWCPH\nT49GoRXNcq306FcZ92jHfe03d+tgTmC3+r1zdgFMC3W25Fr8duw+33EUsqQh\nTvWidHswR8IQj7C+MrUsXwI5Bu9FixE0RvhWp38gIVzguZBXYEH3JbUJL7SA\nWPKyDH7AVm5FxGuP5ACv9mRX10nJMP82dzeIPUGlaCe/ICrSBow/qrIGi4AF\nhuLa\r\n=W1uf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCNA6d5hT7itTFM+RcV3h5Oy5a3vKhgfPUhNhdF3XLc6AIhAKaBjJEBRkCLg9SqassxJUYI8LKKqCoWxvGcdI1v1Vue"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.15.1_1598404159977_0.5106610106214755"},"_hasShrinkwrap":false},"2.15.2":{"name":"warthog","version":"2.15.2","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["main"]},"gitHead":"1d679ed6f624262e3c0ae6581e99c44d02006697","_id":"warthog@2.15.2","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-I8TNRLSpD+02KN8bPDNlz947Ikr7Vlhq0V5y6beQMVaEKcZMfy7RQMeHIwA7xK5NQ7UUuM9z2FWUGdWYNZ7NDQ==","shasum":"ad5dbdb5e6dd72b1632de449b9c03532a2d64337","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.15.2.tgz","fileCount":257,"unpackedSize":449692,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfRcu0CRA9TVsSAnZWagAAgKwP/1LyOCbjetipgpRelAw7\nTf6et2Ns5/r3YSvh2sbXrYXzkLz4gyZjiPoO3HKsm1rHI33AcqaBBqnWgZ6b\n9kb1W2UdM2e+eELTnlkv8x/RLP6jiejMeuJp5raAudmAPcrIUIxDIr4TtxUF\nibbQBBg1WwyB1qzlMk+CC7zD8623m9DsdrHbViFiNilmVSOQgpun7Ha74NKc\nH/vfg+YVh+eM1c8NXzH7AcAmZGlkFwTMHYB7XV5rnSN9FHm7oRMWNkbf+1s6\narYSjdhGVLw6XyAOLMf6JGTUfToEuLi6BwlXp6CUhuIFzXqg9tmW2+uiS0d4\nzjLxE+vNfUGTvvd9SUC3Ssm+qq/2baMCmbrm3ZCJ8m6KFwrVEVR6UtQ8zOrG\nYyD9SP0k7rt4taLe7yOIcYlXyzOQAYvbiP9D+qez0XZ+nXeJYL4KfF0f0IYs\nFZWG9bdpXw7juEhXviixIBY1mQzQ8QWI0s1Av6hJcw/l4RjU7xNbd19y3oRO\nv9GwsrZ0kZtyD+n405NxGO3knaAFOQ/8O39EjeHYtqSk23xmhFTZzoPLjwIu\n7eoSXYXOrtU1V+CdJsAEZUCe5ptbnOmMDs7VaN/uWf+WpB9hZRonad562aPM\n91zu+5QTCURn1a6KVosDeetLuEF98IqT5Xt3sKg5GtOuZg/29c4bThJ0JdoW\n77W5\r\n=adSN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCMzcgSyey7p45En8w1WVlNOWopE949rjLly++W//Jq4QIgfyUyoJGz5unlQlrCaWkeDEWnyNXn0rTldPFrm6tl/Og="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.15.2_1598409652072_0.8923492151016652"},"_hasShrinkwrap":false},"2.15.3":{"name":"warthog","version":"2.15.3","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.20","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["main"]},"gitHead":"d8cc5bee2fa76b5d91b84145ef903aeeecd03b3c","_id":"warthog@2.15.3","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-Xp7Y9a8jeUn6X0XNXh6kw8cQNCy61Vw+kR3Qzv0BvzaGOygDbq4uuAqA0lVP4BaPlliA1wPoncTlDMJh1fN1pw==","shasum":"8056a109b7bbd7f5fdf328f8657800b72db74513","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.15.3.tgz","fileCount":257,"unpackedSize":449911,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfRdSbCRA9TVsSAnZWagAA5XMP/3cxsaxZvLdnGjvLBPSD\ngwIeLo+2lCSHb0dYsNugiPwEsypi1E4m4kqGw8LN+4qbRBlJHOjU6d5OLi1F\nAeaofmPLcOa+5jTE5SCKI4UsURatqg9AaT7dWKdlONXPUfaQuRv1V68ET43U\nNixWmW1mMEnUK7CkgtSk1aPwBfGi/UDmc2/3PsIXj60A3tg8IWxEC8xqS9ei\nGp1YWa9tZ8P3DeOmARr5FW/pA1UAVywHzh67+XEbDDcdxcWES9lLoB3VBKVh\n4AYF871nAOfGnOYxg19entjJKA9pra1Apk+VA18o3KWXr+KTMKYvSwMYRHwa\npcpg1FqIvWt7npNUc8/AwIf/a4NSiwjNRUh1pigYmgKOdjKjmBz6fIy5QNKd\nNX67QEScS6xx/4Sg0cqyoBjlniu5JSE8JO2Bp2mpCwPUJ45DorGDSKFyC9i7\nP/DWWpjNxhe4OXL8CD5RxnvYfEit3sBp7h9CglDhOeTmLzSEbClTYsgrz/7B\njhOi9/zxbnJPW/YU0K6t/vqLy7rzxmhVoz2wU1CBhUj6S/XSkjPlDxp36Ibh\nbROlk0fxngFwr1U8Bq1J7BK+4GHHPK6WrloL7jq6DvfOs/cBs+Tytd22oPAY\ndk7ivlUuYpAP0S1rf1u0zuLj/f6vnY+co95NHWY/ujJHgPJBL6ZGvjJ5v3XD\n9wud\r\n=fvyS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCR+31jaEuV3H/PPnNDjPhrjdyHugm6OscyFsbIUIg7QwIhANmlaeLPwHwWtZgM1FwtNyM3VFxxveBneN7AUNQvEMzI"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.15.3_1598411931280_0.8042558879115773"},"_hasShrinkwrap":false},"2.16.0":{"name":"warthog","version":"2.16.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.25","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.7","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^4.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["main"]},"gitHead":"ce0681a8a5733d29604dc03aff0cc60919e11bb6","_id":"warthog@2.16.0","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-cns05yMUIiOZqPHTtovIl5lyxcsdh41guMWxTDWd64662XsHJizqYnHqW+33m828JQjMgHYAMrl2k94xZSbk7Q==","shasum":"d60adfa2ad85d73a764b0e65316b640a2de47999","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.16.0.tgz","fileCount":257,"unpackedSize":449645,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfRxhMCRA9TVsSAnZWagAARdoP+gPVY2fZvk7O6Gh6szpW\nD8GOHAgRw12EIv13hOe4T6K0ZaARVhNl6ZbUBmxGdx/jaLRb4mWvvzqsq4/Z\nqngcqPTAQ+ejeMoznEaEBYAfJGeheYCYbQ1gLY6a5rDF879OJhRiDnugt05Z\nzQr8lx8edMIjK2G6YD8wFNKnGMXvPfMcaM+Ypoo4vKyvimDukCyJzl/iG6RQ\nlmwWkB97aEEpstf4diQxmNmwd3tm1m3fBsJfUGHEvMebNJHLCZLtotq5Bagr\nm4YKxlY9uHT9PmxbzrZtKtzIORIGD15QMJA6ogSkxs4F/esMSA0D6NsumFyj\nNGzjOW3SnJ0R2yC5GKLNxOtzy5aSQQE1XB0YXtwr7byn0AVy3M1CTcavoc2w\nuo1eFMusnkrnwQRDx6Pm5uShtCBvBiBc/bgeCIa5wb7SxTLRCyspoH0sktw3\nVDBk33G41ZHwOJKMpn3WtTbcdMiy86HjA5xODZkWAuZ8g/kFwEbHEEO9F32a\n0kKpEFh9yM8WLek44CSttZdOPvtdf2TmMNTKqc0K68k00l1mmVNfiL4oUZGO\ngkL74tIcuo/f/kTtkPOH9ptf45SYR2ZPEf2ZJ1xxBQf4gp2TxHJicbu3yuwc\nPl8FF2cQmKP0MVc9cLPfVSi6n/fUbVY5D6N9ZUk/JNG1J/U7wSTUW5gvUaFt\nikYF\r\n=OSoE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCWMaPXJpqs0B10xe2LazTqUNGdYZRAPqkrTRr10rSimwIhAMddagzBx45AAZ7TYzZZ68gmPV8kyEl9K1aWrLYe9/Ad"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.16.0_1598494796112_0.004134198049854154"},"_hasShrinkwrap":false},"2.17.0":{"name":"warthog","version":"2.17.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.25","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["main"]},"gitHead":"7f1c40b95c60f84c60239e06a4252f660cbec58e","_id":"warthog@2.17.0","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-M20oNv7bQYOfXLRgPrS7ZUJswT8Z63Lbz5OlANenpS/YYeK5CRXy6kVoFWiHI2qo1MwvI8j3QIq0flMLkYajwA==","shasum":"24b95b76faa8c3128c1442f72e5bb27e4434d5a8","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.17.0.tgz","fileCount":362,"unpackedSize":953621,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfSbzHCRA9TVsSAnZWagAAMxgP/jtI3Z8ytwgi1L8QRuba\nTyD6VenrA9UW7xCFZccC3GEDuKXqUYNlCHDMwVCux6jG/MI+KybLi0p+Ysp6\np4381Ay4FewaBmzkvKtMg0E6PFdMP4ndB7P1kHN5JoUqf5ZwiAVRR9QjFdGZ\np4SAhFGXBu9er+20/HIKaaJnj7b1LKcCTLJvQMIRt+QOz0j6hnRuFoapy4ab\nCfmGsTWWT9BpsKSZnxc57QyBGYdbeR2/ECJSo461/RJbf0uEv8TretChpruQ\nlyjIsax97SGGIXgNgMIxST6UtkevXiBuqIELVhkOq2g06233vMMI26dvkJ4q\nU6iksynxo4weJrHjTEA8fTH13VzPD56hGzOQaPy22rSRVYvbTNoSB8NCUFjn\nZcL4TA9PaSFKL8Vd4oYXbv36XYMTkDwbLjjdUrU5FAOO30+6Y5y018m8Sv4R\ntFVNU1WZxjDzafVD0kOj6WNFAI+KtgXJlFrHLDWVonhMh4vlbo7nHd8NJzna\nB+gY6VvB17AwIYpomOG3Fhk2jyzfGmWlsXuFJUpe5pg/DYtfKDBZeyHhFbhS\nEz/2LSyMLiVp++EjhnuUWGBfJWaZoujd7/2n0lkkKSz77WxdrEXuWq0pqa4Z\nfSGPUo7J9L3FxEtfzP/WGMP/yZQC4GlbEXgOIIJWCD4kZUbd9LmznAvrdK50\ndJje\r\n=Uui6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDhiP3INQetFVDwNmKGnQLlG0Ml9njom6odOWwIHXH5IgIhAODd2bWXmriHUJfPzJLNQsqRZCOkDwJbm+zYRmB263Or"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.17.0_1598667974946_0.6754475280752474"},"_hasShrinkwrap":false},"2.18.0":{"name":"warthog","version":"2.18.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.25","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["main"]},"gitHead":"6656871798c4f02575fdb3d3131669b25cdc1b53","_id":"warthog@2.18.0","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-19OhYStF2Bc/b9+2/jMMHlAZlzMTh8N/dQSL2yhCdlXgy2W4s9GXtWlbWnPcJhfG1gYKOkGhYBDJaHOWRU7/hA==","shasum":"5997769a948785594f4fbbb9b86ff0cebfcc0c20","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.18.0.tgz","fileCount":365,"unpackedSize":957116,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfTIPECRA9TVsSAnZWagAAWCMP/1gGOMqr7vwoi26KS+Xw\ngqEyuqAEWzqr7L6es7/G2jQ/s8i0gTAY9ywH3Cy+9awZf4HFMvujeWfg1NDW\nbMtZazH2Nqr8q+J0A6bMFGcAE9ESSxvyD2g6tSq2kxENlqXDJJhdCwWdZ9QO\ncbT+a3HooNK6xS92cq9UogOtWQQ3ILVFNMvnwiBvPmksVq4uwuHgOIg3nrjs\nBgZIjKb2/bVpH0MxsP3kIsXCH9g2XUjq+E/+05NdYDYPkO912fhZ1N2ng3X+\nuzcytRoA9Y6g2vYkKRa65KwljKEScjnkl/hbj36ShxlgOYRBIwkJ3pG6c3My\nEY5b5JLs4EUiJYYXE4d01IljCn3M1KFRuwOykuG/nVkY7gqux5jOPw65VSuc\nVaOrakufqEbys+ArJj7iuDxOvcGtPX8Ceh7H9fYrBo+HSjB9YtR4U7ji2gQT\n/9mXZ+0qF16qGbsy6tKkAk12CAViNdRsLOOwmQnHb5AZCqXY7oS1QyMdYd/b\nJddg0T5CYIkTHf1GLasI8wR0AyluUiaFhbMdWJViRLjbl15+3xRg+vDL2I1b\nPjfXtQU9xf4WzG1LaEP49D8J5/E9Opo2qG1Z5ttZyAGHd3RrP58zLeFWE2Au\nuWRoQkK4QpYgel5Ygd8YRe7bZZJmxUhfIxsdlw4mSndqkYcky2B3whZBGlcg\n3eGn\r\n=WcdJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDSD783U7aERygfaJFVeHifCa6lYuM+C/elN/pssvRlHAiBnYlh+D2X+vekmzv/rnnq29QFh2l86zKu1BB1yN4puBA=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.18.0_1598849988058_0.6846396980319307"},"_hasShrinkwrap":false},"3.0.0-beta.1":{"name":"warthog","version":"3.0.0-beta.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.25","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"gitHead":"3db46524a2be085325874662cabe506a8065c30f","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 1.0 to 2.0\n\nWarthog is now on version 2.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### More specific scalars\n\nA few fields have been updated to use more specific GraphQL scalars:\n\n- ID fields: previously these were represented by type `String`. Dates now use type `ID`\n- Date fields: previously these were represented by type `String`. Dates now use type `DateTime`\n\nSince your GraphQL schema has changed and so have the associated TypeScript types in `classes.ts`, there might be changes in your server code and even perhaps some associated client code if you use these generated classes in your client code.\n\n### `mockDBConnection` has been removed\n\nThe old codegen pipeline used TypeORM's metadata in order to generate the GraphQL schema since Warthog didn't also capture this metadata. Warthog now captures the necessary metadata, so we no longer need to lean on TypeORM and therefore we don't need the `mockDBConnection` we previously used during codegen. Searching your codebase for `mockDBConnection` and `WARTHOG_MOCK_DATABASE`/`MOCK_DATABASE` should do it. If you've been using the Warthog CLI for codegen, you shouldn't have anything to do here.\n\n### Project Dependencies Updated\n\nStaying on the latest versions of libraries is good for security, performance and new features. We've bumped to the latest stable versions of each of Warthog's dependencies. This might require some changes to your package.json.\n\n### Troubleshooting\n\n#### Cannot get connection \"default\" from the connection manager\n\nIf you get an error like:\n\n```txt\nCannot get connection \"default\" from the connection manager. Make sure you have created such connection. Also make sure you have called useContainer(Container) in your application before you established a connection and importing any entity.\n```\n\nIt could be caused by 2 things:\n\n##### Remove explicit `Container` injection\n\nIn V1 of Warthog, the README suggested that you should explicitly create your DI containers and pass them into your `App` instance like so:\n\n```typescript\nimport { Container } from 'typedi'; // REMOVE this\nimport { useContainer } from 'typeorm'; // REMOVE this\n\nimport { App } from 'warthog';\n\nasync function run() {\n  useContainer(Container); // REMOVE this\n\n  const app = new App({ container: Container }); // REMOVE the container option here\n  await app.start();\n}\n```\n\nIn V2, it is recommended that you no longer do this unless you explicitly need access to the Container.\n\n##### Remove references to Warthog's dependencies\n\nIt can sometimes cause problems to explicitly require Warthog's depdendencies (ie `type-graphql`, `typedi`, `typeorm` and `typeorm-typedi-extensions`). In future versions, remove these explicit dependencies from `package.json`:\n\n```txt\n- \"type-graphql\": \"...\",\n- \"typedi\": \"...\",\n- \"typeorm\": \"...\",\n- \"typeorm-typedi-extensions\": \"...\",\n```\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up. (Note: Postgres 12 is not currently supported)\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_APP_HOST              | App server host                                          | _none_                    |\n| WARTHOG_APP_PORT              | App server port                                          | 4000                      |\n| WARTHOG_APP_PROTOCOL          | App server protocol                                      | DEV: http, PROD: https    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","_id":"warthog@3.0.0-beta.1","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-9JZTMPbwpPamO1wVAlbrSXhb+x34mlxjCU4foUv1H4KuQGt9dj3tTnlxzNOIPlWPBgbhg0FXNhV4QuNFOuv/nQ==","shasum":"8a315231c8e0f1b41585d48105fc4d022c6b8ad0","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.1.tgz","fileCount":365,"unpackedSize":957309,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfTyFrCRA9TVsSAnZWagAA2v4P/RulkVsFZOAr7ABf4tPb\nk7U1BcqDxZw1d6c6GXKW6bCH/LtA495+6GsPxtCzzdxfk/rnkNG6x7BMuj1T\nCTIbP4dpU6JOuyRfjw6FKwZkS8YH4JClQyquYrvN+vdFGdVkSBhsy0YSSXZa\nKS3epdbidNhkC5w8Gd6ooPxCO285+0PbDIvCFVtiPsjXYQkBr5tqKOuA0hKr\nIVt9fvY7AIoold5ILXEJkHol/+r6oni4Bn8k5E0IOuJ6CPey9BbFSjd99WE5\nvdcVG+Pc/J19Lu1cHIVd0eYGk0mlfIf0V4Ha0oLUTfRGZZ1ciwS3hxoSOgin\nEQQnwAz1+tGn3tU+VPvEmzdm25eXipM/U9gRpqB1ZAltzUEPjongq3VOv8zq\nh5PXgvj3D8GT/xPCuA921jccyZCvjrahlGXVSbJw9zFGk/XSI9WMmUFQfZY3\n6KvrCr9dKP1Zp28WMx5B1byfDLuuz2JlcCXhK8gQGXKM7h2TxAWhX4hNN2cF\ni6xOTQgwr1OEcW17HgFkzo0XqHV75gSUma/58fCGwih0iR0c/Y1zJ+15tff0\ngpMkYNT6ASC5oPXky+yXSq4gr8ZgG4hmi3AF4zL47C1uIya7ONh3XPnoN1NX\naEXrRr6ma+SgyIEflhvOKCV/ccfYQvReRdPznduRg4qR3xDJ4xfFoHcNJcLG\ntwBu\r\n=Qg6I\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDQeJzr1Ffwud4GojgmSEYkAirgalpbpTZWsX2bWdr4jgIhAJDrVhqzPS6EqvSp+FAS4o0BqeXVzmwz/OsaU8wYuRsG"}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.1_1599021418791_0.6405959502795935"},"_hasShrinkwrap":false},"3.0.0-beta.2":{"name":"warthog","version":"3.0.0-beta.2","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.25","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"gitHead":"51f75f699bff0de42c9b7e6dd699cf35fc132538","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 1.0 to 2.0\n\nWarthog is now on version 2.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### More specific scalars\n\nA few fields have been updated to use more specific GraphQL scalars:\n\n- ID fields: previously these were represented by type `String`. Dates now use type `ID`\n- Date fields: previously these were represented by type `String`. Dates now use type `DateTime`\n\nSince your GraphQL schema has changed and so have the associated TypeScript types in `classes.ts`, there might be changes in your server code and even perhaps some associated client code if you use these generated classes in your client code.\n\n### `mockDBConnection` has been removed\n\nThe old codegen pipeline used TypeORM's metadata in order to generate the GraphQL schema since Warthog didn't also capture this metadata. Warthog now captures the necessary metadata, so we no longer need to lean on TypeORM and therefore we don't need the `mockDBConnection` we previously used during codegen. Searching your codebase for `mockDBConnection` and `WARTHOG_MOCK_DATABASE`/`MOCK_DATABASE` should do it. If you've been using the Warthog CLI for codegen, you shouldn't have anything to do here.\n\n### Project Dependencies Updated\n\nStaying on the latest versions of libraries is good for security, performance and new features. We've bumped to the latest stable versions of each of Warthog's dependencies. This might require some changes to your package.json.\n\n### Troubleshooting\n\n#### Cannot get connection \"default\" from the connection manager\n\nIf you get an error like:\n\n```txt\nCannot get connection \"default\" from the connection manager. Make sure you have created such connection. Also make sure you have called useContainer(Container) in your application before you established a connection and importing any entity.\n```\n\nIt could be caused by 2 things:\n\n##### Remove explicit `Container` injection\n\nIn V1 of Warthog, the README suggested that you should explicitly create your DI containers and pass them into your `App` instance like so:\n\n```typescript\nimport { Container } from 'typedi'; // REMOVE this\nimport { useContainer } from 'typeorm'; // REMOVE this\n\nimport { App } from 'warthog';\n\nasync function run() {\n  useContainer(Container); // REMOVE this\n\n  const app = new App({ container: Container }); // REMOVE the container option here\n  await app.start();\n}\n```\n\nIn V2, it is recommended that you no longer do this unless you explicitly need access to the Container.\n\n##### Remove references to Warthog's dependencies\n\nIt can sometimes cause problems to explicitly require Warthog's depdendencies (ie `type-graphql`, `typedi`, `typeorm` and `typeorm-typedi-extensions`). In future versions, remove these explicit dependencies from `package.json`:\n\n```txt\n- \"type-graphql\": \"...\",\n- \"typedi\": \"...\",\n- \"typeorm\": \"...\",\n- \"typeorm-typedi-extensions\": \"...\",\n```\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up. (Note: Postgres 12 is not currently supported)\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_APP_HOST              | App server host                                          | _none_                    |\n| WARTHOG_APP_PORT              | App server port                                          | 4000                      |\n| WARTHOG_APP_PROTOCOL          | App server protocol                                      | DEV: http, PROD: https    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","_id":"warthog@3.0.0-beta.2","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-0ff9CS5LyFjvasd0qHWZm53B1n4H3beLqhfBo1FdB4yG8xhtoChCpwDH3lC6KIR96Bv2XS84+sY8cZfhwE0hOQ==","shasum":"5486a64cf32a2709d886b6df3c76a585afbf4bee","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.2.tgz","fileCount":371,"unpackedSize":971687,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfUE4RCRA9TVsSAnZWagAACqwP/1SYvQYyxXGArXUFtWby\nzTjTijB9I7QMXWa7rG2X+IZ78NtDhap/RC8L8/1vqqgWD4P1RQgaEkF98Cme\n3S6RJ5c15k3ocu2AVqdRxcY863vPOcBTd7Z32/bU6cmwo6D8iUQjEtTltULp\nmY2s+ovXoasbvvXYqWEMWmhx1GOrUeMV4vgYhS/ewusdZb54pC9hltf3oT6Q\nbmYv7aFXv/ItfPYKg0l5vwA1tkVVOhRDwSUWwJau+iSTvPoHtES1tPXYhZ64\n0tqO3E8u/NZg/fx3n6rYFbLUtuCGjvHla6SW8GmwgyBy/3xfEB6hZV2JMs95\nTYhEToDcsCSOu3cxrn0CvJF2NuiY1OuLzsq4bXnQGfz2mAEx5FheIrMDeqvK\nzca4WDe/MlMblpondCQSPE9P17s1aFynrx5Vc2v1gQ5Y19Oa+tu4kmhVBlsy\n50gl9G0Izt8NT7gKa326TTLuTBm9avGIFXNSae1qhBoC4wPc+2QYP/Fqe3h/\nf+f7mNv5dBs9/91TLzYmx9nGwnaQK+BG1smqJrAMrXfWBAgvwWH1KyXzyKdc\nH1JeY3/kjcC3z+KEFZcNeXUO597zECKQ/erBSptm/GUyZPyjvB6ofxa1ncnY\nMswtN3KPMinAfCRd4Uwny5Mh2cI5K0c1MHwFZq14/pTg3bxOV1aqUpx91U0G\ndU8W\r\n=Zo79\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICznHca47iH8D3AZ4p+FMpN9glTEQdnAxC2dyl8mHbGrAiAW+HYFUblSlVnrxptWVb3ShmKEy5SlImCT5sWRrDjWCw=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.2_1599098384947_0.08170374423150961"},"_hasShrinkwrap":false},"3.0.0-beta.3":{"name":"warthog","version":"3.0.0-beta.3","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.25","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"gitHead":"b7f2c5bbcf54b26315cdfbb53079df10ab7d5290","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 1.0 to 2.0\n\nWarthog is now on version 2.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### More specific scalars\n\nA few fields have been updated to use more specific GraphQL scalars:\n\n- ID fields: previously these were represented by type `String`. Dates now use type `ID`\n- Date fields: previously these were represented by type `String`. Dates now use type `DateTime`\n\nSince your GraphQL schema has changed and so have the associated TypeScript types in `classes.ts`, there might be changes in your server code and even perhaps some associated client code if you use these generated classes in your client code.\n\n### `mockDBConnection` has been removed\n\nThe old codegen pipeline used TypeORM's metadata in order to generate the GraphQL schema since Warthog didn't also capture this metadata. Warthog now captures the necessary metadata, so we no longer need to lean on TypeORM and therefore we don't need the `mockDBConnection` we previously used during codegen. Searching your codebase for `mockDBConnection` and `WARTHOG_MOCK_DATABASE`/`MOCK_DATABASE` should do it. If you've been using the Warthog CLI for codegen, you shouldn't have anything to do here.\n\n### Project Dependencies Updated\n\nStaying on the latest versions of libraries is good for security, performance and new features. We've bumped to the latest stable versions of each of Warthog's dependencies. This might require some changes to your package.json.\n\n### Troubleshooting\n\n#### Cannot get connection \"default\" from the connection manager\n\nIf you get an error like:\n\n```txt\nCannot get connection \"default\" from the connection manager. Make sure you have created such connection. Also make sure you have called useContainer(Container) in your application before you established a connection and importing any entity.\n```\n\nIt could be caused by 2 things:\n\n##### Remove explicit `Container` injection\n\nIn V1 of Warthog, the README suggested that you should explicitly create your DI containers and pass them into your `App` instance like so:\n\n```typescript\nimport { Container } from 'typedi'; // REMOVE this\nimport { useContainer } from 'typeorm'; // REMOVE this\n\nimport { App } from 'warthog';\n\nasync function run() {\n  useContainer(Container); // REMOVE this\n\n  const app = new App({ container: Container }); // REMOVE the container option here\n  await app.start();\n}\n```\n\nIn V2, it is recommended that you no longer do this unless you explicitly need access to the Container.\n\n##### Remove references to Warthog's dependencies\n\nIt can sometimes cause problems to explicitly require Warthog's depdendencies (ie `type-graphql`, `typedi`, `typeorm` and `typeorm-typedi-extensions`). In future versions, remove these explicit dependencies from `package.json`:\n\n```txt\n- \"type-graphql\": \"...\",\n- \"typedi\": \"...\",\n- \"typeorm\": \"...\",\n- \"typeorm-typedi-extensions\": \"...\",\n```\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up. (Note: Postgres 12 is not currently supported)\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_APP_HOST              | App server host                                          | _none_                    |\n| WARTHOG_APP_PORT              | App server port                                          | 4000                      |\n| WARTHOG_APP_PROTOCOL          | App server protocol                                      | DEV: http, PROD: https    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","_id":"warthog@3.0.0-beta.3","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-HOv1lgUgNrc7yR9mhLzKO6CCEPk12NkbKNI2O5WNs8rcXCBSLz6hm6YpTHDXK/huMlz811CK/eRQU5P9uDDFJg==","shasum":"17a25881a00a5b56d1a5df45b61e3d20b93cc9f5","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.3.tgz","fileCount":393,"unpackedSize":969685,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfVHQYCRA9TVsSAnZWagAAnRUP/AinrqRbmH67qDWmKise\nrx9+Wducao6Y15OJw8IJTeROgx3hnufxuiU6pf+OU03H9VoqGwV1kk1py3Ni\nP4PEdzKMMQKLhYN7KhdEZ10ZTKYlj2oKbpsYS5FwJRXqbIDDsYRavIN2/Wjv\nginNQB0OXJPIe4QfY/iyJsAWg6IJveURnC20aLfanMMXffuf4JyHGiAUiIOT\nyr05FP4sKY9Yka0vPgAjZC0tmai0LHH8fHxET9ymgVCNARSLIh0KgoAD7i9Q\n63VUgfki77XuLpF6Hccwjq70sDK0jQPa9S2Lc9xwOAMIWYZALVs/dcMxo4y0\nYiu1pRa/fKyqmNgijKQ7667t+4GgzVPtN5eNcZfbqLg92gEppCagyHh4/m/I\nVpoR6bO5isQUnDGluZfGZHCRlVH/H8xksjKjkOhOhforz4sXwkW4H/TtGABf\n+UYt5nORBaBgR8VdFE7hSqY7zv+sR0wpRSeqjJzoQyQuZLPvqI62PpD+Gp5d\nz54aUYOS+g6af5px1zg2P1clHjtZkUVkBkDoY5Jb8nKBYm+7afPr6Jbf755Z\niXRm//BLBBnhVN35R0MI9EneixbZAuMF/OHsW+f7xAihfPWrANBEy4LqrNO7\nW66e1rLOfCAO1hVAEl1YgzdSxWkUK7yM52CZitbYtufNH7kViPcnzWShpce3\nmHry\r\n=BSWh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAR9887n2rfzhZ2BIHvi5UNc7Fpk/6F5zlHmhzjWV3WmAiAffOHq6QLVwe0X3CoIygPNS3aUDfsMXaSytukiME50og=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.3_1599370263774_0.8973639137939788"},"_hasShrinkwrap":false},"2.18.1":{"name":"warthog","version":"2.18.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.25","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["main"]},"gitHead":"a91411655a108e9eb360ccd8476a0c12152d5951","_id":"warthog@2.18.1","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-AlVLdbtcxnDzepmZo9BDXE08mBYqjm1xFglhG5suJ2p4CwGtI84zVzccStNvzSjA73XZBN2S/W6hqepwtuXeCQ==","shasum":"9fd63c9ed2c97e7fec42d953cc159e804155b3b0","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.18.1.tgz","fileCount":365,"unpackedSize":957458,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfWRoBCRA9TVsSAnZWagAAc/UQAJ0kqi6kFYlcJ48iYnns\ntqY+Dl/UrePCuP6fekiH7HILk2PICbiqzbgn6h6PkM47uo4PfmrFFf2h58OW\nccmIOq959aMPAm+W1cnoXy2uKq8uxfxxq/9LqS+HOtJ4C1rrD8G55dvaWbF/\nis3fMdlCTfEt6nXElRO6nY6DU6dEX+xyg87zIAaS8UTbQhxiPUChA5j7qK9M\nKVy+icg9JjHo4WoMxihyJAOBJgGZx7pwjD8SMiittg3Rea+vweuyfBGFdlhS\n8XSb+TNQIlMBNVJttt/5r4BfxFXVJdDZ7aaQKSpSY4Klc9euCzroeQUWrydj\nS/YcB3hvwfS9dmDdWM3mvgYknNZU+3sgKiZY0fInz+03o+CxllDU40HqazbD\nJslMqOoNzVPRoTuy+Bmikqxh3UJ5jvSOPU79+0nWWQrmbZRQhXOMQMPlSTDM\n0CebAPE1zlRocMcLVl8ZgSlKW7AVwFRE7afjsyf9jluDViqCTZ8TdgZz/8xK\nlpedRxKuOOvEsgVeckTP2eyfMmTFXCOUSt6AL02DaJNecvURnsyNx8NzigZ0\nF6CIPiaHigwW5vJ692bTaGKP3eF0O6vj6gJmAUzjUWokn1mtLRAHiCmINO9M\ntD9k3nRwhMmRD8HIjWiOwZx59XT20HAPOqVmGN416hDtzYyc7pArUJc/yO7y\n36JD\r\n=JQuq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDSoENyYlkhiw4N+T7VpDk0D+vP2zOY8QwK1VflLaiQ1wIgIgyed/zN3GQQ8xgJg3qCheIATaylKSR7BrxYE55pl2Y="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.18.1_1599674880703_0.5218593053519569"},"_hasShrinkwrap":false},"2.19.0":{"name":"warthog","version":"2.19.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.25","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["main"]},"gitHead":"eeddc26e52a2ef18bd34fd727eb06a7d24f3ae59","_id":"warthog@2.19.0","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-iUEVVGH2gewBTBYCXyUNMo5eMClJoMCgaUKyYoHgYfKnGV1kDiF5i9Wu+5sarVJCpB7YzmrdcuoRuckLCa99CQ==","shasum":"f3cbee7812febb179323d867d4a0609ad0ac90e5","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.19.0.tgz","fileCount":389,"unpackedSize":1057142,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfWwRoCRA9TVsSAnZWagAA7DkP/0L3CRk9N8ean7Z92QIK\nzmE76g3w6wc3ggsuVCm/r/5ug3dZpSN8Apo+2kVCpyyTF9COqynU8USJdvoy\nHUQPztqPSqMI1ehMxqoTDt5jmMYv6DJuhM15WGeeTR3lTHkFX73zVOc4brvr\nzchLr2Tz2N1AWQlpfFBp09385rXKwmdXdv2XjyfBaPnvXWtJf29wZqJ4PHEd\n4ulZjL68St+RwQ4T9+LzkdJBouziEi58ZU5K/w03xcZStNgWe/5hDgajjbvr\n3BRqT7Mb6PHX8rXYWvyx8ZzTxFlBlL9n+xVSCuAB0TltEFAF5/rk8UIn8ORz\nOjZlhA6wuFlx1H3FPg5qDk3hlW/5mXOmwfFuodQQi2HCKBDrdtBQ2mE8MWbe\njS0h+NdLLddg0jZm0omYMEu/g9isE76nSxwPJZNmKZ+oh2gdGDQs+E04zp7R\nnuJcn6kKbxyzOgh5JDgGrVus4KSX0ky+SeLnnxUDar4vl8ZpVvP57qw4Z29b\n+iA18bxK+EMa1rCOylWs9IJX3ehJ0hGrySyWEJUbiRyYV+hH5zuTVHd+DZ28\njPHmHdLqqmUYJKKADSYAz7IKSsl5HVKPLk7GDSaeRhAJYjM43J1G3MJqLHxv\n/GQDQ/132QCc4E1UJlOM57mssbxz3Z85a5MKM/HRjvtD64e9tKWsWNjbrRE+\nblCW\r\n=FJzP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFhe0ncE2UK4Q3SxzlzigWB6RXkZKW6IWJ4WyL8tSv8eAiB5kZ1et/4F9C/w6D0bx23ZMgizhUeueriH3VibqvIFcQ=="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.19.0_1599800424104_0.6637696254648962"},"_hasShrinkwrap":false},"3.0.0-beta.4":{"name":"warthog","version":"3.0.0-beta.4","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.25","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"gitHead":"d598d3e404f55c98e9c536eedd6f09363f8179ff","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 1.0 to 2.0\n\nWarthog is now on version 2.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### More specific scalars\n\nA few fields have been updated to use more specific GraphQL scalars:\n\n- ID fields: previously these were represented by type `String`. Dates now use type `ID`\n- Date fields: previously these were represented by type `String`. Dates now use type `DateTime`\n\nSince your GraphQL schema has changed and so have the associated TypeScript types in `classes.ts`, there might be changes in your server code and even perhaps some associated client code if you use these generated classes in your client code.\n\n### `mockDBConnection` has been removed\n\nThe old codegen pipeline used TypeORM's metadata in order to generate the GraphQL schema since Warthog didn't also capture this metadata. Warthog now captures the necessary metadata, so we no longer need to lean on TypeORM and therefore we don't need the `mockDBConnection` we previously used during codegen. Searching your codebase for `mockDBConnection` and `WARTHOG_MOCK_DATABASE`/`MOCK_DATABASE` should do it. If you've been using the Warthog CLI for codegen, you shouldn't have anything to do here.\n\n### Project Dependencies Updated\n\nStaying on the latest versions of libraries is good for security, performance and new features. We've bumped to the latest stable versions of each of Warthog's dependencies. This might require some changes to your package.json.\n\n### Troubleshooting\n\n#### Cannot get connection \"default\" from the connection manager\n\nIf you get an error like:\n\n```txt\nCannot get connection \"default\" from the connection manager. Make sure you have created such connection. Also make sure you have called useContainer(Container) in your application before you established a connection and importing any entity.\n```\n\nIt could be caused by 2 things:\n\n##### Remove explicit `Container` injection\n\nIn V1 of Warthog, the README suggested that you should explicitly create your DI containers and pass them into your `App` instance like so:\n\n```typescript\nimport { Container } from 'typedi'; // REMOVE this\nimport { useContainer } from 'typeorm'; // REMOVE this\n\nimport { App } from 'warthog';\n\nasync function run() {\n  useContainer(Container); // REMOVE this\n\n  const app = new App({ container: Container }); // REMOVE the container option here\n  await app.start();\n}\n```\n\nIn V2, it is recommended that you no longer do this unless you explicitly need access to the Container.\n\n##### Remove references to Warthog's dependencies\n\nIt can sometimes cause problems to explicitly require Warthog's depdendencies (ie `type-graphql`, `typedi`, `typeorm` and `typeorm-typedi-extensions`). In future versions, remove these explicit dependencies from `package.json`:\n\n```txt\n- \"type-graphql\": \"...\",\n- \"typedi\": \"...\",\n- \"typeorm\": \"...\",\n- \"typeorm-typedi-extensions\": \"...\",\n```\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up. (Note: Postgres 12 is not currently supported)\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_APP_HOST              | App server host                                          | _none_                    |\n| WARTHOG_APP_PORT              | App server port                                          | 4000                      |\n| WARTHOG_APP_PROTOCOL          | App server protocol                                      | DEV: http, PROD: https    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","_id":"warthog@3.0.0-beta.4","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-ZXaPTkXaw1uYhTlBHiQRaBADYU2ksWHhd1zjBDmurLc0KkxQuQdGjwi+jqMpcZg7r3p5QweKTcXjgsyZHbF/Lw==","shasum":"65c40d53d550e7729f6d7df7b0b6c9719961bd1a","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.4.tgz","fileCount":414,"unpackedSize":1065497,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfXCnaCRA9TVsSAnZWagAAJaUQAILO6n+fxPuFi9i4TXau\n2Mu8XntB8oMP2zcsLzScmXhBISqeJ7dle5uYZxkbr8usvhsCHPla3V1NjgWo\nktcbwH9gKF9XmB+TQa5G+TJ3TSZH54KVCJCWSJ8nfhSInU1A87mNikNA0Wqf\n3k0j48j64G5xak6LzCmfhudPOyZEspzcavwIFdoXK8KzxS915BP4htpqN89L\njY8AyiMmJs/J9qGmLTpHRGcc5gUomfQJ3o+Zcw1orZKS3Oqapd5Wx7MjszAX\nqpc07p1W9iG8VntZ4N71gSkzOjw78gskKymV8jUw9fq2hrB6z44sob67dAj2\nFjW+wYsevhtynBlXZjE8FEkPfd9rc9KbPCiZ/qhsUWi1ylngDG1pmymBy+p4\ngO86BzerdQV1TAgTbT8ZBTs/EcN3rQymxsIuLx6lxnNITID30OfN1wQmqnAs\n6t9Vn/bfv8vd0QgmGk/DVK9sUcw2mA2kORUhDdS34QMcEMqvdEqoLdZk23zj\naCbzkm85OJeFGJT8tf2g4GLBDtdAqWs/mGApTt0qCfvRtxh/xiYznzZShOIb\nxW+OwWaut292z9LKDRTJN2OTPFQiU4VLRtOS3havvoaG4slZj6PUHaK8+av8\nG89xO2ZkhqcckB5L1oGvMUQU2kDAKpiEM16irKibxn2lnpKsYIo/CZSqHxrh\nALh3\r\n=a79U\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDSXa2E8CUEzvKfiu3+FICiPba2fwhjsEZcrGJQir59RwIgV7NkmfeFzFNmwnf/tjQMv4butDaJJVY2Z5tTmkI1rXE="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.4_1599875545675_0.1015417753319936"},"_hasShrinkwrap":false},"3.0.0-beta.5":{"name":"warthog","version":"3.0.0-beta.5","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.25","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"gitHead":"5a75c4a59be08ed51ed0138e9ea7e9cd900d73d6","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 1.0 to 2.0\n\nWarthog is now on version 2.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### More specific scalars\n\nA few fields have been updated to use more specific GraphQL scalars:\n\n- ID fields: previously these were represented by type `String`. Dates now use type `ID`\n- Date fields: previously these were represented by type `String`. Dates now use type `DateTime`\n\nSince your GraphQL schema has changed and so have the associated TypeScript types in `classes.ts`, there might be changes in your server code and even perhaps some associated client code if you use these generated classes in your client code.\n\n### `mockDBConnection` has been removed\n\nThe old codegen pipeline used TypeORM's metadata in order to generate the GraphQL schema since Warthog didn't also capture this metadata. Warthog now captures the necessary metadata, so we no longer need to lean on TypeORM and therefore we don't need the `mockDBConnection` we previously used during codegen. Searching your codebase for `mockDBConnection` and `WARTHOG_MOCK_DATABASE`/`MOCK_DATABASE` should do it. If you've been using the Warthog CLI for codegen, you shouldn't have anything to do here.\n\n### Project Dependencies Updated\n\nStaying on the latest versions of libraries is good for security, performance and new features. We've bumped to the latest stable versions of each of Warthog's dependencies. This might require some changes to your package.json.\n\n### Troubleshooting\n\n#### Cannot get connection \"default\" from the connection manager\n\nIf you get an error like:\n\n```txt\nCannot get connection \"default\" from the connection manager. Make sure you have created such connection. Also make sure you have called useContainer(Container) in your application before you established a connection and importing any entity.\n```\n\nIt could be caused by 2 things:\n\n##### Remove explicit `Container` injection\n\nIn V1 of Warthog, the README suggested that you should explicitly create your DI containers and pass them into your `App` instance like so:\n\n```typescript\nimport { Container } from 'typedi'; // REMOVE this\nimport { useContainer } from 'typeorm'; // REMOVE this\n\nimport { App } from 'warthog';\n\nasync function run() {\n  useContainer(Container); // REMOVE this\n\n  const app = new App({ container: Container }); // REMOVE the container option here\n  await app.start();\n}\n```\n\nIn V2, it is recommended that you no longer do this unless you explicitly need access to the Container.\n\n##### Remove references to Warthog's dependencies\n\nIt can sometimes cause problems to explicitly require Warthog's depdendencies (ie `type-graphql`, `typedi`, `typeorm` and `typeorm-typedi-extensions`). In future versions, remove these explicit dependencies from `package.json`:\n\n```txt\n- \"type-graphql\": \"...\",\n- \"typedi\": \"...\",\n- \"typeorm\": \"...\",\n- \"typeorm-typedi-extensions\": \"...\",\n```\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up. (Note: Postgres 12 is not currently supported)\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_APP_HOST              | App server host                                          | _none_                    |\n| WARTHOG_APP_PORT              | App server port                                          | 4000                      |\n| WARTHOG_APP_PROTOCOL          | App server protocol                                      | DEV: http, PROD: https    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","_id":"warthog@3.0.0-beta.5","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-qLqhaMHmHxjWIwYCg8i0kFFmqBQYykxcvgaQapiaFr/Vhl63KV+3LR6+Q36vZpUozCkFTVP8vt+6IVradn+MVg==","shasum":"4bc2f1aaf674d1321029c54c92f2c70c366f285a","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.5.tgz","fileCount":414,"unpackedSize":1070423,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfcTksCRA9TVsSAnZWagAA93cP/0sjtc2z2U85AhJG7s7l\nqSYS0mzjX1pri4CuqhS+OX+SLNd+k+znVM9ktJYBHKMO9f8/Fv86gZsEXaOD\njRtxrLzXzX403+md5isKfswnP1QHaUdjMhhVCHPx/gZB4BWgtK11HtkjwLGj\nL1FX7PILjvrK4JgcX5HdZ1Eg2p5Tm1sQDM1w2SQD2gSjvHC4kNLHRpLa8rsQ\nlauo/KbvIau4rfiJI5j3FqL1MwsfT93nN39TbQBnTyaX976BPHdCSzjIbcw1\nFnqKWaazh8fHn89QLHg3F/ixl8f/xo7Rwy9yejKEVDsyd1jLA9DnsXxZFMX0\nDm/6hBTX0qjhGvJWiCsM4SuwI7/wWqRe45YxXC+8dMc5QDmSPnDYjGMx6aKY\nOOfHmdtydhZywH2oSeo9P+60QLkvk/PnTKwbVXovRR3y9S5fZtzdCdweKWSJ\ngkqUqKYTDjfCwC35gMgwacZwiUDbg1A6Sp4Pmh3r0Mkq/v3YEgI0DF21CFZq\naCQk4CQVpdkoaE4mjlCAfvns/JybeiYFbuf7UYL5Eh5m3mkJ0puWewSOFx0c\nttNgilaKetAm+7+5Xsb62Bnh2Q9cwGCDhf8K0SzCilvmoA2/hEwYAK3ilO0z\n2Yqnexrt5Eyw/7X2PTzXXunH/fW/tR6K/VTzbCybxPkllNyDnwqHKLSxY80V\nZNZB\r\n=5W/X\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBoyRrClUOJ4qI9pEdPMDKRCdvSoRgdIdN7Jjt9ib8CfAiEAtEw9I8c4B/xhfbO0D26jx9xSP/TK2m0PaIyrbWBrCpQ="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.5_1601255723687_0.9443421644626804"},"_hasShrinkwrap":false},"3.0.0-beta.6":{"name":"warthog","version":"3.0.0-beta.6","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.25","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 1.0 to 2.0\n\nWarthog is now on version 2.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### More specific scalars\n\nA few fields have been updated to use more specific GraphQL scalars:\n\n- ID fields: previously these were represented by type `String`. Dates now use type `ID`\n- Date fields: previously these were represented by type `String`. Dates now use type `DateTime`\n\nSince your GraphQL schema has changed and so have the associated TypeScript types in `classes.ts`, there might be changes in your server code and even perhaps some associated client code if you use these generated classes in your client code.\n\n### `mockDBConnection` has been removed\n\nThe old codegen pipeline used TypeORM's metadata in order to generate the GraphQL schema since Warthog didn't also capture this metadata. Warthog now captures the necessary metadata, so we no longer need to lean on TypeORM and therefore we don't need the `mockDBConnection` we previously used during codegen. Searching your codebase for `mockDBConnection` and `WARTHOG_MOCK_DATABASE`/`MOCK_DATABASE` should do it. If you've been using the Warthog CLI for codegen, you shouldn't have anything to do here.\n\n### Project Dependencies Updated\n\nStaying on the latest versions of libraries is good for security, performance and new features. We've bumped to the latest stable versions of each of Warthog's dependencies. This might require some changes to your package.json.\n\n### Troubleshooting\n\n#### Cannot get connection \"default\" from the connection manager\n\nIf you get an error like:\n\n```txt\nCannot get connection \"default\" from the connection manager. Make sure you have created such connection. Also make sure you have called useContainer(Container) in your application before you established a connection and importing any entity.\n```\n\nIt could be caused by 2 things:\n\n##### Remove explicit `Container` injection\n\nIn V1 of Warthog, the README suggested that you should explicitly create your DI containers and pass them into your `App` instance like so:\n\n```typescript\nimport { Container } from 'typedi'; // REMOVE this\nimport { useContainer } from 'typeorm'; // REMOVE this\n\nimport { App } from 'warthog';\n\nasync function run() {\n  useContainer(Container); // REMOVE this\n\n  const app = new App({ container: Container }); // REMOVE the container option here\n  await app.start();\n}\n```\n\nIn V2, it is recommended that you no longer do this unless you explicitly need access to the Container.\n\n##### Remove references to Warthog's dependencies\n\nIt can sometimes cause problems to explicitly require Warthog's depdendencies (ie `type-graphql`, `typedi`, `typeorm` and `typeorm-typedi-extensions`). In future versions, remove these explicit dependencies from `package.json`:\n\n```txt\n- \"type-graphql\": \"...\",\n- \"typedi\": \"...\",\n- \"typeorm\": \"...\",\n- \"typeorm-typedi-extensions\": \"...\",\n```\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up.\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_APP_HOST              | App server host                                          | _none_                    |\n| WARTHOG_APP_PORT              | App server port                                          | 4000                      |\n| WARTHOG_APP_PROTOCOL          | App server protocol                                      | DEV: http, PROD: https    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","gitHead":"f448391ab323d2f4b9fda9ba93e23c53929aedc1","_id":"warthog@3.0.0-beta.6","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-p7boW+ndtcSONB0a4X0sexCL0dmAqU0R4FpWOuFtAJ5BGoEnOgua5y2YqQ8B/8cDRRiVPjdGIOz9cEn11JCm5w==","shasum":"2999cf53f1c22058670e8f384877cb863ca6743d","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.6.tgz","fileCount":414,"unpackedSize":1070563,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfhTZZCRA9TVsSAnZWagAAsmQP/31Z+UDz0NiLpVLSqKSf\ncdlX64vdLofF/axc+Hoe93T0MMIgOGvoW5ekpxw/Tb2eEXATP1bJeI7hqP9f\nIEJPgQg4VgpvvqMkrl/1KR+Ego56vkGJlsiO9Y6yV6F4dNoBjVnhAkoiu02W\nc3qz1Lkcl2D9f0ECbIEZZY+YY5xiHsetrO/FGTndvQpANectLtZF2oqeOCrg\n4qtOH6MZu3OzTUHwm991fGKsi01UEKaspCTzzYUftk13Mfs5FDs3iKEUlXC3\nNMne6FspypXOtCb9VPQRqdBHZVxoziInLAC4qaaWqlFR88oCA1WYJtJZ8AWe\ng6BLwFnKsPGvqHwhkHRUAyHPvZbX8gBxL5vv2tXAUh/WO3BMueByY0IkEu/d\nbIwSmrK6e+CzodpjoMk+M7rqiUYd3ujbTMNXJglrK8dtGD4sRXfTUe2AJila\nOEARjLTqhOFMIverZe2I0pWJIB4KyAv5wVQ4SfgwqxTpEdzzcw5hYhsDO2k4\nJjCNy9wgp3w/twIKoZ5w7BVfWJfs0J1gG0BDgGgpGoOL7p1sgeJlU2d2vFmx\nIwBiVDBSc6mrMUvC1E84hCH3tQlx5IaFe0V7eYVami69mk6WQpp4Gonpj1f9\nqgBLsDnWJAeoyIUGyOHExEcfXBqDJ82bOn5heLZBXagaAD3BVAMvAkCVb/W4\n/RDr\r\n=Bokj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDl9oT+e1n86rOL0eTWHKaYIri9p92QHIraI56+JOyHigIgGlr4oRGNAY5697xI8kbucYykei1qyaXSpmNplUsxCGc="}]},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.6_1602565720922_0.5583783194739431"},"_hasShrinkwrap":false},"2.20.0":{"name":"warthog","version":"2.20.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.25","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["main"]},"gitHead":"d74411c9a78cd2080c624699b1646e72fdbfacf0","_id":"warthog@2.20.0","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-EIYks6l3FY3CyWAyVjBUwlFiHRTJV4Ml/HcwubIrV2rTKeh86Lm63OHtZVzsCLnU1PS1MT8//HbcpjW/GeUTSg==","shasum":"6476b59a16cdc40f4f919c0ab9d0c9024416beb0","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.20.0.tgz","fileCount":389,"unpackedSize":1062318,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgNeBbCRA9TVsSAnZWagAAFQMQAI+sfpR6ShZXMV5+Hs/u\nR9KLiM4/dWnElm4aBOWsiEPego3DmbZnOYUYJE7gZ6ClXKq8KD9Ih/lPnaAV\n4qnjxIcllkaSKXNLJ+E+JWGkOs7cA8+10aq/ycaKZf1pYPtoQEt587n6qvSU\nzwbU3TmHexr0vYfFGcV+AEwQz1V7q092RWcJQqkSPBNWyno4W9z1Us7xFPQ/\n1Og31kE5Z/RgsQT48mV7pYV9u4b0WKKGrY+z2KsfTi26O8mW6r1m+i3dAAao\nW2fmzotESS1o3+6viyf4zQffjAGMFWY8kFNFwdHvQbrE9vWPPupCG7Oxk3gR\nFsQIRGvORsLYkxgJJAYLSe2hIjTVlsi5m5olAvAI/F4p0Ytc+fdmVesFNWaq\nl4+pZPznSHxrxJLmctNSoFt2iLnN5IjxFL8Gx9xufGgcOBP3I2x5i5xUqwmz\ncVipDdXMOd8BaFRgiaNZVNF4yfr0mByy0GViMI17iTqd0SHjhbsm/7+Ks6wy\nFoPowxOFmq6ysi+5Vte34aHveaZicnUfDfAqykbYzVtt1U8XURso84BPZL7t\nCY1kVpHXl+4+KU58GfzoWiBJc31xKgAKiHG/OwC5cece8Dbc7EGDqJTrZ7i2\nzKGg7Nn50tixUoUOup7UcugSqXs3Sf1HuORfeY7esDf1FiCjQ4DyZrYw37vM\nxgkO\r\n=KcN3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGAXpiUrAGlaAZkSZGeB2WxrCH+FzA7ss52rFn8B33aZAiEAjOMvgMQubMTwOGg9wnVcqs3BtgtdALD50zzetdY7zHY="}]},"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.20.0_1614143578809_0.8123762676790207"},"_hasShrinkwrap":false},"3.0.0-beta.7":{"name":"warthog","version":"3.0.0-beta.7","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.25","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"gitHead":"90df3f1cce518f1ee2afd250f7f1520dbd89932b","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 2.0 to 3.0\n\nWarthog is now on version 3.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### BaseModel has been overhauled\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up.\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_APP_HOST              | App server host                                          | _none_                    |\n| WARTHOG_APP_PORT              | App server port                                          | 4000                      |\n| WARTHOG_APP_PROTOCOL          | App server protocol                                      | DEV: http, PROD: https    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","_id":"warthog@3.0.0-beta.7","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-KQY6Y4SMV2Z2MLRTV+n/yuWX4sF9g0jWpI7Is1rNgxHWmqy3u+nHnLOx2M7t2M9oHPUYQf2YJIHb2NXBJ6ACGA==","shasum":"7fe56e71bd24c22189d5865b8622aef46dfd3086","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.7.tgz","fileCount":411,"unpackedSize":1065318,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJghu4HCRA9TVsSAnZWagAASeYQAJsS91qYUY5zcF3zba0H\nBjQDyv7nSJR7bXHYr+CaEmySYp+3KlT6I1GsnVIUBGMHIHQjC0GVkb2uH4Tu\nZNgqfXiGnwmpuz9M3peo8oDzYlVmn36bauIuMOW+g9g7JNwPwNdS+QV2YOdU\nNz61kdGIzqzl0v4vXk2K7x55XB765x1ZMn7fegKnSPvPTgcOfzhQh7WMXaVV\ne0Kzf91xTnM182phmQ6VMw+AfPKcm6H3GCoaC0HBJfP+8mZqrpRLqjmMCQ+r\ntm7tXh5DuDiVr4d2DXOkgIBuu2Ltdr9IMmjGc8zgTdUKnNcXpICFpF7+TQVO\nHF0XKLh3MJ9Vs6XR9eJZr6lJchuTu2WhM2GxxzAuZQz9ITqqQGZKhEDTyMJ+\n9O3zeX3xAqpuONqS7SeXbhWm7iykZJvZgC6wnG7ugG+ZNmIEyC4xafU9GnmB\nzhbGnrT0mAyMawCtN/NcEAxMBk4RYuCgwlknOjquguTSWXIl9Hk7zpfQBoLh\nwh22JzO0XRpoewVaABtrtzydfNyfVr0cFtGQP1kh4Ez5QX2VDHk0FaVl/gW7\nFR74zn8i9lmbkF4LO2W+nvpYbTWcZR2yzODzCcB/WwnSMeIV5WONMbmPz4jn\nuVtp3NMGjVCMybc32YM9BXIcWtaB4Q/mgMe0a1yQXfDvVcyqcCmmKwGV0m2e\nr5JC\r\n=tZGs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCficAvsQP/AcO3LIXc8eVnJ446j79p1dBdNlapdsVq4wIgIP7dYocdH0FZSfiEU4vA/2HctHJNruPVAv0CDCIa39M="}]},"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.7_1619455495479_0.04354189216151405"},"_hasShrinkwrap":false},"2.20.1":{"name":"warthog","version":"2.20.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.25","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["main"]},"gitHead":"f0fbd685a7238771efa62b972ac06eada737b1b2","_id":"warthog@2.20.1","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-EZDzpAhtpej/jhu4pyB/9dx668jOX10kUjsSQOo+LlpbZUYuWAwHKnS5V4zdfhj59pLk4s0+Y7Hn9pqHazqYgQ==","shasum":"8f06611f6dcc7a63f080254ef16018651044102c","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.20.1.tgz","fileCount":389,"unpackedSize":1062715,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJghu4lCRA9TVsSAnZWagAAQ2kP/i1D/3jFQQe/EF2JRIBq\n/tboH/p55NxRt/4n2bDIvSYUH0abhbj1nhhK19sz+6o1bdcF0Dl96mHAVTQJ\nu+4EbXNvn6Mpq3UFJij2QaWNKfdkCRaP01WEQQLezEMERgKQLpwmAIX926pE\nzK4/ExKklVlHszdNCH+ZROZPAlW7CKcTwxW8HkkRquqSP/yD/byPXBMXWizL\nCYZAbTFpMoIG1kOrXlx/SNpOR9U3w0U67haPmMhkWadZ97R6UFOt/+9N0amF\nGj/Oyf8hGRARNbcGys55LSuOYaHXkIoYfmiqGTPaCsDtBwksbAskW/C28cyY\nTWi5auZw+xuDgttZNzyEUhgrDmMcWjbMCbLppjr38earmkKEBSGya2NMXZA9\ncB82Vy7JUku8YsOiyI8sVFmoWGmN3NW8SNJYHWpRUHAZrov2ohHcM7vmChUO\nuCB3tUvc3lj3ZGgatu2GpLSF5KwMDhBvbUKlVveEBmzM0uGCCBSiZjE+bApR\nvnCbf0+briI9kH/K7cCWxdLGUcUUYnXjVndjhKkC53337gONJF68VbuccuSM\nhd24LdZzM0nT4I/vQjEjaClXI5+f76VR/7slukNiX4IeKhLVNvJGoNmOUVT/\nCLf6EXK/lv66HEJXRghXuIWtbTkRkaAuZbvze4tTqP4hftNBgwryKIlMmf6K\n/nfQ\r\n=ZPth\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDTVe/e61lbzunkPPnzWAkwu8WluPhqlVMG/evvBf5/lAIgWpt/FRkrizQ1ULz7Y0rS/xYn1G1G3e1KVyN/zzLSokc="}]},"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.20.1_1619455524552_0.43912788366107147"},"_hasShrinkwrap":false},"3.0.0-beta.8":{"name":"warthog","version":"3.0.0-beta.8","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.25","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"gitHead":"bb087ff90cf18feee0ec8d5eb7bbdd9464095237","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 2.0 to 3.0\n\nWarthog is now on version 3.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### BaseModel has been overhauled\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up.\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_APP_HOST              | App server host                                          | _none_                    |\n| WARTHOG_APP_PORT              | App server port                                          | 4000                      |\n| WARTHOG_APP_PROTOCOL          | App server protocol                                      | DEV: http, PROD: https    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","_id":"warthog@3.0.0-beta.8","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-ZnVzsGqc3iGl+E3zwjj/X4+LyAfoO6TbQis8NZ0vILbMl+U3+9wpHKTblU09nV2IeeYEN1/t3AJHiNZb/hxZ8g==","shasum":"7e3a229d19c6d56a57330521598b879d6ecb7789","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.8.tgz","fileCount":411,"unpackedSize":1071377,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJghvlgCRA9TVsSAnZWagAA7ZsQAJD8ZOYuv7l0zxdzhmZc\nFgcTFcwknCVXFjA5AsUAkPiOZwn28+uo3RyIhW7zIf1YOA7VBgyo6rogjLiQ\nX1QEHuk9EGgWcnbv8bLKKkM8cioCJs0h0xTyoL3uUNLM6lrX2obmMeI2cW2L\nBJEO+ST8MX5Z/sLC4s9PEFmyW7ZiadhGVByH08PHFzfp1rWzFYf2/qhyWolw\n6rz+MAFkqGVD+M+ctd84JUNF8k7QbY4cm9c892fWmy2g54L4brjFR23avFPW\n41T+atw9SouGekoHzpYsatK2Aro3WNroA9F70yfazZOkbQNjdohTSsiJ3E7n\ns3SeWyQuscxFyg1dOTIgcGcw+CnfevfbkJRxQT5/Sh69xDt/QQzLl6vS/VVy\n53HzkD2K8G8QvqlwrFLGHldlT2hU9TrYVoXz9pP3HJGSQHlk76gx+EUXCPxj\n4XNitIvYR9TU6kSS40iCQ8/RWq3Cpujbe9Wfujq9dg2sEVCDNrKFVUtFAc5z\nLibJ7tmJphBM/bqvm0gg4V1n4ToakH93OyUxoSp4LspsODgxb9jNmHIec59k\nhR+d98OSbof3hpLYuFA3EV9ZezMPt3sxy3fMV1EzSiNydwag1/opCfXb2N79\n9Je2Sa5J22Uf61HM9pdxeuQimgMZC5cqmKxZLquQzoxXTn3XlMxSpgqVadu+\n7/du\r\n=TyMM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDXECeyhDno/4Ni0eH/UBLJm1CX/jRlKqO4EkUhiY1TdQIgIK/CpcJ4OWivf39O/gHmbNMGCx7dM2hXV/SL0yHXXqc="}]},"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.8_1619458400113_0.8659198566601272"},"_hasShrinkwrap":false},"2.21.0":{"name":"warthog","version":"2.21.0","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.25","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["main"]},"gitHead":"b2bcabba132d4464909db01d1a5ac45b026caf6f","_id":"warthog@2.21.0","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-TwOd2vmYy1YcqHsT4CyPMK02HLqHVcWSAtAzIe948gIoCvDDMG6eMtxxIgThfeaFQh+j87BOjuVIsfWaCmMbsg==","shasum":"c7a5aa01d935ee8b5de23ba1de06790edb51629b","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.21.0.tgz","fileCount":392,"unpackedSize":1065151,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJghvs+CRA9TVsSAnZWagAA2yIP/jcVjVIzeMR8jmwid4LV\nnyXTA2fzY1jQgUfJMJezgBsFjJVHvInHY5qNA8xyoVFgJn2OKDCzHq08kECD\nV1VbgLK1+4oT0ze/BCRryQQ8PW+Nn/C21Y2cTCUGj1dcmNOGH6MY59Gvy0R7\n0c6TsjuFzLsaVQqA7JNNaqCz7FPP/UnCxdT0wylync8FCCk0J9QnnucM/CdF\nu6qtiWUQyIVNdaFt5K5aDlwEYkdApyL9gmCdtJV9+IjjtYemRUa5u59/qQf9\nFg5A+U/XWdahPgsOECXlc7ZO9IRiYIsF91Xme2vrHxLPavHh2Bvy49LFlvRp\nzSq/YKISFlnQthC6pr/5FlIHYYgzkECHTyoN/p43VyarZS/QjAYluOc5fxUh\nzlYZ1lGM7FUwTE95m8kmcFyynY+UPAMI0wOtnjHzLA380sNaxEcxHDTwHFmH\nj9s1wzEkIBggBU5HZ/DUB6tRy+g9+Wpx2XNiar7xPzOsusT836KTKSqnainZ\ntCx00jaNtZdVV7oXq1yTNhAGkrTujSBHUzwAqgQNAE1oqusCH7yZBKt0emsd\nR6hkvlP67+3fdpIDdZ3F80pj0ePIhWbJjiDUY0wuEg4EhmzA0YiFcmx/tPUb\nW2Dk8NLg2obIqfdT7u2XfUN9v7ezkHmyrtAJGFmHVwos0PEFh7j4+ahLlmvy\nmPkn\r\n=myQ/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCHpsjO+P0Ex+r7BU7mWcBE7Un/NaIGSpi3nqR+fPsx9gIgO5xDRxqdu9AfNegOaUOAg6BVcyXOstdME+aZHhdmAts="}]},"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.21.0_1619458878241_0.9888915282064454"},"_hasShrinkwrap":false},"3.0.0-beta.9":{"name":"warthog","version":"3.0.0-beta.9","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.25","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"gitHead":"a94e81953c1cda2ba8d69a5baf280eac357ad202","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 2.0 to 3.0\n\nWarthog is now on version 3.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### BaseModel has been overhauled\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up.\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_APP_HOST              | App server host                                          | _none_                    |\n| WARTHOG_APP_PORT              | App server port                                          | 4000                      |\n| WARTHOG_APP_PROTOCOL          | App server protocol                                      | DEV: http, PROD: https    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","_id":"warthog@3.0.0-beta.9","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-Tv4bSOPVwoKIfqnpF1bnqTmu6Ll14WxDR+w98CCqhZO8CJ0n+/UgjXahk7g+Fu2ENF6gwC0V3U+3WYNuUe0V8Q==","shasum":"1c134f1bdfec3943b75609cac748416e301bc7d0","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.9.tgz","fileCount":408,"unpackedSize":1063557,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgh5nuCRA9TVsSAnZWagAANGUP/RJ3VC3ns5BoaApN0Bn2\nZScAeF5+eASwr8i4SNfWnuPOkHmOLt6ku2WKxulyuXLNf3BpoOHPtcFQVbTQ\nYP1CgnsKPoqV4zzvumTzYDSIg9J/r20VZVQkh1OltmuvgvO4ss3dDaBCtKJk\n6clRJVSqPH8Q90kVQ50WtliBg20Tu3Ciy9ZeloiunLDFhD+7zGSB3b62ZKu9\nczmB/6ZJPNeH+KvSLPA3qNwx4djR8DfybHvLqIhfYbfnUUal/toO23RauGx0\nR8pYR5zBDkk4WyRTzwbQVgfN5SBg8VacHk8flAi5hU0ralTj9Di/R1PE6V5y\nQLk+S/je7wChVGqwPaDY0zh/ATn5dYXJSl8Wv1k2MAsyh4DFSJtGcTJ2BSOD\nG6kytdd8Nzk4LUAuk8LtynrLPrfgWvf5cbVJ6X5g9XOLfEhcgVHaMuDgE4RN\nWbBnKaG91kIsAE6pOxdzp7ZRLnBnwcqGJXgEnJ0zfPKoFJuKruvDRImvzHfa\nYQncfX8AtpbVy4IMh/gj4baBHV3EOhqeK3trDBNXy3wdfwkH+Xta0pGLBPaQ\nQkQlGqRxVIYJtoWMxBql6Qyue3wEvLiJJR0e7KOGFlFRSFFup0SZNleMTjac\nu1wPp1AxtHLuWAn0zadGzdx/vGkK2OmK5Fwp0x97ISDCCbtNrK7bAa5w0s0T\noRZT\r\n=PDDN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG+MnQXv1xveCPg0rllMb4FM1hLxecf6HjptdLseY2OWAiBYZN6Rsg6IdQWUKcFbQL5wGpe9azXPKNZ9l3FMBOzzhw=="}]},"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.9_1619499502236_0.44831465058771314"},"_hasShrinkwrap":false},"3.0.0-beta.10":{"name":"warthog","version":"3.0.0-beta.10","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.11.2","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^7.12.1","pgtools":"^0.3.0","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.25","typeorm-typedi-extensions":"^0.2.3","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true,"trailingComma":"none"},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 2.0 to 3.0\n\nWarthog is now on version 3.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### BaseModel has been overhauled\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up.\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_APP_HOST              | App server host                                          | _none_                    |\n| WARTHOG_APP_PORT              | App server port                                          | 4000                      |\n| WARTHOG_APP_PROTOCOL          | App server protocol                                      | DEV: http, PROD: https    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","gitHead":"afc729af14ec02f107503d4e832bd1d842b2c7ae","_id":"warthog@3.0.0-beta.10","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-X0Oyf+XLcUWU6gPLBE43yY81wCHSVBG9uCDdMQ8u70sYFSMq6egodGqRtKK1B3GyRK/7L1hmj0JALmxbuYCBiw==","shasum":"70e25903b72dc2d0183d9941e9f9eaddb1fe5945","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.10.tgz","fileCount":408,"unpackedSize":1064839,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgj1zvCRA9TVsSAnZWagAAMAEP/iuSR3lT6W4NqH7maNeN\ni1ilXZCAmigBOI9Pg1fkw0/SewV9KUYXbjxCMe0wqs+Fo4aCTn/GKd89laUE\nx+cYWox5Qdk1y9TGrH/KN5+k5eSwY3GuPX1s5oo6SiSDcgPVfx5tMsXhC8Ul\nNjVgpwffYD9xw1lEj1OpIE3FcwyAhvrr1a4l+Sy+1+b5pwpKAKSuw9shU1j+\njHPiFMzwrQB8NBSiD06CDcnxzh7a56pddGHdEf13A6FMybvy7i/RU0bCzkLe\nDRi1HJkwUacBekgxhZtrhjAwb67dNBmI6ZpjC2+gLQxcjJ3ZbCYZAWIProYb\noX0ovN43j92H1E1kXiAI5kcoKA2VNckI02G8BntkiDr6CAiIuCJGO40+I6Ic\nJ7gpsNaqNTcCamSgvXN4EFfIAhHiOK8Jn0jw1Kys3OOox+7kKtFVx4FhaAef\nRMdswdTcPfSQyzIcLsho9RKQpeuRGa+TvnfXvi8NomuAMFJiwLlp7x2ejFz7\nndorYAlHrxbO4uTHXEtHrZhx+g8x3iVKiLc855qcr3PgBGaE8mfrqYH7FOfI\npCSRjR25dkdiQfHiiLlideMljLZ3oVO4urjklR4alZRlDfc9Os+rnbSA3HhE\ntso8AhrWrrfwLW+7fMnUca2H36YUSXp23HH0d08KlAyQMVWT9fMtY6Ve32ui\nGGl7\r\n=OP0u\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEGEsx0mXyGl8BfHJPieiJ3JMGw7F4yxQFRj4skbZJ4nAiB7QQlhhiqZkPGBkjLsyyOJhme404CST88TVPfqbD7VSg=="}]},"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.10_1620008174696_0.19818487336915536"},"_hasShrinkwrap":false},"3.0.0-beta.11":{"name":"warthog","version":"3.0.0-beta.11","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.14.11","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^8.6.0","pgtools":"^0.3.1","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.32","typeorm-typedi-extensions":"^0.4.1","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true,"trailingComma":"none"},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"gitHead":"c67c521498f9c1a60763bffbbf48a386be98e0f6","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 2.0 to 3.0\n\nWarthog is now on version 3.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### BaseModel has been overhauled\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up.\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_APP_HOST              | App server host                                          | _none_                    |\n| WARTHOG_APP_PORT              | App server port                                          | 4000                      |\n| WARTHOG_APP_PROTOCOL          | App server protocol                                      | DEV: http, PROD: https    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","_id":"warthog@3.0.0-beta.11","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-0J2VmXQAUcAmlaoM+3j/R3xInafdq8WpMJ9SVj6i0PSRWqKoF9wenTsW7rWOzQvmhouo79zgVp2uxAO09ZHdfA==","shasum":"7b3da05e3122cd6719bc2a007b8278db226b3f1e","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.11.tgz","fileCount":408,"unpackedSize":1064839,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgmgbuCRA9TVsSAnZWagAAeusP/Rfve6l2BQPUG7eFeWhA\naphC/bx0RFT3jKInPSWAlbz3d9U5LX4fRcvVKZZJa0z6y/9TrETbUy38ps4T\n1IPwWHmd0ey11SJb885cJhrSDMfCqthP/4qBmfJfRcirf8KkFhAL5VbBoc16\nsHuXl0uZjXCrUNwTUnuDF4w8oWj8IQTBIaWBJ+mhZVSbGvVVxwWs/oTNIOy/\nDWmznWO434KDE0wlmi2ZrU4qZktSslPbsoW6zgtG41npirXd73Ho57K9XXt2\nQ1qo/vff2cyTFTFtbzjzM1yWsl8iwLiQ2j0YOcn3JRUTgZ0qWqTmmv0CN9h3\nLB2K8EFHNrFXRub4RwF1OOw0yv/RWqxsXGolMIYTjc04jgBwTr8TntbfLkr7\nD8o4fyIw4x4ufXHoTfOgyr3d+4gMjSRbZT3oaAMZhb6mm+S8X6ZtVM+o0K/b\nomiLrlRg+dFV1+YpgpbcQ0lxS1bR5VOZc4MEg+SmAaeRFv9L8kJO0bzBA0ke\n6FoAUDzbHX/+5e2XMK+YTKU63sysTAMWrBmzLFltO0tdTrZqjqFAFHUrrg40\nU3GRDc7csndUrx1nO0RQovx3FuvnOAnYaesfUOOaRj3s+klDpgO0VJzm3tHV\nC2E9nbPGks0jK76xfimzRWSluBaMNzdgaWKtLsjul0cUERhWqfoAs1U+mUsn\nk5f2\r\n=Q4tf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCKS3BT7ADU6Poj8ZJZRRnHYUAB4KF4lHg2H7qS2uLYtwIgWB4BLbEc6kkDS2LitKL4i7CHJwtl3mg60wNx2TLh2C0="}]},"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.11_1620707053862_0.6502284075203668"},"_hasShrinkwrap":false},"3.0.0-beta.12":{"name":"warthog","version":"3.0.0-beta.12","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.14.11","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^8.6.0","pgtools":"^0.3.1","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.32","typeorm-typedi-extensions":"^0.4.1","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true,"trailingComma":"none"},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"gitHead":"8b7d1bda6c630febb17752d3a9ccb1ee42919cdc","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 2.0 to 3.0\n\nWarthog is now on version 3.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### BaseModel has been overhauled\n\n- SchemaGenerator no longer generates a Binding by default, must now pass a param in and pass `--binding` in the CLI\n- All `__Id` fields are now properly `ID` fields in the GraphQL schema\n- BaseModel and IdModel default to only filtering on `id_in`, not `eq` since you could use `findOne` query to get a single item\n- Removed column.editable - use `readonly` moving forward\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up.\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_APP_HOST              | App server host                                          | _none_                    |\n| WARTHOG_APP_PORT              | App server port                                          | 4000                      |\n| WARTHOG_APP_PROTOCOL          | App server protocol                                      | DEV: http, PROD: https    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","_id":"warthog@3.0.0-beta.12","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-1vA8MB1qmDTky/XzE0Yi0UoVfp7ZdjBJJQtk/ugRr7+2DKkwYTG7mWcRhVZy3w8rHv+fk7iW5VyTKvAgl8kh9A==","shasum":"db971bb79dd0fa9be8983d33254ca26c765f0dbe","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.12.tgz","fileCount":429,"unpackedSize":1107907,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgsU6HCRA9TVsSAnZWagAA8WsP/3UeHnfyB4U52B2vj+AB\npCc+FH2+ObQxwsCpeK3bLyI76lrI/IovzgfPZsp02VSoXcqIQ1JgA6DTUumo\nTxio0gsL5efSlMmV1i85//pAyjKxsvnllFS8xZnHxDAMEvFC7ey3O6c3iHtF\nFQw7mSsr2w1HNwWgQU9WIf9BllBglQIE2Si+sF9at1qoX7API6cGSwtSuyP2\nu6ssO7dTVaixBp/VqOkA41h1AalByEZI4wD6OQQSjbkg0eF2CIspa22ebzue\neDJJdbuK/vnxlGhrjM/4a//whYwiJPnPyEhVGdUFN7ELQ7PZ+ApPNJGEuijS\npPVEb+BD8muBY05BvpwH2v/AXmztqXZmBUmqHCS/dFltEFor87JXIgZNjmGR\nVqSBerVYrppIlbCjRcJ4WhnLbVjdlCfRJf3oDsEV3uEYWZltGd6lITKW35R1\n4pICPaU8MZ3kWvlfy76YgVPd04v1abLO0mSoc5a9trAMAA+mbvde8QY5Vlly\nKMyDfxm/nx52S9YQtJj2EPpV7pz+ySEbgbi0FqtKtPSspdDC8+LMqnXYSwTM\n8m1RhD6s6HtXeBIdMw0FrBDtFbLz7CcXlG7lcOkleHstKpdAO7Bae7RdAsIW\nQIoGXGSrUJeI8hJkIQHsVhO2NRGlRt+lzEX3Avb/25ZVk9PnI/Ju9KJxNU6j\nknRL\r\n=HEic\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGs5mTzjDMwYX/mfwI3hcHb/AxGIFGnTse65C2PPsoPEAiEAjCExXCbNGYzm4kBnkyizOyLzeBANlWMQEAk926v1uFE="}]},"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.12_1622232710957_0.9745639463146736"},"_hasShrinkwrap":false},"3.0.0-beta.13":{"name":"warthog","version":"3.0.0-beta.13","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.14.11","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^8.6.0","pgtools":"^0.3.1","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.32","typeorm-typedi-extensions":"^0.4.1","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true,"trailingComma":"none"},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"gitHead":"14bd961a0c051bc528eac7ebb737b8b817d8f05e","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 2.0 to 3.0\n\nWarthog is now on version 3.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### BaseModel has been overhauled\n\n- SchemaGenerator no longer generates a Binding by default, must now pass a param in and pass `--binding` in the CLI\n- All `__Id` fields are now properly `ID` fields in the GraphQL schema\n- BaseModel and IdModel default to only filtering on `id_in`, not `eq` since you could use `findOne` query to get a single item\n- Removed column.editable - use `readonly` moving forward\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up.\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_APP_HOST              | App server host                                          | _none_                    |\n| WARTHOG_APP_PORT              | App server port                                          | 4000                      |\n| WARTHOG_APP_PROTOCOL          | App server protocol                                      | DEV: http, PROD: https    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","_id":"warthog@3.0.0-beta.13","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-g0Kfq2xwu//7A7mDSANhUUUtlXyFaNacKsnuD/7eYIj2W30DpGoxKAsBvC6ACYqqgpfiVh7fh5IjJ5iq1/c+Gg==","shasum":"135305875c28b6f31f2f1e68a5b518e3480a4351","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.13.tgz","fileCount":432,"unpackedSize":1109085,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgswgzCRA9TVsSAnZWagAA4gQP/1zDtaijUZc4s+mWIO5j\n38SFd/cQA+c6U+O/AzVly+mndyOKix8rWcpX9a8MAxZ/ESuaWd4BoYRRzK1C\nbPYN3WWVeZqX0MjF321c6CjeF/+3k6dKyNzE1SRc7B9rXwo/IRnAHLe01VtG\n1VXXzwb0Hk/Te0Z8F67/p0LGhKHoATAghyDNTi6y5SYI213yHYNBlngQbcf0\nk2doJwQeV83rlpFsiNyFIaoy0HnD/w/7PydOb5E5yX+UA3XKszgtYV51gDiq\nVa4AWzEYXd1eLz4D0PW1pUIgsRPqLpbPQg4yHHyBvGNnySGL2GsLxE9RDztv\nUkoN09P2C7mCj1E86hg8Zp1jeY4kSBNMGa+TJNLioGZksdvf/4RO9/+Y7gA1\n753/cG4p5GhYcpeOyoWa4ORVJlZ/tJDwCqhQQpO/B+EBNDPVcwgDL7L+Ld89\nszWztapFa5lDP5Rkl+JsNPAsqPaTz4qn41IzX4sLNl31lNMgr1kZ03tcVuxP\nMjCnHbXaO7KVwKpeOg6rVOfhVSz/Kbu2zQRJ5zmvt5NKiCDkw5t52T/Mhq1F\nk4HeBn28ZrsnyiLgrMYW/+Bs55tVxpkTJxuSBGcMu4vv8KgeqzSdUTpks/hu\nuRV/ADmX4TnvORaVgb1YUiIr0MJLfyt0KUxJRo2aobRmowWxj5oe6Iutdd9y\nNF5B\r\n=IQdy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBORA//Hcdjuqn0738ll902zg7IX8fTl7/NaI0dp1nQIAiEAkRv80fl8qgNDKdoAf3og7DPd+y1ClbdPjV7g0mMnriE="}]},"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.13_1622345778990_0.10036245396192922"},"_hasShrinkwrap":false},"3.0.0-beta.14":{"name":"warthog","version":"3.0.0-beta.14","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.14.11","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^8.6.0","pgtools":"^0.3.1","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.32","typeorm-typedi-extensions":"^0.4.1","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true,"trailingComma":"none"},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"gitHead":"d54fc7810056a964cdc837ba14957cdaa79e04d9","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 2.0 to 3.0\n\nWarthog is now on version 3.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### BaseModel has been overhauled\n\n- SchemaGenerator no longer generates a Binding by default, must now pass a param in and pass `--binding` in the CLI\n- All `__Id` fields are now properly `ID` fields in the GraphQL schema\n- BaseModel and IdModel default to only filtering on `id_in`, not `eq` since you could use `findOne` query to get a single item\n- Removed column.editable - use `readonly` moving forward\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up.\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_APP_HOST              | App server host                                          | _none_                    |\n| WARTHOG_APP_PORT              | App server port                                          | 4000                      |\n| WARTHOG_APP_PROTOCOL          | App server protocol                                      | DEV: http, PROD: https    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","_id":"warthog@3.0.0-beta.14","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-3LGZq0Mcju5Mb4Lmeubj3mwLsWcGriA+myIqYFFYaR8DgKuUGshmANUCTfrFQbJB+n4zXRid2EtxvJgRCogcFA==","shasum":"6befc65392787d20605d0e686d8f797f8a786f15","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.14.tgz","fileCount":432,"unpackedSize":1109129,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgswwnCRA9TVsSAnZWagAAOvMP/RRh/tr47IcAM96R+wAx\nJGDp+pvjJYFsjIHquqdSwz4t0pp3TPwrRg66KWGdrT0agnZxESiFr5XUJv/G\nQM5n9uAc1Wco3qHc3s3LoPAZiPeVWQb1TDjYuajbvR7LXlq7PGFvLEWeydaz\n6kRd1i6wqoWPMEhnfZ6pYa/MOUX1mI0Qhe/ClhIyxgR9bgIJDRpgS7aB0OMv\nOVs9400stm9yDdVLf2mSpNinuavWRVWPQxDVFxtPH4S9xgF32R5yLD6Zql4R\nYRUYCktps9WiMhcPbWI6lPgpg/jGTu2n3x1bTcWdqf9XCOKQfK9O9/HeWpix\nD5wK2kn3s+rzO8Xxx0mCxnV4jFX7ROmAFYEOp8sHdqMmgIRl8Hqa9BUowJzV\nnCukj6/msLDuJ+Ujppnj9kEa9AjAe0pSIJxzycpixFUMs8XTw7YWedN/Cal4\n0Sz+iuNIqwSV0plscYxLLC+5w9BW3Dp5bZrN+wlavXVhyBbp6G5UJUQz+qqX\n9U8FfJKuMXEfsIkL9jj4j2ApjQgADwqd73BaXZB7ZWvCKRmNhXCUzODKxV5l\nJ6yIpACTH5M/joKmqu19FSTR+sbuGIjCkyHS4I+yHBgYSwMAdUr385lxdFYc\njfWgbb45/i0bUKYxF1DFvs7MnPOJbR/uYq9aoSzRgVOdrnvVXm8lXDHGpbyp\nmsAf\r\n=a7sI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDyiB8mrZ7dj8LMHTYiOryCAAopRiZQ4vfXflf6SOHp6wIgLkdpsBANF+HctzuGQotfF3Zf0a5hjRi7h6uN6UNYqCk="}]},"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.14_1622346791068_0.6090098243683215"},"_hasShrinkwrap":false},"3.0.0-beta.15":{"name":"warthog","version":"3.0.0-beta.15","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.14.11","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^8.6.0","pgtools":"^0.3.1","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.32","typeorm-typedi-extensions":"^0.4.1","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true,"trailingComma":"none"},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"gitHead":"b950c7f51fc6c56fd626e2f9cef41ed8e55e12fa","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 2.0 to 3.0\n\nWarthog is now on version 3.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### BaseModel has been overhauled\n\n- SchemaGenerator no longer generates a Binding by default, must now pass a param in and pass `--binding` in the CLI\n- All `__Id` fields are now properly `ID` fields in the GraphQL schema\n- BaseModel and IdModel default to only filtering on `id_in`, not `eq` since you could use `findOne` query to get a single item\n- Removed column.editable - use `readonly` moving forward\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up.\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_APP_HOST              | App server host                                          | _none_                    |\n| WARTHOG_APP_PORT              | App server port                                          | 4000                      |\n| WARTHOG_APP_PROTOCOL          | App server protocol                                      | DEV: http, PROD: https    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","_id":"warthog@3.0.0-beta.15","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-uPopkMA3v0rKWBGrPRWTgd3R+jgYaChHXNyAW93uSDqOYpv4fctHs7QPf74QniWxZRTlYvBpO/S3bhfW6IS6hA==","shasum":"b7d63abcc1cb06815a809dea724f33baf46d744b","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.15.tgz","fileCount":432,"unpackedSize":1109137,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgsxC0CRA9TVsSAnZWagAAXqsP+wb7+VnE6FsG7B4MrwaQ\nz2EWAyFpzj0KR+VAQkHBjlAbYLGGcMwHgIJX6Zp8X4LHzQ+FywrVAnJCK3iI\nviY5lm2BW1VO3QNXrLtct/541UsnmghUgs/RT1DkARYsNJ3gAPh/aX513b4h\n2TieDxInmNMNAjgW0G6hnGCHWPAG/b+Zy8M0PzzK4C3JpA4Sqc89EMJ5IYcv\nLFW/yRdy6v+WyNnX6RX0nVJTgCgMrRCMLoMnON0NWGWOZTJbwM7bhMU+r5bX\nxRg8SKmOLMuWQfYCwtEpteW5DeDMNrZtOzhlFH/yojuQNSpBay9RALDQP49U\nLWkHKTnCJIyulY5P+5Ou0X4foOFyahIzaELTE06ahVGVHPAxR/EoY8tyrr6h\nLT28GmOw9DgSY1BDs+2b/V0d4yf2vYV0XMKOrM9r5qp6zWPbm7Vm9xwjEoxj\nHZJzUGtVWuOP76hU1uCr8Z9YV9OjtElcI6Eodv84/R/Y2pZibsnYh3czIyeZ\ntTJTGCeEbeGsrCAEMMb34Alns3pChtTrYFQKsEwo9Rn8U0gOL+w9WZDJyNxV\nwiB4JLaEkE90gx5HFVbzXgacliasutz6fmU8Z+LN9B/mL+Lsndsp+4MwS2u6\nLDUXX+01xjEUEyAcIXam54ff8CtpJGG6wLDbPeafVtxUVVelcubUZHLwc+WE\nEiZX\r\n=Co0i\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDoLJ87DIp3JjpjH2iS5i/PH3ekmVpYDGypcxK72BD2vAiEAoi5wEdRK8uHx+teFKWa2AoO8fTEZa1l/BSeRNZ88/Wk="}]},"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.15_1622347956334_0.6623105234206672"},"_hasShrinkwrap":false},"2.21.1":{"name":"warthog","version":"2.21.1","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.14.11","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^8.6.0","pgtools":"^0.3.1","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.32","typeorm-typedi-extensions":"^0.4.1","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["main"]},"gitHead":"09f904af5e0fb7b4bb3207f098a60e78a3d919ed","_id":"warthog@2.21.1","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-siMvvThKd8ZN2Zk8B2BtmVUJdzGb850XCZZQNBai+8SKDKWWydWh/x/PQJwfwURdK/kclX6acql3ptJOCpWNNw==","shasum":"1375b2eac848d2974c44fb330dea6f1b5bd43bd1","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.21.1.tgz","fileCount":392,"unpackedSize":1065151,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgyC1pCRA9TVsSAnZWagAAYwUP/2ftX9ADHd2GNaGGAkxn\nhrhLQyOxCKTxG9+hPZdu/nJCXZ0ClRFA9BYgJTxHiIwh8cNmNLNvqOQNHm6j\ntvs8vSpMFOIRWbWmjShjx1GpTjNyf8GNGoEGDewT8cXA9VaSMmZjgI8KCHF8\nxm2OZXxC0Hwyb7pwusjW/3nPVmnP1AO7slJyFyuTFo58gVsblzaJe/S5vXeK\nnmZ1JB7EeYlkjhLxy7aCUIZVFOgzMujxcm9to9IpAYn0OhVzPZ4a4nR4Zt+N\nj8INe2o15PXpiu+X65ubJbHznknQWYEDyTe3r8I025WQPGCRO2lWEfvY9Y4L\nyGd5R/0/WqIlR/u4DWjRFab3EUWoXNAv1+W6fbvGU1SMAe8YShc4kl5E0KcB\noQaZ4wMIE0tcFp4EWbMCOJAY5GC4qDTxS/5d7FTyqQ7IQOjfBHd2ZqNytoAC\nwlaxdS3qlb022vqqs6Brig5GZxdI51W0SWmt5pDVC3PyGdeSMRYIcjtrX0iU\nn4Ymez8B9V3UEFOewplhmY5T27O2CFF5ROf3La9QYeIbFtiSl5MgsxYU63YQ\nXjW6Xp7X2t/5JQHsqWRi8nGkvGhjsOPdIqw8r4wwup0k/Qa1+tR/m51CzKVv\nJoJEmkp+x/L9/E8reuwo6iDbnrNzb3Yy6aV1/m5pjD6bGa3MQqAZLoLR++dB\n+fIy\r\n=tBOz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF33PKHrVpuT0+I7Y1MbnRtA9ZHyPNWe8MZJ14MWjmAkAiBD4i9RBOcAviewNLQU/5VWHcnbo2gw3pJZ+AACk4Xxmw=="}]},"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.21.1_1623731560930_0.17795884857162947"},"_hasShrinkwrap":false},"2.21.2":{"name":"warthog","version":"2.21.2","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.14.11","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^8.6.0","pgtools":"^0.3.1","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.32","typeorm-typedi-extensions":"^0.4.1","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["main"]},"gitHead":"72fad57f9b5df20576286853416d60c24882e328","_id":"warthog@2.21.2","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-IM7JoVQF1yCflPv1S2cFcVV1bKb1lXFPN3DQPLDMF9776MYCsn+8vpYrekCn/RfnjErcwZ8lYZJ14Jq0E0qn9g==","shasum":"8a2295fe18bc82073bb427254f66dfc0e4126d74","tarball":"https://registry.npmjs.org/warthog/-/warthog-2.21.2.tgz","fileCount":392,"unpackedSize":1098979,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgyC67CRA9TVsSAnZWagAA7eYQAKJZh9Ovf5D88vZqz+1x\npHwGfFJSnPj3I0a2i/s7czuswKME/la8cUpA/dbP5AwLntmtzh70OlTEzit9\nB1AnlXU5q1+Mw7qRkgdB2DS0u1s8OYXpDvrbeJZ7U+NYFGcSDHJPVrwa5Lx9\nxSw6KGzNTczLpmekjnVCqyIxVpU61/9K2xR9DPMgWzmVGL3ks+bZzRy58Jfd\nJhDqGwwEhI2MlJGiq5DuByjBUjBLUICruuTL6ZZKklanq+HH9W499djhS14r\nYVHXU4WACbXpHbVmjGWowGUx/uN0dxeArt8ZxAMjca3dNRpqYPr4QrQmj3mv\nXTBsNvzOXgpYyYL3GUO8VFf/tW3lDssIpP1oY/6lUa6Yv2UJ8WupzQXrx5Rm\n/KJdLrXSM18hVVWccNQrwYR+58bBYwz4ehmdCqneA3Z/I7v0TjAuz8lySeA/\niyi5mV5wRGJJfrDXDdFTRIWZ2Nwd+B/EfCa0MySI6GtsaCd47BEXUyIeD0VF\nFMXp8LJ3lGbe1TkROW6RYy3QRsINiiSoa+nBZaQHzrRtHWxyH5dS3cMcGBFY\nEimDjdM5JXVJ25uR0lczoo2eoWEcyHoFGrZIfSb2HbfQbvgwF9VurPlOsVGw\nYU0F24uf6uSk6vmuX4hzVd/E1Ky9M34AsKfoC6u6WfQxF/3Zi5sHHJ76EpPo\nUS37\r\n=EEns\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCbD2OlVuOlzajt2d7KdTjh2eeTPn+loD5ZorbZLM4aqgIhAOouD/X2xQpmCWtg29X/Rr76gnjUmu2h6Eg0vGEaFRj3"}]},"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_2.21.2_1623731899480_0.7664839667576264"},"_hasShrinkwrap":false},"3.0.0-beta.16":{"name":"warthog","version":"3.0.0-beta.16","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.14.11","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^8.6.0","pgtools":"^0.3.1","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.32","typeorm-typedi-extensions":"^0.4.1","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true,"trailingComma":"none"},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"gitHead":"6a275ab67d70d74f18c84754b4a26be01afc33da","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 2.0 to 3.0\n\nWarthog is now on version 3.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### BaseModel has been overhauled\n\n- SchemaGenerator no longer generates a Binding by default, must now pass a param in and pass `--binding` in the CLI\n- All `__Id` fields are now properly `ID` fields in the GraphQL schema\n- BaseModel and IdModel default to only filtering on `id_in`, not `eq` since you could use `findOne` query to get a single item\n- Removed column.editable - use `readonly` moving forward\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up.\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_APP_HOST              | App server host                                          | _none_                    |\n| WARTHOG_APP_PORT              | App server port                                          | 4000                      |\n| WARTHOG_APP_PROTOCOL          | App server protocol                                      | DEV: http, PROD: https    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","_id":"warthog@3.0.0-beta.16","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-WBTntxjD44IQea6TL9C1lR1FGD37uoS56Osqq0m79S+B0ISXuqvp8x11AF9Uw05DRmlQi0befAb2EgstoBPApg==","shasum":"00faa88919998e456bc910ddd50495ead3e066cd","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.16.tgz","fileCount":432,"unpackedSize":1110450,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhPtSxCRA9TVsSAnZWagAAYbUQAISfMUGu5k3GW4oALBHW\n4RuDK+eRLvXF7VmKoTJWdspOBvnZZ+nkQdpA9lSbLS/W/pwoeI2xFPsIXLb5\nottbz5XTTFbL3Ngs5XBdqwnpPIf8h5lUAk8pA2bIZaguWCzfQhhs6UDbYCU5\nnLdEUglHPkRcBKIO+LykC5a5J4zmnU04CHDRqRPN3hbG5Gf7D+VJLdzrC4xN\ncy/12eaSqPp3q9xkRGXUSKxiGDJDTPCi0G/IEym8h4UUiPVX2e7sx1fldnld\nAvfWYSPtsYDwTF6GdJUvf+IHINqKf0J5OluJmBC56HhEBfV1wFmMN5XWCfUW\nBcHUZIoNX0OpgFvYIe6KElrth1Clwg6xZ5szxhgJukgcMiuSz4moN82NWuEr\naGzgalM2Lkw/E86uVEbg84hVmhEuvJJtSBwDiSfCHA3Vvp8FOIP3sw+vPN4H\ngywc2Imn+e/zFl4XEAQI0w9dOb2i7QVCVR2HB6bidS//15Q5c5H0A4pKXmkr\nuSTA1BPN8FSBGI6a40xfvcLyuzXmo15rWeJ/2V8dX6qA6E32LYUAPuYKNOmQ\nn0Hn6jrc//mzN/a88984kvbAmHiLN2X94RACdgYcZiBBQXgED5LHn8eQhEII\nTmPo27MA9DxPOpENS3ckHaU19ZiwafjlmhkLj+is7/5qbvrr/Sb2xHYj5h3q\n8h05\r\n=zTQM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCagA/bWLWnxl84nJQnkJlLmjh/wpEwq7mepGpI89dOtgIhAJNqknxNu1OGalZ/YSrtQtSq14/JvxpFyo5mxeunNCt8"}]},"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.16_1631507632741_0.1423930468592689"},"_hasShrinkwrap":false},"3.0.0-beta.17":{"name":"warthog","version":"3.0.0-beta.17","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.14.11","@types/prettier":"^1.18.3","@types/shortid":"^0.0.29","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^8.6.0","pgtools":"^0.3.1","prettier":"^1.19.1","reflect-metadata":"^0.1.13","shortid":"^2.2.15","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.32","typeorm-typedi-extensions":"^0.4.1","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true,"trailingComma":"none"},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"gitHead":"3dbbfe727b2ba69fd30993f2b06fe17fcca535df","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 2.0 to 3.0\n\nWarthog is now on version 3.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### Deprecated individual `WARTHOG_APP_*` variables in favor of `WARTHOG_API_BASE_URL`\n\nIt's a pain to have to manage 3 separate environment variables for setting the base API URL. We still support this, but prefer the new `WARTHOG_API_BASE_URL` and will use it first if it's present when spinning up a server.\n\n### BaseModel has been overhauled\n\n- SchemaGenerator no longer generates a Binding by default, must now pass a param in and pass `--binding` in the CLI\n- All `__Id` fields are now properly `ID` fields in the GraphQL schema\n- BaseModel and IdModel default to only filtering on `id_in`, not `eq` since you could use `findOne` query to get a single item\n- Removed column.editable - use `readonly` moving forward\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up.\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_API_BASE_URL          | Api base url                                             | _none_                    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n### Removed Environment Variables\n\nAll of the `WARTHOG_APP_*` environment variables will still work, but it is strongly recommended you use the single variable `WARTHOG_API_BASE_URL`\n\n| variable | value |\n| WARTHOG_APP_HOST | App server host |\n| WARTHOG_APP_PORT | App server port |\n| WARTHOG_APP_PROTOCOL | App server protocol |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","_id":"warthog@3.0.0-beta.17","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-vJ6zwLDnfRWDVZ6IPhsHSBJcjyph4I8arN078PrcuzizRj9qbuFyUIPJhdfoOMLi5fDwhbM8d+86L3Vcl0cvdQ==","shasum":"3ab2a5001c3fb818f42e3e44552a36298dd7c5c5","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.17.tgz","fileCount":432,"unpackedSize":1110634,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhQV49CRA9TVsSAnZWagAAWK4P/i0rO8xGqLEvGatZolhG\nvsHWMAPztMT5q/Y+oGUk9V2hqiB5czYAsfnqtb04s1ZQi+v8I154VgUFImyP\nJCmfLJYrts1vJOuHrwlzQ+QlTJnN4bJU8uGjCI3yoZnlGMMt7Y4GImvAwrZZ\nAgz4goWgfFIj1T96PXLsiJHNK6GPkoc5IKvtDNnJZWIBKTUsaedKIFLZI7bd\nRkN52eGoKUUiS7VL+kh8LvMU36HX5YnJncYMP4GLtmRMxodX+4nE2w2zEFHF\nu/YnJhoRWj73L93c7oIidjohT+dZTCZuJ+cMqakK87DQ7jX9wawkZcJ2JJ+W\nsNiQkxjoaI04TWvkWWboVOOdv/KS1OlektDtGN5i6WphaNShcvipkx3rQ7zg\n6L5MLF4txARfni09VSTml50k929m/+JkchG7FEy9TktRU4WoM9w5fPawk2Pa\nroXMA5tk/u2bYGu8zqeonQldqyXNgpFssgxLBPvrRVnpwsO1vLFj0ggF9ci2\nQ3BcrZSSU9USm30JHmw+8nDxeAx0PiI1CUEZ+6n8Fiki3+Q9El+tTGFspzIl\n6FKNiDU5JuYjdHn6GgRPVG62MqvWsf9U4H/rx37+hiklCJvoaJuGDVMdWmv1\nG01YhkHITp93ggj1uu2J5n6xzipVT39Ir1VQ6mQc13/sQOYBep+ZJ+dMytQ+\nAEXY\r\n=WQ14\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHW2DbT1sQYibkjJ/fcy31v+PxgYmrHP/KNkvsFuVKYhAiBb01ZTuFYvGxu8+kSWE6rTFx/QYQJH5Fb65wXAC6LuSA=="}]},"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.17_1631673916960_0.22203411011521657"},"_hasShrinkwrap":false},"3.0.0-beta.18":{"name":"warthog","version":"3.0.0-beta.18","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/nanoid":"^3.0.0","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.14.11","@types/prettier":"^1.18.3","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","nanoid":"^3","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^8.6.0","pgtools":"^0.3.1","prettier":"^1.19.1","reflect-metadata":"^0.1.13","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.32","typeorm-typedi-extensions":"^0.4.1","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true,"trailingComma":"none"},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"gitHead":"88d1eacb832321bd618a0c8d6a916d0c65afee43","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 2.0 to 3.0\n\nWarthog is now on version 3.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### Switch ID generation library from `shortid` (deprecated) to `nanoid`\n\nPer `shortid` [README](https://github.com/dylang/shortid/blob/master/README.md) it is deprecated.\n\n### Deprecated individual `WARTHOG_APP_*` variables in favor of `WARTHOG_API_BASE_URL`\n\nIt's a pain to have to manage 3 separate environment variables for setting the base API URL. We still support this, but prefer the new `WARTHOG_API_BASE_URL` and will use it first if it's present when spinning up a server.\n\n### BaseModel has been overhauled\n\n- SchemaGenerator no longer generates a Binding by default, must now pass a param in and pass `--binding` in the CLI\n- All `__Id` fields are now properly `ID` fields in the GraphQL schema\n- BaseModel and IdModel default to only filtering on `id_in`, not `eq` since you could use `findOne` query to get a single item\n- Removed column.editable - use `readonly` moving forward\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up.\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_API_BASE_URL          | Api base url                                             | _none_                    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n### Removed Environment Variables\n\nAll of the `WARTHOG_APP_*` environment variables will still work, but it is strongly recommended you use the single variable `WARTHOG_API_BASE_URL`\n\n| variable | value |\n| WARTHOG_APP_HOST | App server host |\n| WARTHOG_APP_PORT | App server port |\n| WARTHOG_APP_PROTOCOL | App server protocol |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","_id":"warthog@3.0.0-beta.18","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-9B5X59UT5IcgMjZ1s3sY2r//t1pm1NbHpZD6gcGhdM7xX/LNQvl6D9OxNBN2X5J0dgDcDpw4ng74vKzDmKCOfA==","shasum":"2e365493f060a4250aa4e56f9c8310649a7cbf61","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.18.tgz","fileCount":432,"unpackedSize":1110777,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGq0m7K3zs74rQRI4WdTG4vtCqxOQPTNe2kqdjq4GeKuAiEA5BTVSE/0vrg3TgoGAcvq8p2wCSD2Id7NgzNdnlVSVpY="}]},"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.18_1632014139332_0.3083861483471204"},"_hasShrinkwrap":false},"3.0.0-beta.19":{"name":"warthog","version":"3.0.0-beta.19","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/nanoid":"^3.0.0","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.14.11","@types/prettier":"^1.18.3","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","nanoid":"^3","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^8.6.0","pgtools":"^0.3.1","prettier":"^1.19.1","reflect-metadata":"^0.1.13","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.32","typeorm-typedi-extensions":"^0.4.1","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true,"trailingComma":"none"},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"gitHead":"0e81c61161b22ca693cc7e1d92c42ebfba83c6ce","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 2.0 to 3.0\n\nWarthog is now on version 3.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### Switch ID generation library from `shortid` (deprecated) to `nanoid`\n\nPer `shortid` [README](https://github.com/dylang/shortid/blob/master/README.md) it is deprecated.\n\n### Deprecated individual `WARTHOG_APP_*` variables in favor of `WARTHOG_API_BASE_URL`\n\nIt's a pain to have to manage 3 separate environment variables for setting the base API URL. We still support this, but prefer the new `WARTHOG_API_BASE_URL` and will use it first if it's present when spinning up a server.\n\n### BaseModel has been overhauled\n\n- SchemaGenerator no longer generates a Binding by default, must now pass a param in and pass `--binding` in the CLI\n- All `__Id` fields are now properly `ID` fields in the GraphQL schema\n- BaseModel and IdModel default to only filtering on `id_in`, not `eq` since you could use `findOne` query to get a single item\n- Removed column.editable - use `readonly` moving forward\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up.\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_API_BASE_URL          | Api base url                                             | _none_                    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n### Removed Environment Variables\n\nAll of the `WARTHOG_APP_*` environment variables will still work, but it is strongly recommended you use the single variable `WARTHOG_API_BASE_URL`\n\n| variable | value |\n| WARTHOG_APP_HOST | App server host |\n| WARTHOG_APP_PORT | App server port |\n| WARTHOG_APP_PROTOCOL | App server protocol |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","_id":"warthog@3.0.0-beta.19","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-cgPjGC7T16oD9OGybKpH6doGgyTjxeKhSOTpaeSBZraUO+4C6LaA7J29d2lDHD5DlmpOFjylJ9V77z3K9CEhwQ==","shasum":"d3ce0bad9ef60c2e6b0bd43e7e9d84d3f3eca910","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.19.tgz","fileCount":432,"unpackedSize":1111066,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC9LE3vLUB1/PEATxktInzR8ynao/ZwryRmFSD9FCb6vgIgbmfNudo9gQF3o6jA9tNCoQ2gz9TCVuiRJX0J0fAM/vA="}]},"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.19_1632023759809_0.46613635121969166"},"_hasShrinkwrap":false},"3.0.0-beta.20":{"name":"warthog","version":"3.0.0-beta.20","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/nanoid":"^3.0.0","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.14.11","@types/prettier":"^1.18.3","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","nanoid":"^3","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^8.6.0","pgtools":"^0.3.1","prettier":"^1.19.1","reflect-metadata":"^0.1.13","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.32","typeorm-typedi-extensions":"^0.4.1","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true,"trailingComma":"none"},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"gitHead":"070550bf7d663bd4f44515b2827f96cb66187825","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 2.0 to 3.0\n\nWarthog is now on version 3.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### Switch ID generation library from `shortid` (deprecated) to `nanoid`\n\nPer `shortid` [README](https://github.com/dylang/shortid/blob/master/README.md) it is deprecated.\n\n### Deprecated individual `WARTHOG_APP_*` variables in favor of `WARTHOG_API_BASE_URL`\n\nIt's a pain to have to manage 3 separate environment variables for setting the base API URL. We still support this, but prefer the new `WARTHOG_API_BASE_URL` and will use it first if it's present when spinning up a server.\n\n### BaseModel has been overhauled\n\n- SchemaGenerator no longer generates a Binding by default, must now pass a param in and pass `--binding` in the CLI\n- All `__Id` fields are now properly `ID` fields in the GraphQL schema\n- BaseModel and IdModel default to only filtering on `id_in`, not `eq` since you could use `findOne` query to get a single item\n- Removed column.editable - use `readonly` moving forward\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up.\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_API_BASE_URL          | Api base url                                             | _none_                    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n### Removed Environment Variables\n\nAll of the `WARTHOG_APP_*` environment variables will still work, but it is strongly recommended you use the single variable `WARTHOG_API_BASE_URL`\n\n| variable | value |\n| WARTHOG_APP_HOST | App server host |\n| WARTHOG_APP_PORT | App server port |\n| WARTHOG_APP_PROTOCOL | App server protocol |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","_id":"warthog@3.0.0-beta.20","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-p5KxgwxKc6GP4g7kEzh8rq3F9l/LtKueJ7tkhI/urkYPCG6nQrM0xI4Q5JeUf8jjn+IPXN+BlDCt+efTCpkkiw==","shasum":"30f609ac876b98bd85fa2e813de76c5893ad2222","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.20.tgz","fileCount":432,"unpackedSize":1111091,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGUdiyjWXJjTCSaNZ2Q5VYphZG0HGe7JZ9sNBa4aXLh7AiADurXkwdI6QOygfdkt5th61pWevL24+t5B89H9x5NtbQ=="}]},"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.20_1632024084196_0.43984080140100934"},"_hasShrinkwrap":false},"3.0.0-beta.21":{"name":"warthog","version":"3.0.0-beta.21","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/nanoid":"^3.0.0","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.14.11","@types/prettier":"^1.18.3","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","nanoid":"^3","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^8.6.0","pgtools":"^0.3.1","prettier":"^1.19.1","reflect-metadata":"^0.1.13","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.32","typeorm-typedi-extensions":"^0.4.1","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true,"trailingComma":"none"},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"gitHead":"d6dd376b03dcc443ea136bbea0b6fb6c4eebb8fc","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 2.0 to 3.0\n\nWarthog is now on version 3.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### Adds `computed` attribute to models\n\nA `computed` property is one that is fully managed by the server. A good example is a status flag that is managed by a state machine in the backend. You should not be able to modify this on create or update, but should always be able to read it.\n\n### Switch ID generation library from `shortid` (deprecated) to `nanoid`\n\nPer `shortid` [README](https://github.com/dylang/shortid/blob/master/README.md) it is deprecated.\n\n### Deprecated individual `WARTHOG_APP_*` variables in favor of `WARTHOG_API_BASE_URL`\n\nIt's a pain to have to manage 3 separate environment variables for setting the base API URL. We still support this, but prefer the new `WARTHOG_API_BASE_URL` and will use it first if it's present when spinning up a server.\n\n### BaseModel has been overhauled\n\n- SchemaGenerator no longer generates a Binding by default, must now pass a param in and pass `--binding` in the CLI\n- All `__Id` fields are now properly `ID` fields in the GraphQL schema\n- BaseModel and IdModel default to only filtering on `id_in`, not `eq` since you could use `findOne` query to get a single item\n- Removed column.editable - use `readonly` moving forward\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up.\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_API_BASE_URL          | Api base url                                             | _none_                    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n### Removed Environment Variables\n\nAll of the `WARTHOG_APP_*` environment variables will still work, but it is strongly recommended you use the single variable `WARTHOG_API_BASE_URL`\n\n| variable | value |\n| WARTHOG_APP_HOST | App server host |\n| WARTHOG_APP_PORT | App server port |\n| WARTHOG_APP_PROTOCOL | App server protocol |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","_id":"warthog@3.0.0-beta.21","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-9MlT4SKjhV1Ls1sEZRWR6nxPfP+UJpObvnSl+QZDu/+8Qum4DnmnHIokilziw7gsi4LJeNPK6rDEMrks/laj2A==","shasum":"b8fbe025f0d7c4397d8d6187552127bfa9155764","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.21.tgz","fileCount":432,"unpackedSize":1113845,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD/BtzDCkKglmYRsshU4m2x2oeXRjx5p4z1LUll4KTctQIhAIMmQt3pHBtmmzcc6nE0pWqYgeLQBg6uaD8C1ivWbX0x"}]},"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.21_1632073635378_0.9374599463953972"},"_hasShrinkwrap":false},"3.0.0-beta.22":{"name":"warthog","version":"3.0.0-beta.22","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/nanoid":"^3.0.0","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.14.11","@types/prettier":"^1.18.3","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","nanoid":"^3","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^8.6.0","pgtools":"^0.3.1","prettier":"^1.19.1","reflect-metadata":"^0.1.13","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.32","typeorm-typedi-extensions":"^0.4.1","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true,"trailingComma":"none"},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"gitHead":"30ba9c405182359ad3938af57df40077745f47ee","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 2.0 to 3.0\n\nWarthog is now on version 3.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### Adds `computed` attribute to models\n\nA `computed` property is one that is fully managed by the server. A good example is a status flag that is managed by a state machine in the backend. You should not be able to modify this on create or update, but should always be able to read it.\n\n### Switch ID generation library from `shortid` (deprecated) to `nanoid`\n\nPer `shortid` [README](https://github.com/dylang/shortid/blob/master/README.md) it is deprecated.\n\n### Deprecated individual `WARTHOG_APP_*` variables in favor of `WARTHOG_API_BASE_URL`\n\nIt's a pain to have to manage 3 separate environment variables for setting the base API URL. We still support this, but prefer the new `WARTHOG_API_BASE_URL` and will use it first if it's present when spinning up a server.\n\n### BaseModel has been overhauled\n\n- SchemaGenerator no longer generates a Binding by default, must now pass a param in and pass `--binding` in the CLI\n- All `__Id` fields are now properly `ID` fields in the GraphQL schema\n- BaseModel and IdModel default to only filtering on `id_in`, not `eq` since you could use `findOne` query to get a single item\n- Removed column.editable - use `readonly` moving forward\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up.\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_API_BASE_URL          | Api base url                                             | _none_                    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n### Removed Environment Variables\n\nAll of the `WARTHOG_APP_*` environment variables will still work, but it is strongly recommended you use the single variable `WARTHOG_API_BASE_URL`\n\n| variable | value |\n| WARTHOG_APP_HOST | App server host |\n| WARTHOG_APP_PORT | App server port |\n| WARTHOG_APP_PROTOCOL | App server protocol |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","_id":"warthog@3.0.0-beta.22","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-kSVJqv1EwzAVmzNZ/d7tL204HbW0B/5vOBFznfuQW9T+vHzjL385T+Zsxpji2gvcsuGTh68oQaseq4vpLrLNCQ==","shasum":"85c23f218e8dcba657454c4c09f4a5f2757af117","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.22.tgz","fileCount":432,"unpackedSize":1114835,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD3cm/mrlCA2i+k1vtq5nZf910QF3Dbv9cLlUGQEtV5TQIgMtTIG/gAdla4z8sv9066EdK9RLEOcDQMuhMmA1FHJKw="}]},"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.22_1632106545088_0.6913254176496517"},"_hasShrinkwrap":false},"3.0.0-beta.23":{"name":"warthog","version":"3.0.0-beta.23","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/nanoid":"^3.0.0","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.14.11","@types/prettier":"^1.18.3","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","nanoid":"^3","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^8.6.0","pgtools":"^0.3.1","prettier":"^1.19.1","reflect-metadata":"^0.1.13","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.32","typeorm-typedi-extensions":"^0.4.1","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true,"trailingComma":"none"},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"gitHead":"67f756ae209a846a5eb0ef781ac6c7a76efdecf9","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 2.0 to 3.0\n\nWarthog is now on version 3.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### Adds `computed` attribute to models\n\nA `computed` property is one that is fully managed by the server. A good example is a status flag that is managed by a state machine in the backend. You should not be able to modify this on create or update, but should always be able to read it.\n\n### Switch ID generation library from `shortid` (deprecated) to `nanoid`\n\nPer `shortid` [README](https://github.com/dylang/shortid/blob/master/README.md) it is deprecated.\n\n### Deprecated individual `WARTHOG_APP_*` variables in favor of `WARTHOG_API_BASE_URL`\n\nIt's a pain to have to manage 3 separate environment variables for setting the base API URL. We still support this, but prefer the new `WARTHOG_API_BASE_URL` and will use it first if it's present when spinning up a server.\n\n### BaseModel has been overhauled\n\n- SchemaGenerator no longer generates a Binding by default, must now pass a param in and pass `--binding` in the CLI\n- All `__Id` fields are now properly `ID` fields in the GraphQL schema\n- BaseModel and IdModel default to only filtering on `id_in`, not `eq` since you could use `findOne` query to get a single item\n- Removed column.editable - use `readonly` moving forward\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up.\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_API_BASE_URL          | Api base url                                             | _none_                    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n### Removed Environment Variables\n\nAll of the `WARTHOG_APP_*` environment variables will still work, but it is strongly recommended you use the single variable `WARTHOG_API_BASE_URL`\n\n| variable | value |\n| WARTHOG_APP_HOST | App server host |\n| WARTHOG_APP_PORT | App server port |\n| WARTHOG_APP_PROTOCOL | App server protocol |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","_id":"warthog@3.0.0-beta.23","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-RHSwmOa2eKrJ3bPTJu4ZyN6tEnY9TCwjbwaB6ghS2Ty9IPHLbE5qovFp3B+StM7bfiwIm+B21twlV+HAs9Mfmg==","shasum":"b101d932542f67db3bb43ead42f0f0169aef42b5","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.23.tgz","fileCount":435,"unpackedSize":1116174,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDvwxIlNoBlbmcVntG8VjS3ycb7G1dch500xF6F4UmRUQIhALeIQKqkUz4Lid6g3AnUvplaga8I/VKdjCuKrqnC1JEg"}]},"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.23_1632890868448_0.3442298221651465"},"_hasShrinkwrap":false},"3.0.0-beta.24":{"name":"warthog","version":"3.0.0-beta.24","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/nanoid":"^3.0.0","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.14.11","@types/prettier":"^1.18.3","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","nanoid":"^3","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^8.6.0","pgtools":"^0.3.1","prettier":"^1.19.1","reflect-metadata":"^0.1.13","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.32","typeorm-typedi-extensions":"^0.4.1","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true,"trailingComma":"none"},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"gitHead":"bc761727e1bd8d17bf752cf0eaa9a690d4ecf780","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 2.0 to 3.0\n\nWarthog is now on version 3.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### Adds `computed` attribute to models\n\nA `computed` property is one that is fully managed by the server. A good example is a status flag that is managed by a state machine in the backend. You should not be able to modify this on create or update, but should always be able to read it.\n\n### Switch ID generation library from `shortid` (deprecated) to `nanoid`\n\nPer `shortid` [README](https://github.com/dylang/shortid/blob/master/README.md) it is deprecated.\n\n### Deprecated individual `WARTHOG_APP_*` variables in favor of `WARTHOG_API_BASE_URL`\n\nIt's a pain to have to manage 3 separate environment variables for setting the base API URL. We still support this, but prefer the new `WARTHOG_API_BASE_URL` and will use it first if it's present when spinning up a server.\n\n### BaseModel has been overhauled\n\n- SchemaGenerator no longer generates a Binding by default, must now pass a param in and pass `--binding` in the CLI\n- All `__Id` fields are now properly `ID` fields in the GraphQL schema\n- BaseModel and IdModel default to only filtering on `id_in`, not `eq` since you could use `findOne` query to get a single item\n- Removed column.editable - use `readonly` moving forward\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up.\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_API_BASE_URL          | Api base url                                             | _none_                    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n### Removed Environment Variables\n\nAll of the `WARTHOG_APP_*` environment variables will still work, but it is strongly recommended you use the single variable `WARTHOG_API_BASE_URL`\n\n| variable | value |\n| WARTHOG_APP_HOST | App server host |\n| WARTHOG_APP_PORT | App server port |\n| WARTHOG_APP_PROTOCOL | App server protocol |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","_id":"warthog@3.0.0-beta.24","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-pW9OWKvBZs7iVFRK7yVEOycLtlblXf0Z5rciQsb4JHDcqxnYllyRL490Yakvx8dibsdRKfexoC8P3zUmfZeWFA==","shasum":"ed890ac86e53ebe3524c159ce0d18bc063b2fe03","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.24.tgz","fileCount":435,"unpackedSize":1116124,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDMtiQ4sAEWdvN9zW5DtSPjStQdpAc2CSleLJKLR7OYtgIgZbGz1QDlpqMN/aIV15mmPlfyRYR7lTF6/Z+RUMwgEYU="}]},"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.24_1632896567916_0.3543865673852291"},"_hasShrinkwrap":false},"3.0.0-beta.25":{"name":"warthog","version":"3.0.0-beta.25","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/nanoid":"^3.0.0","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.14.11","@types/prettier":"^1.18.3","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","flatted":"^3.2.4","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","nanoid":"^3","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^8.6.0","pgtools":"^0.3.1","prettier":"^1.19.1","reflect-metadata":"^0.1.13","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.32","typeorm-typedi-extensions":"^0.4.1","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true,"trailingComma":"none"},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"gitHead":"5d93245998f72daa61cb8e176c09a51e2478d627","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 2.0 to 3.0\n\nWarthog is now on version 3.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### Adds `computed` attribute to models\n\nA `computed` property is one that is fully managed by the server. A good example is a status flag that is managed by a state machine in the backend. You should not be able to modify this on create or update, but should always be able to read it.\n\n### Switch ID generation library from `shortid` (deprecated) to `nanoid`\n\nPer `shortid` [README](https://github.com/dylang/shortid/blob/master/README.md) it is deprecated.\n\n### Deprecated individual `WARTHOG_APP_*` variables in favor of `WARTHOG_API_BASE_URL`\n\nIt's a pain to have to manage 3 separate environment variables for setting the base API URL. We still support this, but prefer the new `WARTHOG_API_BASE_URL` and will use it first if it's present when spinning up a server.\n\n### BaseModel has been overhauled\n\n- SchemaGenerator no longer generates a Binding by default, must now pass a param in and pass `--binding` in the CLI\n- All `__Id` fields are now properly `ID` fields in the GraphQL schema\n- BaseModel and IdModel default to only filtering on `id_in`, not `eq` since you could use `findOne` query to get a single item\n- Removed column.editable - use `readonly` moving forward\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up.\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_API_BASE_URL          | Api base url                                             | _none_                    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n### Removed Environment Variables\n\nAll of the `WARTHOG_APP_*` environment variables will still work, but it is strongly recommended you use the single variable `WARTHOG_API_BASE_URL`\n\n| variable | value |\n| WARTHOG_APP_HOST | App server host |\n| WARTHOG_APP_PORT | App server port |\n| WARTHOG_APP_PROTOCOL | App server protocol |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","_id":"warthog@3.0.0-beta.25","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-ltTzlLuFKUwjXt/Al2QGorq8wOMzojcBAZAuVkNTiiO5or840dqFfzreM8yppDt+JlpV+D3cm/4SA6oEqxfF6Q==","shasum":"621c03760a26ea4702109d036d0b3c1639c371be","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.25.tgz","fileCount":435,"unpackedSize":1117606,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh0K9vCRA9TVsSAnZWagAAGrAP/RFszk0OIGoT5WycOxuM\nXhckMuyY90fkwwZaL5UyuIZMb2txqZP4RMCcBxbioRvkVLRPApbN2Gm5hlYE\nRyvS+Sr/uK0/VhLzTYlCZcw/4iwZQs0W+07LXtnvB0UbK+lHZDsPDbSBUnmG\nV12Pq9qc6C6OlAC930hSx4FxHtM2UabLB7qPv1orhKCTHzeBohgF2IACJLbU\nxy+v3D1xK1BjjWk+KhzH5h5aN2oomcMqLD2ChcCsnV4QFbQcngF9+sY+EgkY\nRYMN0vlkHdmg8FFAr4bGOTjNS4LsUiEHq1/Bh57SyaMvPK0SZlvSQa4/U5vk\nVCXP+t4jjJFswt6HViIAUmkNJIWafuOqKeJmAzctUkfv/SQp3ssFkmoW/kzq\nF1i9IpizZLSQ1o16wIg7ziHQwbQwNTg+aq4qHVaGKOS25zJBltdZchuL8RIe\n8Ck+YdpRYhCCo/pPXyfBermZCE5xFxQFpp7ZcS6lM2lTHIzmyrICJ8nF9kzj\nDIKK+JWnS8v8rRpsHVfwB0DxOCBtcLxS4FepkzStnlL2jdjlXtB7/MdpJArm\n3R41Zqn5JeP/Gdy07dVWxrXXJviAi7Hg7SUsaKBBFrbNoxpYSGg7VA9YO3cu\nzHnO1jFYSE/zP8wQzGezKYBYLEj9db7tFhPR7TduULu67QFUHBU19FEWoDHo\nlKQ1\r\n=TQ3q\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBmU3q3HBmdGm3/izRvO2+OctBbAO5s+Ap1cMRUY94oHAiBX5edCAXhFMWicvF4eM9qqJn40hF3iEcd/KB/lbKKvhw=="}]},"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.25_1641066351505_0.054506820646587295"},"_hasShrinkwrap":false},"3.0.0-beta.26":{"name":"warthog","version":"3.0.0-beta.26","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/nanoid":"^3.0.0","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.14.11","@types/prettier":"^1.18.3","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","flatted":"^3.2.4","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","nanoid":"^3","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^8.6.0","pgtools":"^0.3.1","prettier":"^1.19.1","reflect-metadata":"^0.1.13","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.32","typeorm-typedi-extensions":"^0.4.1","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true,"trailingComma":"none"},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"gitHead":"739666a4d4f8b43b0b406bcdcc1d787ef9319138","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 2.0 to 3.0\n\nWarthog is now on version 3.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### Adds `computed` attribute to models\n\nA `computed` property is one that is fully managed by the server. A good example is a status flag that is managed by a state machine in the backend. You should not be able to modify this on create or update, but should always be able to read it.\n\n### Switch ID generation library from `shortid` (deprecated) to `nanoid`\n\nPer `shortid` [README](https://github.com/dylang/shortid/blob/master/README.md) it is deprecated.\n\n### Deprecated individual `WARTHOG_APP_*` variables in favor of `WARTHOG_API_BASE_URL`\n\nIt's a pain to have to manage 3 separate environment variables for setting the base API URL. We still support this, but prefer the new `WARTHOG_API_BASE_URL` and will use it first if it's present when spinning up a server.\n\n### BaseModel has been overhauled\n\n- SchemaGenerator no longer generates a Binding by default, must now pass a param in and pass `--binding` in the CLI\n- All `__Id` fields are now properly `ID` fields in the GraphQL schema\n- BaseModel and IdModel default to only filtering on `id_in`, not `eq` since you could use `findOne` query to get a single item\n- Removed column.editable - use `readonly` moving forward\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up.\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_API_BASE_URL          | Api base url                                             | _none_                    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n### Removed Environment Variables\n\nAll of the `WARTHOG_APP_*` environment variables will still work, but it is strongly recommended you use the single variable `WARTHOG_API_BASE_URL`\n\n| variable | value |\n| WARTHOG_APP_HOST | App server host |\n| WARTHOG_APP_PORT | App server port |\n| WARTHOG_APP_PROTOCOL | App server protocol |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","_id":"warthog@3.0.0-beta.26","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-jqbD6wbpjSWT5qrcDTRz7PejBjNNvlttY3c8LjO9wVjRZvJnLGm/7suBz0dJPFkMuXlgzpfFiJStmsqy24u4+A==","shasum":"2ef13c947886f4be238c7b2fb10986481e5b5059","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.26.tgz","fileCount":435,"unpackedSize":1117643,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh0LDICRA9TVsSAnZWagAAShQQAJwyGkuajKEdonPyyFKj\nihzwUzPlkeg/aYmDGXtNrrIA4TDm2Bgm5quNoAUiICypi6zUeXctvnZ6Eh+I\nZWr65RvfLR4R+5tjnFaofFfoKj0JtzaasuVypynbhNPCsHGqOIzBmKEB43gB\nok9bwQVLVNCIl+9QCEd2+7nfKlzQH+PvLhGXR1x1bI3wQX6WsuGIWS6XFIOB\n59UzmfkP2fYgK3gNsGEyK0GRjLEx3xU217RzYQWPKMtbKQE7f2gB+8kLfTL7\nC9eAGpO/+4EiYICKpAJDISt/7x2OFHqdo/9wbauG7EiUosZqnnrZXt5FOVqi\nvhuHJ3NqBzUhxEyIMnxTuA4TUe/OsgufY+otNJTmr6c0Mw0KnjK+cSb4okrP\nuhClCnRWGAqLviNAVOvaxFmaFwVONZIi/h0vqDVU2zQ/N+37QKH316eEp1Jp\n9VMfsh7gzbnsOOxlH4huN/VIy3r7kWAte/i4nWsw0FAV0nTjve6cI4eO+qBC\n5SUxzM27rQmpMlRJuC4IUPL8ZFTlG42oVvDwYLVZlvQB+6RALU8rF1fDJPRD\nJcC9dQdDpm9/INiDzz9bogEbdddVuujq9ooenSwwXoaXAXqLD8XJ8LoYZ8QI\nY7E7t9Y4sL00bcCtnQl45rBDlHBSyFAKULW2RJWmHVqTMrrJh13tyvzNYe97\naky2\r\n=iV8O\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFd+kRylWVkNDmdPUYhDTv7Rb9vIYir0P7McoZeLVmiEAiBsVGNeU4DNomKeLoVplVX5+HFrug7eA6qUymmz71ZWgA=="}]},"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.26_1641066696540_0.439340687934489"},"_hasShrinkwrap":false},"3.0.0-beta.27":{"name":"warthog","version":"3.0.0-beta.27","description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","main":"dist/index.js","types":"dist/types/index.d.ts","bin":{"warthog":"bin/warthog"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"scripts":{"build":"rm -rf ./dist && yarn tsc && copyfiles -u 1 src/cli/**/*.ejs dist/","bootstrap":"./tools/bootstrap-all.sh","check:code":"tsc --noEmit && yarn lint && yarn prettify","circle:build":"rm ./tmp/circle.build.yml 2> /dev/null && circleci config process .circleci/config.yml > ./tmp/circle.build.yml && circleci local execute -c ./tmp/circle.build.yml --job build","deploy:debug":"npm_config_loglevel=verbose CIRCLE_BRANCH=beta CIRCLECI=true CI=true yarn semantic-release --debug","lint":"eslint './+(examples|src|test|tools)/**/*.{js,ts}' --fix","//prettier":"Note: ignores node_modules by default and 'generated' folder via .prettierignore","prettify":"yarn prettier './+(examples|src|test|tools)/**/*.ts' --write","semantic-release":"semantic-release","test":"./tools/test.sh","test:prod":"NODE_ENV=production ./tools/test.sh","test:watch":"./tools/test.sh --watch"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"lint-staged && tsc && yarn test"}},"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"keywords":["graphql","typeorm","typescript"],"license":"MIT","bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"homepage":"https://github.com/goldcaddy77/warthog#readme","//":"TODO: figure out which of these are dependencies, devDeps or peerDeps","dependencies":{"@types/app-root-path":"^1.2.4","@types/caller":"^1.0.0","@types/cosmiconfig":"^6.0.0","@types/debug":"^4.1.5","@types/dotenv":"^8.2.0","@types/express":"^4.17.2","@types/graphql":"^14.5.0","@types/graphql-fields":"^1.3.2","@types/graphql-iso-date":"^3.3.3","@types/graphql-type-json":"^0.3.2","@types/isomorphic-fetch":"^0.0.35","@types/lodash":"^4.14.148","@types/mkdirp":"^0.5.2","@types/nanoid":"^3.0.0","@types/node":"^12.12.8","@types/node-emoji":"^1.8.1","@types/open":"^6.2.1","@types/pg":"^7.14.11","@types/prettier":"^1.18.3","@types/ws":"^6.0.3","apollo-link-error":"^1.1.12","apollo-link-http":"^1.5.16","apollo-server":"^2.9.9","apollo-server-express":"^2.9.9","app-root-path":"^3.0.0","caller":"^1.0.1","class-transformer":"^0.2.3","class-validator":"^0.11.0","cosmiconfig":"^6.0.0","cross-fetch":"^3.0.4","dataloader":"^1.4.0","debug":"^4.1.1","execa":"^4.0.3","express":"^4.17.1","flatted":"^3.2.4","gluegun":"^4.1.0","graphql":"^14.5.8","graphql-binding":"^2.5.2","graphql-fields":"^2.0.3","graphql-import-node":"^0.0.4","graphql-iso-date":"^3.6.1","graphql-scalars":"^1.2.6","graphql-tools":"^4.0.6","graphql-type-json":"^0.3.0","lodash":"^4.17.15","mkdirp":"^0.5.1","nanoid":"^3","node-emoji":"^1.10.0","open":"^7.0.0","pg":"^8.6.0","pgtools":"^0.3.1","prettier":"^1.19.1","reflect-metadata":"^0.1.13","type-graphql":"^0.17.5","typedi":"^0.8.0","typeorm":"^0.2.32","typeorm-typedi-extensions":"^0.4.1","typescript":"^3.9.7"},"devDependencies":{"@commitlint/cli":"^8.3.5","@commitlint/config-conventional":"^8.3.4","@types/execa":"^2.0.0","@types/faker":"^4.1.12","@types/jest":"^24.0.23","@types/supertest":"^2.0.8","@typescript-eslint/eslint-plugin":"^2.7.0","@typescript-eslint/parser":"^2.7.0","copyfiles":"^2.3.0","dotenv":"^8.2.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-prettier":"^3.1.1","faker":"^5.1.0","husky":"^3.0.9","jest":"^24.9.0","lint-staged":"^9.4.3","markdownlint-cli":"^0.19.0","semantic-release":"^16.0.0-beta.31","supertest":"^4.0.2","ts-jest":"^24.1.0","ts-node":"^8.10.2","ts-node-dev":"^1.0.0-pre.60"},"lint-staged":{"*.ts":["eslint --fix","prettier --write","git add"],"*.{js,json}":["prettier --write","git add"],"*.md":["markdownlint"]},"prettier":{"printWidth":100,"singleQuote":true,"trailingComma":"none"},"jest":{"setupFiles":["./src/test/setupFiles.ts"],"setupFilesAfterEnv":["./src/test/setupFilesAfterEnv.ts"],"transform":{".ts":"ts-jest"},"testRegex":"\\.test\\.ts$","moduleFileExtensions":["ts","js"],"modulePathIgnorePatterns":["/examples/"],"watchPathIgnorePatterns":["tmp/","/generated/*"],"collectCoverageFrom":["src/**/*.ts"],"coveragePathIgnorePatterns":["/node_modules/","src/test/*","\\.test\\.ts$"],"globals":{"ts-jest":{"tsConfig":"tsconfig.test.json"}}},"resolutions":{"//":"Fixes security vulnerability","set-value":"2.0.1"},"release":{"branches":["+([0-9])?(.{+([0-9]),x}).x","main","next",{"name":"beta","prerelease":true},{"name":"alpha","prerelease":true}]},"gitHead":"5ff372070d150cd7fcb189c8149eb25098f148bd","readme":"<p align=\"center\">\n  <a href=\"http://warthog.dev/\"><img src=\"./img/warthog-logo.png\" width=\"400\" alt=\"Warthog Logo\"></a>\n</p>\n\n <p align=\"center\">\n   Node.js <a href=\"https://graphql.org\" target=\"_blank\">GraphQL</a> Framework for building APIs with strong conventions through auto-generated code.  With Warthog, set up your data models and resolvers, and it does the rest.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://blacklivesmatter.com/\"><img src=\"https://img.shields.io/badge/branch-main-fce21b?labelColor=black\" alt=\"Black Lives Matter\"/></a>\n  <a href=\"https://www.npmjs.org/package/warthog\"><img src=\"https://img.shields.io/npm/v/warthog.svg\" alt=\"npm version\"></a>\n  <a href=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main\"><img src=\"https://circleci.com/gh/goldcaddy77/warthog/tree/main.svg?style=shield\" alt=\"CircleCI\"></a>\n  <a href=\"https://codecov.io/gh/goldcaddy77/warthog\"><img src=\"https://codecov.io/gh/goldcaddy77/warthog/branch/master/graph/badge.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"#badge\"><img src=\"https://img.shields.io/badge/styled_with-prettier-ff69b4.svg\" alt=\"styled with prettier\"></a>\n  <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\" alt=\"semantic-release\"></a>\n  <a href=\"https://gitter.im/warthog-graphql/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge\"><img src=\"https://badges.gitter.im/warthog-graphql/community.svg\" alt=\"Join the chat at https://gitter.im/warthog-graphql/community\"></a>\n</p>\n\n## Summary\n\nWarthog is a [Node.js](http://nodejs.org) GraphQL API framework for quickly building consistent GraphQL APIs that have sorting, filtering and pagination out of the box. It is written in [TypeScript](http://www.typescriptlang.org) and makes heavy use of decorators for concise, declarative code.\n\n## Note: Upgrading from 2.0 to 3.0\n\nWarthog is now on version 3.0! There were a few breaking changes that you should consider while upgrading. Also, we tried to keep all new features development on v1, but did end up adding JSON filtering directly to 2.0 as it was much easier given some foundation refactors.\n\n<details>\n<summary>Expand for Breaking change details</summary>\n<p>\n\n### Adds `computed` attribute to models\n\nA `computed` property is one that is fully managed by the server. A good example is a status flag that is managed by a state machine in the backend. You should not be able to modify this on create or update, but should always be able to read it.\n\n### Switch ID generation library from `shortid` (deprecated) to `nanoid`\n\nPer `shortid` [README](https://github.com/dylang/shortid/blob/master/README.md) it is deprecated.\n\n### Deprecated individual `WARTHOG_APP_*` variables in favor of `WARTHOG_API_BASE_URL`\n\nIt's a pain to have to manage 3 separate environment variables for setting the base API URL. We still support this, but prefer the new `WARTHOG_API_BASE_URL` and will use it first if it's present when spinning up a server.\n\n### BaseModel has been overhauled\n\n- SchemaGenerator no longer generates a Binding by default, must now pass a param in and pass `--binding` in the CLI\n- All `__Id` fields are now properly `ID` fields in the GraphQL schema\n- BaseModel and IdModel default to only filtering on `id_in`, not `eq` since you could use `findOne` query to get a single item\n- Removed column.editable - use `readonly` moving forward\n\n</p>\n</details>\n\n## Philosophy\n\nThis library is intentionally opinionated and generates as much code as possible. When teams build products quickly, even if they have strong conventions and good linters, the GraphQL can quickly become inconsistent, making it difficult for clients to consume the APIs in a reusable way.\n\nTo do this, Warthog automatically generates the following:\n\n- Database schema - generated by [TypeORM](https://github.com/typeorm/typeorm)\n- Your entire GraphQL Schema including:\n  - types to match your entities - generated by [TypeGraphQL](https://github.com/19majkel94/type-graphql)\n  - GraphQL inputs for consistent creates, updates, filtering, and pagination\n    inspired by [Prisma](https://github.com/prisma/prisma)'s conventions\n- A [graphql-binding](https://github.com/graphql-binding/graphql-binding) for\n  type-safe programmatic access to your APIs.\n- TypeScript classes for the generated GraphQL schema for type-safety while developing.\n\nFurther, it covers the following concerns by hooking into best-in-class open source libraries:\n\n- Validation: Automatic validation before data is saved using any of the decorators available in the [class-validator](https://github.com/typestack/class-validator#validation-decorators) library.\n\n## Prerequisites\n\nWarthog currently only supports PostgreSQL as a DB engine, so you must have Postgres installed before getting Warthog set up.\n\n<details>\n<summary>Expand for Postgres installation options</summary>\n<p>\n\n### Homebrew (OSX)\n\nIf you're on OSX and have [homebrew](http://brew.sh/) and [homebrew-cask](https://github.com/caskroom/homebrew-cask) installed, you can simply run:\n\n```bash\nbrew cask install postgres\n```\n\nOr you can install Homebrew's official version:\n\n```bash\nbrew install postgresql\n`brew --prefix`/opt/postgres/bin/createuser -s postgres\n```\n\n### Postgres.app (OSX)\n\nOtherwise, you can install [Postgres.app](https://postgresapp.com/) manually.\n\n### Docker\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/pull/6/files) project for how to use Docker to run Postgres.\n\n</p>\n</details>\n\n## Getting Started\n\nWarthog comes with a CLI that makes it easy to get started.\n\n### Create new project with the CLI\n\nTo install in an existing project, you'll need to create several files in place and then you'll need to call a few Warthog CLI commands that:\n\n- Generate a new resource\n- Create a database\n- Create a DB migration and run it\n- Run the server\n\nThe following code will get you bootstrapped. You should read through this before running:\n\n```bash\n# Add warthog so that we can use the CLI\nyarn add warthog\n\n# Bootstrap a new application using Warthog CLI\nyarn warthog new\n\n# Install dependencies from generated package.json\nyarn\n\n# Generate a resource (model, resolver and service)\nyarn warthog generate user name! nickname age:int! verified:bool!\n\n# Generate typescript classes and GraphQL schema\nyarn warthog codegen\n\n# Create your DB\nyarn warthog db:create\n\n# Generate the DB migration for your newly generated model\nyarn warthog db:migrate:generate --name=create-user-table\n\n# Run the DB migration\nyarn warthog db:migrate\n\n# Start the server\nyarn start:dev\n```\n\nHere's what this looks like in action:\n\n![warthog-quickstart](https://user-images.githubusercontent.com/573625/69854217-8967f380-1256-11ea-8492-dee07334501d.gif)\n\nThis will open up GraphQL Playground, where you can execute queries and mutations against your API.\n\nFirst, add a user by entering the following in the window:\n\n```graphql\nmutation {\n  createUser(data: { name: \"Test User\", age: 25, verified: false }) {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nThen, query for this user:\n\n```graphql\nquery {\n  users {\n    id\n    name\n    createdAt\n  }\n}\n```\n\nSee [introducing-graphql-playground](https://www.prisma.io/blog/introducing-graphql-playground-f1e0a018f05d) for more info about GraphQL Playground.\n\n<details>\n<summary>Expand for other options for how to play with Warthog</summary>\n<p>\n\n### Cloning the `warthog-starter` project\n\nAnother way to start playing with Warthog is to clone the [warthog-starter](https://github.com/goldcaddy77/warthog-starter) repo. To get the starter project up and running, do the following:\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog-starter.git\ncd warthog-starter\nyarn bootstrap\nWARTHOG_AUTO_OPEN_PLAYGROUND=true yarn start:dev\n```\n\n### Running the examples in the Warthog repo\n\nYou can also clone the Warthog repo and run the examples in the [examples](./examples/README.md) folder.\n\n```bash\ngit clone git@github.com:goldcaddy77/warthog.git\ncd warthog/examples/01-simple-model\nyarn bootstrap\nyarn db:seed:dev\nyarn start\n```\n\nThis has a simple example in place to get you started. There are also a bunch of examples in the folder for more advanced use cases.\n\nNote that the examples in the [examples](./examples/README.md) folder use relative import paths to call into Warthog. In your projects, you won't need to set this config value as it's only set to deal with the fact that it's using the Warthog core files without consuming the package from NPM. In your projects, you can omit this as I do in [warthog-starter](https://github.com/goldcaddy77/warthog-starter).\n\n</p>\n</details>\n\n### Warthog Constructs Explained\n\n#### Models\n\nA model represents both a GraphQL type and a DB table. Warthog exposes a [BaseModel](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseModel.ts) class that provides the following columns for free: `id`, `createdAt`, `createdById`, `updatedAt`, `updatedById`, `deletedAt`, `deletedById`, `version`. If you use BaseModel in conjunction with BaseService (see below), all of these columns will be updated as you'd expect. The Warthog server will find all models that match the following glob - `'/**/*.model.ts'`. Ex: `user.model.ts`\n\nCustom [TypeORM](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#entity) and [TypeGraphQL](https://typegraphql.ml/docs/types-and-fields.html) options may be passed into the `Model` decorator using the following signature.\n\n```javascript\n@Model({ api: { description: 'Custom description' }, db: { name: 'customtablename' } })\n```\n\n#### Resolvers\n\nA Warthog resolver exposes queries (reading data) and mutations (writing data). They interact with the DB through `services` (described below) and typically make use of a bunch of auto-generated TypeScript types in the `generated` folder for things like sorting and filtering. Warthog will find all resolvers that match the following glob - `'/**/*.resolver.ts'`. Ex: `user.resolver.ts`\n\n#### Services\n\nServices are the glue between resolvers and models. Warthog exposes a class called [BaseService](https://github.com/goldcaddy77/warthog/blob/master/src/core/BaseService.ts) that exposes the following methods: `find`, `findOne`, `create`, `update`, `delete`. For the `find` operator, it also maps the auto-generated `WhereInput` attributes to the appropriate TypeORM Query Builders. Warthog's convention is to name services `<model-name>.service.ts`. Ex: `user.service.ts`\n\n#### Generated Folder\n\nWhen you start your server, there will be a new `generated` folder that Warthog creates automatically. The folder contains:\n\n- classes.ts: Warthog auto-generates this file from the metadata it collects (from decorators like `Model`, `Query`, `Resolver`, `StringField`, etc...). Resolvers will import items from here instead of having to manually create them.\n- schema.graphql: This is auto-generated from our resolvers, models and `classes.ts` above. Check out [this example's schema.graphql](https://github.com/goldcaddy77/warthog/blob/master/examples/01-simple-model/generated/schema.graphql) to show the additional GraphQL schema Warthog autogenerates.\n- ormconfig.ts: a TypeORM [ormconfig](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md) file.\n- binding.ts - a [graphql-binding](https://www.prisma.io/docs/1.10/graphql-ecosystem/graphql-binding/graphql-binding-quaidah9ph) for type-safe programmatic access to your API (making real API calls)\n\n## Server API (appOptions)\n\nMost of the config in Warthog is done via environment variables (see `Config - Environment Variables` below). However, more complex/dynamic objects should be passed via the server config.\n\n| attribute                 | description                                                                                               | default                                       |\n| ------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------- |\n| container                 | TypeDI container. Warthog uses dependency injection under the hood.                                       | empty container                               |\n| authChecker               | An instance of an [AuthChecker](https://typegraphql.ml/docs/authorization.html) to secure your resolvers. |                                               |\n| context                   | Context getter of form `(request: Request) => Promise<object>`                                            | empty                                         |\n| logger                    | Logger                                                                                                    | [debug](https://github.com/visionmedia/debug) |\n| middlewares               | [TypeGraphQL](https://typegraphql.ml/docs/middlewares.html) middlewares to add to your server             | none                                          |\n| onBeforeGraphQLMiddleware | Callback executed just before the Graphql server is started. The Express app is passed.                   | none                                          |\n| onAfterGraphQLMiddleware  | Callback executed just after the Graphql server is started. The Express app is passed.                    | none                                          |\n\n## Config - Environment Variables\n\nAlmost all config in Warthog is driven by environment variables. The following items are available:\n\n| variable                      | value                                                    | default                   |\n| ----------------------------- | -------------------------------------------------------- | ------------------------- |\n| WARTHOG_API_BASE_URL          | Api base url                                             | _none_                    |\n| WARTHOG_AUTO_GENERATE_FILES   | Auto-generate files                                      | DEV: true, PROD: false    |\n| WARTHOG_AUTO_OPEN_PLAYGROUND  | Open playground on server start                          | DEV: true, PROD: false    |\n| WARTHOG_CLI_GENERATE_PATH     | Where should CLI generate files                          | ./src                     |\n| WARTHOG_DB_DATABASE           | DB name                                                  | _none_                    |\n| WARTHOG_DB_ENTITIES           | Where should warthog look for models                     | src\\/\\*\\*\\/\\*.model.ts    |\n| WARTHOG_DB_MIGRATIONS         | What DB migrations should TypeORM run                    | db/migrations/\\*\\*\\/\\*.ts |\n| WARTHOG_DB_MIGRATIONS_DIR     | Where should generated migrations be placed              | db/migrations             |\n| WARTHOG_DB_PORT               | DB port                                                  | 5432                      |\n| WARTHOG_DB_USERNAME           | DB username                                              | _none_                    |\n| WARTHOG_DB_LOGGER             | TypeORM logger                                           | advanced-console          |\n| WARTHOG_DB_PASSWORD           | DB password                                              | _none_                    |\n| WARTHOG_DB_SYNCHRONIZE        | DB automatically migrated                                | false                     |\n| WARTHOG_FILTER_BY_DEFAULT     | Should all filters and sorts be generated by default?    | true                      |\n| WARTHOG_GENERATED_FOLDER      | Where should generated code be placed                    | ./generated               |\n| WARTHOG_HEADERS_TIMEOUT_MS    | See [Node server.headersTimeout][1]                      | 60000                     |\n| WARTHOG_INTROSPECTION         | Allow server to be introspected                          | true                      |\n| WARTHOG_KEEP_ALIVE_TIMEOUT_MS | See [Node server.keepAliveTimeout][2]                    | 30000                     |\n| WARTHOG_RESOLVERS_PATH        | Where should Warthog look for resolvers                  | src/\\*\\*\\/\\*.resolver.ts  |\n| WARTHOG_SUBSCRIPTIONS         | Should we enable subscriptions and open a websocket port | false                     |\n| WARTHOG_VALIDATE_RESOLVERS    | TypeGraphQL validation enabled?                          | false                     |\n\n### Removed Environment Variables\n\nAll of the `WARTHOG_APP_*` environment variables will still work, but it is strongly recommended you use the single variable `WARTHOG_API_BASE_URL`\n\n| variable | value |\n| WARTHOG_APP_HOST | App server host |\n| WARTHOG_APP_PORT | App server port |\n| WARTHOG_APP_PROTOCOL | App server protocol |\n\n## Field/Column Decorators\n\nAll of the auto-generation magic comes from the decorators added to the attributes on your models. Warthog decorators are convenient wrappers around TypeORM decorators (to create DB schema) and TypeGraphQL (to create GraphQL schema). You can find a list of decorators available in the [src/decorators](./src/decorators) folder. Most of these are also used in the [examples](./examples) folder in this project.\n\n## Transactions\n\nThere are a few ways to handle transactions in the framework, depending if you want to use `BaseService` or use your repositories directly.\n\n### Using BaseService\n\nTo wrap BaseService operations in a transaction, you do 3 things:\n\n1. Create a function decorated with the `@Transaction` method decorator\n2. Inject `@TransactionManager` as a function parameter\n3. Pass the `@TransactionManager` into calls to `BaseService`\n\n#### @Transaction method decorator\n\nThe `@Transaction` decorator opens up a new transaction that is then available via the `@TransactionManager`. It will automatically close the transaction when the function returns, so it is important to `await` your service calls and not return a promise in this function.\n\n```typescript\n  @Transaction()\n  async createTwoItems() {\n    // ...\n  }\n```\n\n#### @TransactionManager decorator\n\nThe `@TransactionManager` is essentially the same as a TypeORM EntityManger, except it wraps everything inside of it's transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    // ...\n  }\n```\n\n#### Pass manager to BaseService\n\nYou can pass the entity manager into any of the `BaseService` methods to ensure they're part of the transaction.\n\n```typescript\n  @Transaction()\n  async createTwoItems(\n        @TransactionManager() manager?: EntityManager\n  ) {\n    this.create(data, userId, { manager })\n  }\n```\n\n#### Example\n\n```typescript\n@Service('UserService')\nexport class UserService extends BaseService<User> {\n  constructor(@InjectRepository(User) protected readonly repository: Repository<User>) {\n    super(User, repository);\n  }\n\n  // GOOD: successful transaction\n  @Transaction()\n  async successfulTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(data, userId, { manager })\n    ]);\n  }\n\n  // GOOD: successful rollback when something errors\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    const invalidUserData = {};\n\n    const users = await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager }) // This one fails\n    ]);\n\n    return users;\n  }\n\n  // BAD: you can't return a promise here.  The function will return and the first\n  // user will be saved even though the 2nd one fails\n  @Transaction()\n  async failedTransaction(\n    data: DeepPartial<User>,\n    userId: string,\n    @TransactionManager() manager?: EntityManager\n  ): Promise<User[]> {\n    return await Promise.all([\n      this.create(data, userId, { manager }),\n      this.create(invalidUserData, userId, { manager })\n    ]);\n  }\n}\n```\n\nSee the [TypeORM Transaction Docs](https://github.com/typeorm/typeorm/blob/master/docs/transactions.md#transaction-decorators) for more info.\n\n## Complex use cases\n\nWarthog makes building simple CRUD endpoints incredibly easy. In addition, since it is built on top of TypeORM and TypeGraphQL it is flexible enough to handle complex use cases as well. If you need a field to be exposed to either the DB or API, but not both, do the following:\n\n### DB-only\n\nIf you need to add a column to the DB that does not need to be exposed via the API, you should pass the `dbOnly` option to your decorator:\n\n```typescript\n  @StringField({ dbOnly: true })\n  dbOnlyField!: string;\n```\n\nNote that you could also just use the [TypeORM Column Decorator](https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md) as well. However, if Warthog adds additional capabilities in this space, we would not have this column metadata, so it is recommended you use the `dbOnly` option.\n\n### API-only\n\nIf you need to add a field that is exposed via the API that is not database-backed, use the `apiOnly` option:\n\n```typescript\n  @StringField({ apiOnly: true })\n  apiOnlyField!: string;\n```\n\n### Custom Query\n\nSee the [feature-flag example](./examples/07-feature-flags/) for an example of where we'd want to build something beyond the standard CRUD actions. In this example we want to add a custom query that makes a complex DB call.\n\n- First add the query to the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L75-L79)\n- Then add the custom query input in the resolver - [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.resolver.ts#L31-L41)\n- Then add the custom service method that fetches the data [link to code](https://github.com/goldcaddy77/warthog/blob/master/examples/07-feature-flags/src/feature-flag/feature-flag.service.ts#L28-L48)\n\nWarthog will generate the correct GraphQL query and InputType automatically.\n\n## CLI\n\nWarthog ships with the following commands that can be accessed by running `yarn warthog <command>`.\n\nSee the [warthog-starter](https://github.com/goldcaddy77/warthog-starter/blob/master/package.json) project's package.json for example usage.\n\n| Command           | Args      | Description                                                                             |\n| ----------------- | --------- | --------------------------------------------------------------------------------------- |\n| codegen           | none      | autogenerates code from decorated models and resolvers and places in `generated` folder |\n| db:create         | none      | creates DB based on DB specified in config file                                         |\n| db:drop           | none      | drops DB based on DB specified in config file                                           |\n| generate          | See below | generates a model, service and resolver                                                 |\n| db:migrate        | none      | migrates DB (proxies through TypeORM CLI)                                               |\n| db:migrate:create | none      | auto-generates DB migration based on new code additions (proxies through TypeORM CLI)   |\n\n### `generate` Command in depth\n\nThe `generate` command will create a new resolver, service and model for a given resource. Let's start with a complex example and we'll break it down:\n\n```bash\nyarn warthog generate user name! nickname numLogins:int! verified:bool! registeredAt:date balance:float! --folder my_generated_folder\n```\n\n- `user` - this is the name of the new resource (required)\n- ...args - each of the remaining args until `--folder` is a field on the resource\n- `name!` - the name field is of type string by default since no data type is specified. The `!` states that it's required\n- `numLogins:int!` - numLogins states that it is of type int - also required\n- `registeredAt:date` - registeredAt is of type date (which correlates to an ISO8601 datetime). The absence of the `!` means it is optional.\n- ...the rest of the args are self-explanatory. Possible types are `bool`, `date`, `int`, `float` and `string`. If you need to use other types, just add them as strings and update the models manually.\n- `--folder` - this allows you to explicitly set the folder where the generated files should go. This is not recommended and instead you should use the .rc file (see below)\n\n## `warthogrc` config file\n\nWarthog uses [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) for config that shouldn't change between environments (so typically file paths). This means you can put any of the following config files in your project root:\n\n- .warthogrc.json\n- .warthogrc.yaml\n- .warthogrc.js\n- warthog.config.js file (exporting a JS object)\n\nThe following config options are currently available:\n\n| Config Key      | Description                                                                  | Equivalent Environment Variable |\n| --------------- | ---------------------------------------------------------------------------- | ------------------------------- |\n| generatedFolder | Relative location to generated folder (relative path from the config file)   | WARTHOG_GENERATED_FOLDER        |\n| cliGeneratePath | Where should CLI place generated files? (relative path from the config file) | WARTHOG_CLI_GENERATE_PATH       |\n| resolversPath   | Where should Warthog look for resolvers? (comma-delimited list of regexes)   | WARTHOG_RESOLVERS_PATH          |\n\nNote that for `cliGeneratePath`, you can interpolate in the following strings to generate dynamic paths:\n\n- `className` (pascal case)\n- `camelName` (camel case)\n- `kebabName` (kebab case)\n\nExample:\n\n```json\n{\n  \"cliGeneratePath\": \"./src/${kebabName}\"\n}\n```\n\nRunning `yarn warthog generate featureFlag` would create 3 files in the `./src/feature-flag/` folder. See [feature-flag example](./examples/7-feature-flags/warthog.config.js) for a live example.\n\n## Usage in Production\n\nIt is recommended that you not run Warthog's TypeScript files via `ts-node` in Production as we do in development as `ts-node` has been known to cause issues in some smaller AWS instances. Instead, compile down to JS and run in `node`. For a full project example (using [dotenvi](https://github.com/b3ross/dotenvi) for config management), see [warthog-starter](https://github.com/goldcaddy77/warthog-starter)\n\n## Contributing\n\nPRs accepted, fire away! Or add issues if you have use cases Warthog doesn't cover.\n\nBefore contributing, make sure you have Postgres installed and running with a user named `postgres` with an empty password. If you don't have this local Postgres user, you'll need to update the `.env` files in the `examples` folders to point to a user that can run DB migrations.\n\nOnce you have this user set up, you can build a specific example by navigating to that folder and running `yarn bootstrap`.\n\nIf you want to build all examples, you can run `yarn bootstrap` from the Warthog root folder.\n\nIt's helpful to add a new feature to the Warthog and make use of it in one of the examples folders until you've determined how it's going to work. Once you have it working, you can add tests.\n\n## Intentionally Opinionated\n\nWarthog is intentionally opinionated to accelerate development and make use of technology-specific features:\n\n- Postgres - currently the only database supported. This could be changed, but choosing Postgres allows adding a docker container and other goodies easily.\n- Jest - other harnesses will work, but if you use Jest, we will not open the GraphQL playground when the server starts, for example.\n- Soft deletes - no records are ever deleted, only \"soft deleted\". The base service used in resolvers filters out the deleted records by default.\n\n## Thanks\n\nSpecial thanks to:\n\n- [TypeORM](https://github.com/typeorm/typeorm) - DB generation\n- [TypeGraphQL](https://github.com/19majkel94/type-graphql) - GraphQL generation\n- [Prisma](https://github.com/prisma/prisma) - [OpenCrud](https://github.com/opencrud/opencrud) conventions\n- [richardbmx](https://github.com/richardbmx) - Logo design\n\nWarthog is essentially a really opinionated composition of TypeORM and TypeGraphQL that uses similar GraphQL conventions to the Prisma project.\n\n## License\n\nMIT © Dan Caddigan\n\n[1]: https://nodejs.org/api/http.html#http_server_headerstimeout\n[2]: https://nodejs.org/api/http.html#http_server_keepalivetimeout\n","readmeFilename":"README.md","_id":"warthog@3.0.0-beta.27","_nodeVersion":"10.13.0","_npmVersion":"6.14.1","dist":{"integrity":"sha512-5szcW2Q5Qm8HnIXaqLMZNVzr/ITSKOsUHQxeZ9P/zaAHEtfj1Abz4UQ4S2Uh/pdUKOP128ltoRYAug5FNpSnQA==","shasum":"02711a55722a131052a4d1f124ee0291515391bd","tarball":"https://registry.npmjs.org/warthog/-/warthog-3.0.0-beta.27.tgz","fileCount":435,"unpackedSize":1120039,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh5IDTCRA9TVsSAnZWagAA1tMP/A1nLb7rz6xlOj0aIDyL\npwl8QOh88uCdkh2rPWyBXyYRMDYaTKYO/iX++FAia0r/54FRhd9QQ4lqYK3s\nQAcvl4L7r84SdrjY7Bzyty85xn8hNvVvV2sLYXv/SwQK2CMr+aw4L8HAh7Mq\nDHnb7/s+KDSuI0aCNL0nJWY1B6D325yIpwL5WYUh0oyqLJ00/CnhJ6KqBIdA\naB+vBoOPPrQ+fM+TgF8zpd10bW6Ypkro148dW4GWO6TLcw4XcfkjR1GSHk8r\n6TBgObxYdLRIHbpzO2eky4mw1LqAwZs6sGZPEr0ZapdXBt8sn6j60l7hTlyr\nbDW4hbuQ+SlYjcmjcuN1XHMHDme7AMAcKm/gjxBY9HGDjvrXxM26uOMOHxxF\nm0fWGlxikO7pSfkN1Skb0bRrwR9QiEYYhMOvsILaHQUUavpLEbWpJw1ugb7J\nCSxwcBIK5EG222s+3qqmOAttcUD+2/DCEPS9TdjRjwG0/ZsLiFKr/PSAsNf2\ngaw6GFpko6p10XHW8HINDz66vY3W6ZjfoOxXn4W2+IB8qTBb2QRbwzVXyVbu\nQc+t6xDhsAZL7Dwgj21onQb4DlAVzgdSPdsgsohR61KYY2VrGmdZehygNCe3\nAO2uIso0T043eszJyze9W4RHPxlOd+2MfhEzsWAhQywIkcQBCbpjl905jblr\najXt\r\n=kQTN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFSya87Gq45LbzWCuFTn+deR2dWrA1l3PIfBkwxh1tnxAiB9+OS0v4zvDCkccEuciLY/42EMnINzLgG5G5SJZEw76w=="}]},"_npmUser":{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"},"directories":{},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/warthog_3.0.0-beta.27_1642365139541_0.2746164783519467"},"_hasShrinkwrap":false}},"time":{"created":"2018-07-26T04:53:14.626Z","1.0.0":"2018-07-26T04:53:14.698Z","modified":"2022-05-24T01:33:50.642Z","1.1.0":"2019-01-06T06:32:11.580Z","0.0.0-development":"2019-01-08T05:38:13.217Z","1.3.0":"2019-01-08T06:04:17.323Z","1.3.1":"2019-01-08T06:29:57.806Z","1.4.0":"2019-01-12T07:45:23.142Z","1.4.1":"2019-01-12T16:47:01.958Z","1.5.0":"2019-01-12T23:10:17.494Z","1.5.1":"2019-01-12T23:45:24.850Z","1.5.2":"2019-01-13T06:59:56.022Z","1.6.0":"2019-01-15T05:06:03.738Z","1.7.0":"2019-01-15T05:10:46.155Z","1.8.0":"2019-01-20T16:42:47.744Z","1.8.1":"2019-01-20T17:41:06.245Z","1.8.2":"2019-01-20T18:40:33.013Z","1.9.0":"2019-01-20T21:12:39.781Z","1.9.1":"2019-01-21T04:23:23.875Z","1.9.2":"2019-01-23T22:20:51.767Z","1.9.3":"2019-01-26T04:57:39.412Z","1.9.4":"2019-01-26T05:59:17.511Z","1.10.0":"2019-01-26T06:58:54.385Z","1.10.1":"2019-01-26T17:18:24.084Z","1.11.0":"2019-01-26T17:36:40.049Z","1.12.0":"2019-01-26T21:06:55.704Z","1.13.0":"2019-02-02T03:02:47.974Z","1.14.0":"2019-02-11T22:41:34.399Z","1.14.1":"2019-02-13T00:02:56.896Z","1.15.0":"2019-02-14T19:45:59.963Z","1.16.0":"2019-03-14T02:40:35.835Z","1.16.1":"2019-03-14T02:42:23.800Z","1.16.2":"2019-03-14T19:31:06.212Z","1.17.0":"2019-03-15T15:15:04.039Z","1.17.1":"2019-03-18T17:04:38.166Z","1.17.2":"2019-03-19T14:04:54.230Z","1.17.3":"2019-03-20T16:55:29.987Z","1.17.4":"2019-03-25T19:44:59.524Z","1.17.5":"2019-03-27T23:32:40.004Z","1.18.0":"2019-03-29T19:02:13.303Z","1.19.0":"2019-04-01T17:48:46.600Z","1.19.1":"2019-04-02T21:25:49.896Z","1.19.2":"2019-04-12T14:14:19.315Z","1.20.0":"2019-04-16T14:03:07.191Z","1.21.0":"2019-04-16T16:42:19.571Z","1.21.1":"2019-04-25T03:52:06.098Z","1.22.0":"2019-05-01T22:42:12.152Z","1.23.0":"2019-05-01T23:10:51.399Z","1.23.1":"2019-05-09T18:45:36.040Z","1.23.2":"2019-05-22T14:39:26.317Z","1.23.3":"2019-06-03T02:45:45.884Z","1.23.4":"2019-06-03T02:53:37.038Z","1.23.5":"2019-06-05T14:19:18.350Z","1.23.6":"2019-06-10T01:28:07.060Z","1.23.7":"2019-06-10T01:40:04.771Z","1.23.8":"2019-06-11T01:42:43.516Z","1.23.9":"2019-06-11T05:18:00.998Z","1.23.10":"2019-06-12T17:34:57.364Z","1.24.0":"2019-06-12T19:56:55.614Z","1.24.1":"2019-06-16T16:52:18.777Z","1.24.2":"2019-06-16T20:46:39.896Z","1.24.3":"2019-06-16T20:47:38.760Z","1.25.0":"2019-06-16T20:48:55.646Z","1.26.0":"2019-06-17T00:05:50.535Z","1.27.0":"2019-06-17T00:34:11.003Z","1.27.1":"2019-06-17T02:53:56.510Z","1.28.0":"2019-06-19T05:02:34.790Z","1.28.1":"2019-06-20T05:33:15.202Z","1.29.0":"2019-06-22T17:12:56.383Z","1.30.0":"2019-06-23T01:59:53.406Z","1.31.0":"2019-06-23T07:01:36.266Z","1.32.0":"2019-06-23T07:50:22.724Z","1.32.1":"2019-06-23T15:40:15.448Z","1.32.2":"2019-06-23T15:56:05.570Z","1.32.3":"2019-06-23T20:33:06.893Z","1.32.4":"2019-06-23T20:51:43.940Z","1.32.5":"2019-06-24T00:00:17.840Z","1.32.6":"2019-06-25T01:34:37.485Z","1.32.7":"2019-06-25T01:42:00.856Z","1.32.8":"2019-06-25T01:47:13.119Z","1.32.9":"2019-06-25T02:11:25.646Z","1.32.10":"2019-06-26T00:44:58.959Z","1.32.11":"2019-06-26T00:58:41.458Z","1.32.12":"2019-06-28T04:52:41.535Z","1.32.13":"2019-06-30T15:57:36.846Z","1.32.14":"2019-06-30T21:36:11.957Z","1.32.15":"2019-07-01T03:46:28.174Z","1.32.16":"2019-07-01T04:24:50.347Z","1.33.0":"2019-07-02T01:41:43.245Z","1.33.1":"2019-07-02T05:30:55.668Z","1.34.0":"2019-07-03T22:58:33.120Z","1.34.1":"2019-07-05T05:39:35.056Z","1.34.2":"2019-07-05T06:09:09.644Z","1.35.0":"2019-07-05T07:12:13.020Z","1.36.0":"2019-07-27T18:19:52.018Z","1.36.1":"2019-07-29T04:26:32.154Z","1.36.2":"2019-07-29T04:54:42.064Z","1.36.3":"2019-07-29T05:14:45.895Z","1.36.4":"2019-07-29T05:58:27.072Z","1.37.0":"2019-07-30T02:24:33.259Z","1.37.1":"2019-07-30T02:43:14.846Z","1.37.2":"2019-07-30T02:48:29.422Z","1.37.3":"2019-07-30T03:39:30.254Z","1.38.0":"2019-07-31T03:51:13.303Z","1.39.0":"2019-08-07T05:53:04.809Z","1.39.1":"2019-08-14T00:53:15.797Z","1.39.2":"2019-08-14T01:45:41.594Z","1.40.0":"2019-08-14T16:11:19.723Z","1.40.1":"2019-08-21T04:40:22.599Z","1.40.2":"2019-08-21T06:12:59.772Z","1.41.0":"2019-09-04T02:25:24.060Z","1.42.0":"2019-09-05T01:52:18.554Z","1.42.1":"2019-09-12T00:11:10.066Z","1.42.2":"2019-09-12T05:06:41.640Z","1.42.3":"2019-09-13T03:34:54.244Z","1.42.4":"2019-09-14T21:24:34.849Z","1.43.0":"2019-09-23T19:29:23.531Z","1.43.1":"2019-10-06T19:07:47.447Z","1.44.0":"2019-10-30T03:46:39.560Z","1.45.0":"2019-10-31T03:25:07.784Z","1.45.1":"2019-10-31T03:51:16.255Z","1.46.0":"2019-10-31T04:30:11.647Z","1.47.0-beta.1":"2019-11-09T21:06:37.332Z","1.47.0-beta.2":"2019-11-14T04:16:31.598Z","1.47.0-alpha.1":"2019-11-14T04:32:20.060Z","1.47.0-alpha.2":"2019-11-14T04:38:43.720Z","2.0.0-beta.1":"2019-11-14T04:43:33.424Z","2.0.0-beta.2":"2019-11-14T05:57:24.431Z","2.0.0-beta.3":"2019-11-16T20:09:51.863Z","1.47.0":"2019-11-16T20:17:26.870Z","2.0.0-beta.4":"2019-11-17T00:36:05.597Z","1.47.1":"2019-11-17T00:39:18.618Z","2.0.0-beta.5":"2019-11-17T00:45:04.121Z","1.48.0":"2019-11-17T01:53:53.372Z","1.48.1":"2019-11-17T02:41:36.774Z","2.0.0-beta.6":"2019-11-17T02:42:24.826Z","2.0.0-beta.7":"2019-11-21T01:42:15.740Z","1.49.0":"2019-11-21T04:58:16.979Z","2.0.0-beta.8":"2019-11-21T05:19:14.503Z","2.0.0-beta.9":"2019-11-21T21:59:55.190Z","1.49.1":"2019-11-23T07:19:18.741Z","1.49.2":"2019-11-24T23:20:11.414Z","1.49.3":"2019-11-25T05:38:34.310Z","1.49.4":"2019-11-25T05:41:26.795Z","2.0.0-beta.10":"2019-11-25T05:45:30.568Z","1.50.0":"2019-11-29T06:27:03.114Z","1.50.1":"2019-11-29T07:15:37.887Z","1.50.2":"2019-11-29T07:44:48.647Z","2.0.0-beta.11":"2019-12-05T06:27:44.196Z","2.0.0-beta.12":"2019-12-08T06:49:02.565Z","1.50.3":"2019-12-08T17:30:52.047Z","2.0.0-beta.13":"2019-12-12T03:14:08.162Z","1.51.0":"2019-12-18T04:40:19.995Z","2.0.0-beta.14":"2019-12-19T05:04:42.444Z","2.0.0-beta.15":"2019-12-19T05:40:37.807Z","2.0.0-beta.16":"2019-12-20T17:36:45.157Z","1.51.1":"2020-01-20T23:48:06.313Z","2.0.0":"2020-03-16T02:33:03.043Z","2.1.0":"2020-03-19T03:47:24.912Z","2.1.1":"2020-03-21T15:58:53.049Z","2.1.2":"2020-03-24T01:29:21.774Z","2.1.3":"2020-03-24T02:36:56.051Z","2.1.4":"2020-03-25T03:20:57.994Z","2.1.5":"2020-03-25T03:31:23.071Z","2.1.6":"2020-03-26T01:07:39.466Z","2.1.7":"2020-04-03T14:42:59.535Z","2.1.8":"2020-04-05T14:15:53.386Z","2.2.0":"2020-04-05T14:44:54.080Z","2.3.0":"2020-04-05T16:22:14.447Z","2.4.0":"2020-04-05T20:50:11.278Z","2.4.1":"2020-04-05T21:04:49.204Z","2.5.0":"2020-04-05T21:55:05.376Z","2.6.0":"2020-04-08T01:34:01.381Z","2.7.0":"2020-04-18T15:06:42.376Z","2.8.0":"2020-04-20T01:08:11.667Z","2.9.0":"2020-04-20T01:12:18.141Z","2.9.1":"2020-04-26T03:08:45.755Z","2.9.2":"2020-05-12T00:01:39.227Z","2.10.0":"2020-08-11T03:53:27.199Z","2.11.0":"2020-08-22T19:45:28.369Z","2.12.0":"2020-08-22T20:15:10.750Z","2.12.1":"2020-08-22T20:38:58.712Z","2.12.2":"2020-08-22T20:53:33.181Z","2.12.3":"2020-08-22T21:18:14.228Z","2.13.0":"2020-08-23T02:00:39.005Z","2.14.0":"2020-08-24T04:07:37.667Z","2.15.0":"2020-08-25T04:24:23.823Z","2.15.1":"2020-08-26T01:09:20.075Z","2.15.2":"2020-08-26T02:40:52.294Z","2.15.3":"2020-08-26T03:18:51.415Z","2.16.0":"2020-08-27T02:19:56.305Z","2.17.0":"2020-08-29T02:26:15.256Z","2.18.0":"2020-08-31T04:59:48.257Z","3.0.0-beta.1":"2020-09-02T04:36:59.048Z","3.0.0-beta.2":"2020-09-03T01:59:45.166Z","3.0.0-beta.3":"2020-09-06T05:31:04.451Z","2.18.1":"2020-09-09T18:08:00.890Z","2.19.0":"2020-09-11T05:00:24.468Z","3.0.0-beta.4":"2020-09-12T01:52:25.900Z","3.0.0-beta.5":"2020-09-28T01:15:23.873Z","3.0.0-beta.6":"2020-10-13T05:08:41.188Z","2.20.0":"2021-02-24T05:12:59.094Z","3.0.0-beta.7":"2021-04-26T16:44:55.600Z","2.20.1":"2021-04-26T16:45:24.779Z","3.0.0-beta.8":"2021-04-26T17:33:20.304Z","2.21.0":"2021-04-26T17:41:18.559Z","3.0.0-beta.9":"2021-04-27T04:58:22.500Z","3.0.0-beta.10":"2021-05-03T02:16:14.959Z","3.0.0-beta.11":"2021-05-11T04:24:14.064Z","3.0.0-beta.12":"2021-05-28T20:11:51.274Z","3.0.0-beta.13":"2021-05-30T03:36:19.247Z","3.0.0-beta.14":"2021-05-30T03:53:11.252Z","3.0.0-beta.15":"2021-05-30T04:12:36.542Z","2.21.1":"2021-06-15T04:32:41.113Z","2.21.2":"2021-06-15T04:38:19.683Z","3.0.0-beta.16":"2021-09-13T04:33:53.070Z","3.0.0-beta.17":"2021-09-15T02:45:17.141Z","3.0.0-beta.18":"2021-09-19T01:15:39.529Z","3.0.0-beta.19":"2021-09-19T03:56:00.086Z","3.0.0-beta.20":"2021-09-19T04:01:24.426Z","3.0.0-beta.21":"2021-09-19T17:47:15.608Z","3.0.0-beta.22":"2021-09-20T02:55:45.306Z","3.0.0-beta.23":"2021-09-29T04:47:48.723Z","3.0.0-beta.24":"2021-09-29T06:22:48.126Z","3.0.0-beta.25":"2022-01-01T19:45:51.827Z","3.0.0-beta.26":"2022-01-01T19:51:36.780Z","3.0.0-beta.27":"2022-01-16T20:32:19.741Z"},"maintainers":[{"name":"goldcaddy77","email":"goldcaddy77@gmail.com"}],"description":"Opinionated set of tools for setting up GraphQL backed by TypeORM","homepage":"https://github.com/goldcaddy77/warthog#readme","keywords":["graphql","typeorm","typescript"],"repository":{"type":"git","url":"git+https://github.com/goldcaddy77/warthog.git"},"author":{"name":"Dan Caddigan","url":"https://github.com/goldcaddy77"},"bugs":{"url":"https://github.com/goldcaddy77/warthog/issues"},"license":"MIT","readme":"","readmeFilename":""}