diff --git a/node_modules/tall/lib/cjs/index.d.ts b/node_modules/tall/lib/cjs/index.d.ts new file mode 100644 index 0000000..eeddb48 --- /dev/null +++ b/node_modules/tall/lib/cjs/index.d.ts @@ -0,0 +1,22 @@ +/// +/// +import { IncomingMessage } from 'http'; +import { RequestOptions } from 'https'; +export declare class Follow { + follow: URL; + constructor(follow: URL); +} +export declare class Stop { + stop: URL; + constructor(stop: URL); +} +export interface TallPlugin { + (url: URL, response: IncomingMessage, previous: Follow | Stop): Promise; +} +export declare function locationHeaderPlugin(url: URL, response: IncomingMessage, previous: Follow | Stop): Promise; +export interface TallOptions extends RequestOptions { + maxRedirects: number; + timeout: number; + plugins: TallPlugin[]; +} +export declare const tall: (url: string, options?: Partial) => Promise; diff --git a/node_modules/tall/lib/cjs/index.js b/node_modules/tall/lib/cjs/index.js new file mode 100644 index 0000000..984af30 --- /dev/null +++ b/node_modules/tall/lib/cjs/index.js @@ -0,0 +1,76 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.tall = exports.locationHeaderPlugin = exports.Stop = exports.Follow = void 0; +const http_1 = require("http"); +const https_1 = require("https"); +class Follow { + constructor(follow) { + this.follow = follow; + } +} +exports.Follow = Follow; +class Stop { + constructor(stop) { + this.stop = stop; + } +} +exports.Stop = Stop; +function locationHeaderPlugin(url, response, previous) { + return __awaiter(this, void 0, void 0, function* () { + const { protocol, host } = url; + if (response.headers.location) { + const followUrl = new URL(response.headers.location.startsWith('http') + ? response.headers.location + : `${protocol}//${host}${response.headers.location}`); + return new Follow(followUrl); + } + return previous; + }); +} +exports.locationHeaderPlugin = locationHeaderPlugin; +const defaultOptions = { + method: 'GET', + maxRedirects: 3, + headers: {}, + timeout: 120000, + plugins: [locationHeaderPlugin] +}; +function makeRequest(url, options) { + return new Promise((resolve, reject) => { + const request = url.protocol === 'https:' ? https_1.request : http_1.request; + const req = request(url, options, (response) => { + resolve(response); + }); + req.on('error', reject); + req.setTimeout(options.timeout, () => req.destroy()); + req.end(); + }); +} +const tall = (url, options) => __awaiter(void 0, void 0, void 0, function* () { + const opt = Object.assign({}, defaultOptions, options); + if (opt.maxRedirects <= 0) { + return url.toString(); + } + const parsedUrl = new URL(url); + let prev = new Stop(parsedUrl); + const response = yield makeRequest(parsedUrl, opt); + for (const plugin of opt.plugins) { + prev = yield plugin(parsedUrl, response, prev); + } + const maxRedirects = opt.maxRedirects - 1; + if (prev instanceof Follow) { + return yield (0, exports.tall)(prev.follow.toString(), Object.assign(Object.assign({}, options), { maxRedirects })); + } + return prev.stop.toString(); +}); +exports.tall = tall; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/tall/lib/cjs/index.js.map b/node_modules/tall/lib/cjs/index.js.map new file mode 100644 index 0000000..e5300e8 --- /dev/null +++ b/node_modules/tall/lib/cjs/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/tall/lib/cjs/package.json b/node_modules/tall/lib/cjs/package.json new file mode 100644 index 0000000..729ac4d --- /dev/null +++ b/node_modules/tall/lib/cjs/package.json @@ -0,0 +1 @@ +{"type":"commonjs"} diff --git a/node_modules/tall/lib/esm/index.d.ts b/node_modules/tall/lib/esm/index.d.ts new file mode 100644 index 0000000..eeddb48 --- /dev/null +++ b/node_modules/tall/lib/esm/index.d.ts @@ -0,0 +1,22 @@ +/// +/// +import { IncomingMessage } from 'http'; +import { RequestOptions } from 'https'; +export declare class Follow { + follow: URL; + constructor(follow: URL); +} +export declare class Stop { + stop: URL; + constructor(stop: URL); +} +export interface TallPlugin { + (url: URL, response: IncomingMessage, previous: Follow | Stop): Promise; +} +export declare function locationHeaderPlugin(url: URL, response: IncomingMessage, previous: Follow | Stop): Promise; +export interface TallOptions extends RequestOptions { + maxRedirects: number; + timeout: number; + plugins: TallPlugin[]; +} +export declare const tall: (url: string, options?: Partial) => Promise; diff --git a/node_modules/tall/lib/esm/index.js b/node_modules/tall/lib/esm/index.js new file mode 100644 index 0000000..d3e9d62 --- /dev/null +++ b/node_modules/tall/lib/esm/index.js @@ -0,0 +1,69 @@ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +import { request as httpReq } from 'http'; +import { request as httpsReq } from 'https'; +export class Follow { + constructor(follow) { + this.follow = follow; + } +} +export class Stop { + constructor(stop) { + this.stop = stop; + } +} +export function locationHeaderPlugin(url, response, previous) { + return __awaiter(this, void 0, void 0, function* () { + const { protocol, host } = url; + if (response.headers.location) { + const followUrl = new URL(response.headers.location.startsWith('http') + ? response.headers.location + : `${protocol}//${host}${response.headers.location}`); + return new Follow(followUrl); + } + return previous; + }); +} +const defaultOptions = { + method: 'GET', + maxRedirects: 3, + headers: {}, + timeout: 120000, + plugins: [locationHeaderPlugin] +}; +function makeRequest(url, options) { + return new Promise((resolve, reject) => { + const request = url.protocol === 'https:' ? httpsReq : httpReq; + const req = request(url, options, (response) => { + resolve(response); + }); + req.on('error', reject); + req.setTimeout(options.timeout, () => req.destroy()); + req.end(); + }); +} +export const tall = (url, options) => __awaiter(void 0, void 0, void 0, function* () { + const opt = Object.assign({}, defaultOptions, options); + if (opt.maxRedirects <= 0) { + return url.toString(); + } + const parsedUrl = new URL(url); + let prev = new Stop(parsedUrl); + const response = yield makeRequest(parsedUrl, opt); + for (const plugin of opt.plugins) { + prev = yield plugin(parsedUrl, response, prev); + } + const maxRedirects = opt.maxRedirects - 1; + if (prev instanceof Follow) { + return yield tall(prev.follow.toString(), Object.assign(Object.assign({}, options), { maxRedirects })); + } + return prev.stop.toString(); +}); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/tall/lib/esm/index.js.map b/node_modules/tall/lib/esm/index.js.map new file mode 100644 index 0000000..e5672b0 --- /dev/null +++ b/node_modules/tall/lib/esm/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/tall/package.json b/node_modules/tall/package.json new file mode 100644 index 0000000..22ee9c8 --- /dev/null +++ b/node_modules/tall/package.json @@ -0,0 +1,55 @@ +{ + "name": "tall", + "version": "8.0.0", + "description": "Promise-based, No-dependency URL unshortner (expander) module for Node.js", + "type": "module", + "main": "./lib/cjs/index.js", + "module": "./lib/esm/index.js", + "exports": { + "import": "./lib/esm/index.js", + "require": "./lib/cjs/index.js" + }, + "files": [ + "lib/", + "!lib/**/*.test*", + "!lib/**/jest.*" + ], + "engines": { + "node": ">=16.0.0" + }, + "engineStrict": true, + "scripts": { + "clean": "rm -rf ./lib", + "build": "tsc -p tsconfig.json && tsc -p tsconfig-cjs.json && echo '{\"type\":\"commonjs\"}' > lib/cjs/package.json", + "build:test": "node test/commonjs.cjs && node test/esm.js", + "prepublish": "npm run build", + "prepare": "npm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/lmammino/tall.git" + }, + "author": { + "name": "Luciano Mammino", + "url": "https://loige.co" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/lmammino/tall/issues" + }, + "homepage": "https://github.com/lmammino/tall#readme", + "keywords": [ + "URL", + "shortner", + "unshortner", + "expander", + "tall", + "link", + "expand link", + "expand url", + "promise", + "no depenencies", + "no dependency", + "typescript" + ] +} diff --git a/package.json b/package.json index 37dd62f..6bf2cc9 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "q": "^1.5.1", "request": "^2.88.2", "selenium-webdriver": "^4.8.0", + "tall": "^8.0.0", "until": "^0.1.1" } }