Logo

0x3d.Site

is designed for aggregating information.
Welcome
check repository here

url-pattern

NPM Package Build Status Sauce Test Status codecov.io Downloads per Month

easier than regex string matching patterns for urls and other strings.
turn strings into data or data into strings.

This is a great little library -- thanks!
michael

make pattern:

var pattern = new UrlPattern('/api/users(/:id)');

match pattern against string and extract values:

pattern.match('/api/users/10'); // {id: '10'}
pattern.match('/api/users'); // {}
pattern.match('/api/products/5'); // null

generate string from pattern and values:

pattern.stringify() // '/api/users'
pattern.stringify({id: 20}) // '/api/users/20'

check out passage if you are looking for simple composable routing that builds on top of url-pattern

npm install url-pattern
bower install url-pattern
> var UrlPattern = require('url-pattern');
> var pattern = new UrlPattern('/v:major(.:minor)/*');

> pattern.match('/v1.2/');
{major: '1', minor: '2', _: ''}

> pattern.match('/v2/users');
{major: '2', _: 'users'}

> pattern.match('/v/');
null
> var pattern = new UrlPattern('(http(s)\\://)(:subdomain.):domain.:tld(\\::port)(/*)')

> pattern.match('google.de');
{domain: 'google', tld: 'de'}

> pattern.match('https://www.google.com');
{subdomain: 'www', domain: 'google', tld: 'com'}

> pattern.match('http://mail.google.com/mail');
{subdomain: 'mail', domain: 'google', tld: 'com', _: 'mail'}

> pattern.match('http://mail.google.com:80/mail');
{subdomain: 'mail', domain: 'google', tld: 'com', port: '80', _: 'mail'}

> pattern.match('google');
null

make pattern from string

> var pattern = new UrlPattern('/api/users/:id');

a pattern is immutable after construction.
none of its methods changes its state.
that makes it easier to reason about.

match pattern against string

match returns the extracted segments:

> pattern.match('/api/users/10');
{id: '10'}

or null if there was no match:

> pattern.match('/api/products/5');
null

patterns are compiled into regexes which makes .match() superfast.

named segments

:id (in the example above) is a named segment:

a named segment starts with : followed by the name.
the name must be at least one character in the regex character set a-zA-Z0-9.

when matching, a named segment consumes all characters in the regex character set a-zA-Z0-9-_~ %. a named segment match stops at /, ., ... but not at _, -, , %...

you can change these character sets. click here to see how.

if a named segment name occurs more than once in the pattern string, then the multiple results are stored in an array on the returned object:

> var pattern = new UrlPattern('/api/users/:ids/posts/:ids');
> pattern.match('/api/users/10/posts/5');
{ids: ['10', '5']}

optional segments, wildcards and escaping

to make part of a pattern optional just wrap it in ( and ):

> var pattern = new UrlPattern(
  '(http(s)\\://)(:subdomain.):domain.:tld(/*)'
);

note that \\ escapes the : in http(s)\\://. you can use \\ to escape (, ), : and * which have special meaning within url-pattern.

optional named segments are stored in the corresponding property only if they are present in the source string:

> pattern.match('google.de');
{domain: 'google', tld: 'de'}
> pattern.match('https://www.google.com');
{subdomain: 'www', domain: 'google', tld: 'com'}

* in patterns are wildcards and match anything. wildcard matches are collected in the _ property:

> pattern.match('http://mail.google.com/mail');
{subdomain: 'mail', domain: 'google', tld: 'com', _: 'mail'}

if there is only one wildcard then _ contains the matching string. otherwise _ contains an array of matching strings.

look at the tests for additional examples of .match

make pattern from regex

> var pattern = new UrlPattern(/^\/api\/(.*)$/);

if the pattern was created from a regex an array of the captured groups is returned on a match:

> pattern.match('/api/users');
['users']

> pattern.match('/apiii/test');
null

when making a pattern from a regex you can pass an array of keys as the second argument. returns objects on match with each key mapped to a captured value:

> var pattern = new UrlPattern(
  /^\/api\/([^\/]+)(?:\/(\d+))?$/,
  ['resource', 'id']
);

