Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 0 additions & 68 deletions .eslintrc.js

This file was deleted.

2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ node_modules
# ignore dependencies lock files
package-lock.json
yarn-error.log
build/
dist/
coverage/

website/node_modules
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

[![npm version](https://img.shields.io/npm/v/@zuze/d-queue.svg)](https://npmjs.org/package/@zuze/d-queue)
[![Coverage Status](https://coveralls.io/repos/github/zuze-lab/d-queue/badge.svg)](https://coveralls.io/github/zuze-lab/d-queue)
[![Build Status](https://travis-ci.org/zuze-lab/d-queue.svg)](https://travis-ci.org/zuze-lab/d-queue)
[![Build Status](https://travis-ci.com/zuze-lab/d-queue.svg)](https://travis-ci.com/zuze-lab/d-queue)
[![Bundle Phobia](https://badgen.net/bundlephobia/minzip/@zuze/d-queue)](https://bundlephobia.com/result?p=@zuze/d-queue)
[![install size](https://packagephobia.now.sh/badge?p=@zuze/d-queue)](https://packagephobia.now.sh/result?p=@zuze/d-queue)

Expand Down Expand Up @@ -71,7 +71,7 @@ Accepts a function reference and (optionally) an array arguments that function s
- `dequeue (fn: Function)`
Removes a function reference from the queue.

- `run( done? => void | Promise )`
- `run( done?:() => void | any | Promise<any> )`
Starts a process running. Any functions added to the queue will the process is running will not be run until the process is complete. It can be made async by either returning a promise or calling the `done` function passed to the callback as an argument.

Returning a promise and accepting a `done` parameter are mutually exclusive. If the callback function accepts a `done` parameter, it **must be called**.
12 changes: 0 additions & 12 deletions babel.config.js

This file was deleted.

4 changes: 3 additions & 1 deletion jest.config.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
module.exports = {
transform: { '^.+\\.ts?$': 'ts-jest' },
coveragePathIgnorePatterns:['test/test.utils.js'],
coverageThreshold: {
global: {
branches: 90,
functions: 90,
lines: 90,
statements: 90,
},
},
coveragePathIgnorePatterns:['test/test.utils.js']
};
29 changes: 10 additions & 19 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
{
"name": "@zuze/d-queue",
"version": "2.0.0",
"version": "2.1.0",
"description": "A ridiculously small and simple debounce queue",
"main": "build/cjs/index.js",
"module": "build/esm/index.js",
"main": "dist/index.js",
"keywords": [
"queue",
"async",
Expand All @@ -12,7 +11,7 @@
"event"
],
"files": [
"build"
"dist"
],
"homepage": "https://github.com/zuze-lab/d-queue",
"scripts": {
Expand All @@ -24,26 +23,18 @@
},
"author": "Adam Jenkins",
"license": "ISC",
"dependencies": {
"@babel/runtime": "^7.8.7"
},
"devDependencies": {
"@babel/core": "^7.6.0",
"@babel/plugin-transform-runtime": "^7.6.0",
"@babel/preset-env": "^7.6.0",
"@rollup/plugin-node-resolve": "^6.0.0",
"babel-eslint": "^10.0.3",
"babel-jest": "^25.1.0",
"coveralls": "^3.0.9",
"eslint": "^6.4.0",
"eslint-config-prettier": "^6.3.0",
"eslint-plugin-import": "^2.18.2",
"eslint-plugin-jest": "^22.17.0",
"eslint-plugin-prettier": "^3.1.0",
"jest": "^25.1.0",
"prettier": "^1.18.2",
"rollup": "^1.21.4",
"rollup-plugin-babel": "^4.3.3",
"@types/jest": "^25.2.1",
"rollup-plugin-typescript2": "^0.24.3",
"ts-jest": "^25.3.1",
"tslint": "^5.20.0",
"tslint-config-prettier": "^1.18.0",
"tslint-origin-ordered-imports-rule": "^1.2.2",
"typescript": "^3.6.4",
"rollup-plugin-commonjs": "^10.1.0"
}
}
43 changes: 4 additions & 39 deletions rollup.config.js
Original file line number Diff line number Diff line change
@@ -1,52 +1,17 @@
import babel from 'rollup-plugin-babel';
import resolve from '@rollup/plugin-node-resolve';
import pkg from './package.json';
import typescript from 'rollup-plugin-typescript2'

const MAIN = 'src/index.js';

const external = [
...Object.keys(pkg.dependencies || {}),
...Object.keys(pkg.peerDependencies || {}),
];
const MAIN = 'src/index.ts';

export default [
// ES5
{
input: MAIN,
output: {
file: 'build/cjs/index.js',
file: 'dist/index.js',
format: 'cjs',
},
external,
plugins: [
resolve({
customResolveOptions: { moduleDirectory: 'src' },
}),
babel({
plugins: ['@babel/transform-runtime'],
presets: [
[
'@babel/preset-env',
{
targets: {
browsers: ['> 1%', 'last 2 versions'],
},
},
],
],
runtimeHelpers: true,
}),
typescript({typescript: require('typescript')}),
],
},

// MODULE
{
input: MAIN,
output: {
file: 'build/esm/index.js',
format: 'esm',
},
external,
plugins: [resolve()],
},
];
36 changes: 0 additions & 36 deletions src/index.js

This file was deleted.

47 changes: 47 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// export const stateArgumentProcessor = ([next], last = []) => [next, last[1]];
const identity = <T>(a: T) => a;

type ArgumentProcessor = (next: Args[], last?: Args[]) => Args;
type Fn = (...args: Args) => void;
type Args = any[];

export type RunFunction = (done?: () => void) => any | void | Promise<any>;

export default (processor: ArgumentProcessor = identity) => {
let updating = 0;
const pending = new Map<Fn,Args>();
const lastCalledWith = new WeakMap<Fn,Args>();

const process = (fn: Fn, args: any[]) => {
fn.apply(fn,processor(args, lastCalledWith.get(fn)));
lastCalledWith.set(fn, args);
pending.delete(fn);
return false;
};

const flush = () =>
updating ||
Array.from(pending.entries()).some(
([fn, args]) => (!!updating) || process(fn, args),
);

const dequeue = (fn: Fn) => pending.delete(fn);
const tick = <T>(r: T) => (updating--, flush(), r);

return {
dequeue,
// while this function is running, nothing added to the queue will be processed
run: (fn: RunFunction) => {
updating++;
const done = (r?: Promise<any> | any) =>
r && typeof r.then === 'function' ? r.then(tick) : tick(r);

// TIL about fn.length: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/length
fn.length ? fn(done) : done(fn());
},
enqueue: (fn: Fn, args = []) => {
if(pending.set(fn, args)) flush();
return () => dequeue(fn);
},
};
};
2 changes: 1 addition & 1 deletion test/dqueue.test.js → test/dqueue.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ describe('debounce queue', () => {
run(asyncFn);
const dequeue = enqueue(fn);
await advanceTimersByTime(time - 1);
dequeue(fn);
dequeue();
await advanceTimersByTime(1);
expect(fn).not.toHaveBeenCalled();
});
Expand Down
File renamed without changes.
16 changes: 16 additions & 0 deletions tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"compilerOptions": {
"module": "es6",
"target": "es5",
"moduleResolution": "node",
"esModuleInterop": true,
"declaration": true
},
"include": [
"src/**/*"
],
"exclude": [
"node_modules",
"**/__tests__/*.spec.ts"
]
}
35 changes: 35 additions & 0 deletions tslint.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"extends": [
"tslint:recommended",
"tslint-config-prettier"
],
"jsRules": {},
"rules": {
"quotemark": [true, "single"],
"no-construct": true,
"curly": [true, "as-needed"],
"no-debugger": true,
"no-duplicate-variable": true,
"no-empty": false,
"no-empty-interface": true,
"no-eval": true,
"no-inferrable-types": [true, "ignore-params"],
"no-shadowed-variable": true,
"no-string-literal": false,
"no-string-throw": true,
"no-switch-case-fall-through": true,
"no-trailing-whitespace": true,
"no-unused-expression": true,
"no-var-keyword": true,
"object-literal-sort-keys": false,
"prefer-const": true,
"radix": true,
"semicolon": [true, "always"],
"origin-ordered-imports": [true],
"interface-name": false,
"variable-name": false,
"trailing-comma": [true, { "multiline": "always", "singleline": "never" }],
"member-ordering": false
},
"rulesDirectory": ["node_modules/tslint-origin-ordered-imports-rule/dist"]
}
Loading