@js-toolkit/web-utils 1.59.0 → 1.59.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/EventListeners.js +1 -1
- package/createRafLoop.d.ts +2 -2
- package/createRafLoop.js +1 -1
- package/getAspectRatio.d.ts +3 -3
- package/getGeoLocality.js +1 -1
- package/imageToBlob.js +1 -1
- package/media/TextTracksController/TextTracksController.js +1 -1
- package/media/TextTracksController/utils.d.ts +1 -1
- package/media/getMediaSource.d.ts +1 -1
- package/media/parseCueText.js +1 -1
- package/package.json +14 -14
package/EventListeners.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{EventEmitterListener}from"./EventEmitterListener";export class EventListeners{listeners=new Map;getScopes(){return this.listeners.keys()}scope(e,s){const t=s??"",r=this.listeners.get(e)??new Map;!this.listeners.has(e)&&this.listeners.set(e,r);const i=r.get(t)??new EventEmitterListener(e);return!r.has(t)&&r.set(t,i),i}removeAllListeners(e,s){if(e)
|
|
1
|
+
import{EventEmitterListener}from"./EventEmitterListener";export class EventListeners{listeners=new Map;getScopes(){return this.listeners.keys()}scope(e,s){const t=s??"",r=this.listeners.get(e)??new Map;!this.listeners.has(e)&&this.listeners.set(e,r);const i=r.get(t)??new EventEmitterListener(e);return!r.has(t)&&r.set(t,i),i}removeAllListeners(e,s){if(e){const t=this.listeners.get(e);s?(t?.get(s)?.removeAllListeners(),t?.delete(s),0===t?.size&&this.listeners.delete(e)):(t?.forEach((e=>e.removeAllListeners())),t?.clear(),this.listeners.delete(e))}else this.listeners.forEach((e=>{e.forEach((e=>e.removeAllListeners())),e.clear()})),this.listeners.clear();return this}}
|
package/createRafLoop.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
export interface RafLoopStartOptions {
|
|
2
2
|
readonly suspendTimeout?: number | undefined;
|
|
3
|
-
readonly scope?: AnimationFrameProvider | undefined;
|
|
3
|
+
readonly scope?: (AnimationFrameProvider & WindowOrWorkerGlobalScope) | undefined;
|
|
4
4
|
}
|
|
5
5
|
export interface RafLoop {
|
|
6
6
|
start: (callback: FrameRequestCallback, options?: RafLoopStartOptions) => void;
|
|
7
|
-
stop:
|
|
7
|
+
stop: (waitLast?: boolean) => void;
|
|
8
8
|
isActive: () => boolean;
|
|
9
9
|
}
|
|
10
10
|
export declare function createRafLoop(): RafLoop;
|
package/createRafLoop.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function createRafLoop(){let e,o,
|
|
1
|
+
export function createRafLoop(){let e,t,o,i=!1,n=0,a=window;const r=()=>{a.clearTimeout(e),t&&a.cancelAnimationFrame(t),t=void 0,n=0,e=void 0},s=()=>{t=a.requestAnimationFrame(u)},u=u=>{o&&(i?(o(u),n>0?e=a.setTimeout(s,n):s()):null==t&&null==e||(r(),o(u)))};return{start:(e,{suspendTimeout:t=0,scope:r=window}={})=>{o=e,n=t,a=r,i||(i=!0,s())},stop:e=>{i&&(i=!1,e||r())},isActive:()=>i}}
|
package/getAspectRatio.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
export interface AspectRatio {
|
|
2
|
-
/** Approximate width
|
|
2
|
+
/** Approximate ratio of the width. Eg. 16 of 16/9. */
|
|
3
3
|
width: number;
|
|
4
|
-
/** Approximate height
|
|
4
|
+
/** Approximate ratio of the height. Eg. 9 of 16/9. */
|
|
5
5
|
height: number;
|
|
6
|
-
/** Actual ratio value */
|
|
6
|
+
/** Actual ratio value. */
|
|
7
7
|
ratio: number;
|
|
8
8
|
}
|
|
9
9
|
/** Approximate aspect ratio */
|
package/getGeoLocality.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function getGeoLocality({longitude:e,latitude:r,lang:o}){const s=new URL("https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/reverseGeocode");return s.searchParams.set("f","json"),s.searchParams.set("featureTypes","Locality"),s.searchParams.set("location",`{ x: ${e}, y: ${r} }`),o&&s.searchParams.set("langCode",o),window.fetch(s.toString()).then((e=>e.json())).then((e=>{const{address:r,error:o}=e;if(o)throw new Error(o
|
|
1
|
+
import{getErrorMessage}from"@js-toolkit/utils/getErrorMessage";export function getGeoLocality({longitude:e,latitude:r,lang:o}){const s=new URL("https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/reverseGeocode");return s.searchParams.set("f","json"),s.searchParams.set("featureTypes","Locality"),s.searchParams.set("location",`{ x: ${e}, y: ${r} }`),o&&s.searchParams.set("langCode",o),window.fetch(s.toString()).then((e=>e.json())).then((e=>{const{address:r,error:o}=e;if(o)throw new Error(getErrorMessage(o),{cause:o});return r.PlaceName||r.LongLabel||r.ShortLabel||""}))}
|
package/imageToBlob.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function imageToBlob(
|
|
1
|
+
import{get2dContextError}from"./takeSnapshot";export function imageToBlob(t){return new Promise(((e,o)=>{const r=document.createElement("canvas");r.width=t.width,r.height=t.height;const n=r.getContext("2d");if(!n)throw get2dContextError();n.drawImage(t,0,0),r.toBlob((t=>{t?e(t):o(new Error("Unable to get blob from image."))}))}))}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{EventEmitter}from"eventemitter3";import{EventListeners}from"../../EventListeners";import{MediaNotAttachedError}from"../MediaNotAttachedError";import{parseTextTracks,setActiveTextTrack,addTextTracks,isIOSFullscreen,splitRows,buildCueId}from"./utils";function dispatchNativeEvent(t,e,s){t.dispatchEvent(new CustomEvent(e,{detail:s}))}export class TextTracksController extends EventEmitter{options;eventListeners=new EventListeners;addedTracks=[];textTrackList=[];media;textTrack;nextTextTrack;get Events(){return TextTracksController.Events}constructor(t){super(),this.options={emitNativeEvents:!1,hideActiveTrack:!0,preferCueRowLength:0},t&&this.setOptions(t)}setOptions(t){Object.assign(this.options,{...t,emitNativeEvents:t.emitNativeEvents??this.options.emitNativeEvents,hideActiveTrack:t.hideActiveTrack??this.options.hideActiveTrack,preferCueRowLength:t.preferCueRowLength??this.options.preferCueRowLength})}isAttached(){return!!this.media}getMediaElement(){if(!this.media)throw new MediaNotAttachedError;return this.media}detach(){this.eventListeners.removeAllListeners(),this.media=void 0,this.addedTracks=[],this.textTrackList=[],this.textTrack=void 0,this.nextTextTrack=void 0}attach(t){this.detach();const e=(()=>{const e=[];return s=>{const{activeCues:i}=s.target;if(!i)return;let a=e.length!==i.length;const r=new Array(i.length);for(let t=0;t<r.length;t+=1){const s=i[t];s.id=s.id||buildCueId(s,t),r[t]=s,r[t].rows=splitRows(s.text,this.options.preferCueRowLength),a||e[t]?.id===s.id||(a=!0),e[t]=s}e.length>r.length&&e.splice(r.length-e.length),a&&(this.emit(this.Events.TextTrackCueChanged,{textTrack:s.target,cues:r}),this.options.emitNativeEvents&&dispatchNativeEvent(t,"texttrackcuechange",{textTrack:s.target,cues:r}))}})(),s=()=>{this.textTrackList=parseTextTracks(t),this.emit(this.Events.TextTrackListChanged,{textTracks:this.textTrackList}),this.options.emitNativeEvents&&dispatchNativeEvent(t,"texttracklistchange",{textTracks:this.textTrackList}),setActiveTextTrack(t,this.textTrack??this.nextTextTrack,this.options.hideActiveTrack&&!isIOSFullscreen(t))};this.media=t
|
|
1
|
+
import{EventEmitter}from"eventemitter3";import{EventListeners}from"../../EventListeners";import{MediaNotAttachedError}from"../MediaNotAttachedError";import{parseTextTracks,setActiveTextTrack,addTextTracks,isIOSFullscreen,splitRows,buildCueId}from"./utils";function dispatchNativeEvent(t,e,s){t.dispatchEvent(new CustomEvent(e,{detail:s}))}export class TextTracksController extends EventEmitter{options;eventListeners=new EventListeners;addedTracks=[];textTrackList=[];media;textTrack;nextTextTrack;get Events(){return TextTracksController.Events}constructor(t){super(),this.options={emitNativeEvents:!1,hideActiveTrack:!0,preferCueRowLength:0},t&&this.setOptions(t)}setOptions(t){Object.assign(this.options,{...t,emitNativeEvents:t.emitNativeEvents??this.options.emitNativeEvents,hideActiveTrack:t.hideActiveTrack??this.options.hideActiveTrack,preferCueRowLength:t.preferCueRowLength??this.options.preferCueRowLength})}isAttached(){return!!this.media}getMediaElement(){if(!this.media)throw new MediaNotAttachedError;return this.media}detach(){this.eventListeners.removeAllListeners(),this.media=void 0,this.addedTracks=[],this.textTrackList=[],this.textTrack=void 0,this.nextTextTrack=void 0}attach(t){this.detach();const e=(()=>{const e=[];return s=>{const{activeCues:i}=s.target;if(!i)return;let a=e.length!==i.length;const r=new Array(i.length);for(let t=0;t<r.length;t+=1){const s=i[t];s.id=s.id||buildCueId(s,t),r[t]=s,r[t].rows=splitRows(s.text,this.options.preferCueRowLength),a||e[t]?.id===s.id||(a=!0),e[t]=s}e.length>r.length&&e.splice(r.length-e.length),a&&(this.emit(this.Events.TextTrackCueChanged,{textTrack:s.target,cues:r}),this.options.emitNativeEvents&&dispatchNativeEvent(t,"texttrackcuechange",{textTrack:s.target,cues:r}))}})(),s=()=>{this.textTrackList=parseTextTracks(t),this.emit(this.Events.TextTrackListChanged,{textTracks:this.textTrackList}),this.options.emitNativeEvents&&dispatchNativeEvent(t,"texttracklistchange",{textTracks:this.textTrackList}),setActiveTextTrack(t,this.textTrack??this.nextTextTrack,this.options.hideActiveTrack&&!isIOSFullscreen(t))};this.media=t;let i=!1;const a=t=>{i||s(),this.eventListeners.scope(t).on("cuechange",e)},r=t=>{s(),this.eventListeners.scope(t).off("cuechange",e)};if(this.eventListeners.scope(this.media.textTracks).on("change",(()=>{const{textTracks:e}=t,{nextTextTrack:s}=this;let i=-1;for(let a=0;a<e.length;a+=1){const r=e[a];if(r.language===s?.language&&r.kind===s?.kind||isIOSFullscreen(t)||(r.mode="disabled"),"disabled"!==r.mode&&i>=0&&(r.mode="disabled"),"disabled"!==r.mode){if(i=a,!r.native&&!isIOSFullscreen(t)){const t=this.options.hideActiveTrack?"hidden":"showing";r.mode!==t&&(r.mode=t)}r.native&&r.language===s?.language&&r.kind===s.kind&&(r.mode="showing")}}const a=e[i]&&(this.textTrackList[i]??{id:e[i].id,kind:e[i].kind,language:e[i].language,label:e[i].label});this.textTrack?.language===a?.language&&this.textTrack?.kind===a?.kind||(this.textTrack=a,this.nextTextTrack=this.textTrack,this.emit(this.Events.CurrentTextTrackChanged,{textTrack:this.textTrack,index:i}),this.options.emitNativeEvents&&dispatchNativeEvent(t,"texttrackchange",{textTrack:this.textTrack,index:i}))})).on("addtrack",(({track:t})=>t&&a(t))).on("removetrack",(({track:t})=>t&&r(t))),this.media.textTracks.length>0){this.textTrackList=parseTextTracks(t),i=!0;try{Array.prototype.forEach.call(this.media.textTracks,a),s()}finally{i=!1}}}getTextTracks(){return this.textTrackList}setTextTracks(t){const e=this.getMediaElement();if(this.eventListeners.scope(e,"@@setTextTracks").removeAllListeners(),this.addedTracks.forEach((t=>t.remove())),0===t.length)return;const s=()=>{addTextTracks(e,t,(t=>this.addedTracks.push(t))),this.textTrackList=parseTextTracks(e)};e.readyState>=e.HAVE_CURRENT_DATA?s():this.eventListeners.scope(e,"@@setTextTracks").once("loadeddata",s)}getActiveTextTrack(){return this.textTrack}setActiveTextTrack(t){const e=this.getMediaElement();return this.nextTextTrack=t&&this.textTrackList.find((e=>e.language===t.language&&(!t.kind||e.kind===t.kind))),setActiveTextTrack(e,this.nextTextTrack,this.options.hideActiveTrack&&!isIOSFullscreen(e))}destroy(){this.detach(),this.removeAllListeners()}[Symbol.dispose](){this.destroy()}}!function(t){let e;!function(t){t.TextTrackListChanged="TrackListChanged",t.CurrentTextTrackChanged="CurrentTextTrackChanged",t.TextTrackCueChanged="TextTrackCueChanged"}(e=t.Events||(t.Events={}))}(TextTracksController||(TextTracksController={}));
|
|
@@ -13,7 +13,7 @@ export declare function fakeDetachTextTracks(media: HTMLMediaElement): void;
|
|
|
13
13
|
export declare function parseTextTracks(media: HTMLMediaElement): TextTrackInfo[];
|
|
14
14
|
export declare function isIOSFullscreen(media: HTMLMediaElement): boolean;
|
|
15
15
|
export declare function setActiveTextTrack(media: HTMLMediaElement, tt: ActivateTextTrackInfo | undefined, hideActiveTrack: boolean): boolean;
|
|
16
|
-
/** Dynamically add text tracks */
|
|
16
|
+
/** Dynamically add text tracks if they not exist. */
|
|
17
17
|
export declare function addTextTracks(media: HTMLMediaElement, textTrackList: readonly TextTrackItem[], onAdd: (el: HTMLTrackElement) => void): void;
|
|
18
18
|
export declare function buildCueId(cue: Pick<TextTrackCue, 'startTime'>, index: number): string;
|
|
19
19
|
export declare function splitRows(text: string, preferLineLength: number): string[];
|
|
@@ -14,4 +14,4 @@ declare global {
|
|
|
14
14
|
ManagedMediaSource?: ManagedMediaSource & typeof MediaSource;
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
-
export declare function getMediaSource(managedMediaSource?: 'prefer' | 'maybe'
|
|
17
|
+
export declare function getMediaSource(managedMediaSource?: 'prefer' | 'maybe'): typeof MediaSource | undefined;
|
package/media/parseCueText.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{splitRows}from"./TextTracksController/utils";const ESCAPE={"&":"&","<":"<",">":">","‎":"","‏":""," ":" "},TAG_NAME={c:"span",i:"i",b:"b",u:"u",ruby:"ruby",rt:"rt",lang:"span"},TAG_ANNOTATION={v:"title",lang:"lang"},NEEDS_PARENT={rt:"ruby"};function computeSeconds(e,t,n,o){return 3600*(+e||0)+60*(+t||0)+(+n||0)+(+o||0)/1e3}function parseTimeStamp(e){const t=e.match(/^(\d+):(\d{2})(:\d{2})?\.(\d{3})/);if(!t)return;const[,n,o,r,
|
|
1
|
+
import{splitRows}from"./TextTracksController/utils";const ESCAPE={"&":"&","<":"<",">":">","‎":"","‏":""," ":" "},TAG_NAME={c:"span",i:"i",b:"b",u:"u",ruby:"ruby",rt:"rt",lang:"span"},TAG_ANNOTATION={v:"title",lang:"lang"},NEEDS_PARENT={rt:"ruby"};function computeSeconds(e,t,n,o){return 3600*(+e||0)+60*(+t||0)+(+n||0)+(+o||0)/1e3}function parseTimeStamp(e){const t=e.match(/^(\d+):(\d{2})(:\d{2})?\.(\d{3})/);if(!t)return;const[,n,o,r,l]=t;return l?computeSeconds(n,o,r.replace(":",""),l):+n>59?computeSeconds(n,o,"",l):computeSeconds("",n,o,l)}function unescape(e){let t,n=e;for(;t=n.match(/&(amp|lt|gt|lrm|rlm|nbsp);/);)n=n.replace(t[0],(e=>ESCAPE[e]));return n}function nextToken(e){if(!e)return[e,void 0];const t=e.match(/^([^<]*)(<[^>]*>?)?/);if(!t)return[e,void 0];const n=t[1]?t[1]:t[2];return null==n?[e,n]:[e.substring(n.length),n]}function shouldAdd(e,t){return!NEEDS_PARENT[t.localName]||NEEDS_PARENT[t.localName]===e.localName}function createHtmlNode(e,t){const n=TAG_NAME[e];if(!n)return;const o=window.document.createElement(n),r=TAG_ANNOTATION[e];return r&&t&&(o[r]=t.trim()),o}export function parseCueText(e,t,{preferLength:n=0}={}){let o,r,l=e,s=-1;const c=[],a=[],u=[],i=e=>{0===a.length&&a.push([]),a.at(-1).push(t?t(e,(a.at(-1)??a.at(-2))?.at(-1)):e)},p=e=>{const t=c.pop()??"",n=o;if(o=n.parentElement||void 0,null==o){i({id:e,startTime:s>=0?s:void 0,tag:t,node:n})}},d=()=>`${a.length}-${(a.at(-1)?.length??0)+1}`,m=(e,t)=>{t?u.push(e):u[u.length-1]+=e,t&&a.push([]),null==o?(e=>{const t=createHtmlNode("c","");t.appendChild(window.document.createTextNode(unescape(e)));const n={id:d(),node:t,tag:"c",startTime:s>=0?s:void 0};i(n)})(e):o.appendChild(window.document.createTextNode(unescape(e)))};for(;null!=([l,r]=nextToken(l),r);)if("<"===r[0])if("/"===r[1])c.at(-1)===r.substring(2).replace(">","")&&p(d());else{const e=parseTimeStamp(r.substring(1,r.length-1));if(e)s=e;else{const e=r.match(/^<([^.\s/0-9>]+)(\.[^\s\\>]+)?([^>\\]+)?(\\?)>?$/),t=e&&createHtmlNode(e[1],e[3]);!t||o&&!shouldAdd(o,t)||(e[2]&&(t.className=e[2].substring(1).replace("."," ")),c.push(e[1]),o?.appendChild(t),o=t)}}else if(0===u.length||n>0&&u.at(-1).length+r.length>n){const e=splitRows(r,n);for(let t=0;t<e.length;t+=1)m(e[t],!0)}else m(r,!1);return{segments:a,rawText:u}}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@js-toolkit/web-utils",
|
|
3
|
-
"version": "1.59.
|
|
3
|
+
"version": "1.59.1",
|
|
4
4
|
"description": "Web utils",
|
|
5
5
|
"author": "VZH",
|
|
6
6
|
"license": "MIT",
|
|
@@ -20,32 +20,32 @@
|
|
|
20
20
|
"@js-toolkit/node-utils": "^1.2.1"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
|
-
"@eslint/compat": "^1.2.
|
|
23
|
+
"@eslint/compat": "^1.2.5",
|
|
24
24
|
"@eslint/eslintrc": "^3.2.0",
|
|
25
|
-
"@eslint/js": "^9.
|
|
26
|
-
"@js-toolkit/configs": "^3.
|
|
27
|
-
"@js-toolkit/utils": "^1.
|
|
25
|
+
"@eslint/js": "^9.18.0",
|
|
26
|
+
"@js-toolkit/configs": "^3.94.0",
|
|
27
|
+
"@js-toolkit/utils": "^1.55.2",
|
|
28
28
|
"@types/eslint": "^9.6.1",
|
|
29
29
|
"@types/eslint__eslintrc": "^2.1.2",
|
|
30
30
|
"@types/eslint__js": "^8.42.3",
|
|
31
31
|
"@types/lodash.throttle": "^4.1.9",
|
|
32
32
|
"@types/uuid": "^10.0.0",
|
|
33
33
|
"copyfiles": "^2.4.1",
|
|
34
|
-
"eslint": "^9.
|
|
35
|
-
"eslint-config-prettier": "^
|
|
34
|
+
"eslint": "^9.18.0",
|
|
35
|
+
"eslint-config-prettier": "^10.0.1",
|
|
36
36
|
"eslint-plugin-import": "^2.31.0",
|
|
37
|
-
"eslint-plugin-prettier": "^5.2.
|
|
37
|
+
"eslint-plugin-prettier": "^5.2.3",
|
|
38
38
|
"eventemitter3": "^5.0.1",
|
|
39
39
|
"lodash.throttle": "^4.1.1",
|
|
40
|
-
"prettier": "^3.
|
|
40
|
+
"prettier": "^3.4.2",
|
|
41
41
|
"reconnecting-websocket": "^4.4.0",
|
|
42
42
|
"rimraf": "^6.0.1",
|
|
43
|
-
"terser": "^5.
|
|
44
|
-
"typescript": "^5.
|
|
45
|
-
"typescript-eslint": "^8.
|
|
43
|
+
"terser": "^5.37.0",
|
|
44
|
+
"typescript": "^5.7.3",
|
|
45
|
+
"typescript-eslint": "^8.21.0",
|
|
46
46
|
"ua-parser-js": "^2.0.0",
|
|
47
|
-
"uuid": "^11.0.
|
|
48
|
-
"webpack": "^5.
|
|
47
|
+
"uuid": "^11.0.5",
|
|
48
|
+
"webpack": "^5.97.1",
|
|
49
49
|
"yargs": "^17.7.2"
|
|
50
50
|
}
|
|
51
51
|
}
|