> pattern.match('/api/users');
{resource: 'users'}

> pattern.match('/api/users/5');
{resource: 'users', id: '5'}

> pattern.match('/api/users/foo');
null

stringify patterns

> var pattern = new UrlPattern('/api/users/:id');

> pattern.stringify({id: 10})
'/api/users/10'

optional segments are only included in the output if they contain named segments and/or wildcards and values for those are provided:

> var pattern = new UrlPattern('/api/users(/:id)');

> pattern.stringify()
'/api/users'

> pattern.stringify({id: 10})
'/api/users/10'

wildcards (key = _), deeply nested optional groups and multiple value arrays should stringify as expected.

an error is thrown if a value that is not in an optional group is not provided.

an error is thrown if an optional segment contains multiple params and not all of them are provided. one provided value for an optional segment makes all values in that optional segment required.

look at the tests for additional examples of .stringify

customize the pattern syntax

finally we can completely change pattern-parsing and regex-compilation to suit our needs:

> var options = {};

let's change the char used for escaping (default \\):

> options.escapeChar = '!';

let's change the char used to start a named segment (default :):

> options.segmentNameStartChar = '$';

let's change the set of chars allowed in named segment names (default a-zA-Z0-9) to also include _ and -:

> options.segmentNameCharset = 'a-zA-Z0-9_-';

let's change the set of chars allowed in named segment values (default a-zA-Z0-9-_~ %) to not allow non-alphanumeric chars:

> options.segmentValueCharset = 'a-zA-Z0-9';

let's change the chars used to surround an optional segment (default ( and )):

> options.optionalSegmentStartChar = '[';
> options.optionalSegmentEndChar = ']';

let's change the char used to denote a wildcard (default *):

> options.wildcardChar = '?';

pass options as the second argument to the constructor:

> var pattern = new UrlPattern(
  '[http[s]!://][$sub_domain.]$domain.$toplevel-domain[/?]',
  options
);

then match:

> pattern.match('http://mail.google.com/mail');
{
  sub_domain: 'mail',
  domain: 'google',
  'toplevel-domain': 'com',
  _: 'mail'
}

frequently asked questions

how do i match the query part of an URL ?

the query part of an URL has very different semantics than the rest. url-pattern is not well suited for parsing the query part.

there are good existing libraries for parsing the query part of an URL. https://github.com/hapijs/qs is an example. in the interest of keeping things simple and focused i see no reason to add special support for parsing the query part to url-pattern.

i recommend splitting the URL at ?, using url-pattern to parse the first part (scheme, host, port, path) and using https://github.com/hapijs/qs to parse the last part (query).

how do i match an IP ?

you can't exactly match IPs with url-pattern so you have to fall back to regexes and pass in a regex object.

here's how you do it

contributing

license: MIT

