Compare commits
81 Commits
Author | SHA1 | Date | |
---|---|---|---|
dc53984a77 | |||
a4d6c38a4f | |||
af0f406746 | |||
73bf085376 | |||
70c5f15b4c | |||
ee9bbe021c | |||
45d53eea31 | |||
d54b5790a3 | |||
a941ca69b3 | |||
1afbfd8895 | |||
3802c03838 | |||
8c18dcd0e6 | |||
b8e7063bab | |||
85706e8a4e | |||
3a5ea9aa13 | |||
4d762353dd | |||
f176e991a8 | |||
1f1e0e4ee1 | |||
139d4cb56d | |||
8038e54f53 | |||
37284da2cc | |||
b0772e2372 | |||
f3eac4a5f7 | |||
fde31ec25d | |||
810b299caa | |||
c71ac16090 | |||
91b52982c0 | |||
97f8327fe9 | |||
42f40449ad | |||
960c23fecd | |||
40642fd6f6 | |||
4c3565c618 | |||
1848006601 | |||
c761cc4460 | |||
9f6d88e162 | |||
255d6415a5 | |||
84a8d8431c | |||
95d27d52a7 | |||
1363aa7957 | |||
095ea36e5d | |||
b6ab079de0 | |||
734d5aca35 | |||
3b0052602f | |||
9693ec04d6 | |||
4ee932873c | |||
3bedd3581e | |||
ee3c1c6e79 | |||
8c6ac181b0 | |||
51bce0b317 | |||
374d73f87e | |||
d922c691ed | |||
5aecc44ad7 | |||
f7492c4656 | |||
63dd46ed49 | |||
984c2bc9d8 | |||
16030d5ee8 | |||
ddce50ac0f | |||
baf956d0ed | |||
3340f1a895 | |||
ee336af699 | |||
0526c45ea1 | |||
9933d72784 | |||
d1bc689b35 | |||
25c0deb3f3 | |||
5138219563 | |||
93f426cce0 | |||
e42061047a | |||
3b07f99488 | |||
3d252a5e3e | |||
d82722296b | |||
22317ef83d | |||
054ec0afa4 | |||
19d434533f | |||
9b8440f743 | |||
564953e25f | |||
98f190ea21 | |||
2b77c8e019 | |||
d8e5fbf3bc | |||
1069d5a38e | |||
eb82d16859 | |||
082f533975 |
23
.gitignore
vendored
23
.gitignore
vendored
@ -1,5 +1,20 @@
|
|||||||
coverage/
|
.nogit/
|
||||||
pages/
|
|
||||||
node_modules/
|
|
||||||
public/
|
|
||||||
|
|
||||||
|
# artifacts
|
||||||
|
coverage/
|
||||||
|
public/
|
||||||
|
pages/
|
||||||
|
|
||||||
|
# installs
|
||||||
|
node_modules/
|
||||||
|
|
||||||
|
# caches
|
||||||
|
.yarn/
|
||||||
|
.cache/
|
||||||
|
.rpt2_cache
|
||||||
|
|
||||||
|
# builds
|
||||||
|
dist/
|
||||||
|
dist_*/
|
||||||
|
|
||||||
|
# custom
|
@ -1,72 +0,0 @@
|
|||||||
# gitzone standard
|
|
||||||
image: hosttoday/ht-docker-node:npmci
|
|
||||||
|
|
||||||
cache:
|
|
||||||
paths:
|
|
||||||
- .yarn/
|
|
||||||
key: "$CI_BUILD_STAGE"
|
|
||||||
|
|
||||||
stages:
|
|
||||||
- test
|
|
||||||
- release
|
|
||||||
- trigger
|
|
||||||
- pages
|
|
||||||
|
|
||||||
testLEGACY:
|
|
||||||
stage: test
|
|
||||||
script:
|
|
||||||
- npmci test legacy
|
|
||||||
coverage: /\d+.?\d+?\%\s*coverage/
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
allow_failure: true
|
|
||||||
|
|
||||||
testLTS:
|
|
||||||
stage: test
|
|
||||||
script:
|
|
||||||
- npmci test lts
|
|
||||||
coverage: /\d+.?\d+?\%\s*coverage/
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
|
|
||||||
testSTABLE:
|
|
||||||
stage: test
|
|
||||||
script:
|
|
||||||
- npmci test stable
|
|
||||||
coverage: /\d+.?\d+?\%\s*coverage/
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
|
|
||||||
release:
|
|
||||||
stage: release
|
|
||||||
script:
|
|
||||||
- npmci publish
|
|
||||||
only:
|
|
||||||
- tags
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
|
|
||||||
trigger:
|
|
||||||
stage: trigger
|
|
||||||
script:
|
|
||||||
- npmci trigger
|
|
||||||
only:
|
|
||||||
- tags
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
|
|
||||||
pages:
|
|
||||||
image: hosttoday/ht-docker-node:npmci
|
|
||||||
stage: pages
|
|
||||||
script:
|
|
||||||
- npmci command yarn global add npmpage
|
|
||||||
- npmci command npmpage
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
only:
|
|
||||||
- tags
|
|
||||||
artifacts:
|
|
||||||
expire_in: 1 week
|
|
||||||
paths:
|
|
||||||
- public
|
|
||||||
allow_failure: true
|
|
11
.vscode/launch.json
vendored
Normal file
11
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"command": "npm test",
|
||||||
|
"name": "Run npm test",
|
||||||
|
"request": "launch",
|
||||||
|
"type": "node-terminal"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
26
.vscode/settings.json
vendored
Normal file
26
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"json.schemas": [
|
||||||
|
{
|
||||||
|
"fileMatch": ["/npmextra.json"],
|
||||||
|
"schema": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"npmci": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "settings for npmci"
|
||||||
|
},
|
||||||
|
"gitzone": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "settings for gitzone",
|
||||||
|
"properties": {
|
||||||
|
"projectType": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["website", "element", "service", "npm", "wcc"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
81
README.md
81
README.md
@ -1,81 +0,0 @@
|
|||||||
# smartq
|
|
||||||
dropin replacement for q
|
|
||||||
|
|
||||||
## Availabililty
|
|
||||||
[](https://www.npmjs.com/package/smartq)
|
|
||||||
[](https://GitLab.com/pushrocks/smartq)
|
|
||||||
[](https://github.com/pushrocks/smartq)
|
|
||||||
[](https://pushrocks.gitlab.io/smartq/)
|
|
||||||
|
|
||||||
## Status for master
|
|
||||||
[](https://GitLab.com/pushrocks/smartq/commits/master)
|
|
||||||
[](https://GitLab.com/pushrocks/smartq/commits/master)
|
|
||||||
[](https://www.npmjs.com/package/smartq)
|
|
||||||
[](https://david-dm.org/pushrocks/smartq)
|
|
||||||
[](https://www.bithound.io/github/pushrocks/smartq/master/dependencies/npm)
|
|
||||||
[](https://www.bithound.io/github/pushrocks/smartq)
|
|
||||||
[](https://nodejs.org/dist/latest-v6.x/docs/api/)
|
|
||||||
[](https://nodejs.org/dist/latest-v6.x/docs/api/)
|
|
||||||
[](http://standardjs.com/)
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
Use TypeScript for best in class instellisense.
|
|
||||||
|
|
||||||
> Note: smartq uses native ES6 promises
|
|
||||||
> smartq does not repeat any native functions, so for things like .all() simply use Promise.all()
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
import * as q from 'smartq'
|
|
||||||
|
|
||||||
// Deferred
|
|
||||||
// -----------------------------------------------
|
|
||||||
let myAsyncFunction = (): Promise<string> => {
|
|
||||||
let done = q.defer<string>() // returns your typical Deferred object
|
|
||||||
setTimeout(() => {
|
|
||||||
done.resolve('hi') // will throw type error for other types than string as argument ;)
|
|
||||||
},6000)
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
|
|
||||||
let myAsyncFunction2 = async () => {
|
|
||||||
let aString = await myAsyncFunction()
|
|
||||||
console.log(aString) // will log 'hi' to console
|
|
||||||
}
|
|
||||||
|
|
||||||
myAsyncFunction2();
|
|
||||||
|
|
||||||
|
|
||||||
// Resolved and Rejected promises
|
|
||||||
// ------------------------------------------------
|
|
||||||
q.resolvedPromise(`I'll get logged to console soon`)
|
|
||||||
.then(x => {
|
|
||||||
console.log(x)
|
|
||||||
})
|
|
||||||
|
|
||||||
q.rejectedPromise(`what a lovely error message`)
|
|
||||||
.then(() => {
|
|
||||||
console.log('This never makes it to console')
|
|
||||||
}/*, alternatively put a reject function here */)
|
|
||||||
.catch(err => {
|
|
||||||
console.log(err)
|
|
||||||
})
|
|
||||||
|
|
||||||
// Promisify (typed)
|
|
||||||
// ------------------------------------------------
|
|
||||||
|
|
||||||
let myCallbackedFunction = (someString: string, someNumber: number, cb) => {
|
|
||||||
cb(null, someString)
|
|
||||||
}
|
|
||||||
|
|
||||||
let myPromisedFunction = q.promisify(myCallbackFunction)
|
|
||||||
myPromisedFunction('helloThere', 2).then(x => {
|
|
||||||
console.log(x) // will log 'helloThere' to console
|
|
||||||
})
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
For further information read the linked docs at the top of this README.
|
|
||||||
|
|
||||||
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
|
|
||||||
|
|
||||||
[](https://push.rocks)
|
|
122
changelog.md
Normal file
122
changelog.md
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
## 2025-02-20 - 4.2.3 - fix(test)
|
||||||
|
Refactor test suite for improved readability and maintainability.
|
||||||
|
|
||||||
|
- Updated and cleaned up test cases for deferreds and promises.
|
||||||
|
- Reduced timeouts in tests for quicker execution.
|
||||||
|
- Added expectations for promise status and duration.
|
||||||
|
|
||||||
|
## 2025-02-20 - 4.2.3 - fix(test)
|
||||||
|
Refactor test suite for improved readability and maintainability.
|
||||||
|
|
||||||
|
- Updated and cleaned up test cases for deferreds and promises.
|
||||||
|
- Reduced timeouts in tests for quicker execution.
|
||||||
|
- Added expectations for promise status and duration.
|
||||||
|
|
||||||
|
## 2025-01-23 - 4.2.2 - fix(dependencies)
|
||||||
|
Update @git.zone/tstest and @types/node dependencies to latest versions
|
||||||
|
|
||||||
|
- Updated @git.zone/tstest from ^1.0.91 to ^1.0.92
|
||||||
|
- Updated @types/node from ^22.10.9 to ^22.10.10
|
||||||
|
|
||||||
|
## 2025-01-23 - 4.2.1 - fix(devDependencies)
|
||||||
|
Update development dependencies to latest versions
|
||||||
|
|
||||||
|
- Updated @git.zone/tstest to version ^1.0.91
|
||||||
|
- Updated @push.rocks/tapbundle to version ^5.5.6
|
||||||
|
- Updated @types/node to version ^22.10.9
|
||||||
|
|
||||||
|
## 2025-01-19 - 4.2.0 - feat(cumulativedeferred)
|
||||||
|
Added subDefer method to CumulativeDeferred
|
||||||
|
|
||||||
|
- Introduced `subDefer` method in CumulativeDeferred class to allow creating and adding new Deferreds easily.
|
||||||
|
|
||||||
|
## 2025-01-07 - 4.1.0 - feat(core)
|
||||||
|
Add fromCallback utility function for promisifying Node.js-style callback functions
|
||||||
|
|
||||||
|
- Added fromCallback function to convert Node.js-style callbacks into Promises.
|
||||||
|
|
||||||
|
## 2024-06-23 - 4.0.4 - fix(ci)
|
||||||
|
Remove .gitlab-ci.yml and update dependencies and metadata
|
||||||
|
|
||||||
|
- Removed .gitlab-ci.yml file
|
||||||
|
- Updated dependencies in package.json and npmextra.json
|
||||||
|
- Improved description and keywords for better package definition
|
||||||
|
|
||||||
|
## 2024-05-29 - 4.0.3 - Maintenance
|
||||||
|
Update project configuration and descriptions.
|
||||||
|
|
||||||
|
- Update project description
|
||||||
|
- Update tsconfig
|
||||||
|
- Update npmextra.json with githost field
|
||||||
|
|
||||||
|
## 2023-07-10 - 4.0.2 - Standards
|
||||||
|
Updates to adhere to new organizational standards.
|
||||||
|
|
||||||
|
- Switch to new org scheme
|
||||||
|
- Fix(core): update project settings
|
||||||
|
|
||||||
|
## 2023-04-17 - 4.0.0 - Major Release
|
||||||
|
Significant updates and switching to ESM.
|
||||||
|
|
||||||
|
- Fix(core): update project settings
|
||||||
|
|
||||||
|
## 2023-04-04 - 3.1.9 - Major Release
|
||||||
|
Breaking change: switch to ESM (ECMAScript Module).
|
||||||
|
|
||||||
|
## 2021-05-31 - 3.1.6 - Maintenance
|
||||||
|
Update project settings.
|
||||||
|
|
||||||
|
- Fix(core): update project settings
|
||||||
|
|
||||||
|
## 2021-04-23 - 3.1.4 - Maintenance
|
||||||
|
Update project settings.
|
||||||
|
|
||||||
|
- Fix(core): update project settings
|
||||||
|
|
||||||
|
## 2020-10-16 - 3.1.2 - Maintenance
|
||||||
|
Update project settings.
|
||||||
|
|
||||||
|
- Fix(core): update project settings
|
||||||
|
|
||||||
|
## 2020-10-15 - 3.0.9 - Feature
|
||||||
|
Added functionality for wrapping promises in timeouts.
|
||||||
|
|
||||||
|
- Feat(timeouts): allows the wrapping of promises in timeouts
|
||||||
|
|
||||||
|
## 2019-10-01 - 3.0.5 - Maintenance
|
||||||
|
Update project settings.
|
||||||
|
|
||||||
|
- Fix(core): update project settings
|
||||||
|
|
||||||
|
## 2019-03-26 - 3.0.0 - Major Release
|
||||||
|
Breaking change: remove util dependency.
|
||||||
|
|
||||||
|
- BREAKING CHANGE(remove util dependency and promisify functionality): update
|
||||||
|
|
||||||
|
## 2018-07-03 - 2.0.2 - Dependencies
|
||||||
|
Project now has zero dependencies.
|
||||||
|
|
||||||
|
- Fix(core): now has 0 dependencies
|
||||||
|
|
||||||
|
## 2018-03-16 - 1.1.8 - Major Release
|
||||||
|
Breaking change: switch scope to pushrocks.
|
||||||
|
|
||||||
|
- BREAKING CHANGE(scope): switch scope to pushrocks
|
||||||
|
|
||||||
|
## 2017-07-27 - 1.1.7 - Standards
|
||||||
|
Update to latest coding standards.
|
||||||
|
|
||||||
|
- Update to latest standards
|
||||||
|
|
||||||
|
## 2017-07-06 - 1.1.4 - Features and Improvements
|
||||||
|
Added polyfill and npmextra.json.
|
||||||
|
|
||||||
|
- Add polyfill
|
||||||
|
- Add npmextra.json
|
||||||
|
|
||||||
|
## 2017-07-06 - 1.1.2 - CI Maintenance
|
||||||
|
Updated continuous integration configuration.
|
||||||
|
|
||||||
|
- Update ci
|
29
dist/index.d.ts
vendored
29
dist/index.d.ts
vendored
@ -1,29 +0,0 @@
|
|||||||
import 'typings-global';
|
|
||||||
export interface IResolve<T> {
|
|
||||||
(value?: T | Promise<T>): void;
|
|
||||||
}
|
|
||||||
export interface IReject {
|
|
||||||
(reason?: any): void;
|
|
||||||
}
|
|
||||||
export declare type TDeferredStatus = 'pending' | 'fulfilled' | 'rejected';
|
|
||||||
export declare class Deferred<T> {
|
|
||||||
promise: Promise<T>;
|
|
||||||
resolve: IResolve<T>;
|
|
||||||
reject: IReject;
|
|
||||||
status: TDeferredStatus;
|
|
||||||
constructor();
|
|
||||||
}
|
|
||||||
export declare let defer: <T>() => Deferred<T>;
|
|
||||||
/**
|
|
||||||
* Creates a new resolved promise for the provided value.
|
|
||||||
*/
|
|
||||||
export declare let resolvedPromise: <T>(value?: T) => Promise<T>;
|
|
||||||
/**
|
|
||||||
* Creates a new rejected promise for the provided reason.
|
|
||||||
*/
|
|
||||||
export declare let rejectedPromise: (err: any) => Promise<never>;
|
|
||||||
export declare let promisify: {
|
|
||||||
(fn: Function): Function;
|
|
||||||
custom: symbol;
|
|
||||||
};
|
|
||||||
export declare let map: <T>(inputArg: T[], functionArg: any) => Promise<any[]>;
|
|
57
dist/index.js
vendored
57
dist/index.js
vendored
@ -1,57 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
||||||
return new (P || (P = Promise))(function (resolve, reject) {
|
|
||||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
||||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
||||||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
|
||||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
||||||
});
|
|
||||||
};
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
require("typings-global");
|
|
||||||
const util = require("util");
|
|
||||||
class Deferred {
|
|
||||||
constructor() {
|
|
||||||
this.promise = new Promise((resolve, reject) => {
|
|
||||||
this.resolve = resolve;
|
|
||||||
this.reject = reject;
|
|
||||||
this.status = 'pending';
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.Deferred = Deferred;
|
|
||||||
exports.defer = () => {
|
|
||||||
return new Deferred();
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* Creates a new resolved promise for the provided value.
|
|
||||||
*/
|
|
||||||
exports.resolvedPromise = (value) => {
|
|
||||||
return Promise.resolve(value);
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* Creates a new rejected promise for the provided reason.
|
|
||||||
*/
|
|
||||||
exports.rejectedPromise = (err) => {
|
|
||||||
return Promise.reject(err);
|
|
||||||
};
|
|
||||||
exports.promisify = util.promisify;
|
|
||||||
// polyfill
|
|
||||||
if (!exports.promisify) {
|
|
||||||
exports.promisify = require('util.promisify');
|
|
||||||
}
|
|
||||||
exports.map = (inputArg, functionArg) => __awaiter(this, void 0, void 0, function* () {
|
|
||||||
let promisifedFunction = exports.promisify(functionArg);
|
|
||||||
let promiseArray = [];
|
|
||||||
let resultArray = [];
|
|
||||||
for (let item of inputArg) {
|
|
||||||
let promise = promisifedFunction(item);
|
|
||||||
promiseArray.push(promise);
|
|
||||||
promise.then(x => {
|
|
||||||
resultArray.push(x);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
yield Promise.all(promiseArray);
|
|
||||||
return resultArray;
|
|
||||||
});
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUEsMEJBQXVCO0FBQ3ZCLDZCQUE0QjtBQVk1QjtJQUtFO1FBQ0UsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBSSxDQUFDLE9BQU8sRUFBRSxNQUFNO1lBQzVDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO1lBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO1lBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFBO1FBQ3pCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGO0FBWkQsNEJBWUM7QUFFVSxRQUFBLEtBQUssR0FBRztJQUNqQixNQUFNLENBQUMsSUFBSSxRQUFRLEVBQUssQ0FBQTtBQUMxQixDQUFDLENBQUE7QUFFRDs7R0FFRztBQUNRLFFBQUEsZUFBZSxHQUFHLENBQUksS0FBUztJQUN4QyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUMvQixDQUFDLENBQUE7QUFFRDs7R0FFRztBQUNRLFFBQUEsZUFBZSxHQUFHLENBQUMsR0FBRztJQUMvQixNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUM1QixDQUFDLENBQUE7QUFFVSxRQUFBLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFBO0FBRXJDLFdBQVc7QUFDWCxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ2YsaUJBQVMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtBQUN2QyxDQUFDO0FBQ1UsUUFBQSxHQUFHLEdBQUcsQ0FBVyxRQUFhLEVBQUMsV0FBVztJQUNuRCxJQUFJLGtCQUFrQixHQUFHLGlCQUFTLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDL0MsSUFBSSxZQUFZLEdBQW1CLEVBQUUsQ0FBQTtJQUNyQyxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUE7SUFDcEIsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQztRQUMxQixJQUFJLE9BQU8sR0FBaUIsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDcEQsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUMxQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDWixXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3JCLENBQUMsQ0FBQyxDQUFBO0lBRUosQ0FBQztJQUNELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUMvQixNQUFNLENBQUMsV0FBVyxDQUFBO0FBQ3BCLENBQUMsQ0FBQSxDQUFBIn0=
|
|
@ -1,81 +0,0 @@
|
|||||||
# smartq
|
|
||||||
dropin replacement for q
|
|
||||||
|
|
||||||
## Availabililty
|
|
||||||
[](https://www.npmjs.com/package/smartq)
|
|
||||||
[](https://GitLab.com/pushrocks/smartq)
|
|
||||||
[](https://github.com/pushrocks/smartq)
|
|
||||||
[](https://pushrocks.gitlab.io/smartq/)
|
|
||||||
|
|
||||||
## Status for master
|
|
||||||
[](https://GitLab.com/pushrocks/smartq/commits/master)
|
|
||||||
[](https://GitLab.com/pushrocks/smartq/commits/master)
|
|
||||||
[](https://www.npmjs.com/package/smartq)
|
|
||||||
[](https://david-dm.org/pushrocks/smartq)
|
|
||||||
[](https://www.bithound.io/github/pushrocks/smartq/master/dependencies/npm)
|
|
||||||
[](https://www.bithound.io/github/pushrocks/smartq)
|
|
||||||
[](https://nodejs.org/dist/latest-v6.x/docs/api/)
|
|
||||||
[](https://nodejs.org/dist/latest-v6.x/docs/api/)
|
|
||||||
[](http://standardjs.com/)
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
Use TypeScript for best in class instellisense.
|
|
||||||
|
|
||||||
> Note: smartq uses native ES6 promises
|
|
||||||
> smartq does not repeat any native functions, so for things like .all() simply use Promise.all()
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
import * as q from 'smartq'
|
|
||||||
|
|
||||||
// Deferred
|
|
||||||
// -----------------------------------------------
|
|
||||||
let myAsyncFunction = (): Promise<string> => {
|
|
||||||
let done = q.defer<string>() // returns your typical Deferred object
|
|
||||||
setTimeout(() => {
|
|
||||||
done.resolve('hi') // will throw type error for other types than string as argument ;)
|
|
||||||
},6000)
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
|
|
||||||
let myAsyncFunction2 = async () => {
|
|
||||||
let aString = await myAsyncFunction()
|
|
||||||
console.log(aString) // will log 'hi' to console
|
|
||||||
}
|
|
||||||
|
|
||||||
myAsyncFunction2();
|
|
||||||
|
|
||||||
|
|
||||||
// Resolved and Rejected promises
|
|
||||||
// ------------------------------------------------
|
|
||||||
q.resolvedPromise(`I'll get logged to console soon`)
|
|
||||||
.then(x => {
|
|
||||||
console.log(x)
|
|
||||||
})
|
|
||||||
|
|
||||||
q.rejectedPromise(`what a lovely error message`)
|
|
||||||
.then(() => {
|
|
||||||
console.log('This never makes it to console')
|
|
||||||
}/*, alternatively put a reject function here */)
|
|
||||||
.catch(err => {
|
|
||||||
console.log(err)
|
|
||||||
})
|
|
||||||
|
|
||||||
// Promisify (typed)
|
|
||||||
// ------------------------------------------------
|
|
||||||
|
|
||||||
let myCallbackedFunction = (someString: string, someNumber: number, cb) => {
|
|
||||||
cb(null, someString)
|
|
||||||
}
|
|
||||||
|
|
||||||
let myPromisedFunction = q.promisify(myCallbackFunction)
|
|
||||||
myPromisedFunction('helloThere', 2).then(x => {
|
|
||||||
console.log(x) // will log 'helloThere' to console
|
|
||||||
})
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
For further information read the linked docs at the top of this README.
|
|
||||||
|
|
||||||
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
|
|
||||||
|
|
||||||
[](https://push.rocks)
|
|
@ -1,7 +1,31 @@
|
|||||||
{
|
{
|
||||||
"npmci": {
|
"npmci": {
|
||||||
"globalNpmTools": [
|
"npmGlobalTools": [],
|
||||||
"npmts"
|
"npmAccessLevel": "public"
|
||||||
|
},
|
||||||
|
"gitzone": {
|
||||||
|
"projectType": "npm",
|
||||||
|
"module": {
|
||||||
|
"githost": "code.foss.global",
|
||||||
|
"gitscope": "push.rocks",
|
||||||
|
"gitrepo": "smartpromise",
|
||||||
|
"description": "A TypeScript library for managing promises and Deferred constructs, simplifying asynchronous programming.",
|
||||||
|
"npmPackagename": "@push.rocks/smartpromise",
|
||||||
|
"license": "MIT",
|
||||||
|
"keywords": [
|
||||||
|
"promise",
|
||||||
|
"deferred",
|
||||||
|
"async",
|
||||||
|
"promisify",
|
||||||
|
"cumulative deferred",
|
||||||
|
"timeout",
|
||||||
|
"typescript",
|
||||||
|
"asynchronous",
|
||||||
|
"utilities"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"tsdoc": {
|
||||||
|
"legal": "\n## License and Legal Information\n\nThis repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository. \n\n**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.\n\n### Trademarks\n\nThis project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.\n\n### Company Information\n\nTask Venture Capital GmbH \nRegistered at District court Bremen HRB 35230 HB, Germany\n\nFor any legal inquiries or if you require further information, please contact us via email at hello@task.vc.\n\nBy using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.\n"
|
||||||
|
}
|
||||||
}
|
}
|
63
package.json
63
package.json
@ -1,27 +1,64 @@
|
|||||||
{
|
{
|
||||||
"name": "smartq",
|
"name": "@push.rocks/smartpromise",
|
||||||
"version": "1.1.7",
|
"private": false,
|
||||||
"description": "dropin replacement for q",
|
"version": "4.2.3",
|
||||||
"main": "dist/index.js",
|
"description": "A TypeScript library for managing promises and Deferred constructs, simplifying asynchronous programming.",
|
||||||
"typings": "dist/index.d.ts",
|
"main": "dist_ts/index.js",
|
||||||
|
"typings": "dist_ts/index.d.ts",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "(npmts)"
|
"test": "(tstest test/ --web)",
|
||||||
|
"build": "(tsbuild --web --allowimplicitany)",
|
||||||
|
"buildDocs": "tsdoc"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "git+ssh://git@gitlab.com/pushrocks/smartq.git"
|
"url": "https://code.foss.global/push.rocks/smartpromise.git"
|
||||||
},
|
},
|
||||||
"author": "Lossless GmbH",
|
"author": "Lossless GmbH",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://gitlab.com/pushrocks/smartq/issues"
|
"url": "https://gitlab.com/pushrocks/smartq/issues"
|
||||||
},
|
},
|
||||||
"homepage": "https://gitlab.com/pushrocks/smartq#README",
|
"homepage": "https://code.foss.global/push.rocks/smartpromise",
|
||||||
"dependencies": {
|
|
||||||
"typings-global": "^1.0.19",
|
|
||||||
"util.promisify": "^1.0.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"tapbundle": "^1.1.0"
|
"@git.zone/tsbuild": "^2.2.0",
|
||||||
|
"@git.zone/tsrun": "^1.3.3",
|
||||||
|
"@git.zone/tstest": "^1.0.92",
|
||||||
|
"@push.rocks/tapbundle": "^5.5.6",
|
||||||
|
"@types/node": "^22.10.10"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"ts/**/*",
|
||||||
|
"ts_web/**/*",
|
||||||
|
"dist/**/*",
|
||||||
|
"dist_*/**/*",
|
||||||
|
"dist_ts/**/*",
|
||||||
|
"dist_ts_web/**/*",
|
||||||
|
"assets/**/*",
|
||||||
|
"cli.js",
|
||||||
|
"npmextra.json",
|
||||||
|
"readme.md"
|
||||||
|
],
|
||||||
|
"browserslist": [
|
||||||
|
"last 1 chrome versions"
|
||||||
|
],
|
||||||
|
"type": "module",
|
||||||
|
"keywords": [
|
||||||
|
"promise",
|
||||||
|
"deferred",
|
||||||
|
"async",
|
||||||
|
"promisify",
|
||||||
|
"cumulative deferred",
|
||||||
|
"timeout",
|
||||||
|
"typescript",
|
||||||
|
"asynchronous",
|
||||||
|
"utilities"
|
||||||
|
],
|
||||||
|
"pnpm": {
|
||||||
|
"onlyBuiltDependencies": [
|
||||||
|
"esbuild",
|
||||||
|
"mongodb-memory-server",
|
||||||
|
"puppeteer"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
9697
pnpm-lock.yaml
generated
Normal file
9697
pnpm-lock.yaml
generated
Normal file
File diff suppressed because it is too large
Load Diff
1
readme.hints.md
Normal file
1
readme.hints.md
Normal file
@ -0,0 +1 @@
|
|||||||
|
|
311
readme.md
Normal file
311
readme.md
Normal file
@ -0,0 +1,311 @@
|
|||||||
|
# @push.rocks/smartpromise
|
||||||
|
|
||||||
|
A library for simple promises and Deferred constructs with TypeScript support.
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @push.rocks/smartpromise --save
|
||||||
|
```
|
||||||
|
|
||||||
|
This module is designed to be used with TypeScript for the best developer experience, providing type safety and IntelliSense in your IDE.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
`@push.rocks/smartpromise` simplifies the use of promises and deferred constructs in TypeScript, offering a set of utility functions that extend native Promise capabilities in specific scenarios. This guide walks you through its functionalities, showcasing how to leverage this library in a TypeScript project.
|
||||||
|
|
||||||
|
### Setting Up Your Project
|
||||||
|
|
||||||
|
Ensure your TypeScript project is configured to support ES Module syntax. In your `tsconfig.json`, you should have:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"module": "ESNext",
|
||||||
|
"target": "ESNext",
|
||||||
|
"moduleResolution": "node"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Basic Usage
|
||||||
|
|
||||||
|
#### Creating a Deferred
|
||||||
|
|
||||||
|
Deferred objects in `@push.rocks/smartpromise` give you more control over your promises, allowing for manual resolution or rejection beyond the initial executor function.
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { defer } from '@push.rocks/smartpromise';
|
||||||
|
|
||||||
|
async function exampleDeferred(): Promise<string> {
|
||||||
|
const myDeferred = defer<string>();
|
||||||
|
|
||||||
|
// Simulate an async task
|
||||||
|
setTimeout(() => {
|
||||||
|
myDeferred.resolve('Hello, Deferred!');
|
||||||
|
}, 1000);
|
||||||
|
|
||||||
|
return myDeferred.promise;
|
||||||
|
}
|
||||||
|
|
||||||
|
exampleDeferred().then((result) => console.log(result));
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Cumulative Deferred
|
||||||
|
|
||||||
|
For scenarios where multiple asynchronous tasks need to be tracked collectively before proceeding, use `CumulativeDeferred`. It waits for all added promises to resolve.
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { cumulativeDefer } from '@push.rocks/smartpromise';
|
||||||
|
|
||||||
|
async function exampleCumulativeDeferred() {
|
||||||
|
const myCumulativeDeferred = cumulativeDefer();
|
||||||
|
|
||||||
|
for (let i = 0; i < 5; i++) {
|
||||||
|
myCumulativeDeferred.addPromise(new Promise((resolve) => setTimeout(resolve, 1000 * i)));
|
||||||
|
}
|
||||||
|
|
||||||
|
await myCumulativeDeferred.promise;
|
||||||
|
console.log('All tasks completed!');
|
||||||
|
}
|
||||||
|
|
||||||
|
exampleCumulativeDeferred();
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Utilizing Resolved and Rejected Promises
|
||||||
|
|
||||||
|
Quickly create already resolved or rejected promises for testing or initialization purposes.
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { resolvedPromise, rejectedPromise } from '@push.rocks/smartpromise';
|
||||||
|
|
||||||
|
resolvedPromise('immediately resolved').then(console.log);
|
||||||
|
rejectedPromise('immediately rejected').catch(console.error);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Advanced Use Cases
|
||||||
|
|
||||||
|
#### Promisify Callback Functions
|
||||||
|
|
||||||
|
`@push.rocks/smartpromise` does not directly provide a `promisify` function like Node.js `util` module, but you can easily integrate existing functions or use third-party libraries to convert callback-based functions into promises.
|
||||||
|
|
||||||
|
#### Handling Timeouts and Continuations
|
||||||
|
|
||||||
|
Managing timeouts or long-running promises gets easier with helper functions.
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { timeoutWrap, timeoutAndContinue } from '@push.rocks/smartpromise';
|
||||||
|
|
||||||
|
async function exampleTimeout() {
|
||||||
|
const myPromise = new Promise((resolve) => setTimeout(() => resolve('Done!'), 2000));
|
||||||
|
|
||||||
|
// Will reject if the promise does not resolve within 1 second
|
||||||
|
try {
|
||||||
|
const result = await timeoutWrap(myPromise, 1000);
|
||||||
|
console.log(result);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Promise timed out');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Continues after 1 second, regardless of whether the promise has resolved
|
||||||
|
const result = await timeoutAndContinue(myPromise, 1000);
|
||||||
|
console.log(result); // May log `null` if the original promise did not resolve in time
|
||||||
|
}
|
||||||
|
|
||||||
|
exampleTimeout();
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Map and Reduce Asynchronous Functions
|
||||||
|
|
||||||
|
Suppose you have a collection of items that you need to process asynchronously. You can use the `map` function to apply an asynchronous function to each item in the array and wait for all the promises to resolve.
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { map } from '@push.rocks/smartpromise';
|
||||||
|
|
||||||
|
async function processData(items: string[]): Promise<string[]> {
|
||||||
|
return map(items, async (item) => {
|
||||||
|
// Simulate an async operation
|
||||||
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
||||||
|
return item.toUpperCase();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
processData(['hello', 'world']).then(console.log);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Handling Complex Promise Scenarios
|
||||||
|
|
||||||
|
#### Managing Multiple Deferreds
|
||||||
|
|
||||||
|
If you have multiple deferred objects and you want to manage them collectively, you can do so using the `CumulativeDeferred` class. This is especially useful when you have a dynamic number of deferreds to resolve.
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { defer, cumulativeDefer } from '@push.rocks/smartpromise';
|
||||||
|
|
||||||
|
async function exampleComplexDeferred(): Promise<void> {
|
||||||
|
const task1 = defer<string>();
|
||||||
|
const task2 = defer<string>();
|
||||||
|
const cumulative = cumulativeDefer();
|
||||||
|
|
||||||
|
cumulative.addPromise(task1.promise);
|
||||||
|
cumulative.addPromise(task2.promise);
|
||||||
|
|
||||||
|
// Simulate async tasks
|
||||||
|
setTimeout(() => task1.resolve('Task 1 complete'), 1000);
|
||||||
|
setTimeout(() => task2.resolve('Task 2 complete'), 2000);
|
||||||
|
|
||||||
|
await cumulative.promise;
|
||||||
|
|
||||||
|
console.log('All tasks completed');
|
||||||
|
}
|
||||||
|
|
||||||
|
exampleComplexDeferred();
|
||||||
|
```
|
||||||
|
|
||||||
|
### Other Utilities
|
||||||
|
|
||||||
|
#### Race Condition Handling with `getFirstTrueOrFalse`
|
||||||
|
|
||||||
|
This helper function resolves immediately when one of the provided promises resolves to `true` or when all promises are resolved to `false`.
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { getFirstTrueOrFalse } from '@push.rocks/smartpromise';
|
||||||
|
|
||||||
|
async function exampleRaceCondition() {
|
||||||
|
const task1 = new Promise<boolean>((resolve) => setTimeout(() => resolve(true), 1000));
|
||||||
|
const task2 = new Promise<boolean>((resolve) => setTimeout(() => resolve(false), 2000));
|
||||||
|
|
||||||
|
const result = await getFirstTrueOrFalse([task1, task2]);
|
||||||
|
console.log(result); // Outputs: true
|
||||||
|
}
|
||||||
|
|
||||||
|
exampleRaceCondition();
|
||||||
|
```
|
||||||
|
|
||||||
|
### Complete Use Case
|
||||||
|
|
||||||
|
Let's create a comprehensive example that showcases multiple features of `@push.rocks/smartpromise`.
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import {
|
||||||
|
defer,
|
||||||
|
cumulativeDefer,
|
||||||
|
resolvedPromise,
|
||||||
|
rejectedPromise,
|
||||||
|
timeoutWrap,
|
||||||
|
timeoutAndContinue,
|
||||||
|
map,
|
||||||
|
getFirstTrueOrFalse,
|
||||||
|
} from '@push.rocks/smartpromise';
|
||||||
|
|
||||||
|
async function completeUseCaseExample() {
|
||||||
|
console.log('Starting Complete Use Case Example!');
|
||||||
|
|
||||||
|
// Using Deferred
|
||||||
|
const myDeferred = defer<string>();
|
||||||
|
setTimeout(() => myDeferred.resolve('Deferred Resolved!'), 500);
|
||||||
|
console.log(await myDeferred.promise); // Outputs: "Deferred Resolved!"
|
||||||
|
|
||||||
|
// Using Cumulative Deferred
|
||||||
|
const myCumulativeDeferred = cumulativeDefer();
|
||||||
|
myCumulativeDeferred.addPromise(new Promise((resolve) => setTimeout(() => resolve('Task 1'), 1000)));
|
||||||
|
myCumulativeDeferred.addPromise(new Promise((resolve) => setTimeout(() => resolve('Task 2'), 2000)));
|
||||||
|
await myCumulativeDeferred.promise;
|
||||||
|
console.log('All cumulative tasks completed');
|
||||||
|
|
||||||
|
// Using Resolved and Rejected Promises
|
||||||
|
await resolvedPromise('Instant Resolve').then(console.log); // Outputs: "Instant Resolve"
|
||||||
|
await rejectedPromise('Instant Reject').catch(console.error); // Outputs: "Instant Reject"
|
||||||
|
|
||||||
|
// Using timeoutWrap
|
||||||
|
try {
|
||||||
|
const delayedPromise = new Promise((resolve) => setTimeout(() => resolve('Finished'), 3000));
|
||||||
|
const result = await timeoutWrap(delayedPromise, 1000);
|
||||||
|
console.log(result);
|
||||||
|
} catch (e) {
|
||||||
|
console.error('Timeout occurred'); // Outputs: "Timeout occurred"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Using timeoutAndContinue
|
||||||
|
const resultContinue = await timeoutAndContinue(
|
||||||
|
new Promise((resolve) => setTimeout(() => resolve('Finished eventually'), 3000)),
|
||||||
|
1000
|
||||||
|
);
|
||||||
|
console.log(resultContinue); // Outputs: null (since it didn't resolve in 1 second)
|
||||||
|
|
||||||
|
// Using Map
|
||||||
|
const items = ['a', 'b', 'c'];
|
||||||
|
const processedItems = await map(items, async (item) => {
|
||||||
|
await new Promise((resolve) => setTimeout(resolve, 500));
|
||||||
|
return item.toUpperCase();
|
||||||
|
});
|
||||||
|
console.log(processedItems); // Outputs: ['A', 'B', 'C']
|
||||||
|
|
||||||
|
// Using getFirstTrueOrFalse
|
||||||
|
const raceResults = await getFirstTrueOrFalse([
|
||||||
|
new Promise<boolean>((resolve) => setTimeout(() => resolve(false), 1000)),
|
||||||
|
new Promise<boolean>((resolve) => setTimeout(() => resolve(true), 2000)),
|
||||||
|
]);
|
||||||
|
console.log(raceResults); // Outputs: true
|
||||||
|
|
||||||
|
console.log('Complete Use Case Example Finished!');
|
||||||
|
}
|
||||||
|
|
||||||
|
completeUseCaseExample();
|
||||||
|
```
|
||||||
|
|
||||||
|
### Testing Your Code
|
||||||
|
|
||||||
|
Testing is crucial to ensure the reliability of your asynchronous workflows. You can write tests using the `@push.rocks/tapbundle` library to create unit tests for your promises and deferred constructs.
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { tap, expect } from '@push.rocks/tapbundle';
|
||||||
|
import * as smartpromise from '@push.rocks/smartpromise';
|
||||||
|
|
||||||
|
tap.test('should resolve a deferred promise', async () => {
|
||||||
|
const deferred = smartpromise.defer<string>();
|
||||||
|
deferred.resolve('Resolved!');
|
||||||
|
const result = await deferred.promise;
|
||||||
|
expect(result).toEqual('Resolved!');
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test('should timeout a long-running promise', async () => {
|
||||||
|
const longRunningPromise = new Promise((resolve) => setTimeout(resolve, 2000));
|
||||||
|
try {
|
||||||
|
await smartpromise.timeoutWrap(longRunningPromise, 1000);
|
||||||
|
} catch (err) {
|
||||||
|
expect(err.message).toEqual('timeout');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test('should map async function to an array', async () => {
|
||||||
|
const inputArray = ['a', 'b'];
|
||||||
|
const result = await smartpromise.map(inputArray, async (item) => item.toUpperCase());
|
||||||
|
expect(result).toEqual(['A', 'B']);
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.start();
|
||||||
|
```
|
||||||
|
|
||||||
|
By following this guide and using the examples provided, you should be able to effectively use `@push.rocks/smartpromise` for managing promises and deferred constructs in your TypeScript project. The library's extensive utility functions, combined with TypeScript support, make it a powerful tool for modern asynchronous programming needs.
|
||||||
|
|
||||||
|
Explore the full range of features and feel free to read through the source code to learn more about the implementation details. Happy coding!
|
||||||
|
|
||||||
|
## License and Legal Information
|
||||||
|
|
||||||
|
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
|
||||||
|
|
||||||
|
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
### Trademarks
|
||||||
|
|
||||||
|
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
|
||||||
|
|
||||||
|
### Company Information
|
||||||
|
|
||||||
|
Task Venture Capital GmbH
|
||||||
|
Registered at District court Bremen HRB 35230 HB, Germany
|
||||||
|
|
||||||
|
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
|
||||||
|
|
||||||
|
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.
|
27
test/test.both.ts
Normal file
27
test/test.both.ts
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
import { expect, tap } from '@push.rocks/tapbundle';
|
||||||
|
import * as smartpromise from '../ts/index.js';
|
||||||
|
|
||||||
|
tap.test('should return a Deferred for .defer()', async () => {
|
||||||
|
const myDeferred = smartpromise.defer();
|
||||||
|
myDeferred.resolve();
|
||||||
|
await myDeferred.promise;
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test('should let types flow through the Promise', async () => {
|
||||||
|
const myString = 'someString';
|
||||||
|
const myDeferred = smartpromise.defer<string>();
|
||||||
|
myDeferred.resolve(myString);
|
||||||
|
const result = await myDeferred.promise;
|
||||||
|
expect(result).toEqual('someString');
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test('should map callbacks', async () => {
|
||||||
|
const inputArray = ['hi', 'awesome'];
|
||||||
|
const myPromisified = async (myInput) => {
|
||||||
|
return myInput;
|
||||||
|
};
|
||||||
|
const result = await smartpromise.map(inputArray, myPromisified);
|
||||||
|
expect(result).toEqual(inputArray);
|
||||||
|
});
|
||||||
|
|
||||||
|
export default tap.start();
|
57
test/test.readme.node.ts
Normal file
57
test/test.readme.node.ts
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
import * as smartpromise from '../ts/index.js';
|
||||||
|
import { tap, expect } from '@push.rocks/tapbundle';
|
||||||
|
|
||||||
|
tap.test('simple deferred should resolve with correct value', async () => {
|
||||||
|
const done = smartpromise.defer<string>();
|
||||||
|
let result: string | undefined;
|
||||||
|
|
||||||
|
done.promise.then((stringArg) => {
|
||||||
|
result = stringArg;
|
||||||
|
});
|
||||||
|
done.resolve('hello');
|
||||||
|
|
||||||
|
await done.promise;
|
||||||
|
expect(result).toEqual('hello');
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test('deferred should work with async functions and track status/duration', async () => {
|
||||||
|
const myAsyncFunction = async (): Promise<string> => {
|
||||||
|
const done = smartpromise.defer<string>();
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
done.resolve('hi');
|
||||||
|
}, 100); // reduced timeout for testing
|
||||||
|
|
||||||
|
expect(done.status).toEqual('pending');
|
||||||
|
await done.promise;
|
||||||
|
expect(done.status).toEqual('fulfilled');
|
||||||
|
expect(done.duration).toBeGreaterThan(0);
|
||||||
|
|
||||||
|
return done.promise;
|
||||||
|
};
|
||||||
|
|
||||||
|
const result = await myAsyncFunction();
|
||||||
|
expect(result).toEqual('hi');
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test('resolvedPromise should resolve immediately with correct value', async () => {
|
||||||
|
const message = `I'll get logged to console soon`;
|
||||||
|
const result = await smartpromise.resolvedPromise(message);
|
||||||
|
expect(result).toEqual(message);
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test('rejectedPromise should reject with correct error message', async () => {
|
||||||
|
const errorMessage = 'what a lovely error message';
|
||||||
|
let caught = false;
|
||||||
|
|
||||||
|
try {
|
||||||
|
await smartpromise.rejectedPromise(errorMessage);
|
||||||
|
} catch (err) {
|
||||||
|
caught = true;
|
||||||
|
expect(err).toEqual(errorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(caught).toEqual(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
export default tap.start();
|
36
test/test.ts
36
test/test.ts
@ -1,36 +0,0 @@
|
|||||||
import { expect, tap } from 'tapbundle'
|
|
||||||
import * as q from '../dist/index'
|
|
||||||
|
|
||||||
let myCallback = (someValue1: string, cb?) => {
|
|
||||||
cb(null, someValue1)
|
|
||||||
}
|
|
||||||
|
|
||||||
tap.test('should return a Deferred for .defer()', async () => {
|
|
||||||
let myDeferred = q.defer()
|
|
||||||
let expectPromise = expect(myDeferred.promise).to.eventually.be.fulfilled
|
|
||||||
myDeferred.resolve()
|
|
||||||
return expectPromise
|
|
||||||
})
|
|
||||||
|
|
||||||
tap.test('should let types flow through the Promise', async () => {
|
|
||||||
let myString = 'someString'
|
|
||||||
let myDeferred = q.defer<string>()
|
|
||||||
let expectPromise = expect(myDeferred.promise).to.eventually.equal('someString')
|
|
||||||
myDeferred.resolve(myString)
|
|
||||||
return expectPromise
|
|
||||||
})
|
|
||||||
|
|
||||||
tap.test('should promisify a callback', async () => {
|
|
||||||
let myPromisified = q.promisify(myCallback)
|
|
||||||
let expectPromise = expect(myPromisified('hi')).to.eventually.equal('hi')
|
|
||||||
return await expectPromise
|
|
||||||
})
|
|
||||||
|
|
||||||
tap.test('should map callbacks', async () => {
|
|
||||||
let inputArray = ['hi', 'awesome']
|
|
||||||
let myPromisified = q.promisify(myCallback)
|
|
||||||
let expectPromise = expect(q.map(inputArray, myPromisified)).to.eventually.deep.equal(inputArray)
|
|
||||||
return expectPromise
|
|
||||||
})
|
|
||||||
|
|
||||||
tap.start()
|
|
8
ts/00_commitinfo_data.ts
Normal file
8
ts/00_commitinfo_data.ts
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
/**
|
||||||
|
* autocreated commitinfo by @push.rocks/commitinfo
|
||||||
|
*/
|
||||||
|
export const commitinfo = {
|
||||||
|
name: '@push.rocks/smartpromise',
|
||||||
|
version: '4.2.3',
|
||||||
|
description: 'A TypeScript library for managing promises and Deferred constructs, simplifying asynchronous programming.'
|
||||||
|
}
|
141
ts/index.ts
141
ts/index.ts
@ -1,66 +1,101 @@
|
|||||||
import 'typings-global'
|
import { defer } from './smartpromise.classes.deferred.js';
|
||||||
import * as util from 'util'
|
|
||||||
|
|
||||||
export interface IResolve<T> {
|
export * from './smartpromise.classes.cumulativedeferred.js';
|
||||||
(value?: T | Promise<T>): void
|
export * from './smartpromise.classes.deferred.js';
|
||||||
}
|
|
||||||
|
|
||||||
export interface IReject {
|
|
||||||
(reason?: any): void
|
|
||||||
}
|
|
||||||
|
|
||||||
export type TDeferredStatus = 'pending' | 'fulfilled' | 'rejected'
|
|
||||||
|
|
||||||
export class Deferred<T> {
|
|
||||||
promise: Promise<T>
|
|
||||||
resolve: IResolve<T>
|
|
||||||
reject: IReject
|
|
||||||
status: TDeferredStatus
|
|
||||||
constructor () {
|
|
||||||
this.promise = new Promise<T>((resolve, reject) => {
|
|
||||||
this.resolve = resolve
|
|
||||||
this.reject = reject
|
|
||||||
this.status = 'pending'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export let defer = <T>() => {
|
|
||||||
return new Deferred<T>()
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new resolved promise for the provided value.
|
* Creates a new resolved promise for the provided value.
|
||||||
*/
|
*/
|
||||||
export let resolvedPromise = <T>(value?: T): Promise<T> => {
|
export const resolvedPromise = <T>(value?: T): Promise<T> => {
|
||||||
return Promise.resolve(value)
|
return Promise.resolve(value);
|
||||||
}
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new rejected promise for the provided reason.
|
* Creates a new rejected promise for the provided reason.
|
||||||
*/
|
*/
|
||||||
export let rejectedPromise = (err) => {
|
export const rejectedPromise = (err) => {
|
||||||
return Promise.reject(err)
|
return Promise.reject(err);
|
||||||
|
};
|
||||||
|
|
||||||
|
interface IAsyncFunction<T> {
|
||||||
|
(someArg: T): Promise<T>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export let promisify = util.promisify
|
/**
|
||||||
|
* accepts an array of inputs and a function that accepts the input.
|
||||||
// polyfill
|
* runs all items with the function and returns the result array when all items have run
|
||||||
if (!promisify) {
|
* @param inputArg
|
||||||
promisify = require('util.promisify')
|
* @param functionArg
|
||||||
}
|
*/
|
||||||
export let map = async <T> (inputArg: T[],functionArg) => {
|
export const map = async <T>(inputArg: T[], functionArg: IAsyncFunction<T>) => {
|
||||||
let promisifedFunction = promisify(functionArg)
|
const promiseArray: Promise<any>[] = [];
|
||||||
let promiseArray: Promise<any>[] = []
|
const resultArray = [];
|
||||||
let resultArray = []
|
for (const item of inputArg) {
|
||||||
for (let item of inputArg) {
|
const promise: Promise<any> = functionArg(item);
|
||||||
let promise: Promise<any> = promisifedFunction(item)
|
promiseArray.push(promise);
|
||||||
promiseArray.push(promise)
|
promise.then((x) => {
|
||||||
promise.then(x => {
|
resultArray.push(x);
|
||||||
resultArray.push(x)
|
});
|
||||||
})
|
|
||||||
|
|
||||||
}
|
}
|
||||||
await Promise.all(promiseArray)
|
await Promise.all(promiseArray);
|
||||||
return resultArray
|
return resultArray;
|
||||||
}
|
};
|
||||||
|
|
||||||
|
export const timeoutWrap = async <T = any>(
|
||||||
|
promiseArg: Promise<T>,
|
||||||
|
timeoutInMsArg: number,
|
||||||
|
rejectArg = true
|
||||||
|
) => {
|
||||||
|
return new Promise<T>((resolve, reject) => {
|
||||||
|
setTimeout(() => {
|
||||||
|
if (rejectArg) {
|
||||||
|
reject(new Error('timeout'));
|
||||||
|
} else {
|
||||||
|
resolve(null);
|
||||||
|
}
|
||||||
|
}, timeoutInMsArg);
|
||||||
|
promiseArg.then(resolve, reject);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export const timeoutAndContinue = async <T = any>(
|
||||||
|
promiseArg: Promise<T>,
|
||||||
|
timeoutInMsArg = 60000
|
||||||
|
) => {
|
||||||
|
return timeoutWrap(promiseArg, timeoutInMsArg, false);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getFirstTrueOrFalse = async (promisesArg: Promise<boolean>[]) => {
|
||||||
|
const done = defer<boolean>();
|
||||||
|
for (const promiseArg of promisesArg) {
|
||||||
|
promiseArg.then((resultArg) => {
|
||||||
|
if (resultArg === true) {
|
||||||
|
done.resolve(true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
Promise.all(promisesArg).then(() => {
|
||||||
|
done.resolve(false);
|
||||||
|
});
|
||||||
|
return done.promise;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts a Node.js-style callback-based function into a Promise.
|
||||||
|
* @param fn The function that expects a callback.
|
||||||
|
* @returns A Promise that resolves with the result of the function or rejects with an error.
|
||||||
|
*/
|
||||||
|
export const fromCallback = <T>(
|
||||||
|
fn: (callback: (err: NodeJS.ErrnoException | null, result?: T) => void) => void
|
||||||
|
): Promise<T> => {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
fn((err, result) => {
|
||||||
|
if (err) {
|
||||||
|
reject(err); // Reject the promise with the error
|
||||||
|
} else {
|
||||||
|
resolve(result as T); // Resolve the promise with the result
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
32
ts/smartpromise.classes.cumulativedeferred.ts
Normal file
32
ts/smartpromise.classes.cumulativedeferred.ts
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
import { defer } from "./smartpromise.classes.deferred.js";
|
||||||
|
|
||||||
|
export class CumulativeDeferred {
|
||||||
|
private accumulatedPromises: Promise<any>[] = [];
|
||||||
|
private deferred = defer();
|
||||||
|
public promise = this.deferred.promise;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
setTimeout(async () => {
|
||||||
|
while (this.accumulatedPromises.length > 0) {
|
||||||
|
const poppedPromise = this.accumulatedPromises.shift();
|
||||||
|
await poppedPromise;
|
||||||
|
}
|
||||||
|
this.deferred.resolve();
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public subDefer() {
|
||||||
|
const done = defer();
|
||||||
|
this.addPromise(done.promise);
|
||||||
|
return done;
|
||||||
|
}
|
||||||
|
|
||||||
|
public addPromise(promiseArg: Promise<any>) {
|
||||||
|
this.accumulatedPromises.push(promiseArg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export const cumulativeDefer = () => {
|
||||||
|
return new CumulativeDeferred();
|
||||||
|
}
|
54
ts/smartpromise.classes.deferred.ts
Normal file
54
ts/smartpromise.classes.deferred.ts
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
export interface IResolve<T> {
|
||||||
|
(value?: T | PromiseLike<T>): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IReject {
|
||||||
|
(reason?: any): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export type TDeferredStatus = 'pending' | 'fulfilled' | 'rejected';
|
||||||
|
|
||||||
|
export class Deferred<T> {
|
||||||
|
public promise: Promise<T>;
|
||||||
|
public resolve: IResolve<T>;
|
||||||
|
public reject: IReject;
|
||||||
|
public status: TDeferredStatus;
|
||||||
|
public claimed = false;
|
||||||
|
public claim() {
|
||||||
|
if (this.claimed) {
|
||||||
|
throw new Error('Deferred already claimed');
|
||||||
|
}
|
||||||
|
this.claimed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public startedAt: number;
|
||||||
|
public stoppedAt: number;
|
||||||
|
public get duration(): number {
|
||||||
|
if (this.stoppedAt) {
|
||||||
|
return this.stoppedAt - this.startedAt;
|
||||||
|
} else {
|
||||||
|
return Date.now() - this.startedAt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.promise = new Promise<T>((resolve, reject) => {
|
||||||
|
this.resolve = (valueArg: T | PromiseLike<T>) => {
|
||||||
|
this.status = 'fulfilled';
|
||||||
|
this.stoppedAt = Date.now();
|
||||||
|
resolve(valueArg);
|
||||||
|
};
|
||||||
|
this.reject = (reason: any) => {
|
||||||
|
this.status = 'rejected';
|
||||||
|
this.stoppedAt = Date.now();
|
||||||
|
reject(reason);
|
||||||
|
};
|
||||||
|
this.startedAt = Date.now();
|
||||||
|
this.status = 'pending';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const defer = <T>() => {
|
||||||
|
return new Deferred<T>();
|
||||||
|
};
|
14
tsconfig.json
Normal file
14
tsconfig.json
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"experimentalDecorators": true,
|
||||||
|
"useDefineForClassFields": false,
|
||||||
|
"target": "ES2022",
|
||||||
|
"module": "NodeNext",
|
||||||
|
"moduleResolution": "NodeNext",
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"verbatimModuleSyntax": true
|
||||||
|
},
|
||||||
|
"exclude": [
|
||||||
|
"dist_*/**/*.d.ts"
|
||||||
|
]
|
||||||
|
}
|
@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": "tslint-config-standard"
|
|
||||||
}
|
|
377
yarn.lock
377
yarn.lock
@ -1,377 +0,0 @@
|
|||||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
|
||||||
# yarn lockfile v1
|
|
||||||
|
|
||||||
|
|
||||||
"@types/chai-as-promised@0.0.29":
|
|
||||||
version "0.0.29"
|
|
||||||
resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-0.0.29.tgz#43d52892aa998e185a3de3e2477edb8573be1d77"
|
|
||||||
dependencies:
|
|
||||||
"@types/chai" "*"
|
|
||||||
"@types/promises-a-plus" "*"
|
|
||||||
|
|
||||||
"@types/chai-string@^1.1.30":
|
|
||||||
version "1.1.30"
|
|
||||||
resolved "https://registry.yarnpkg.com/@types/chai-string/-/chai-string-1.1.30.tgz#4d8744b31a5a2295fc01c981ed1e2d4c8a070f0a"
|
|
||||||
dependencies:
|
|
||||||
"@types/chai" "*"
|
|
||||||
|
|
||||||
"@types/chai@*":
|
|
||||||
version "4.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.0.1.tgz#37fea779617cfec3fd2b19a0247e8bbdd5133bf6"
|
|
||||||
|
|
||||||
"@types/chai@^3.4.35":
|
|
||||||
version "3.5.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/@types/chai/-/chai-3.5.2.tgz#c11cd2817d3a401b7ba0f5a420f35c56139b1c1e"
|
|
||||||
|
|
||||||
"@types/node@*":
|
|
||||||
version "8.0.7"
|
|
||||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.7.tgz#fb0ad04b5b6f6eabe0372a32a8f1fbba5c130cae"
|
|
||||||
|
|
||||||
"@types/promises-a-plus@*":
|
|
||||||
version "0.0.27"
|
|
||||||
resolved "https://registry.yarnpkg.com/@types/promises-a-plus/-/promises-a-plus-0.0.27.tgz#c64651134614c84b8f5d7114ce8901d36a609780"
|
|
||||||
|
|
||||||
"@types/shelljs@^0.7.2":
|
|
||||||
version "0.7.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/@types/shelljs/-/shelljs-0.7.2.tgz#c2bdb3fe80cd7a3da08750ca898ae44c589671f3"
|
|
||||||
dependencies:
|
|
||||||
"@types/node" "*"
|
|
||||||
|
|
||||||
"@types/which@^1.0.28":
|
|
||||||
version "1.0.28"
|
|
||||||
resolved "https://registry.yarnpkg.com/@types/which/-/which-1.0.28.tgz#016e387629b8817bed653fe32eab5d11279c8df6"
|
|
||||||
|
|
||||||
ansi-256-colors@^1.1.0:
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/ansi-256-colors/-/ansi-256-colors-1.1.0.tgz#910de50efcc7c09e3d82f2f87abd6b700c18818a"
|
|
||||||
|
|
||||||
assertion-error@^1.0.1:
|
|
||||||
version "1.0.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c"
|
|
||||||
|
|
||||||
balanced-match@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
|
|
||||||
|
|
||||||
beautycolor@^1.0.7:
|
|
||||||
version "1.0.7"
|
|
||||||
resolved "https://registry.yarnpkg.com/beautycolor/-/beautycolor-1.0.7.tgz#a4715738ac4c8221371e9cbeb5a6cc6d11ecbf7c"
|
|
||||||
dependencies:
|
|
||||||
ansi-256-colors "^1.1.0"
|
|
||||||
typings-global "^1.0.14"
|
|
||||||
|
|
||||||
bindings@^1.2.1:
|
|
||||||
version "1.2.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11"
|
|
||||||
|
|
||||||
brace-expansion@^1.1.7:
|
|
||||||
version "1.1.8"
|
|
||||||
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292"
|
|
||||||
dependencies:
|
|
||||||
balanced-match "^1.0.0"
|
|
||||||
concat-map "0.0.1"
|
|
||||||
|
|
||||||
chai-as-promised@^6.0.0:
|
|
||||||
version "6.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-6.0.0.tgz#1a02a433a6f24dafac63b9c96fa1684db1aa8da6"
|
|
||||||
dependencies:
|
|
||||||
check-error "^1.0.2"
|
|
||||||
|
|
||||||
chai-string@^1.3.0:
|
|
||||||
version "1.4.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/chai-string/-/chai-string-1.4.0.tgz#359140c051d36a4e4b1a5fc6b910152f438a8d49"
|
|
||||||
|
|
||||||
chai@^3.5.0:
|
|
||||||
version "3.5.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247"
|
|
||||||
dependencies:
|
|
||||||
assertion-error "^1.0.1"
|
|
||||||
deep-eql "^0.1.3"
|
|
||||||
type-detect "^1.0.0"
|
|
||||||
|
|
||||||
check-error@^1.0.2:
|
|
||||||
version "1.0.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
|
|
||||||
|
|
||||||
concat-map@0.0.1:
|
|
||||||
version "0.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
|
|
||||||
|
|
||||||
deep-eql@^0.1.3:
|
|
||||||
version "0.1.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2"
|
|
||||||
dependencies:
|
|
||||||
type-detect "0.1.1"
|
|
||||||
|
|
||||||
define-properties@^1.1.2:
|
|
||||||
version "1.1.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
|
|
||||||
dependencies:
|
|
||||||
foreach "^2.0.5"
|
|
||||||
object-keys "^1.0.8"
|
|
||||||
|
|
||||||
early@^2.1.1:
|
|
||||||
version "2.1.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/early/-/early-2.1.1.tgz#841e23254ea5dc54d8afaeee82f5ab65c00ee23c"
|
|
||||||
dependencies:
|
|
||||||
beautycolor "^1.0.7"
|
|
||||||
smartq "^1.1.1"
|
|
||||||
typings-global "^1.0.16"
|
|
||||||
|
|
||||||
es-abstract@^1.5.1:
|
|
||||||
version "1.7.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.7.0.tgz#dfade774e01bfcd97f96180298c449c8623fb94c"
|
|
||||||
dependencies:
|
|
||||||
es-to-primitive "^1.1.1"
|
|
||||||
function-bind "^1.1.0"
|
|
||||||
is-callable "^1.1.3"
|
|
||||||
is-regex "^1.0.3"
|
|
||||||
|
|
||||||
es-to-primitive@^1.1.1:
|
|
||||||
version "1.1.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d"
|
|
||||||
dependencies:
|
|
||||||
is-callable "^1.1.1"
|
|
||||||
is-date-object "^1.0.1"
|
|
||||||
is-symbol "^1.0.1"
|
|
||||||
|
|
||||||
es6-error@^4.0.2:
|
|
||||||
version "4.0.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.0.2.tgz#eec5c726eacef51b7f6b73c20db6e1b13b069c98"
|
|
||||||
|
|
||||||
foreach@^2.0.5:
|
|
||||||
version "2.0.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
|
|
||||||
|
|
||||||
fs.realpath@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
|
|
||||||
|
|
||||||
function-bind@^1.0.2, function-bind@^1.1.0:
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771"
|
|
||||||
|
|
||||||
glob@^7.0.0:
|
|
||||||
version "7.1.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
|
|
||||||
dependencies:
|
|
||||||
fs.realpath "^1.0.0"
|
|
||||||
inflight "^1.0.4"
|
|
||||||
inherits "2"
|
|
||||||
minimatch "^3.0.4"
|
|
||||||
once "^1.3.0"
|
|
||||||
path-is-absolute "^1.0.0"
|
|
||||||
|
|
||||||
has@^1.0.1:
|
|
||||||
version "1.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28"
|
|
||||||
dependencies:
|
|
||||||
function-bind "^1.0.2"
|
|
||||||
|
|
||||||
inflight@^1.0.4:
|
|
||||||
version "1.0.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
|
|
||||||
dependencies:
|
|
||||||
once "^1.3.0"
|
|
||||||
wrappy "1"
|
|
||||||
|
|
||||||
inherits@2:
|
|
||||||
version "2.0.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
|
|
||||||
|
|
||||||
interpret@^1.0.0:
|
|
||||||
version "1.0.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90"
|
|
||||||
|
|
||||||
is-callable@^1.1.1, is-callable@^1.1.3:
|
|
||||||
version "1.1.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2"
|
|
||||||
|
|
||||||
is-date-object@^1.0.1:
|
|
||||||
version "1.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
|
|
||||||
|
|
||||||
is-regex@^1.0.3:
|
|
||||||
version "1.0.4"
|
|
||||||
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
|
|
||||||
dependencies:
|
|
||||||
has "^1.0.1"
|
|
||||||
|
|
||||||
is-symbol@^1.0.1:
|
|
||||||
version "1.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
|
|
||||||
|
|
||||||
isexe@^2.0.0:
|
|
||||||
version "2.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
|
|
||||||
|
|
||||||
leakage@^0.3.0:
|
|
||||||
version "0.3.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/leakage/-/leakage-0.3.0.tgz#15d698abdc76bbc6439601f4f3020e77e2d50c39"
|
|
||||||
dependencies:
|
|
||||||
es6-error "^4.0.2"
|
|
||||||
left-pad "^1.1.3"
|
|
||||||
memwatch-next "^0.3.0"
|
|
||||||
minimist "^1.2.0"
|
|
||||||
pretty-bytes "^4.0.2"
|
|
||||||
|
|
||||||
left-pad@^1.1.3:
|
|
||||||
version "1.1.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.1.3.tgz#612f61c033f3a9e08e939f1caebeea41b6f3199a"
|
|
||||||
|
|
||||||
memwatch-next@^0.3.0:
|
|
||||||
version "0.3.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/memwatch-next/-/memwatch-next-0.3.0.tgz#2111050f9a906e0aa2d72a4ec0f0089c78726f8f"
|
|
||||||
dependencies:
|
|
||||||
bindings "^1.2.1"
|
|
||||||
nan "^2.3.2"
|
|
||||||
|
|
||||||
minimatch@^3.0.4:
|
|
||||||
version "3.0.4"
|
|
||||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
|
|
||||||
dependencies:
|
|
||||||
brace-expansion "^1.1.7"
|
|
||||||
|
|
||||||
minimist@^1.2.0:
|
|
||||||
version "1.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
|
|
||||||
|
|
||||||
nan@^2.3.2:
|
|
||||||
version "2.6.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45"
|
|
||||||
|
|
||||||
object-keys@^1.0.8:
|
|
||||||
version "1.0.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
|
|
||||||
|
|
||||||
object.getownpropertydescriptors@^2.0.3:
|
|
||||||
version "2.0.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16"
|
|
||||||
dependencies:
|
|
||||||
define-properties "^1.1.2"
|
|
||||||
es-abstract "^1.5.1"
|
|
||||||
|
|
||||||
once@^1.3.0:
|
|
||||||
version "1.4.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
|
|
||||||
dependencies:
|
|
||||||
wrappy "1"
|
|
||||||
|
|
||||||
path-is-absolute@^1.0.0:
|
|
||||||
version "1.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
|
|
||||||
|
|
||||||
path-parse@^1.0.5:
|
|
||||||
version "1.0.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
|
|
||||||
|
|
||||||
pretty-bytes@^4.0.2:
|
|
||||||
version "4.0.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9"
|
|
||||||
|
|
||||||
rechoir@^0.6.2:
|
|
||||||
version "0.6.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
|
|
||||||
dependencies:
|
|
||||||
resolve "^1.1.6"
|
|
||||||
|
|
||||||
resolve@^1.1.6:
|
|
||||||
version "1.3.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5"
|
|
||||||
dependencies:
|
|
||||||
path-parse "^1.0.5"
|
|
||||||
|
|
||||||
semver@^5.3.0:
|
|
||||||
version "5.3.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
|
|
||||||
|
|
||||||
shelljs@^0.7.8:
|
|
||||||
version "0.7.8"
|
|
||||||
resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3"
|
|
||||||
dependencies:
|
|
||||||
glob "^7.0.0"
|
|
||||||
interpret "^1.0.0"
|
|
||||||
rechoir "^0.6.2"
|
|
||||||
|
|
||||||
smartchai@^1.0.3:
|
|
||||||
version "1.0.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/smartchai/-/smartchai-1.0.3.tgz#de6d010bb8b5aef24cb70b31a5f5334e8c41b72f"
|
|
||||||
dependencies:
|
|
||||||
"@types/chai" "^3.4.35"
|
|
||||||
"@types/chai-as-promised" "0.0.29"
|
|
||||||
"@types/chai-string" "^1.1.30"
|
|
||||||
chai "^3.5.0"
|
|
||||||
chai-as-promised "^6.0.0"
|
|
||||||
chai-string "^1.3.0"
|
|
||||||
|
|
||||||
smartdelay@^1.0.3:
|
|
||||||
version "1.0.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/smartdelay/-/smartdelay-1.0.3.tgz#5fd44dad77262d110702f0293efa80c072cfb579"
|
|
||||||
dependencies:
|
|
||||||
smartq "^1.1.1"
|
|
||||||
typings-global "^1.0.16"
|
|
||||||
|
|
||||||
smartq@^1.1.1:
|
|
||||||
version "1.1.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/smartq/-/smartq-1.1.1.tgz#efb358705260d41ae18aef7ffd815f7b6fe17dd3"
|
|
||||||
dependencies:
|
|
||||||
typed-promisify "^0.3.0"
|
|
||||||
typings-global "^1.0.14"
|
|
||||||
|
|
||||||
smartshell@^1.0.6:
|
|
||||||
version "1.0.8"
|
|
||||||
resolved "https://registry.yarnpkg.com/smartshell/-/smartshell-1.0.8.tgz#1535756c0fe8069f7e6da1e3f9cb6c8f77094e42"
|
|
||||||
dependencies:
|
|
||||||
"@types/shelljs" "^0.7.2"
|
|
||||||
"@types/which" "^1.0.28"
|
|
||||||
shelljs "^0.7.8"
|
|
||||||
smartq "^1.1.1"
|
|
||||||
typings-global "^1.0.19"
|
|
||||||
which "^1.2.14"
|
|
||||||
|
|
||||||
tapbundle@^1.1.0:
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/tapbundle/-/tapbundle-1.1.0.tgz#e0547f683ae36260f639ecd7435df95f0af01683"
|
|
||||||
dependencies:
|
|
||||||
early "^2.1.1"
|
|
||||||
leakage "^0.3.0"
|
|
||||||
smartchai "^1.0.3"
|
|
||||||
smartdelay "^1.0.3"
|
|
||||||
smartq "^1.1.1"
|
|
||||||
typings-global "^1.0.19"
|
|
||||||
|
|
||||||
type-detect@0.1.1:
|
|
||||||
version "0.1.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822"
|
|
||||||
|
|
||||||
type-detect@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2"
|
|
||||||
|
|
||||||
typed-promisify@^0.3.0:
|
|
||||||
version "0.3.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/typed-promisify/-/typed-promisify-0.3.0.tgz#1ba0af5e444c87d8047406f18ce49092a1191853"
|
|
||||||
|
|
||||||
typings-global@^1.0.14, typings-global@^1.0.16, typings-global@^1.0.19:
|
|
||||||
version "1.0.19"
|
|
||||||
resolved "https://registry.yarnpkg.com/typings-global/-/typings-global-1.0.19.tgz#3376a72d4de1e5541bf5702248ff64c3e6ea316c"
|
|
||||||
dependencies:
|
|
||||||
semver "^5.3.0"
|
|
||||||
smartshell "^1.0.6"
|
|
||||||
|
|
||||||
util.promisify@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
|
|
||||||
dependencies:
|
|
||||||
define-properties "^1.1.2"
|
|
||||||
object.getownpropertydescriptors "^2.0.3"
|
|
||||||
|
|
||||||
which@^1.2.14:
|
|
||||||
version "1.2.14"
|
|
||||||
resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5"
|
|
||||||
dependencies:
|
|
||||||
isexe "^2.0.0"
|
|
||||||
|
|
||||||
wrappy@1:
|
|
||||||
version "1.0.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
|
|
Loading…
x
Reference in New Issue
Block a user