asygen 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +13 -0
- package/README.md +50 -0
- package/build/defer.cjs +143 -0
- package/build/defer.cjs.map +1 -0
- package/build/defer.d.ts +20 -0
- package/build/defer.js +65 -0
- package/build/defer.js.map +1 -0
- package/build/generatorify.cjs +204 -0
- package/build/generatorify.cjs.map +1 -0
- package/build/generatorify.d.ts +8 -0
- package/build/generatorify.js +34 -0
- package/build/generatorify.js.map +1 -0
- package/build/index.cjs +28 -0
- package/build/index.cjs.map +1 -0
- package/build/index.d.ts +2 -0
- package/build/index.js +4 -0
- package/build/index.js.map +1 -0
- package/package.json +48 -0
- package/src/index.ts +2 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Copyright (c) 2023-present Ivan Zakharchanka
|
|
2
|
+
|
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
you may not use this file except in compliance with the License.
|
|
5
|
+
You may obtain a copy of the License at
|
|
6
|
+
|
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
|
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
See the License for the specific language governing permissions and
|
|
13
|
+
limitations under the License.
|
package/README.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Asygen
|
|
2
|
+
|
|
3
|
+
0-Deps, simple and fast async generator library for browser and NodeJS.
|
|
4
|
+
|
|
5
|
+
Supports ESM and CommonJS modules.
|
|
6
|
+
|
|
7
|
+
[![Build Status][github-image]][github-url]
|
|
8
|
+
[![NPM version][npm-image]][npm-url]
|
|
9
|
+
[![Downloads][downloads-image]][npm-url]
|
|
10
|
+
[![Coverage Status][codecov-image]][codecov-url]
|
|
11
|
+
[![Maintainability][codeclimate-image]][codeclimate-url]
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import { defer, generatorify } from 'asygen';
|
|
17
|
+
|
|
18
|
+
const result = defer();
|
|
19
|
+
|
|
20
|
+
console.log(result.status); // pending
|
|
21
|
+
|
|
22
|
+
task.once('data', error.resolve);
|
|
23
|
+
task.once('error', error.reject);
|
|
24
|
+
await result.promise;
|
|
25
|
+
|
|
26
|
+
console.log(result.status); // resolved or rejected
|
|
27
|
+
|
|
28
|
+
// easy way to turn your events into asyncGenerator
|
|
29
|
+
for await (const data of generatorify(send => process.on('data', send))) {
|
|
30
|
+
// handle data
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## License
|
|
35
|
+
|
|
36
|
+
License [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
|
37
|
+
Copyright (c) 2023-present Ivan Zakharchanka
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
[npm-url]: https://www.npmjs.com/package/asygen
|
|
41
|
+
[downloads-image]: https://img.shields.io/npm/dw/asygen.svg?maxAge=43200
|
|
42
|
+
[npm-image]: https://img.shields.io/npm/v/asygen.svg?maxAge=43200
|
|
43
|
+
[github-url]: https://github.com/3axap4eHko/asygen/actions/workflows/cicd.yml
|
|
44
|
+
[github-image]: https://github.com/3axap4eHko/asygen/actions/workflows/cicd.yml/badge.svg
|
|
45
|
+
[codecov-url]: https://codecov.io/gh/3axap4eHko/asygen
|
|
46
|
+
[codecov-image]: https://codecov.io/gh/3axap4eHko/asygen/branch/master/graph/badge.svg?token=JZ8QCGH6PI
|
|
47
|
+
[codeclimate-url]: https://codeclimate.com/github/3axap4eHko/asygen/maintainability
|
|
48
|
+
[codeclimate-image]: https://api.codeclimate.com/v1/badges/0ba20f27f6db2b0fec8c/maintainability
|
|
49
|
+
[snyk-url]: https://snyk.io/test/npm/asygen/latest
|
|
50
|
+
[snyk-image]: https://img.shields.io/snyk/vulnerabilities/github/3axap4eHko/asygen.svg?maxAge=43200
|
package/build/defer.cjs
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: all[name]
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
State: function() {
|
|
13
|
+
return State;
|
|
14
|
+
},
|
|
15
|
+
getId: function() {
|
|
16
|
+
return getId;
|
|
17
|
+
},
|
|
18
|
+
Deferred: function() {
|
|
19
|
+
return Deferred;
|
|
20
|
+
},
|
|
21
|
+
defer: function() {
|
|
22
|
+
return defer;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
function _classCallCheck(instance, Constructor) {
|
|
26
|
+
if (!(instance instanceof Constructor)) {
|
|
27
|
+
throw new TypeError("Cannot call a class as a function");
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function _defineProperties(target, props) {
|
|
31
|
+
for(var i = 0; i < props.length; i++){
|
|
32
|
+
var descriptor = props[i];
|
|
33
|
+
descriptor.enumerable = descriptor.enumerable || false;
|
|
34
|
+
descriptor.configurable = true;
|
|
35
|
+
if ("value" in descriptor) descriptor.writable = true;
|
|
36
|
+
Object.defineProperty(target, descriptor.key, descriptor);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function _createClass(Constructor, protoProps, staticProps) {
|
|
40
|
+
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
41
|
+
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
42
|
+
return Constructor;
|
|
43
|
+
}
|
|
44
|
+
function _defineProperty(obj, key, value) {
|
|
45
|
+
if (key in obj) {
|
|
46
|
+
Object.defineProperty(obj, key, {
|
|
47
|
+
value: value,
|
|
48
|
+
enumerable: true,
|
|
49
|
+
configurable: true,
|
|
50
|
+
writable: true
|
|
51
|
+
});
|
|
52
|
+
} else {
|
|
53
|
+
obj[key] = value;
|
|
54
|
+
}
|
|
55
|
+
return obj;
|
|
56
|
+
}
|
|
57
|
+
var State;
|
|
58
|
+
(function(State) {
|
|
59
|
+
State["PENDING"] = "pending";
|
|
60
|
+
State["RESOLVED"] = "resolved";
|
|
61
|
+
State["REJECTED"] = "rejected";
|
|
62
|
+
})(State || (State = {}));
|
|
63
|
+
var counter = [
|
|
64
|
+
0,
|
|
65
|
+
0
|
|
66
|
+
];
|
|
67
|
+
var getId = function() {
|
|
68
|
+
var result = Date.now() * 100;
|
|
69
|
+
if (counter[0] !== result) {
|
|
70
|
+
counter[0] = result;
|
|
71
|
+
counter[1] = 0;
|
|
72
|
+
}
|
|
73
|
+
return (counter[0] + counter[1]++).toString(16);
|
|
74
|
+
};
|
|
75
|
+
var _Symbol_toStringTag = Symbol.toStringTag;
|
|
76
|
+
var Deferred = /*#__PURE__*/ function() {
|
|
77
|
+
"use strict";
|
|
78
|
+
function Deferred() {
|
|
79
|
+
var _this = this;
|
|
80
|
+
_classCallCheck(this, Deferred);
|
|
81
|
+
_defineProperty(this, "txts", getId());
|
|
82
|
+
_defineProperty(this, "_promise", void 0);
|
|
83
|
+
_defineProperty(this, "_resolve", void 0);
|
|
84
|
+
_defineProperty(this, "_reject", void 0);
|
|
85
|
+
_defineProperty(this, "_state", State.PENDING);
|
|
86
|
+
this._promise = new Promise(function(resolve, reject) {
|
|
87
|
+
_this._resolve = function(value) {
|
|
88
|
+
_this._state = State.RESOLVED;
|
|
89
|
+
resolve(value);
|
|
90
|
+
};
|
|
91
|
+
_this._reject = function(error) {
|
|
92
|
+
_this._state = State.REJECTED;
|
|
93
|
+
reject(error);
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
this.resolve = this.resolve.bind(this);
|
|
97
|
+
this.reject = this.reject.bind(this);
|
|
98
|
+
}
|
|
99
|
+
_createClass(Deferred, [
|
|
100
|
+
{
|
|
101
|
+
key: _Symbol_toStringTag,
|
|
102
|
+
get: function get() {
|
|
103
|
+
return "Deffer ".concat(this.txts, " ").concat(this._state);
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
key: "promise",
|
|
108
|
+
get: function get() {
|
|
109
|
+
return this._promise;
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
key: "state",
|
|
114
|
+
get: function get() {
|
|
115
|
+
return this._state;
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
key: "resolve",
|
|
120
|
+
value: function resolve(value) {
|
|
121
|
+
if (this._state === State.PENDING) {
|
|
122
|
+
this._resolve && this._resolve(value);
|
|
123
|
+
}
|
|
124
|
+
return this;
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
key: "reject",
|
|
129
|
+
value: function reject(error) {
|
|
130
|
+
if (this._state === State.PENDING) {
|
|
131
|
+
this._reject && this._reject(error);
|
|
132
|
+
}
|
|
133
|
+
return this;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
]);
|
|
137
|
+
return Deferred;
|
|
138
|
+
}();
|
|
139
|
+
var defer = function() {
|
|
140
|
+
return new Deferred();
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
//# sourceMappingURL=defer.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["src/defer.ts"],"sourcesContent":["export enum State {\n PENDING = 'pending',\n RESOLVED = 'resolved',\n REJECTED = 'rejected',\n}\n\nconst counter: [number, number] = [0,0];\nexport const getId = () => {\n const result = Date.now() * 100;\n if (counter[0] !== result) {\n counter[0] = result;\n counter[1] = 0;\n };\n return (counter[0] + (counter[1]++)).toString(16);\n};\n\nexport class Deferred<T = void, E = unknown> {\n private txts = getId();\n private _promise: Promise<T>;\n private _resolve?: (value: T) => void;\n private _reject?: (error: E) => void;\n private _state: State = State.PENDING;\n\n constructor() {\n this._promise = new Promise<T>((resolve, reject) => {\n this._resolve = (value: T) => {\n this._state = State.RESOLVED;\n resolve(value);\n };\n this._reject = (error: unknown) => {\n this._state = State.REJECTED;\n reject(error)\n };\n });\n this.resolve = this.resolve.bind(this);\n this.reject = this.reject.bind(this);\n }\n\n get [Symbol.toStringTag]() {\n return `Deffer ${this.txts} ${this._state}`;\n }\n\n get promise() {\n return this._promise;\n }\n\n get state() {\n return this._state;\n }\n\n resolve(value: T) {\n if (this._state === State.PENDING) {\n this._resolve && this._resolve(value);\n }\n return this;\n }\n\n reject(error: E) {\n if (this._state === State.PENDING) {\n this._reject && this._reject(error);\n }\n return this;\n }\n}\n\nexport const defer = <T = void, E = unknown>() => {\n return new Deferred<T, E>();\n}\n"],"names":["getId","Deferred","defer","State","PENDING","RESOLVED","REJECTED","counter","result","Date","now","toString","Symbol","toStringTag","txts","_promise","_resolve","_reject","_state","Promise","resolve","reject","value","error","bind","promise","state"],"mappings":";;;;;;;;;;;;;;IAOaA,KAAK;eAALA;;IASAC,QAAQ;eAARA;;IAiDAC,KAAK;eAALA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAjEN;UAAKC,KAAK;IAALA,MACVC,aAAU;IADAD,MAEVE,cAAW;IAFDF,MAGVG,cAAW;GAHDH,UAAAA;AAMZ,IAAMI,UAA4B;IAAC;IAAE;CAAE;AAChC,IAAMP,QAAQ,WAAM;IACzB,IAAMQ,SAASC,KAAKC,GAAG,KAAK;IAC5B,IAAIH,OAAO,CAAC,EAAE,KAAKC,QAAQ;QACzBD,OAAO,CAAC,EAAE,GAAGC;QACbD,OAAO,CAAC,EAAE,GAAG;IACf,CAAC;IACD,OAAO,AAACA,CAAAA,OAAO,CAAC,EAAE,GAAIA,OAAO,CAAC,EAAE,EAAE,EAAGI,QAAQ,CAAC;AAChD;IAwBOC,sBAAAA,OAAOC,WAAW;AAtBlB,IAAA,AAAMZ,yBAiDV,AAjDI;;aAAMA;;8BAAAA;QACX,sBAAQa,QAAOd;QACf,sBAAQe,YAAR,KAAA;QACA,sBAAQC,YAAR,KAAA;QACA,sBAAQC,WAAR,KAAA;QACA,sBAAQC,UAAgBf,MAAMC,OAAO;QAGnC,IAAI,CAACW,QAAQ,GAAG,IAAII,QAAW,SAACC,SAASC,QAAW;YAClD,MAAKL,QAAQ,GAAG,SAACM,OAAa;gBAC5B,MAAKJ,MAAM,GAAGf,MAAME,QAAQ;gBAC5Be,QAAQE;YACV;YACA,MAAKL,OAAO,GAAG,SAACM,OAAmB;gBACjC,MAAKL,MAAM,GAAGf,MAAMG,QAAQ;gBAC5Be,OAAOE;YACT;QACF;QACA,IAAI,CAACH,OAAO,GAAG,IAAI,CAACA,OAAO,CAACI,IAAI,CAAC,IAAI;QACrC,IAAI,CAACH,MAAM,GAAG,IAAI,CAACA,MAAM,CAACG,IAAI,CAAC,IAAI;;iBAnB1BvB;;YAsBP,KAACW;iBAAL,eAA2B;gBACzB,OAAO,AAAC,UAAsB,OAAb,IAAI,CAACE,IAAI,EAAC,KAAe,OAAZ,IAAI,CAACI,MAAM;YAC3C;;;YAEIO,KAAAA;iBAAJ,eAAc;gBACZ,OAAO,IAAI,CAACV,QAAQ;YACtB;;;YAEIW,KAAAA;iBAAJ,eAAY;gBACV,OAAO,IAAI,CAACR,MAAM;YACpB;;;YAEAE,KAAAA;mBAAAA,SAAAA,QAAQE,KAAQ,EAAE;gBAChB,IAAI,IAAI,CAACJ,MAAM,KAAKf,MAAMC,OAAO,EAAE;oBACjC,IAAI,CAACY,QAAQ,IAAI,IAAI,CAACA,QAAQ,CAACM;gBACjC,CAAC;gBACD,OAAO,IAAI;YACb;;;YAEAD,KAAAA;mBAAAA,SAAAA,OAAOE,KAAQ,EAAE;gBACf,IAAI,IAAI,CAACL,MAAM,KAAKf,MAAMC,OAAO,EAAE;oBACjC,IAAI,CAACa,OAAO,IAAI,IAAI,CAACA,OAAO,CAACM;gBAC/B,CAAC;gBACD,OAAO,IAAI;YACb;;;WA9CWtB;;AAiDN,IAAMC,QAAQ,WAA6B;IAChD,OAAO,IAAID;AACb"}
|
package/build/defer.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare enum State {
|
|
2
|
+
PENDING = "pending",
|
|
3
|
+
RESOLVED = "resolved",
|
|
4
|
+
REJECTED = "rejected"
|
|
5
|
+
}
|
|
6
|
+
export declare const getId: () => string;
|
|
7
|
+
export declare class Deferred<T = void, E = unknown> {
|
|
8
|
+
private txts;
|
|
9
|
+
private _promise;
|
|
10
|
+
private _resolve?;
|
|
11
|
+
private _reject?;
|
|
12
|
+
private _state;
|
|
13
|
+
constructor();
|
|
14
|
+
get [Symbol.toStringTag](): string;
|
|
15
|
+
get promise(): Promise<T>;
|
|
16
|
+
get state(): State;
|
|
17
|
+
resolve(value: T): this;
|
|
18
|
+
reject(error: E): this;
|
|
19
|
+
}
|
|
20
|
+
export declare const defer: <T = void, E = unknown>() => Deferred<T, E>;
|
package/build/defer.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export let State;
|
|
2
|
+
(function(State) {
|
|
3
|
+
State["PENDING"] = 'pending';
|
|
4
|
+
State["RESOLVED"] = 'resolved';
|
|
5
|
+
State["REJECTED"] = 'rejected';
|
|
6
|
+
})(State || (State = {}));
|
|
7
|
+
const counter = [
|
|
8
|
+
0,
|
|
9
|
+
0
|
|
10
|
+
];
|
|
11
|
+
export const getId = ()=>{
|
|
12
|
+
const result = Date.now() * 100;
|
|
13
|
+
if (counter[0] !== result) {
|
|
14
|
+
counter[0] = result;
|
|
15
|
+
counter[1] = 0;
|
|
16
|
+
}
|
|
17
|
+
return (counter[0] + counter[1]++).toString(16);
|
|
18
|
+
};
|
|
19
|
+
export class Deferred {
|
|
20
|
+
txts = getId();
|
|
21
|
+
_promise;
|
|
22
|
+
_resolve;
|
|
23
|
+
_reject;
|
|
24
|
+
_state = State.PENDING;
|
|
25
|
+
constructor(){
|
|
26
|
+
this._promise = new Promise((resolve, reject)=>{
|
|
27
|
+
this._resolve = (value)=>{
|
|
28
|
+
this._state = State.RESOLVED;
|
|
29
|
+
resolve(value);
|
|
30
|
+
};
|
|
31
|
+
this._reject = (error)=>{
|
|
32
|
+
this._state = State.REJECTED;
|
|
33
|
+
reject(error);
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
this.resolve = this.resolve.bind(this);
|
|
37
|
+
this.reject = this.reject.bind(this);
|
|
38
|
+
}
|
|
39
|
+
get [Symbol.toStringTag]() {
|
|
40
|
+
return `Deffer ${this.txts} ${this._state}`;
|
|
41
|
+
}
|
|
42
|
+
get promise() {
|
|
43
|
+
return this._promise;
|
|
44
|
+
}
|
|
45
|
+
get state() {
|
|
46
|
+
return this._state;
|
|
47
|
+
}
|
|
48
|
+
resolve(value) {
|
|
49
|
+
if (this._state === State.PENDING) {
|
|
50
|
+
this._resolve && this._resolve(value);
|
|
51
|
+
}
|
|
52
|
+
return this;
|
|
53
|
+
}
|
|
54
|
+
reject(error) {
|
|
55
|
+
if (this._state === State.PENDING) {
|
|
56
|
+
this._reject && this._reject(error);
|
|
57
|
+
}
|
|
58
|
+
return this;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export const defer = ()=>{
|
|
62
|
+
return new Deferred();
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
//# sourceMappingURL=defer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["src/defer.ts"],"sourcesContent":["export enum State {\n PENDING = 'pending',\n RESOLVED = 'resolved',\n REJECTED = 'rejected',\n}\n\nconst counter: [number, number] = [0,0];\nexport const getId = () => {\n const result = Date.now() * 100;\n if (counter[0] !== result) {\n counter[0] = result;\n counter[1] = 0;\n };\n return (counter[0] + (counter[1]++)).toString(16);\n};\n\nexport class Deferred<T = void, E = unknown> {\n private txts = getId();\n private _promise: Promise<T>;\n private _resolve?: (value: T) => void;\n private _reject?: (error: E) => void;\n private _state: State = State.PENDING;\n\n constructor() {\n this._promise = new Promise<T>((resolve, reject) => {\n this._resolve = (value: T) => {\n this._state = State.RESOLVED;\n resolve(value);\n };\n this._reject = (error: unknown) => {\n this._state = State.REJECTED;\n reject(error)\n };\n });\n this.resolve = this.resolve.bind(this);\n this.reject = this.reject.bind(this);\n }\n\n get [Symbol.toStringTag]() {\n return `Deffer ${this.txts} ${this._state}`;\n }\n\n get promise() {\n return this._promise;\n }\n\n get state() {\n return this._state;\n }\n\n resolve(value: T) {\n if (this._state === State.PENDING) {\n this._resolve && this._resolve(value);\n }\n return this;\n }\n\n reject(error: E) {\n if (this._state === State.PENDING) {\n this._reject && this._reject(error);\n }\n return this;\n }\n}\n\nexport const defer = <T = void, E = unknown>() => {\n return new Deferred<T, E>();\n}\n"],"names":["State","PENDING","RESOLVED","REJECTED","counter","getId","result","Date","now","toString","Deferred","txts","_promise","_resolve","_reject","_state","constructor","Promise","resolve","reject","value","error","bind","Symbol","toStringTag","promise","state","defer"],"mappings":"WAAO;UAAKA,KAAK;IAALA,MACVC,aAAU;IADAD,MAEVE,cAAW;IAFDF,MAGVG,cAAW;GAHDH,UAAAA;AAMZ,MAAMI,UAA4B;IAAC;IAAE;CAAE;AACvC,OAAO,MAAMC,QAAQ,IAAM;IACzB,MAAMC,SAASC,KAAKC,GAAG,KAAK;IAC5B,IAAIJ,OAAO,CAAC,EAAE,KAAKE,QAAQ;QACzBF,OAAO,CAAC,EAAE,GAAGE;QACbF,OAAO,CAAC,EAAE,GAAG;IACf,CAAC;IACD,OAAO,AAACA,CAAAA,OAAO,CAAC,EAAE,GAAIA,OAAO,CAAC,EAAE,EAAE,EAAGK,QAAQ,CAAC;AAChD,EAAE;AAEF,OAAO,MAAMC;IACHC,OAAON,QAAQ;IACfO,SAAqB;IACrBC,SAA8B;IAC9BC,QAA6B;IAC7BC,SAAgBf,MAAMC,OAAO,CAAC;IAEtCe,aAAc;QACZ,IAAI,CAACJ,QAAQ,GAAG,IAAIK,QAAW,CAACC,SAASC,SAAW;YAClD,IAAI,CAACN,QAAQ,GAAG,CAACO,QAAa;gBAC5B,IAAI,CAACL,MAAM,GAAGf,MAAME,QAAQ;gBAC5BgB,QAAQE;YACV;YACA,IAAI,CAACN,OAAO,GAAG,CAACO,QAAmB;gBACjC,IAAI,CAACN,MAAM,GAAGf,MAAMG,QAAQ;gBAC5BgB,OAAOE;YACT;QACF;QACA,IAAI,CAACH,OAAO,GAAG,IAAI,CAACA,OAAO,CAACI,IAAI,CAAC,IAAI;QACrC,IAAI,CAACH,MAAM,GAAG,IAAI,CAACA,MAAM,CAACG,IAAI,CAAC,IAAI;IACrC;IAEA,IAAI,CAACC,OAAOC,WAAW,CAAC,GAAG;QACzB,OAAO,CAAC,OAAO,EAAE,IAAI,CAACb,IAAI,CAAC,CAAC,EAAE,IAAI,CAACI,MAAM,CAAC,CAAC;IAC7C;IAEA,IAAIU,UAAU;QACZ,OAAO,IAAI,CAACb,QAAQ;IACtB;IAEA,IAAIc,QAAQ;QACV,OAAO,IAAI,CAACX,MAAM;IACpB;IAEAG,QAAQE,KAAQ,EAAE;QAChB,IAAI,IAAI,CAACL,MAAM,KAAKf,MAAMC,OAAO,EAAE;YACjC,IAAI,CAACY,QAAQ,IAAI,IAAI,CAACA,QAAQ,CAACO;QACjC,CAAC;QACD,OAAO,IAAI;IACb;IAEAD,OAAOE,KAAQ,EAAE;QACf,IAAI,IAAI,CAACN,MAAM,KAAKf,MAAMC,OAAO,EAAE;YACjC,IAAI,CAACa,OAAO,IAAI,IAAI,CAACA,OAAO,CAACO;QAC/B,CAAC;QACD,OAAO,IAAI;IACb;AACF,CAAC;AAED,OAAO,MAAMM,QAAQ,IAA6B;IAChD,OAAO,IAAIjB;AACb,EAAC"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "generatorify", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return generatorify;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
var _deferCjs = require("./defer.cjs");
|
|
12
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
13
|
+
try {
|
|
14
|
+
var info = gen[key](arg);
|
|
15
|
+
var value = info.value;
|
|
16
|
+
} catch (error) {
|
|
17
|
+
reject(error);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (info.done) {
|
|
21
|
+
resolve(value);
|
|
22
|
+
} else {
|
|
23
|
+
Promise.resolve(value).then(_next, _throw);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function _asyncToGenerator(fn) {
|
|
27
|
+
return function() {
|
|
28
|
+
var self = this, args = arguments;
|
|
29
|
+
return new Promise(function(resolve, reject) {
|
|
30
|
+
var gen = fn.apply(self, args);
|
|
31
|
+
function _next(value) {
|
|
32
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
33
|
+
}
|
|
34
|
+
function _throw(err) {
|
|
35
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
36
|
+
}
|
|
37
|
+
_next(undefined);
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function _defineProperty(obj, key, value) {
|
|
42
|
+
if (key in obj) {
|
|
43
|
+
Object.defineProperty(obj, key, {
|
|
44
|
+
value: value,
|
|
45
|
+
enumerable: true,
|
|
46
|
+
configurable: true,
|
|
47
|
+
writable: true
|
|
48
|
+
});
|
|
49
|
+
} else {
|
|
50
|
+
obj[key] = value;
|
|
51
|
+
}
|
|
52
|
+
return obj;
|
|
53
|
+
}
|
|
54
|
+
var __generator = (void 0) && (void 0).__generator || function(thisArg, body) {
|
|
55
|
+
var f, y, t, g, _ = {
|
|
56
|
+
label: 0,
|
|
57
|
+
sent: function() {
|
|
58
|
+
if (t[0] & 1) throw t[1];
|
|
59
|
+
return t[1];
|
|
60
|
+
},
|
|
61
|
+
trys: [],
|
|
62
|
+
ops: []
|
|
63
|
+
};
|
|
64
|
+
return(g = {
|
|
65
|
+
next: verb(0),
|
|
66
|
+
"throw": verb(1),
|
|
67
|
+
"return": verb(2)
|
|
68
|
+
}, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
|
|
69
|
+
return this;
|
|
70
|
+
}), g);
|
|
71
|
+
function verb(n) {
|
|
72
|
+
return function(v) {
|
|
73
|
+
return step([
|
|
74
|
+
n,
|
|
75
|
+
v
|
|
76
|
+
]);
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function step(op) {
|
|
80
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
81
|
+
while(_)try {
|
|
82
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
83
|
+
if (y = 0, t) op = [
|
|
84
|
+
op[0] & 2,
|
|
85
|
+
t.value
|
|
86
|
+
];
|
|
87
|
+
switch(op[0]){
|
|
88
|
+
case 0:
|
|
89
|
+
case 1:
|
|
90
|
+
t = op;
|
|
91
|
+
break;
|
|
92
|
+
case 4:
|
|
93
|
+
_.label++;
|
|
94
|
+
return {
|
|
95
|
+
value: op[1],
|
|
96
|
+
done: false
|
|
97
|
+
};
|
|
98
|
+
case 5:
|
|
99
|
+
_.label++;
|
|
100
|
+
y = op[1];
|
|
101
|
+
op = [
|
|
102
|
+
0
|
|
103
|
+
];
|
|
104
|
+
continue;
|
|
105
|
+
case 7:
|
|
106
|
+
op = _.ops.pop();
|
|
107
|
+
_.trys.pop();
|
|
108
|
+
continue;
|
|
109
|
+
default:
|
|
110
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
|
111
|
+
_ = 0;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
|
115
|
+
_.label = op[1];
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
if (op[0] === 6 && _.label < t[1]) {
|
|
119
|
+
_.label = t[1];
|
|
120
|
+
t = op;
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
if (t && _.label < t[2]) {
|
|
124
|
+
_.label = t[2];
|
|
125
|
+
_.ops.push(op);
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
if (t[2]) _.ops.pop();
|
|
129
|
+
_.trys.pop();
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
op = body.call(thisArg, _);
|
|
133
|
+
} catch (e) {
|
|
134
|
+
op = [
|
|
135
|
+
6,
|
|
136
|
+
e
|
|
137
|
+
];
|
|
138
|
+
y = 0;
|
|
139
|
+
} finally{
|
|
140
|
+
f = t = 0;
|
|
141
|
+
}
|
|
142
|
+
if (op[0] & 5) throw op[1];
|
|
143
|
+
return {
|
|
144
|
+
value: op[0] ? op[1] : void 0,
|
|
145
|
+
done: true
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
var generatorify = function(task) {
|
|
150
|
+
var dPoll = [
|
|
151
|
+
(0, _deferCjs.defer)()
|
|
152
|
+
];
|
|
153
|
+
Promise.resolve(task(function(value) {
|
|
154
|
+
var next = (0, _deferCjs.defer)();
|
|
155
|
+
var prev = dPoll.push(next) - 2;
|
|
156
|
+
dPoll[prev].resolve({
|
|
157
|
+
value: value,
|
|
158
|
+
done: false
|
|
159
|
+
});
|
|
160
|
+
return dPoll[prev].promise.then(function(v) {
|
|
161
|
+
return v.value;
|
|
162
|
+
});
|
|
163
|
+
})).then(function() {
|
|
164
|
+
var _ref = _asyncToGenerator(function(value) {
|
|
165
|
+
return __generator(this, function(_state) {
|
|
166
|
+
switch(_state.label){
|
|
167
|
+
case 0:
|
|
168
|
+
return [
|
|
169
|
+
4,
|
|
170
|
+
Promise.all(dPoll.map(function(d) {
|
|
171
|
+
return d.promise;
|
|
172
|
+
}))
|
|
173
|
+
];
|
|
174
|
+
case 1:
|
|
175
|
+
_state.sent();
|
|
176
|
+
return [
|
|
177
|
+
2,
|
|
178
|
+
{
|
|
179
|
+
value: value,
|
|
180
|
+
done: true
|
|
181
|
+
}
|
|
182
|
+
];
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
return function(value) {
|
|
187
|
+
return _ref.apply(this, arguments);
|
|
188
|
+
};
|
|
189
|
+
}());
|
|
190
|
+
return _defineProperty({}, Symbol.asyncIterator, function() {
|
|
191
|
+
return {
|
|
192
|
+
next: function next() {
|
|
193
|
+
var _current_promise;
|
|
194
|
+
var current = dPoll[0];
|
|
195
|
+
current === null || current === void 0 ? void 0 : (_current_promise = current.promise) === null || _current_promise === void 0 ? void 0 : _current_promise.then(function() {
|
|
196
|
+
return dPoll.shift();
|
|
197
|
+
});
|
|
198
|
+
return current === null || current === void 0 ? void 0 : current.promise;
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
});
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
//# sourceMappingURL=generatorify.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["src/generatorify.ts"],"sourcesContent":["import { defer } from './defer';\n\ninterface GeneratorState<T> {\n value: T;\n done: boolean\n}\n\ninterface TaskCallback<T> {\n (value: T): Promise<T>;\n}\n\nexport interface Task<T, R = unknown> {\n (callback: TaskCallback<T>): R;\n}\n\nexport const generatorify = <T, R = unknown>(task: Task<T, R>): AsyncIterable<T> => {\n const dPoll = [defer<GeneratorState<T>>()];\n\n Promise.resolve(task(value => {\n const next = defer<GeneratorState<T>>();\n const prev = dPoll.push(next) - 2;\n dPoll[prev].resolve({ value, done: false });\n return dPoll[prev].promise.then(v => v.value);\n })).then(async (value) => {\n await Promise.all(dPoll.map(d => d.promise));\n return { value, done: true };\n });\n\n return {\n [Symbol.asyncIterator]() {\n return {\n next() {\n const current = dPoll[0];\n current?.promise?.then(() => dPoll.shift());\n return current?.promise;\n },\n };\n }\n };\n}\n"],"names":["generatorify","task","dPoll","defer","Promise","resolve","value","next","prev","push","done","promise","then","v","all","map","d","Symbol","asyncIterator","current","shift"],"mappings":";;;;+BAeaA;;;eAAAA;;;wBAfS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAef,IAAMA,eAAe,SAAiBC,MAAuC;IAClF,IAAMC,QAAQ;QAACC,IAAAA,eAAK;KAAsB;IAE1CC,QAAQC,OAAO,CAACJ,KAAKK,SAAAA,OAAS;QAC5B,IAAMC,OAAOJ,IAAAA,eAAK;QAClB,IAAMK,OAAON,MAAMO,IAAI,CAACF,QAAQ;QAChCL,KAAK,CAACM,KAAK,CAACH,OAAO,CAAC;YAAEC,OAAAA;YAAOI,MAAM,KAAK;QAAC;QACzC,OAAOR,KAAK,CAACM,KAAK,CAACG,OAAO,CAACC,IAAI,CAACC,SAAAA;mBAAKA,EAAEP,KAAK;;IAC9C,IAAIM,IAAI;mBAAC,kBAAA,SAAON,OAAU;;;;wBACxB;;4BAAMF,QAAQU,GAAG,CAACZ,MAAMa,GAAG,CAACC,SAAAA;uCAAKA,EAAEL,OAAO;;;;wBAA1C;wBACA;;4BAAO;gCAAEL,OAAAA;gCAAOI,MAAM,IAAI;4BAAC;;;;QAC7B;wBAHgBJ;;;;IAKhB,OACE,oBAACW,OAAOC,aAAa,EAArB,WAAyB;QACvB,OAAO;YACLX,MAAAA,SAAAA,OAAO;oBAELY;gBADA,IAAMA,UAAUjB,KAAK,CAAC,EAAE;gBACxBiB,oBAAAA,qBAAAA,KAAAA,IAAAA,CAAAA,mBAAAA,QAASR,OAAO,cAAhBQ,8BAAAA,KAAAA,IAAAA,iBAAkBP,KAAK;2BAAMV,MAAMkB,KAAK;;gBACxC,OAAOD,oBAAAA,qBAAAA,KAAAA,IAAAA,QAASR,OAAO;YACzB;QACF;IACF;AAEJ"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { defer } from "./defer.js";
|
|
2
|
+
export const generatorify = (task)=>{
|
|
3
|
+
const dPoll = [
|
|
4
|
+
defer()
|
|
5
|
+
];
|
|
6
|
+
Promise.resolve(task((value)=>{
|
|
7
|
+
const next = defer();
|
|
8
|
+
const prev = dPoll.push(next) - 2;
|
|
9
|
+
dPoll[prev].resolve({
|
|
10
|
+
value,
|
|
11
|
+
done: false
|
|
12
|
+
});
|
|
13
|
+
return dPoll[prev].promise.then((v)=>v.value);
|
|
14
|
+
})).then(async (value)=>{
|
|
15
|
+
await Promise.all(dPoll.map((d)=>d.promise));
|
|
16
|
+
return {
|
|
17
|
+
value,
|
|
18
|
+
done: true
|
|
19
|
+
};
|
|
20
|
+
});
|
|
21
|
+
return {
|
|
22
|
+
[Symbol.asyncIterator] () {
|
|
23
|
+
return {
|
|
24
|
+
next () {
|
|
25
|
+
const current = dPoll[0];
|
|
26
|
+
current?.promise?.then(()=>dPoll.shift());
|
|
27
|
+
return current?.promise;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=generatorify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["src/generatorify.ts"],"sourcesContent":["import { defer } from './defer';\n\ninterface GeneratorState<T> {\n value: T;\n done: boolean\n}\n\ninterface TaskCallback<T> {\n (value: T): Promise<T>;\n}\n\nexport interface Task<T, R = unknown> {\n (callback: TaskCallback<T>): R;\n}\n\nexport const generatorify = <T, R = unknown>(task: Task<T, R>): AsyncIterable<T> => {\n const dPoll = [defer<GeneratorState<T>>()];\n\n Promise.resolve(task(value => {\n const next = defer<GeneratorState<T>>();\n const prev = dPoll.push(next) - 2;\n dPoll[prev].resolve({ value, done: false });\n return dPoll[prev].promise.then(v => v.value);\n })).then(async (value) => {\n await Promise.all(dPoll.map(d => d.promise));\n return { value, done: true };\n });\n\n return {\n [Symbol.asyncIterator]() {\n return {\n next() {\n const current = dPoll[0];\n current?.promise?.then(() => dPoll.shift());\n return current?.promise;\n },\n };\n }\n };\n}\n"],"names":["defer","generatorify","task","dPoll","Promise","resolve","value","next","prev","push","done","promise","then","v","all","map","d","Symbol","asyncIterator","current","shift"],"mappings":"AAAA,SAASA,KAAK,QAAQ,aAAU;AAehC,OAAO,MAAMC,eAAe,CAAiBC,OAAuC;IAClF,MAAMC,QAAQ;QAACH;KAA2B;IAE1CI,QAAQC,OAAO,CAACH,KAAKI,CAAAA,QAAS;QAC5B,MAAMC,OAAOP;QACb,MAAMQ,OAAOL,MAAMM,IAAI,CAACF,QAAQ;QAChCJ,KAAK,CAACK,KAAK,CAACH,OAAO,CAAC;YAAEC;YAAOI,MAAM,KAAK;QAAC;QACzC,OAAOP,KAAK,CAACK,KAAK,CAACG,OAAO,CAACC,IAAI,CAACC,CAAAA,IAAKA,EAAEP,KAAK;IAC9C,IAAIM,IAAI,CAAC,OAAON,QAAU;QACxB,MAAMF,QAAQU,GAAG,CAACX,MAAMY,GAAG,CAACC,CAAAA,IAAKA,EAAEL,OAAO;QAC1C,OAAO;YAAEL;YAAOI,MAAM,IAAI;QAAC;IAC7B;IAEA,OAAO;QACL,CAACO,OAAOC,aAAa,CAAC,IAAG;YACvB,OAAO;gBACLX,QAAO;oBACL,MAAMY,UAAUhB,KAAK,CAAC,EAAE;oBACxBgB,SAASR,SAASC,KAAK,IAAMT,MAAMiB,KAAK;oBACxC,OAAOD,SAASR;gBAClB;YACF;QACF;IACF;AACF,EAAC"}
|
package/build/index.cjs
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: all[name]
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
defer: function() {
|
|
13
|
+
return _deferCjs.defer;
|
|
14
|
+
},
|
|
15
|
+
Deferred: function() {
|
|
16
|
+
return _deferCjs.Deferred;
|
|
17
|
+
},
|
|
18
|
+
State: function() {
|
|
19
|
+
return _deferCjs.State;
|
|
20
|
+
},
|
|
21
|
+
generatorify: function() {
|
|
22
|
+
return _generatorifyCjs.generatorify;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
var _deferCjs = require("./defer.cjs");
|
|
26
|
+
var _generatorifyCjs = require("./generatorify.cjs");
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["src/index.ts"],"sourcesContent":["export { defer, Deferred, State } from './defer';\nexport { generatorify } from './generatorify';\n"],"names":["defer","Deferred","State","generatorify"],"mappings":";;;;;;;;;;;IAASA,KAAK;eAALA,eAAK;;IAAEC,QAAQ;eAARA,kBAAQ;;IAAEC,KAAK;eAALA,eAAK;;IACtBC,YAAY;eAAZA,6BAAY;;;wBADkB;+BACV"}
|
package/build/index.d.ts
ADDED
package/build/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["src/index.ts"],"sourcesContent":["export { defer, Deferred, State } from './defer';\nexport { generatorify } from './generatorify';\n"],"names":["defer","Deferred","State","generatorify"],"mappings":"AAAA,SAASA,KAAK,EAAEC,QAAQ,EAAEC,KAAK,QAAQ,aAAU;AACjD,SAASC,YAAY,QAAQ,oBAAiB"}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "asygen",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "0-Deps, simple and fast async generator library for browser and NodeJS",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "build/index.cjs",
|
|
7
|
+
"types": "build/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"build",
|
|
10
|
+
"src/index.ts"
|
|
11
|
+
],
|
|
12
|
+
"module": "build/index.js",
|
|
13
|
+
"sideEffects": false,
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "rm -rf build && ./scripts/build.js && tsc --declaration --emitDeclarationOnly",
|
|
16
|
+
"test": "jest",
|
|
17
|
+
"test:build": "node src/__tests__/index.cjs && node src/__tests__/index.mjs"
|
|
18
|
+
},
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=15"
|
|
21
|
+
},
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "git+https://github.com/3axap4eHko/asygen.git"
|
|
25
|
+
},
|
|
26
|
+
"funding": "https://github.com/sponsors/3axap4eHko",
|
|
27
|
+
"author": {
|
|
28
|
+
"name": "Ivan Zakharchanka",
|
|
29
|
+
"email": "3axap4eHko@gmail.com",
|
|
30
|
+
"url": "https://linkedin.com/in/3axap4eHko"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [],
|
|
33
|
+
"license": "Apache-2.0",
|
|
34
|
+
"bugs": {
|
|
35
|
+
"url": "https://github.com/3axap4eHko/asygen/issues"
|
|
36
|
+
},
|
|
37
|
+
"homepage": "https://github.com/3axap4eHko/asygen#readme",
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@swc/cli": "^0.1.62",
|
|
40
|
+
"@swc/core": "^1.3.41",
|
|
41
|
+
"@swc/jest": "^0.2.24",
|
|
42
|
+
"@types/jest": "^29.5.0",
|
|
43
|
+
"@types/node": "^18.15.3",
|
|
44
|
+
"glob": "^9.3.0",
|
|
45
|
+
"jest": "^29.5.0",
|
|
46
|
+
"typescript": "^5.0.2"
|
|
47
|
+
}
|
|
48
|
+
}
|
package/src/index.ts
ADDED