diff --git a/packages/server/src/api/rest/index.ts b/packages/server/src/api/rest/index.ts index a9a39a42..6ea0943b 100644 --- a/packages/server/src/api/rest/index.ts +++ b/packages/server/src/api/rest/index.ts @@ -45,6 +45,12 @@ export type Options = { * Defaults to '_'. */ idDivider?: string; + + /** + * The charset used for URL segment values. Defaults to `a-zA-Z0-9-_~ %`. + * If the idDivider is set to a different value, it should be included in the charset. + */ + urlSegmentNameCharset?: string; }; type RelationshipInfo = { @@ -202,18 +208,21 @@ class RequestHandler extends APIHandlerBase { // all known types and their metadata private typeMap: Record; - public idDivider; + + // divider used to separate compound ID fields + private idDivider; private urlPatterns; constructor(private readonly options: Options) { super(); this.idDivider = options.idDivider ?? '_'; - this.urlPatterns = this.buildUrlPatterns(this.idDivider); + const segmentCharset = options.urlSegmentNameCharset ?? 'a-zA-Z0-9-_~ %'; + this.urlPatterns = this.buildUrlPatterns(this.idDivider, segmentCharset); } - buildUrlPatterns(idDivider: string) { - const options = { segmentValueCharset: `a-zA-Z0-9-_~ %${idDivider}` }; + buildUrlPatterns(idDivider: string, urlSegmentNameCharset: string) { + const options = { segmentValueCharset: urlSegmentNameCharset }; return { // collection operations collection: new UrlPattern('/:type', options), diff --git a/packages/server/tests/api/rest.test.ts b/packages/server/tests/api/rest.test.ts index 6c449676..d37c5d9b 100644 --- a/packages/server/tests/api/rest.test.ts +++ b/packages/server/tests/api/rest.test.ts @@ -2549,7 +2549,12 @@ describe('REST server tests', () => { zodSchemas = params.zodSchemas; modelMeta = params.modelMeta; - const _handler = makeHandler({ endpoint: 'http://localhost/api', pageSize: 5, idDivider }); + const _handler = makeHandler({ + endpoint: 'http://localhost/api', + pageSize: 5, + idDivider, + urlSegmentNameCharset: 'a-zA-Z0-9-_~ %@.', + }); handler = (args) => _handler({ ...args, zodSchemas, modelMeta, url: new URL(`http://localhost/${args.path}`) }); });