@jeniex/utils 1.1.4 → 1.2.0

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/browser/index.cjs CHANGED
@@ -473,6 +473,114 @@ function customizeConsole(debug = false) {
473
473
  };
474
474
  }
475
475
 
476
+ function createRequest(transport, url, options) {
477
+ const getResponse = async () => {
478
+ return transport(url, options);
479
+ };
480
+ return {
481
+ response: async () => {
482
+ return getResponse();
483
+ },
484
+ blob: async () => {
485
+ const response = await getResponse();
486
+ return response.blob();
487
+ },
488
+ buffer: async () => {
489
+ const response = await getResponse();
490
+ return response.arrayBuffer();
491
+ },
492
+ json: async () => {
493
+ const response = await getResponse();
494
+ return response.json();
495
+ },
496
+ text: async () => {
497
+ const response = await getResponse();
498
+ return response.text();
499
+ },
500
+ document: async () => {
501
+ const response = await getResponse();
502
+ const responseText = await response.text();
503
+ const parser = new DOMParser();
504
+ return parser.parseFromString(responseText, 'text/html');
505
+ },
506
+ multi: async (types) => {
507
+ const response = await getResponse();
508
+ const responses = { response };
509
+ if (types.includes('blob')) {
510
+ responses.blob = await response.clone().blob();
511
+ }
512
+ if (types.includes('buffer')) {
513
+ responses.buffer = await response.clone().arrayBuffer();
514
+ }
515
+ if (types.includes('json')) {
516
+ responses.json = (await response.clone().json());
517
+ }
518
+ if (types.includes('text')) {
519
+ responses.text = await response.clone().text();
520
+ }
521
+ if (types.includes('document')) {
522
+ const responseText = await response.clone().text();
523
+ const parser = new DOMParser();
524
+ responses.document = parser.parseFromString(responseText, 'text/html');
525
+ }
526
+ return responses;
527
+ },
528
+ };
529
+ }
530
+
531
+ function isFileURL(url) {
532
+ return url.startsWith('file:///');
533
+ }
534
+
535
+ async function fetchTransport(url, options) {
536
+ const response = await fetch(url, options);
537
+ if (!response.ok && !isFileURL(response.url)) {
538
+ throw new Error(`Request to ${response.url} ended with ${response.status} status.`);
539
+ }
540
+ return response;
541
+ }
542
+
543
+ function rq(url, options) {
544
+ return createRequest(fetchTransport, url, options);
545
+ }
546
+
547
+ async function gmTransport(url, options) {
548
+ const { method, anonymous, headers, body, timeOut, onProgress } = options ?? {};
549
+ return new Promise((resolve, reject) => {
550
+ GM.xmlHttpRequest({
551
+ url,
552
+ method: method ?? 'GET',
553
+ headers,
554
+ /** Note: To manually set the 'cookie' header, you have to set 'anonymous' to true. */
555
+ anonymous,
556
+ data: body,
557
+ responseType: 'blob',
558
+ timeout: timeOut,
559
+ onprogress: onProgress,
560
+ onload({ response, statusText, status, finalUrl }) {
561
+ const ok = status >= 200 && status < 300;
562
+ if (!ok && !isFileURL(finalUrl)) {
563
+ reject(new Error(`Request to ${url} ended with ${status} status.`));
564
+ return;
565
+ }
566
+ const properResponse = new Response(response, {
567
+ statusText,
568
+ status: isFileURL(finalUrl) ? 200 : status,
569
+ });
570
+ Object.defineProperty(properResponse, 'url', { value: finalUrl });
571
+ resolve(properResponse);
572
+ },
573
+ onerror({ status }) {
574
+ reject(new Error(`Request to ${url} ended with ${status} status.`));
575
+ },
576
+ });
577
+ });
578
+ }
579
+
580
+ function rx(url, options) {
581
+ return createRequest(gmTransport, url, options);
582
+ }
583
+
476
584
  exports.$ = $;
477
585
  exports.$$ = $$;
478
586
  exports.addStyle = addStyle;
@@ -506,6 +614,9 @@ exports.pageLoad = pageLoad;
506
614
  exports.prompt = prompt;
507
615
  exports.remove = remove;
508
616
  exports.removeSearchParams = removeSearchParams;
617
+ exports.rq = rq;
618
+ exports.rqc = createRequest;
619
+ exports.rx = rx;
509
620
  exports.saveFile = saveFile;
