The Uniform redirect SDK
The Uniform SDK lets developers work with redirects.
Execute redirects#
The following example is a platform-agnostic approach to executing on redirects using the Uniform redirect SDK.
import { RedirectClient, WithMemoryCache } from '@uniformdev/redirect'
import * as dotenv from 'dotenv'
dotenv.config()
const client = new RedirectClient({
apiKey: process.env.UNIFORM_API_KEY,
projectId: process.env.UNIFORM_PROJECT_ID,
// Store a cache of the data needed to resolve redirects in memory. This could potentially get large.
// Can operate without it, but will request data every hit. Also of note the API is cached by fastly, so the repeated request response will be fast.
// Memory cache only makes sense in middleware environments that retain objects between requests somehow.
dataCache: new WithMemoryCache({ prePopulate: true, refreshRate: 20000 }),
})
// Expected that whatever product is being used has the ability get get the current URL and perform a redirect.
export default async function middleware(request: {
getUrl: () => string,
redirect: (target: string, statusCode: number) => void,
keepGoingNormally: () => void,
}) {
const url = request.getUrl()
const result = await client.processUrlBestMatch(url)
if (result) {
request.redirect(
result.url,
result.definition?.redirect.targetStatusCode ?? 301
)
return
}
request.keepGoingNormally()
}
Convert redirects for 3rd-party tools#
The following examples represent converting Uniform redirects into a format that's executable by third-party hosting tools such as Netlify and Cloudflare:
import { RedirectClient } from '@uniformdev/redirect'
import * as dotenv from 'dotenv'
import * as fs from 'fs'
const convertUniformToNextjs = async () => {
dotenv.config()
const client = new RedirectClient({
apiKey: process.env.UNIFORM_API_KEY,
projectId: process.env.UNIFORM_PROJECT_ID,
})
const ret = []
let redirects = (await client.getRedirects({ limit: 50, offset: 0 }))
.redirects
let count = 0
while (redirects.length) {
const redirect = redirects.pop()
ret.push({
source: redirect?.redirect.sourceUrl,
destination: redirect?.redirect.targetUrl,
permanent: redirect?.redirect.targetStatusCode === 301,
})
if (!redirects.length) {
count++
redirects = (await client.getRedirects({ limit: 50, offset: count * 50 }))
.redirects
}
}
if (!fs.existsSync('out')) {
fs.mkdirSync('out')
}
fs.writeFile(
'out/nextJsRedirects.json',
JSON.stringify(ret, undefined, ' '),
(e) => {
if (e) {
console.log(e)
}
}
)
}
convertUniformToNextjs()
The previous examples of converting Uniform redirects result in an output like the following:
[
{
"source": "/a",
"destination": "/b",
"permanent": true
},
{
"source": "/this",
"destination": "/that",
"permanent": true
},
{
"source": "/product/electronics/walkie-talkie",
"destination": "/electronics/walkie-talkie",
"permanent": true
},
{
"source": "/source/path",
"destination": "/target/url",
"permanent": true
}
]
CLI commands for redirects#
Learn about the CLI commands for redirects in the CLI guide.