@plumile/router 0.1.11 → 0.1.13

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.
Files changed (127) hide show
  1. package/README.md +755 -1
  2. package/lib/esm/builder.d.ts.map +1 -1
  3. package/lib/esm/builder.js +10 -3
  4. package/lib/esm/eslint-rules/index.d.ts +2 -0
  5. package/lib/esm/eslint-rules/index.d.ts.map +1 -0
  6. package/lib/esm/eslint-rules/index.js +2 -0
  7. package/lib/esm/eslint-rules/no-direct-window-location-search.d.ts +4 -0
  8. package/lib/esm/eslint-rules/no-direct-window-location-search.d.ts.map +1 -0
  9. package/lib/esm/eslint-rules/no-direct-window-location-search.js +48 -0
  10. package/lib/esm/history/BrowserHistory.d.ts.map +1 -1
  11. package/lib/esm/history/BrowserHistory.js +4 -2
  12. package/lib/esm/index.d.ts +5 -0
  13. package/lib/esm/index.d.ts.map +1 -1
  14. package/lib/esm/index.js +6 -1
  15. package/lib/esm/routing/Link.d.ts +1 -0
  16. package/lib/esm/routing/Link.d.ts.map +1 -1
  17. package/lib/esm/routing/Link.js +35 -4
  18. package/lib/esm/routing/RouteComponentWrapper.d.ts.map +1 -1
  19. package/lib/esm/routing/RouteComponentWrapper.js +7 -2
  20. package/lib/esm/routing/createRouter.d.ts +8 -1
  21. package/lib/esm/routing/createRouter.d.ts.map +1 -1
  22. package/lib/esm/routing/createRouter.js +540 -17
  23. package/lib/esm/routing/devtools.d.ts +20 -0
  24. package/lib/esm/routing/devtools.d.ts.map +1 -0
  25. package/lib/esm/routing/devtools.js +678 -0
  26. package/lib/esm/routing/filters.d.ts +97 -0
  27. package/lib/esm/routing/filters.d.ts.map +1 -0
  28. package/lib/esm/routing/filters.js +557 -0
  29. package/lib/esm/routing/index.d.ts +10 -0
  30. package/lib/esm/routing/index.d.ts.map +1 -1
  31. package/lib/esm/routing/index.js +11 -1
  32. package/lib/esm/routing/useActiveFilters.d.ts +9 -0
  33. package/lib/esm/routing/useActiveFilters.d.ts.map +1 -0
  34. package/lib/esm/routing/useActiveFilters.js +38 -0
  35. package/lib/esm/routing/useFilterState.d.ts +10 -0
  36. package/lib/esm/routing/useFilterState.d.ts.map +1 -0
  37. package/lib/esm/routing/useFilterState.js +14 -0
  38. package/lib/esm/routing/useNavigate.d.ts +13 -0
  39. package/lib/esm/routing/useNavigate.d.ts.map +1 -0
  40. package/lib/esm/routing/useNavigate.js +11 -0
  41. package/lib/esm/routing/useNavigateWithQuery.d.ts +15 -0
  42. package/lib/esm/routing/useNavigateWithQuery.d.ts.map +1 -0
  43. package/lib/esm/routing/useNavigateWithQuery.js +95 -0
  44. package/lib/esm/routing/useQuery.d.ts +2 -0
  45. package/lib/esm/routing/useQuery.d.ts.map +1 -0
  46. package/lib/esm/routing/useQuery.js +9 -0
  47. package/lib/esm/routing/useQueryObject.d.ts +18 -0
  48. package/lib/esm/routing/useQueryObject.d.ts.map +1 -0
  49. package/lib/esm/routing/useQueryObject.js +107 -0
  50. package/lib/esm/routing/useQueryState.d.ts +13 -0
  51. package/lib/esm/routing/useQueryState.d.ts.map +1 -0
  52. package/lib/esm/routing/useQueryState.js +80 -0
  53. package/lib/esm/routing/useStableRefEquality.d.ts +5 -0
  54. package/lib/esm/routing/useStableRefEquality.d.ts.map +1 -0
  55. package/lib/esm/routing/useStableRefEquality.js +47 -0
  56. package/lib/esm/routing/useTypedQuery.d.ts +2 -0
  57. package/lib/esm/routing/useTypedQuery.d.ts.map +1 -0
  58. package/lib/esm/routing/useTypedQuery.js +36 -0
  59. package/lib/esm/tools/buildSearch.d.ts +12 -0
  60. package/lib/esm/tools/buildSearch.d.ts.map +1 -0
  61. package/lib/esm/tools/buildSearch.js +264 -0
  62. package/lib/esm/tools/query-dsl.d.ts +28 -0
  63. package/lib/esm/tools/query-dsl.d.ts.map +1 -0
  64. package/lib/esm/tools/query-dsl.js +250 -0
  65. package/lib/esm/tools/query.d.ts +2 -0
  66. package/lib/esm/tools/query.d.ts.map +1 -0
  67. package/lib/esm/tools/query.js +43 -0
  68. package/lib/esm/tools.d.ts +2 -2
  69. package/lib/esm/tools.d.ts.map +1 -1
  70. package/lib/esm/tools.js +3 -2
  71. package/lib/esm/type-tests/query-infer.test-d.d.ts +2 -0
  72. package/lib/esm/type-tests/query-infer.test-d.d.ts.map +1 -0
  73. package/lib/esm/type-tests/query-infer.test-d.js +49 -0
  74. package/lib/esm/types.d.ts +47 -4
  75. package/lib/esm/types.d.ts.map +1 -1
  76. package/lib/esm/types.js +1 -1
  77. package/lib/tsconfig.esm.tsbuildinfo +1 -1
  78. package/lib/types/builder.d.ts.map +1 -1
  79. package/lib/types/eslint-rules/index.d.ts +2 -0
  80. package/lib/types/eslint-rules/index.d.ts.map +1 -0
  81. package/lib/types/eslint-rules/no-direct-window-location-search.d.ts +4 -0
  82. package/lib/types/eslint-rules/no-direct-window-location-search.d.ts.map +1 -0
  83. package/lib/types/history/BrowserHistory.d.ts.map +1 -1
  84. package/lib/types/index.d.ts +5 -0
  85. package/lib/types/index.d.ts.map +1 -1
  86. package/lib/types/routing/Link.d.ts +1 -0
  87. package/lib/types/routing/Link.d.ts.map +1 -1
  88. package/lib/types/routing/RouteComponentWrapper.d.ts.map +1 -1
  89. package/lib/types/routing/createRouter.d.ts +8 -1
  90. package/lib/types/routing/createRouter.d.ts.map +1 -1
  91. package/lib/types/routing/devtools.d.ts +20 -0
  92. package/lib/types/routing/devtools.d.ts.map +1 -0
  93. package/lib/types/routing/filters.d.ts +97 -0
  94. package/lib/types/routing/filters.d.ts.map +1 -0
  95. package/lib/types/routing/index.d.ts +10 -0
  96. package/lib/types/routing/index.d.ts.map +1 -1
  97. package/lib/types/routing/useActiveFilters.d.ts +9 -0
  98. package/lib/types/routing/useActiveFilters.d.ts.map +1 -0
  99. package/lib/types/routing/useFilterState.d.ts +10 -0
  100. package/lib/types/routing/useFilterState.d.ts.map +1 -0
  101. package/lib/types/routing/useNavigate.d.ts +13 -0
  102. package/lib/types/routing/useNavigate.d.ts.map +1 -0
  103. package/lib/types/routing/useNavigateWithQuery.d.ts +15 -0
  104. package/lib/types/routing/useNavigateWithQuery.d.ts.map +1 -0
  105. package/lib/types/routing/useQuery.d.ts +2 -0
  106. package/lib/types/routing/useQuery.d.ts.map +1 -0
  107. package/lib/types/routing/useQueryObject.d.ts +18 -0
  108. package/lib/types/routing/useQueryObject.d.ts.map +1 -0
  109. package/lib/types/routing/useQueryState.d.ts +13 -0
  110. package/lib/types/routing/useQueryState.d.ts.map +1 -0
  111. package/lib/types/routing/useStableRefEquality.d.ts +5 -0
  112. package/lib/types/routing/useStableRefEquality.d.ts.map +1 -0
  113. package/lib/types/routing/useTypedQuery.d.ts +2 -0
  114. package/lib/types/routing/useTypedQuery.d.ts.map +1 -0
  115. package/lib/types/tools/buildSearch.d.ts +12 -0
  116. package/lib/types/tools/buildSearch.d.ts.map +1 -0
  117. package/lib/types/tools/query-dsl.d.ts +28 -0
  118. package/lib/types/tools/query-dsl.d.ts.map +1 -0
  119. package/lib/types/tools/query.d.ts +2 -0
  120. package/lib/types/tools/query.d.ts.map +1 -0
  121. package/lib/types/tools.d.ts +2 -2
  122. package/lib/types/tools.d.ts.map +1 -1
  123. package/lib/types/type-tests/query-infer.test-d.d.ts +2 -0
  124. package/lib/types/type-tests/query-infer.test-d.d.ts.map +1 -0
  125. package/lib/types/types.d.ts +47 -4
  126. package/lib/types/types.d.ts.map +1 -1
  127. package/package.json +7 -7
