@gjsify/events 0.3.21 → 0.4.3
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/lib/esm/_virtual/_rolldown/runtime.js +1 -0
- package/lib/esm/event-emitter.js +1 -1
- package/package.json +44 -40
- package/src/callable.spec.ts +0 -146
- package/src/event-emitter.spec.ts +0 -1384
- package/src/event-emitter.ts +0 -747
- package/src/index.ts +0 -28
- package/src/spec-aliases.d.ts +0 -7
- package/src/test.mts +0 -7
- package/tsconfig.json +0 -31
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=Object.defineProperty,__name=(t,n)=>e(t,`name`,{value:n,configurable:!0});export{__name};
|
package/lib/esm/event-emitter.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=Symbol(`kCapture`),t=Symbol.for(`nodejs.rejection`);function onceWrapper(){let{target:e,type:t,listener:n}=this;return this.wrapperFn&&e.removeListener(t,this.wrapperFn),n.apply(e,arguments)}function _onceWrap(e,t,n){let r={target:e,type:t,listener:n,wrapperFn:void 0},i=onceWrapper.bind(r);return r.wrapperFn=i,i.listener=n,i}function arrayClone(e){switch(e.length){case 0:return[];case 1:return[e[0]];case 2:return[e[0],e[1]];case 3:return[e[0],e[1],e[2]];default:return e.slice()}}function checkListener(e){if(typeof e!=`function`)throw TypeError(`The "listener" argument must be of type Function. Received type `+typeof e)}function validateNumber(e,t){if(typeof e!=`number`||e!==e)throw TypeError(`The "${t}" argument must be of type number. Received type ${typeof e}`)}function spliceOne(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}var n=class EventEmitter{static defaultMaxListeners=10;static errorMonitor=Symbol(`events.errorMonitor`);static captureRejectionSymbol=t;static _captureRejections=!1;static get captureRejections(){return EventEmitter._captureRejections}static set captureRejections(e){if(typeof e!=`boolean`)throw TypeError(`The "captureRejections" argument must be of type boolean.`);EventEmitter._captureRejections=e}_events;_eventsCount;_maxListeners;[e];constructor(t){this._events=Object.create(null),this._eventsCount=0,this._maxListeners=void 0,this[e]=t?.captureRejections??EventEmitter._captureRejections}setMaxListeners(e){if(validateNumber(e,`n`),e<0)throw RangeError(`The value of "n" is out of range. It must be a non-negative number. Received `+e);return this._maxListeners=e,this}getMaxListeners(){return this._maxListeners??EventEmitter.defaultMaxListeners}emit(t,...n){let r=this._events,i=t===`error`;if(r!==void 0)i&&r[EventEmitter.errorMonitor]!==void 0&&this.emit(EventEmitter.errorMonitor,...n),i&&=r.error===void 0;else if(!i)return!1;if(i){let e;if(e=n.length>0?n[0]:Error(`Unhandled error.`),e instanceof Error)throw e;let t=Error(`Unhandled error. (`+e+`)`);throw t.context=e,t}let a=r[t];if(a===void 0)return!1;if(typeof a==`function`){let r=a.apply(this,n);r!=null&&this[e]&&this._addCatch(r,t,n)}else{let r=arrayClone(a),i=r.length;for(let a=0;a<i;++a){let i=r[a].apply(this,n);i!=null&&this[e]&&this._addCatch(i,t,n)}}return!0}_addCatch(n,r,i){typeof n?.then==`function`&&n.then(void 0,n=>{let a=this[t];if(typeof a==`function`)a.call(this,n,r,...i);else{let t=this[e];try{this[e]=!1,this.emit(`error`,n)}finally{this[e]=t}}})}addListener(e,t){return this._addListener(e,t,!1)}on(e,t){return this._addListener(e,t,!1)}prependListener(e,t){return this._addListener(e,t,!0)}_addListener(e,t,n){checkListener(t);let r=this._events;r===void 0?(r=this._events=Object.create(null),this._eventsCount=0):r.newListener!==void 0&&(this.emit(`newListener`,e,t.listener??t),r=this._events);let i=r[e];i===void 0?(r[e]=t,++this._eventsCount):typeof i==`function`?r[e]=n?[t,i]:[i,t]:n?i.unshift(t):i.push(t);let a=this.getMaxListeners();if(a>0){let t=typeof r[e]==`function`?1:r[e].length;if(t>a&&!r[e].warned){typeof r[e]!=`function`&&(r[e].warned=!0);let n=Error(`Possible EventEmitter memory leak detected. ${t} ${String(e)} listeners added to [${this.constructor.name}]. Use emitter.setMaxListeners() to increase limit`);n.name=`MaxListenersExceededWarning`,console.warn(n.message)}}return this}once(e,t){return checkListener(t),this.on(e,_onceWrap(this,e,t)),this}prependOnceListener(e,t){return checkListener(t),this.prependListener(e,_onceWrap(this,e,t)),this}removeListener(e,t){checkListener(t);let n=this._events;if(n===void 0)return this;let r=n[e];if(r===void 0)return this;if(r===t||r.listener===t)--this._eventsCount===0?this._events=Object.create(null):(delete n[e],n.removeListener&&this.emit(`removeListener`,e,r.listener??t));else if(typeof r!=`function`){let i=-1;for(let e=r.length-1;e>=0;e--)if(r[e]===t||r[e].listener===t){i=e;break}if(i<0)return this;i===0?r.shift():spliceOne(r,i),r.length===1&&(n[e]=r[0]),n.removeListener!==void 0&&this.emit(`removeListener`,e,t.listener??t)}return this}off(e,t){return this.removeListener(e,t)}removeAllListeners(e){let t=this._events;if(t===void 0)return this;if(t.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):t[e]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete t[e]),this;if(arguments.length===0){let e=Object.keys(t);for(let t=0;t<e.length;++t){let n=e[t];n!==`removeListener`&&this.removeAllListeners(n)}return this.removeAllListeners(`removeListener`),this._events=Object.create(null),this._eventsCount=0,this}let n=t[e];if(typeof n==`function`)this.removeListener(e,n);else if(n!==void 0)for(let t=n.length-1;t>=0;t--)this.removeListener(e,n[t]);return this}listeners(e){let t=this._events;if(t===void 0)return[];let n=t[e];return n===void 0?[]:typeof n==`function`?[n.listener??n]:unwrapListeners(n)}rawListeners(e){let t=this._events;if(t===void 0)return[];let n=t[e];return n===void 0?[]:typeof n==`function`?[n]:arrayClone(n)}listenerCount(e){let t=this._events;if(t===void 0)return 0;let n=t[e];return n===void 0?0:typeof n==`function`?1:n.length}eventNames(){return(this._eventsCount??0)>0?Reflect.ownKeys(this._events):[]}static once(e,t,n){return new Promise((r,i)=>{let a=n?.signal;if(a?.aborted){i(createAbortError(a));return}if(typeof e.addEventListener==`function`){let n=e,handler=(...e)=>{a&&a.removeEventListener(`abort`,abortHandler),r(e)},errorHandler=e=>{a&&a.removeEventListener(`abort`,abortHandler),n.removeEventListener(`error`,errorHandler),i(e)},abortHandler=()=>{n.removeEventListener(t,handler),n.removeEventListener(`error`,errorHandler),i(createAbortError(a))};n.addEventListener(t,handler,{once:!0}),t!==`error`&&n.addEventListener(`error`,errorHandler,{once:!0}),a&&a.addEventListener(`abort`,abortHandler,{once:!0});return}let o=e,eventHandler=(...e)=>{a&&a.removeEventListener(`abort`,abortHandler),errorHandler!==void 0&&o.removeListener(`error`,errorHandler),r(e)},errorHandler;t!==`error`&&(errorHandler=e=>{o.removeListener(t,eventHandler),a&&a.removeEventListener(`abort`,abortHandler),i(e)},o.once(`error`,errorHandler)),o.once(t,eventHandler);let abortHandler=()=>{o.removeListener(t,eventHandler),errorHandler&&o.removeListener(`error`,errorHandler),i(createAbortError(a))};a&&a.addEventListener(`abort`,abortHandler,{once:!0})})}static on(e,t,n){let r=n?.signal;if(r?.aborted)throw createAbortError(r);let i=n?.highWaterMark??2**53-1,a=n?.lowWaterMark??1;validateNumber(i,`highWaterMark`),validateNumber(a,`lowWaterMark`);let o=[],s=[],c=null,l=!1,u=!1,eventHandler=(...t)=>{if(s.length>0){let{resolve:e}=s.shift();e({value:t,done:!1})}else o.push(t),o.length>=i&&!u&&(u=!0,typeof e.pause==`function`&&e.pause())},errorHandler=e=>{if(c=e,s.length>0){let{reject:t}=s.shift();t(e)}d.return()},abortHandler=()=>{errorHandler(createAbortError(r))};e.on(t,eventHandler),t!==`error`&&e.on(`error`,errorHandler),r&&r.addEventListener(`abort`,abortHandler,{once:!0});let cleanup=()=>{e.removeListener(t,eventHandler),e.removeListener(`error`,errorHandler),r&&r.removeEventListener(`abort`,abortHandler),l=!0;for(let{resolve:e}of s)e({value:void 0,done:!0});s.length=0,o.length=0},d={next(){if(o.length>0){let t=o.shift();return u&&o.length<a&&(u=!1,typeof e.resume==`function`&&e.resume()),Promise.resolve({value:t,done:!1})}if(c){let e=Promise.reject(c);return c=null,e}return l?Promise.resolve({value:void 0,done:!0}):new Promise((e,t)=>{s.push({resolve:e,reject:t})})},return(){return cleanup(),Promise.resolve({value:void 0,done:!0})},throw(e){return l||(c=e,cleanup()),Promise.reject(e)},[Symbol.asyncIterator](){return this}};return d}static listenerCount(e,t){return e.listenerCount(t)}static getEventListeners(e,t){return typeof e.listeners==`function`?e.listeners(t):[]}static setMaxListeners(e,...t){if(validateNumber(e,`n`),e<0)throw RangeError(`The value of "n" is out of range.`);if(t.length===0)EventEmitter.defaultMaxListeners=e;else for(let n of t)typeof n.setMaxListeners==`function`&&n.setMaxListeners(e)}static getMaxListeners(e){return typeof e.getMaxListeners==`function`?e.getMaxListeners():EventEmitter.defaultMaxListeners}static addAbortListener(e,t){e.aborted&&Promise.resolve().then(()=>t());let handler=()=>t();return e.addEventListener(`abort`,handler,{once:!0}),{[Symbol.dispose](){e.removeEventListener(`abort`,handler)}}}};n.EventEmitter=n;for(let e of[`setMaxListeners`,`getMaxListeners`,`emit`,`addListener`,`on`,`prependListener`,`once`,`prependOnceListener`,`removeListener`,`off`,`removeAllListeners`,`listeners`,`rawListeners`,`listenerCount`,`eventNames`]){let t=n.prototype[e];typeof t==`function`&&Object.defineProperty(n.prototype,e,{enumerable:!0,configurable:!0,writable:!0,value:t})}Object.defineProperty(n.prototype,`_events`,{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(n.prototype,`_eventsCount`,{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(n.prototype,`_maxListeners`,{enumerable:!0,configurable:!0,writable:!0,value:void 0});function unwrapListeners(e){let t=Array(e.length);for(let n=0;n<t.length;++n)t[n]=e[n].listener??e[n];return t}function createAbortError(e){let t=Error(`The operation was aborted`);return t.name=`AbortError`,t.code=`ABORT_ERR`,e?.reason&&(t.cause=e.reason),t}export{n as EventEmitter};
|
|
1
|
+
import"./_virtual/_rolldown/runtime.js";const e=Symbol(`kCapture`),t=Symbol.for(`nodejs.rejection`);function onceWrapper(){let{target:e,type:t,listener:n}=this;return this.wrapperFn&&e.removeListener(t,this.wrapperFn),n.apply(e,arguments)}function _onceWrap(e,t,n){let r={target:e,type:t,listener:n,wrapperFn:void 0},i=onceWrapper.bind(r);return r.wrapperFn=i,i.listener=n,i}function arrayClone(e){switch(e.length){case 0:return[];case 1:return[e[0]];case 2:return[e[0],e[1]];case 3:return[e[0],e[1],e[2]];default:return e.slice()}}function checkListener(e){if(typeof e!=`function`)throw TypeError(`The "listener" argument must be of type Function. Received type `+typeof e)}function validateNumber(e,t){if(typeof e!=`number`||e!==e)throw TypeError(`The "${t}" argument must be of type number. Received type ${typeof e}`)}function spliceOne(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}var n=class EventEmitter{static defaultMaxListeners=10;static errorMonitor=Symbol(`events.errorMonitor`);static captureRejectionSymbol=t;static _captureRejections=!1;static get captureRejections(){return EventEmitter._captureRejections}static set captureRejections(e){if(typeof e!=`boolean`)throw TypeError(`The "captureRejections" argument must be of type boolean.`);EventEmitter._captureRejections=e}_events;_eventsCount;_maxListeners;[e];constructor(t){this._events=Object.create(null),this._eventsCount=0,this._maxListeners=void 0,this[e]=t?.captureRejections??EventEmitter._captureRejections}setMaxListeners(e){if(validateNumber(e,`n`),e<0)throw RangeError(`The value of "n" is out of range. It must be a non-negative number. Received `+e);return this._maxListeners=e,this}getMaxListeners(){return this._maxListeners??EventEmitter.defaultMaxListeners}emit(t,...n){let r=this._events,i=t===`error`;if(r!==void 0)i&&r[EventEmitter.errorMonitor]!==void 0&&this.emit(EventEmitter.errorMonitor,...n),i&&=r.error===void 0;else if(!i)return!1;if(i){let e;if(e=n.length>0?n[0]:Error(`Unhandled error.`),e instanceof Error)throw e;let t=Error(`Unhandled error. (`+e+`)`);throw t.context=e,t}let a=r[t];if(a===void 0)return!1;if(typeof a==`function`){let r=a.apply(this,n);r!=null&&this[e]&&this._addCatch(r,t,n)}else{let r=arrayClone(a),i=r.length;for(let a=0;a<i;++a){let i=r[a].apply(this,n);i!=null&&this[e]&&this._addCatch(i,t,n)}}return!0}_addCatch(n,r,i){typeof n?.then==`function`&&n.then(void 0,n=>{let a=this[t];if(typeof a==`function`)a.call(this,n,r,...i);else{let t=this[e];try{this[e]=!1,this.emit(`error`,n)}finally{this[e]=t}}})}addListener(e,t){return this._addListener(e,t,!1)}on(e,t){return this._addListener(e,t,!1)}prependListener(e,t){return this._addListener(e,t,!0)}_addListener(e,t,n){checkListener(t);let r=this._events;r===void 0?(r=this._events=Object.create(null),this._eventsCount=0):r.newListener!==void 0&&(this.emit(`newListener`,e,t.listener??t),r=this._events);let i=r[e];i===void 0?(r[e]=t,++this._eventsCount):typeof i==`function`?r[e]=n?[t,i]:[i,t]:n?i.unshift(t):i.push(t);let a=this.getMaxListeners();if(a>0){let t=typeof r[e]==`function`?1:r[e].length;if(t>a&&!r[e].warned){typeof r[e]!=`function`&&(r[e].warned=!0);let n=Error(`Possible EventEmitter memory leak detected. ${t} ${String(e)} listeners added to [${this.constructor.name}]. Use emitter.setMaxListeners() to increase limit`);n.name=`MaxListenersExceededWarning`,console.warn(n.message)}}return this}once(e,t){return checkListener(t),this.on(e,_onceWrap(this,e,t)),this}prependOnceListener(e,t){return checkListener(t),this.prependListener(e,_onceWrap(this,e,t)),this}removeListener(e,t){checkListener(t);let n=this._events;if(n===void 0)return this;let r=n[e];if(r===void 0)return this;if(r===t||r.listener===t)--this._eventsCount===0?this._events=Object.create(null):(delete n[e],n.removeListener&&this.emit(`removeListener`,e,r.listener??t));else if(typeof r!=`function`){let i=-1;for(let e=r.length-1;e>=0;e--)if(r[e]===t||r[e].listener===t){i=e;break}if(i<0)return this;i===0?r.shift():spliceOne(r,i),r.length===1&&(n[e]=r[0]),n.removeListener!==void 0&&this.emit(`removeListener`,e,t.listener??t)}return this}off(e,t){return this.removeListener(e,t)}removeAllListeners(e){let t=this._events;if(t===void 0)return this;if(t.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):t[e]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete t[e]),this;if(arguments.length===0){let e=Object.keys(t);for(let t=0;t<e.length;++t){let n=e[t];n!==`removeListener`&&this.removeAllListeners(n)}return this.removeAllListeners(`removeListener`),this._events=Object.create(null),this._eventsCount=0,this}let n=t[e];if(typeof n==`function`)this.removeListener(e,n);else if(n!==void 0)for(let t=n.length-1;t>=0;t--)this.removeListener(e,n[t]);return this}listeners(e){let t=this._events;if(t===void 0)return[];let n=t[e];return n===void 0?[]:typeof n==`function`?[n.listener??n]:unwrapListeners(n)}rawListeners(e){let t=this._events;if(t===void 0)return[];let n=t[e];return n===void 0?[]:typeof n==`function`?[n]:arrayClone(n)}listenerCount(e){let t=this._events;if(t===void 0)return 0;let n=t[e];return n===void 0?0:typeof n==`function`?1:n.length}eventNames(){return(this._eventsCount??0)>0?Reflect.ownKeys(this._events):[]}static once(e,t,n){return new Promise((r,i)=>{let a=n?.signal;if(a?.aborted){i(createAbortError(a));return}if(typeof e.addEventListener==`function`){let n=e,handler=(...e)=>{a&&a.removeEventListener(`abort`,abortHandler),r(e)},errorHandler=e=>{a&&a.removeEventListener(`abort`,abortHandler),n.removeEventListener(`error`,errorHandler),i(e)},abortHandler=()=>{n.removeEventListener(t,handler),n.removeEventListener(`error`,errorHandler),i(createAbortError(a))};n.addEventListener(t,handler,{once:!0}),t!==`error`&&n.addEventListener(`error`,errorHandler,{once:!0}),a&&a.addEventListener(`abort`,abortHandler,{once:!0});return}let o=e,eventHandler=(...e)=>{a&&a.removeEventListener(`abort`,abortHandler),errorHandler!==void 0&&o.removeListener(`error`,errorHandler),r(e)},errorHandler;t!==`error`&&(errorHandler=e=>{o.removeListener(t,eventHandler),a&&a.removeEventListener(`abort`,abortHandler),i(e)},o.once(`error`,errorHandler)),o.once(t,eventHandler);let abortHandler=()=>{o.removeListener(t,eventHandler),errorHandler&&o.removeListener(`error`,errorHandler),i(createAbortError(a))};a&&a.addEventListener(`abort`,abortHandler,{once:!0})})}static on(e,t,n){let r=n?.signal;if(r?.aborted)throw createAbortError(r);let i=n?.highWaterMark??2**53-1,a=n?.lowWaterMark??1;validateNumber(i,`highWaterMark`),validateNumber(a,`lowWaterMark`);let o=[],s=[],c=null,l=!1,u=!1,eventHandler=(...t)=>{if(s.length>0){let{resolve:e}=s.shift();e({value:t,done:!1})}else o.push(t),o.length>=i&&!u&&(u=!0,typeof e.pause==`function`&&e.pause())},errorHandler=e=>{if(c=e,s.length>0){let{reject:t}=s.shift();t(e)}d.return()},abortHandler=()=>{errorHandler(createAbortError(r))};e.on(t,eventHandler),t!==`error`&&e.on(`error`,errorHandler),r&&r.addEventListener(`abort`,abortHandler,{once:!0});let cleanup=()=>{e.removeListener(t,eventHandler),e.removeListener(`error`,errorHandler),r&&r.removeEventListener(`abort`,abortHandler),l=!0;for(let{resolve:e}of s)e({value:void 0,done:!0});s.length=0,o.length=0},d={next(){if(o.length>0){let t=o.shift();return u&&o.length<a&&(u=!1,typeof e.resume==`function`&&e.resume()),Promise.resolve({value:t,done:!1})}if(c){let e=Promise.reject(c);return c=null,e}return l?Promise.resolve({value:void 0,done:!0}):new Promise((e,t)=>{s.push({resolve:e,reject:t})})},return(){return cleanup(),Promise.resolve({value:void 0,done:!0})},throw(e){return l||(c=e,cleanup()),Promise.reject(e)},[Symbol.asyncIterator](){return this}};return d}static listenerCount(e,t){return e.listenerCount(t)}static getEventListeners(e,t){return typeof e.listeners==`function`?e.listeners(t):[]}static setMaxListeners(e,...t){if(validateNumber(e,`n`),e<0)throw RangeError(`The value of "n" is out of range.`);if(t.length===0)EventEmitter.defaultMaxListeners=e;else for(let n of t)typeof n.setMaxListeners==`function`&&n.setMaxListeners(e)}static getMaxListeners(e){return typeof e.getMaxListeners==`function`?e.getMaxListeners():EventEmitter.defaultMaxListeners}static addAbortListener(e,t){e.aborted&&Promise.resolve().then(()=>t());let handler=()=>t();return e.addEventListener(`abort`,handler,{once:!0}),{[Symbol.dispose](){e.removeEventListener(`abort`,handler)}}}};n.EventEmitter=n;for(let e of[`setMaxListeners`,`getMaxListeners`,`emit`,`addListener`,`on`,`prependListener`,`once`,`prependOnceListener`,`removeListener`,`off`,`removeAllListeners`,`listeners`,`rawListeners`,`listenerCount`,`eventNames`]){let t=n.prototype[e];typeof t==`function`&&Object.defineProperty(n.prototype,e,{enumerable:!0,configurable:!0,writable:!0,value:t})}Object.defineProperty(n.prototype,`_events`,{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(n.prototype,`_eventsCount`,{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(n.prototype,`_maxListeners`,{enumerable:!0,configurable:!0,writable:!0,value:void 0});function unwrapListeners(e){let t=Array(e.length);for(let n=0;n<t.length;++n)t[n]=e[n].listener??e[n];return t}function createAbortError(e){let t=Error(`The operation was aborted`);return t.name=`AbortError`,t.code=`ABORT_ERR`,e?.reason&&(t.cause=e.reason),t}export{n as EventEmitter};
|
package/package.json
CHANGED
|
@@ -1,42 +1,46 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
2
|
+
"name": "@gjsify/events",
|
|
3
|
+
"version": "0.4.3",
|
|
4
|
+
"description": "Node.js events module for Gjs",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"module": "lib/esm/index.js",
|
|
7
|
+
"types": "lib/types/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./lib/types/index.d.ts",
|
|
11
|
+
"require": "./cjs-compat.cjs",
|
|
12
|
+
"default": "./lib/esm/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"lib",
|
|
17
|
+
"cjs-compat.cjs"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"clear": "rm -rf lib tsconfig.tsbuildinfo tsconfig.types.tsbuildinfo test.gjs.mjs test.node.mjs || exit 0",
|
|
21
|
+
"check": "tsc --noEmit",
|
|
22
|
+
"build": "gjsify run build:gjsify && gjsify run build:types",
|
|
23
|
+
"build:gjsify": "gjsify build --library 'src/**/*.{ts,js}' --exclude 'src/**/*.spec.{mts,ts}' 'src/test.{mts,ts}'",
|
|
24
|
+
"build:types": "tsc",
|
|
25
|
+
"build:test": "gjsify run build:test:gjs && gjsify run build:test:node",
|
|
26
|
+
"build:test:gjs": "gjsify build src/test.mts --app gjs --outfile test.gjs.mjs",
|
|
27
|
+
"build:test:node": "gjsify build src/test.mts --app node --outfile test.node.mjs",
|
|
28
|
+
"test": "gjsify run build:gjsify && gjsify run build:test && gjsify run test:node && gjsify run test:gjs",
|
|
29
|
+
"test:gjs": "gjsify run test.gjs.mjs",
|
|
30
|
+
"test:node": "node test.node.mjs"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"gjs",
|
|
34
|
+
"node",
|
|
35
|
+
"events"
|
|
36
|
+
],
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"@gjsify/utils": "workspace:^"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@gjsify/cli": "workspace:^",
|
|
42
|
+
"@gjsify/unit": "workspace:^",
|
|
43
|
+
"@types/node": "^25.6.2",
|
|
44
|
+
"typescript": "^6.0.3"
|
|
13
45
|
}
|
|
14
|
-
|
|
15
|
-
"scripts": {
|
|
16
|
-
"clear": "rm -rf lib tsconfig.tsbuildinfo tsconfig.types.tsbuildinfo test.gjs.mjs test.node.mjs || exit 0",
|
|
17
|
-
"check": "tsc --noEmit",
|
|
18
|
-
"build": "yarn build:gjsify && yarn build:types",
|
|
19
|
-
"build:gjsify": "gjsify build --library 'src/**/*.{ts,js}' --exclude 'src/**/*.spec.{mts,ts}' 'src/test.{mts,ts}'",
|
|
20
|
-
"build:types": "tsc",
|
|
21
|
-
"build:test": "yarn build:test:gjs && yarn build:test:node",
|
|
22
|
-
"build:test:gjs": "gjsify build src/test.mts --app gjs --outfile test.gjs.mjs",
|
|
23
|
-
"build:test:node": "gjsify build src/test.mts --app node --outfile test.node.mjs",
|
|
24
|
-
"test": "yarn build:gjsify && yarn build:test && yarn test:node && yarn test:gjs",
|
|
25
|
-
"test:gjs": "gjsify run test.gjs.mjs",
|
|
26
|
-
"test:node": "node test.node.mjs"
|
|
27
|
-
},
|
|
28
|
-
"keywords": [
|
|
29
|
-
"gjs",
|
|
30
|
-
"node",
|
|
31
|
-
"events"
|
|
32
|
-
],
|
|
33
|
-
"dependencies": {
|
|
34
|
-
"@gjsify/utils": "^0.3.21"
|
|
35
|
-
},
|
|
36
|
-
"devDependencies": {
|
|
37
|
-
"@gjsify/cli": "^0.3.21",
|
|
38
|
-
"@gjsify/unit": "^0.3.21",
|
|
39
|
-
"@types/node": "^25.6.2",
|
|
40
|
-
"typescript": "^6.0.3"
|
|
41
|
-
}
|
|
42
|
-
}
|
|
46
|
+
}
|
package/src/callable.spec.ts
DELETED
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
// Legacy `.call(this)` + `util.inherits(Sub, EventEmitter)` compatibility tests.
|
|
2
|
-
//
|
|
3
|
-
// Regression coverage for the `makeCallable` Proxy wrapper in @gjsify/utils:
|
|
4
|
-
// `EventEmitter.call(this)` from CJS consumers must not throw
|
|
5
|
-
// "TypeError: Class constructor EventEmitter cannot be invoked without 'new'".
|
|
6
|
-
//
|
|
7
|
-
// Ported from refs/node-test/parallel/test-util-inherits.js
|
|
8
|
-
// Original: MIT license, Node.js contributors
|
|
9
|
-
// Modifications: adapted to @gjsify/unit, scoped to EventEmitter.
|
|
10
|
-
|
|
11
|
-
import { describe, it, expect } from '@gjsify/unit';
|
|
12
|
-
import { EventEmitter } from 'node:events';
|
|
13
|
-
import { inherits } from 'node:util';
|
|
14
|
-
|
|
15
|
-
export default async () => {
|
|
16
|
-
await describe('EventEmitter.makeCallable: new invocation still works', async () => {
|
|
17
|
-
await it('new EventEmitter() returns a valid instance', async () => {
|
|
18
|
-
const ee = new EventEmitter();
|
|
19
|
-
expect(typeof ee.on).toBe('function');
|
|
20
|
-
expect(typeof ee.emit).toBe('function');
|
|
21
|
-
expect(typeof ee.removeListener).toBe('function');
|
|
22
|
-
expect(ee instanceof EventEmitter).toBe(true);
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
await it('instance methods are available after new', async () => {
|
|
26
|
-
const ee = new EventEmitter();
|
|
27
|
-
const results: string[] = [];
|
|
28
|
-
ee.on('data', (v: string) => results.push(v));
|
|
29
|
-
ee.emit('data', 'hello');
|
|
30
|
-
expect(results).toEqualArray(['hello']);
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
await it('EventEmitter.prototype is accessible', async () => {
|
|
34
|
-
expect(typeof (EventEmitter as any).prototype).toBe('object');
|
|
35
|
-
expect(typeof (EventEmitter as any).prototype.on).toBe('function');
|
|
36
|
-
expect(typeof (EventEmitter as any).prototype.emit).toBe('function');
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
await it('instanceof works after new', async () => {
|
|
40
|
-
const ee = new EventEmitter();
|
|
41
|
-
expect(ee instanceof EventEmitter).toBe(true);
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
await describe('EventEmitter.makeCallable: EventEmitter.call(this)', async () => {
|
|
46
|
-
await it('EventEmitter.call(plain) assigns EventEmitter state', async () => {
|
|
47
|
-
const plain: any = Object.create((EventEmitter as any).prototype);
|
|
48
|
-
(EventEmitter as any).call(plain);
|
|
49
|
-
// After .call(), the instance should be usable as an EventEmitter
|
|
50
|
-
let received: string | undefined;
|
|
51
|
-
plain.on('ping', (msg: string) => { received = msg; });
|
|
52
|
-
plain.emit('ping', 'pong');
|
|
53
|
-
expect(received).toBe('pong');
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
await it('EventEmitter.call(this) does not throw', async () => {
|
|
57
|
-
let threw = false;
|
|
58
|
-
try {
|
|
59
|
-
const ctx: any = Object.create((EventEmitter as any).prototype);
|
|
60
|
-
(EventEmitter as any).call(ctx);
|
|
61
|
-
} catch {
|
|
62
|
-
threw = true;
|
|
63
|
-
}
|
|
64
|
-
expect(threw).toBe(false);
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
await it('EventEmitter.call(this) — resulting object has on/emit/removeListener', async () => {
|
|
68
|
-
const ctx: any = Object.create((EventEmitter as any).prototype);
|
|
69
|
-
(EventEmitter as any).call(ctx);
|
|
70
|
-
expect(typeof ctx.on).toBe('function');
|
|
71
|
-
expect(typeof ctx.emit).toBe('function');
|
|
72
|
-
expect(typeof ctx.removeListener).toBe('function');
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
await describe('EventEmitter.makeCallable: util.inherits pattern', async () => {
|
|
77
|
-
await it('util.inherits(Sub, EventEmitter) + Sub.call pattern', async () => {
|
|
78
|
-
function MyEmitter(this: any) {
|
|
79
|
-
(EventEmitter as any).call(this);
|
|
80
|
-
this.name = 'my-emitter';
|
|
81
|
-
}
|
|
82
|
-
inherits(MyEmitter as any, EventEmitter as any);
|
|
83
|
-
|
|
84
|
-
const ee: any = new (MyEmitter as any)();
|
|
85
|
-
expect(ee.name).toBe('my-emitter');
|
|
86
|
-
expect(typeof ee.on).toBe('function');
|
|
87
|
-
expect(typeof ee.emit).toBe('function');
|
|
88
|
-
expect(ee instanceof EventEmitter).toBe(true);
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
await it('events emitted by inherits-based subclass work correctly', async () => {
|
|
92
|
-
function Counter(this: any) {
|
|
93
|
-
(EventEmitter as any).call(this);
|
|
94
|
-
this.count = 0;
|
|
95
|
-
}
|
|
96
|
-
inherits(Counter as any, EventEmitter as any);
|
|
97
|
-
(Counter.prototype as any).increment = function(this: any) {
|
|
98
|
-
this.count++;
|
|
99
|
-
this.emit('incremented', this.count);
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
const c: any = new (Counter as any)();
|
|
103
|
-
const received: number[] = [];
|
|
104
|
-
c.on('incremented', (n: number) => received.push(n));
|
|
105
|
-
c.increment();
|
|
106
|
-
c.increment();
|
|
107
|
-
c.increment();
|
|
108
|
-
expect(c.count).toBe(3);
|
|
109
|
-
expect(received).toEqualArray([1, 2, 3]);
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
await it('multi-level inherits (A extends EE, B extends A)', async () => {
|
|
113
|
-
function A(this: any) {
|
|
114
|
-
(EventEmitter as any).call(this);
|
|
115
|
-
this.levelA = true;
|
|
116
|
-
}
|
|
117
|
-
inherits(A as any, EventEmitter as any);
|
|
118
|
-
|
|
119
|
-
function B(this: any) {
|
|
120
|
-
(A as any).call(this);
|
|
121
|
-
this.levelB = true;
|
|
122
|
-
}
|
|
123
|
-
inherits(B as any, A as any);
|
|
124
|
-
|
|
125
|
-
const b: any = new (B as any)();
|
|
126
|
-
expect(b.levelA).toBe(true);
|
|
127
|
-
expect(b.levelB).toBe(true);
|
|
128
|
-
expect(typeof b.on).toBe('function');
|
|
129
|
-
expect(b instanceof EventEmitter).toBe(true);
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
await it('once() works on inherits-based subclass', async () => {
|
|
133
|
-
function OneShot(this: any) {
|
|
134
|
-
(EventEmitter as any).call(this);
|
|
135
|
-
}
|
|
136
|
-
inherits(OneShot as any, EventEmitter as any);
|
|
137
|
-
|
|
138
|
-
const os: any = new (OneShot as any)();
|
|
139
|
-
let callCount = 0;
|
|
140
|
-
os.once('event', () => callCount++);
|
|
141
|
-
os.emit('event');
|
|
142
|
-
os.emit('event'); // second emit should be ignored
|
|
143
|
-
expect(callCount).toBe(1);
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
};
|