Website Structure

This commit is contained in:
supalerk-ar66 2026-01-13 10:46:40 +07:00
parent 62812f2090
commit 71f0676a62
22365 changed files with 4265753 additions and 791 deletions

21
Frontend-Learner/node_modules/parse-url/LICENSE generated vendored Normal file
View file

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2015-24 Ionică Bizău <bizauionica@gmail.com> (https://ionicabizau.net)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

595
Frontend-Learner/node_modules/parse-url/README.md generated vendored Normal file
View file

@ -0,0 +1,595 @@
<!-- Please do not edit this file. Edit the `blah` field in the `package.json` instead. If in doubt, open an issue. -->
# parse-url
[![Support me on Patreon][badge_patreon]][patreon] [![Buy me a book][badge_amazon]][amazon] [![PayPal][badge_paypal_donate]][paypal-donations] [![Ask me anything](https://img.shields.io/badge/ask%20me-anything-1abc9c.svg)](https://github.com/IonicaBizau/ama) [![Version](https://img.shields.io/npm/v/parse-url.svg)](https://www.npmjs.com/package/parse-url) [![Downloads](https://img.shields.io/npm/dt/parse-url.svg)](https://www.npmjs.com/package/parse-url) [![Get help on Codementor](https://cdn.codementor.io/badges/get_help_github.svg)](https://www.codementor.io/johnnyb?utm_source=github&utm_medium=button&utm_term=johnnyb&utm_campaign=github)
<a href="https://www.buymeacoffee.com/H96WwChMy" target="_blank"><img src="https://www.buymeacoffee.com/assets/img/custom_images/yellow_img.png" alt="Buy Me A Coffee"></a>
> An advanced url parser supporting git urls too.
For low-level path parsing, check out [`parse-path`](https://github.com/IonicaBizau/parse-path). This very module is designed to parse urls. By default the urls are normalized.
## :cloud: Installation
```sh
# Using npm
npm install --save parse-url
# Using yarn
yarn add parse-url
```
## :clipboard: Example
```js
// Dependencies
import parseUrl from "parse-url";
console.log(parseUrl("http://ionicabizau.net/blog"))
// {
// protocols: [ 'http' ],
// protocol: 'http',
// port: '',
// resource: 'ionicabizau.net',
// user: '',
// password: '',
// pathname: '/blog',
// hash: '',
// search: '',
// href: 'http://ionicabizau.net/blog',
// query: {}
// }
console.log(parseUrl("http://domain.com/path/name?foo=bar&bar=42#some-hash"))
// {
// protocols: [ 'http' ],
// protocol: 'http',
// port: '',
// resource: 'domain.com',
// user: '',
// password: '',
// pathname: '/path/name',
// hash: 'some-hash',
// search: 'foo=bar&bar=42',
// href: 'http://domain.com/path/name?foo=bar&bar=42#some-hash',
// query: { foo: 'bar', bar: '42' }
// }
// If you want to parse fancy Git urls, turn off the automatic url normalization
console.log(parseUrl("git+ssh://git@host.xz/path/name.git", false))
// {
// protocols: [ 'git', 'ssh' ],
// protocol: 'git',
// port: '',
// resource: 'host.xz',
// user: 'git',
// password: '',
// pathname: '/path/name.git',
// hash: '',
// search: '',
// href: 'git+ssh://git@host.xz/path/name.git',
// query: {}
// }
console.log(parseUrl("git@github.com:IonicaBizau/git-stats.git", false))
// {
// protocols: [ 'ssh' ],
// protocol: 'ssh',
// port: '',
// resource: 'github.com',
// user: 'git',
// password: '',
// pathname: '/IonicaBizau/git-stats.git',
// hash: '',
// search: '',
// href: 'git@github.com:IonicaBizau/git-stats.git',
// query: {}
// }
```
## :question: Get Help
There are few ways to get help:
1. Please [post questions on Stack Overflow](https://stackoverflow.com/questions/ask). You can open issues with questions, as long you add a link to your Stack Overflow question.
2. For bug reports and feature requests, open issues. :bug:
3. For direct and quick help, you can [use Codementor](https://www.codementor.io/johnnyb). :rocket:
## :memo: Documentation
### `interopDefaultLegacy()`
#__PURE__
### `parseUrl(url, normalize)`
Parses the input url.
**Note**: This *throws* if invalid urls are provided.
#### Params
- **String** `url`: The input url.
- **Boolean|Object** `normalize`: Whether to normalize the url or not. Default is `false`. If `true`, the url will
be normalized. If an object, it will be the
options object sent to [`normalize-url`](https://github.com/sindresorhus/normalize-url).
For SSH urls, normalize won't work.
#### Return
- **Object** An object containing the following fields:
- `protocols` (Array): An array with the url protocols (usually it has one element).
- `protocol` (String): The first protocol, `"ssh"` (if the url is a ssh url) or `"file"`.
- `port` (null|Number): The domain port.
- `resource` (String): The url domain (including subdomains).
- `host` (String): The fully qualified domain name of a network host, or its IP address.
- `user` (String): The authentication user (usually for ssh urls).
- `pathname` (String): The url pathname.
- `hash` (String): The url hash.
- `search` (String): The url querystring value.
- `href` (String): The input url.
- `query` (Object): The url querystring, parsed as object.
- `parse_failed` (Boolean): Whether the parsing failed or not.
### GIT_RE
([a-zA-Z_][a-zA-Z0-9_-]{0,31}) Try to match the user
([\w\.\-@]+) Match the host/resource
(([\~,\.\w,\-,\_,\/,\s]|%[0-9A-Fa-f]{2})+?(?:\.git|\/)?) Match the path, allowing spaces/white
## :yum: How to contribute
Have an idea? Found a bug? See [how to contribute][contributing].
## :sparkling_heart: Support my projects
I open-source almost everything I can, and I try to reply to everyone needing help using these projects. Obviously,
this takes time. You can integrate and use these projects in your applications *for free*! You can even change the source code and redistribute (even resell it).
However, if you get some profit from this or just want to encourage me to continue creating stuff, there are few ways you can do it:
- Starring and sharing the projects you like :rocket:
- [![Buy me a book][badge_amazon]][amazon]—I love books! I will remember you after years if you buy me one. :grin: :book:
- [![PayPal][badge_paypal]][paypal-donations]—You can make one-time donations via PayPal. I'll probably buy a ~~coffee~~ tea. :tea:
- [![Support me on Patreon][badge_patreon]][patreon]—Set up a recurring monthly donation and you will get interesting news about what I'm doing (things that I don't share with everyone).
- **Bitcoin**—You can send me bitcoins at this address (or scanning the code below): `1P9BRsmazNQcuyTxEqveUsnf5CERdq35V6`
![](https://i.imgur.com/z6OQI95.png)
Thanks! :heart:
## :dizzy: Where is this library used?
If you are using this library in one of your projects, add it in this list. :sparkles:
- `@_nomtek/react-native-shimmer-animation`
- `@aabelmann/ui-layer`
- `@ali5049/react-native-buttons`
- `@amirdiafi/react-native-ios-haptics`
- `@angga30prabu/wa-modified`
- `@apardellass/react-native-audio-stream`
- `@aysea/react-native-ui-library`
- `@azalpacir/react-native-dhp-printer`
- `@brantalikp/rn-resize`
- `@buganto/client`
- `@con-test/react-native-concent-common`
- `@cs6/react-native-test-native-view-library`
- `@damruravihara/react-native-testing-package`
- `@dataparty/api`
- `@enkeledi/react-native-week-month-date-picker`
- `@extrieve_technologies/quickcapture_react_native`
- `@foundernetes/machines`
- `@foundernetes/metal-debian`
- `@geeky-apo/react-native-advanced-clipboard`
- `@hbglobal/react-native-actions-shortcuts`
- `@heycharge/heycharge-react-native-sdk`
- `@hieuquang2212/form`
- `@hstech/utils`
- `@idas1/ui-component-lib`
- `@jfilipe-sparta/react-native-module_2`
- `@jimengio/mocked-proxy`
- `@klevn/solid-router`
- `@lakutata-module/service`
- `@mockswitch/cli`
- `@ndla/source-map-resolver`
- `@npm_fluentco/adflow-react-native-sdk`
- `@oiti/rn-liveness2d`
- `@open-wa/wa-automate`
- `@phpboyscout/semantic-release-gitlab`
- `@phuocnb/semrelease-gitlab`
- `@positionex/position-sdk`
- `@praella/localisationist`
- `@qiwi/sourcecrumbs`
- `@react-native-ui-design/button`
- `@roq/ui-react`
- `@roshub/api`
- `@saad27/react-native-bottom-tab-tour`
- `@semantic-release/gitlab`
- `@sephriot/react-native-persistable-uri`
- `@sidghimire/react-native-mapbox-navigation`
- `@taingo97/react-native-awesome-module`
- `@taingo97/react-native-bluetooth-xprinter`
- `@taingo97/react-native-expo-key-rsa-kt`
- `@taingo97/react-native-generate-key-rsa`
- `@taingo97/react-native-key-rsa`
- `@taingo97/react-native-print-xprinter`
- `@taingo97/react-native-rsa-expo`
- `@taingo97/react-native-sunmi-printer`
- `@taingo97/react-native-telpo-printer`
- `@teles1-semantic-release/gitlab`
- `@thinxviewx/core-rn`
- `@tomw2w/my-nuxt-layer`
- `@valifysolutions/react-native-vidvliveness`
- `@wecraftapps/react-native-use-keyboard`
- `agent-get-agent`
- `angularvezba`
- `apaas-track`
- `api-reach-react-native-fix`
- `archlibrary`
- `arifbudixz`
- `astra-ufo-sdk`
- `awesome-module-kd`
- `ba-js-cookie-banner`
- `begg`
- `bilibili2local`
- `biometric-st`
- `birken-react-native-community-image-editor`
- `blitzzz`
- `build-plugin-ssr`
- `candlelabssdk`
- `checkbox-component`
- `cli-live-tutorial`
- `delta-screen`
- `demo-test-scrn`
- `deploy-versioning`
- `design-system-trial-milyasbpa`
- `dogandev-simple-toast`
- `egg-muc-custom-loader`
- `electron-info`
- `eval-spider`
- `expo-renavigate`
- `fawaterak-online-payment`
- `fawatrak-online-payment`
- `fixed_form_builder`
- `fluent.adflow.reactnativesdk`
- `fluent.adflow.reactnativesdk-alpha`
- `fmsl`
- `framework_test_library_sixdee`
- `framework_test_library_sixdee_new`
- `framework_test_library_sixdee_new_new`
- `fuge-runner`
- `gamification-integration-new`
- `gaurav-react-native-loop`
- `generator-bootstrap-boilerplate-template`
- `genz-native-elements`
- `gh-monoproject-cli`
- `git-up`
- `gitlab-backup-util-harduino`
- `griffin-ui-library`
- `heroku-wp-environment-sync`
- `hologit`
- `hong1-utils`
- `hubot-will-it-connect`
- `hui-plugin-wss`
- `ipsamvel`
- `jamuskalim`
- `jordy-frijters-test-lib`
- `kakapo`
- `khaled-salem-custom-components`
- `luojia-cli-dev`
- `markdownalint-cli2`
- `michael-stun`
- `microbe.js`
- `miguelcostero-ng2-toasty`
- `native-apple-login`
- `native-date-picker-module`
- `native-google-login`
- `native-kakao-login`
- `native-modal-damage-vehicle`
- `native-zip`
- `ndla-source-map-resolver`
- `new-awesome-4321`
- `njs-wa-auto`
- `normalize-id`
- `normalize-ssh`
- `npm_one_12_34_1_`
- `npm_one_1_2_3`
- `npm_one_2_2`
- `npm_qwerty`
- `parse-db-uri`
- `pasbeaucoupmoinsrave`
- `payutesting`
- `pnm-yph-react-native-custom-components`
- `project-wajs-dv`
- `pyreswap-sdk`
- `quickcapture_react_native`
- `raact-native-arunramya151`
- `reac-native-arun-ramya-test`
- `react-native-addition`
- `react-native-android-video-player-view`
- `react-native-animate-text`
- `react-native-app-bubble`
- `react-native-app-integrity-checksum`
- `react-native-arps-authorize-net`
- `react-native-arun-ramya-test`
- `react-native-arunjeyam1987`
- `react-native-arunmeena1987`
- `react-native-arunramya151`
- `react-native-auth-service-client`
- `react-native-aventonfacetec-aventon`
- `react-native-awesome-android-123`
- `react-native-awesome-android-123-zeotap`
- `react-native-awesome-module-latest`
- `react-native-awesome-module-two`
- `react-native-azure-communication-services`
- `react-native-badge-control`
- `react-native-basic-app`
- `react-native-basic-screen`
- `react-native-biometric-authenticate`
- `react-native-bleccs-components`
- `react-native-bluetooth-device-detect`
- `react-native-bridge-package`
- `react-native-bubble-chart`
- `react-native-build-vesion-getter`
- `react-native-check-component`
- `react-native-chenaar`
- `react-native-components-design`
- `react-native-conekta-card-tokenizer`
- `react-native-contact-list`
- `react-native-cplus`
- `react-native-create-video-thumbnail`
- `react-native-ctp-odp`
- `react-native-dhp-printer`
- `react-native-dimensions-layout`
- `react-native-dsphoto-module`
- `react-native-fedlight-dsm`
- `react-native-flyy`
- `react-native-get-countries`
- `react-native-ghn-ekyc`
- `react-native-innity-2`
- `react-native-innity-remaster`
- `react-native-input-library`
- `react-native-is7`
- `react-native-jsi-device-info`
- `react-native-kakao-maps`
- `react-native-klarify-ios`
- `react-native-klarify-ui`
- `react-native-klc`
- `react-native-lib-test-rn-1`
- `react-native-library-testing-422522`
- `react-native-line-login-android`
- `react-native-login-demo-test`
- `react-native-lowlatency`
- `react-native-loyalty-platforms`
- `react-native-manh-test`
- `react-native-manual-ios-sdk`
- `react-native-modal-progress-bar`
- `react-native-module-arge`
- `react-native-module-for-testing`
- `react-native-multiplier-altroncoso`
- `react-native-multiplier-component`
- `react-native-multiplier-demo`
- `react-native-multiplier2`
- `react-native-multiply`
- `react-native-multiply-component`
- `react-native-multiselector`
- `react-native-mun-kit`
- `react-native-my-first-try-arun-ramya`
- `react-native-native-audio-engine`
- `react-native-native-ios-test1`
- `react-native-nativewind`
- `react-native-nghia-sharering`
- `react-native-nice-learning`
- `react-native-omental-framework`
- `react-native-onramp`
- `react-native-payu-payment-testing`
- `react-native-plugpag-wrapper`
- `react-native-progress-arrow`
- `react-native-pulsator-native`
- `react-native-rabbitmq-all`
- `react-native-radio-bic-group-lib`
- `react-native-reanimated-sortable-list`
- `react-native-recent-framework-update`
- `react-native-responsive-helper`
- `react-native-responsive-size`
- `react-native-return-usb-data`
- `react-native-rn-app`
- `react-native-rn-icons-library`
- `react-native-rom-components`
- `react-native-rtn-ips-poslin-test`
- `react-native-sandycomponent`
- `react-native-savczuk-feature-library`
- `react-native-sayhello-module`
- `react-native-screen-idle-timer`
- `react-native-scroll-tab-to-index`
- `react-native-shared-gesture`
- `react-native-simple-timeline`
- `react-native-sixdee_test_lib`
- `react-native-sp-test-common`
- `react-native-teknoctrl-components`
- `react-native-test-comlibrary`
- `react-native-test-module-hhh`
- `react-native-test-view`
- `react-native-ticker-tape`
- `react-native-tone-framework`
- `react-native-transtracker-library`
- `react-native-ui-components-library`
- `react-native-uvc-camera-android`
- `react-native-version-app`
- `react-native-volume-phisical`
- `react-native-withframework-check`
- `react-native-wtf`
- `react-native-xiaomi-permissions`
- `react-native-xprinter-thermal-ble`
- `react-native-ytximkit`
- `reactnatively`
- `reat-native-multiplierkpr`
- `refinejs-repo`
- `rn-adyen-dropin`
- `rn-agora-ios-m`
- `rn-circular-chart`
- `rn-counter-demo`
- `rn-session-multiplier-demo`
- `rn-tm-notify`
- `rn_unique_device_id`
- `robots-agent`
- `rocomp`
- `smart_one_connect`
- `soajs.repositories`
- `sourcecrumbs`
- `stun`
- `sushi-sdk-ftm`
- `test-haptik-lib`
- `test-zeo-collect`
- `ts-scraper`
- `tumblr-text`
- `url-local`
- `vision-camera-base64-resized`
- `vision-camera-plugin-face-detector`
- `vision-camera-plugin-scan-faces`
- `vrt-cli`
- `vue-cli-plugin-ice-builder`
- `vue-cli-plugin-ut-builder`
- `wa-frikz`
- `wander-cli`
- `warp-api`
- `warp-server`
- `web-yii2`
- `wifi_configuration_package`
- `workpad`
- `xbuilder-forms`
- `xl-git-up`
- `yangtao-js`
- `zeo-collect`
- `zzzxxxyyy321123`
## :scroll: License
[MIT][license] © [Ionică Bizău][website]
[license]: /LICENSE
[website]: https://ionicabizau.net
[contributing]: /CONTRIBUTING.md
[docs]: /DOCUMENTATION.md
[badge_patreon]: https://ionicabizau.github.io/badges/patreon.svg
[badge_amazon]: https://ionicabizau.github.io/badges/amazon.svg
[badge_paypal]: https://ionicabizau.github.io/badges/paypal.svg
[badge_paypal_donate]: https://ionicabizau.github.io/badges/paypal_donate.svg
[patreon]: https://www.patreon.com/ionicabizau
[amazon]: http://amzn.eu/hRo9sIZ
[paypal-donations]: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=RVXDDLKKLQRJW

401
Frontend-Learner/node_modules/parse-url/dist/index.js generated vendored Normal file
View file

@ -0,0 +1,401 @@
'use strict';
var require$$1 = require('parse-path');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var require$$1__default = /*#__PURE__*/_interopDefaultLegacy(require$$1);
function getAugmentedNamespace(n) {
if (n.__esModule) return n;
var f = n.default;
if (typeof f == "function") {
var a = function a () {
if (this instanceof a) {
var args = [null];
args.push.apply(args, arguments);
var Ctor = Function.bind.apply(f, args);
return new Ctor();
}
return f.apply(this, arguments);
};
a.prototype = f.prototype;
} else a = {};
Object.defineProperty(a, '__esModule', {value: true});
Object.keys(n).forEach(function (k) {
var d = Object.getOwnPropertyDescriptor(n, k);
Object.defineProperty(a, k, d.get ? d : {
enumerable: true,
get: function () {
return n[k];
}
});
});
return a;
}
var src = {};
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs
const DATA_URL_DEFAULT_MIME_TYPE = 'text/plain';
const DATA_URL_DEFAULT_CHARSET = 'us-ascii';
const testParameter = (name, filters) => filters.some(filter => filter instanceof RegExp ? filter.test(name) : filter === name);
const normalizeDataURL = (urlString, {stripHash}) => {
const match = /^data:(?<type>[^,]*?),(?<data>[^#]*?)(?:#(?<hash>.*))?$/.exec(urlString);
if (!match) {
throw new Error(`Invalid URL: ${urlString}`);
}
let {type, data, hash} = match.groups;
const mediaType = type.split(';');
hash = stripHash ? '' : hash;
let isBase64 = false;
if (mediaType[mediaType.length - 1] === 'base64') {
mediaType.pop();
isBase64 = true;
}
// Lowercase MIME type
const mimeType = (mediaType.shift() || '').toLowerCase();
const attributes = mediaType
.map(attribute => {
let [key, value = ''] = attribute.split('=').map(string => string.trim());
// Lowercase `charset`
if (key === 'charset') {
value = value.toLowerCase();
if (value === DATA_URL_DEFAULT_CHARSET) {
return '';
}
}
return `${key}${value ? `=${value}` : ''}`;
})
.filter(Boolean);
const normalizedMediaType = [
...attributes,
];
if (isBase64) {
normalizedMediaType.push('base64');
}
if (normalizedMediaType.length > 0 || (mimeType && mimeType !== DATA_URL_DEFAULT_MIME_TYPE)) {
normalizedMediaType.unshift(mimeType);
}
return `data:${normalizedMediaType.join(';')},${isBase64 ? data.trim() : data}${hash ? `#${hash}` : ''}`;
};
function normalizeUrl(urlString, options) {
options = {
defaultProtocol: 'http:',
normalizeProtocol: true,
forceHttp: false,
forceHttps: false,
stripAuthentication: true,
stripHash: false,
stripTextFragment: true,
stripWWW: true,
removeQueryParameters: [/^utm_\w+/i],
removeTrailingSlash: true,
removeSingleSlash: true,
removeDirectoryIndex: false,
sortQueryParameters: true,
...options,
};
urlString = urlString.trim();
// Data URL
if (/^data:/i.test(urlString)) {
return normalizeDataURL(urlString, options);
}
if (/^view-source:/i.test(urlString)) {
throw new Error('`view-source:` is not supported as it is a non-standard protocol');
}
const hasRelativeProtocol = urlString.startsWith('//');
const isRelativeUrl = !hasRelativeProtocol && /^\.*\//.test(urlString);
// Prepend protocol
if (!isRelativeUrl) {
urlString = urlString.replace(/^(?!(?:\w+:)?\/\/)|^\/\//, options.defaultProtocol);
}
const urlObject = new URL(urlString);
if (options.forceHttp && options.forceHttps) {
throw new Error('The `forceHttp` and `forceHttps` options cannot be used together');
}
if (options.forceHttp && urlObject.protocol === 'https:') {
urlObject.protocol = 'http:';
}
if (options.forceHttps && urlObject.protocol === 'http:') {
urlObject.protocol = 'https:';
}
// Remove auth
if (options.stripAuthentication) {
urlObject.username = '';
urlObject.password = '';
}
// Remove hash
if (options.stripHash) {
urlObject.hash = '';
} else if (options.stripTextFragment) {
urlObject.hash = urlObject.hash.replace(/#?:~:text.*?$/i, '');
}
// Remove duplicate slashes if not preceded by a protocol
// NOTE: This could be implemented using a single negative lookbehind
// regex, but we avoid that to maintain compatibility with older js engines
// which do not have support for that feature.
if (urlObject.pathname) {
// TODO: Replace everything below with `urlObject.pathname = urlObject.pathname.replace(/(?<!\b[a-z][a-z\d+\-.]{1,50}:)\/{2,}/g, '/');` when Safari supports negative lookbehind.
// Split the string by occurrences of this protocol regex, and perform
// duplicate-slash replacement on the strings between those occurrences
// (if any).
const protocolRegex = /\b[a-z][a-z\d+\-.]{1,50}:\/\//g;
let lastIndex = 0;
let result = '';
for (;;) {
const match = protocolRegex.exec(urlObject.pathname);
if (!match) {
break;
}
const protocol = match[0];
const protocolAtIndex = match.index;
const intermediate = urlObject.pathname.slice(lastIndex, protocolAtIndex);
result += intermediate.replace(/\/{2,}/g, '/');
result += protocol;
lastIndex = protocolAtIndex + protocol.length;
}
const remnant = urlObject.pathname.slice(lastIndex, urlObject.pathname.length);
result += remnant.replace(/\/{2,}/g, '/');
urlObject.pathname = result;
}
// Decode URI octets
if (urlObject.pathname) {
try {
urlObject.pathname = decodeURI(urlObject.pathname);
} catch {}
}
// Remove directory index
if (options.removeDirectoryIndex === true) {
options.removeDirectoryIndex = [/^index\.[a-z]+$/];
}
if (Array.isArray(options.removeDirectoryIndex) && options.removeDirectoryIndex.length > 0) {
let pathComponents = urlObject.pathname.split('/');
const lastComponent = pathComponents[pathComponents.length - 1];
if (testParameter(lastComponent, options.removeDirectoryIndex)) {
pathComponents = pathComponents.slice(0, -1);
urlObject.pathname = pathComponents.slice(1).join('/') + '/';
}
}
if (urlObject.hostname) {
// Remove trailing dot
urlObject.hostname = urlObject.hostname.replace(/\.$/, '');
// Remove `www.`
if (options.stripWWW && /^www\.(?!www\.)[a-z\-\d]{1,63}\.[a-z.\-\d]{2,63}$/.test(urlObject.hostname)) {
// Each label should be max 63 at length (min: 1).
// Source: https://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_host_names
// Each TLD should be up to 63 characters long (min: 2).
// It is technically possible to have a single character TLD, but none currently exist.
urlObject.hostname = urlObject.hostname.replace(/^www\./, '');
}
}
// Remove query unwanted parameters
if (Array.isArray(options.removeQueryParameters)) {
// eslint-disable-next-line unicorn/no-useless-spread -- We are intentionally spreading to get a copy.
for (const key of [...urlObject.searchParams.keys()]) {
if (testParameter(key, options.removeQueryParameters)) {
urlObject.searchParams.delete(key);
}
}
}
if (options.removeQueryParameters === true) {
urlObject.search = '';
}
// Sort query parameters
if (options.sortQueryParameters) {
urlObject.searchParams.sort();
// Calling `.sort()` encodes the search parameters, so we need to decode them again.
try {
urlObject.search = decodeURIComponent(urlObject.search);
} catch {}
}
if (options.removeTrailingSlash) {
urlObject.pathname = urlObject.pathname.replace(/\/$/, '');
}
const oldUrlString = urlString;
// Take advantage of many of the Node `url` normalizations
urlString = urlObject.toString();
if (!options.removeSingleSlash && urlObject.pathname === '/' && !oldUrlString.endsWith('/') && urlObject.hash === '') {
urlString = urlString.replace(/\/$/, '');
}
// Remove ending `/` unless removeSingleSlash is false
if ((options.removeTrailingSlash || urlObject.pathname === '/') && urlObject.hash === '' && options.removeSingleSlash) {
urlString = urlString.replace(/\/$/, '');
}
// Restore relative protocol, if applicable
if (hasRelativeProtocol && !options.normalizeProtocol) {
urlString = urlString.replace(/^http:\/\//, '//');
}
// Remove http/https
if (options.stripProtocol) {
urlString = urlString.replace(/^(?:https?:)?\/\//, '');
}
return urlString;
}
var normalizeUrl$1 = /*#__PURE__*/Object.freeze({
__proto__: null,
'default': normalizeUrl
});
var require$$0 = /*@__PURE__*/getAugmentedNamespace(normalizeUrl$1);
Object.defineProperty(src, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; // Dependencies
var _normalizeUrl = require$$0;
var _normalizeUrl2 = _interopRequireDefault(_normalizeUrl);
var _parsePath = require$$1__default["default"];
var _parsePath2 = _interopRequireDefault(_parsePath);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* parseUrl
* Parses the input url.
*
* **Note**: This *throws* if invalid urls are provided.
*
* @name parseUrl
* @function
* @param {String} url The input url.
* @param {Boolean|Object} normalize Whether to normalize the url or not.
* Default is `false`. If `true`, the url will
* be normalized. If an object, it will be the
* options object sent to [`normalize-url`](https://github.com/sindresorhus/normalize-url).
*
* For SSH urls, normalize won't work.
*
* @return {Object} An object containing the following fields:
*
* - `protocols` (Array): An array with the url protocols (usually it has one element).
* - `protocol` (String): The first protocol, `"ssh"` (if the url is a ssh url) or `"file"`.
* - `port` (null|Number): The domain port.
* - `resource` (String): The url domain (including subdomains).
* - `host` (String): The fully qualified domain name of a network host, or its IP address.
* - `user` (String): The authentication user (usually for ssh urls).
* - `pathname` (String): The url pathname.
* - `hash` (String): The url hash.
* - `search` (String): The url querystring value.
* - `href` (String): The input url.
* - `query` (Object): The url querystring, parsed as object.
* - `parse_failed` (Boolean): Whether the parsing failed or not.
*/
var parseUrl = function parseUrl(url) {
var normalize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
// Constants
/**
* ([a-zA-Z_][a-zA-Z0-9_-]{0,31}) Try to match the user
* ([\w\.\-@]+) Match the host/resource
* (([\~,\.\w,\-,\_,\/,\s]|%[0-9A-Fa-f]{2})+?(?:\.git|\/)?) Match the path, allowing spaces/white
*/
var GIT_RE = /^(?:([a-zA-Z_][a-zA-Z0-9_-]{0,31})@|https?:\/\/)([\w\.\-@]+)[\/:](([\~,\.\w,\-,\_,\/,\s]|%[0-9A-Fa-f]{2})+?(?:\.git|\/)?)$/;
var throwErr = function throwErr(msg) {
var err = new Error(msg);
err.subject_url = url;
throw err;
};
if (typeof url !== "string" || !url.trim()) {
throwErr("Invalid url.");
}
if (url.length > parseUrl.MAX_INPUT_LENGTH) {
throwErr("Input exceeds maximum length. If needed, change the value of parseUrl.MAX_INPUT_LENGTH.");
}
if (normalize) {
if ((typeof normalize === "undefined" ? "undefined" : _typeof(normalize)) !== "object") {
normalize = {
stripHash: false
};
}
url = (0, _normalizeUrl2.default)(url, normalize);
}
var parsed = (0, _parsePath2.default)(url);
// Potential git-ssh urls
if (parsed.parse_failed) {
var matched = parsed.href.match(GIT_RE);
if (matched) {
parsed.protocols = ["ssh"];
parsed.protocol = "ssh";
parsed.resource = matched[2];
parsed.host = matched[2];
parsed.user = matched[1];
parsed.pathname = "/" + matched[3];
parsed.parse_failed = false;
} else {
throwErr("URL parsing failed.");
}
}
return parsed;
};
parseUrl.MAX_INPUT_LENGTH = 2048;
var _default = src.default = parseUrl;
module.exports = _default;

395
Frontend-Learner/node_modules/parse-url/dist/index.mjs generated vendored Normal file
View file

@ -0,0 +1,395 @@
import require$$1 from 'parse-path';
function getAugmentedNamespace(n) {
if (n.__esModule) return n;
var f = n.default;
if (typeof f == "function") {
var a = function a () {
if (this instanceof a) {
var args = [null];
args.push.apply(args, arguments);
var Ctor = Function.bind.apply(f, args);
return new Ctor();
}
return f.apply(this, arguments);
};
a.prototype = f.prototype;
} else a = {};
Object.defineProperty(a, '__esModule', {value: true});
Object.keys(n).forEach(function (k) {
var d = Object.getOwnPropertyDescriptor(n, k);
Object.defineProperty(a, k, d.get ? d : {
enumerable: true,
get: function () {
return n[k];
}
});
});
return a;
}
var src = {};
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs
const DATA_URL_DEFAULT_MIME_TYPE = 'text/plain';
const DATA_URL_DEFAULT_CHARSET = 'us-ascii';
const testParameter = (name, filters) => filters.some(filter => filter instanceof RegExp ? filter.test(name) : filter === name);
const normalizeDataURL = (urlString, {stripHash}) => {
const match = /^data:(?<type>[^,]*?),(?<data>[^#]*?)(?:#(?<hash>.*))?$/.exec(urlString);
if (!match) {
throw new Error(`Invalid URL: ${urlString}`);
}
let {type, data, hash} = match.groups;
const mediaType = type.split(';');
hash = stripHash ? '' : hash;
let isBase64 = false;
if (mediaType[mediaType.length - 1] === 'base64') {
mediaType.pop();
isBase64 = true;
}
// Lowercase MIME type
const mimeType = (mediaType.shift() || '').toLowerCase();
const attributes = mediaType
.map(attribute => {
let [key, value = ''] = attribute.split('=').map(string => string.trim());
// Lowercase `charset`
if (key === 'charset') {
value = value.toLowerCase();
if (value === DATA_URL_DEFAULT_CHARSET) {
return '';
}
}
return `${key}${value ? `=${value}` : ''}`;
})
.filter(Boolean);
const normalizedMediaType = [
...attributes,
];
if (isBase64) {
normalizedMediaType.push('base64');
}
if (normalizedMediaType.length > 0 || (mimeType && mimeType !== DATA_URL_DEFAULT_MIME_TYPE)) {
normalizedMediaType.unshift(mimeType);
}
return `data:${normalizedMediaType.join(';')},${isBase64 ? data.trim() : data}${hash ? `#${hash}` : ''}`;
};
function normalizeUrl(urlString, options) {
options = {
defaultProtocol: 'http:',
normalizeProtocol: true,
forceHttp: false,
forceHttps: false,
stripAuthentication: true,
stripHash: false,
stripTextFragment: true,
stripWWW: true,
removeQueryParameters: [/^utm_\w+/i],
removeTrailingSlash: true,
removeSingleSlash: true,
removeDirectoryIndex: false,
sortQueryParameters: true,
...options,
};
urlString = urlString.trim();
// Data URL
if (/^data:/i.test(urlString)) {
return normalizeDataURL(urlString, options);
}
if (/^view-source:/i.test(urlString)) {
throw new Error('`view-source:` is not supported as it is a non-standard protocol');
}
const hasRelativeProtocol = urlString.startsWith('//');
const isRelativeUrl = !hasRelativeProtocol && /^\.*\//.test(urlString);
// Prepend protocol
if (!isRelativeUrl) {
urlString = urlString.replace(/^(?!(?:\w+:)?\/\/)|^\/\//, options.defaultProtocol);
}
const urlObject = new URL(urlString);
if (options.forceHttp && options.forceHttps) {
throw new Error('The `forceHttp` and `forceHttps` options cannot be used together');
}
if (options.forceHttp && urlObject.protocol === 'https:') {
urlObject.protocol = 'http:';
}
if (options.forceHttps && urlObject.protocol === 'http:') {
urlObject.protocol = 'https:';
}
// Remove auth
if (options.stripAuthentication) {
urlObject.username = '';
urlObject.password = '';
}
// Remove hash
if (options.stripHash) {
urlObject.hash = '';
} else if (options.stripTextFragment) {
urlObject.hash = urlObject.hash.replace(/#?:~:text.*?$/i, '');
}
// Remove duplicate slashes if not preceded by a protocol
// NOTE: This could be implemented using a single negative lookbehind
// regex, but we avoid that to maintain compatibility with older js engines
// which do not have support for that feature.
if (urlObject.pathname) {
// TODO: Replace everything below with `urlObject.pathname = urlObject.pathname.replace(/(?<!\b[a-z][a-z\d+\-.]{1,50}:)\/{2,}/g, '/');` when Safari supports negative lookbehind.
// Split the string by occurrences of this protocol regex, and perform
// duplicate-slash replacement on the strings between those occurrences
// (if any).
const protocolRegex = /\b[a-z][a-z\d+\-.]{1,50}:\/\//g;
let lastIndex = 0;
let result = '';
for (;;) {
const match = protocolRegex.exec(urlObject.pathname);
if (!match) {
break;
}
const protocol = match[0];
const protocolAtIndex = match.index;
const intermediate = urlObject.pathname.slice(lastIndex, protocolAtIndex);
result += intermediate.replace(/\/{2,}/g, '/');
result += protocol;
lastIndex = protocolAtIndex + protocol.length;
}
const remnant = urlObject.pathname.slice(lastIndex, urlObject.pathname.length);
result += remnant.replace(/\/{2,}/g, '/');
urlObject.pathname = result;
}
// Decode URI octets
if (urlObject.pathname) {
try {
urlObject.pathname = decodeURI(urlObject.pathname);
} catch {}
}
// Remove directory index
if (options.removeDirectoryIndex === true) {
options.removeDirectoryIndex = [/^index\.[a-z]+$/];
}
if (Array.isArray(options.removeDirectoryIndex) && options.removeDirectoryIndex.length > 0) {
let pathComponents = urlObject.pathname.split('/');
const lastComponent = pathComponents[pathComponents.length - 1];
if (testParameter(lastComponent, options.removeDirectoryIndex)) {
pathComponents = pathComponents.slice(0, -1);
urlObject.pathname = pathComponents.slice(1).join('/') + '/';
}
}
if (urlObject.hostname) {
// Remove trailing dot
urlObject.hostname = urlObject.hostname.replace(/\.$/, '');
// Remove `www.`
if (options.stripWWW && /^www\.(?!www\.)[a-z\-\d]{1,63}\.[a-z.\-\d]{2,63}$/.test(urlObject.hostname)) {
// Each label should be max 63 at length (min: 1).
// Source: https://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_host_names
// Each TLD should be up to 63 characters long (min: 2).
// It is technically possible to have a single character TLD, but none currently exist.
urlObject.hostname = urlObject.hostname.replace(/^www\./, '');
}
}
// Remove query unwanted parameters
if (Array.isArray(options.removeQueryParameters)) {
// eslint-disable-next-line unicorn/no-useless-spread -- We are intentionally spreading to get a copy.
for (const key of [...urlObject.searchParams.keys()]) {
if (testParameter(key, options.removeQueryParameters)) {
urlObject.searchParams.delete(key);
}
}
}
if (options.removeQueryParameters === true) {
urlObject.search = '';
}
// Sort query parameters
if (options.sortQueryParameters) {
urlObject.searchParams.sort();
// Calling `.sort()` encodes the search parameters, so we need to decode them again.
try {
urlObject.search = decodeURIComponent(urlObject.search);
} catch {}
}
if (options.removeTrailingSlash) {
urlObject.pathname = urlObject.pathname.replace(/\/$/, '');
}
const oldUrlString = urlString;
// Take advantage of many of the Node `url` normalizations
urlString = urlObject.toString();
if (!options.removeSingleSlash && urlObject.pathname === '/' && !oldUrlString.endsWith('/') && urlObject.hash === '') {
urlString = urlString.replace(/\/$/, '');
}
// Remove ending `/` unless removeSingleSlash is false
if ((options.removeTrailingSlash || urlObject.pathname === '/') && urlObject.hash === '' && options.removeSingleSlash) {
urlString = urlString.replace(/\/$/, '');
}
// Restore relative protocol, if applicable
if (hasRelativeProtocol && !options.normalizeProtocol) {
urlString = urlString.replace(/^http:\/\//, '//');
}
// Remove http/https
if (options.stripProtocol) {
urlString = urlString.replace(/^(?:https?:)?\/\//, '');
}
return urlString;
}
var normalizeUrl$1 = /*#__PURE__*/Object.freeze({
__proto__: null,
'default': normalizeUrl
});
var require$$0 = /*@__PURE__*/getAugmentedNamespace(normalizeUrl$1);
Object.defineProperty(src, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; // Dependencies
var _normalizeUrl = require$$0;
var _normalizeUrl2 = _interopRequireDefault(_normalizeUrl);
var _parsePath = require$$1;
var _parsePath2 = _interopRequireDefault(_parsePath);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* parseUrl
* Parses the input url.
*
* **Note**: This *throws* if invalid urls are provided.
*
* @name parseUrl
* @function
* @param {String} url The input url.
* @param {Boolean|Object} normalize Whether to normalize the url or not.
* Default is `false`. If `true`, the url will
* be normalized. If an object, it will be the
* options object sent to [`normalize-url`](https://github.com/sindresorhus/normalize-url).
*
* For SSH urls, normalize won't work.
*
* @return {Object} An object containing the following fields:
*
* - `protocols` (Array): An array with the url protocols (usually it has one element).
* - `protocol` (String): The first protocol, `"ssh"` (if the url is a ssh url) or `"file"`.
* - `port` (null|Number): The domain port.
* - `resource` (String): The url domain (including subdomains).
* - `host` (String): The fully qualified domain name of a network host, or its IP address.
* - `user` (String): The authentication user (usually for ssh urls).
* - `pathname` (String): The url pathname.
* - `hash` (String): The url hash.
* - `search` (String): The url querystring value.
* - `href` (String): The input url.
* - `query` (Object): The url querystring, parsed as object.
* - `parse_failed` (Boolean): Whether the parsing failed or not.
*/
var parseUrl = function parseUrl(url) {
var normalize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
// Constants
/**
* ([a-zA-Z_][a-zA-Z0-9_-]{0,31}) Try to match the user
* ([\w\.\-@]+) Match the host/resource
* (([\~,\.\w,\-,\_,\/,\s]|%[0-9A-Fa-f]{2})+?(?:\.git|\/)?) Match the path, allowing spaces/white
*/
var GIT_RE = /^(?:([a-zA-Z_][a-zA-Z0-9_-]{0,31})@|https?:\/\/)([\w\.\-@]+)[\/:](([\~,\.\w,\-,\_,\/,\s]|%[0-9A-Fa-f]{2})+?(?:\.git|\/)?)$/;
var throwErr = function throwErr(msg) {
var err = new Error(msg);
err.subject_url = url;
throw err;
};
if (typeof url !== "string" || !url.trim()) {
throwErr("Invalid url.");
}
if (url.length > parseUrl.MAX_INPUT_LENGTH) {
throwErr("Input exceeds maximum length. If needed, change the value of parseUrl.MAX_INPUT_LENGTH.");
}
if (normalize) {
if ((typeof normalize === "undefined" ? "undefined" : _typeof(normalize)) !== "object") {
normalize = {
stripHash: false
};
}
url = (0, _normalizeUrl2.default)(url, normalize);
}
var parsed = (0, _parsePath2.default)(url);
// Potential git-ssh urls
if (parsed.parse_failed) {
var matched = parsed.href.match(GIT_RE);
if (matched) {
parsed.protocols = ["ssh"];
parsed.protocol = "ssh";
parsed.resource = matched[2];
parsed.host = matched[2];
parsed.user = matched[1];
parsed.pathname = "/" + matched[3];
parsed.parse_failed = false;
} else {
throwErr("URL parsing failed.");
}
}
return parsed;
};
parseUrl.MAX_INPUT_LENGTH = 2048;
var _default = src.default = parseUrl;
export { _default as default };

7
Frontend-Learner/node_modules/parse-url/index.d.mts generated vendored Normal file
View file

@ -0,0 +1,7 @@
import parseUrl = require("./index");
export type ParsedUrl = parseUrl.ParsedUrl;
export type NormalizeOptions = parseUrl.NormalizeOptions;
export type ParsingError = parseUrl.ParsingError;
export default parseUrl;

21
Frontend-Learner/node_modules/parse-url/index.d.ts generated vendored Normal file
View file

@ -0,0 +1,21 @@
import parsePath = require("parse-path");
import normalizeUrl = require("normalize-url");
declare namespace parseUrl {
const MAX_INPUT_LENGTH: 2048;
type NormalizeOptions = normalizeUrl.Options;
type ParsedUrl = parsePath.ParsedPath;
interface ParsingError extends Error {
readonly subject_url: string;
}
}
declare function parseUrl(
url: string,
normalize?: boolean | parseUrl.NormalizeOptions
): parseUrl.ParsedUrl;
export = parseUrl;

81
Frontend-Learner/node_modules/parse-url/package.json generated vendored Normal file
View file

@ -0,0 +1,81 @@
{
"name": "parse-url",
"version": "9.2.0",
"description": "An advanced url parser supporting git urls too.",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
"types": "./index.d.ts",
"exports": {
"require": {
"types": "./index.d.ts",
"default": "./dist/index.js"
},
"import": {
"types": "./index.d.mts",
"default": "./dist/index.mjs"
}
},
"directories": {
"example": "example",
"test": "test"
},
"scripts": {
"test": "node test/index.mjs && tsd",
"build": "pkgroll"
},
"repository": {
"type": "git",
"url": "git+https://github.com/IonicaBizau/parse-url.git"
},
"keywords": [
"parse",
"url",
"node",
"git",
"advanced"
],
"author": "Ionică Bizău <bizauionica@gmail.com> (https://ionicabizau.net)",
"license": "MIT",
"bugs": {
"url": "https://github.com/IonicaBizau/parse-url/issues"
},
"homepage": "https://github.com/IonicaBizau/parse-url",
"devDependencies": {
"normalize-url": "^7.0.3",
"pkgroll": "^1.11.1",
"tester": "^1.3.1",
"tsd": "^0.24.1"
},
"dependencies": {
"@types/parse-path": "^7.0.0",
"parse-path": "^7.0.0"
},
"files": [
"bin/",
"app/",
"lib/",
"dist/",
"src/",
"scripts/",
"resources/",
"menu/",
"cli.js",
"index.js",
"index.d.ts",
"index.d.mts",
"bloggify.js",
"bloggify.json",
"bloggify/"
],
"engines": {
"node": ">=14.13.0"
},
"blah": {
"description": [
"For low-level path parsing, check out [`parse-path`](https://github.com/IonicaBizau/parse-path). This very module is designed to parse urls. By default the urls are normalized."
]
},
"tsd": {
"directory": "test"
}
}

109
Frontend-Learner/node_modules/parse-url/src/index.js generated vendored Normal file
View file

@ -0,0 +1,109 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; // Dependencies
var _normalizeUrl = require("normalize-url");
var _normalizeUrl2 = _interopRequireDefault(_normalizeUrl);
var _parsePath = require("parse-path");
var _parsePath2 = _interopRequireDefault(_parsePath);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* parseUrl
* Parses the input url.
*
* **Note**: This *throws* if invalid urls are provided.
*
* @name parseUrl
* @function
* @param {String} url The input url.
* @param {Boolean|Object} normalize Whether to normalize the url or not.
* Default is `false`. If `true`, the url will
* be normalized. If an object, it will be the
* options object sent to [`normalize-url`](https://github.com/sindresorhus/normalize-url).
*
* For SSH urls, normalize won't work.
*
* @return {Object} An object containing the following fields:
*
* - `protocols` (Array): An array with the url protocols (usually it has one element).
* - `protocol` (String): The first protocol, `"ssh"` (if the url is a ssh url) or `"file"`.
* - `port` (null|Number): The domain port.
* - `resource` (String): The url domain (including subdomains).
* - `host` (String): The fully qualified domain name of a network host, or its IP address.
* - `user` (String): The authentication user (usually for ssh urls).
* - `pathname` (String): The url pathname.
* - `hash` (String): The url hash.
* - `search` (String): The url querystring value.
* - `href` (String): The input url.
* - `query` (Object): The url querystring, parsed as object.
* - `parse_failed` (Boolean): Whether the parsing failed or not.
*/
var parseUrl = function parseUrl(url) {
var normalize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
// Constants
/**
* ([a-zA-Z_][a-zA-Z0-9_-]{0,31}) Try to match the user
* ([\w\.\-@]+) Match the host/resource
* (([\~,\.\w,\-,\_,\/,\s]|%[0-9A-Fa-f]{2})+?(?:\.git|\/)?) Match the path, allowing spaces/white
*/
var GIT_RE = /^(?:([a-zA-Z_][a-zA-Z0-9_-]{0,31})@|https?:\/\/)([\w\.\-@]+)[\/:](([\~,\.\w,\-,\_,\/,\s]|%[0-9A-Fa-f]{2})+?(?:\.git|\/)?)$/;
var throwErr = function throwErr(msg) {
var err = new Error(msg);
err.subject_url = url;
throw err;
};
if (typeof url !== "string" || !url.trim()) {
throwErr("Invalid url.");
}
if (url.length > parseUrl.MAX_INPUT_LENGTH) {
throwErr("Input exceeds maximum length. If needed, change the value of parseUrl.MAX_INPUT_LENGTH.");
}
if (normalize) {
if ((typeof normalize === "undefined" ? "undefined" : _typeof(normalize)) !== "object") {
normalize = {
stripHash: false
};
}
url = (0, _normalizeUrl2.default)(url, normalize);
}
var parsed = (0, _parsePath2.default)(url);
// Potential git-ssh urls
if (parsed.parse_failed) {
var matched = parsed.href.match(GIT_RE);
if (matched) {
parsed.protocols = ["ssh"];
parsed.protocol = "ssh";
parsed.resource = matched[2];
parsed.host = matched[2];
parsed.user = matched[1];
parsed.pathname = "/" + matched[3];
parsed.parse_failed = false;
} else {
throwErr("URL parsing failed.");
}
}
return parsed;
};
parseUrl.MAX_INPUT_LENGTH = 2048;
exports.default = parseUrl;