
Product
Announcing Socket Fix 2.0
Socket Fix 2.0 brings targeted CVE remediation, smarter upgrade planning, and broader ecosystem support to help developers get to zero alerts.
build-url-ts
Advanced tools
A small, fast library for building URLs with a fluent API. Fully typed for TypeScript and works in Node.js and browsers.
# npm
npm install build-url-ts
# yarn
yarn add build-url-ts
# pnpm
pnpm add build-url-ts
import { buildUrl } from 'build-url-ts';
const url = buildUrl('https://api.example.com', {
path: 'users/123',
queryParams: {
tab: 'profile',
limit: 10
}
});
// Result: https://api.example.com/users/123?tab=profile&limit=10
buildUrl(baseUrl?, options?)
Builds a complete URL from components.
baseUrl
(optional): string | null
- The base URLoptions
(optional): IBuildUrlOptions
- URL building optionsinterface IBuildUrlOptions {
path?: string | number; // Path to append
queryParams?: IQueryParams; // Query parameters object
hash?: string | number; // Hash/fragment identifier
lowerCase?: boolean; // Convert to lowercase
disableCSV?: boolean | IDisableCsvType; // Array handling
}
import { buildUrl } from 'build-url-ts';
// Simple URL with path
buildUrl('https://example.com', {
path: 'about'
});
// β https://example.com/about
// With query parameters
buildUrl('https://example.com', {
path: 'search',
queryParams: {
q: 'typescript',
category: 'tutorials'
}
});
// β https://example.com/search?q=typescript&category=tutorials
// With hash
buildUrl('https://example.com', {
path: 'docs',
hash: 'installation'
});
// β https://example.com/docs#installation
// All combined
buildUrl('https://api.example.com', {
path: 'v1/users',
queryParams: {
role: 'admin',
active: true
},
hash: 'summary'
});
// β https://api.example.com/v1/users?role=admin&active=true#summary
// Default: Arrays as comma-separated values
buildUrl('https://api.example.com', {
queryParams: {
ids: [1, 2, 3]
}
});
// β https://api.example.com?ids=1,2,3
// Arrays as repeated parameters
buildUrl('https://api.example.com', {
queryParams: {
id: [1, 2, 3]
},
disableCSV: true
});
// β https://api.example.com?id=1&id=2&id=3
// Arrays with bracket notation
buildUrl('https://api.example.com', {
queryParams: {
id: [1, 2, 3]
},
disableCSV: 'array'
});
// β https://api.example.com?id[]=1&id[]=2&id[]=3
// Arrays with indexed notation (ascending)
buildUrl('https://api.example.com', {
queryParams: {
id: [1, 2, 3]
},
disableCSV: 'order_asc'
});
// β https://api.example.com?id[0]=1&id[1]=2&id[2]=3
// Arrays with indexed notation (descending)
buildUrl('https://api.example.com', {
queryParams: {
id: [1, 2, 3]
},
disableCSV: 'order_desc'
});
// β https://api.example.com?id[2]=1&id[1]=2&id[0]=3
// Convert to lowercase
buildUrl('https://example.com', {
path: 'About',
hash: 'Contact',
queryParams: {
Filter: 'NEW'
},
lowerCase: true
});
// β https://example.com/about?filter=new#contact
// Query string only
buildUrl(null, {
queryParams: {
page: 1,
limit: 20
}
});
// β ?page=1&limit=20
// Path only
buildUrl(null, {
path: 'users/profile'
});
// β /users/profile
// Hash only
buildUrl(null, {
hash: 'top'
});
// β #top
// Using options as first parameter
buildUrl({
path: 'api/v2',
queryParams: {
format: 'json'
}
});
// β /api/v2?format=json
// Null values become empty strings
buildUrl('https://api.example.com', {
queryParams: {
name: 'John',
age: null
}
});
// β https://api.example.com?name=John&age=
// Undefined values are omitted
buildUrl('https://api.example.com', {
queryParams: {
name: 'John',
age: undefined
}
});
// β https://api.example.com?name=John
// Number values
buildUrl('https://api.example.com', {
path: 404,
queryParams: {
code: 0,
retry: 3
}
});
// β https://api.example.com/404?code=0&retry=3
// Boolean values
buildUrl('https://api.example.com', {
queryParams: {
active: true,
deleted: false
}
});
// β https://api.example.com?active=true&deleted=false
// Date objects
const date = new Date('2024-01-01T00:00:00Z');
buildUrl('https://api.example.com', {
queryParams: {
created: date
}
});
// β https://api.example.com?created=Mon%20Jan%2001%202024...
// Nested objects (automatically stringified)
buildUrl('https://api.example.com', {
queryParams: {
filter: { status: 'active', role: 'admin' }
}
});
// β https://api.example.com?filter=%7B%22status%22%3A%22active%22%2C%22role%22%3A%22admin%22%7D
The library also exports individual functions for more granular control:
import {
buildQueryString,
appendPath,
buildHash
} from 'build-url-ts';
// Build query string only
const qs = buildQueryString({
search: 'typescript',
limit: 10
});
// β ?search=typescript&limit=10
// Append path to URL
const urlWithPath = appendPath('users/123', 'https://api.example.com');
// β https://api.example.com/users/123
// Build hash fragment
const hash = buildHash('section-2');
// β #section-2
import type {
IQueryParams,
IBuildUrlOptions,
IDisableCsvType
} from 'build-url-ts';
// Custom query params type
interface MyParams extends IQueryParams {
userId: number;
tags?: string[];
active?: boolean;
}
const options: IBuildUrlOptions = {
path: 'api/users',
queryParams: {
userId: 123,
tags: ['admin', 'verified']
} as MyParams
};
All values are properly encoded for URLs:
buildUrl('https://example.com', {
queryParams: {
name: 'John Doe',
email: 'john@example.com',
message: 'Hello & goodbye!',
unicode: 'δ½ ε₯½δΈη'
}
});
// β https://example.com?name=John%20Doe&email=john%40example.com&message=Hello%20%26%20goodbye!&unicode=%E4%BD%A0%E5%A5%BD%E4%B8%96%E7%95%8C
The library handles various edge cases gracefully:
// Empty or missing base URL
buildUrl('', { path: 'api' }); // β /api
buildUrl(null, { path: 'api' }); // β /api
buildUrl(undefined, { path: 'api' }); // β /api
// Trailing slashes
buildUrl('https://example.com/', { path: '/users' });
// β https://example.com/users (no double slash)
// Empty values
buildUrl('https://example.com', {
path: '', // ignored
hash: '', // ignored
queryParams: {
empty: '', // included as empty
zero: 0, // included as "0"
false: false // included as "false"
}
});
// β https://example.com?empty=&zero=0&false=false
// URLs with existing query parameters (automatic merging)
buildUrl('https://example.com?existing=param', {
queryParams: {
new: 'value'
}
});
// β https://example.com?existing=param&new=value
// URLs with ports and authentication
buildUrl('http://user:pass@localhost:3000', {
path: 'api/secure'
});
// β http://user:pass@localhost:3000/api/secure
// Special protocols
buildUrl('file:///home/user/data', {
queryParams: { version: 2 }
});
// β file:///home/user/data?version=2
// Internationalized domain names and emoji
buildUrl('https://δΎγ.jp', {
queryParams: {
search: 'π',
text: 'δ½ ε₯½'
}
});
// β https://δΎγ.jp?search=%F0%9F%94%8D&text=%E4%BD%A0%E5%A5%BD
// Empty arrays are omitted
buildUrl('https://api.example.com', {
queryParams: {
ids: [],
name: 'test'
}
});
// β https://api.example.com?name=test
// Arrays with null/undefined values
buildUrl('https://api.example.com', {
queryParams: {
items: ['one', null, undefined, 'four']
},
disableCSV: true
});
// β https://api.example.com?items=one&items=&items=four
// (undefined values are filtered out)
build-url
This library is a TypeScript fork of the original build-url
package with improvements:
// Before (build-url)
var buildUrl = require('build-url');
// After (build-url-ts)
import { buildUrl } from 'build-url-ts';
The API remains fully compatible, so you can simply replace the import.
Contributions are welcome! Please feel free to submit a Pull Request.
git checkout -b feature/amazing-feature
)git commit -m 'Add some amazing feature'
)git push origin feature/amazing-feature
)# Run tests
npm test
# Run tests in watch mode
npm run test-watch
# Build the library
npm run build
# Run linting
npm run lint
# Type checking
npm run typecheck
The library has comprehensive test coverage with 137+ test cases covering:
This is licensed under MIT License. See details
This is a TypeScript enhancement of the original build-url library by Steve Rydz.
FAQs
A small library that builds a URL given its components
The npm package build-url-ts receives a total of 10,918 weekly downloads. As such, build-url-ts popularity was classified as popular.
We found that build-url-ts demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago.Β It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Product
Socket Fix 2.0 brings targeted CVE remediation, smarter upgrade planning, and broader ecosystem support to help developers get to zero alerts.
Security News
Socket CEO Feross Aboukhadijeh joins Risky Business Weekly to unpack recent npm phishing attacks, their limited impact, and the risks if attackers get smarter.
Product
Socketβs new Tier 1 Reachability filters out up to 80% of irrelevant CVEs, so security teams can focus on the vulnerabilities that matter.