diff --git a/package-lock.json b/package-lock.json index b56e3919d9..d416207ea4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -87,6 +87,15 @@ "to-fast-properties": "^2.0.0" } }, + "@endemolshinegroup/cosmiconfig-typescript-loader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@endemolshinegroup/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.0.tgz", + "integrity": "sha512-qMbu0alhP2VmxYhO9rwJDAEDhBIa2lN+aRxRTBbvvk1sxuzAj3RZNuvtlKkM8CPBlE9PBAjCV3l5opXP1wPIZw==", + "requires": { + "lodash.get": "^4", + "ts-node": "^7" + } + }, "@fancy-test/nock": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@fancy-test/nock/-/nock-0.1.1.tgz", @@ -1190,6 +1199,15 @@ "integrity": "sha512-HI1tSO87vmd1sPS3DOVSK4gvVKROvCBFvAnXlLiQtAus/+1xXMQcNyu9TX2ChwRXFeQZeB9+f+nMo99xLd5DdA==", "dev": true }, + "@types/cosmiconfig": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/cosmiconfig/-/cosmiconfig-5.0.3.tgz", + "integrity": "sha512-HgTGG7X5y9pLl3pixeo2XtDEFD8rq2EuH+S4mK6teCnAwWMucQl6v1D43hI4Uw1VJh6nu59lxLkqXHRl4uwThA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/events": { "version": "1.2.0", "resolved": "http://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", @@ -1903,6 +1921,24 @@ "rimraf": "^2.6.2" } }, + "apollo-cache": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/apollo-cache/-/apollo-cache-1.1.20.tgz", + "integrity": "sha512-+Du0/4kUSuf5PjPx0+pvgMGV12ezbHA8/hubYuqRQoy/4AWb4faa61CgJNI6cKz2mhDd9m94VTNKTX11NntwkQ==", + "requires": { + "apollo-utilities": "^1.0.25" + } + }, + "apollo-cache-inmemory": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/apollo-cache-inmemory/-/apollo-cache-inmemory-1.3.8.tgz", + "integrity": "sha512-bT1v8+kKgM9u8NvCODOZ2qKxdufsmBaUsnLp7s5+kv0Zq5u/Bw4Ltb3DxrYFQoqZYrKJKy1iMJE3MV2J/Dthjg==", + "requires": { + "apollo-cache": "^1.1.20", + "apollo-utilities": "^1.0.25", + "optimism": "^0.6.6" + } + }, "apollo-codegen-core": { "version": "file:packages/apollo-codegen-core", "requires": { @@ -1961,6 +1997,59 @@ "apollo-codegen-core": "file:packages/apollo-codegen-core" } }, + "apollo-datasource": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.1.3.tgz", + "integrity": "sha512-yEGEe5Cjzqqu5ml1VV3O8+C+thzdknZri9Ny0P3daTGNO+45J3vBOMcmaANeeI2+OOeWxdqUNa5aPOx/35kniw==", + "requires": { + "apollo-server-caching": "0.1.2", + "apollo-server-env": "2.0.3" + }, + "dependencies": { + "apollo-server-env": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.0.3.tgz", + "integrity": "sha512-uIfKFH8n8xKO0eLb9Fa79+s2DdMuVethgznvW6SrOYq5VzgkIIobqKEuZPKa5wObw9CkCyju/+Sr7b7WWMFxUQ==", + "requires": { + "node-fetch": "^2.1.2", + "util.promisify": "^1.0.0" + } + } + } + }, + "apollo-datasource-graphql": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/apollo-datasource-graphql/-/apollo-datasource-graphql-1.2.0.tgz", + "integrity": "sha512-t+eqSENfdVkwdZYf0JNLTwLUKT3cxum3GmCKhJrwYAUVBYBm2QgfaVwUcoVNcfoJVLjmBkH6ZXqHU29PcSigJA==", + "requires": { + "apollo-cache-inmemory": "^1.2.5", + "apollo-datasource": "^0.1.3", + "apollo-link": "^1.2.2", + "apollo-link-context": "^1.0.8", + "apollo-link-error": "^1.1.0", + "apollo-link-http": "^1.5.4", + "apollo-server-errors": "^2.0.0-rc.1", + "await-to-js": "^2.0.1", + "graphql": "^0.13.2", + "isomorphic-fetch": "^2.2.1", + "typescript": "^2.9.2" + }, + "dependencies": { + "graphql": { + "version": "0.13.2", + "resolved": "http://registry.npmjs.org/graphql/-/graphql-0.13.2.tgz", + "integrity": "sha512-QZ5BL8ZO/B20VA8APauGBg3GyEgZ19eduvpLWoq5x7gMmWnHoy8rlQWPLmWgFvo1yNgjSEFMesmS4R6pPr7xog==", + "requires": { + "iterall": "^1.2.1" + } + }, + "typescript": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", + "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==" + } + } + }, "apollo-engine-reporting": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/apollo-engine-reporting/-/apollo-engine-reporting-0.0.2.tgz", @@ -1985,11 +2074,14 @@ "version": "file:packages/apollo-language-server", "requires": { "@apollographql/graphql-language-service-interface": "1.3.2", + "@endemolshinegroup/cosmiconfig-typescript-loader": "^1.0.0", "apollo": "file:packages/apollo", + "apollo-datasource-graphql": "^1.2.0", "apollo-link": "^1.2.2", "apollo-link-http": "^1.5.4", "apollo-link-ws": "^1.0.8", "core-js": "^2.5.7", + "cosmiconfig": "^5.0.6", "glob": "^7.1.2", "graphql": "^14.0.2", "graphql-tag": "^2.9.2", @@ -2012,6 +2104,22 @@ "zen-observable-ts": "^0.8.10" } }, + "apollo-link-context": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/apollo-link-context/-/apollo-link-context-1.0.9.tgz", + "integrity": "sha512-gcC1WH7mTyNtS0bF4fPijepXqnERwZjm1JCkuOT6ADBTpDTXIqK+Ec+/QkVawDO26EV9OX5ujWe4kI1qC6T6tA==", + "requires": { + "apollo-link": "^1.2.3" + } + }, + "apollo-link-error": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/apollo-link-error/-/apollo-link-error-1.1.1.tgz", + "integrity": "sha512-/yPcaQWcBdB94vpJ4FsiCJt1dAGGRm+6Tsj3wKwP+72taBH+UsGRQQZk7U/1cpZwl1yqhHZn+ZNhVOebpPcIlA==", + "requires": { + "apollo-link": "^1.2.3" + } + }, "apollo-link-http": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/apollo-link-http/-/apollo-link-http-1.5.5.tgz", @@ -2037,6 +2145,14 @@ "apollo-link": "^1.2.3" } }, + "apollo-server-caching": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.1.2.tgz", + "integrity": "sha512-jBRnsTgXN0m8yVpumoelaUq9mXR7YpJ3EE+y/alI7zgXY+0qFDqksRApU8dEfg3q6qUnO7rFxRhdG5eyc0+1ig==", + "requires": { + "lru-cache": "^4.1.3" + } + }, "apollo-server-env": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.0.2.tgz", @@ -2046,6 +2162,11 @@ "util.promisify": "^1.0.0" } }, + "apollo-server-errors": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-2.0.2.tgz", + "integrity": "sha512-zyWDqAVDCkj9espVsoUpZr9PwDznM8UW6fBfhV+i1br//s2AQb07N6ektZ9pRIEvkhykDZW+8tQbDwAO0vUROg==" + }, "apollo-utilities": { "version": "1.0.25", "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.0.25.tgz", @@ -2284,6 +2405,11 @@ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, + "await-to-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/await-to-js/-/await-to-js-2.0.1.tgz", + "integrity": "sha512-zJIZ/G2/sghdDWRMFO2R1Qn4RBPl/OEIe2Cfiz/VXfQS0lmyZwrq4Wmxai4KpvtnsijIadzttwjaSfg1s3CcLQ==" + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -8241,6 +8367,11 @@ "minimatch": "^3.0.4" } }, + "immutable-tuple": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/immutable-tuple/-/immutable-tuple-0.4.9.tgz", + "integrity": "sha512-LWbJPZnidF8eczu7XmcnLBsumuyRBkpwIRPCZxlojouhBo5jEBO4toj6n7hMy6IxHU/c+MqDSWkvaTpPlMQcyA==" + }, "import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", @@ -10354,6 +10485,11 @@ "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=" }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, "lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", @@ -10512,8 +10648,7 @@ "make-error": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", - "dev": true + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==" }, "make-fetch-happen": { "version": "4.0.1", @@ -11507,6 +11642,14 @@ "object-assign": "^4.0.1" } }, + "optimism": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.6.8.tgz", + "integrity": "sha512-bN5n1KCxSqwBDnmgDnzMtQTHdL+uea2HYFx1smvtE+w2AMl0Uy31g0aXnP/Nt85OINnMJPRpJyfRQLTCqn5Weg==", + "requires": { + "immutable-tuple": "^0.4.9" + } + }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", @@ -14613,7 +14756,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", - "dev": true, "requires": { "arrify": "^1.0.0", "buffer-from": "^1.1.0", @@ -14628,8 +14770,7 @@ "minimist": { "version": "1.2.0", "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, @@ -15982,8 +16123,7 @@ "yn": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", - "dev": true + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=" }, "zen-observable": { "version": "0.8.11", diff --git a/package.json b/package.json index 5f1e6cd07e..978eda0739 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "@types/babel__generator": "^7.0.0", "@types/chai": "^4.1.4", "@types/common-tags": "^1.4.0", + "@types/cosmiconfig": "^5.0.3", "@types/graphql": "^14.0.2", "@types/inflected": "^1.1.29", "@types/jest": "^23.3.1", diff --git a/packages/apollo-language-server/package-lock.json b/packages/apollo-language-server/package-lock.json new file mode 100644 index 0000000000..dfe27ed078 --- /dev/null +++ b/packages/apollo-language-server/package-lock.json @@ -0,0 +1,545 @@ +{ + "name": "apollo-language-server", + "version": "0.1.11-register.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@endemolshinegroup/cosmiconfig-typescript-loader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@endemolshinegroup/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.0.tgz", + "integrity": "sha512-qMbu0alhP2VmxYhO9rwJDAEDhBIa2lN+aRxRTBbvvk1sxuzAj3RZNuvtlKkM8CPBlE9PBAjCV3l5opXP1wPIZw==", + "requires": { + "lodash.get": "^4", + "ts-node": "^7" + } + }, + "apollo-cache": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/apollo-cache/-/apollo-cache-1.1.20.tgz", + "integrity": "sha512-+Du0/4kUSuf5PjPx0+pvgMGV12ezbHA8/hubYuqRQoy/4AWb4faa61CgJNI6cKz2mhDd9m94VTNKTX11NntwkQ==", + "requires": { + "apollo-utilities": "^1.0.25" + } + }, + "apollo-cache-inmemory": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/apollo-cache-inmemory/-/apollo-cache-inmemory-1.3.8.tgz", + "integrity": "sha512-bT1v8+kKgM9u8NvCODOZ2qKxdufsmBaUsnLp7s5+kv0Zq5u/Bw4Ltb3DxrYFQoqZYrKJKy1iMJE3MV2J/Dthjg==", + "requires": { + "apollo-cache": "^1.1.20", + "apollo-utilities": "^1.0.25", + "optimism": "^0.6.6" + } + }, + "apollo-datasource": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.1.3.tgz", + "integrity": "sha512-yEGEe5Cjzqqu5ml1VV3O8+C+thzdknZri9Ny0P3daTGNO+45J3vBOMcmaANeeI2+OOeWxdqUNa5aPOx/35kniw==", + "requires": { + "apollo-server-caching": "0.1.2", + "apollo-server-env": "2.0.3" + } + }, + "apollo-datasource-graphql": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/apollo-datasource-graphql/-/apollo-datasource-graphql-1.2.0.tgz", + "integrity": "sha512-t+eqSENfdVkwdZYf0JNLTwLUKT3cxum3GmCKhJrwYAUVBYBm2QgfaVwUcoVNcfoJVLjmBkH6ZXqHU29PcSigJA==", + "requires": { + "apollo-cache-inmemory": "^1.2.5", + "apollo-datasource": "^0.1.3", + "apollo-link": "^1.2.2", + "apollo-link-context": "^1.0.8", + "apollo-link-error": "^1.1.0", + "apollo-link-http": "^1.5.4", + "apollo-server-errors": "^2.0.0-rc.1", + "await-to-js": "^2.0.1", + "graphql": "^0.13.2", + "isomorphic-fetch": "^2.2.1", + "typescript": "^2.9.2" + }, + "dependencies": { + "apollo-link": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.3.tgz", + "integrity": "sha512-iL9yS2OfxYhigme5bpTbmRyC+Htt6tyo2fRMHT3K1XRL/C5IQDDz37OjpPy4ndx7WInSvfSZaaOTKFja9VWqSw==", + "requires": { + "apollo-utilities": "^1.0.0", + "zen-observable-ts": "^0.8.10" + } + }, + "apollo-link-http": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/apollo-link-http/-/apollo-link-http-1.5.5.tgz", + "integrity": "sha512-C5N6N/mRwmepvtzO27dgMEU3MMtRKSqcljBkYNZmWwH11BxkUQ5imBLPM3V4QJXNE7NFuAQAB5PeUd4ligivTQ==", + "requires": { + "apollo-link": "^1.2.3", + "apollo-link-http-common": "^0.2.5" + } + }, + "graphql": { + "version": "0.13.2", + "resolved": "http://registry.npmjs.org/graphql/-/graphql-0.13.2.tgz", + "integrity": "sha512-QZ5BL8ZO/B20VA8APauGBg3GyEgZ19eduvpLWoq5x7gMmWnHoy8rlQWPLmWgFvo1yNgjSEFMesmS4R6pPr7xog==", + "requires": { + "iterall": "^1.2.1" + } + } + } + }, + "apollo-link-context": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/apollo-link-context/-/apollo-link-context-1.0.9.tgz", + "integrity": "sha512-gcC1WH7mTyNtS0bF4fPijepXqnERwZjm1JCkuOT6ADBTpDTXIqK+Ec+/QkVawDO26EV9OX5ujWe4kI1qC6T6tA==", + "requires": { + "apollo-link": "^1.2.3" + }, + "dependencies": { + "apollo-link": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.3.tgz", + "integrity": "sha512-iL9yS2OfxYhigme5bpTbmRyC+Htt6tyo2fRMHT3K1XRL/C5IQDDz37OjpPy4ndx7WInSvfSZaaOTKFja9VWqSw==", + "requires": { + "apollo-utilities": "^1.0.0", + "zen-observable-ts": "^0.8.10" + } + } + } + }, + "apollo-link-error": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/apollo-link-error/-/apollo-link-error-1.1.1.tgz", + "integrity": "sha512-/yPcaQWcBdB94vpJ4FsiCJt1dAGGRm+6Tsj3wKwP+72taBH+UsGRQQZk7U/1cpZwl1yqhHZn+ZNhVOebpPcIlA==", + "requires": { + "apollo-link": "^1.2.3" + }, + "dependencies": { + "apollo-link": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.3.tgz", + "integrity": "sha512-iL9yS2OfxYhigme5bpTbmRyC+Htt6tyo2fRMHT3K1XRL/C5IQDDz37OjpPy4ndx7WInSvfSZaaOTKFja9VWqSw==", + "requires": { + "apollo-utilities": "^1.0.0", + "zen-observable-ts": "^0.8.10" + } + } + } + }, + "apollo-link-http-common": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/apollo-link-http-common/-/apollo-link-http-common-0.2.5.tgz", + "integrity": "sha512-6FV1wr5AqAyJ64Em1dq5hhGgiyxZE383VJQmhIoDVc3MyNcFL92TkhxREOs4rnH2a9X2iJMko7nodHSGLC6d8w==", + "requires": { + "apollo-link": "^1.2.3" + }, + "dependencies": { + "apollo-link": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.3.tgz", + "integrity": "sha512-iL9yS2OfxYhigme5bpTbmRyC+Htt6tyo2fRMHT3K1XRL/C5IQDDz37OjpPy4ndx7WInSvfSZaaOTKFja9VWqSw==", + "requires": { + "apollo-utilities": "^1.0.0", + "zen-observable-ts": "^0.8.10" + } + } + } + }, + "apollo-server-caching": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.1.2.tgz", + "integrity": "sha512-jBRnsTgXN0m8yVpumoelaUq9mXR7YpJ3EE+y/alI7zgXY+0qFDqksRApU8dEfg3q6qUnO7rFxRhdG5eyc0+1ig==", + "requires": { + "lru-cache": "^4.1.3" + } + }, + "apollo-server-env": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.0.3.tgz", + "integrity": "sha512-uIfKFH8n8xKO0eLb9Fa79+s2DdMuVethgznvW6SrOYq5VzgkIIobqKEuZPKa5wObw9CkCyju/+Sr7b7WWMFxUQ==", + "requires": { + "node-fetch": "^2.1.2", + "util.promisify": "^1.0.0" + }, + "dependencies": { + "node-fetch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.2.0.tgz", + "integrity": "sha512-OayFWziIxiHY8bCUyLX6sTpDH8Jsbp4FfYd1j1f7vZyfgkcOnAyM4oQR16f8a0s7Gl/viMGRey8eScYk4V4EZA==" + } + } + }, + "apollo-server-errors": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-2.0.2.tgz", + "integrity": "sha512-zyWDqAVDCkj9espVsoUpZr9PwDznM8UW6fBfhV+i1br//s2AQb07N6ektZ9pRIEvkhykDZW+8tQbDwAO0vUROg==" + }, + "apollo-utilities": { + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.0.25.tgz", + "integrity": "sha512-AXvqkhni3Ir1ffm4SA1QzXn8k8I5BBl4PVKEyak734i4jFdp+xgfUyi2VCqF64TJlFTA/B73TRDUvO2D+tKtZg==", + "requires": { + "fast-json-stable-stringify": "^2.0.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "await-to-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/await-to-js/-/await-to-js-2.0.1.tgz", + "integrity": "sha512-zJIZ/G2/sghdDWRMFO2R1Qn4RBPl/OEIe2Cfiz/VXfQS0lmyZwrq4Wmxai4KpvtnsijIadzttwjaSfg1s3CcLQ==" + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "cosmiconfig": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.6.tgz", + "integrity": "sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ==", + "requires": { + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "immutable-tuple": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/immutable-tuple/-/immutable-tuple-0.4.9.tgz", + "integrity": "sha512-LWbJPZnidF8eczu7XmcnLBsumuyRBkpwIRPCZxlojouhBo5jEBO4toj6n7hMy6IxHU/c+MqDSWkvaTpPlMQcyA==" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "requires": { + "has": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "requires": { + "has-symbols": "^1.0.0" + } + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + }, + "dependencies": { + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + } + } + }, + "iterall": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.2.2.tgz", + "integrity": "sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA==" + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==" + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==" + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "optimism": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.6.8.tgz", + "integrity": "sha512-bN5n1KCxSqwBDnmgDnzMtQTHdL+uea2HYFx1smvtE+w2AMl0Uy31g0aXnP/Nt85OINnMJPRpJyfRQLTCqn5Weg==", + "requires": { + "immutable-tuple": "^0.4.9" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-support": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "requires": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + } + }, + "typescript": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", + "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==" + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "whatwg-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=" + }, + "zen-observable": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.11.tgz", + "integrity": "sha512-N3xXQVr4L61rZvGMpWe8XoCGX8vhU35dPyQ4fm5CY/KDlG0F75un14hjbckPXTDuKUY6V0dqR2giT6xN8Y4GEQ==" + }, + "zen-observable-ts": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.10.tgz", + "integrity": "sha512-5vqMtRggU/2GhePC9OU4sYEWOdvmayp2k3gjPf4F0mXwB3CSbbNznfDUvDJx9O2ZTa1EIXdJhPchQveFKwNXPQ==", + "requires": { + "zen-observable": "^0.8.0" + } + } + } +} diff --git a/packages/apollo-language-server/package.json b/packages/apollo-language-server/package.json index 599ce88248..9f6b89d817 100644 --- a/packages/apollo-language-server/package.json +++ b/packages/apollo-language-server/package.json @@ -21,11 +21,14 @@ }, "dependencies": { "@apollographql/graphql-language-service-interface": "1.3.2", + "@endemolshinegroup/cosmiconfig-typescript-loader": "^1.0.0", "apollo": "file:../apollo", + "apollo-datasource-graphql": "^1.2.0", "apollo-link": "^1.2.2", "apollo-link-http": "^1.5.4", "apollo-link-ws": "^1.0.8", "core-js": "^2.5.7", + "cosmiconfig": "^5.0.6", "glob": "^7.1.2", "graphql": "^14.0.2", "graphql-tag": "^2.9.2", diff --git a/packages/apollo-language-server/src/config.ts b/packages/apollo-language-server/src/config.ts new file mode 100644 index 0000000000..c3c9ae2e54 --- /dev/null +++ b/packages/apollo-language-server/src/config.ts @@ -0,0 +1,199 @@ +import * as cosmiconfig from "cosmiconfig"; +import { LoaderEntry } from "cosmiconfig"; +import TypeScriptLoader from "@endemolshinegroup/cosmiconfig-typescript-loader"; +import { defaultsDeep } from "lodash/fp"; + +// TypeScript util requiring an optional field +export type RequireProperty = T & + { [key in Prop]-?: T[key] }; + +export type EngineServiceID = string; +export type EngineClientID = string; +export type EngineTagName = string; +export type EngineServiceTuple = [EngineServiceID, EngineTagName?]; +export type EngineServiceSpecififer = string; +export type EngineStatsWindowSize = number; + +export interface EngineStatsWindow { + to: number; + from: number; +} + +export const DefaultEngineStatsWindow = { + to: -0, + from: -86400 // one day +}; + +export interface HistoricalEngineStatsWindow extends EngineStatsWindow {} + +export type EndpointURI = string; +export interface RemoteServiceConfig { + name: EngineServiceID; + endpoint: EndpointURI; + headers?: { [key: string]: string }; +} + +export interface EngineConfig { + endpoint?: EndpointURI; + frontend?: EndpointURI; +} + +export const DefaultEngineConfig = { + endpoint: "https://engine-graphql.apollographql.com/api/graphql", + frontend: "https://engine.apollographql.com" +}; + +export const DefaultConfigBase = { + includes: ["**/*.(ts|js|graphql)"], + excludes: ["**/node_modules", "**/__tests__"] +}; + +export interface ConfigBase { + includes: string[]; + excludes: string[]; +} + +export interface ClientConfig extends ConfigBase { + // service linking + service: EngineServiceSpecififer | RemoteServiceConfig; + // client identity + name?: EngineClientID; + referenceId?: string; + // client schemas + clientOnlyDirectives?: string[]; + clientSchemaDirectives?: string[]; + + tagName?: string; + // stats window config + statsWindow: EngineStatsWindowSize; +} + +export const DefaultClientConfig = { + ...DefaultConfigBase, + tagName: "gql", + clientOnlyDirectives: ["@connection", "@type"], + clientSchemaDirectives: ["@client", "@rest"], + statsWindow: DefaultEngineStatsWindow +}; + +export interface ServiceConfig extends ConfigBase { + name: string; + endpoint?: EndpointURI; +} + +export const DefaultServiceConfig = { + ...DefaultConfigBase +}; + +export interface ClientConfigFormat { + client: ClientConfig; +} + +export interface ServiceConfigFormat { + service: ServiceConfig; +} +export interface ConfigBaseFormat { + client?: ClientConfig; + service?: ServiceConfig; + engine?: EngineConfig; +} + +export type ApolloConfigFormat = + | RequireProperty + | RequireProperty; + +// config settings +const MODULE_NAME = "apollo"; +const searchPlaces = [ + "package.json", + `${MODULE_NAME}.config.js`, + `${MODULE_NAME}.config.ts` +]; +const loaders = { + // XXX improve types for config + ".json": (cosmiconfig as any).loadJson as LoaderEntry, + ".js": (cosmiconfig as any).loadJs as LoaderEntry, + ".ts": { + async: TypeScriptLoader + } +}; + +export interface LoadConfigSettings { + // the current working directory to start looking for the config + // config loading only works on node so we default to + // process.cwd() + cwd: string; +} + +export type ConfigResult = { + config: Config; + filepath: string; + isEmpty?: boolean; +} | null; + +// XXX load .env files automatically +export const loadConfig = async ({ + cwd +}: LoadConfigSettings): Promise> => { + const explorer = cosmiconfig(MODULE_NAME, { + searchPlaces, + loaders + }); + + const loadedConfig = (await explorer.search(cwd)) as ConfigResult< + ApolloConfigFormat + >; + + if (!loadedConfig) return null; + let { config, filepath, isEmpty } = loadedConfig; + + if (isEmpty) { + throw new Error( + `Apollo config found at ${filepath} is empty. Please add either a client or service config` + ); + } + + // selectivly apply defaults when loading the config + if (config.client) + config = defaultsDeep(config, { client: DefaultClientConfig }); + if (config.service) + config = defaultsDeep(config, { service: DefaultServiceConfig }); + config = defaultsDeep(config, DefaultEngineConfig); + + return { config, filepath, isEmpty }; +}; + +// take a config with multiple project types and return +// an array of individual types +export const projectsFromConfig = ( + config: ApolloConfigFormat +): ApolloConfigFormat[] => { + const configs = []; + const { client, service, ...rest } = config; + if (client) configs.push({ client, ...rest }); + if (service) configs.push({ service, ...rest }); + return configs; +}; + +export const parseServiceSpecificer = ( + specifier: EngineServiceSpecififer +): EngineServiceTuple => { + const [id, tag] = specifier.split("@").map(x => x.trim()); + // typescript hinting + return [id, tag]; +}; + +export const getServiceName = (config: ApolloConfigFormat): string => { + if (config.service) return config.service.name; + if (typeof (config.client!.service as EngineServiceSpecififer) === "string") { + return parseServiceSpecificer(config.client! + .service as EngineServiceSpecififer)[0]; + } + + return (config.client!.service as RemoteServiceConfig).name; +}; + +export const selectProjectFromConfig = ({ + client, + service +}: ApolloConfigFormat): ClientConfig | ServiceConfig => client || service!; diff --git a/packages/apollo-language-server/src/engine.ts b/packages/apollo-language-server/src/engine/index.ts similarity index 100% rename from packages/apollo-language-server/src/engine.ts rename to packages/apollo-language-server/src/engine/index.ts diff --git a/packages/apollo-language-server/src/languageProvider.ts b/packages/apollo-language-server/src/languageProvider.ts index 51b2eb2125..1e638768d5 100644 --- a/packages/apollo-language-server/src/languageProvider.ts +++ b/packages/apollo-language-server/src/languageProvider.ts @@ -61,7 +61,7 @@ function convertToURI(filePath: string, project: GraphQLClientProject) { return filePath.startsWith("file:/") || filePath.startsWith("graphql-schema:/") ? filePath - : `file://${resolve(project.config.projectFolder, filePath)}`; + : `file://${resolve(project.rootPath, filePath)}`; } export class GraphQLLanguageProvider { diff --git a/packages/apollo-language-server/src/project.ts b/packages/apollo-language-server/src/project.ts index 9475f766d3..7824e9cb98 100644 --- a/packages/apollo-language-server/src/project.ts +++ b/packages/apollo-language-server/src/project.ts @@ -17,6 +17,14 @@ import { import { GraphQLDocument, extractGraphQLDocuments } from "./document"; +import { + ApolloConfigFormat, + getServiceName, + selectProjectFromConfig +} from "./config"; + +import { resolveSchema } from "apollo/lib/config"; + import Uri from "vscode-uri"; import { LoadingHandler } from "./loadingHandler"; import { FileSet } from "./fileSet"; diff --git a/packages/apollo-language-server/src/workspace.ts b/packages/apollo-language-server/src/workspace.ts index d74b402df0..c0580addd1 100644 --- a/packages/apollo-language-server/src/workspace.ts +++ b/packages/apollo-language-server/src/workspace.ts @@ -9,7 +9,7 @@ import { QuickPickItem } from "vscode"; import { GraphQLProject, DocumentUri } from "./project"; import { dirname } from "path"; import * as fg from "glob"; -import { findAndLoadConfig } from "apollo/lib/config"; +import { loadConfig, projectsFromConfig, ApolloConfigFormat } from "./config"; import { LoadingHandler } from "./loadingHandler"; import { ServiceID, SchemaTag } from "./engine"; import { GraphQLClientProject } from "./clientProject"; @@ -36,7 +36,8 @@ export class GraphQLWorkspace { } addProjectsInFolder(folder: WorkspaceFolder) { - const apolloConfigFiles: string[] = fg.sync("**/apollo.config.js", { + // load all possible workspace projects (contains possible config) + const apolloConfigFiles: string[] = fg.sync("**/apollo.config.(js|ts)", { cwd: Uri.parse(folder.uri).fsPath, absolute: true, ignore: "**/node_modules/**" @@ -50,48 +51,57 @@ export class GraphQLWorkspace { }) ); + // only have unique possible folders const apolloConfigFolders = new Set( apolloConfigFiles.map(f => dirname(f)) ); - const projectConfigs = Array.from(apolloConfigFolders).flatMap( - configFolder => { - return this.loadingHandler.handleSync( - `Loading Apollo Config in folder ${configFolder}`, - () => { - try { - return [findAndLoadConfig(configFolder, false, true)]; - } catch (e) { - console.error(e); - return []; - } + // go from possible folders to known array of configs + const projectConfigs = Array.from(apolloConfigFolders).map(configFolder => + this.loadingHandler.handle( + `Loading Apollo Config in folder ${configFolder}`, + (async () => { + try { + const config = await loadConfig({ cwd: configFolder }); + return config && config.config; + } catch (e) { + console.error(e); + return null; } - ); - } + })() + ) ); - const projects = projectConfigs.map(projectConfig => { - const project = new GraphQLClientProject( - projectConfig, - this.loadingHandler - ); - - project.onDiagnostics(params => { - this._onDiagnostics && this._onDiagnostics(params); - }); - - project.onDecorations(params => { - this._onDecorations && this._onDecorations(params); - }); - - project.onSchemaTags(params => { - this._onSchemaTags && this._onSchemaTags(params); - }); - - return project; - }); - - this.projectsByFolderUri.set(folder.uri, projects); + Promise.all(projectConfigs) + .then(configs => + configs.filter(Boolean).flatMap(projectConfig => { + // we create a GraphQLProject for each kind of project + return projectsFromConfig(projectConfig as ApolloConfigFormat).map( + config => { + const project = new GraphQLClientProject( + config, + this.loadingHandler, + folder.uri + ); + + project.onDiagnostics(params => { + this._onDiagnostics && this._onDiagnostics(params); + }); + + project.onDecorations(params => { + this._onDecorations && this._onDecorations(params); + }); + + project.onSchemaTags((tags: string[]) => { + this._onSchemaTags && this._onSchemaTags(tags); + }); + + return project; + } + ); + }) + ) + .then(projects => this.projectsByFolderUri.set(folder.uri, projects)); } updateSchemaTag(selection: QuickPickItem) {