@jsenv/server
Advanced tools
Comparing version 12.3.3 to 12.4.0
{ | ||
"name": "@jsenv/server", | ||
"version": "12.3.3", | ||
"version": "12.4.0", | ||
"description": "Write your Node.js server using pure functions", | ||
@@ -5,0 +5,0 @@ "license": "MIT", |
import { urlToMeta, normalizeStructuredMetaMap } from "@jsenv/url-meta" | ||
import { escapeRegexpSpecialCharacters } from "./regex_escape.js" | ||
export const pluginRessourceAliases = (ressourceAliases) => { | ||
const ressourceAliasMap = {} | ||
const alias = {} | ||
Object.keys(ressourceAliases).forEach((key) => { | ||
ressourceAliasMap[ressourceAliases[key]] = key | ||
alias[key] = { | ||
pattern: key, | ||
replacement: ressourceAliases[key], | ||
} | ||
}) | ||
const structuredMetaMap = normalizeStructuredMetaMap( | ||
{ alias: ressourceAliasMap }, | ||
{ | ||
alias, | ||
}, | ||
"file:///", | ||
) | ||
const getRessourceAlias = (pathname) => { | ||
@@ -28,10 +34,31 @@ const { alias } = urlToMeta({ | ||
} | ||
const urlObjectAfterAlias = replaceUrlRessource( | ||
request.url, | ||
ressourceAlias, | ||
) | ||
const ressource = `${urlObjectAfterAlias.pathname}${urlObjectAfterAlias.search}` | ||
const { pattern, replacement } = ressourceAlias | ||
let newValue | ||
const ressourceBeforeAlias = request.ressource | ||
if (replacement.includes("*")) { | ||
let regexsource = "" | ||
let i = 0 | ||
while (i < pattern.length) { | ||
const char = pattern[i] | ||
i++ | ||
if (char === "*") { | ||
regexsource += "(.+)" | ||
} else { | ||
regexsource += escapeRegexpSpecialCharacters(char) | ||
} | ||
} | ||
const regex = new RegExp(regexsource) | ||
const matchResult = ressourceBeforeAlias.match(regex) | ||
const parts = replacement.split("*") | ||
newValue = parts.reduce((previous, value, index) => { | ||
return `${previous}${value}${ | ||
index === parts.length - 1 ? "" : matchResult[index + 1] | ||
}` | ||
}, "") | ||
} else { | ||
newValue = replacement | ||
} | ||
const ressource = replaceRessource(ressourceBeforeAlias, newValue) | ||
redirectRequest({ | ||
ressourceBeforeAlias: request.ressource, | ||
ressourceBeforeAlias, | ||
ressource, | ||
@@ -44,14 +71,11 @@ }) | ||
const replaceUrlRessource = (url, ressource) => { | ||
const urlObject = new URL(url) | ||
const searchSeparatorIndex = ressource.indexOf("?") | ||
if (searchSeparatorIndex === -1) { | ||
urlObject.pathname = ressource | ||
return urlObject | ||
const replaceRessource = (ressourceBeforeAlias, newValue) => { | ||
const urlObject = new URL(ressourceBeforeAlias, "file://") | ||
const searchSeparatorIndex = newValue.indexOf("?") | ||
if (searchSeparatorIndex > -1) { | ||
return newValue // let new value override search params | ||
} | ||
const pathname = ressource.slice(0, searchSeparatorIndex) | ||
urlObject.pathname = pathname | ||
return urlObject | ||
urlObject.pathname = newValue | ||
const ressource = `${urlObject.pathname}${urlObject.search}` | ||
return ressource | ||
} |
136186
58
4255