Node.js
Node.js
Node.js is a runtime environment for executing JavaScript on the server side. Known for its non-blocking architecture, it’s ideal for building fast and scalable network applications, including APIs and real-time services.
GitHub - davglass/license-checker: Check NPM package licenses
GitHub - davglass/license-checker: Check NPM package licenses
Build software better, together
Build software better, together
CodeSandbox
CodeSandbox
Node.js Design Patterns Third Edition by Mario Casciaro and Luciano Mammino
Node.js Design Patterns Third Edition by Mario Casciaro and Luciano Mammino
GitHub - almost/through2-concurrent: Simple Node.JS stream (streams2) Transform that runs the transform functions concurrently (with a set max concurrency)
GitHub - almost/through2-concurrent: Simple Node.JS stream (streams2) Transform that runs the transform functions concurrently (with a set max concurrency)
Google I/O 2013 - Accelerating Oz with V8: Follow the Yellow Brick Road to JavaScript Performance
Google I/O 2013 - Accelerating Oz with V8: Follow the Yellow Brick Road to JavaScript Performance
babel/packages/babel-parser at master · babel/babel
babel/packages/babel-parser at master · babel/babel
GitHub - SheetJS/sheetjs: 📗 SheetJS Spreadsheet Data Toolkit -- New home https://git.sheetjs.com/SheetJS/sheetjs
GitHub - SheetJS/sheetjs: 📗 SheetJS Spreadsheet Data Toolkit -- New home https://git.sheetjs.com/SheetJS/sheetjs
GitHub - sindresorhus/log-symbols: Colored symbols for various log levels
GitHub - sindresorhus/log-symbols: Colored symbols for various log levels
GitHub - Raathigesh/atmo: :heavy_check_mark: Mock data for your prototypes and demos. Remote deployments to Zeit now.
GitHub - Raathigesh/atmo: :heavy_check_mark: Mock data for your prototypes and demos. Remote deployments to Zeit now.
GitHub - tapio/live-server: A simple development http server with live reload capability.
GitHub - tapio/live-server: A simple development http server with live reload capability.
GitHub - pawurb/normit: Translations with speech synthesis in your terminal as a node package
GitHub - pawurb/normit: Translations with speech synthesis in your terminal as a node package
GitHub - lodash/lodash: A modern JavaScript utility library delivering modularity, performance, & extras.
GitHub - lodash/lodash: A modern JavaScript utility library delivering modularity, performance, & extras.
Node JS Internal Architecture | Ignition, Turbofan, Libuv
Node JS Internal Architecture | Ignition, Turbofan, Libuv
GitHub - chalk/chalk: 🖍 Terminal string styling done right
GitHub - chalk/chalk: 🖍 Terminal string styling done right
GitHub - sindresorhus/awesome-observables: Awesome Observable related stuff - An Observable is a collection that arrives over time.
GitHub - sindresorhus/awesome-observables: Awesome Observable related stuff - An Observable is a collection that arrives over time.
GitHub - patrickjuchli/basic-ftp: FTP client for Node.js, supports FTPS over TLS, passive mode over IPv6, async/await, and Typescript.
GitHub - patrickjuchli/basic-ftp: FTP client for Node.js, supports FTPS over TLS, passive mode over IPv6, async/await, and Typescript.
GitHub - codeceptjs/CodeceptJS: Supercharged End 2 End Testing Framework for NodeJS
GitHub - codeceptjs/CodeceptJS: Supercharged End 2 End Testing Framework for NodeJS
Newest 'node.js' Questions
Newest 'node.js' Questions
You Don't Know Node - ForwardJS San Francisco
You Don't Know Node - ForwardJS San Francisco
Node.js in Action, Second Edition
Node.js in Action, Second Edition
Google I/O 2009 - V8: ..High Performance JavaScript Engine
Google I/O 2009 - V8: ..High Performance JavaScript Engine
stackgl
stackgl
GitHub - MrRio/vtop: Wow such top. So stats. More better than regular top.
GitHub - MrRio/vtop: Wow such top. So stats. More better than regular top.
GitHub - nut-tree/nut.js: Native UI testing / controlling with node
GitHub - nut-tree/nut.js: Native UI testing / controlling with node
GitHub - mafintosh/pumpify: Combine an array of streams into a single duplex stream using pump and duplexify
GitHub - mafintosh/pumpify: Combine an array of streams into a single duplex stream using pump and duplexify
GitHub - sindresorhus/cli-cursor: Toggle the CLI cursor
GitHub - sindresorhus/cli-cursor: Toggle the CLI cursor
GitHub - sindresorhus/fkill-cli: Fabulously kill processes. Cross-platform.
GitHub - sindresorhus/fkill-cli: Fabulously kill processes. Cross-platform.
GitHub - retextjs/retext: natural language processor powered by plugins part of the @unifiedjs collective
GitHub - retextjs/retext: natural language processor powered by plugins part of the @unifiedjs collective
GitHub - sindresorhus/trash: Move files and directories to the trash
GitHub - sindresorhus/trash: Move files and directories to the trash
Node.js
More on Node.js

Programming Tips & Tricks

Code smarter, not harder—insider tips and tricks for developers.

Error Solutions

Turn frustration into progress—fix errors faster than ever.

Shortcuts

The art of speed—shortcuts to supercharge your workflow.
  1. Collections 😎
  2. Frequently Asked Question's 🤯

Tools

available to use.

Made with ❤️

to provide resources in various ares.