Skip to content

Commit

Permalink
Require Node.js 8
Browse files Browse the repository at this point in the history
  • Loading branch information
sindresorhus committed May 28, 2019
1 parent e5a088b commit 0cd2b20
Show file tree
Hide file tree
Showing 18 changed files with 85 additions and 89 deletions.
3 changes: 1 addition & 2 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
* text=auto
*.js text eol=lf
* text=auto eol=lf
3 changes: 2 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
language: node_js
node_js:
- '12'
- '10'
- '8'
- '6'
addons:
chrome: stable
21 changes: 15 additions & 6 deletions browser/create-karma-conf.js
Original file line number Diff line number Diff line change
@@ -1,25 +1,34 @@
'use strict';
const arrify = require('arrify');

// Creates a karma.conf implementation that runs a specific set of files.
// Creates a `karma.conf` implementation that runs a specific set of files
module.exports = function (files) {
return function (karma) {
return karma => {
karma.set({
frameworks: ['mocha', 'browserify'],
frameworks: [
'mocha',
'browserify'
],
files: arrify(files),
preprocessors: {
'tests/*.js': ['browserify']
'tests/*.js': [
'browserify'
]
},
browserify: {
debug: true
},
customLaunchers: {
ChromeHeadlessNoSandbox: {
base: 'ChromeHeadless',
flags: ['--no-sandbox']
flags: [
'--no-sandbox'
]
}
},
browsers: [process.env.CI ? 'ChromeHeadlessNoSandbox' : 'ChromeHeadless'],
browsers: [
process.env.CI ? 'ChromeHeadlessNoSandbox' : 'ChromeHeadless'
],
autoWatch: false,
singleRun: true
});
Expand Down
2 changes: 1 addition & 1 deletion browser/from-env.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
'use strict';
// Karma.conf that reads an environment variable to decide which test to run.
// Karma config that reads an environment variable to decide which test to run
module.exports = require('./create-karma-conf')(process.env.ANY_OBSERVABLE_TEST_PATH);
34 changes: 17 additions & 17 deletions loader.js
Original file line number Diff line number Diff line change
@@ -1,41 +1,41 @@
'use strict';

const REGISTRATION_KEY = Symbol('@@any-observable/REGISTRATION');
let registered = null;

module.exports = (global, loadImplementation) => {
return (implementation, opts) => {
opts = opts || {};
let isRegistered;

// global registration unless explicitly {global: false} in options (default true)
const registerGlobal = opts.global !== false;
module.exports = (global, loadImplementation) => {
return (implementation, options = {}) => {
// Global registration unless explicitly `{global: false}`` in options (default true)
const registerGlobal = options.global !== false;

// Load any previous global registration
if (registerGlobal && !registered) {
registered = global[REGISTRATION_KEY];
if (registerGlobal && !isRegistered) {
isRegistered = global[REGISTRATION_KEY];
}

if (registered && implementation && registered.implementation !== implementation) {
throw new Error(`any-observable already defined as "${registered.implementation}". You can only register an implementation before the first call to require('any-observable') and an implementation cannot be changed`);
if (isRegistered && implementation && isRegistered.implementation !== implementation) {
throw new Error(`any-observable already defined as \`${isRegistered.implementation}\`. You can only register an implementation before the first call to \`require('any-observable')\` and an implementation cannot be changed`);
}

if (!registered) {
if (!isRegistered) {
// Use provided implementation
if (implementation && opts.Observable) {
registered = {
Observable: opts.Observable,
if (implementation && options.Observable) {
isRegistered = {
Observable: options.Observable,
implementation
};
} else {
// Require implementation if implementation is specified but not provided
registered = loadImplementation(implementation || null);
isRegistered = loadImplementation(implementation);
}

if (registerGlobal) {
// Register preference globally in case multiple installations
global[REGISTRATION_KEY] = registered;
global[REGISTRATION_KEY] = isRegistered;
}
}

return registered;
return isRegistered;
};
};
16 changes: 8 additions & 8 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"url": "sindresorhus.com"
},
"engines": {
"node": ">=6"
"node": ">=8"
},
"scripts": {
"test": "xo && ava"
Expand All @@ -32,18 +32,18 @@
"rxjs"
],
"devDependencies": {
"arrify": "^1.0.1",
"ava": "*",
"arrify": "^2.0.1",
"ava": "^1.4.1",
"browserify": "^16.2.0",
"execa": "^0.10.0",
"karma": "^2.0.0",
"karma-browserify": "^5.2.0",
"execa": "^1.0.0",
"karma": "^4.1.0",
"karma-browserify": "^6.0.0",
"karma-chrome-launcher": "^2.2.0",
"karma-mocha": "^1.3.0",
"mocha": "^5.1.0",
"mocha": "^6.1.4",
"rxjs": "^5.5.10",
"watchify": "^3.11.0",
"xo": "*",
"xo": "^0.24.0",
"zen-observable": "^0.8.8"
},
"browser": {
Expand Down
9 changes: 3 additions & 6 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ $ npm install zen-observable
```js
const Observable = require('any-observable'); // Using `zen-observable` since it's installed

Observable.of(1, 2).forEach(x => console.log(x));
Observable.of(1, 2).forEach(value => {
console.log(value);
});
//=> 1
//=> 2
```
Expand Down Expand Up @@ -54,8 +56,3 @@ $ ava --require=any-observable/register/zen test.js

- [is-observable](https://github.com/sindresorhus/is-observable) - Check if a value is an Observable
- [observable-to-promise](https://github.com/sindresorhus/observable-to-promise) - Convert an Observable to a Promise


## License

MIT © [Sindre Sorhus](https://sindresorhus.com)
10 changes: 5 additions & 5 deletions register-shim.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
module.exports = require('./loader')(window, loadImplementation);

/**
* Browser specific loadImplementation. Always uses `window.Observable`
*
* To register a custom implementation, must register with `Observable` option.
*/
Browser specific `loadImplementation`. Always uses `window.Observable`.
To register a custom implementation, use the `Observable` option.
*/
function loadImplementation() {
if (typeof window.Observable === 'undefined') {
throw new TypeError(`any-observable browser requires a polyfill or explicit registration e.g: require('any-observable/register')('rxjs', {Observable: require('rxjs/Observable').Observable})`);
throw new TypeError('any-observable browser requires a polyfill or explicit registration, for example:\nrequire(\'any-observable/register\')(\'rxjs\', {Observable: require(\'rxjs/Observable\').Observable})');
}

return {
Expand Down
32 changes: 13 additions & 19 deletions register.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,51 +2,45 @@
module.exports = require('./loader')(global, loadImplementation);

function loadImplementation(implementation) {
let impl;
let finalImplementation;

if (implementation === 'global.Observable') {
// If no implementation or env specified use global.Observable
impl = {
finalImplementation = {
Observable: global.Observable,
implementation: 'global.Observable'
};
} else if (implementation) {
// If implementation specified, require it
const lib = require(implementation);
const package_ = require(implementation);

impl = {
Observable: lib.Observable || lib.default || lib,
finalImplementation = {
Observable: package_.Observable || package_.default || package_,
implementation
};
} else {
// Try to auto detect implementation. This is non-deterministic
// and should prefer other branches, but this is our last chance
// to load something without throwing error
impl = tryAutoDetect();
// to load something without throwing error.
finalImplementation = tryAutoDetect();
}

if (!impl) {
throw new Error('Cannot find any-observable implementation nor' +
' global.Observable. You must install polyfill or call' +
' require("any-observable/register") with your preferred' +
' implementation, e.g. require("any-observable/register")(\'rxjs\')' +
' on application load prior to any require("any-observable").');
if (!finalImplementation) {
throw new Error('Cannot find any-observable implementation nor `global.Observable`. You must install polyfill or call `require(\'any-observable/register\') with your preferred implementation, for example, `require(\'any-observable/register\')(\'rxjs\')` on app load prior to any `require(\'any-observable\').');
}

return impl;
return finalImplementation;
}

function tryAutoDetect() {
const libs = [
const packages = [
'rxjs',
'zen-observable'
];

for (const lib of libs) {
for (const package_ of packages) {
try {
return loadImplementation(lib);
return loadImplementation(package_);
} catch (_) {}
}

return null;
}
28 changes: 12 additions & 16 deletions test/browser.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,19 @@ import execa from 'execa';

const cwd = path.join(__dirname, '..');
const conf = path.join(__dirname, '..', 'browser', 'from-env.js');
const testsDir = path.join(__dirname, '..', 'browser', 'tests');
const testsDirectory = path.join(__dirname, '..', 'browser', 'tests');

const testFiles = fs.readdirSync(testsDir);
const majorVersion = Number(process.version.substring(1).split('.')[0]);
for (const filename of fs.readdirSync(testsDirectory)) {
const basename = path.basename(filename, '.js');
const filepath = path.join(testsDirectory, filename);

if (majorVersion <= 4) {
test('skipped browser tests for Node.js <= 4', () => {});
} else {
testFiles.forEach(filename => {
const basename = path.basename(filename, '.js');
const filepath = path.join(testsDir, filename);

test.serial(basename, async t => {
await t.notThrows(execa('karma', ['start', conf], {
cwd,
env: Object.assign({}, process.env, {ANY_OBSERVABLE_TEST_PATH: filepath})
}));
});
test.serial(basename, async t => {
await t.notThrowsAsync(execa('karma', ['start', conf], {
cwd,
env: {
...process.env,
ANY_OBSERVABLE_TEST_PATH: filepath
}
}));
});
}
2 changes: 1 addition & 1 deletion test/defaults.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ const RxJsObservable = require('rxjs').Observable;
const AnyObservable = require('..');
const implementation = require('../implementation');

test(t => {
test('main', t => {
t.is(AnyObservable, RxJsObservable);
t.is(implementation, 'rxjs');
});
2 changes: 1 addition & 1 deletion test/rxjs-observable.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ const RxJsObservable = require('rxjs/Observable').Observable;
const AnyObservable = require('..');
const implementation = require('../implementation');

test(t => {
test('main', t => {
t.is(AnyObservable, RxJsObservable);
t.is(implementation, 'rxjs/Observable');
});
2 changes: 1 addition & 1 deletion test/rxjs.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ const RxJsObservable = require('rxjs').Observable;
const AnyObservable = require('..');
const implementation = require('../implementation');

test(t => {
test('main', t => {
t.is(AnyObservable, RxJsObservable);
t.is(implementation, 'rxjs');
});
2 changes: 1 addition & 1 deletion test/shortcut-rxjs-all.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {Observable as RxJsObservable} from 'rxjs';
import AnyObservable from '..';
import implementation from '../implementation';

test(t => {
test('main', t => {
t.is(AnyObservable, RxJsObservable);
t.is(implementation, 'rxjs');
t.is(typeof RxJsObservable.prototype.map, 'function');
Expand Down
2 changes: 1 addition & 1 deletion test/shortcut-rxjs-min.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {Observable as RxJsObservable} from 'rxjs/Observable';
import AnyObservable from '..';
import implementation from '../implementation';

test(t => {
test('main', t => {
t.is(AnyObservable, RxJsObservable);
t.is(implementation, 'rxjs/Observable');
t.is(typeof RxJsObservable.of, 'undefined');
Expand Down
2 changes: 1 addition & 1 deletion test/shortcut-rxjs.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {Observable as RxJsObservable} from 'rxjs/Observable';
import AnyObservable from '..';
import implementation from '../implementation';

test(t => {
test('main', t => {
t.is(AnyObservable, RxJsObservable);
t.is(implementation, 'rxjs/Observable');
t.is(typeof RxJsObservable.of, 'function');
Expand Down
2 changes: 1 addition & 1 deletion test/shortcut-zen.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import ZenObservable from 'zen-observable';
import AnyObservable from '..';
import implementation from '../implementation';

test(t => {
test('main', t => {
t.is(AnyObservable, ZenObservable);
t.is(implementation, 'zen-observable');
});
2 changes: 1 addition & 1 deletion test/zen.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ const ZenObservable = require('zen-observable');
const AnyObservable = require('..');
const implementation = require('../implementation');

test(t => {
test('main', t => {
t.is(AnyObservable, ZenObservable);
t.is(implementation, 'zen-observable');
});

0 comments on commit 0cd2b20

Please sign in to comment.