510
621
  exports.scriptName = scriptName;
511
622
  exports.setSearchParam = setSearchParam;
@@ -60,9 +60,9 @@ declare function alert(message?: string): void;
60
60
  declare function confirm(message: string): boolean;
61
61
  declare function prompt(message: string, _default?: string): string | null;
62
62
 
63
- type Method = 'CONNECT' | 'DELETE' | 'GET' | 'HEAD' | 'OPTIONS' | 'PATCH' | 'POST' | 'PUT' | 'TRACE';
63
+ type Method$1 = 'CONNECT' | 'DELETE' | 'GET' | 'HEAD' | 'OPTIONS' | 'PATCH' | 'POST' | 'PUT' | 'TRACE';
64
64
  interface FishXOptions {
65
- method?: Method;
65
+ method?: Method$1;
66
66
  anonymous?: boolean;
67
67
  headers?: Record<string, string>;
68
68
  body?: Blob | FormData | string;
@@ -168,4 +168,39 @@ interface CustomizedConsole {
168
168
 
169
169
  declare function customizeConsole(debug?: boolean): CustomizedConsole;
170
170
 
171
- export { $, $$, Flag, Fn, Nullable, Prettify, addStyle, alert, asserted, capitalize, checkVPN, checkVPNRandomly, confirm, customizeConsole, fish, fishResponse, fishX, fishXResponse, getOptions, getSearchParam, imageLoad, isBoolean, isFalsy, isFunction, isNotNullish, isNullish, isNumber, isObject, isString, isTruthy, join, noop, padZeros, pageLoad, prompt, remove, removeSearchParams, saveFile, scriptName, setSearchParam, sleep, stringOrThrow, tabURL, toString };
171
+ type Method = 'CONNECT' | 'DELETE' | 'GET' | 'HEAD' | 'OPTIONS' | 'PATCH' | 'POST' | 'PUT' | 'TRACE';
172
+ interface RxOptions {
173
+ method?: Method;
174
+ anonymous?: boolean;
175
+ headers?: Record<string, string>;
176
+ body?: Blob | FormData | string;
177
+ timeOut?: number;
178
+ onProgress?: (response: VMScriptResponseObject<Blob>) => Promise<void> | void;
179
+ }
180
+ interface RqRequest {
181
+ response: () => Promise<Response>;
182
+ blob: () => Promise<Blob>;
183
+ buffer: () => Promise<ArrayBuffer>;
184
+ json: <T = unknown>() => Promise<T>;
185
+ text: () => Promise<string>;
186
+ document: () => Promise<Document>;
187
+ multi: <T = unknown>(types: ResponseType[]) => Promise<Responses<T>>;
188
+ }
189
+ type Transport<TOptions = unknown> = (url: string, options?: TOptions) => Promise<Response>;
190
+ type ResponseType = 'blob' | 'buffer' | 'document' | 'json' | 'text';
191
+ interface Responses<T> {
192
+ response?: Response;
193
+ blob?: Blob;
194
+ buffer?: ArrayBuffer;
195
+ json?: T;
196
+ text?: string;
197
+ document?: Document;
198
+ }
199
+
200
+ declare function rq(url: string, options?: RequestInit): RqRequest;
201
+
202
+ declare function rx(url: string, options?: RxOptions): RqRequest;
203
+
204
+ declare function createRequest<TOptions>(transport: Transport<TOptions>, url: string, options?: TOptions): RqRequest;
205
+
206
+ export { $, $$, Flag, Fn, Nullable, Prettify, addStyle, alert, asserted, capitalize, checkVPN, checkVPNRandomly, confirm, customizeConsole, fish, fishResponse, fishX, fishXResponse, getOptions, getSearchParam, imageLoad, isBoolean, isFalsy, isFunction, isNotNullish, isNullish, isNumber, isObject, isString, isTruthy, join, noop, padZeros, pageLoad, prompt, remove, removeSearchParams, rq, createRequest as rqc, rx, saveFile, scriptName, setSearchParam, sleep, stringOrThrow, tabURL, toString };
package/browser/index.js CHANGED
@@ -471,4 +471,112 @@ function customizeConsole(debug = false) {
471
471
  };
472
472
  }
473
473
 
474
- export { $, $$, addStyle, alert, asserted, capitalize, checkVPN, checkVPNRandomly, confirm, customizeConsole, fish, fishResponse, fishX, fishXResponse, getOptions, getSearchParam, imageLoad, isBoolean, isFalsy, isFunction, isNotNullish, isNullish, isNumber, isObject, isString, isTruthy, join, noop, padZeros, pageLoad, prompt, remove, removeSearchParams, saveFile, scriptName, setSearchParam, sleep, stringOrThrow, tabURL, toString };
474
+ function createRequest(transport, url, options) {
475
+ const getResponse = async () => {
476
+ return transport(url, options);
477
+ };
478
+ return {
479
+ response: async () => {
480
+ return getResponse();
481
+ },
482
+ blob: async () => {
483
+ const response = await getResponse();
484
+ return response.blob();
485
+ },
486
+ buffer: async () => {
487
+ const response = await getResponse();
488
+ return response.arrayBuffer();
489
+ },
490
+ json: async () => {
491
+ const response = await getResponse();
492
+ return response.json();
493
+ },
494
+ text: async () => {
495
+ const response = await getResponse();
496
+ return response.text();
497
+ },
498
+ document: async () => {
499
+ const response = await getResponse();
500
+ const responseText = await response.text();
501
+ const parser = new DOMParser();
502
+ return parser.parseFromString(responseText, 'text/html');
503
+ },
504
+ multi: async (types) => {
505
+ const response = await getResponse();
506
+ const responses = { response };
507
+ if (types.includes('blob')) {
508
+ responses.blob = await response.clone().blob();
509
+ }
510
+ if (types.includes('buffer')) {
511
+ responses.buffer = await response.clone().arrayBuffer();
512
+ }
513
+ if (types.includes('json')) {
514
+ responses.json = (await response.clone().json());
515
+ }
516
+ if (types.includes('text')) {
517
+ responses.text = await response.clone().text();
518
+ }
519
+ if (types.includes('document')) {
520
+ const responseText = await response.clone().text();
521
+ const parser = new DOMParser();
522
+ responses.document = parser.parseFromString(responseText, 'text/html');
523
+ }
524
+ return responses;
525
+ },
526
+ };
527
+ }
528
+
529
+ function isFileURL(url) {
530
+ return url.startsWith('file:///');
531
+ }
532
+
533
+ async function fetchTransport(url, options) {
534
+ const response = await fetch(url, options);
535
+ if (!response.ok && !isFileURL(response.url)) {
536
+ throw new Error(`Request to ${response.url} ended with ${response.status} status.`);
537
+ }
538
+ return response;
539
+ }
540
+
541
+ function rq(url, options) {
542
+ return createRequest(fetchTransport, url, options);
543
+ }
544
+
545
+ async function gmTransport(url, options) {
546
+ const { method, anonymous, headers, body, timeOut, onProgress } = options ?? {};
547
+ return new Promise((resolve, reject) => {
548
+ GM.xmlHttpRequest({
549
+ url,
550
+ method: method ?? 'GET',
551
+ headers,
552
+ /** Note: To manually set the 'cookie' header, you have to set 'anonymous' to true. */
553
+ anonymous,
554
+ data: body,
555
+ responseType: 'blob',
556
+ timeout: timeOut,
557
+ onprogress: onProgress,
558
+ onload({ response, statusText, status, finalUrl }) {
559
+ const ok = status >= 200 && status < 300;
560
+ if (!ok && !isFileURL(finalUrl)) {
561
+ reject(new Error(`Request to ${url} ended with ${status} status.`));
562
+ return;
563
+ }
564
+ const properResponse = new Response(response, {
565
+ statusText,
566
+ status: isFileURL(finalUrl) ? 200 : status,
567
+ });
568
+ Object.defineProperty(properResponse, 'url', { value: finalUrl });
569
+ resolve(properResponse);
570
+ },
571
+ onerror({ status }) {
572
+ reject(new Error(`Request to ${url} ended with ${status} status.`));
573
+ },
574
+ });
575
+ });
576
+ }
577
+
578
+ function rx(url, options) {
579
+ return createRequest(gmTransport, url, options);
580
+ }
581
+
582
+ export { $, $$, addStyle, alert, asserted, capitalize, checkVPN, checkVPNRandomly, confirm, customizeConsole, fish, fishResponse, fishX, fishXResponse, getOptions, getSearchParam, imageLoad, isBoolean, isFalsy, isFunction, isNotNullish, isNullish, isNumber, isObject, isString, isTruthy, join, noop, padZeros, pageLoad, prompt, remove, removeSearchParams, rq, createRequest as rqc, rx, saveFile, scriptName, setSearchParam, sleep, stringOrThrow, tabURL, toString };
package/node/index.cjs CHANGED
@@ -244,6 +244,77 @@ async function readJSON(filePath, withComments = false) {
244
244
  return JSON.parse(stringJSON);
245
245
  }
246
246
 
247
+ function createRequest(transport, url, options) {
248
+ const getResponse = async () => {
249
+ return transport(url, options);
250
+ };
251
+ return {
252
+ response: async () => {
253
+ return getResponse();
254
+ },
255
+ blob: async () => {
256
+ const response = await getResponse();
257
+ return response.blob();
258
+ },
259
+ buffer: async () => {
260
+ const response = await getResponse();
261
+ return response.arrayBuffer();
262
+ },
263
+ json: async () => {
264
+ const response = await getResponse();
265
+ return response.json();
266
+ },
267
+ text: async () => {
268
+ const response = await getResponse();
269
+ return response.text();
270
+ },
271
+ document: async () => {
272
+ const response = await getResponse();
273
+ const responseText = await response.text();
274
+ const parser = new DOMParser();
275
+ return parser.parseFromString(responseText, 'text/html');
276
+ },
277
+ multi: async (types) => {
278
+ const response = await getResponse();
279
+ const responses = { response };
280
+ if (types.includes('blob')) {
281
+ responses.blob = await response.clone().blob();
282
+ }
283
+ if (types.includes('buffer')) {
284
+ responses.buffer = await response.clone().arrayBuffer();
285
+ }
286
+ if (types.includes('json')) {
287
+ responses.json = (await response.clone().json());
288
+ }
289
+ if (types.includes('text')) {
290
+ responses.text = await response.clone().text();
291
+ }
292
+ if (types.includes('document')) {
293
+ const responseText = await response.clone().text();
294
+ const parser = new DOMParser();
295
+ responses.document = parser.parseFromString(responseText, 'text/html');
296
+ }
297
+ return responses;
298
+ },
299
+ };
300
+ }
301
+
302
+ function isFileURL(url) {
303
+ return url.startsWith('file:///');
304
+ }
305
+
306
+ async function fetchTransport(url, options) {
307
+ const response = await fetch(url, options);
308
+ if (!response.ok && !isFileURL(response.url)) {
309
+ throw new Error(`Request to ${response.url} ended with ${response.status} status.`);
310
+ }
311
+ return response;
312
+ }
313
+
314
+ function rq(url, options) {
315
+ return createRequest(fetchTransport, url, options);
316
+ }
317
+
247
318
  exports.asserted = asserted;
248
319
  exports.capitalize = capitalize;
249
320
  exports.isBoolean = isBoolean;
@@ -264,6 +335,8 @@ exports.padZeros = padZeros;
264
335
  exports.readJSON = readJSON;
265
336
  exports.remove = remove;
266
337
  exports.removeFiles = removeFiles;
338
+ exports.rq = rq;
339
+ exports.rqc = createRequest;
267
340
  exports.sleep = sleep;
268
341
  exports.stringOrThrow = stringOrThrow;
269
342
  exports.toString = toString;
package/node/index.d.ts CHANGED
@@ -110,4 +110,28 @@ declare function removeFiles({ folderPath, filter }: RemoveFilesOpt): Promise<vo
110
110
 
111
111
  declare function readJSON<T = object>(filePath: string, withComments?: boolean): Promise<T>;
112
112
 
113
- export { Fn, Nullable, Prettify, asserted, capitalize, isBoolean, isFalsy, isFunction, isNotNullish, isNullish, isNumber, isObject, isString, isTruthy, join, listFiles, listFolders, listFoldersSync, noop, padZeros, readJSON, remove, removeFiles, sleep, stringOrThrow, toString };
113
+ interface RqRequest {
114
+ response: () => Promise<Response>;
115
+ blob: () => Promise<Blob>;
116
+ buffer: () => Promise<ArrayBuffer>;
117
+ json: <T = unknown>() => Promise<T>;
118
+ text: () => Promise<string>;
119
+ document: () => Promise<Document>;
120
+ multi: <T = unknown>(types: ResponseType[]) => Promise<Responses<T>>;
121
+ }
122
+ type Transport<TOptions = unknown> = (url: string, options?: TOptions) => Promise<Response>;
123
+ type ResponseType = 'blob' | 'buffer' | 'document' | 'json' | 'text';
124
+ interface Responses<T> {
125
+ response?: Response;
126
+ blob?: Blob;
127
+ buffer?: ArrayBuffer;
128
+ json?: T;
129
+ text?: string;
130
+ document?: Document;
131
+ }
132
+
133
+ declare function rq(url: string, options?: RequestInit): RqRequest;
134
+
135
+ declare function createRequest<TOptions>(transport: Transport<TOptions>, url: string, options?: TOptions): RqRequest;
136
+
137
+ export { Fn, Nullable, Prettify, asserted, capitalize, isBoolean, isFalsy, isFunction, isNotNullish, isNullish, isNumber, isObject, isString, isTruthy, join, listFiles, listFolders, listFoldersSync, noop, padZeros, readJSON, remove, removeFiles, rq, createRequest as rqc, sleep, stringOrThrow, toString };
package/node/index.js CHANGED
@@ -242,4 +242,75 @@ async function readJSON(filePath, withComments = false) {
242
242
  return JSON.parse(stringJSON);
243
243
  }
244
244
 
245
- export { asserted, capitalize, isBoolean, isFalsy, isFunction, isNotNullish, isNullish, isNumber, isObject, isString, isTruthy, join, listFiles, listFolders, listFoldersSync, noop, padZeros, readJSON, remove, removeFiles, sleep, stringOrThrow, toString };
245
+ function createRequest(transport, url, options) {
246
+ const getResponse = async () => {
247
+ return transport(url, options);
248
+ };
249
+ return {
250
+ response: async () => {
251
+ return getResponse();
252
+ },
253
+ blob: async () => {
254
+ const response = await getResponse();
255
+ return response.blob();
256
+ },
257
+ buffer: async () => {
258
+ const response = await getResponse();
259
+ return response.arrayBuffer();
260
+ },
261
+ json: async () => {
262
+ const response = await getResponse();
263
+ return response.json();
264
+ },
265
+ text: async () => {
266
+ const response = await getResponse();
267
+ return response.text();
268
+ },
269
+ document: async () => {
270
+ const response = await getResponse();
271
+ const responseText = await response.text();
272
+ const parser = new DOMParser();
273
+ return parser.parseFromString(responseText, 'text/html');
274
+ },
275
+ multi: async (types) => {
276
+ const response = await getResponse();
277
+ const responses = { response };
278
+ if (types.includes('blob')) {
279
+ responses.blob = await response.clone().blob();
280
+ }
281
+ if (types.includes('buffer')) {
282
+ responses.buffer = await response.clone().arrayBuffer();
283
+ }
284
+ if (types.includes('json')) {
285
+ responses.json = (await response.clone().json());
286
+ }
287
+ if (types.includes('text')) {
288
+ responses.text = await response.clone().text();
289
+ }
290
+ if (types.includes('document')) {
291
+ const responseText = await response.clone().text();
292
+ const parser = new DOMParser();
293
+ responses.document = parser.parseFromString(responseText, 'text/html');
294
+ }
295
+ return responses;
296
+ },
297
+ };
298
+ }
299
+
300
+ function isFileURL(url) {
301
+ return url.startsWith('file:///');
302
+ }
303
+
304
+ async function fetchTransport(url, options) {
305
+ const response = await fetch(url, options);
306
+ if (!response.ok && !isFileURL(response.url)) {
307
+ throw new Error(`Request to ${response.url} ended with ${response.status} status.`);
308
+ }
309
+ return response;
310
+ }
311
+
312
+ function rq(url, options) {
313
+ return createRequest(fetchTransport, url, options);
314
+ }
315
+
316
+ export { asserted, capitalize, isBoolean, isFalsy, isFunction, isNotNullish, isNullish, isNumber, isObject, isString, isTruthy, join, listFiles, listFolders, listFoldersSync, noop, padZeros, readJSON, remove, removeFiles, rq, createRequest as rqc, sleep, stringOrThrow, toString };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jeniex/utils",
3
- "version": "1.1.4",
3
+ "version": "1.2.0",
4
4
  "author": "JenieX",
5
5
  "homepage": "https://github.com/JenieX/utils",
6
6
  "type": "module",