diff --git a/config/helpers.ts b/config/helpers.ts index 1d650a850ec..2c881a98b0e 100644 --- a/config/helpers.ts +++ b/config/helpers.ts @@ -11,7 +11,7 @@ export function eachFile(dir: string, callback: ( ) => any) { const promises: Promise[] = []; - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { glob(`${dir}/**/*.js`, (error, files) => { if (error) return reject(error); diff --git a/examples/bundling/no-tree-shaking/rollup-ac3-no-react/package-lock.json b/examples/bundling/no-tree-shaking/rollup-ac3-no-react/package-lock.json index b866422e030..1a308303467 100644 --- a/examples/bundling/no-tree-shaking/rollup-ac3-no-react/package-lock.json +++ b/examples/bundling/no-tree-shaking/rollup-ac3-no-react/package-lock.json @@ -7,12 +7,13 @@ "@apollo/client": { "version": "file:../../../..", "requires": { - "@types/zen-observable": "^0.8.0", + "@wry/context": "^0.6.0", + "@wry/equality": "^0.4.0", "fast-json-stable-stringify": "^2.0.0", "hoist-non-react-statics": "^3.3.2", "prop-types": "^15.7.2", - "tslib": "^1.10.0", - "zen-observable": "^0.8.14" + "ts-invariant": "^0.4.4", + "tslib": "^1.10.0" }, "dependencies": { "@ardatan/aggregate-error": { diff --git a/examples/bundling/no-tree-shaking/rollup-ac3/package-lock.json b/examples/bundling/no-tree-shaking/rollup-ac3/package-lock.json index 77a9f22fcef..16548c12a6a 100644 --- a/examples/bundling/no-tree-shaking/rollup-ac3/package-lock.json +++ b/examples/bundling/no-tree-shaking/rollup-ac3/package-lock.json @@ -8,12 +8,13 @@ "version": "file:../../../..", "requires": { "@graphql-typed-document-node/core": "^3.0.0", - "@types/zen-observable": "^0.8.0", + "@wry/context": "^0.6.0", "fast-json-stable-stringify": "^2.0.0", "hoist-non-react-statics": "^3.3.2", + "optimism": "^0.15.0", "prop-types": "^15.7.2", - "tslib": "^1.10.0", - "zen-observable": "^0.8.14" + "ts-invariant": "^0.4.4", + "tslib": "^1.10.0" }, "dependencies": { "@babel/code-frame": { @@ -5129,11 +5130,22 @@ }, "react": { "version": "file:https:/registry.npmjs.org/react/-/react-16.12.0.tgz", - "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==" + "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } }, "react-dom": { "version": "file:https:/registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz", - "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==" + "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.18.0" + } }, "react-is": { "version": "16.13.0", @@ -7294,6 +7306,7 @@ }, "react": { "version": "file:../../../../node_modules/react", + "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -7337,6 +7350,7 @@ }, "react-dom": { "version": "file:../../../../node_modules/react-dom", + "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", diff --git a/examples/bundling/tree-shaking/rollup-ac3-no-react/package-lock.json b/examples/bundling/tree-shaking/rollup-ac3-no-react/package-lock.json index 05c609894a3..bfe2475617b 100644 --- a/examples/bundling/tree-shaking/rollup-ac3-no-react/package-lock.json +++ b/examples/bundling/tree-shaking/rollup-ac3-no-react/package-lock.json @@ -6,6 +6,16 @@ "dependencies": { "@apollo/client": { "version": "file:../../../../dist", + "requires": { + "@types/zen-observable": "^0.8.0", + "@wry/context": "^0.5.2", + "fast-json-stable-stringify": "^2.0.0", + "hoist-non-react-statics": "^3.3.2", + "optimism": "^0.13.0", + "ts-invariant": "^0.4.4", + "tslib": "^1.10.0", + "zen-observable": "^0.8.14" + }, "dependencies": { "@types/zen-observable": { "version": "0.8.0", diff --git a/examples/bundling/tree-shaking/rollup-ac3/package-lock.json b/examples/bundling/tree-shaking/rollup-ac3/package-lock.json index 322182777c4..8aeed54f56f 100644 --- a/examples/bundling/tree-shaking/rollup-ac3/package-lock.json +++ b/examples/bundling/tree-shaking/rollup-ac3/package-lock.json @@ -6,6 +6,16 @@ "dependencies": { "@apollo/client": { "version": "file:../../../../dist", + "requires": { + "@types/zen-observable": "^0.8.0", + "@wry/context": "^0.5.2", + "fast-json-stable-stringify": "^2.0.0", + "hoist-non-react-statics": "^3.3.2", + "optimism": "^0.13.0", + "ts-invariant": "^0.4.4", + "tslib": "^1.10.0", + "zen-observable": "^0.8.14" + }, "dependencies": { "@types/zen-observable": { "version": "0.8.0", @@ -1229,6 +1239,12 @@ }, "react": { "version": "file:../../../../node_modules/react", + "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + }, "dependencies": { "js-tokens": { "version": "4.0.0", @@ -1267,6 +1283,12 @@ }, "react-dom": { "version": "file:../../../../node_modules/react-dom", + "integrity": "sha512-YFT2rxO9hM70ewk9jq0y6sQk8cL02xm4+IzYBz75CQGlClQQ1Bxq0nhHF6OtSbit+AIahujJgb/CPRibFkMNJQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + }, "dependencies": { "js-tokens": { "version": "4.0.0", diff --git a/package-lock.json b/package-lock.json index aba6930ddbd..76be412bbbf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,37 @@ "ts-invariant": "^0.7.0", "tslib": "^1.10.0", "zen-observable": "^0.8.14" + }, + "dependencies": { + "symbol-observable": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz", + "integrity": "sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==", + "dev": true + }, + "ts-invariant": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.7.3.tgz", + "integrity": "sha512-UWDDeovyUTIMWj+45g5nhnl+8oo+GhxL5leTaHn5c8FkQWfh8v66gccLd2/YzVmV5hoQUjCEjhrXnQqVDJdvKA==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true + } + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, "@ardatan/aggregate-error": { @@ -4023,9 +4054,10 @@ "dev": true }, "@types/zen-observable": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.0.tgz", - "integrity": "sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg==" + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.2.tgz", + "integrity": "sha512-HrCIVMLjE1MOozVoD86622S7aunluLb2PJdPfb3nYiEtohm8mIB/vyv0Fd37AdeMFrTUQXEunw78YloMA3Qilg==", + "dev": true }, "@wry/context": { "version": "0.6.0", @@ -10894,12 +10926,18 @@ } }, "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.0.0.tgz", + "integrity": "sha512-I1V/ArAtGJg4kmCfms8fULm0SwYgEsAf2d5WPCBGzTYm2qTjO3Tx4EDFaGjbOox8CeEsC69jQK22mnmfyA26sw==", "requires": { - "tslib": "^1.9.0" + "tslib": "~2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + } } }, "safe-buffer": { @@ -11598,12 +11636,6 @@ "ws": "^5.2.0" }, "dependencies": { - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "dev": true - }, "ws": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", @@ -11635,9 +11667,10 @@ } }, "symbol-observable": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz", - "integrity": "sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true }, "symbol-tree": { "version": "3.2.4", @@ -11830,13 +11863,6 @@ "integrity": "sha512-UWDDeovyUTIMWj+45g5nhnl+8oo+GhxL5leTaHn5c8FkQWfh8v66gccLd2/YzVmV5hoQUjCEjhrXnQqVDJdvKA==", "requires": { "tslib": "^2.1.0" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } } }, "ts-jest": { @@ -11900,9 +11926,9 @@ } }, "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" }, "tunnel-agent": { "version": "0.6.0", @@ -11950,9 +11976,9 @@ } }, "typescript": { - "version": "3.9.9", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", - "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", + "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", "dev": true }, "ua-parser-js": { @@ -12154,6 +12180,14 @@ "dev": true, "requires": { "tslib": "^1.8.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, "walker": { @@ -12440,7 +12474,8 @@ "zen-observable": { "version": "0.8.15", "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", - "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" + "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==", + "dev": true } } } diff --git a/package.json b/package.json index 7775b3ef039..7a8ac9666a5 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,6 @@ }, "dependencies": { "@graphql-typed-document-node/core": "^3.0.0", - "@types/zen-observable": "^0.8.0", "@wry/context": "^0.6.0", "@wry/equality": "^0.4.0", "fast-json-stable-stringify": "^2.0.0", @@ -83,10 +82,9 @@ "hoist-non-react-statics": "^3.3.2", "optimism": "^0.15.0", "prop-types": "^15.7.2", - "symbol-observable": "^2.0.0", + "rxjs": "^7.0.0", "ts-invariant": "^0.7.0", - "tslib": "^1.10.0", - "zen-observable": "^0.8.14" + "tslib": "^2.2.0" }, "devDependencies": { "@babel/parser": "7.14.0", @@ -121,12 +119,11 @@ "rimraf": "3.0.2", "rollup": "1.31.1", "rollup-plugin-terser": "7.0.2", - "rxjs": "6.6.7", "subscriptions-transport-ws": "0.9.18", "terser": "5.7.0", "ts-jest": "26.5.5", "ts-node": "8.10.2", - "typescript": "3.9.9", + "typescript": "4.2.4", "wait-for-observables": "^1.0.3" }, "publishConfig": { diff --git a/src/__tests__/ApolloClient.ts b/src/__tests__/ApolloClient.ts index 5f195adcbec..485c02bac32 100644 --- a/src/__tests__/ApolloClient.ts +++ b/src/__tests__/ApolloClient.ts @@ -1,4 +1,5 @@ import gql from 'graphql-tag'; +import { of } from 'rxjs'; import { ApolloClient, @@ -1185,7 +1186,7 @@ describe('ApolloClient', () => { }, }; const link = new ApolloLink(() => { - return Observable.of({ data }); + return of({ data }); }); function newClient() { return new ApolloClient({ diff --git a/src/cache/inmemory/types.ts b/src/cache/inmemory/types.ts index 283f2871021..12b0e56d3ea 100644 --- a/src/cache/inmemory/types.ts +++ b/src/cache/inmemory/types.ts @@ -95,7 +95,7 @@ export type OptimisticStoreItem = { export type ReadQueryOptions = { store: NormalizedCache; query: DocumentNode; - variables?: Object; + variables?: object; previousResult?: any; rootId?: string; config?: ApolloReducerConfig; diff --git a/src/core/ObservableQuery.ts b/src/core/ObservableQuery.ts index f84dcbf9a88..f1598217616 100644 --- a/src/core/ObservableQuery.ts +++ b/src/core/ObservableQuery.ts @@ -61,9 +61,9 @@ export class ObservableQuery< private observers = new Set>>(); private subscriptions = new Set(); - private lastResult: ApolloQueryResult; - private lastResultSnapshot: ApolloQueryResult; - private lastError: ApolloError; + private lastResult?: ApolloQueryResult; + private lastResultSnapshot?: ApolloQueryResult; + private lastError?: ApolloError; private queryInfo: QueryInfo; constructor({ @@ -135,7 +135,7 @@ export class ObservableQuery< NetworkStatus.ready; const result: ApolloQueryResult = { - ...lastResult, + ...lastResult!, loading: isNetworkRequestInFlight(networkStatus), networkStatus, }; @@ -198,11 +198,11 @@ export class ObservableQuery< // Returns the last result that observer.next was called with. This is not the same as // getCurrentResult! If you're not sure which you need, then you probably need getCurrentResult. public getLastResult(): ApolloQueryResult { - return this.lastResult; + return this.lastResult!; } public getLastError(): ApolloError { - return this.lastError; + return this.lastError!; } public resetLastResults(): void { @@ -610,7 +610,7 @@ once, rather than every time you call fetchMore.`); // Since we don't get the current result on errors, only the error, we // must mirror the updates that occur in QueryStore.markQueryError here this.updateLastResult({ - ...this.lastResult, + ...this.lastResult!, error, errors: error.graphQLErrors, networkStatus: NetworkStatus.error, diff --git a/src/core/QueryInfo.ts b/src/core/QueryInfo.ts index f70cf25a42a..2a66bbaf7e6 100644 --- a/src/core/QueryInfo.ts +++ b/src/core/QueryInfo.ts @@ -236,8 +236,8 @@ export class QueryInfo { // Cancel the pending notify timeout this.reset(); - - this.cancel(); + + this.cancel!(); // Revert back to the no-op version of cancel inherited from // QueryInfo.prototype. delete this.cancel; @@ -251,7 +251,7 @@ export class QueryInfo { // This method is a no-op by default, until/unless overridden by the // updateWatch method. - private cancel() {} + private cancel?() {} private lastWatch?: Cache.WatchOptions; @@ -263,7 +263,7 @@ export class QueryInfo { if (!this.lastWatch || this.lastWatch.query !== this.document || !equal(variables, this.lastWatch.variables)) { - this.cancel(); + this.cancel!(); this.cancel = this.cache.watch(this.lastWatch = { query: this.document!, variables, diff --git a/src/core/QueryManager.ts b/src/core/QueryManager.ts index fbb3be58b80..38c3ab1f513 100644 --- a/src/core/QueryManager.ts +++ b/src/core/QueryManager.ts @@ -1,6 +1,8 @@ import { DocumentNode } from 'graphql'; import { invariant, InvariantError } from 'ts-invariant'; import { equal } from '@wry/equality'; +import { of } from 'rxjs'; +import { map } from 'rxjs/operators'; import { ApolloLink, execute, FetchResult } from '../link/core'; import { Cache, ApolloCache } from '../cache'; @@ -689,30 +691,32 @@ export class QueryManager { context, variables, false, - ).map(result => { - if (fetchPolicy !== 'no-cache') { - // the subscription interface should handle not sending us results we no longer subscribe to. - // XXX I don't think we ever send in an object with errors, but we might in the future... - if (shouldWriteResult(result, errorPolicy)) { - this.cache.write({ - query, - result: result.data, - dataId: 'ROOT_SUBSCRIPTION', - variables: variables, - }); - } + ).pipe( + map(result => { + if (fetchPolicy !== 'no-cache') { + // the subscription interface should handle not sending us results we no longer subscribe to. + // XXX I don't think we ever send in an object with errors, but we might in the future... + if (shouldWriteResult(result, errorPolicy)) { + this.cache.write({ + query, + result: result.data, + dataId: 'ROOT_SUBSCRIPTION', + variables: variables, + }); + } - this.broadcastQueries(); - } + this.broadcastQueries(); + } - if (graphQLResultHasError(result)) { - throw new ApolloError({ - graphQLErrors: result.errors, - }); - } + if (graphQLResultHasError(result)) { + throw new ApolloError({ + graphQLErrors: result.errors, + }); + } - return result; - }); + return result; + }) + ); if (this.transform(query).hasClientExports) { const observablePromise = this.localState.addExportedVariables( @@ -804,7 +808,7 @@ export class QueryManager { observable = byVariables.get(varJson); if (!observable) { - const concast = new Concast([ + const concast = new Concast>([ execute(link, operation) as Observable> ]); @@ -825,7 +829,7 @@ export class QueryManager { } } else { observable = new Concast([ - Observable.of({ data: {} } as FetchResult) + of({ data: {} } as FetchResult) ]); context = this.prepareContext(context); } @@ -1067,7 +1071,7 @@ export class QueryManager { }`, diff.missing); } - const fromData = (data: TData) => Observable.of({ + const fromData = (data: TData) => of({ data, loading: isNetworkRequestInFlight(networkStatus), networkStatus, diff --git a/src/core/__tests__/ObservableQuery.ts b/src/core/__tests__/ObservableQuery.ts index d7bf0c9aeeb..6d44a8e763c 100644 --- a/src/core/__tests__/ObservableQuery.ts +++ b/src/core/__tests__/ObservableQuery.ts @@ -1,5 +1,6 @@ import gql from 'graphql-tag'; import { GraphQLError } from 'graphql'; +import { of } from 'rxjs'; import { ApolloClient, NetworkStatus } from '../../core'; import { ObservableQuery } from '../ObservableQuery'; @@ -1122,7 +1123,7 @@ describe('ObservableQuery', () => { let count = 0; - let linkObservable = Observable.of({ + let linkObservable = of({ data: { name: 'Ben', }, diff --git a/src/link/batch/batching.ts b/src/link/batch/batching.ts index f2d7281bdec..0d113fe1466 100644 --- a/src/link/batch/batching.ts +++ b/src/link/batch/batching.ts @@ -1,5 +1,6 @@ import { Operation, FetchResult, NextLink } from '../core'; import { Observable } from '../../utilities'; +import { of } from 'rxjs'; export type BatchHandler = ( operations: Operation[], @@ -140,7 +141,7 @@ export class OperationBatcher { }); const batchedObservable = - this.batchHandler(requests, forwards) || Observable.of(); + this.batchHandler(requests, forwards) || of(); const onError = (error: any) => { //each callback list in batch diff --git a/src/link/context/index.ts b/src/link/context/index.ts index c427a769fa3..571b93c1ce7 100644 --- a/src/link/context/index.ts +++ b/src/link/context/index.ts @@ -1,5 +1,5 @@ import { ApolloLink, Operation, GraphQLRequest, NextLink } from '../core'; -import { Observable } from '../../utilities'; +import { Observable, ObservableSubscription } from '../../utilities'; export type ContextSetter = ( operation: GraphQLRequest, @@ -11,7 +11,7 @@ export function setContext(setter: ContextSetter): ApolloLink { const { ...request } = operation; return new Observable(observer => { - let handle: ZenObservable.Subscription; + let handle: ObservableSubscription; Promise.resolve(request) .then(req => setter(req, operation.getContext())) .then(operation.setContext) diff --git a/src/link/core/ApolloLink.ts b/src/link/core/ApolloLink.ts index 74483ab16fb..85d786118e0 100644 --- a/src/link/core/ApolloLink.ts +++ b/src/link/core/ApolloLink.ts @@ -13,9 +13,10 @@ import { createOperation, transformOperation, } from '../utils'; +import { of } from 'rxjs'; -function passthrough(op: Operation, forward: NextLink) { - return (forward ? forward(op) : Observable.of()) as Observable; +function passthrough(op: Operation, forward: NextLink): Observable { + return forward ? forward(op) : of(); } function toLink(handler: RequestHandler | ApolloLink) { @@ -36,7 +37,7 @@ class LinkError extends Error { export class ApolloLink { public static empty(): ApolloLink { - return new ApolloLink(() => Observable.of()); + return new ApolloLink(() => of()); } public static from(links: (ApolloLink | RequestHandler)[]): ApolloLink { @@ -55,14 +56,14 @@ export class ApolloLink { if (isTerminating(leftLink) && isTerminating(rightLink)) { return new ApolloLink(operation => { return test(operation) - ? leftLink.request(operation) || Observable.of() - : rightLink.request(operation) || Observable.of(); + ? leftLink.request(operation) || of() + : rightLink.request(operation) || of(); }); } else { return new ApolloLink((operation, forward) => { return test(operation) - ? leftLink.request(operation, forward) || Observable.of() - : rightLink.request(operation, forward) || Observable.of(); + ? leftLink.request(operation, forward) || of() + : rightLink.request(operation, forward) || of(); }); } } @@ -77,7 +78,7 @@ export class ApolloLink { operation.context, transformOperation(validateOperation(operation)), ), - ) || Observable.of() + ) || of() ); } @@ -102,15 +103,15 @@ export class ApolloLink { operation => firstLink.request( operation, - op => nextLink.request(op) || Observable.of(), - ) || Observable.of(), + op => nextLink.request(op) || of(), + ) || of(), ); } else { return new ApolloLink((operation, forward) => { return ( firstLink.request(operation, op => { - return nextLink.request(op, forward) || Observable.of(); - }) || Observable.of() + return nextLink.request(op, forward) || of(); + }) || of() ); }); } diff --git a/src/link/persisted-queries/index.ts b/src/link/persisted-queries/index.ts index b4ec109abbc..be9b29cbd20 100644 --- a/src/link/persisted-queries/index.ts +++ b/src/link/persisted-queries/index.ts @@ -7,7 +7,7 @@ import { import { invariant } from 'ts-invariant'; import { ApolloLink, Operation } from '../core'; -import { Observable, Observer, compact } from '../../utilities'; +import { Observable, Observer, ObservableSubscription, compact } from '../../utilities'; export const VERSION = 1; @@ -144,7 +144,7 @@ export const createPersistedQueryLink = ( const { query } = operation; return new Observable((observer: Observer) => { - let subscription: ZenObservable.Subscription; + let subscription: ObservableSubscription; let retried = false; let originalFetchOptions: any; let setFetchOptions = false; diff --git a/src/link/retry/retryLink.ts b/src/link/retry/retryLink.ts index 46c36d50f64..1afa7ae9604 100644 --- a/src/link/retry/retryLink.ts +++ b/src/link/retry/retryLink.ts @@ -1,5 +1,5 @@ import { ApolloLink, Operation, FetchResult, NextLink } from '../core'; -import { Observable } from '../../utilities'; +import { Observable, Observer, ObservableSubscription } from '../../utilities'; import { DelayFunction, DelayFunctionOptions, @@ -34,8 +34,8 @@ class RetryableOperation { private error: any; private complete = false; private canceled = false; - private observers: (ZenObservable.Observer | null)[] = []; - private currentSubscription: ZenObservable.Subscription | null = null; + private observers: (Observer | null)[] = []; + private currentSubscription: ObservableSubscription | null = null; private timerId: number | undefined; constructor( @@ -51,7 +51,7 @@ class RetryableOperation { * If the operation has previously emitted other events, they will be * immediately triggered for the observer. */ - public subscribe(observer: ZenObservable.Observer) { + public subscribe(observer: Observer) { if (this.canceled) { throw new Error( `Subscribing to a retryable link that was canceled is not supported`, @@ -77,7 +77,7 @@ class RetryableOperation { * If no observers remain, the operation will stop retrying, and unsubscribe * from its downstream link. */ - public unsubscribe(observer: ZenObservable.Observer) { + public unsubscribe(observer: Observer) { const index = this.observers.indexOf(observer); if (index < 0) { throw new Error( diff --git a/src/react/components/Query.tsx b/src/react/components/Query.tsx index f875e3d7d32..5e7ee9217a2 100644 --- a/src/react/components/Query.tsx +++ b/src/react/components/Query.tsx @@ -9,7 +9,7 @@ export function Query( ) { const { children, query, ...options } = props; const result = useQuery(query, options); - return children && result ? children(result) : null; + return children! && result ? children(result) : null; } export interface Query { diff --git a/src/react/types/types.ts b/src/react/types/types.ts index 00aa6bb449f..505ecaf3af6 100644 --- a/src/react/types/types.ts +++ b/src/react/types/types.ts @@ -2,7 +2,7 @@ import { ReactNode } from 'react'; import { DocumentNode } from 'graphql'; import { TypedDocumentNode } from '@graphql-typed-document-node/core'; -import { Observable } from '../../utilities'; +import { Observable, ObservableSubscription } from '../../utilities'; import { FetchResult } from '../../link/core'; import { ApolloClient } from '../../core'; import { ApolloError } from '../../errors'; @@ -258,5 +258,5 @@ export interface SubscriptionDataOptions< export interface SubscriptionCurrentObservable { query?: Observable; - subscription?: ZenObservable.Subscription; + subscription?: ObservableSubscription; } diff --git a/src/utilities/observables/Concast.ts b/src/utilities/observables/Concast.ts index 0126650b051..500c92af54a 100644 --- a/src/utilities/observables/Concast.ts +++ b/src/utilities/observables/Concast.ts @@ -1,4 +1,4 @@ -import { Observable, Observer, ObservableSubscription, Subscriber } from "./Observable"; +import { Observable, Observer, ObservableSubscription } from "./Observable"; import { iterateObserversSafely } from "./iteration"; import { fixObservableSubclass } from "./subclassing"; @@ -56,7 +56,7 @@ export class Concast extends Observable { // Not only can the individual elements of the iterable be promises, but // also the iterable itself can be wrapped in a promise. - constructor(sources: MaybeAsync> | Subscriber) { + constructor(sources: MaybeAsync>) { super(observer => { this.addObserver(observer); return () => this.removeObserver(observer); @@ -71,7 +71,7 @@ export class Concast extends Observable { // function, recover by creating an Observable from that subscriber and // using it as the source. if (typeof sources === "function") { - sources = [new Observable(sources)]; + sources = [new Observable(sources)]; } if (isPromiseLike(sources)) { diff --git a/src/utilities/observables/Observable.ts b/src/utilities/observables/Observable.ts index ac818ec2a94..48404e69bc7 100644 --- a/src/utilities/observables/Observable.ts +++ b/src/utilities/observables/Observable.ts @@ -1,20 +1,5 @@ -import Observable from 'zen-observable'; - -// This simplified polyfill attempts to follow the ECMAScript Observable -// proposal (https://github.com/zenparsing/es-observable) -import 'symbol-observable'; - -export type ObservableSubscription = ZenObservable.Subscription; -export type Observer = ZenObservable.Observer; -export type Subscriber = ZenObservable.Subscriber; - -// The zen-observable package defines Observable.prototype[Symbol.observable] -// when Symbol is supported, but RxJS interop depends on also setting this fake -// '@@observable' string as a polyfill for Symbol.observable. -const { prototype } = Observable; -const fakeObsSymbol = '@@observable' as keyof typeof prototype; -if (!prototype[fakeObsSymbol]) { - prototype[fakeObsSymbol] = function () { return this; }; -} - -export { Observable }; +export { + Observable, + PartialObserver as Observer, + Subscription as ObservableSubscription, +} from "rxjs";