diff --git a/README.md b/README.md index 642d3de6be..6cc8fd3c62 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ By contributing or commenting on issues in this repository, whether you've read ### ES6 via npm ```sh -npm install rxjs-es +npm install rxjs ``` To import the entire core set of functionality: diff --git a/package.json b/package.json index 100adc509d..66252b7102 100644 --- a/package.json +++ b/package.json @@ -70,10 +70,10 @@ "copy_src_cjs": "mkdirp ./dist/cjs/src && shx cp -r ./src/* ./dist/cjs/src", "copy_src_es6": "mkdirp ./dist/es6/src && shx cp -r ./src/* ./dist/es6/src", "commit": "git-cz", - "compile_dist_cjs": "tsc typings/globals/es6-shim/index.d.ts ./dist/cjs/src/Rx.ts ./dist/cjs/src/add/observable/of.ts -m commonjs --sourceMap --outDir ./dist/cjs --target ES5 -d --diagnostics --pretty --noImplicitAny --noImplicitReturns --suppressImplicitAnyIndexErrors --moduleResolution node", + "compile_dist_cjs": "tsc ./dist/cjs/src/Rx.ts ./dist/cjs/src/add/observable/of.ts -m commonjs --lib es5,es2015.iterable,es2015.collection,es2015.promise,dom --sourceMap --outDir ./dist/cjs --target ES5 -d --diagnostics --pretty --noImplicitAny --noImplicitReturns --suppressImplicitAnyIndexErrors --moduleResolution node", "compile_dist_es6": "tsc ./dist/es6/src/Rx.ts ./dist/es6/src/add/observable/of.ts -m es2015 --sourceMap --outDir ./dist/es6 --target ES6 -d --diagnostics --pretty --noImplicitAny --noImplicitReturns --suppressImplicitAnyIndexErrors --moduleResolution node", "compile_dist_es6_for_docs": "tsc ./dist/es6/src/Rx.ts ./dist/es6/src/add/observable/of.ts ./dist/es6/src/MiscJSDoc.ts -m es2015 --sourceMap --outDir ./dist/es6 --target ES6 -d --diagnostics --pretty --noImplicitAny --noImplicitReturns --suppressImplicitAnyIndexErrors --moduleResolution node", - "cover": "shx rm -rf dist/cjs && tsc typings/globals/es6-shim/index.d.ts src/Rx.ts src/add/observable/of.ts -m commonjs --outDir dist/cjs --sourceMap --target ES5 -d && nyc --reporter=lcov --reporter=html --exclude=spec/support/**/* --exclude=spec-js/**/* --exclude=node_modules mocha --opts spec/support/default.opts spec-js", + "cover": "shx rm -rf dist/cjs && tsc src/Rx.ts src/add/observable/of.ts -m commonjs --lib es5,es2015.iterable,es2015.collection,es2015.promise,dom --outDir dist/cjs --sourceMap --target ES5 -d && nyc --reporter=lcov --reporter=html --exclude=spec/support/**/* --exclude=spec-js/**/* --exclude=node_modules mocha --opts spec/support/default.opts spec-js", "decision_tree_widget": "cd doc/decision-tree-widget && npm run build && cd ../..", "doctoc": "doctoc CONTRIBUTING.md", "generate_packages": "node .make-packages.js", diff --git a/spec/observables/IteratorObservable-spec.ts b/spec/observables/IteratorObservable-spec.ts index 3149f213a2..63b1d73761 100644 --- a/spec/observables/IteratorObservable-spec.ts +++ b/spec/observables/IteratorObservable-spec.ts @@ -1,5 +1,6 @@ import {expect} from 'chai'; import * as Rx from '../../dist/cjs/Rx'; +import {queue} from '../../dist/cjs/scheduler/queue'; import {IteratorObservable} from '../../dist/cjs/observable/IteratorObservable'; declare const expectObservable; @@ -46,6 +47,68 @@ describe('IteratorObservable', () => { ); }); + it('should finalize generators if the subscription ends', () => { + const iterator = { + finalized: false, + next() { + return { value: 'duck', done: false }; + }, + return() { + this.finalized = true; + } + }; + + const iterable = { + [Rx.Symbol.iterator]() { + return iterator; + } + }; + + const results = []; + + IteratorObservable.create(iterable) + .take(3) + .subscribe( + x => results.push(x), + null, + () => results.push('GOOSE!') + ); + + expect(results).to.deep.equal(['duck', 'duck', 'duck', 'GOOSE!']); + expect(iterator.finalized).to.be.true; + }); + + it('should finalize generators if the subscription and it is scheduled', () => { + const iterator = { + finalized: false, + next() { + return { value: 'duck', done: false }; + }, + return() { + this.finalized = true; + } + }; + + const iterable = { + [Rx.Symbol.iterator]() { + return iterator; + } + }; + + const results = []; + + IteratorObservable.create(iterable, queue) + .take(3) + .subscribe( + x => results.push(x), + null, + () => results.push('GOOSE!') + ); + + expect(results).to.deep.equal(['duck', 'duck', 'duck', 'GOOSE!']); + expect(iterator.finalized).to.be.true; + }); + it('should emit members of an array iterator on a particular scheduler', () => { const source = IteratorObservable.create( [10, 20, 30, 40], diff --git a/spec/tsconfig.json b/spec/tsconfig.json index 182a705625..bb3d0fb553 100644 --- a/spec/tsconfig.json +++ b/spec/tsconfig.json @@ -7,7 +7,15 @@ "allowJs": true, "target": "es5", "module": "commonjs", - "outDir": "../spec-js" + "outDir": "../spec-js", + "lib": [ + "es5", + "es2015.core", + "es2015.collection", + "es2015.iterable", + "es2015.promise", + "dom" + ] }, "formatCodeOptions": { "indentSize": 2, diff --git a/src/Subject.ts b/src/Subject.ts index dcea18e734..b3dacf0d80 100644 --- a/src/Subject.ts +++ b/src/Subject.ts @@ -43,9 +43,9 @@ export class Subject extends Observable implements ISubscription { return new AnonymousSubject(destination, source); }; - lift(operator: Operator): Observable { + lift(operator: Operator): Observable { const subject = new AnonymousSubject(this, this); - subject.operator = operator; + subject.operator = operator; return subject; } diff --git a/src/observable/IteratorObservable.ts b/src/observable/IteratorObservable.ts index 4195965f25..586afc6ad3 100644 --- a/src/observable/IteratorObservable.ts +++ b/src/observable/IteratorObservable.ts @@ -36,6 +36,9 @@ export class IteratorObservable extends Observable { state.index = index + 1; if (subscriber.closed) { + if (typeof iterator.return === 'function') { + iterator.return(); + } return; } @@ -71,6 +74,9 @@ export class IteratorObservable extends Observable { subscriber.next(result.value); } if (subscriber.closed) { + if (typeof iterator.return === 'function') { + iterator.return(); + } break; } } while (true); diff --git a/typings.json b/typings.json index 62dc7f0eaf..fdf5194f8c 100644 --- a/typings.json +++ b/typings.json @@ -7,9 +7,6 @@ "sinon-chai": "registry:npm/sinon-chai#2.8.0+20160310030142" }, "globalDevDependencies": { - "mocha": "registry:env/mocha#2.2.5+20160723033700" - }, - "globalDependencies": { - "es6-shim": "registry:dt/es6-shim#0.31.2+20160602141504" + "mocha": "registry:env/mocha#2.2.5+20160926180742" } }