@@ -0,0 +1,47 @@
1
+ import { useRef } from 'react';
2
+ export function shallowEqual(a, b) {
3
+ if (Object.is(a, b))
4
+ return true;
5
+ if (typeof a !== 'object' ||
6
+ a === null ||
7
+ typeof b !== 'object' ||
8
+ b === null) {
9
+ return false;
10
+ }
11
+ if (Array.isArray(a) && Array.isArray(b)) {
12
+ if (a.length !== b.length)
13
+ return false;
14
+ for (let i = 0; i < a.length; i += 1) {
15
+ if (!Object.is(a[i], b[i]))
16
+ return false;
17
+ }
18
+ return true;
19
+ }
20
+ if (Array.isArray(a) || Array.isArray(b))
21
+ return false;
22
+ const aKeys = Object.keys(a);
23
+ const bKeys = Object.keys(b);
24
+ if (aKeys.length !== bKeys.length)
25
+ return false;
26
+ for (const k of aKeys) {
27
+ if (!Object.prototype.hasOwnProperty.call(b, k))
28
+ return false;
29
+ const av = a[k];
30
+ const bv = b[k];
31
+ if (!Object.is(av, bv))
32
+ return false;
33
+ }
34
+ return true;
35
+ }
36
+ export function useStableRefEquality(value, isEqual = shallowEqual) {
37
+ const ref = useRef(undefined);
38
+ if (ref.current === undefined) {
39
+ ref.current = { v: value };
40
+ }
41
+ else if (!isEqual(ref.current.v, value)) {
42
+ ref.current = { v: value };
43
+ }
44
+ return ref.current.v;
45
+ }
46
+ export default useStableRefEquality;
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlU3RhYmxlUmVmRXF1YWxpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGluZy91c2VTdGFibGVSZWZFcXVhbGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBSy9CLE1BQU0sVUFBVSxZQUFZLENBQUMsQ0FBVSxFQUFFLENBQVU7SUFDakQsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNqQyxJQUNFLE9BQU8sQ0FBQyxLQUFLLFFBQVE7UUFDckIsQ0FBQyxLQUFLLElBQUk7UUFDVixPQUFPLENBQUMsS0FBSyxRQUFRO1FBQ3JCLENBQUMsS0FBSyxJQUFJLEVBQ1YsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDeEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQUUsT0FBTyxLQUFLLENBQUM7UUFDM0MsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3ZELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBNEIsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBNEIsQ0FBQyxDQUFDO0lBQ3hELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ2hELEtBQUssTUFBTSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDOUQsTUFBTSxFQUFFLEdBQUksQ0FBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxNQUFNLEVBQUUsR0FBSSxDQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztJQUN2QyxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBUUQsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxLQUFRLEVBQ1IsVUFBeUIsWUFBNkI7SUFFdEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUF1QixTQUFTLENBQUMsQ0FBQztJQUNwRCxJQUFJLEdBQUcsQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDOUIsR0FBRyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUM3QixDQUFDO1NBQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDdkIsQ0FBQztBQUVELGVBQWUsb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5cbmV4cG9ydCB0eXBlIEVxdWFsaXR5Rm48VD4gPSAoYTogVCwgYjogVCkgPT4gYm9vbGVhbjtcblxuLyoqIERlZmF1bHQgc2hhbGxvdyBlcXVhbGl0eSBmb3IgcGxhaW4gb2JqZWN0cyAvIGFycmF5czsgcHJpbWl0aXZlcyB2aWEgPT09ICovXG5leHBvcnQgZnVuY3Rpb24gc2hhbGxvd0VxdWFsKGE6IHVua25vd24sIGI6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKE9iamVjdC5pcyhhLCBiKSkgcmV0dXJuIHRydWU7XG4gIGlmIChcbiAgICB0eXBlb2YgYSAhPT0gJ29iamVjdCcgfHxcbiAgICBhID09PSBudWxsIHx8XG4gICAgdHlwZW9mIGIgIT09ICdvYmplY3QnIHx8XG4gICAgYiA9PT0gbnVsbFxuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkgJiYgQXJyYXkuaXNBcnJheShiKSkge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGlmICghT2JqZWN0LmlzKGFbaV0sIGJbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGEpIHx8IEFycmF5LmlzQXJyYXkoYikpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgYUtleXMgPSBPYmplY3Qua2V5cyhhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgY29uc3QgYktleXMgPSBPYmplY3Qua2V5cyhiIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgaWYgKGFLZXlzLmxlbmd0aCAhPT0gYktleXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gIGZvciAoY29uc3QgayBvZiBhS2V5cykge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIGspKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgYXYgPSAoYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba107XG4gICAgY29uc3QgYnYgPSAoYiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba107XG4gICAgaWYgKCFPYmplY3QuaXMoYXYsIGJ2KSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIHVzZVN0YWJsZVJlZkVxdWFsaXR5XG4gKiBSZXR1cm5zIGEgc3RhYmxlIHJlZmVyZW5jZSB0aGF0IG9ubHkgdXBkYXRlcyB3aGVuIGVxdWFsaXR5IGNoZWNrIGZhaWxzLlxuICogLSBDaGVhcCBzaGFsbG93IGNvbXBhcmUgYnkgZGVmYXVsdCB0byBhdm9pZCBkZWVwIHRyYXZlcnNhbCBjb3N0LlxuICogLSBQcm92aWRlIGEgY3VzdG9tIGVxdWFsaXR5IGZ1bmN0aW9uIGZvciBkb21haW4gc3BlY2lmaWMgc2VtYW50aWNzIChlLmcuIGRlZXAgY29tcGFyZSwgc3Vic2V0IGtleXMpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VTdGFibGVSZWZFcXVhbGl0eTxUPihcbiAgdmFsdWU6IFQsXG4gIGlzRXF1YWw6IEVxdWFsaXR5Rm48VD4gPSBzaGFsbG93RXF1YWwgYXMgRXF1YWxpdHlGbjxUPixcbik6IFQge1xuICBjb25zdCByZWYgPSB1c2VSZWY8eyB2OiBUIH0gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIGlmIChyZWYuY3VycmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmVmLmN1cnJlbnQgPSB7IHY6IHZhbHVlIH07XG4gIH0gZWxzZSBpZiAoIWlzRXF1YWwocmVmLmN1cnJlbnQudiwgdmFsdWUpKSB7XG4gICAgcmVmLmN1cnJlbnQgPSB7IHY6IHZhbHVlIH07XG4gIH1cbiAgcmV0dXJuIHJlZi5jdXJyZW50LnY7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZVN0YWJsZVJlZkVxdWFsaXR5O1xuIl19
@@ -0,0 +1,2 @@
1
+ export default function useTypedQuery<T = unknown>(): T;
2
+ //# sourceMappingURL=useTypedQuery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTypedQuery.d.ts","sourceRoot":"","sources":["../../../src/routing/useTypedQuery.ts"],"names":[],"mappings":"AAqBA,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,CAmCtD"}
@@ -0,0 +1,36 @@
1
+ import { useContext } from 'react';
2
+ import RoutingContext from './RoutingContext.js';
3
+ export default function useTypedQuery() {
4
+ const ctx = useContext(RoutingContext);
5
+ if (ctx == null)
6
+ return {};
7
+ const entry = ctx.get();
8
+ let schema;
9
+ const matched = entry.route;
10
+ if (matched != null) {
11
+ const collected = [];
12
+ for (const r of matched.route.routes) {
13
+ const maybe = r.query;
14
+ if (maybe !== null &&
15
+ typeof maybe === 'object' &&
16
+ Object.values(maybe).some((v) => {
17
+ if (v == null || typeof v !== 'object')
18
+ return false;
19
+ if (!('parse' in v))
20
+ return false;
21
+ const candidate = v;
22
+ return typeof candidate.parse === 'function';
23
+ })) {
24
+ collected.push(maybe);
25
+ }
26
+ }
27
+ if (collected.length > 0)
28
+ schema = collected.at(-1);
29
+ }
30
+ const value = entry.typedQuery ?? entry.query;
31
+ if (schema != null) {
32
+ return value;
33
+ }
34
+ return value;
35
+ }
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlVHlwZWRRdWVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yb3V0aW5nL3VzZVR5cGVkUXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNuQyxPQUFPLGNBQWMsTUFBTSxxQkFBcUIsQ0FBQztBQW9CakQsTUFBTSxDQUFDLE9BQU8sVUFBVSxhQUFhO0lBQ25DLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN2QyxJQUFJLEdBQUcsSUFBSSxJQUFJO1FBQUUsT0FBTyxFQUFTLENBQUM7SUFDbEMsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBR3hCLElBQUksTUFBK0IsQ0FBQztJQUNwQyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQzVCLElBQUksT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3BCLE1BQU0sU0FBUyxHQUFrQixFQUFFLENBQUM7UUFDcEMsS0FBSyxNQUFNLENBQUMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3JDLE1BQU0sS0FBSyxHQUFJLENBQW9DLENBQUMsS0FBSyxDQUFDO1lBQzFELElBQ0UsS0FBSyxLQUFLLElBQUk7Z0JBQ2QsT0FBTyxLQUFLLEtBQUssUUFBUTtnQkFFekIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFnQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ3pELElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRO3dCQUFFLE9BQU8sS0FBSyxDQUFDO29CQUNyRCxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUssQ0FBNkIsQ0FBQzt3QkFBRSxPQUFPLEtBQUssQ0FBQztvQkFDL0QsTUFBTSxTQUFTLEdBQUcsQ0FBd0IsQ0FBQztvQkFDM0MsT0FBTyxPQUFPLFNBQVMsQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUFDO2dCQUMvQyxDQUFDLENBQUMsRUFDRixDQUFDO2dCQUNELFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBb0IsQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUM7WUFBRSxNQUFNLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFFOUMsSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFLENBQUM7UUFDbkIsT0FBTyxLQUEwRCxDQUFDO0lBQ3BFLENBQUM7SUFDRCxPQUFPLEtBQVUsQ0FBQztBQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSb3V0aW5nQ29udGV4dCBmcm9tICcuL1JvdXRpbmdDb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHsgUXVlcnlTY2hlbWEsIEluZmVyUXVlcnkgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbi8qKlxuICogSG9vayByZXR1cm5pbmcgdGhlIHR5cGVkIHF1ZXJ5IG9iamVjdCBjb21wdXRlZCBmcm9tIHRoZSBtYXRjaGVkIHJvdXRlIHNjaGVtYSAoaWYgYW55KS5cbiAqIEZhbGxzIGJhY2sgdG8gdGhlIHJhdyBxdWVyeSB3aGVuIG5vIHNjaGVtYSBpcyBkZWZpbmVkLlxuICpcbiAqIFVzYWdlIHdpdGggZXhwbGljaXQgdHlwaW5nICh1bnRpbCBhdXRvbWF0aWMgaW5mZXJlbmNlIGlzIGFkZGVkKTpcbiAqICAgY29uc3QgcSA9IHVzZVR5cGVkUXVlcnk8eyBwYWdlPzogbnVtYmVyOyB0YWc/OiBzdHJpbmcgfT4oKTtcbiAqL1xuLy8gSW50ZXJuYWwgdXRpbGl0eTogaWYgc2NoZW1hIFMgcHJvdmlkZWQgcmV0dXJuIGl0cyBpbmZlcnJlZCBxdWVyeSwgZWxzZSBmYWxsYmFjay5cbnR5cGUgSW5mZXJPckZhbGxiYWNrPFMsIEZhbGxiYWNrPiA9IFMgZXh0ZW5kcyBRdWVyeVNjaGVtYVxuICA/IEluZmVyUXVlcnk8Uz5cbiAgOiBGYWxsYmFjaztcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB0eXBlZCBxdWVyeSBvYmplY3QuIElmIG5vIHNjaGVtYSBpcyBwcmVzZW50IGZhbGxzIGJhY2sgdG8gcmF3IHF1ZXJ5LlxuICogR2VuZXJpYyBUIGNhbiBiZSBwcm92aWRlZCBmb3IgZXhwbGljaXQgdHlwaW5nOyBvdGhlcndpc2UgYSBiZXN04oCRZWZmb3J0IHJ1bnRpbWUgY2FzdFxuICogaXMgYXBwbGllZCB3aGVuIGEgc2NoZW1hIGlzIGRldGVjdGVkLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VUeXBlZFF1ZXJ5PFQgPSB1bmtub3duPigpOiBUIHtcbiAgY29uc3QgY3R4ID0gdXNlQ29udGV4dChSb3V0aW5nQ29udGV4dCk7XG4gIGlmIChjdHggPT0gbnVsbCkgcmV0dXJuIHt9IGFzIGFueTtcbiAgY29uc3QgZW50cnkgPSBjdHguZ2V0KCk7XG5cbiAgLy8gUnVudGltZSBleHRyYWN0aW9uIG9mIGRlZXBlc3Qgc2NoZW1hIChtaXJyb3JzIGxvZ2ljIGluIGNyZWF0ZVJvdXRlcilcbiAgbGV0IHNjaGVtYTogUXVlcnlTY2hlbWEgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IG1hdGNoZWQgPSBlbnRyeS5yb3V0ZTtcbiAgaWYgKG1hdGNoZWQgIT0gbnVsbCkge1xuICAgIGNvbnN0IGNvbGxlY3RlZDogUXVlcnlTY2hlbWFbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgciBvZiBtYXRjaGVkLnJvdXRlLnJvdXRlcykge1xuICAgICAgY29uc3QgbWF5YmUgPSAociBhcyB1bmtub3duIGFzIHsgcXVlcnk/OiB1bmtub3duIH0pLnF1ZXJ5O1xuICAgICAgaWYgKFxuICAgICAgICBtYXliZSAhPT0gbnVsbCAmJlxuICAgICAgICB0eXBlb2YgbWF5YmUgPT09ICdvYmplY3QnICYmXG4gICAgICAgIC8vIEhldXJpc3RpYzogYXQgbGVhc3Qgb25lIHByb3BlcnR5IHdob3NlIHZhbHVlIGxvb2tzIGxpa2UgYSBkZXNjcmlwdG9yIChoYXMgcGFyc2UgZm4pXG4gICAgICAgIE9iamVjdC52YWx1ZXMobWF5YmUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnNvbWUoKHYpID0+IHtcbiAgICAgICAgICBpZiAodiA9PSBudWxsIHx8IHR5cGVvZiB2ICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIGlmICghKCdwYXJzZScgaW4gKHYgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHYgYXMgeyBwYXJzZT86IHVua25vd24gfTtcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIGNhbmRpZGF0ZS5wYXJzZSA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgICAgfSlcbiAgICAgICkge1xuICAgICAgICBjb2xsZWN0ZWQucHVzaChtYXliZSBhcyBRdWVyeVNjaGVtYSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb2xsZWN0ZWQubGVuZ3RoID4gMCkgc2NoZW1hID0gY29sbGVjdGVkLmF0KC0xKTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0gZW50cnkudHlwZWRRdWVyeSA/PyBlbnRyeS5xdWVyeTtcbiAgLy8gQ2FzdCB0byBpbmZlcnJlZCBzaGFwZSBvbmx5IGlmIHNjaGVtYSBub24tbnVsbFxuICBpZiAoc2NoZW1hICE9IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWUgYXMgSW5mZXJPckZhbGxiYWNrPHR5cGVvZiBzY2hlbWEsIFQ+IGFzIHVua25vd24gYXMgVDtcbiAgfVxuICByZXR1cm4gdmFsdWUgYXMgVDtcbn1cbiJdfQ==
@@ -0,0 +1,12 @@
1
+ import type { QuerySchema } from '../types.js';
2
+ import { type DefinedFilterSchema, type InferFilters } from '../routing/filters.js';
3
+ export interface BuildSearchOptions<F extends DefinedFilterSchema<any> | undefined = any> {
4
+ omitDefaults?: boolean;
5
+ sortKeys?: boolean;
6
+ filters?: F extends DefinedFilterSchema<any> ? InferFilters<F['schema']> : any;
7
+ filterSchema?: F;
8
+ omitEmptyFilters?: boolean;
9
+ pruneEmptyFilterOperators?: boolean;
10
+ }
11
+ export declare function buildSearch(query: Record<string, any> | undefined, schema: QuerySchema | undefined, opts?: BuildSearchOptions): string;
12
+ //# sourceMappingURL=buildSearch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildSearch.d.ts","sourceRoot":"","sources":["../../../src/tools/buildSearch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAmB,MAAM,aAAa,CAAC;AAChE,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,YAAY,EAClB,MAAM,uBAAuB,CAAC;AAW/B,MAAM,WAAW,kBAAkB,CACjC,CAAC,SAAS,mBAAmB,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,GAAG;IAEpD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,OAAO,CAAC,EAAE,CAAC,SAAS,mBAAmB,CAAC,GAAG,CAAC,GACxC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GACzB,GAAG,CAAC;IAER,YAAY,CAAC,EAAE,CAAC,CAAC;IAEjB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC;AAQD,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,EACtC,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,IAAI,CAAC,EAAE,kBAAkB,GACxB,MAAM,CAyQR"}
@@ -0,0 +1,264 @@
1
+ import { buildFiltersQuery, OPERATOR_PRIORITY, } from '../routing/filters.js';
2
+ function serializeValue(descriptor, value) {
3
+ return descriptor.serialize(value);
4
+ }
5
+ export function buildSearch(query, schema, opts) {
6
+ const hasFilters = opts !== undefined &&
7
+ opts.filters !== undefined &&
8
+ opts.filterSchema !== undefined;
9
+ if (query == null && !hasFilters) {
10
+ return '';
11
+ }
12
+ const { omitDefaults = false, sortKeys = true, filters, filterSchema, omitEmptyFilters = true, pruneEmptyFilterOperators = true, } = opts ?? {};
13
+ let workingQuery = {};
14
+ if (query != null) {
15
+ workingQuery = { ...query };
16
+ }
17
+ if (hasFilters && filterSchema !== undefined && filters !== undefined) {
18
+ let emptySchema = false;
19
+ if (filterSchema !== undefined && filterSchema !== null) {
20
+ const inner = filterSchema
21
+ .schema;
22
+ let keys = [];
23
+ if (inner !== undefined) {
24
+ keys = Object.keys(inner);
25
+ }
26
+ if (keys.length === 0) {
27
+ emptySchema = true;
28
+ }
29
+ }
30
+ let effectiveFilters = filters;
31
+ if (pruneEmptyFilterOperators) {
32
+ const pruned = {};
33
+ for (const [field, ops] of Object.entries(filters)) {
34
+ if (ops != null && typeof ops === 'object') {
35
+ const nextOps = {};
36
+ for (const [op, value] of Object.entries(ops)) {
37
+ if (value == null) {
38
+ }
39
+ else if (op === 'between') {
40
+ if (Array.isArray(value)) {
41
+ const clean = [];
42
+ for (const t of value) {
43
+ if (Array.isArray(t) && t.length === 2) {
44
+ clean.push(t);
45
+ }
46
+ }
47
+ if (clean.length > 0)
48
+ nextOps[op] = clean;
49
+ }
50
+ }
51
+ else if (Array.isArray(value)) {
52
+ if (value.length > 0)
53
+ nextOps[op] = value.slice();
54
+ }
55
+ else if (typeof value === 'boolean') {
56
+ nextOps[op] = value;
57
+ }
58
+ }
59
+ if (Object.keys(nextOps).length > 0) {
60
+ pruned[field] = nextOps;
61
+ }
62
+ }
63
+ }
64
+ effectiveFilters = pruned;
65
+ }
66
+ if (!emptySchema) {
67
+ workingQuery = buildFiltersQuery(filterSchema, workingQuery, effectiveFilters);
68
+ }
69
+ else {
70
+ const flat = {};
71
+ for (const [field, ops] of Object.entries(effectiveFilters)) {
72
+ if (ops !== undefined && ops !== null && typeof ops === 'object') {
73
+ for (const [op, value] of Object.entries(ops)) {
74
+ if (value === undefined || value === null) {
75
+ }
76
+ else {
77
+ const key = `${field}.${op}`;
78
+ if (op === 'exists' && typeof value === 'boolean') {
79
+ if (value) {
80
+ flat[key] = 'true';
81
+ }
82
+ else {
83
+ flat[key] = 'false';
84
+ }
85
+ }
86
+ else if (op === 'between') {
87
+ const ranges = value;
88
+ for (const r of ranges) {
89
+ if (Array.isArray(r) && r.length === 2) {
90
+ const a = r[0];
91
+ const b = r[1];
92
+ const pair = [String(a), String(b)];
93
+ const existing = flat[key];
94
+ if (existing === undefined) {
95
+ flat[key] = pair;
96
+ }
97
+ else if (Array.isArray(existing)) {
98
+ flat[key] = [...existing, ...pair];
99
+ }
100
+ else {
101
+ flat[key] = [existing, ...pair];
102
+ }
103
+ }
104
+ }
105
+ }
106
+ else if (Array.isArray(value)) {
107
+ for (const v of value) {
108
+ const sv = String(v);
109
+ const existing = flat[key];
110
+ if (existing === undefined) {
111
+ flat[key] = sv;
112
+ }
113
+ else if (Array.isArray(existing)) {
114
+ existing.push(sv);
115
+ }
116
+ else {
117
+ flat[key] = [existing, sv];
118
+ }
119
+ }
120
+ }
121
+ }
122
+ }
123
+ }
124
+ }
125
+ workingQuery = { ...workingQuery, ...flat };
126
+ }
127
+ if (omitEmptyFilters) {
128
+ const next = {};
129
+ for (const [k, v] of Object.entries(workingQuery)) {
130
+ if (Array.isArray(v) && v.length === 0) {
131
+ }
132
+ else {
133
+ next[k] = v;
134
+ }
135
+ }
136
+ workingQuery = next;
137
+ }
138
+ }
139
+ if (Object.keys(workingQuery).length === 0) {
140
+ return '';
141
+ }
142
+ let keys = Object.keys(workingQuery);
143
+ if (sortKeys) {
144
+ if (schema != null) {
145
+ const schemaKeys = Object.keys(schema);
146
+ const schemaOrdered = [];
147
+ for (const sk of schemaKeys) {
148
+ if (Object.prototype.hasOwnProperty.call(workingQuery, sk)) {
149
+ schemaOrdered.push(sk);
150
+ }
151
+ }
152
+ const filterKeys = [];
153
+ const otherKeys = [];
154
+ if (filterSchema != null) {
155
+ const fsSchema = filterSchema.schema;
156
+ const fieldSet = new Set(Object.keys(fsSchema));
157
+ for (const k of keys) {
158
+ if (!schemaKeys.includes(k)) {
159
+ const dot = k.indexOf('.');
160
+ if (dot > 0) {
161
+ const field = k.slice(0, dot);
162
+ if (fieldSet.has(field)) {
163
+ filterKeys.push(k);
164
+ }
165
+ else {
166
+ otherKeys.push(k);
167
+ }
168
+ }
169
+ else {
170
+ otherKeys.push(k);
171
+ }
172
+ }
173
+ }
174
+ }
175
+ else {
176
+ for (const k of keys) {
177
+ if (!schemaKeys.includes(k))
178
+ otherKeys.push(k);
179
+ }
180
+ }
181
+ otherKeys.sort();
182
+ const grouped = {};
183
+ for (const fk of filterKeys) {
184
+ const dot = fk.indexOf('.');
185
+ let field = fk;
186
+ if (dot > 0) {
187
+ field = fk.slice(0, dot);
188
+ }
189
+ grouped[field] ??= [];
190
+ {
191
+ const existing = grouped[field];
192
+ if (Array.isArray(existing)) {
193
+ existing.push(fk);
194
+ }
195
+ }
196
+ }
197
+ const orderedFields = Object.keys(grouped).sort();
198
+ const orderedFilterKeys = [];
199
+ for (const field of orderedFields) {
200
+ const ops = grouped[field];
201
+ if (ops !== undefined) {
202
+ ops.sort((a, b) => {
203
+ const opA = a.slice(a.indexOf('.') + 1);
204
+ const opB = b.slice(b.indexOf('.') + 1);
205
+ const ia = OPERATOR_PRIORITY.indexOf(opA);
206
+ const ib = OPERATOR_PRIORITY.indexOf(opB);
207
+ let sa = ia;
208
+ if (sa === -1)
209
+ sa = 999;
210
+ let sb = ib;
211
+ if (sb === -1)
212
+ sb = 999;
213
+ if (sa < sb)
214
+ return -1;
215
+ if (sa > sb)
216
+ return 1;
217
+ if (opA < opB)
218
+ return -1;
219
+ if (opA > opB)
220
+ return 1;
221
+ return 0;
222
+ });
223
+ for (const ok of ops)
224
+ orderedFilterKeys.push(ok);
225
+ }
226
+ }
227
+ keys = [...schemaOrdered, ...otherKeys, ...orderedFilterKeys];
228
+ }
229
+ else {
230
+ keys.sort();
231
+ }
232
+ }
233
+ const parts = [];
234
+ for (const key of keys) {
235
+ const value = workingQuery[key];
236
+ if (value == null) {
237
+ }
238
+ else {
239
+ const descriptor = schema?.[key];
240
+ if (descriptor != null) {
241
+ const isDefault = descriptor.hasDefault && value === descriptor.defaultValue;
242
+ const skipDefault = omitDefaults && isDefault;
243
+ if (!skipDefault) {
244
+ const values = serializeValue(descriptor, value);
245
+ values.forEach((v) => {
246
+ parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(v))}`);
247
+ });
248
+ }
249
+ }
250
+ else if (Array.isArray(value)) {
251
+ value.forEach((v) => {
252
+ parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(v))}`);
253
+ });
254
+ }
255
+ else {
256
+ parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);
257
+ }
258
+ }
259
+ }
260
+ if (parts.length === 0)
261
+ return '';
262
+ return `?${parts.join('&')}`;
263
+ }
264
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRTZWFyY2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdG9vbHMvYnVpbGRTZWFyY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixpQkFBaUIsR0FHbEIsTUFBTSx1QkFBdUIsQ0FBQztBQUcvQixTQUFTLGNBQWMsQ0FDckIsVUFBZ0MsRUFDaEMsS0FBYztJQUVkLE9BQU8sVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFZLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBMEJELE1BQU0sVUFBVSxXQUFXLENBQ3pCLEtBQXNDLEVBQ3RDLE1BQStCLEVBQy9CLElBQXlCO0lBRXpCLE1BQU0sVUFBVSxHQUNkLElBQUksS0FBSyxTQUFTO1FBQ2xCLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUztRQUMxQixJQUFJLENBQUMsWUFBWSxLQUFLLFNBQVMsQ0FBQztJQUNsQyxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNqQyxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxNQUFNLEVBQ0osWUFBWSxHQUFHLEtBQUssRUFDcEIsUUFBUSxHQUFHLElBQUksRUFDZixPQUFPLEVBQ1AsWUFBWSxFQUNaLGdCQUFnQixHQUFHLElBQUksRUFDdkIseUJBQXlCLEdBQUcsSUFBSSxHQUNqQyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFDZixJQUFJLFlBQVksR0FBd0IsRUFBRSxDQUFDO0lBQzNDLElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ2xCLFlBQVksR0FBRyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELElBQUksVUFBVSxJQUFJLFlBQVksS0FBSyxTQUFTLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3RFLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLFlBQVksS0FB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QUNKLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEtBQUssQ0FBQyxJQUFJLENBQ1IsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUNsRSxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNsQyxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0FBQy9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFF1ZXJ5U2NoZW1hLCBRdWVyeURlc2NyaXB0b3IgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQge1xuICBidWlsZEZpbHRlcnNRdWVyeSxcbiAgT1BFUkFUT1JfUFJJT1JJVFksXG4gIHR5cGUgRGVmaW5lZEZpbHRlclNjaGVtYSxcbiAgdHlwZSBJbmZlckZpbHRlcnMsXG59IGZyb20gJy4uL3JvdXRpbmcvZmlsdGVycy5qcyc7XG5cbi8qKiBTZXJpYWxpemUgYSBzaW5nbGUgdmFsdWUgd2l0aCBpdHMgZGVzY3JpcHRvciAqL1xuZnVuY3Rpb24gc2VyaWFsaXplVmFsdWUoXG4gIGRlc2NyaXB0b3I6IFF1ZXJ5RGVzY3JpcHRvcjxhbnk+LFxuICB2YWx1ZTogdW5rbm93bixcbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGRlc2NyaXB0b3Iuc2VyaWFsaXplKHZhbHVlIGFzIGFueSk7XG59XG5cbi8qKiBTZXJpYWxpemUgYSBxdWVyeSBvYmplY3QgdXNpbmcgYW4gb3B0aW9uYWwgc2NoZW1hICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkU2VhcmNoT3B0aW9uczxcbiAgRiBleHRlbmRzIERlZmluZWRGaWx0ZXJTY2hlbWE8YW55PiB8IHVuZGVmaW5lZCA9IGFueSxcbj4ge1xuICBvbWl0RGVmYXVsdHM/OiBib29sZWFuO1xuICBzb3J0S2V5cz86IGJvb2xlYW47XG4gIC8qKiBTdHJ1Y3R1cmVkIGZpbHRlcnMgb2JqZWN0IChhbHJlYWR5IHBhcnNlZCkgdG8gbWVyZ2UgKi9cbiAgZmlsdGVycz86IEYgZXh0ZW5kcyBEZWZpbmVkRmlsdGVyU2NoZW1hPGFueT5cbiAgICA/IEluZmVyRmlsdGVyczxGWydzY2hlbWEnXT5cbiAgICA6IGFueTtcbiAgLyoqIEZpbHRlciBzY2hlbWEgd3JhcHBlciAocmVxdWlyZWQgaWYgZmlsdGVycyBwcm92aWRlZCkgKi9cbiAgZmlsdGVyU2NoZW1hPzogRjtcbiAgLyoqIFdoZW4gdHJ1ZSwgb21pdCBlbXB0eSBmaWx0ZXIgb3BlcmF0b3Igc2V0cyBlbnRpcmVseSAqL1xuICBvbWl0RW1wdHlGaWx0ZXJzPzogYm9vbGVhbjtcbiAgLyoqIFBydW5lIGVtcHR5IG9wZXJhdG9yIGFycmF5cyAvIGludmFsaWQgdHVwbGVzIHJlY3Vyc2l2ZWx5IGJlZm9yZSBzZXJpYWxpemF0aW9uIChkZWZhdWx0cyB0cnVlKSAqL1xuICBwcnVuZUVtcHR5RmlsdGVyT3BlcmF0b3JzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIHNlYXJjaCBzdHJpbmcgZnJvbSAodHlwZWQpIHF1ZXJ5ICsgb3B0aW9uYWwgc3RydWN0dXJlZCBmaWx0ZXJzLlxuICogLSBBcHBsaWVzIG9taXREZWZhdWx0cyBmb3Igc2NoZW1hLWJhY2tlZCBxdWVyeSBrZXlzLlxuICogLSBTZXJpYWxpemVzIGZpbHRlcnMgdmlhIGJ1aWxkRmlsdGVyc1F1ZXJ5IHRoZW4gbWVyZ2VzLlxuICogLSBEZXRlcm1pbmlzdGljIGtleSBvcmRlcmluZyAoc2NoZW1hIG9yZGVyIHRoZW4gZXh0cmFzKSB3aGVuIHNvcnRLZXlzIGVuYWJsZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFNlYXJjaChcbiAgcXVlcnk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQsXG4gIHNjaGVtYTogUXVlcnlTY2hlbWEgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiBCdWlsZFNlYXJjaE9wdGlvbnMsXG4pOiBzdHJpbmcge1xuICBjb25zdCBoYXNGaWx0ZXJzID1cbiAgICBvcHRzICE9PSB1bmRlZmluZWQgJiZcbiAgICBvcHRzLmZpbHRlcnMgIT09IHVuZGVmaW5lZCAmJlxuICAgIG9wdHMuZmlsdGVyU2NoZW1hICE9PSB1bmRlZmluZWQ7XG4gIGlmIChxdWVyeSA9PSBudWxsICYmICFoYXNGaWx0ZXJzKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIGNvbnN0IHtcbiAgICBvbWl0RGVmYXVsdHMgPSBmYWxzZSxcbiAgICBzb3J0S2V5cyA9IHRydWUsXG4gICAgZmlsdGVycyxcbiAgICBmaWx0ZXJTY2hlbWEsXG4gICAgb21pdEVtcHR5RmlsdGVycyA9IHRydWUsXG4gICAgcHJ1bmVFbXB0eUZpbHRlck9wZXJhdG9ycyA9IHRydWUsXG4gIH0gPSBvcHRzID8/IHt9O1xuICBsZXQgd29ya2luZ1F1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGlmIChxdWVyeSAhPSBudWxsKSB7XG4gICAgd29ya2luZ1F1ZXJ5ID0geyAuLi5xdWVyeSB9O1xuICB9XG4gIGlmIChoYXNGaWx0ZXJzICYmIGZpbHRlclNjaGVtYSAhPT0gdW5kZWZpbmVkICYmIGZpbHRlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgIGxldCBlbXB0eVNjaGVtYSA9IGZhbHNlO1xuICAgIGlmIChmaWx0ZXJTY2hlbWEgIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXJTY2hlbWEgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGlubmVyID0gKGZpbHRlclNjaGVtYSBhcyB7IHNjaGVtYT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pXG4gICAgICAgIC5zY2hlbWE7XG4gICAgICBsZXQga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlmIChpbm5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGtleXMgPSBPYmplY3Qua2V5cyhpbm5lcik7XG4gICAgICB9XG4gICAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZW1wdHlTY2hlbWEgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgZWZmZWN0aXZlRmlsdGVyczogYW55ID0gZmlsdGVycztcbiAgICBpZiAocHJ1bmVFbXB0eUZpbHRlck9wZXJhdG9ycykge1xuICAgICAgLy8gRGVlcCBjbG9uZSAmIHBydW5lIGVtcHR5IGFycmF5cyAvIGJldHdlZW4gdHVwbGVzIGxlbmd0aCE9MiAvIGV4aXN0cyB1bmRlZmluZWRcbiAgICAgIGNvbnN0IHBydW5lZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbZmllbGQsIG9wc10gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICAgIGZpbHRlcnMgYXMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAgICkpIHtcbiAgICAgICAgaWYgKG9wcyAhPSBudWxsICYmIHR5cGVvZiBvcHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgY29uc3QgbmV4dE9wczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgICAgIGZvciAoY29uc3QgW29wLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3BzKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gc2tpcCBudWxsaXNoXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAnYmV0d2VlbicpIHtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xlYW46IFthbnksIGFueV1bXSA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodCkgJiYgdC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW4ucHVzaCh0IGFzIFthbnksIGFueV0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2xlYW4ubGVuZ3RoID4gMCkgbmV4dE9wc1tvcF0gPSBjbGVhbjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgbmV4dE9wc1tvcF0gPSB2YWx1ZS5zbGljZSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICBuZXh0T3BzW29wXSA9IHZhbHVlOyAvLyBleGlzdHNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKG5leHRPcHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHBydW5lZFtmaWVsZF0gPSBuZXh0T3BzO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWZmZWN0aXZlRmlsdGVycyA9IHBydW5lZDtcbiAgICB9XG4gICAgaWYgKCFlbXB0eVNjaGVtYSkge1xuICAgICAgd29ya2luZ1F1ZXJ5ID0gYnVpbGRGaWx0ZXJzUXVlcnkoXG4gICAgICAgIGZpbHRlclNjaGVtYSxcbiAgICAgICAgd29ya2luZ1F1ZXJ5LFxuICAgICAgICBlZmZlY3RpdmVGaWx0ZXJzIGFzIHVua25vd24gYXMgYW55LFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmFsbGJhY2s6IGRpcmVjdCBmbGF0dGVuIGZpZWxkLm9wIGZvciBwcm92aWRlZCBvcGVyYXRvcnNcbiAgICAgIGNvbnN0IGZsYXQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW2ZpZWxkLCBvcHNdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgICBlZmZlY3RpdmVGaWx0ZXJzIGFzIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgICApKSB7XG4gICAgICAgIGlmIChvcHMgIT09IHVuZGVmaW5lZCAmJiBvcHMgIT09IG51bGwgJiYgdHlwZW9mIG9wcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtvcCwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgICAgICAgb3BzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIHNraXAgbnVsbGlzaFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3Qga2V5ID0gYCR7ZmllbGR9LiR7b3B9YDtcbiAgICAgICAgICAgICAgaWYgKG9wID09PSAnZXhpc3RzJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgZmxhdFtrZXldID0gJ3RydWUnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBmbGF0W2tleV0gPSAnZmFsc2UnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gJ2JldHdlZW4nKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmFuZ2VzID0gdmFsdWUgYXMgdW5rbm93bltdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgciBvZiByYW5nZXMpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHIpICYmIHIubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGEgPSByWzBdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiID0gclsxXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IFtTdHJpbmcoYSksIFN0cmluZyhiKV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gZmxhdFtrZXldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgIGZsYXRba2V5XSA9IHBhaXI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShleGlzdGluZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICBmbGF0W2tleV0gPSBbLi4uZXhpc3RpbmcsIC4uLnBhaXJdO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGZsYXRba2V5XSA9IFtleGlzdGluZywgLi4ucGFpcl07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHYgb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHN2ID0gU3RyaW5nKHYpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBmbGF0W2tleV07XG4gICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBmbGF0W2tleV0gPSBzdjtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShleGlzdGluZykpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcucHVzaChzdik7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmbGF0W2tleV0gPSBbZXhpc3RpbmcsIHN2XTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdvcmtpbmdRdWVyeSA9IHsgLi4ud29ya2luZ1F1ZXJ5LCAuLi5mbGF0IH07XG4gICAgfVxuICAgIGlmIChvbWl0RW1wdHlGaWx0ZXJzKSB7XG4gICAgICBjb25zdCBuZXh0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh3b3JraW5nUXVlcnkpKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHYpICYmIHYubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgLy8gc2tpcCBlbXB0eSBhcnJheSBmaWx0ZXIga2V5XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dFtrXSA9IHY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdvcmtpbmdRdWVyeSA9IG5leHQ7XG4gICAgfVxuICB9XG4gIGlmIChPYmplY3Qua2V5cyh3b3JraW5nUXVlcnkpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHdvcmtpbmdRdWVyeSk7XG4gIGlmIChzb3J0S2V5cykge1xuICAgIGlmIChzY2hlbWEgIT0gbnVsbCkge1xuICAgICAgY29uc3Qgc2NoZW1hS2V5cyA9IE9iamVjdC5rZXlzKHNjaGVtYSk7XG4gICAgICBjb25zdCBzY2hlbWFPcmRlcmVkOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBzayBvZiBzY2hlbWFLZXlzKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwod29ya2luZ1F1ZXJ5LCBzaykpIHtcbiAgICAgICAgICBzY2hlbWFPcmRlcmVkLnB1c2goc2spO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBmaWx0ZXJLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3Qgb3RoZXJLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgaWYgKGZpbHRlclNjaGVtYSAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGZzU2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IChcbiAgICAgICAgICBmaWx0ZXJTY2hlbWEgYXMge1xuICAgICAgICAgICAgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICB9XG4gICAgICAgICkuc2NoZW1hO1xuICAgICAgICBjb25zdCBmaWVsZFNldCA9IG5ldyBTZXQoT2JqZWN0LmtleXMoZnNTY2hlbWEpKTtcbiAgICAgICAgZm9yIChjb25zdCBrIG9mIGtleXMpIHtcbiAgICAgICAgICBpZiAoIXNjaGVtYUtleXMuaW5jbHVkZXMoaykpIHtcbiAgICAgICAgICAgIGNvbnN0IGRvdCA9IGsuaW5kZXhPZignLicpO1xuICAgICAgICAgICAgaWYgKGRvdCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSBrLnNsaWNlKDAsIGRvdCk7XG4gICAgICAgICAgICAgIGlmIChmaWVsZFNldC5oYXMoZmllbGQpKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyS2V5cy5wdXNoKGspO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG90aGVyS2V5cy5wdXNoKGspO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvdGhlcktleXMucHVzaChrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgayBvZiBrZXlzKSB7XG4gICAgICAgICAgaWYgKCFzY2hlbWFLZXlzLmluY2x1ZGVzKGspKSBvdGhlcktleXMucHVzaChrKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gRGVkdXBsaWNhdGUgYWxyZWFkeSBhY2NvdW50ZWQgc2NoZW1hIGtleXMgZnJvbSBvdGhlcnNcbiAgICAgIC8vIE9yZGVyIG5vbi1maWx0ZXIgZXh0cmFzIGFscGhhYmV0aWNhbGx5XG4gICAgICBvdGhlcktleXMuc29ydCgpO1xuICAgICAgLy8gT25seSBpbXBsZW1lbnRlZCBvcmRlcmluZzogYWZ0ZXItcXVlcnlcbiAgICAgIGNvbnN0IGdyb3VwZWQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBmayBvZiBmaWx0ZXJLZXlzKSB7XG4gICAgICAgIGNvbnN0IGRvdCA9IGZrLmluZGV4T2YoJy4nKTtcbiAgICAgICAgbGV0IGZpZWxkID0gZms7XG4gICAgICAgIGlmIChkb3QgPiAwKSB7XG4gICAgICAgICAgZmllbGQgPSBmay5zbGljZSgwLCBkb3QpO1xuICAgICAgICB9XG4gICAgICAgIGdyb3VwZWRbZmllbGRdID8/PSBbXTtcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gZ3JvdXBlZFtmaWVsZF07XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXhpc3RpbmcpKSB7XG4gICAgICAgICAgICBleGlzdGluZy5wdXNoKGZrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IG9yZGVyZWRGaWVsZHMgPSBPYmplY3Qua2V5cyhncm91cGVkKS5zb3J0KCk7XG4gICAgICBjb25zdCBvcmRlcmVkRmlsdGVyS2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2Ygb3JkZXJlZEZpZWxkcykge1xuICAgICAgICBjb25zdCBvcHMgPSBncm91cGVkW2ZpZWxkXTtcbiAgICAgICAgaWYgKG9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb3BzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9wQSA9IGEuc2xpY2UoYS5pbmRleE9mKCcuJykgKyAxKTtcbiAgICAgICAgICAgIGNvbnN0IG9wQiA9IGIuc2xpY2UoYi5pbmRleE9mKCcuJykgKyAxKTtcbiAgICAgICAgICAgIGNvbnN0IGlhID0gT1BFUkFUT1JfUFJJT1JJVFkuaW5kZXhPZihvcEEgYXMgYW55KTtcbiAgICAgICAgICAgIGNvbnN0IGliID0gT1BFUkFUT1JfUFJJT1JJVFkuaW5kZXhPZihvcEIgYXMgYW55KTtcbiAgICAgICAgICAgIGxldCBzYSA9IGlhO1xuICAgICAgICAgICAgaWYgKHNhID09PSAtMSkgc2EgPSA5OTk7XG4gICAgICAgICAgICBsZXQgc2IgPSBpYjtcbiAgICAgICAgICAgIGlmIChzYiA9PT0gLTEpIHNiID0gOTk5O1xuICAgICAgICAgICAgaWYgKHNhIDwgc2IpIHJldHVybiAtMTtcbiAgICAgICAgICAgIGlmIChzYSA+IHNiKSByZXR1cm4gMTtcbiAgICAgICAgICAgIGlmIChvcEEgPCBvcEIpIHJldHVybiAtMTtcbiAgICAgICAgICAgIGlmIChvcEEgPiBvcEIpIHJldHVybiAxO1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZm9yIChjb25zdCBvayBvZiBvcHMpIG9yZGVyZWRGaWx0ZXJLZXlzLnB1c2gob2spO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBrZXlzID0gWy4uLnNjaGVtYU9yZGVyZWQsIC4uLm90aGVyS2V5cywgLi4ub3JkZXJlZEZpbHRlcktleXNdO1xuICAgIH0gZWxzZSB7XG4gICAgICBrZXlzLnNvcnQoKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHdvcmtpbmdRdWVyeVtrZXldO1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAvLyBza2lwIG51bGxpc2ggdmFsdWVzXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBzY2hlbWE/LltrZXldO1xuICAgICAgaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBpc0RlZmF1bHQgPVxuICAgICAgICAgIGRlc2NyaXB0b3IuaGFzRGVmYXVsdCAmJiB2YWx1ZSA9PT0gZGVzY3JpcHRvci5kZWZhdWx0VmFsdWU7XG4gICAgICAgIGNvbnN0IHNraXBEZWZhdWx0ID0gb21pdERlZmF1bHRzICYmIGlzRGVmYXVsdDtcbiAgICAgICAgaWYgKCFza2lwRGVmYXVsdCkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHNlcmlhbGl6ZVZhbHVlKGRlc2NyaXB0b3IsIHZhbHVlKTtcbiAgICAgICAgICB2YWx1ZXMuZm9yRWFjaCgodikgPT4ge1xuICAgICAgICAgICAgcGFydHMucHVzaChcbiAgICAgICAgICAgICAgYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGtleSl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyh2KSl9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaCgodikgPT4ge1xuICAgICAgICAgIHBhcnRzLnB1c2goXG4gICAgICAgICAgICBgJHtlbmNvZGVVUklDb21wb25lbnQoa2V5KX09JHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKHYpKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFydHMucHVzaChcbiAgICAgICAgICBgJHtlbmNvZGVVUklDb21wb25lbnQoa2V5KX09JHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKHZhbHVlKSl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuICByZXR1cm4gYD8ke3BhcnRzLmpvaW4oJyYnKX1gO1xufVxuIl19
@@ -0,0 +1,28 @@
1
+ import type { QueryDescriptor, QuerySchema, InferQuery } from '../types.js';
2
+ declare function stringDesc(): QueryDescriptor<string>;
3
+ declare function numberDesc(): QueryDescriptor<number>;
4
+ declare function booleanDesc(): QueryDescriptor<boolean>;
5
+ declare function enumDesc<T extends string>(...values: T[]): QueryDescriptor<T>;
6
+ declare function arrayOf<T>(inner: QueryDescriptor<T>): QueryDescriptor<T[]>;
7
+ declare function optional<T>(d: QueryDescriptor<T>): QueryDescriptor<T | undefined>;
8
+ declare function withDefault<T>(d: QueryDescriptor<T>, value: T): QueryDescriptor<T>;
9
+ declare function emptyAsUndefined(d: QueryDescriptor<string>): QueryDescriptor<string>;
10
+ declare function custom<T>(handlers: {
11
+ parse: (values: string[]) => T | undefined;
12
+ serialize: (value: T) => string[];
13
+ }): QueryDescriptor<T>;
14
+ export declare const q: {
15
+ string: typeof stringDesc;
16
+ number: typeof numberDesc;
17
+ boolean: typeof booleanDesc;
18
+ enum: typeof enumDesc;
19
+ array: typeof arrayOf;
20
+ optional: typeof optional;
21
+ default: typeof withDefault;
22
+ emptyAsUndefined: typeof emptyAsUndefined;
23
+ custom: typeof custom;
24
+ };
25
+ export declare function parseTypedQuery<S extends QuerySchema | undefined>(schema: S, raw: Record<string, string | string[]>): S extends QuerySchema ? InferQuery<Exclude<S, undefined>> : typeof raw;
26
+ export declare function parseSearch<S extends QuerySchema | undefined>(schema: S, search: string): S extends QuerySchema ? InferQuery<Exclude<S, undefined>> : Record<string, string | string[]>;
27
+ export {};
28
+ //# sourceMappingURL=query-dsl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-dsl.d.ts","sourceRoot":"","sources":["../../../src/tools/query-dsl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAuB5E,iBAAS,UAAU,IAAI,eAAe,CAAC,MAAM,CAAC,CAS7C;AAGD,iBAAS,UAAU,IAAI,eAAe,CAAC,MAAM,CAAC,CAa7C;AAGD,iBAAS,WAAW,IAAI,eAAe,CAAC,OAAO,CAAC,CAkB/C;AAGD,iBAAS,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,EAAE,GAAG,eAAe,CAAC,CAAC,CAAC,CAYtE;AAGD,iBAAS,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,CAgBnE;AAGD,iBAAS,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,GAAG,SAAS,CAAC,CAE1E;AAGD,iBAAS,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAE3E;AAGD,iBAAS,gBAAgB,CAAC,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC,CAS7E;AAGD,iBAAS,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE;IAC3B,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC;IAC3C,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,EAAE,CAAC;CACnC,GAAG,eAAe,CAAC,CAAC,CAAC,CAKrB;AAED,eAAO,MAAM,CAAC;;;;;;;;;;CAUb,CAAC;AAGF,wBAAgB,eAAe,CAAC,CAAC,SAAS,WAAW,GAAG,SAAS,EAC/D,MAAM,EAAE,CAAC,EACT,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,GACrC,CAAC,SAAS,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,OAAO,GAAG,CAgGxE;AAGD,wBAAgB,WAAW,CAAC,CAAC,SAAS,WAAW,GAAG,SAAS,EAC3D,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,MAAM,GACb,CAAC,SAAS,WAAW,GACpB,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,GACjC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAcpC"}