@data-client/rest 0.16.3 → 0.16.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/legacy/RestHelpers.js +2 -2
- package/legacy/pathToRegexp.js +2 -0
- package/lib/RestHelpers.d.ts +1 -1
- package/lib/RestHelpers.d.ts.map +1 -1
- package/lib/RestHelpers.js +2 -2
- package/lib/pathToRegexp.d.ts +3 -0
- package/lib/pathToRegexp.d.ts.map +1 -0
- package/lib/pathToRegexp.js +342 -0
- package/package.json +4 -3
- package/src/RestHelpers.ts +1 -2
- package/src/pathToRegexp.ts +2 -0
- package/ts4.0/RestHelpers.d.ts +1 -1
- package/ts4.0/pathToRegexp.d.ts +3 -0
- package/ts4.1/RestHelpers.d.ts +1 -1
- package/ts4.1/pathToRegexp.d.ts +3 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
# @data-client/rest
|
|
2
2
|
|
|
3
|
+
## 0.16.5
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#3866](https://github.com/reactive/data-client/pull/3866) [`16f5d92`](https://github.com/reactive/data-client/commit/16f5d92598de05e92b88af98a9d63eecf27ab819) - Bundle `path-to-regexp` as tree-shaken ESM
|
|
8
|
+
|
|
9
|
+
Bundle only the functions we use (`compile`, `parse`, `pathToRegexp`) from
|
|
10
|
+
`path-to-regexp` into the ESM/browser build via rollup. This eliminates
|
|
11
|
+
the CJS/ESM boundary that broke StackBlitz WebContainers and reduces bundle
|
|
12
|
+
size by tree-shaking unused exports (`match`, `stringify`, and the `ID` regex).
|
|
13
|
+
|
|
14
|
+
## 0.16.4
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- [#3862](https://github.com/reactive/data-client/pull/3862) [`a214720`](https://github.com/reactive/data-client/commit/a214720fd12e1360d00e194b389aa82aff6b91fd) - Fix StackBlitz WebContainers compatibility with path-to-regexp
|
|
19
|
+
|
|
20
|
+
Use namespace import (`import *`) instead of named imports for the CJS
|
|
21
|
+
`path-to-regexp` dependency. Named imports trigger webpack's per-export
|
|
22
|
+
presence validation, which fails in StackBlitz's WebContainers environment.
|
|
23
|
+
Namespace imports defer property access to runtime, bypassing the check
|
|
24
|
+
with no tree-shaking loss.
|
|
25
|
+
|
|
3
26
|
## 0.16.3
|
|
4
27
|
|
|
5
28
|
### Patch Changes
|
package/legacy/RestHelpers.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { compile, parse, pathToRegexp } from '
|
|
1
|
+
import { compile, parse, pathToRegexp } from './pathToRegexp.js';
|
|
2
2
|
const urlBaseCache = Object.create(null);
|
|
3
3
|
export function getUrlBase(path) {
|
|
4
4
|
if (!(path in urlBaseCache)) {
|
|
@@ -52,4 +52,4 @@ export function shortenPath(path) {
|
|
|
52
52
|
if (shortUrlRoot[shortUrlRoot.length - 1] === '/') shortUrlRoot = shortUrlRoot.substring(0, shortUrlRoot.length - 1);
|
|
53
53
|
return shortUrlRoot;
|
|
54
54
|
}
|
|
55
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
55
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21waWxlIiwicGFyc2UiLCJwYXRoVG9SZWdleHAiLCJ1cmxCYXNlQ2FjaGUiLCJPYmplY3QiLCJjcmVhdGUiLCJnZXRVcmxCYXNlIiwicGF0aCIsInVybFRva2Vuc0NhY2hlIiwiZ2V0VXJsVG9rZW5zIiwidG9rZW5NYXAiLCJ0b2tlbnMiLCJwYXRoUmVnZXhDYWNoZSIsImdldFBhdGhSZWdleCIsInJlZ2V4cCIsInRva2VuTmFtZXMiLCJTZXQiLCJ0b2tlbiIsInR5cGUiLCJhZGQiLCJuYW1lIiwicHJvdG8iLCJwcm90b3R5cGUiLCJncG8iLCJnZXRQcm90b3R5cGVPZiIsImlzUG9qbyIsIm9iaiIsInNob3J0ZW5QYXRoIiwibGFzdFRva2VuSW5kZXgiLCJNYXRoIiwibWF4IiwibGFzdEluZGV4T2YiLCJFcnJvciIsInNob3J0VXJsUm9vdCIsInN1YnN0cmluZyIsImxlbmd0aCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9SZXN0SGVscGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjb21waWxlLFxuICBQYXRoRnVuY3Rpb24sXG4gIHBhcnNlLFxuICBwYXRoVG9SZWdleHAsXG4gIFRva2VuLFxuICBQYXJhbURhdGEsXG59IGZyb20gJy4vcGF0aFRvUmVnZXhwLmpzJztcbmltcG9ydCB7IFNob3J0ZW5QYXRoIH0gZnJvbSAnLi9wYXRoVHlwZXMuanMnO1xuXG5jb25zdCB1cmxCYXNlQ2FjaGU6IFJlY29yZDxzdHJpbmcsIFBhdGhGdW5jdGlvbjxvYmplY3Q+PiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5leHBvcnQgZnVuY3Rpb24gZ2V0VXJsQmFzZShwYXRoOiBzdHJpbmcpOiBQYXRoRnVuY3Rpb248UGFyYW1EYXRhPiB7XG4gIGlmICghKHBhdGggaW4gdXJsQmFzZUNhY2hlKSkge1xuICAgIHVybEJhc2VDYWNoZVtwYXRoXSA9IGNvbXBpbGUocGF0aCk7XG4gIH1cbiAgcmV0dXJuIHVybEJhc2VDYWNoZVtwYXRoXTtcbn1cblxuY29uc3QgdXJsVG9rZW5zQ2FjaGU6IFJlY29yZDxzdHJpbmcsIFNldDxzdHJpbmc+PiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5leHBvcnQgZnVuY3Rpb24gZ2V0VXJsVG9rZW5zKHBhdGg6IHN0cmluZyk6IFNldDxzdHJpbmc+IHtcbiAgaWYgKCEocGF0aCBpbiB1cmxUb2tlbnNDYWNoZSkpIHtcbiAgICB1cmxUb2tlbnNDYWNoZVtwYXRoXSA9IHRva2VuTWFwKHBhcnNlKHBhdGgpLnRva2Vucyk7XG4gIH1cbiAgcmV0dXJuIHVybFRva2Vuc0NhY2hlW3BhdGhdO1xufVxuXG5jb25zdCBwYXRoUmVnZXhDYWNoZTogUmVjb3JkPHN0cmluZywgUmVnRXhwPiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5leHBvcnQgZnVuY3Rpb24gZ2V0UGF0aFJlZ2V4KHBhdGg6IHN0cmluZyk6IFJlZ0V4cCB7XG4gIGlmICghKHBhdGggaW4gcGF0aFJlZ2V4Q2FjaGUpKSB7XG4gICAgcGF0aFJlZ2V4Q2FjaGVbcGF0aF0gPSBwYXRoVG9SZWdleHAocGF0aCkucmVnZXhwO1xuICB9XG4gIHJldHVybiBwYXRoUmVnZXhDYWNoZVtwYXRoXTtcbn1cblxuZnVuY3Rpb24gdG9rZW5NYXAodG9rZW5zOiBUb2tlbltdKTogU2V0PHN0cmluZz4ge1xuICBjb25zdCB0b2tlbk5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgICBjYXNlICdwYXJhbSc6XG4gICAgICBjYXNlICd3aWxkY2FyZCc6XG4gICAgICAgIHRva2VuTmFtZXMuYWRkKHRva2VuLm5hbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2dyb3VwJzpcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIHRva2VuTWFwKHRva2VuLnRva2VucykpIHtcbiAgICAgICAgICB0b2tlbk5hbWVzLmFkZChuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRva2VuTmFtZXM7XG59XG5cbmNvbnN0IHByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcbmNvbnN0IGdwbyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUG9qbyhvYmo6IHVua25vd24pOiBvYmogaXMgUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGdwbyhvYmopID09PSBwcm90bztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3J0ZW5QYXRoPFMgZXh0ZW5kcyBzdHJpbmc+KHBhdGg6IFMpOiBTaG9ydGVuUGF0aDxTPiB7XG4gIGNvbnN0IGxhc3RUb2tlbkluZGV4ID0gTWF0aC5tYXgocGF0aC5sYXN0SW5kZXhPZignOicpLCBwYXRoLmxhc3RJbmRleE9mKCcqJykpO1xuICBpZiAobGFzdFRva2VuSW5kZXggPT09IC0xKVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdSZXNvdXJjZSBwYXRoIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSA6cGFyYW1ldGVyIG9yICp3aWxkY2FyZCcsXG4gICAgKTtcbiAgbGV0IHNob3J0VXJsUm9vdDogU2hvcnRlblBhdGg8Uz4gPSBwYXRoLnN1YnN0cmluZygwLCBsYXN0VG9rZW5JbmRleCkgYXMgYW55O1xuICBpZiAoc2hvcnRVcmxSb290W3Nob3J0VXJsUm9vdC5sZW5ndGggLSAxXSA9PT0gJy8nKVxuICAgIHNob3J0VXJsUm9vdCA9IHNob3J0VXJsUm9vdC5zdWJzdHJpbmcoXG4gICAgICAwLFxuICAgICAgc2hvcnRVcmxSb290Lmxlbmd0aCAtIDEsXG4gICAgKSBhcyBTaG9ydGVuUGF0aDxTPjtcbiAgcmV0dXJuIHNob3J0VXJsUm9vdDtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FDRUEsT0FBTyxFQUVQQyxLQUFLLEVBQ0xD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
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { compile, parse, pathToRegexp } from 'path-to-regexp';
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21waWxlIiwicGFyc2UiLCJwYXRoVG9SZWdleHAiXSwic291cmNlcyI6WyIuLi9zcmMvcGF0aFRvUmVnZXhwLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIHsgUGF0aEZ1bmN0aW9uLCBUb2tlbiwgUGFyYW1EYXRhIH0gZnJvbSAncGF0aC10by1yZWdleHAnO1xuZXhwb3J0IHsgY29tcGlsZSwgcGFyc2UsIHBhdGhUb1JlZ2V4cCB9IGZyb20gJ3BhdGgtdG8tcmVnZXhwJztcbiJdLCJtYXBwaW5ncyI6IkFBQ0EsU0FBU0EsT0FBTyxFQUFFQyxLQUFLLEVBQUVDLFlBQVksUUFBUSxnQkFBZ0IiLCJpZ25vcmVMaXN0IjpbXX0=
|
package/lib/RestHelpers.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PathFunction, ParamData } from '
|
|
1
|
+
import { PathFunction, ParamData } from './pathToRegexp.js';
|
|
2
2
|
import { ShortenPath } from './pathTypes.js';
|
|
3
3
|
export declare function getUrlBase(path: string): PathFunction<ParamData>;
|
|
4
4
|
export declare function getUrlTokens(path: string): Set<string>;
|
package/lib/RestHelpers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RestHelpers.d.ts","sourceRoot":"","sources":["../src/RestHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,YAAY,EAIZ,SAAS,EACV,MAAM,
|
|
1
|
+
{"version":3,"file":"RestHelpers.d.ts","sourceRoot":"","sources":["../src/RestHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,YAAY,EAIZ,SAAS,EACV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,CAKhE;AAGD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAKtD;AAGD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKjD;AAuBD,wBAAgB,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAK/D;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAarE"}
|
package/lib/RestHelpers.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { compile, parse, pathToRegexp } from '
|
|
1
|
+
import { compile, parse, pathToRegexp } from './pathToRegexp.js';
|
|
2
2
|
const urlBaseCache = Object.create(null);
|
|
3
3
|
export function getUrlBase(path) {
|
|
4
4
|
if (!(path in urlBaseCache)) {
|
|
@@ -52,4 +52,4 @@ export function shortenPath(path) {
|
|
|
52
52
|
if (shortUrlRoot[shortUrlRoot.length - 1] === '/') shortUrlRoot = shortUrlRoot.substring(0, shortUrlRoot.length - 1);
|
|
53
53
|
return shortUrlRoot;
|
|
54
54
|
}
|
|
55
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
55
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21waWxlIiwicGFyc2UiLCJwYXRoVG9SZWdleHAiLCJ1cmxCYXNlQ2FjaGUiLCJPYmplY3QiLCJjcmVhdGUiLCJnZXRVcmxCYXNlIiwicGF0aCIsInVybFRva2Vuc0NhY2hlIiwiZ2V0VXJsVG9rZW5zIiwidG9rZW5NYXAiLCJ0b2tlbnMiLCJwYXRoUmVnZXhDYWNoZSIsImdldFBhdGhSZWdleCIsInJlZ2V4cCIsInRva2VuTmFtZXMiLCJTZXQiLCJ0b2tlbiIsInR5cGUiLCJhZGQiLCJuYW1lIiwicHJvdG8iLCJwcm90b3R5cGUiLCJncG8iLCJnZXRQcm90b3R5cGVPZiIsImlzUG9qbyIsIm9iaiIsInNob3J0ZW5QYXRoIiwibGFzdFRva2VuSW5kZXgiLCJNYXRoIiwibWF4IiwibGFzdEluZGV4T2YiLCJFcnJvciIsInNob3J0VXJsUm9vdCIsInN1YnN0cmluZyIsImxlbmd0aCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9SZXN0SGVscGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjb21waWxlLFxuICBQYXRoRnVuY3Rpb24sXG4gIHBhcnNlLFxuICBwYXRoVG9SZWdleHAsXG4gIFRva2VuLFxuICBQYXJhbURhdGEsXG59IGZyb20gJy4vcGF0aFRvUmVnZXhwLmpzJztcbmltcG9ydCB7IFNob3J0ZW5QYXRoIH0gZnJvbSAnLi9wYXRoVHlwZXMuanMnO1xuXG5jb25zdCB1cmxCYXNlQ2FjaGU6IFJlY29yZDxzdHJpbmcsIFBhdGhGdW5jdGlvbjxvYmplY3Q+PiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5leHBvcnQgZnVuY3Rpb24gZ2V0VXJsQmFzZShwYXRoOiBzdHJpbmcpOiBQYXRoRnVuY3Rpb248UGFyYW1EYXRhPiB7XG4gIGlmICghKHBhdGggaW4gdXJsQmFzZUNhY2hlKSkge1xuICAgIHVybEJhc2VDYWNoZVtwYXRoXSA9IGNvbXBpbGUocGF0aCk7XG4gIH1cbiAgcmV0dXJuIHVybEJhc2VDYWNoZVtwYXRoXTtcbn1cblxuY29uc3QgdXJsVG9rZW5zQ2FjaGU6IFJlY29yZDxzdHJpbmcsIFNldDxzdHJpbmc+PiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5leHBvcnQgZnVuY3Rpb24gZ2V0VXJsVG9rZW5zKHBhdGg6IHN0cmluZyk6IFNldDxzdHJpbmc+IHtcbiAgaWYgKCEocGF0aCBpbiB1cmxUb2tlbnNDYWNoZSkpIHtcbiAgICB1cmxUb2tlbnNDYWNoZVtwYXRoXSA9IHRva2VuTWFwKHBhcnNlKHBhdGgpLnRva2Vucyk7XG4gIH1cbiAgcmV0dXJuIHVybFRva2Vuc0NhY2hlW3BhdGhdO1xufVxuXG5jb25zdCBwYXRoUmVnZXhDYWNoZTogUmVjb3JkPHN0cmluZywgUmVnRXhwPiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5leHBvcnQgZnVuY3Rpb24gZ2V0UGF0aFJlZ2V4KHBhdGg6IHN0cmluZyk6IFJlZ0V4cCB7XG4gIGlmICghKHBhdGggaW4gcGF0aFJlZ2V4Q2FjaGUpKSB7XG4gICAgcGF0aFJlZ2V4Q2FjaGVbcGF0aF0gPSBwYXRoVG9SZWdleHAocGF0aCkucmVnZXhwO1xuICB9XG4gIHJldHVybiBwYXRoUmVnZXhDYWNoZVtwYXRoXTtcbn1cblxuZnVuY3Rpb24gdG9rZW5NYXAodG9rZW5zOiBUb2tlbltdKTogU2V0PHN0cmluZz4ge1xuICBjb25zdCB0b2tlbk5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgICBjYXNlICdwYXJhbSc6XG4gICAgICBjYXNlICd3aWxkY2FyZCc6XG4gICAgICAgIHRva2VuTmFtZXMuYWRkKHRva2VuLm5hbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2dyb3VwJzpcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIHRva2VuTWFwKHRva2VuLnRva2VucykpIHtcbiAgICAgICAgICB0b2tlbk5hbWVzLmFkZChuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRva2VuTmFtZXM7XG59XG5cbmNvbnN0IHByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcbmNvbnN0IGdwbyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUG9qbyhvYmo6IHVua25vd24pOiBvYmogaXMgUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGdwbyhvYmopID09PSBwcm90bztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3J0ZW5QYXRoPFMgZXh0ZW5kcyBzdHJpbmc+KHBhdGg6IFMpOiBTaG9ydGVuUGF0aDxTPiB7XG4gIGNvbnN0IGxhc3RUb2tlbkluZGV4ID0gTWF0aC5tYXgocGF0aC5sYXN0SW5kZXhPZignOicpLCBwYXRoLmxhc3RJbmRleE9mKCcqJykpO1xuICBpZiAobGFzdFRva2VuSW5kZXggPT09IC0xKVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdSZXNvdXJjZSBwYXRoIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSA6cGFyYW1ldGVyIG9yICp3aWxkY2FyZCcsXG4gICAgKTtcbiAgbGV0IHNob3J0VXJsUm9vdDogU2hvcnRlblBhdGg8Uz4gPSBwYXRoLnN1YnN0cmluZygwLCBsYXN0VG9rZW5JbmRleCkgYXMgYW55O1xuICBpZiAoc2hvcnRVcmxSb290W3Nob3J0VXJsUm9vdC5sZW5ndGggLSAxXSA9PT0gJy8nKVxuICAgIHNob3J0VXJsUm9vdCA9IHNob3J0VXJsUm9vdC5zdWJzdHJpbmcoXG4gICAgICAwLFxuICAgICAgc2hvcnRVcmxSb290Lmxlbmd0aCAtIDEsXG4gICAgKSBhcyBTaG9ydGVuUGF0aDxTPjtcbiAgcmV0dXJuIHNob3J0VXJsUm9vdDtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FDRUEsT0FBTyxFQUVQQyxLQUFLLEVBQ0xD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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pathToRegexp.d.ts","sourceRoot":"","sources":["../src/pathToRegexp.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
const DEFAULT_DELIMITER = "/";
|
|
2
|
+
const NOOP_VALUE = (value) => value;
|
|
3
|
+
const ID_START = /^[$_\p{ID_Start}]$/u;
|
|
4
|
+
const ID_CONTINUE = /^[$\u200c\u200d\p{ID_Continue}]$/u;
|
|
5
|
+
/**
|
|
6
|
+
* Escape a regular expression string.
|
|
7
|
+
*/
|
|
8
|
+
function escape(str) {
|
|
9
|
+
return str.replace(/[.+*?^${}()[\]|/\\]/g, "\\$&");
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Tokenized path instance.
|
|
13
|
+
*/
|
|
14
|
+
class TokenData {
|
|
15
|
+
constructor(tokens, originalPath) {
|
|
16
|
+
this.tokens = tokens;
|
|
17
|
+
this.originalPath = originalPath;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* ParseError is thrown when there is an error processing the path.
|
|
22
|
+
*/
|
|
23
|
+
class PathError extends TypeError {
|
|
24
|
+
constructor(message, originalPath) {
|
|
25
|
+
let text = message;
|
|
26
|
+
if (originalPath)
|
|
27
|
+
text += `: ${originalPath}`;
|
|
28
|
+
text += `; visit https://git.new/pathToRegexpError for info`;
|
|
29
|
+
super(text);
|
|
30
|
+
this.originalPath = originalPath;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Parse a string for the raw tokens.
|
|
35
|
+
*/
|
|
36
|
+
function parse(str, options = {}) {
|
|
37
|
+
const { encodePath = NOOP_VALUE } = options;
|
|
38
|
+
const chars = [...str];
|
|
39
|
+
let index = 0;
|
|
40
|
+
function consumeUntil(end) {
|
|
41
|
+
const output = [];
|
|
42
|
+
let path = "";
|
|
43
|
+
function writePath() {
|
|
44
|
+
if (!path)
|
|
45
|
+
return;
|
|
46
|
+
output.push({
|
|
47
|
+
type: "text",
|
|
48
|
+
value: encodePath(path),
|
|
49
|
+
});
|
|
50
|
+
path = "";
|
|
51
|
+
}
|
|
52
|
+
while (index < chars.length) {
|
|
53
|
+
const value = chars[index++];
|
|
54
|
+
if (value === end) {
|
|
55
|
+
writePath();
|
|
56
|
+
return output;
|
|
57
|
+
}
|
|
58
|
+
if (value === "\\") {
|
|
59
|
+
if (index === chars.length) {
|
|
60
|
+
throw new PathError(`Unexpected end after \\ at index ${index}`, str);
|
|
61
|
+
}
|
|
62
|
+
path += chars[index++];
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (value === ":" || value === "*") {
|
|
66
|
+
const type = value === ":" ? "param" : "wildcard";
|
|
67
|
+
let name = "";
|
|
68
|
+
if (ID_START.test(chars[index])) {
|
|
69
|
+
do {
|
|
70
|
+
name += chars[index++];
|
|
71
|
+
} while (ID_CONTINUE.test(chars[index]));
|
|
72
|
+
}
|
|
73
|
+
else if (chars[index] === '"') {
|
|
74
|
+
let quoteStart = index;
|
|
75
|
+
while (index < chars.length) {
|
|
76
|
+
if (chars[++index] === '"') {
|
|
77
|
+
index++;
|
|
78
|
+
quoteStart = 0;
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
// Increment over escape characters.
|
|
82
|
+
if (chars[index] === "\\")
|
|
83
|
+
index++;
|
|
84
|
+
name += chars[index];
|
|
85
|
+
}
|
|
86
|
+
if (quoteStart) {
|
|
87
|
+
throw new PathError(`Unterminated quote at index ${quoteStart}`, str);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (!name) {
|
|
91
|
+
throw new PathError(`Missing parameter name at index ${index}`, str);
|
|
92
|
+
}
|
|
93
|
+
writePath();
|
|
94
|
+
output.push({ type, name });
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (value === "{") {
|
|
98
|
+
writePath();
|
|
99
|
+
output.push({
|
|
100
|
+
type: "group",
|
|
101
|
+
tokens: consumeUntil("}"),
|
|
102
|
+
});
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (value === "}" ||
|
|
106
|
+
value === "(" ||
|
|
107
|
+
value === ")" ||
|
|
108
|
+
value === "[" ||
|
|
109
|
+
value === "]" ||
|
|
110
|
+
value === "+" ||
|
|
111
|
+
value === "?" ||
|
|
112
|
+
value === "!") {
|
|
113
|
+
throw new PathError(`Unexpected ${value} at index ${index - 1}`, str);
|
|
114
|
+
}
|
|
115
|
+
path += value;
|
|
116
|
+
}
|
|
117
|
+
if (end) {
|
|
118
|
+
throw new PathError(`Unexpected end at index ${index}, expected ${end}`, str);
|
|
119
|
+
}
|
|
120
|
+
writePath();
|
|
121
|
+
return output;
|
|
122
|
+
}
|
|
123
|
+
return new TokenData(consumeUntil(""), str);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Compile a string to a template function for the path.
|
|
127
|
+
*/
|
|
128
|
+
function compile(path, options = {}) {
|
|
129
|
+
const { encode = encodeURIComponent, delimiter = DEFAULT_DELIMITER } = options;
|
|
130
|
+
const data = typeof path === "object" ? path : parse(path, options);
|
|
131
|
+
const fn = tokensToFunction(data.tokens, delimiter, encode);
|
|
132
|
+
return function path(params = {}) {
|
|
133
|
+
const missing = [];
|
|
134
|
+
const path = fn(params, missing);
|
|
135
|
+
if (missing.length) {
|
|
136
|
+
throw new TypeError(`Missing parameters: ${missing.join(", ")}`);
|
|
137
|
+
}
|
|
138
|
+
return path;
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
function tokensToFunction(tokens, delimiter, encode) {
|
|
142
|
+
const encoders = tokens.map((token) => tokenToFunction(token, delimiter, encode));
|
|
143
|
+
return (data, missing) => {
|
|
144
|
+
let result = "";
|
|
145
|
+
for (const encoder of encoders) {
|
|
146
|
+
result += encoder(data, missing);
|
|
147
|
+
}
|
|
148
|
+
return result;
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Convert a single token into a path building function.
|
|
153
|
+
*/
|
|
154
|
+
function tokenToFunction(token, delimiter, encode) {
|
|
155
|
+
if (token.type === "text")
|
|
156
|
+
return () => token.value;
|
|
157
|
+
if (token.type === "group") {
|
|
158
|
+
const fn = tokensToFunction(token.tokens, delimiter, encode);
|
|
159
|
+
return (data, missing) => {
|
|
160
|
+
const len = missing.length;
|
|
161
|
+
const value = fn(data, missing);
|
|
162
|
+
if (missing.length === len)
|
|
163
|
+
return value;
|
|
164
|
+
missing.length = len; // Reset optional group.
|
|
165
|
+
return "";
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
const encodeValue = encode || NOOP_VALUE;
|
|
169
|
+
if (token.type === "wildcard" && encode !== false) {
|
|
170
|
+
return (data, missing) => {
|
|
171
|
+
const value = data[token.name];
|
|
172
|
+
if (value == null) {
|
|
173
|
+
missing.push(token.name);
|
|
174
|
+
return "";
|
|
175
|
+
}
|
|
176
|
+
if (!Array.isArray(value) || value.length === 0) {
|
|
177
|
+
throw new TypeError(`Expected "${token.name}" to be a non-empty array`);
|
|
178
|
+
}
|
|
179
|
+
let result = "";
|
|
180
|
+
for (let i = 0; i < value.length; i++) {
|
|
181
|
+
if (typeof value[i] !== "string") {
|
|
182
|
+
throw new TypeError(`Expected "${token.name}/${i}" to be a string`);
|
|
183
|
+
}
|
|
184
|
+
if (i > 0)
|
|
185
|
+
result += delimiter;
|
|
186
|
+
result += encodeValue(value[i]);
|
|
187
|
+
}
|
|
188
|
+
return result;
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
return (data, missing) => {
|
|
192
|
+
const value = data[token.name];
|
|
193
|
+
if (value == null) {
|
|
194
|
+
missing.push(token.name);
|
|
195
|
+
return "";
|
|
196
|
+
}
|
|
197
|
+
if (typeof value !== "string") {
|
|
198
|
+
throw new TypeError(`Expected "${token.name}" to be a string`);
|
|
199
|
+
}
|
|
200
|
+
return encodeValue(value);
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Transform a path into a regular expression and capture keys.
|
|
205
|
+
*/
|
|
206
|
+
function pathToRegexp(path, options = {}) {
|
|
207
|
+
const { delimiter = DEFAULT_DELIMITER, end = true, sensitive = false, trailing = true, } = options;
|
|
208
|
+
const keys = [];
|
|
209
|
+
let source = "";
|
|
210
|
+
let combinations = 0;
|
|
211
|
+
function process(path) {
|
|
212
|
+
if (Array.isArray(path)) {
|
|
213
|
+
for (const p of path)
|
|
214
|
+
process(p);
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
const data = typeof path === "object" ? path : parse(path, options);
|
|
218
|
+
flatten(data.tokens, 0, [], (tokens) => {
|
|
219
|
+
if (combinations >= 256) {
|
|
220
|
+
throw new PathError("Too many path combinations", data.originalPath);
|
|
221
|
+
}
|
|
222
|
+
if (combinations > 0)
|
|
223
|
+
source += "|";
|
|
224
|
+
source += toRegExpSource(tokens, delimiter, keys, data.originalPath);
|
|
225
|
+
combinations++;
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
process(path);
|
|
229
|
+
let pattern = `^(?:${source})`;
|
|
230
|
+
if (trailing)
|
|
231
|
+
pattern += "(?:" + escape(delimiter) + "$)?";
|
|
232
|
+
pattern += end ? "$" : "(?=" + escape(delimiter) + "|$)";
|
|
233
|
+
return { regexp: new RegExp(pattern, sensitive ? "" : "i"), keys };
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Generate a flat list of sequence tokens from the given tokens.
|
|
237
|
+
*/
|
|
238
|
+
function flatten(tokens, index, result, callback) {
|
|
239
|
+
while (index < tokens.length) {
|
|
240
|
+
const token = tokens[index++];
|
|
241
|
+
if (token.type === "group") {
|
|
242
|
+
const len = result.length;
|
|
243
|
+
flatten(token.tokens, 0, result, (seq) => flatten(tokens, index, seq, callback));
|
|
244
|
+
result.length = len;
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
result.push(token);
|
|
248
|
+
}
|
|
249
|
+
callback(result);
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Transform a flat sequence of tokens into a regular expression.
|
|
253
|
+
*/
|
|
254
|
+
function toRegExpSource(tokens, delimiter, keys, originalPath) {
|
|
255
|
+
let result = "";
|
|
256
|
+
let backtrack = "";
|
|
257
|
+
let wildcardBacktrack = "";
|
|
258
|
+
let prevCaptureType = 0;
|
|
259
|
+
let hasSegmentCapture = 0;
|
|
260
|
+
let index = 0;
|
|
261
|
+
function hasInSegment(index, type) {
|
|
262
|
+
while (index < tokens.length) {
|
|
263
|
+
const token = tokens[index++];
|
|
264
|
+
if (token.type === type)
|
|
265
|
+
return true;
|
|
266
|
+
if (token.type === "text") {
|
|
267
|
+
if (token.value.includes(delimiter))
|
|
268
|
+
break;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
function peekText(index) {
|
|
274
|
+
let result = "";
|
|
275
|
+
while (index < tokens.length) {
|
|
276
|
+
const token = tokens[index++];
|
|
277
|
+
if (token.type !== "text")
|
|
278
|
+
break;
|
|
279
|
+
result += token.value;
|
|
280
|
+
}
|
|
281
|
+
return result;
|
|
282
|
+
}
|
|
283
|
+
while (index < tokens.length) {
|
|
284
|
+
const token = tokens[index++];
|
|
285
|
+
if (token.type === "text") {
|
|
286
|
+
result += escape(token.value);
|
|
287
|
+
backtrack += token.value;
|
|
288
|
+
if (prevCaptureType === 2)
|
|
289
|
+
wildcardBacktrack += token.value;
|
|
290
|
+
if (token.value.includes(delimiter))
|
|
291
|
+
hasSegmentCapture = 0;
|
|
292
|
+
continue;
|
|
293
|
+
}
|
|
294
|
+
if (token.type === "param" || token.type === "wildcard") {
|
|
295
|
+
if (prevCaptureType && !backtrack) {
|
|
296
|
+
throw new PathError(`Missing text before "${token.name}" ${token.type}`, originalPath);
|
|
297
|
+
}
|
|
298
|
+
if (token.type === "param") {
|
|
299
|
+
result +=
|
|
300
|
+
hasSegmentCapture & 2 // Seen wildcard in segment.
|
|
301
|
+
? `(${negate(delimiter, backtrack)}+)`
|
|
302
|
+
: hasInSegment(index, "wildcard") // See wildcard later in segment.
|
|
303
|
+
? `(${negate(delimiter, peekText(index))}+)`
|
|
304
|
+
: hasSegmentCapture & 1 // Seen parameter in segment.
|
|
305
|
+
? `(${negate(delimiter, backtrack)}+|${escape(backtrack)})`
|
|
306
|
+
: `(${negate(delimiter, "")}+)`;
|
|
307
|
+
hasSegmentCapture |= prevCaptureType = 1;
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
result +=
|
|
311
|
+
hasSegmentCapture & 2 // Seen wildcard in segment.
|
|
312
|
+
? `(${negate(backtrack, "")}+)`
|
|
313
|
+
: wildcardBacktrack // No capture in segment, seen wildcard in path.
|
|
314
|
+
? `(${negate(wildcardBacktrack, "")}+|${negate(delimiter, "")}+)`
|
|
315
|
+
: `([^]+)`;
|
|
316
|
+
wildcardBacktrack = "";
|
|
317
|
+
hasSegmentCapture |= prevCaptureType = 2;
|
|
318
|
+
}
|
|
319
|
+
keys.push(token);
|
|
320
|
+
backtrack = "";
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
throw new TypeError(`Unknown token type: ${token.type}`);
|
|
324
|
+
}
|
|
325
|
+
return result;
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Block backtracking on previous text/delimiter.
|
|
329
|
+
*/
|
|
330
|
+
function negate(a, b) {
|
|
331
|
+
if (b.length > a.length)
|
|
332
|
+
return negate(b, a); // Longest string first.
|
|
333
|
+
if (a === b)
|
|
334
|
+
b = ""; // Cleaner regex strings, no duplication.
|
|
335
|
+
if (b.length > 1)
|
|
336
|
+
return `(?:(?!${escape(a)}|${escape(b)})[^])`;
|
|
337
|
+
if (a.length > 1)
|
|
338
|
+
return `(?:(?!${escape(a)})[^${escape(b)}])`;
|
|
339
|
+
return `[^${escape(a + b)}]`;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
export { compile, parse, pathToRegexp };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@data-client/rest",
|
|
3
|
-
"version": "0.16.
|
|
3
|
+
"version": "0.16.5",
|
|
4
4
|
"description": "Quickly define typed REST resources and endpoints",
|
|
5
5
|
"homepage": "https://dataclient.io/rest",
|
|
6
6
|
"repository": {
|
|
@@ -84,6 +84,7 @@
|
|
|
84
84
|
},
|
|
85
85
|
"exports": {
|
|
86
86
|
".": {
|
|
87
|
+
"types": "./lib/index.d.ts",
|
|
87
88
|
"module": "./lib/index.js",
|
|
88
89
|
"import": "./node.mjs",
|
|
89
90
|
"require": "./dist/index.js",
|
|
@@ -116,7 +117,7 @@
|
|
|
116
117
|
"README.md"
|
|
117
118
|
],
|
|
118
119
|
"scripts": {
|
|
119
|
-
"build:lib": "NODE_ENV=production BROWSERSLIST_ENV='2020' POLYFILL_TARGETS='chrome>88,safari>14' yarn g:babel --out-dir lib",
|
|
120
|
+
"build:lib": "NODE_ENV=production BROWSERSLIST_ENV='2020' POLYFILL_TARGETS='chrome>88,safari>14' yarn g:babel --out-dir lib && NODE_ENV=production BROWSERSLIST_ENV='2020' yarn g:rollup",
|
|
120
121
|
"build:legacy:lib": "NODE_ENV=production BROWSERSLIST_ENV='2018' POLYFILL_TARGETS='chrome>80,safari>13,firefox>72' yarn g:babel --out-dir legacy",
|
|
121
122
|
"build:js:node": "BROWSERSLIST_ENV=node12 yarn g:rollup",
|
|
122
123
|
"build:js:browser": "BROWSERSLIST_ENV=legacy yarn g:rollup",
|
|
@@ -124,7 +125,7 @@
|
|
|
124
125
|
"build:clean": "yarn g:clean ts4.0 ts4.1 index.d.ts next.d.ts",
|
|
125
126
|
"build:legacy-types": "yarn g:downtypes lib ts4.0 --to=4.0 && yarn g:downtypes lib ts4.1 --to=4.1 && yarn g:copy --up 1 ./src-4.1-types/**/*.d.ts ./ts4.0/ && yarn g:copy --up 1 ./src-4.1-types/**/*.d.ts ./ts4.1 && yarn g:copy --up 1 ./src-4.0-types/**/*.d.ts ./ts4.0",
|
|
126
127
|
"build": "run build:lib && run build:legacy:lib && run build:bundle",
|
|
127
|
-
"dev": "
|
|
128
|
+
"dev": "NODE_ENV=production BROWSERSLIST_ENV='2020' POLYFILL_TARGETS='chrome>88,safari>14' yarn g:babel --out-dir lib -w",
|
|
128
129
|
"prepare": "run build:lib",
|
|
129
130
|
"prepack": "run prepare && run build:bundle && run build:legacy:lib",
|
|
130
131
|
"tsc:ci": "yarn g:tsc --project tsconfig.test.json",
|
package/src/RestHelpers.ts
CHANGED
package/ts4.0/RestHelpers.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PathFunction, ParamData } from '
|
|
1
|
+
import { PathFunction, ParamData } from './pathToRegexp.js';
|
|
2
2
|
import { ShortenPath } from './pathTypes.js';
|
|
3
3
|
export declare function getUrlBase(path: string): PathFunction<ParamData>;
|
|
4
4
|
export declare function getUrlTokens(path: string): Set<string>;
|
package/ts4.1/RestHelpers.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PathFunction, ParamData } from '
|
|
1
|
+
import { PathFunction, ParamData } from './pathToRegexp.js';
|
|
2
2
|
import { ShortenPath } from './pathTypes.js';
|
|
3
3
|
export declare function getUrlBase(path: string): PathFunction<ParamData>;
|
|
4
4
|
export declare function getUrlTokens(path: string): Set<string>;
|