@1money/component-ui 0.0.71 → 0.0.74

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 (103) hide show
  1. package/es/components/ProForm/ProForm.d.ts +10 -2
  2. package/es/components/ProForm/ProForm.js +241 -55
  3. package/es/components/ProForm/ProFormDependency.d.ts +11 -2
  4. package/es/components/ProForm/ProFormDependency.js +29 -133
  5. package/es/components/ProForm/ProFormItem.js +146 -52
  6. package/es/components/ProForm/ProFormList.js +114 -62
  7. package/es/components/ProForm/SchemaForm.d.ts +7 -0
  8. package/es/components/ProForm/SchemaForm.js +103 -0
  9. package/es/components/ProForm/Submitter.js +26 -5
  10. package/es/components/ProForm/context.d.ts +30 -3
  11. package/es/components/ProForm/context.js +69 -10
  12. package/es/components/ProForm/core/constants.d.ts +12 -3
  13. package/es/components/ProForm/core/constants.js +18 -7
  14. package/es/components/ProForm/core/formStore.d.ts +24 -0
  15. package/es/components/ProForm/core/formStore.js +101 -0
  16. package/es/components/ProForm/core/hooks/useForm.d.ts +4 -1
  17. package/es/components/ProForm/core/hooks/useForm.js +336 -212
  18. package/es/components/ProForm/core/hooks/useFormCore.d.ts +5 -1
  19. package/es/components/ProForm/core/hooks/useFormCore.js +151 -93
  20. package/es/components/ProForm/core/interface.d.ts +33 -12
  21. package/es/components/ProForm/core/runRules.d.ts +20 -8
  22. package/es/components/ProForm/core/runRules.js +105 -50
  23. package/es/components/ProForm/core/useFormItem.d.ts +10 -1
  24. package/es/components/ProForm/core/useFormItem.js +141 -56
  25. package/es/components/ProForm/fields/ProFormDatePicker.js +4 -1
  26. package/es/components/ProForm/fields/ProFormFieldSet.js +20 -7
  27. package/es/components/ProForm/fields/createProFormField.js +61 -32
  28. package/es/components/ProForm/hooks/useFieldRequest.d.ts +6 -1
  29. package/es/components/ProForm/hooks/useFieldRequest.js +54 -9
  30. package/es/components/ProForm/hooks/useUrlSync.d.ts +16 -0
  31. package/es/components/ProForm/hooks/useUrlSync.js +170 -0
  32. package/es/components/ProForm/index.d.ts +12 -5
  33. package/es/components/ProForm/index.js +7 -2
  34. package/es/components/ProForm/interface.d.ts +185 -28
  35. package/es/components/ProForm/layouts/DialogForm.d.ts +5 -1
  36. package/es/components/ProForm/layouts/DialogForm.js +18 -7
  37. package/es/components/ProForm/layouts/DrawerForm.d.ts +5 -1
  38. package/es/components/ProForm/layouts/DrawerForm.js +17 -7
  39. package/es/components/ProForm/layouts/QueryFilter.d.ts +5 -2
  40. package/es/components/ProForm/layouts/QueryFilter.js +47 -71
  41. package/es/components/ProForm/layouts/useOverlayForm.d.ts +2 -2
  42. package/es/components/ProForm/layouts/useOverlayForm.js +27 -8
  43. package/es/components/ProForm/style/ProForm.css +4 -4
  44. package/es/components/ProForm/utils.d.ts +12 -1
  45. package/es/components/ProForm/utils.js +101 -28
  46. package/es/components/ProTable/ProTable.js +3 -3
  47. package/es/components/Tooltip/style/Tooltip.css +1 -0
  48. package/es/index.css +1 -1
  49. package/es/index.d.ts +2 -2
  50. package/es/index.js +2 -2
  51. package/lib/components/ProForm/ProForm.d.ts +10 -2
  52. package/lib/components/ProForm/ProForm.js +239 -53
  53. package/lib/components/ProForm/ProFormDependency.d.ts +11 -2
  54. package/lib/components/ProForm/ProFormDependency.js +30 -135
  55. package/lib/components/ProForm/ProFormItem.js +143 -48
  56. package/lib/components/ProForm/ProFormList.js +112 -60
  57. package/lib/components/ProForm/SchemaForm.d.ts +7 -0
  58. package/lib/components/ProForm/SchemaForm.js +110 -0
  59. package/lib/components/ProForm/Submitter.js +26 -5
  60. package/lib/components/ProForm/context.d.ts +30 -3
  61. package/lib/components/ProForm/context.js +69 -10
  62. package/lib/components/ProForm/core/constants.d.ts +12 -3
  63. package/lib/components/ProForm/core/constants.js +19 -8
  64. package/lib/components/ProForm/core/formStore.d.ts +24 -0
  65. package/lib/components/ProForm/core/formStore.js +110 -0
  66. package/lib/components/ProForm/core/hooks/useForm.d.ts +4 -1
  67. package/lib/components/ProForm/core/hooks/useForm.js +336 -212
  68. package/lib/components/ProForm/core/hooks/useFormCore.d.ts +5 -1
  69. package/lib/components/ProForm/core/hooks/useFormCore.js +150 -92
  70. package/lib/components/ProForm/core/interface.d.ts +33 -12
  71. package/lib/components/ProForm/core/runRules.d.ts +20 -8
  72. package/lib/components/ProForm/core/runRules.js +106 -50
  73. package/lib/components/ProForm/core/useFormItem.d.ts +10 -1
  74. package/lib/components/ProForm/core/useFormItem.js +138 -53
  75. package/lib/components/ProForm/fields/ProFormDatePicker.js +4 -1
  76. package/lib/components/ProForm/fields/ProFormFieldSet.js +19 -6
  77. package/lib/components/ProForm/fields/createProFormField.js +61 -32
  78. package/lib/components/ProForm/hooks/useFieldRequest.d.ts +6 -1
  79. package/lib/components/ProForm/hooks/useFieldRequest.js +53 -8
  80. package/lib/components/ProForm/hooks/useUrlSync.d.ts +16 -0
  81. package/lib/components/ProForm/hooks/useUrlSync.js +178 -0
  82. package/lib/components/ProForm/index.d.ts +12 -5
  83. package/lib/components/ProForm/index.js +16 -1
  84. package/lib/components/ProForm/interface.d.ts +185 -28
  85. package/lib/components/ProForm/layouts/DialogForm.d.ts +5 -1
  86. package/lib/components/ProForm/layouts/DialogForm.js +18 -7
  87. package/lib/components/ProForm/layouts/DrawerForm.d.ts +5 -1
  88. package/lib/components/ProForm/layouts/DrawerForm.js +17 -7
  89. package/lib/components/ProForm/layouts/QueryFilter.d.ts +5 -2
  90. package/lib/components/ProForm/layouts/QueryFilter.js +46 -70
  91. package/lib/components/ProForm/layouts/useOverlayForm.d.ts +2 -2
  92. package/lib/components/ProForm/layouts/useOverlayForm.js +30 -8
  93. package/lib/components/ProForm/style/ProForm.css +4 -4
  94. package/lib/components/ProForm/utils.d.ts +12 -1
  95. package/lib/components/ProForm/utils.js +104 -28
  96. package/lib/components/ProTable/ProTable.js +3 -3
  97. package/lib/components/Tooltip/style/Tooltip.css +1 -0
  98. package/lib/index.css +1 -1
  99. package/lib/index.d.ts +2 -2
  100. package/lib/index.js +13 -1
  101. package/package.json +1 -1
  102. package/scripts/mcp-server/examples.generated.json +90 -0
  103. package/scripts/mcp-server/index.generated.json +1866 -212
@@ -1,3 +1,4 @@
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
1
2
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
3
  var __rest = this && this.__rest || function (s, e) {
3
4
  var t = {};
@@ -12,6 +13,7 @@ import { memo } from 'react';
12
13
  import useDebouncedCallback from '@1money/hooks/useDebouncedCallback';
13
14
  import { ProFormItem } from '../ProFormItem';
14
15
  import { ProFormDependency } from '../ProFormDependency';
16
+ import { useProFormStable } from '../context';
15
17
  import { useFieldRequest } from '../hooks/useFieldRequest';
16
18
  import { resolveWidth, valueEnumToOptions } from '../utils';
17
19
  // ---------------------------------------------------------------------------
@@ -19,40 +21,62 @@ import { resolveWidth, valueEnumToOptions } from '../utils';
19
21
  // ---------------------------------------------------------------------------
20
22
  export function createProFormField(config) {
21
23
  var Component = config.component,
24
+ valuePropName = config.valuePropName,
25
+ defaultValueType = config.valueType,
22
26
  mapProps = config.mapProps,
23
- renderReadonly = config.renderReadonly;
27
+ renderReadonly = config.renderReadonly,
28
+ popupContainerProp = config.popupContainerProp;
29
+ // Memo boundary around the wrapped control: combined with the stable
30
+ // injected handlers from useFormItem, fields whose value didn't change can
31
+ // bail out while another field in the form is typing. displayName must be
32
+ // carried over — injectField uses it to recognize form controls.
33
+ var MemoizedComponent = /*#__PURE__*/memo(Component);
34
+ MemoizedComponent.displayName = Component.displayName || Component.name;
24
35
  // Inner component — handles mode, request, valueEnum, debounce, render
25
36
  var InnerField = function InnerField(props) {
26
- var _a;
27
- var _b = props,
28
- name = _b.name,
29
- label = _b.label,
30
- description = _b.description,
31
- rules = _b.rules,
32
- required = _b.required,
33
- feedback = _b.feedback,
34
- validateStatus = _b.validateStatus,
35
- colon = _b.colon,
36
- readonly = _b.readonly,
37
- modeProp = _b.mode,
38
- hidden = _b.hidden,
39
- colProps = _b.colProps,
40
- fieldProps = _b.fieldProps,
41
- placeholder = _b.placeholder,
42
- disabled = _b.disabled,
43
- width = _b.width,
44
- transform = _b.transform,
45
- convertValue = _b.convertValue,
46
- _deps = _b.dependencies,
47
- request = _b.request,
48
- params = _b.params,
49
- valueEnum = _b.valueEnum,
50
- debounceTime = _b.debounceTime,
51
- dependenciesValues = _b.dependenciesValues,
52
- rest = __rest(_b, ["name", "label", "description", "rules", "required", "feedback", "validateStatus", "colon", "readonly", "mode", "hidden", "colProps", "fieldProps", "placeholder", "disabled", "width", "transform", "convertValue", "dependencies", "request", "params", "valueEnum", "debounceTime", "dependenciesValues"]);
37
+ var _a, _b;
38
+ var _c = props,
39
+ name = _c.name,
40
+ label = _c.label,
41
+ description = _c.description,
42
+ rules = _c.rules,
43
+ required = _c.required,
44
+ feedback = _c.feedback,
45
+ validateStatus = _c.validateStatus,
46
+ colon = _c.colon,
47
+ readonly = _c.readonly,
48
+ modeProp = _c.mode,
49
+ hidden = _c.hidden,
50
+ colProps = _c.colProps,
51
+ fieldProps = _c.fieldProps,
52
+ placeholder = _c.placeholder,
53
+ disabled = _c.disabled,
54
+ width = _c.width,
55
+ transform = _c.transform,
56
+ convertValue = _c.convertValue,
57
+ _deps = _c.dependencies,
58
+ request = _c.request,
59
+ params = _c.params,
60
+ valueEnum = _c.valueEnum,
61
+ debounceTime = _c.debounceTime,
62
+ validateDebounce = _c.validateDebounce,
63
+ valueType = _c.valueType,
64
+ dependenciesValues = _c.dependenciesValues,
65
+ rest = __rest(_c, ["name", "label", "description", "rules", "required", "feedback", "validateStatus", "colon", "readonly", "mode", "hidden", "colProps", "fieldProps", "placeholder", "disabled", "width", "transform", "convertValue", "dependencies", "request", "params", "valueEnum", "debounceTime", "validateDebounce", "valueType", "dependenciesValues"]);
53
66
 
54
67
  // Mode resolution: explicit mode > legacy readonly > ctx.mode (ProFormItem)
55
68
  var resolvedMode = modeProp !== null && modeProp !== void 0 ? modeProp : readonly !== undefined ? readonly ? 'read' : 'edit' : undefined;
69
+ // Form-level fieldProps (lowest priority after mapProps defaults).
70
+ // Stable slice only — the field shell must NOT re-render per keystroke;
71
+ // value/error reactivity lives inside ProFormItem.
72
+ var _useProFormStable = useProFormStable(),
73
+ contextFieldProps = _useProFormStable.fieldProps,
74
+ formDisabled = _useProFormStable.disabled,
75
+ formComponentType = _useProFormStable.formComponentType;
76
+ // Overlay fields inside a Dialog/Drawer form mount their popup next to
77
+ // the trigger ('self') instead of document.body, so it scrolls and
78
+ // stacks with the overlay container.
79
+ var overlayContained = popupContainerProp !== undefined && (formComponentType === 'DialogForm' || formComponentType === 'DrawerForm');
56
80
  // ── Field-level request ──
57
81
  var mergedRequestParams = dependenciesValues ? Object.assign(Object.assign({}, params), dependenciesValues) : params;
58
82
  var _useFieldRequest = useFieldRequest(request, mergedRequestParams),
@@ -66,7 +90,7 @@ export function createProFormField(config) {
66
90
  // over mapped, matching the spread order below). useDebouncedCallback reads
67
91
  // the latest callback internally, so the wrapper never goes stale and the
68
92
  // pending call is auto-cancelled on unmount.
69
- var userOnChange = (_a = fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.onChange) !== null && _a !== void 0 ? _a : mapped === null || mapped === void 0 ? void 0 : mapped.onChange;
93
+ var userOnChange = (_b = (_a = fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.onChange) !== null && _a !== void 0 ? _a : contextFieldProps === null || contextFieldProps === void 0 ? void 0 : contextFieldProps.onChange) !== null && _b !== void 0 ? _b : mapped === null || mapped === void 0 ? void 0 : mapped.onChange;
70
94
  var _useDebouncedCallback = useDebouncedCallback(function () {
71
95
  return userOnChange === null || userOnChange === void 0 ? void 0 : userOnChange.apply(void 0, arguments);
72
96
  }, debounceTime),
@@ -84,7 +108,9 @@ export function createProFormField(config) {
84
108
  if (requestOptions.length > 0) {
85
109
  mergedOptions = requestOptions;
86
110
  }
87
- var componentProps = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, mapped), fieldProps || {}), mergedOptions !== undefined ? {
111
+ var componentProps = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, mapped), formDisabled ? {
112
+ disabled: true
113
+ } : {}), overlayContained ? _defineProperty({}, popupContainerProp, 'self') : {}), contextFieldProps || {}), fieldProps || {}), mergedOptions !== undefined ? {
88
114
  options: mergedOptions
89
115
  } : {}), requestLoading ? {
90
116
  loading: true
@@ -114,10 +140,13 @@ export function createProFormField(config) {
114
140
  colProps: colProps,
115
141
  transform: transform,
116
142
  convertValue: convertValue,
143
+ valuePropName: valuePropName,
144
+ validateDebounce: validateDebounce,
145
+ valueType: valueType !== null && valueType !== void 0 ? valueType : defaultValueType,
117
146
  readonlyRender: renderReadonly ? function (value) {
118
147
  return renderReadonly(value);
119
148
  } : undefined,
120
- children: _jsx(Component, Object.assign({}, componentProps))
149
+ children: _jsx(MemoizedComponent, Object.assign({}, componentProps))
121
150
  });
122
151
  };
123
152
  // Outer component — handles auto-wrapping with ProFormDependency
@@ -139,4 +168,4 @@ export function createProFormField(config) {
139
168
  return MemoizedField;
140
169
  }
141
170
  export default createProFormField;
142
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvUHJvRm9ybS9maWVsZHMvY3JlYXRlUHJvRm9ybUZpZWxkLmpzIiwiY29tcG9uZW50cy9Qcm9Gb3JtL3NyYy9jb21wb25lbnRzL1Byb0Zvcm0vZmllbGRzL2NyZWF0ZVByb0Zvcm1GaWVsZC50c3giXSwibmFtZXMiOlsiX19yZXN0IiwicyIsImUiLCJ0IiwicCIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImluZGV4T2YiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJpIiwibGVuZ3RoIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJqc3giLCJfanN4IiwibWVtbyIsInVzZURlYm91bmNlZENhbGxiYWNrIiwiUHJvRm9ybUl0ZW0iLCJQcm9Gb3JtRGVwZW5kZW5jeSIsInVzZUZpZWxkUmVxdWVzdCIsInJlc29sdmVXaWR0aCIsInZhbHVlRW51bVRvT3B0aW9ucyIsImNyZWF0ZVByb0Zvcm1GaWVsZCIsImNvbmZpZyIsIkNvbXBvbmVudCIsImNvbXBvbmVudCIsIm1hcFByb3BzIiwicmVuZGVyUmVhZG9ubHkiLCJJbm5lckZpZWxkIiwicHJvcHMiLCJfYSIsIl9iIiwibmFtZSIsImxhYmVsIiwiZGVzY3JpcHRpb24iLCJydWxlcyIsInJlcXVpcmVkIiwiZmVlZGJhY2siLCJ2YWxpZGF0ZVN0YXR1cyIsImNvbG9uIiwicmVhZG9ubHkiLCJtb2RlUHJvcCIsIm1vZGUiLCJoaWRkZW4iLCJjb2xQcm9wcyIsImZpZWxkUHJvcHMiLCJwbGFjZWhvbGRlciIsImRpc2FibGVkIiwid2lkdGgiLCJ0cmFuc2Zvcm0iLCJjb252ZXJ0VmFsdWUiLCJfZGVwcyIsImRlcGVuZGVuY2llcyIsInJlcXVlc3QiLCJwYXJhbXMiLCJ2YWx1ZUVudW0iLCJkZWJvdW5jZVRpbWUiLCJkZXBlbmRlbmNpZXNWYWx1ZXMiLCJyZXN0IiwicmVzb2x2ZWRNb2RlIiwidW5kZWZpbmVkIiwibWVyZ2VkUmVxdWVzdFBhcmFtcyIsImFzc2lnbiIsIl91c2VGaWVsZFJlcXVlc3QiLCJfdXNlRmllbGRSZXF1ZXN0MiIsIl9zbGljZWRUb0FycmF5IiwicmVxdWVzdExvYWRpbmciLCJyZXF1ZXN0T3B0aW9ucyIsIm1hcHBlZCIsInVzZXJPbkNoYW5nZSIsIm9uQ2hhbmdlIiwiX3VzZURlYm91bmNlZENhbGxiYWNrIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJkZWJvdW5jZWRPbkNoYW5nZSIsInJ1biIsIndpZHRoU3R5bGUiLCJmaWVsZFN0eWxlIiwic3R5bGUiLCJtZXJnZWRTdHlsZSIsIm1lcmdlZE9wdGlvbnMiLCJvcHRpb25zIiwiY29tcG9uZW50UHJvcHMiLCJsb2FkaW5nIiwicmVhZG9ubHlSZW5kZXIiLCJ2YWx1ZSIsImNoaWxkcmVuIiwiUHJvRm9ybUZpZWxkQ29tcG9uZW50IiwiZGVwVmFsdWVzIiwiTWVtb2l6ZWRGaWVsZCJdLCJtYXBwaW5ncyI6IjtBQUFBLElBQUlBLE1BQU0sR0FBSSxJQUFJLElBQUksSUFBSSxDQUFDQSxNQUFNLElBQUssVUFBVUMsQ0FBQyxFQUFFQyxDQUFDLEVBQUU7RUFDbEQsSUFBSUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNWLEtBQUssSUFBSUMsQ0FBQyxJQUFJSCxDQUFDLEVBQUUsSUFBSUksTUFBTSxDQUFDQyxTQUFTLENBQUNDLGNBQWMsQ0FBQ0MsSUFBSSxDQUFDUCxDQUFDLEVBQUVHLENBQUMsQ0FBQyxJQUFJRixDQUFDLENBQUNPLE9BQU8sQ0FBQ0wsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUMvRUQsQ0FBQyxDQUFDQyxDQUFDLENBQUMsR0FBR0gsQ0FBQyxDQUFDRyxDQUFDLENBQUM7RUFDZixJQUFJSCxDQUFDLElBQUksSUFBSSxJQUFJLE9BQU9JLE1BQU0sQ0FBQ0sscUJBQXFCLEtBQUssVUFBVSxFQUMvRCxLQUFLLElBQUlDLENBQUMsR0FBRyxDQUFDLEVBQUVQLENBQUMsR0FBR0MsTUFBTSxDQUFDSyxxQkFBcUIsQ0FBQ1QsQ0FBQyxDQUFDLEVBQUVVLENBQUMsR0FBR1AsQ0FBQyxDQUFDUSxN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QUFxQixDQUFDO0VBQ2pELE9BQU9FLGFBQWE7QUFDdEI7QUFFQSxlQUFlbkUsa0JBQWtCIiwiZmlsZSI6ImNvbXBvbmVudHMvUHJvRm9ybS9maWVsZHMvY3JlYXRlUHJvRm9ybUZpZWxkLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fcmVzdCA9ICh0aGlzICYmIHRoaXMuX19yZXN0KSB8fCBmdW5jdGlvbiAocywgZSkge1xuICAgIHZhciB0ID0ge307XG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICAgIHRbcF0gPSBzW3BdO1xuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IG1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlRGVib3VuY2VkQ2FsbGJhY2sgZnJvbSAnQDFtb25leS9ob29rcy91c2VEZWJvdW5jZWRDYWxsYmFjayc7XG5pbXBvcnQgeyBQcm9Gb3JtSXRlbSB9IGZyb20gJy4uL1Byb0Zvcm1JdGVtJztcbmltcG9ydCB7IFByb0Zvcm1EZXBlbmRlbmN5IH0gZnJvbSAnLi4vUHJvRm9ybURlcGVuZGVuY3knO1xuaW1wb3J0IHsgdXNlRmllbGRSZXF1ZXN0IH0gZnJvbSAnLi4vaG9va3MvdXNlRmllbGRSZXF1ZXN0JztcbmltcG9ydCB7IHJlc29sdmVXaWR0aCwgdmFsdWVFbnVtVG9PcHRpb25zIH0gZnJvbSAnLi4vdXRpbHMnO1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBjcmVhdGVQcm9Gb3JtRmllbGQg4oCUIGZhY3RvcnkgdGhhdCBwcm9kdWNlcyBhIFByb0Zvcm0tYXdhcmUgZmllbGQgY29tcG9uZW50XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9Gb3JtRmllbGQoY29uZmlnKSB7XG4gICAgY29uc3QgeyBjb21wb25lbnQ6IENvbXBvbmVudCwgbWFwUHJvcHMsIHJlbmRlclJlYWRvbmx5LCB9ID0gY29uZmlnO1xuICAgIC8vIElubmVyIGNvbXBvbmVudCDigJQgaGFuZGxlcyBtb2RlLCByZXF1ZXN0LCB2YWx1ZUVudW0sIGRlYm91bmNlLCByZW5kZXJcbiAgICBjb25zdCBJbm5lckZpZWxkID0gKHByb3BzKSA9PiB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgX2IgPSBwcm9wcywgeyBuYW1lLCBsYWJlbCwgZGVzY3JpcHRpb24sIHJ1bGVzLCByZXF1aXJlZCwgZmVlZGJhY2ssIHZhbGlkYXRlU3RhdHVzLCBjb2xvbiwgcmVhZG9ubHksIG1vZGU6IG1vZGVQcm9wLCBoaWRkZW4sIGNvbFByb3BzLCBmaWVsZFByb3BzLCBwbGFjZWhvbGRlciwgZGlzYWJsZWQsIHdpZHRoLCB0cmFuc2Zvcm0sIGNvbnZlcnRWYWx1ZSwgXG4gICAgICAgIC8vIEZpZWxkLWxldmVsIGZlYXR1cmVzXG4gICAgICAgIGRlcGVuZGVuY2llczogX2RlcHMsIHJlcXVlc3QsIHBhcmFtcywgdmFsdWVFbnVtLCBkZWJvdW5jZVRpbWUsIGRlcGVuZGVuY2llc1ZhbHVlcyB9ID0gX2IsIHJlc3QgPSBfX3Jlc3QoX2IsIFtcIm5hbWVcIiwgXCJsYWJlbFwiLCBcImRlc2NyaXB0aW9uXCIsIFwicnVsZXNcIiwgXCJyZXF1aXJlZFwiLCBcImZlZWRiYWNrXCIsIFwidmFsaWRhdGVTdGF0dXNcIiwgXCJjb2xvblwiLCBcInJlYWRvbmx5XCIsIFwibW9kZVwiLCBcImhpZGRlblwiLCBcImNvbFByb3BzXCIsIFwiZmllbGRQcm9wc1wiLCBcInBsYWNlaG9sZGVyXCIsIFwiZGlzYWJsZWRcIiwgXCJ3aWR0aFwiLCBcInRyYW5zZm9ybVwiLCBcImNvbnZlcnRWYWx1ZVwiLCBcImRlcGVuZGVuY2llc1wiLCBcInJlcXVlc3RcIiwgXCJwYXJhbXNcIiwgXCJ2YWx1ZUVudW1cIiwgXCJkZWJvdW5jZVRpbWVcIiwgXCJkZXBlbmRlbmNpZXNWYWx1ZXNcIl0pO1xuICAgICAgICAvLyBNb2RlIHJlc29sdXRpb246IGV4cGxpY2l0IG1vZGUgPiBsZWdhY3kgcmVhZG9ubHkgPiBjdHgubW9kZSAoUHJvRm9ybUl0ZW0pXG4gICAgICAgIGNvbnN0IHJlc29sdmVkTW9kZSA9IG1vZGVQcm9wICE9PSBudWxsICYmIG1vZGVQcm9wICE9PSB2b2lkIDAgPyBtb2RlUHJvcCA6IChyZWFkb25seSAhPT0gdW5kZWZpbmVkID8gKHJlYWRvbmx5ID8gJ3JlYWQnIDogJ2VkaXQnKSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIC8vIOKUgOKUgCBGaWVsZC1sZXZlbCByZXF1ZXN0IOKUgOKUgFxuICAgICAgICBjb25zdCBtZXJnZWRSZXF1ZXN0UGFyYW1zID0gZGVwZW5kZW5jaWVzVmFsdWVzXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1zKSwgZGVwZW5kZW5jaWVzVmFsdWVzKSA6IHBhcmFtcztcbiAgICAgICAgY29uc3QgW3JlcXVlc3RMb2FkaW5nLCByZXF1ZXN0T3B0aW9uc10gPSB1c2VGaWVsZFJlcXVlc3QocmVxdWVzdCwgbWVyZ2VkUmVxdWVzdFBhcmFtcyk7XG4gICAgICAgIC8vIEJ1aWxkIHRoZSBmaWVsZCBjaGlsZFxuICAgICAgICBjb25zdCBtYXBwZWQgPSBtYXBQcm9wcyA/IG1hcFByb3BzKHJlc3QpIDoge307XG4gICAgICAgIC8vIOKUgOKUgCBEZWJvdW5jZSBvbkNoYW5nZSDilIDilIBcbiAgICAgICAgLy8gVGhlIGVmZmVjdGl2ZSBvbkNoYW5nZSBpcyB3aGF0ZXZlciBlbmRzIHVwIG9uIHRoZSBmaWVsZCAoZmllbGRQcm9wcyB3aW5zXG4gICAgICAgIC8vIG92ZXIgbWFwcGVkLCBtYXRjaGluZyB0aGUgc3ByZWFkIG9yZGVyIGJlbG93KS4gdXNlRGVib3VuY2VkQ2FsbGJhY2sgcmVhZHNcbiAgICAgICAgLy8gdGhlIGxhdGVzdCBjYWxsYmFjayBpbnRlcm5hbGx5LCBzbyB0aGUgd3JhcHBlciBuZXZlciBnb2VzIHN0YWxlIGFuZCB0aGVcbiAgICAgICAgLy8gcGVuZGluZyBjYWxsIGlzIGF1dG8tY2FuY2VsbGVkIG9uIHVubW91bnQuXG4gICAgICAgIGNvbnN0IHVzZXJPbkNoYW5nZSA9ICgoX2EgPSBmaWVsZFByb3BzID09PSBudWxsIHx8IGZpZWxkUHJvcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZpZWxkUHJvcHMub25DaGFuZ2UpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG1hcHBlZCA9PT0gbnVsbCB8fCBtYXBwZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1hcHBlZC5vbkNoYW5nZSk7XG4gICAgICAgIGNvbnN0IHsgcnVuOiBkZWJvdW5jZWRPbkNoYW5nZSB9ID0gdXNlRGVib3VuY2VkQ2FsbGJhY2soKC4uLmFyZ3MpID0+IHVzZXJPbkNoYW5nZSA9PT0gbnVsbCB8fCB1c2VyT25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHVzZXJPbkNoYW5nZSguLi5hcmdzKSwgZGVib3VuY2VUaW1lKTtcbiAgICAgICAgY29uc3Qgd2lkdGhTdHlsZSA9IHdpZHRoICE9PSB1bmRlZmluZWQgPyB7IHdpZHRoOiByZXNvbHZlV2lkdGgod2lkdGgpIH0gOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGZpZWxkU3R5bGUgPSBmaWVsZFByb3BzID09PSBudWxsIHx8IGZpZWxkUHJvcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZpZWxkUHJvcHMuc3R5bGU7XG4gICAgICAgIGNvbnN0IG1lcmdlZFN0eWxlID0gd2lkdGhTdHlsZVxuICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIChmaWVsZFN0eWxlIHx8IHt9KSksIHdpZHRoU3R5bGUpIDogZmllbGRTdHlsZTtcbiAgICAgICAgLy8gTWVyZ2UgdmFsdWVFbnVtICsgcmVxdWVzdCBvcHRpb25zIGludG8gZmllbGRQcm9wcy5vcHRpb25zXG4gICAgICAgIGxldCBtZXJnZWRPcHRpb25zID0gZmllbGRQcm9wcyA9PT0gbnVsbCB8fCBmaWVsZFByb3BzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmaWVsZFByb3BzLm9wdGlvbnM7XG4gICAgICAgIGlmICh2YWx1ZUVudW0pIHtcbiAgICAgICAgICAgIG1lcmdlZE9wdGlvbnMgPSB2YWx1ZUVudW1Ub09wdGlvbnModmFsdWVFbnVtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbWVyZ2VkT3B0aW9ucyA9IHJlcXVlc3RPcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFByb3BzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgbWFwcGVkKSwgKGZpZWxkUHJvcHMgfHwge30pKSwgKG1lcmdlZE9wdGlvbnMgIT09IHVuZGVmaW5lZCA/IHsgb3B0aW9uczogbWVyZ2VkT3B0aW9ucyB9IDoge30pKSwgKHJlcXVlc3RMb2FkaW5nID8geyBsb2FkaW5nOiB0cnVlIH0gOiB7fSkpLCAocGxhY2Vob2xkZXIgIT09IHVuZGVmaW5lZCA/IHsgcGxhY2Vob2xkZXIgfSA6IHt9KSksIChkaXNhYmxlZCAhPT0gdW5kZWZpbmVkID8geyBkaXNhYmxlZCB9IDoge30pKSwgKG1lcmdlZFN0eWxlID8geyBzdHlsZTogbWVyZ2VkU3R5bGUgfSA6IHt9KSk7XG4gICAgICAgIC8vIFdpcmUgZGVib3VuY2UuIFRoZSB3cmFwcGVyIGZvcndhcmRzIHRvIHRoZSBsYXRlc3QgdXNlciBvbkNoYW5nZSB2aWFcbiAgICAgICAgLy8gYG9uQ2hhbmdlTGF0ZXN0YCwgc28gbm8gbmVlZCB0byBzdGFzaCBpdCBvbiBhIHJlZiBoZXJlLlxuICAgICAgICBpZiAoZGVib3VuY2VUaW1lICYmIGRlYm91bmNlVGltZSA+IDApIHtcbiAgICAgICAgICAgIGNvbXBvbmVudFByb3BzLm9uQ2hhbmdlID0gZGVib3VuY2VkT25DaGFuZ2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChfanN4KFByb0Zvcm1JdGVtLCB7IG5hbWU6IG5hbWUsIGxhYmVsOiBsYWJlbCwgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uLCBydWxlczogcnVsZXMsIHJlcXVpcmVkOiByZXF1aXJlZCwgZmVlZGJhY2s6IGZlZWRiYWNrLCB2YWxpZGF0ZVN0YXR1czogdmFsaWRhdGVTdGF0dXMsIGNvbG9uOiBjb2xvbiwgaGlkZGVuOiBoaWRkZW4sIG1vZGU6IHJlc29sdmVkTW9kZSwgY29sUHJvcHM6IGNvbFByb3BzLCB0cmFuc2Zvcm06IHRyYW5zZm9ybSwgY29udmVydFZhbHVlOiBjb252ZXJ0VmFsdWUsIHJlYWRvbmx5UmVuZGVyOiByZW5kZXJSZWFkb25seSA/ICh2YWx1ZSkgPT4gcmVuZGVyUmVhZG9ubHkodmFsdWUpIDogdW5kZWZpbmVkLCBjaGlsZHJlbjogX2pzeChDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oe30sIGNvbXBvbmVudFByb3BzKSkgfSkpO1xuICAgIH07XG4gICAgLy8gT3V0ZXIgY29tcG9uZW50IOKAlCBoYW5kbGVzIGF1dG8td3JhcHBpbmcgd2l0aCBQcm9Gb3JtRGVwZW5kZW5jeVxuICAgIGNvbnN0IFByb0Zvcm1GaWVsZENvbXBvbmVudCA9IChwcm9wcykgPT4ge1xuICAgICAgICBjb25zdCB7IGRlcGVuZGVuY2llcyB9ID0gcHJvcHM7XG4gICAgICAgIGlmIChkZXBlbmRlbmNpZXMgJiYgZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiAoX2pzeChQcm9Gb3JtRGVwZW5kZW5jeSwgeyBuYW1lOiBkZXBlbmRlbmNpZXMsIGNoaWxkcmVuOiAoZGVwVmFsdWVzKSA9PiAoX2pzeChJbm5lckZpZWxkLCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywgeyBkZXBlbmRlbmNpZXNWYWx1ZXM6IGRlcFZhbHVlcyB9KSkpIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX2pzeChJbm5lckZpZWxkLCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcykpO1xuICAgIH07XG4gICAgY29uc3QgTWVtb2l6ZWRGaWVsZCA9IG1lbW8oUHJvRm9ybUZpZWxkQ29tcG9uZW50KTtcbiAgICByZXR1cm4gTWVtb2l6ZWRGaWVsZDtcbn1cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVByb0Zvcm1GaWVsZDsiLG51bGxdLCJzb3VyY2VSb290IjoiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjIn0=
171
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvUHJvRm9ybS9maWVsZHMvY3JlYXRlUHJvRm9ybUZpZWxkLmpzIiwiY29tcG9uZW50cy9Qcm9Gb3JtL3NyYy9jb21wb25lbnRzL1Byb0Zvcm0vZmllbGRzL2NyZWF0ZVByb0Zvcm1GaWVsZC50c3giXSwibmFtZXMiOlsiX19yZXN0IiwicyIsImUiLCJ0IiwicCIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImluZGV4T2YiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJpIiwibGVuZ3RoIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJqc3giLCJfanN4IiwibWVtbyIsInVzZURlYm91bmNlZENhbGxiYWNrIiwiUHJvRm9ybUl0ZW0iLCJQcm9Gb3JtRGVwZW5kZW5jeSIsInVzZVByb0Zvcm1TdGFibGUiLCJ1c2VGaWVsZFJlcXVlc3QiLCJyZXNvbHZlV2lkdGgiLCJ2YWx1ZUVudW1Ub09wdGlvbnMiLCJjcmVhdGVQcm9Gb3JtRmllbGQiLCJjb25maWciLCJDb21wb25lbnQiLCJjb21wb25lbnQiLCJ2YWx1ZVByb3BOYW1lIiwiZGVmYXVsdFZhbHVlVHlwZSIsInZhbHVlVHlwZSIsIm1hcFByb3BzIiwicmVuZGVyUmVhZG9ubHkiLCJwb3B1cENvbnRhaW5lclByb3AiLCJNZW1vaXplZENvbXBvbmVudCIsImRpc3BsYXlOYW1lIiwibmFtZSIsIklubmVyRmllbGQiLCJwcm9wcyIsIl9hIiwiX2IiLCJfYyIsImxhYmVsIiwiZGVzY3JpcHRpb24iLCJydWxlcyIsInJlcXVpcmVkIiwiZmVlZGJhY2siLCJ2YWxpZGF0ZVN0YXR1cyIsImNvbG9uIiwicmVhZG9ubHkiLCJtb2RlUHJvcCIsIm1vZGUiLCJoaWRkZW4iLCJjb2xQcm9wcyIsImZpZWxkUHJvcHMiLCJwbGFjZWhvbGRlciIsImRpc2FibGVkIiwid2lkdGgiLCJ0cmFuc2Zvcm0iLCJjb252ZXJ0VmFsdWUiLCJfZGVwcyIsImRlcGVuZGVuY2llcyIsInJlcXVlc3QiLCJwYXJhbXMiLCJ2YWx1ZUVudW0iLCJkZWJvdW5jZVRpbWUiLCJ2YWxpZGF0ZURlYm91bmNlIiwiZGVwZW5kZW5jaWVzVmFsdWVzIiwicmVzdCIsInJlc29sdmVkTW9kZSIsInVuZGVmaW5lZCIsIl91c2VQcm9Gb3JtU3RhYmxlIiwiY29udGV4dEZpZWxkUHJvcHMiLCJmb3JtRGlzYWJsZWQiLCJmb3JtQ29tcG9uZW50VHlwZSIsIm92ZXJsYXlDb250YWluZWQiLCJtZXJnZWRSZXF1ZXN0UGFyYW1zIiwiYXNzaWduIiwiX3VzZUZpZWxkUmVxdWVzdCIsIl91c2VGaWVsZFJlcXVlc3QyIiwiX3NsaWNlZFRvQXJyYXkiLCJyZXF1ZXN0TG9hZGluZyIsInJlcXVlc3RPcHRpb25zIiwibWFwcGVkIiwidXNlck9uQ2hhbmdlIiwib25DaGFuZ2UiLCJfdXNlRGVib3VuY2VkQ2FsbGJhY2siLCJhcHBseSIsImFyZ3VtZW50cyIsImRlYm91bmNlZE9uQ2hhbmdlIiwicnVuIiwid2lkdGhTdHlsZSIsImZpZWxkU3R5bGUiLCJzdHlsZSIsIm1lcmdlZFN0eWxlIiwibWVyZ2VkT3B0aW9ucyIsIm9wdGlvbnMiLCJjb21wb25lbnRQcm9wcyIsIl9kZWZpbmVQcm9wZXJ0eSIsImxvYWRpbmciLCJyZWFkb25seVJlbmRlciIsInZhbHVlIiwiY2hpbGRyZW4iLCJQcm9Gb3JtRmllbGRDb21wb25lbnQiLCJkZXBWYWx1ZXMiLCJNZW1vaXplZEZpZWxkIl0sIm1hcHBpbmdzIjoiOztBQUFBLElBQUlBLE1BQU0sR0FBSSxJQUFJLElBQUksSUFBSSxDQUFDQSxNQUFNLElBQUssVUFBVUMsQ0FBQyxFQUFFQyxDQUFDLEVBQUU7RUFDbEQsSUFBSUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNWLEtBQUssSUFBSUMsQ0FBQyxJQUFJSCxDQUFDLEVBQUUsSUFBSUksTUFBTSxDQUFDQyxTQUFTLENBQUNDLGNBQWMsQ0FBQ0MsSUFBSSxDQUFDUCxDQUFDLEVBQUVHLENBQUMsQ0FBQyxJQUFJRixDQUFDLENBQUNPLE9BQU8s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Q0FBQSxDQUM3QjtFQUVsQixDQUFDO0VBRUQ7RUFDQSxJQUFNTSxxQkFBcUIsR0FBc0MsU0FBM0RBLHFCQUFxQkEsQ0FBdUNqRSxLQUFLLEVBQUk7SUFDekUsSUFBUXVCLFlBQVksR0FBS3ZCLEtBQUssQ0FBdEJ1QixZQUFZO0lBRXBCLElBQUlBLFlBQVksSUFBSUEsWUFBWSxDQUFDakQsTUFBTSxHQUFHLENBQUMsRUFBRTtNQUMzQyxPQUNFRyxJQUFBLENBQUNJLGlCQUFpQixFQUFBO1FBQUNpQixJQUFJLEVBQUV5QixZQUFZO1FBQUF5QyxRQUFBLEVBQ2xDLFNBRGtDQSxRQUFBQSxDQUNqQ0UsU0FBUztVQUFBLE9BQ1R6RixJQUFBLENBQUNzQixVQUFVLEVBQUFoQyxNQUFBLENBQUF3RSxNQUFBLENBQUEsQ0FBQSxDQUFBLEVBQUt2QyxLQUFLLEVBQUE7WUFBRTZCLGtCQUFrQixFQUFFcUM7VUFBUyxDQUFBLENBQUEsQ0FBSTtRQUFBO01BQ3pELENBQUEsQ0FDaUI7SUFFeEI7SUFFQSxPQUFPekYsSUFBQSxDQUFDc0IsVUFBVSxFQUFBaEMsTUFBQSxDQUFBd0UsTUFBQSxDQUFBLENBQUEsQ0FBQSxFQUFLdkMsS0FBSyxDQUFBLENBQUk7RUFDbEMsQ0FBQztFQUVELElBQU1tRSxhQUFhLGdCQUFHekYsSUFBSSxDQUFDdUYscUJBQXFCLENBQUM7RUFDakQsT0FBT0UsYUFBYTtBQUN0QjtBQUVBLGVBQWVqRixrQkFBa0IiLCJmaWxlIjoiY29tcG9uZW50cy9Qcm9Gb3JtL2ZpZWxkcy9jcmVhdGVQcm9Gb3JtRmllbGQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX19yZXN0ID0gKHRoaXMgJiYgdGhpcy5fX3Jlc3QpIHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gICAgdmFyIHQgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gdDtcbn07XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgbWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VEZWJvdW5jZWRDYWxsYmFjayBmcm9tICdAMW1vbmV5L2hvb2tzL3VzZURlYm91bmNlZENhbGxiYWNrJztcbmltcG9ydCB7IFByb0Zvcm1JdGVtIH0gZnJvbSAnLi4vUHJvRm9ybUl0ZW0nO1xuaW1wb3J0IHsgUHJvRm9ybURlcGVuZGVuY3kgfSBmcm9tICcuLi9Qcm9Gb3JtRGVwZW5kZW5jeSc7XG5pbXBvcnQgeyB1c2VQcm9Gb3JtU3RhYmxlIH0gZnJvbSAnLi4vY29udGV4dCc7XG5pbXBvcnQgeyB1c2VGaWVsZFJlcXVlc3QgfSBmcm9tICcuLi9ob29rcy91c2VGaWVsZFJlcXVlc3QnO1xuaW1wb3J0IHsgcmVzb2x2ZVdpZHRoLCB2YWx1ZUVudW1Ub09wdGlvbnMgfSBmcm9tICcuLi91dGlscyc7XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIGNyZWF0ZVByb0Zvcm1GaWVsZCDigJQgZmFjdG9yeSB0aGF0IHByb2R1Y2VzIGEgUHJvRm9ybS1hd2FyZSBmaWVsZCBjb21wb25lbnRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb0Zvcm1GaWVsZChjb25maWcpIHtcbiAgICBjb25zdCB7IGNvbXBvbmVudDogQ29tcG9uZW50LCB2YWx1ZVByb3BOYW1lLCB2YWx1ZVR5cGU6IGRlZmF1bHRWYWx1ZVR5cGUsIG1hcFByb3BzLCByZW5kZXJSZWFkb25seSwgcG9wdXBDb250YWluZXJQcm9wLCB9ID0gY29uZmlnO1xuICAgIC8vIE1lbW8gYm91bmRhcnkgYXJvdW5kIHRoZSB3cmFwcGVkIGNvbnRyb2w6IGNvbWJpbmVkIHdpdGggdGhlIHN0YWJsZVxuICAgIC8vIGluamVjdGVkIGhhbmRsZXJzIGZyb20gdXNlRm9ybUl0ZW0sIGZpZWxkcyB3aG9zZSB2YWx1ZSBkaWRuJ3QgY2hhbmdlIGNhblxuICAgIC8vIGJhaWwgb3V0IHdoaWxlIGFub3RoZXIgZmllbGQgaW4gdGhlIGZvcm0gaXMgdHlwaW5nLiBkaXNwbGF5TmFtZSBtdXN0IGJlXG4gICAgLy8gY2FycmllZCBvdmVyIOKAlCBpbmplY3RGaWVsZCB1c2VzIGl0IHRvIHJlY29nbml6ZSBmb3JtIGNvbnRyb2xzLlxuICAgIGNvbnN0IE1lbW9pemVkQ29tcG9uZW50ID0gbWVtbyhDb21wb25lbnQpO1xuICAgIE1lbW9pemVkQ29tcG9uZW50LmRpc3BsYXlOYW1lID1cbiAgICAgICAgQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lO1xuICAgIC8vIElubmVyIGNvbXBvbmVudCDigJQgaGFuZGxlcyBtb2RlLCByZXF1ZXN0LCB2YWx1ZUVudW0sIGRlYm91bmNlLCByZW5kZXJcbiAgICBjb25zdCBJbm5lckZpZWxkID0gKHByb3BzKSA9PiB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IF9jID0gcHJvcHMsIHsgbmFtZSwgbGFiZWwsIGRlc2NyaXB0aW9uLCBydWxlcywgcmVxdWlyZWQsIGZlZWRiYWNrLCB2YWxpZGF0ZVN0YXR1cywgY29sb24sIHJlYWRvbmx5LCBtb2RlOiBtb2RlUHJvcCwgaGlkZGVuLCBjb2xQcm9wcywgZmllbGRQcm9wcywgcGxhY2Vob2xkZXIsIGRpc2FibGVkLCB3aWR0aCwgdHJhbnNmb3JtLCBjb252ZXJ0VmFsdWUsIFxuICAgICAgICAvLyBGaWVsZC1sZXZlbCBmZWF0dXJlc1xuICAgICAgICBkZXBlbmRlbmNpZXM6IF9kZXBzLCByZXF1ZXN0LCBwYXJhbXMsIHZhbHVlRW51bSwgZGVib3VuY2VUaW1lLCB2YWxpZGF0ZURlYm91bmNlLCB2YWx1ZVR5cGUsIGRlcGVuZGVuY2llc1ZhbHVlcyB9ID0gX2MsIHJlc3QgPSBfX3Jlc3QoX2MsIFtcIm5hbWVcIiwgXCJsYWJlbFwiLCBcImRlc2NyaXB0aW9uXCIsIFwicnVsZXNcIiwgXCJyZXF1aXJlZFwiLCBcImZlZWRiYWNrXCIsIFwidmFsaWRhdGVTdGF0dXNcIiwgXCJjb2xvblwiLCBcInJlYWRvbmx5XCIsIFwibW9kZVwiLCBcImhpZGRlblwiLCBcImNvbFByb3BzXCIsIFwiZmllbGRQcm9wc1wiLCBcInBsYWNlaG9sZGVyXCIsIFwiZGlzYWJsZWRcIiwgXCJ3aWR0aFwiLCBcInRyYW5zZm9ybVwiLCBcImNvbnZlcnRWYWx1ZVwiLCBcImRlcGVuZGVuY2llc1wiLCBcInJlcXVlc3RcIiwgXCJwYXJhbXNcIiwgXCJ2YWx1ZUVudW1cIiwgXCJkZWJvdW5jZVRpbWVcIiwgXCJ2YWxpZGF0ZURlYm91bmNlXCIsIFwidmFsdWVUeXBlXCIsIFwiZGVwZW5kZW5jaWVzVmFsdWVzXCJdKTtcbiAgICAgICAgLy8gTW9kZSByZXNvbHV0aW9uOiBleHBsaWNpdCBtb2RlID4gbGVnYWN5IHJlYWRvbmx5ID4gY3R4Lm1vZGUgKFByb0Zvcm1JdGVtKVxuICAgICAgICBjb25zdCByZXNvbHZlZE1vZGUgPSBtb2RlUHJvcCAhPT0gbnVsbCAmJiBtb2RlUHJvcCAhPT0gdm9pZCAwID8gbW9kZVByb3AgOiAocmVhZG9ubHkgIT09IHVuZGVmaW5lZCA/IChyZWFkb25seSA/ICdyZWFkJyA6ICdlZGl0JykgOiB1bmRlZmluZWQpO1xuICAgICAgICAvLyBGb3JtLWxldmVsIGZpZWxkUHJvcHMgKGxvd2VzdCBwcmlvcml0eSBhZnRlciBtYXBQcm9wcyBkZWZhdWx0cykuXG4gICAgICAgIC8vIFN0YWJsZSBzbGljZSBvbmx5IOKAlCB0aGUgZmllbGQgc2hlbGwgbXVzdCBOT1QgcmUtcmVuZGVyIHBlciBrZXlzdHJva2U7XG4gICAgICAgIC8vIHZhbHVlL2Vycm9yIHJlYWN0aXZpdHkgbGl2ZXMgaW5zaWRlIFByb0Zvcm1JdGVtLlxuICAgICAgICBjb25zdCB7IGZpZWxkUHJvcHM6IGNvbnRleHRGaWVsZFByb3BzLCBkaXNhYmxlZDogZm9ybURpc2FibGVkLCBmb3JtQ29tcG9uZW50VHlwZSwgfSA9IHVzZVByb0Zvcm1TdGFibGUoKTtcbiAgICAgICAgLy8gT3ZlcmxheSBmaWVsZHMgaW5zaWRlIGEgRGlhbG9nL0RyYXdlciBmb3JtIG1vdW50IHRoZWlyIHBvcHVwIG5leHQgdG9cbiAgICAgICAgLy8gdGhlIHRyaWdnZXIgKCdzZWxmJykgaW5zdGVhZCBvZiBkb2N1bWVudC5ib2R5LCBzbyBpdCBzY3JvbGxzIGFuZFxuICAgICAgICAvLyBzdGFja3Mgd2l0aCB0aGUgb3ZlcmxheSBjb250YWluZXIuXG4gICAgICAgIGNvbnN0IG92ZXJsYXlDb250YWluZWQgPSBwb3B1cENvbnRhaW5lclByb3AgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgKGZvcm1Db21wb25lbnRUeXBlID09PSAnRGlhbG9nRm9ybScgfHwgZm9ybUNvbXBvbmVudFR5cGUgPT09ICdEcmF3ZXJGb3JtJyk7XG4gICAgICAgIC8vIOKUgOKUgCBGaWVsZC1sZXZlbCByZXF1ZXN0IOKUgOKUgFxuICAgICAgICBjb25zdCBtZXJnZWRSZXF1ZXN0UGFyYW1zID0gZGVwZW5kZW5jaWVzVmFsdWVzXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1zKSwgZGVwZW5kZW5jaWVzVmFsdWVzKSA6IHBhcmFtcztcbiAgICAgICAgY29uc3QgW3JlcXVlc3RMb2FkaW5nLCByZXF1ZXN0T3B0aW9uc10gPSB1c2VGaWVsZFJlcXVlc3QocmVxdWVzdCwgbWVyZ2VkUmVxdWVzdFBhcmFtcyk7XG4gICAgICAgIC8vIEJ1aWxkIHRoZSBmaWVsZCBjaGlsZFxuICAgICAgICBjb25zdCBtYXBwZWQgPSBtYXBQcm9wcyA/IG1hcFByb3BzKHJlc3QpIDoge307XG4gICAgICAgIC8vIOKUgOKUgCBEZWJvdW5jZSBvbkNoYW5nZSDilIDilIBcbiAgICAgICAgLy8gVGhlIGVmZmVjdGl2ZSBvbkNoYW5nZSBpcyB3aGF0ZXZlciBlbmRzIHVwIG9uIHRoZSBmaWVsZCAoZmllbGRQcm9wcyB3aW5zXG4gICAgICAgIC8vIG92ZXIgbWFwcGVkLCBtYXRjaGluZyB0aGUgc3ByZWFkIG9yZGVyIGJlbG93KS4gdXNlRGVib3VuY2VkQ2FsbGJhY2sgcmVhZHNcbiAgICAgICAgLy8gdGhlIGxhdGVzdCBjYWxsYmFjayBpbnRlcm5hbGx5LCBzbyB0aGUgd3JhcHBlciBuZXZlciBnb2VzIHN0YWxlIGFuZCB0aGVcbiAgICAgICAgLy8gcGVuZGluZyBjYWxsIGlzIGF1dG8tY2FuY2VsbGVkIG9uIHVubW91bnQuXG4gICAgICAgIGNvbnN0IHVzZXJPbkNoYW5nZSA9ICgoX2IgPSAoX2EgPSBmaWVsZFByb3BzID09PSBudWxsIHx8IGZpZWxkUHJvcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZpZWxkUHJvcHMub25DaGFuZ2UpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGNvbnRleHRGaWVsZFByb3BzID09PSBudWxsIHx8IGNvbnRleHRGaWVsZFByb3BzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb250ZXh0RmllbGRQcm9wcy5vbkNoYW5nZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogbWFwcGVkID09PSBudWxsIHx8IG1hcHBlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbWFwcGVkLm9uQ2hhbmdlKTtcbiAgICAgICAgY29uc3QgeyBydW46IGRlYm91bmNlZE9uQ2hhbmdlIH0gPSB1c2VEZWJvdW5jZWRDYWxsYmFjaygoLi4uYXJncykgPT4gdXNlck9uQ2hhbmdlID09PSBudWxsIHx8IHVzZXJPbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdXNlck9uQ2hhbmdlKC4uLmFyZ3MpLCBkZWJvdW5jZVRpbWUpO1xuICAgICAgICBjb25zdCB3aWR0aFN0eWxlID0gd2lkdGggIT09IHVuZGVmaW5lZCA/IHsgd2lkdGg6IHJlc29sdmVXaWR0aCh3aWR0aCkgfSA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgZmllbGRTdHlsZSA9IGZpZWxkUHJvcHMgPT09IG51bGwgfHwgZmllbGRQcm9wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmllbGRQcm9wcy5zdHlsZTtcbiAgICAgICAgY29uc3QgbWVyZ2VkU3R5bGUgPSB3aWR0aFN0eWxlXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgKGZpZWxkU3R5bGUgfHwge30pKSwgd2lkdGhTdHlsZSkgOiBmaWVsZFN0eWxlO1xuICAgICAgICAvLyBNZXJnZSB2YWx1ZUVudW0gKyByZXF1ZXN0IG9wdGlvbnMgaW50byBmaWVsZFByb3BzLm9wdGlvbnNcbiAgICAgICAgbGV0IG1lcmdlZE9wdGlvbnMgPSBmaWVsZFByb3BzID09PSBudWxsIHx8IGZpZWxkUHJvcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZpZWxkUHJvcHMub3B0aW9ucztcbiAgICAgICAgaWYgKHZhbHVlRW51bSkge1xuICAgICAgICAgICAgbWVyZ2VkT3B0aW9ucyA9IHZhbHVlRW51bVRvT3B0aW9ucyh2YWx1ZUVudW0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBtZXJnZWRPcHRpb25zID0gcmVxdWVzdE9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcG9uZW50UHJvcHMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBtYXBwZWQpLCAoZm9ybURpc2FibGVkID8geyBkaXNhYmxlZDogdHJ1ZSB9IDoge30pKSwgKG92ZXJsYXlDb250YWluZWQgPyB7IFtwb3B1cENvbnRhaW5lclByb3BdOiAnc2VsZicgfSA6IHt9KSksIChjb250ZXh0RmllbGRQcm9wcyB8fCB7fSkpLCAoZmllbGRQcm9wcyB8fCB7fSkpLCAobWVyZ2VkT3B0aW9ucyAhPT0gdW5kZWZpbmVkID8geyBvcHRpb25zOiBtZXJnZWRPcHRpb25zIH0gOiB7fSkpLCAocmVxdWVzdExvYWRpbmcgPyB7IGxvYWRpbmc6IHRydWUgfSA6IHt9KSksIChwbGFjZWhvbGRlciAhPT0gdW5kZWZpbmVkID8geyBwbGFjZWhvbGRlciB9IDoge30pKSwgKGRpc2FibGVkICE9PSB1bmRlZmluZWQgPyB7IGRpc2FibGVkIH0gOiB7fSkpLCAobWVyZ2VkU3R5bGUgPyB7IHN0eWxlOiBtZXJnZWRTdHlsZSB9IDoge30pKTtcbiAgICAgICAgLy8gV2lyZSBkZWJvdW5jZS4gVGhlIHdyYXBwZXIgZm9yd2FyZHMgdG8gdGhlIGxhdGVzdCB1c2VyIG9uQ2hhbmdlIHZpYVxuICAgICAgICAvLyBgb25DaGFuZ2VMYXRlc3RgLCBzbyBubyBuZWVkIHRvIHN0YXNoIGl0IG9uIGEgcmVmIGhlcmUuXG4gICAgICAgIGlmIChkZWJvdW5jZVRpbWUgJiYgZGVib3VuY2VUaW1lID4gMCkge1xuICAgICAgICAgICAgY29tcG9uZW50UHJvcHMub25DaGFuZ2UgPSBkZWJvdW5jZWRPbkNoYW5nZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKF9qc3goUHJvRm9ybUl0ZW0sIHsgbmFtZTogbmFtZSwgbGFiZWw6IGxhYmVsLCBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24sIHJ1bGVzOiBydWxlcywgcmVxdWlyZWQ6IHJlcXVpcmVkLCBmZWVkYmFjazogZmVlZGJhY2ssIHZhbGlkYXRlU3RhdHVzOiB2YWxpZGF0ZVN0YXR1cywgY29sb246IGNvbG9uLCBoaWRkZW46IGhpZGRlbiwgbW9kZTogcmVzb2x2ZWRNb2RlLCBjb2xQcm9wczogY29sUHJvcHMsIHRyYW5zZm9ybTogdHJhbnNmb3JtLCBjb252ZXJ0VmFsdWU6IGNvbnZlcnRWYWx1ZSwgdmFsdWVQcm9wTmFtZTogdmFsdWVQcm9wTmFtZSwgdmFsaWRhdGVEZWJvdW5jZTogdmFsaWRhdGVEZWJvdW5jZSwgdmFsdWVUeXBlOiB2YWx1ZVR5cGUgIT09IG51bGwgJiYgdmFsdWVUeXBlICE9PSB2b2lkIDAgPyB2YWx1ZVR5cGUgOiBkZWZhdWx0VmFsdWVUeXBlLCByZWFkb25seVJlbmRlcjogcmVuZGVyUmVhZG9ubHkgPyAodmFsdWUpID0+IHJlbmRlclJlYWRvbmx5KHZhbHVlKSA6IHVuZGVmaW5lZCwgY2hpbGRyZW46IF9qc3goTWVtb2l6ZWRDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oe30sIGNvbXBvbmVudFByb3BzKSkgfSkpO1xuICAgIH07XG4gICAgLy8gT3V0ZXIgY29tcG9uZW50IOKAlCBoYW5kbGVzIGF1dG8td3JhcHBpbmcgd2l0aCBQcm9Gb3JtRGVwZW5kZW5jeVxuICAgIGNvbnN0IFByb0Zvcm1GaWVsZENvbXBvbmVudCA9IChwcm9wcykgPT4ge1xuICAgICAgICBjb25zdCB7IGRlcGVuZGVuY2llcyB9ID0gcHJvcHM7XG4gICAgICAgIGlmIChkZXBlbmRlbmNpZXMgJiYgZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiAoX2pzeChQcm9Gb3JtRGVwZW5kZW5jeSwgeyBuYW1lOiBkZXBlbmRlbmNpZXMsIGNoaWxkcmVuOiAoZGVwVmFsdWVzKSA9PiAoX2pzeChJbm5lckZpZWxkLCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywgeyBkZXBlbmRlbmNpZXNWYWx1ZXM6IGRlcFZhbHVlcyB9KSkpIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX2pzeChJbm5lckZpZWxkLCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcykpO1xuICAgIH07XG4gICAgY29uc3QgTWVtb2l6ZWRGaWVsZCA9IG1lbW8oUHJvRm9ybUZpZWxkQ29tcG9uZW50KTtcbiAgICByZXR1cm4gTWVtb2l6ZWRGaWVsZDtcbn1cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVByb0Zvcm1GaWVsZDsiLG51bGxdLCJzb3VyY2VSb290IjoiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjIn0=
@@ -2,6 +2,11 @@ import type { ProFormRequestOption } from '../interface';
2
2
  /**
3
3
  * Hook for async option fetching with param-based re-fetching.
4
4
  * Returns [loading, options].
5
+ *
6
+ * Race-safe: each fetch takes a sequence number
7
+ * and aborts the previous in-flight request — a stale response that resolves
8
+ * after a newer request never overwrites the newest options, and only the
9
+ * newest request controls `loading`.
5
10
  */
6
- export declare function useFieldRequest(request: ((params?: Record<string, unknown>) => Promise<ProFormRequestOption[]>) | undefined, params: Record<string, unknown> | undefined): [boolean, ProFormRequestOption[]];
11
+ export declare function useFieldRequest(request: ((params?: Record<string, unknown>, signal?: AbortSignal) => Promise<ProFormRequestOption[]>) | undefined, params: Record<string, unknown> | undefined): [boolean, ProFormRequestOption[]];
7
12
  export default useFieldRequest;
@@ -27,7 +27,7 @@ var __awaiter = this && this.__awaiter || function (thisArg, _arguments, P, gene
27
27
  step((generator = generator.apply(thisArg, _arguments || [])).next());
28
28
  });
29
29
  };
30
- import { useEffect } from 'react';
30
+ import { useEffect, useRef } from 'react';
31
31
  import useSafeState from '@1money/hooks/useSafeState';
32
32
  import useMemoizedFn from '@1money/hooks/useMemoizedFn';
33
33
  import useLatest from '@1money/hooks/useLatest';
@@ -35,6 +35,11 @@ import { stableSerialize } from '../utils';
35
35
  /**
36
36
  * Hook for async option fetching with param-based re-fetching.
37
37
  * Returns [loading, options].
38
+ *
39
+ * Race-safe: each fetch takes a sequence number
40
+ * and aborts the previous in-flight request — a stale response that resolves
41
+ * after a newer request never overwrites the newest options, and only the
42
+ * newest request controls `loading`.
38
43
  */
39
44
  export function useFieldRequest(request, params) {
40
45
  var _this = this;
@@ -48,10 +53,12 @@ export function useFieldRequest(request, params) {
48
53
  setOptions = _useSafeState4[1];
49
54
  // Always read the newest `request` without re-subscribing the effect below.
50
55
  var requestRef = useLatest(request);
56
+ var seqRef = useRef(0);
57
+ var abortRef = useRef(null);
51
58
  var serializedParams = stableSerialize(params);
52
59
  var fetchOptions = useMemoizedFn(function () {
53
60
  return __awaiter(_this, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
54
- var fn, result;
61
+ var _a, fn, controller, seq, result, isAbort, _t;
55
62
  return _regeneratorRuntime.wrap(function (_context) {
56
63
  while (1) switch (_context.prev = _context.next) {
57
64
  case 0:
@@ -62,31 +69,69 @@ export function useFieldRequest(request, params) {
62
69
  }
63
70
  return _context.abrupt("return");
64
71
  case 1:
72
+ (_a = abortRef.current) === null || _a === void 0 ? void 0 : _a.abort();
73
+ controller = new AbortController();
74
+ abortRef.current = controller;
75
+ seq = ++seqRef.current;
65
76
  setLoading(true);
66
77
  _context.prev = 2;
67
78
  _context.next = 3;
68
- return fn(params);
79
+ return fn(params, controller.signal);
69
80
  case 3:
70
81
  result = _context.sent;
82
+ if (!(seq !== seqRef.current)) {
83
+ _context.next = 4;
84
+ break;
85
+ }
86
+ return _context.abrupt("return");
87
+ case 4:
88
+ // superseded — discard
71
89
  if (Array.isArray(result)) {
72
90
  setOptions(result);
73
91
  }
74
- case 4:
75
- _context.prev = 4;
76
- setLoading(false);
77
- return _context.finish(4);
92
+ _context.next = 6;
93
+ break;
78
94
  case 5:
95
+ _context.prev = 5;
96
+ _t = _context["catch"](2);
97
+ // Superseded requests (our own aborts always land here via the seq
98
+ // mismatch) are swallowed. For the LATEST request, an AbortError can
99
+ // only come from a CONSUMER-side abort (e.g. AbortSignal.timeout) —
100
+ // also swallowed, mirroring fetch-cancellation conventions; genuine
101
+ // failures propagate.
102
+ isAbort = _t instanceof Error && _t.name === 'AbortError';
103
+ if (!(seq === seqRef.current && !isAbort)) {
104
+ _context.next = 6;
105
+ break;
106
+ }
107
+ throw _t;
108
+ case 6:
109
+ _context.prev = 6;
110
+ if (seq === seqRef.current) {
111
+ setLoading(false);
112
+ }
113
+ return _context.finish(6);
114
+ case 7:
79
115
  case "end":
80
116
  return _context.stop();
81
117
  }
82
- }, _callee, null, [[2,, 4, 5]]);
118
+ }, _callee, null, [[2, 5, 6, 7]]);
83
119
  }));
84
120
  });
85
121
  useEffect(function () {
86
122
  if (!requestRef.current) return;
87
123
  fetchOptions();
88
124
  }, [serializedParams]);
125
+ // Honor the cancellation contract on unmount: abort the in-flight request
126
+ // and bump the sequence so any late settle (result or error) is discarded.
127
+ useEffect(function () {
128
+ return function () {
129
+ var _a;
130
+ seqRef.current += 1;
131
+ (_a = abortRef.current) === null || _a === void 0 ? void 0 : _a.abort();
132
+ };
133
+ }, []);
89
134
  return [loading, options];
90
135
  }
91
136
  export default useFieldRequest;
92
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvUHJvRm9ybS9ob29rcy91c2VGaWVsZFJlcXVlc3QuanMiLCJjb21wb25lbnRzL1Byb0Zvcm0vc3JjL2NvbXBvbmVudHMvUHJvRm9ybS9ob29rcy91c2VGaWVsZFJlcXVlc3QudHMiXSwibmFtZXMiOlsiX19hd2FpdGVyIiwidGhpc0FyZyIsIl9hcmd1bWVudHMiLCJQIiwiZ2VuZXJhdG9yIiwiYWRvcHQiLCJ2YWx1ZSIsInJlc29sdmUiLCJQcm9taXNlIiwicmVqZWN0IiwiZnVsZmlsbGVkIiwic3RlcCIsIm5leHQiLCJlIiwicmVqZWN0ZWQiLCJyZXN1bHQiLCJkb25lIiwidGhlbiIsImFwcGx5IiwidXNlRWZmZWN0IiwidXNlU2FmZVN0YXRlIiwidXNlTWVtb2l6ZWRGbiIsInVzZUxhdGVzdCIsInN0YWJsZVNlcmlhbGl6ZSIsInVzZUZpZWxkUmVxdWVzdCIsInJlcXVlc3QiLCJwYXJhbXMiLCJfdGhpcyIsIl91c2VTYWZlU3RhdGUiLCJfdXNlU2FmZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5IiwibG9hZGluZyIsInNldExvYWRpbmciLCJfdXNlU2FmZVN0YXRlMyIsIl91c2VTYWZlU3RhdGU0Iiwib3B0aW9ucyIsInNldE9wdGlvbnMiLCJyZXF1ZXN0UmVmIiwic2VyaWFsaXplZFBhcmFtcyIsImZldGNoT3B0aW9ucyIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZSIsImZuIiwid3JhcCIsIl9jb250ZXh0IiwicHJldiIsImN1cnJlbnQiLCJhYnJ1cHQiLCJzZW50IiwiQXJyYXkiLCJpc0FycmF5IiwiZmluaXNoIiwic3RvcCJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFJQSxTQUFTLEdBQUksSUFBSSxJQUFJLElBQUksQ0FBQ0EsU0FBUyxJQUFLLFVBQVVDLE9BQU8sRUFBRUMsVUFBVSxFQUFFQyxDQUFDLEVBQUVDLFNBQVMsRUFBRTtFQUNyRixTQUFTQyxLQUFLQSxDQUFDQyxLQUFLLEVBQUU7SUFBRSxPQUFP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LENBQUMsSUFBSSxDQUFDO1lBQUNhLFFBQUEsQ0FBQUMsSUFBQTtZQUFBRCxRQUFBLENBQUFqQyxJQUFBO1lBRUEsT0FBTStCLEVBQUUsQ0FBQ2pCLE1BQU0sQ0FBQztVQUFBO1lBQXpCWCxNQUFNLEdBQUE4QixRQUFBLENBQUFJLElBQUE7WUFDWixJQUFJQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ3BDLE1BQU0sQ0FBQyxFQUFFO2NBQ3pCcUIsVUFBVSxDQUFDckIsTUFBTSxDQUFDO1lBQ3BCO1VBQUM7WUFBQThCLFFBQUEsQ0FBQUMsSUFBQTtZQUVEZCxVQUFVLENBQUMsS0FBSyxDQUFDO1lBQUMsT0FBQWEsUUFBQSxDQUFBTyxNQUFBO1VBQUE7VUFBQTtZQUFBLE9BQUFQLFFBQUEsQ0FBQVEsSUFBQTtRQUFBO01BQUEsR0FBQVgsT0FBQTtJQUFBLENBRXJCLEVBQUE7RUFBQSxFQUFDO0VBRUZ2QixTQUFTLENBQUMsWUFBSztJQUNiLElBQUksQ0FBQ2tCLFVBQVUsQ0FBQ1UsT0FBTyxFQUFFO0lBQ3pCUixZQUFZLENBQUEsQ0FBRTtFQUNoQixDQUFDLEVBQUUsQ0FBQ0QsZ0JBQWdCLENBQUMsQ0FBQztFQUV0QixPQUFPLENBQUNQLE9BQU8sRUFBRUksT0FBTyxDQUFDO0FBQzNCO0FBRUEsZUFBZVgsZUFBZSIsImZpbGUiOiJjb21wb25lbnRzL1Byb0Zvcm0vaG9va3MvdXNlRmllbGRSZXF1ZXN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlU2FmZVN0YXRlIGZyb20gJ0AxbW9uZXkvaG9va3MvdXNlU2FmZVN0YXRlJztcbmltcG9ydCB1c2VNZW1vaXplZEZuIGZyb20gJ0AxbW9uZXkvaG9va3MvdXNlTWVtb2l6ZWRGbic7XG5pbXBvcnQgdXNlTGF0ZXN0IGZyb20gJ0AxbW9uZXkvaG9va3MvdXNlTGF0ZXN0JztcbmltcG9ydCB7IHN0YWJsZVNlcmlhbGl6ZSB9IGZyb20gJy4uL3V0aWxzJztcbi8qKlxuICogSG9vayBmb3IgYXN5bmMgb3B0aW9uIGZldGNoaW5nIHdpdGggcGFyYW0tYmFzZWQgcmUtZmV0Y2hpbmcuXG4gKiBSZXR1cm5zIFtsb2FkaW5nLCBvcHRpb25zXS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUZpZWxkUmVxdWVzdChyZXF1ZXN0LCBwYXJhbXMpIHtcbiAgICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTYWZlU3RhdGUoZmFsc2UpO1xuICAgIGNvbnN0IFtvcHRpb25zLCBzZXRPcHRpb25zXSA9IHVzZVNhZmVTdGF0ZShbXSk7XG4gICAgLy8gQWx3YXlzIHJlYWQgdGhlIG5ld2VzdCBgcmVxdWVzdGAgd2l0aG91dCByZS1zdWJzY3JpYmluZyB0aGUgZWZmZWN0IGJlbG93LlxuICAgIGNvbnN0IHJlcXVlc3RSZWYgPSB1c2VMYXRlc3QocmVxdWVzdCk7XG4gICAgY29uc3Qgc2VyaWFsaXplZFBhcmFtcyA9IHN0YWJsZVNlcmlhbGl6ZShwYXJhbXMpO1xuICAgIGNvbnN0IGZldGNoT3B0aW9ucyA9IHVzZU1lbW9pemVkRm4oKCkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBmbiA9IHJlcXVlc3RSZWYuY3VycmVudDtcbiAgICAgICAgaWYgKCFmbilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgc2V0TG9hZGluZyh0cnVlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIGZuKHBhcmFtcyk7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgc2V0T3B0aW9ucyhyZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9KSk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0UmVmLmN1cnJlbnQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGZldGNoT3B0aW9ucygpO1xuICAgIH0sIFtzZXJpYWxpemVkUGFyYW1zXSk7XG4gICAgcmV0dXJuIFtsb2FkaW5nLCBvcHRpb25zXTtcbn1cbmV4cG9ydCBkZWZhdWx0IHVzZUZpZWxkUmVxdWVzdDsiLG51bGxdLCJzb3VyY2VSb290IjoiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjIn0=
137
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvUHJvRm9ybS9ob29rcy91c2VGaWVsZFJlcXVlc3QuanMiLCJjb21wb25lbnRzL1Byb0Zvcm0vc3JjL2NvbXBvbmVudHMvUHJvRm9ybS9ob29rcy91c2VGaWVsZFJlcXVlc3QudHMiXSwibmFtZXMiOlsiX19hd2FpdGVyIiwidGhpc0FyZyIsIl9hcmd1bWVudHMiLCJQIiwiZ2VuZXJhdG9yIiwiYWRvcHQiLCJ2YWx1ZSIsInJlc29sdmUiLCJQcm9taXNlIiwicmVqZWN0IiwiZnVsZmlsbGVkIiwic3RlcCIsIm5leHQiLCJlIiwicmVqZWN0ZWQiLCJyZXN1bHQiLCJkb25lIiwidGhlbiIsImFwcGx5IiwidXNlRWZmZWN0IiwidXNlUmVmIiwidXNlU2FmZVN0YXRlIiwidXNlTWVtb2l6ZWRGbiIsInVzZUxhdGVzdCIsInN0YWJsZVNlcmlhbGl6ZSIsInVzZUZpZWxkUmVxdWVzdCIsInJlcXVlc3QiLCJwYXJhbXMiLCJfdGhpcyIsIl91c2VTYWZlU3RhdGUiLCJfdXNlU2FmZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5IiwibG9hZGluZyIsInNldExvYWRpbmciLCJfdXNlU2FmZVN0YXRlMyIsIl91c2VTYWZlU3RhdGU0Iiwib3B0aW9ucyIsInNldE9wdGlvbnMiLCJyZXF1ZXN0UmVmIiwic2VxUmVmIiwiYWJvcnRSZWYiLCJzZXJpYWxpemVkUGFyYW1zIiwiZmV0Y2hPcHRpb25zIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwiX2EiLCJmbiIsImNvbnRyb2xsZXIiLCJzZXEiLCJpc0Fib3J0IiwiX3QiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwiY3VycmVudCIsImFicnVwdCIsImFib3J0IiwiQWJvcnRDb250cm9sbGVyIiwic2lnbmFsIiwic2VudCIsIkFycmF5IiwiaXNBcnJheSIsIkVycm9yIiwibmFtZSIsImZpbmlzaCIsInN0b3AiXSwibWFwcGluZ3MiOiI7O0FBQUEsSUFBSUEsU0FBUyxHQUFJLElBQUks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O0FBQzNCO0FBRUEsZUFBZVgsZUFBZSIsImZpbGUiOiJjb21wb25lbnRzL1Byb0Zvcm0vaG9va3MvdXNlRmllbGRSZXF1ZXN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VTYWZlU3RhdGUgZnJvbSAnQDFtb25leS9ob29rcy91c2VTYWZlU3RhdGUnO1xuaW1wb3J0IHVzZU1lbW9pemVkRm4gZnJvbSAnQDFtb25leS9ob29rcy91c2VNZW1vaXplZEZuJztcbmltcG9ydCB1c2VMYXRlc3QgZnJvbSAnQDFtb25leS9ob29rcy91c2VMYXRlc3QnO1xuaW1wb3J0IHsgc3RhYmxlU2VyaWFsaXplIH0gZnJvbSAnLi4vdXRpbHMnO1xuLyoqXG4gKiBIb29rIGZvciBhc3luYyBvcHRpb24gZmV0Y2hpbmcgd2l0aCBwYXJhbS1iYXNlZCByZS1mZXRjaGluZy5cbiAqIFJldHVybnMgW2xvYWRpbmcsIG9wdGlvbnNdLlxuICpcbiAqIFJhY2Utc2FmZTogZWFjaCBmZXRjaCB0YWtlcyBhIHNlcXVlbmNlIG51bWJlclxuICogYW5kIGFib3J0cyB0aGUgcHJldmlvdXMgaW4tZmxpZ2h0IHJlcXVlc3Qg4oCUIGEgc3RhbGUgcmVzcG9uc2UgdGhhdCByZXNvbHZlc1xuICogYWZ0ZXIgYSBuZXdlciByZXF1ZXN0IG5ldmVyIG92ZXJ3cml0ZXMgdGhlIG5ld2VzdCBvcHRpb25zLCBhbmQgb25seSB0aGVcbiAqIG5ld2VzdCByZXF1ZXN0IGNvbnRyb2xzIGBsb2FkaW5nYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUZpZWxkUmVxdWVzdChyZXF1ZXN0LCBwYXJhbXMpIHtcbiAgICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTYWZlU3RhdGUoZmFsc2UpO1xuICAgIGNvbnN0IFtvcHRpb25zLCBzZXRPcHRpb25zXSA9IHVzZVNhZmVTdGF0ZShbXSk7XG4gICAgLy8gQWx3YXlzIHJlYWQgdGhlIG5ld2VzdCBgcmVxdWVzdGAgd2l0aG91dCByZS1zdWJzY3JpYmluZyB0aGUgZWZmZWN0IGJlbG93LlxuICAgIGNvbnN0IHJlcXVlc3RSZWYgPSB1c2VMYXRlc3QocmVxdWVzdCk7XG4gICAgY29uc3Qgc2VxUmVmID0gdXNlUmVmKDApO1xuICAgIGNvbnN0IGFib3J0UmVmID0gdXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRQYXJhbXMgPSBzdGFibGVTZXJpYWxpemUocGFyYW1zKTtcbiAgICBjb25zdCBmZXRjaE9wdGlvbnMgPSB1c2VNZW1vaXplZEZuKCgpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBmbiA9IHJlcXVlc3RSZWYuY3VycmVudDtcbiAgICAgICAgaWYgKCFmbilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgKF9hID0gYWJvcnRSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFib3J0KCk7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgIGFib3J0UmVmLmN1cnJlbnQgPSBjb250cm9sbGVyO1xuICAgICAgICBjb25zdCBzZXEgPSArK3NlcVJlZi5jdXJyZW50O1xuICAgICAgICBzZXRMb2FkaW5nKHRydWUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgZm4ocGFyYW1zLCBjb250cm9sbGVyLnNpZ25hbCk7XG4gICAgICAgICAgICBpZiAoc2VxICE9PSBzZXFSZWYuY3VycmVudClcbiAgICAgICAgICAgICAgICByZXR1cm47IC8vIHN1cGVyc2VkZWQg4oCUIGRpc2NhcmRcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICBzZXRPcHRpb25zKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBTdXBlcnNlZGVkIHJlcXVlc3RzIChvdXIgb3duIGFib3J0cyBhbHdheXMgbGFuZCBoZXJlIHZpYSB0aGUgc2VxXG4gICAgICAgICAgICAvLyBtaXNtYXRjaCkgYXJlIHN3YWxsb3dlZC4gRm9yIHRoZSBMQVRFU1QgcmVxdWVzdCwgYW4gQWJvcnRFcnJvciBjYW5cbiAgICAgICAgICAgIC8vIG9ubHkgY29tZSBmcm9tIGEgQ09OU1VNRVItc2lkZSBhYm9ydCAoZS5nLiBBYm9ydFNpZ25hbC50aW1lb3V0KSDigJRcbiAgICAgICAgICAgIC8vIGFsc28gc3dhbGxvd2VkLCBtaXJyb3JpbmcgZmV0Y2gtY2FuY2VsbGF0aW9uIGNvbnZlbnRpb25zOyBnZW51aW5lXG4gICAgICAgICAgICAvLyBmYWlsdXJlcyBwcm9wYWdhdGUuXG4gICAgICAgICAgICBjb25zdCBpc0Fib3J0ID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcic7XG4gICAgICAgICAgICBpZiAoc2VxID09PSBzZXFSZWYuY3VycmVudCAmJiAhaXNBYm9ydCkge1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKHNlcSA9PT0gc2VxUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoIXJlcXVlc3RSZWYuY3VycmVudClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgZmV0Y2hPcHRpb25zKCk7XG4gICAgfSwgW3NlcmlhbGl6ZWRQYXJhbXNdKTtcbiAgICAvLyBIb25vciB0aGUgY2FuY2VsbGF0aW9uIGNvbnRyYWN0IG9uIHVubW91bnQ6IGFib3J0IHRoZSBpbi1mbGlnaHQgcmVxdWVzdFxuICAgIC8vIGFuZCBidW1wIHRoZSBzZXF1ZW5jZSBzbyBhbnkgbGF0ZSBzZXR0bGUgKHJlc3VsdCBvciBlcnJvcikgaXMgZGlzY2FyZGVkLlxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICBzZXFSZWYuY3VycmVudCArPSAxO1xuICAgICAgICAgICAgKF9hID0gYWJvcnRSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFib3J0KCk7XG4gICAgICAgIH07XG4gICAgfSwgW10pO1xuICAgIHJldHVybiBbbG9hZGluZywgb3B0aW9uc107XG59XG5leHBvcnQgZGVmYXVsdCB1c2VGaWVsZFJlcXVlc3Q7IixudWxsXSwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYyJ9
@@ -0,0 +1,16 @@
1
+ export type ProFormSyncToUrl = boolean | ((values: Record<string, unknown>, type: 'get' | 'set') => Record<string, unknown>);
2
+ export interface UseUrlSyncOptions {
3
+ syncToUrl?: ProFormSyncToUrl;
4
+ /** Extra params always written to the URL alongside the form values. */
5
+ extraUrlParams?: Record<string, unknown>;
6
+ }
7
+ export interface UseUrlSyncResult {
8
+ /** URL params captured at mount (after the `'get'` mapping) — merge into initialValues. */
9
+ urlInitialValues: Record<string, unknown>;
10
+ /** Write submitted values (+ extraUrlParams) into the URL. */
11
+ onUrlSyncFinish: (finalValues: Record<string, unknown>) => void;
12
+ /** Clear this form's own params; foreign params and extraUrlParams survive. */
13
+ onUrlSyncReset: () => void;
14
+ }
15
+ export declare function useUrlSync({ syncToUrl, extraUrlParams }: UseUrlSyncOptions): UseUrlSyncResult;
16
+ export default useUrlSync;
@@ -0,0 +1,170 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import { useEffect, useRef } from 'react';
3
+ import useMemoizedFn from '@1money/hooks/useMemoizedFn';
4
+ import { stableSerialize } from '../utils';
5
+ function getUrlParams() {
6
+ if (typeof window === 'undefined') return {};
7
+ var params = {};
8
+ new URLSearchParams(window.location.search).forEach(function (v, k) {
9
+ params[k] = v;
10
+ });
11
+ return params;
12
+ }
13
+ /**
14
+ * Write the given values into the URL while PRESERVING unrelated query params.
15
+ * Only keys in `managedKeys` are cleared before writing. Returns the new set
16
+ * of managed keys.
17
+ */
18
+ function setUrlParams(params, managedKeys) {
19
+ if (typeof window === 'undefined') return new Set(managedKeys);
20
+ var sp = new URLSearchParams(window.location.search);
21
+ managedKeys.forEach(function (k) {
22
+ return sp["delete"](k);
23
+ });
24
+ var written = new Set();
25
+ for (var _i = 0, _Object$entries = Object.entries(params); _i < _Object$entries.length; _i++) {
26
+ var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
27
+ k = _Object$entries$_i[0],
28
+ v = _Object$entries$_i[1];
29
+ if (v !== null && v !== undefined && v !== '') {
30
+ sp.set(k, String(v));
31
+ written.add(k);
32
+ }
33
+ }
34
+ var search = sp.toString();
35
+ // PRESERVE the hash — hash routers keep their whole route there; dropping
36
+ // it would navigate the SPA away on every write.
37
+ var url = (search ? "".concat(window.location.pathname, "?").concat(search) : window.location.pathname) + window.location.hash;
38
+ // Skip the history call when nothing changes — Safari throttles the
39
+ // history API, so identical rewrites are wasted budget.
40
+ var currentUrl = "".concat(window.location.pathname).concat(window.location.search).concat(window.location.hash);
41
+ if (url !== currentUrl) {
42
+ window.history.replaceState(null, '', url);
43
+ }
44
+ return written;
45
+ }
46
+ export function useUrlSync(_ref) {
47
+ var syncToUrl = _ref.syncToUrl,
48
+ extraUrlParams = _ref.extraUrlParams;
49
+ // One-time mount snapshot. Lazy ref init is IDEMPOTENT, so it is safe under
50
+ // StrictMode's double render (an impure "first run" flag inside useMemo
51
+ // would return the unmerged value on the replay invocation).
52
+ var urlParamsAtMountRef = useRef(null);
53
+ if (urlParamsAtMountRef.current === null) {
54
+ urlParamsAtMountRef.current = syncToUrl ? getUrlParams() : {};
55
+ }
56
+ // The route this form mounted on. All deferred URL writes are guarded by
57
+ // it: an onFinish that NAVIGATES must not get the old form's params
58
+ // stamped onto the new route's URL. The pathname check covers path
59
+ // routers; the activeRef covers any navigation that UNMOUNTS the form
60
+ // (including hash routers, where the pathname never changes).
61
+ var mountPathnameRef = useRef(typeof window === 'undefined' ? '' : window.location.pathname);
62
+ var activeRef = useRef(true);
63
+ useEffect(function () {
64
+ activeRef.current = true;
65
+ return function () {
66
+ activeRef.current = false;
67
+ };
68
+ }, []);
69
+ var isWritable = function isWritable() {
70
+ return activeRef.current && typeof window !== 'undefined' && window.location.pathname === mountPathnameRef.current;
71
+ };
72
+ // Keys this form has WRITTEN to the URL — the only keys submit/reset may clear.
73
+ var managedKeysRef = useRef(new Set());
74
+ // Boolean-mode only: URL params merged into initialValues but NOT yet
75
+ // claimed (they may belong to someone else, e.g. `?tab=…`).
76
+ var urlSeededRef = useRef({});
77
+ var urlInitialValuesRef = useRef(null);
78
+ if (urlInitialValuesRef.current === null) {
79
+ if (!syncToUrl) {
80
+ urlInitialValuesRef.current = {};
81
+ } else if (typeof syncToUrl === 'function') {
82
+ var fromUrl = syncToUrl(urlParamsAtMountRef.current, 'get');
83
+ // Idempotent ref writes — same input on every invocation.
84
+ managedKeysRef.current = new Set(Object.keys(fromUrl));
85
+ urlInitialValuesRef.current = fromUrl;
86
+ } else {
87
+ urlSeededRef.current = Object.assign({}, urlParamsAtMountRef.current);
88
+ urlInitialValuesRef.current = Object.assign({}, urlParamsAtMountRef.current);
89
+ }
90
+ }
91
+ var writeValues = useMemoizedFn(function (values) {
92
+ if (!syncToUrl || !isWritable()) return;
93
+ var toWrite;
94
+ var toClear = new Set(managedKeysRef.current);
95
+ if (typeof syncToUrl === 'function') {
96
+ // extraUrlParams bypass the consumer's mapper ("always written"): they
97
+ // form the base and the mapper's output wins on key collisions.
98
+ toWrite = Object.assign(Object.assign({}, extraUrlParams), syncToUrl(values, 'set'));
99
+ } else {
100
+ // Skip URL-seeded keys we never wrote whose value is unchanged — they
101
+ // may belong to someone else; leave them in the URL untouched. A seeded
102
+ // key whose value DID change is claimed from now on.
103
+ toWrite = {};
104
+ for (var _i2 = 0, _Object$entries2 = Object.entries(values); _i2 < _Object$entries2.length; _i2++) {
105
+ var _Object$entries2$_i = _slicedToArray(_Object$entries2[_i2], 2),
106
+ key = _Object$entries2$_i[0],
107
+ value = _Object$entries2$_i[1];
108
+ var seeded = urlSeededRef.current[key];
109
+ if (seeded !== undefined && !managedKeysRef.current.has(key) && String(value) === seeded) {
110
+ continue;
111
+ }
112
+ delete urlSeededRef.current[key];
113
+ toClear.add(key);
114
+ toWrite[key] = value;
115
+ }
116
+ // Seeded keys missing from the submitted values were cleared by the
117
+ // user (omitNil strips empty values) — claim them and remove their
118
+ // stale params from the URL.
119
+ for (var _i3 = 0, _Object$keys = Object.keys(urlSeededRef.current); _i3 < _Object$keys.length; _i3++) {
120
+ var _key = _Object$keys[_i3];
121
+ if (!(_key in values)) {
122
+ delete urlSeededRef.current[_key];
123
+ toClear.add(_key);
124
+ }
125
+ }
126
+ }
127
+ managedKeysRef.current = setUrlParams(toWrite, toClear);
128
+ });
129
+ var onUrlSyncFinish = useMemoizedFn(function (finalValues) {
130
+ if (!syncToUrl) return;
131
+ // extraUrlParams are applied exactly once per branch: pre-merged here for
132
+ // the boolean form (values win on collision); the function form applies
133
+ // them AFTER the consumer's mapper inside writeValues, so the mapper
134
+ // never sees foreign keys in its input.
135
+ var shouldPreMerge = typeof syncToUrl !== 'function' && extraUrlParams;
136
+ writeValues(shouldPreMerge ? Object.assign(Object.assign({}, extraUrlParams), finalValues) : finalValues);
137
+ });
138
+ var onUrlSyncReset = useMemoizedFn(function () {
139
+ if (!syncToUrl || !isWritable()) return;
140
+ // Clear every managed key, then re-write extraUrlParams (they persist).
141
+ managedKeysRef.current = setUrlParams(Object.assign({}, extraUrlParams), managedKeysRef.current);
142
+ });
143
+ // Keep extraUrlParams in the URL as they change (value-compared). The
144
+ // previously-written extra keys are tracked so a key REMOVED from
145
+ // extraUrlParams is also removed from the URL — not just overwritten.
146
+ var extraKeysRef = useRef(new Set());
147
+ var serializedExtra = syncToUrl ? stableSerialize(extraUrlParams) : '';
148
+ useEffect(function () {
149
+ if (!syncToUrl || !isWritable()) return;
150
+ var next = extraUrlParams !== null && extraUrlParams !== void 0 ? extraUrlParams : {};
151
+ if (extraKeysRef.current.size === 0 && Object.keys(next).length === 0) return;
152
+ var written = setUrlParams(Object.assign({}, next), extraKeysRef.current);
153
+ var merged = new Set(managedKeysRef.current);
154
+ extraKeysRef.current.forEach(function (key) {
155
+ if (!written.has(key)) merged["delete"](key);
156
+ });
157
+ written.forEach(function (key) {
158
+ return merged.add(key);
159
+ });
160
+ managedKeysRef.current = merged;
161
+ extraKeysRef.current = written;
162
+ }, [serializedExtra]);
163
+ return {
164
+ urlInitialValues: urlInitialValuesRef.current,
165
+ onUrlSyncFinish: onUrlSyncFinish,
166
+ onUrlSyncReset: onUrlSyncReset
167
+ };
168
+ }
169
+ export default useUrlSync;
170
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvUHJvRm9ybS9zcmMvY29tcG9uZW50cy9Qcm9Gb3JtL2hvb2tzL3VzZVVybFN5bmMudHMiLCJjb21wb25lbnRzL1Byb0Zvcm0vaG9va3MvdXNlVXJsU3luYy5qcyJdLCJuYW1lcyI6WyJ1c2VFZmZlY3QiLCJ1c2VSZWYiLCJ1c2VNZW1vaXplZEZuIiwic3RhYmxlU2VyaWFsaXplIiwiZ2V0VXJsUGFyYW1zIiwid2luZG93IiwicGFyYW1zIiwiVVJMU2VhcmNoUGFyYW1zIiwibG9jYXRpb24iLCJzZWFyY2giLCJmb3JFYWNoIiwidiIsImsiLCJzZXRVcmxQYXJhbXMiLCJtYW5hZ2VkS2V5cyIsIlNldCIsInNwIiwid3JpdHRlbiIsIl9pIiwiX09iamVjdCRlbnRyaWVzIiwiT2JqZWN0IiwiZW50cmllcyIsImxlbmd0aCIsIl9PYmplY3QkZW50cmllcyRfaSIsIl9zbGljZWRUb0FycmF5IiwidW5kZWZpbmVkIiwic2V0IiwiU3RyaW5nIiwiYWRkIiwidG9TdHJpbmciLCJ1cmwiLCJjb25jYXQiLCJwYXRobmFtZSIsImhhc2giLCJjdXJyZW50VXJsIiwiaGlzdG9yeSIsInJlcGxhY2VTdGF0ZSIsInVzZVVybFN5bmMiLCJfcmVmIiwic3luY1RvVXJsIiwiZXh0cmFVcmxQYXJhbXMiLCJ1cmxQYXJhbXNBdE1vdW50UmVmIiwiY3VycmVudCIsIm1vdW50UGF0aG5hbWVSZWYiLCJhY3RpdmVSZWYiLCJpc1dyaXRhYmxlIiwibWFuYWdlZEtleXNSZWYiLCJ1cmxTZWVkZWRSZWYiLCJ1cmxJbml0aWFsVmFsdWVzUmVmIiwiZnJvbVVybCIsImtleXMiLCJhc3NpZ24iLCJ3cml0ZVZhbHVlcyIsInZhbHVlcyIsInRvV3JpdGUiLCJ0b0NsZWFyIiwiX2kyIiwiX09iamVjdCRlbnRyaWVzMiIsIl9PYmplY3QkZW50cmllczIkX2kiLCJrZXkiLCJ2YWx1ZSIsInNlZWRlZCIsImhhcyIsIl9pMyIsIl9PYmplY3Qka2V5cyIsIm9uVXJsU3luY0ZpbmlzaCIsImZpbmFsVmFsdWVzIiwic2hvdWxkUHJlTWVyZ2UiLCJvblVybFN5bmNSZXNldCIsImV4dHJhS2V5c1JlZiIsInNlcmlhbGl6ZWRFeHRyYSIsIm5leHQiLCJzaXplIiwibWVyZ2VkIiwidXJsSW5pdGlhbFZhbHVlcyJdLCJtYXBwaW5ncyI6IjtBQUFBLFNBQVNBLFNBQVMsRUFBRUMsTUFBTSxRQUFRLE9BQU87QUFDekMsT0FBT0MsYUFBYSxNQUFNLDZCQUE2QjtBQUN2RCxTQUFTQyxlQUFlLFFBQVEsVUFBVTtBQWlCMUMsU0FBU0MsWUFBWUEsQ0FBQSxFQUFBO0VBQ25CLElBQUksT0FBT0MsTUFBTSxLQUFLLFdBQVcsRUFBRSxPQUFPLENBQUEsQ0FBRTtFQUM1QyxJQUFNQyxNQUFNLEdBQTJCLENBQUEsQ0FBRTtFQUN6QyxJQUFJQyxlQUFlLENBQUNGLE1BQU0sQ0FBQ0csUUFBUSxDQUFDQyxNQUFNLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLFVBQUNDLENBQUMsRUFBRUMsQ0FBQyxFQUFJO0lBQzNETixNQUFNLENBQUNNLENBQUMsQ0FBQyxHQUFHRCxDQUFDO0VBQ2YsQ0FBQyxDQUFDO0VBQ0YsT0FBT0wsTUFBTTtBQUNmO0FBRUE7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBRGlCQSxTQUFTTyxZQUFZQSxDQUNuQlAsTUFBK0IsRUFDL0JRLFdBQWdDLEVBQUE7RUFFaEMsSUFBSSxPQUFPVCxNQUFNLEtBQUssV0FBVyxFQUFFLE9BQU8sSUFBSVUsR0FBRyxDQUFDRCxXQUFXLENBQUM7RUFDOUQsSUFBTUUsRUFBRSxHQUFHLElBQUlULGVBQWUsQ0FBQ0YsTUFBTSxDQUFDRyxRQUFRLENBQUNDLE1BQU0sQ0FBQztFQUN0REssV0FBVyxDQUFDSixPQUFPLENBQUMsVUFBQ0UsQ0FBQztJQUFBLE9BQUtJLEVBQUUsVUFBTyxDQUFDSixDQUFDLENBQUM7RUFBQSxFQUFDO0VBRXhDLElBQU1LLE9BQU8sR0FBRyxJQUFJRixHQUFHLENBQUEsQ0FBVTtFQUNqQyxTQUFBRyxFQUFBLE1BQUFDLGVBQUEsR0FBcUJDLE1BQU0s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ZUFBZS9CLFVBQVUiLCJmaWxlIjoiY29tcG9uZW50cy9Qcm9Gb3JtL2hvb2tzL3VzZVVybFN5bmMuanMiLCJzb3VyY2VzQ29udGVudCI6W251bGwsImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZU1lbW9pemVkRm4gZnJvbSAnQDFtb25leS9ob29rcy91c2VNZW1vaXplZEZuJztcbmltcG9ydCB7IHN0YWJsZVNlcmlhbGl6ZSB9IGZyb20gJy4uL3V0aWxzJztcbmZ1bmN0aW9uIGdldFVybFBhcmFtcygpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHJldHVybiB7fTtcbiAgICBjb25zdCBwYXJhbXMgPSB7fTtcbiAgICBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmZvckVhY2goKHYsIGspID0+IHtcbiAgICAgICAgcGFyYW1zW2tdID0gdjtcbiAgICB9KTtcbiAgICByZXR1cm4gcGFyYW1zO1xufVxuLyoqXG4gKiBXcml0ZSB0aGUgZ2l2ZW4gdmFsdWVzIGludG8gdGhlIFVSTCB3aGlsZSBQUkVTRVJWSU5HIHVucmVsYXRlZCBxdWVyeSBwYXJhbXMuXG4gKiBPbmx5IGtleXMgaW4gYG1hbmFnZWRLZXlzYCBhcmUgY2xlYXJlZCBiZWZvcmUgd3JpdGluZy4gUmV0dXJucyB0aGUgbmV3IHNldFxuICogb2YgbWFuYWdlZCBrZXlzLlxuICovXG5mdW5jdGlvbiBzZXRVcmxQYXJhbXMocGFyYW1zLCBtYW5hZ2VkS2V5cykge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJylcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQobWFuYWdlZEtleXMpO1xuICAgIGNvbnN0IHNwID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICBtYW5hZ2VkS2V5cy5mb3JFYWNoKChrKSA9PiBzcC5kZWxldGUoaykpO1xuICAgIGNvbnN0IHdyaXR0ZW4gPSBuZXcgU2V0KCk7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMocGFyYW1zKSkge1xuICAgICAgICBpZiAodiAhPT0gbnVsbCAmJiB2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gJycpIHtcbiAgICAgICAgICAgIHNwLnNldChrLCBTdHJpbmcodikpO1xuICAgICAgICAgICAgd3JpdHRlbi5hZGQoayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc2VhcmNoID0gc3AudG9TdHJpbmcoKTtcbiAgICAvLyBQUkVTRVJWRSB0aGUgaGFzaCDigJQgaGFzaCByb3V0ZXJzIGtlZXAgdGhlaXIgd2hvbGUgcm91dGUgdGhlcmU7IGRyb3BwaW5nXG4gICAgLy8gaXQgd291bGQgbmF2aWdhdGUgdGhlIFNQQSBhd2F5IG9uIGV2ZXJ5IHdyaXRlLlxuICAgIGNvbnN0IHVybCA9IChzZWFyY2ggPyBgJHt3aW5kb3cubG9jYXRpb24ucGF0aG5hbWV9PyR7c2VhcmNofWAgOiB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpICtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2g7XG4gICAgLy8gU2tpcCB0aGUgaGlzdG9yeSBjYWxsIHdoZW4gbm90aGluZyBjaGFuZ2VzIOKAlCBTYWZhcmkgdGhyb3R0bGVzIHRoZVxuICAgIC8vIGhpc3RvcnkgQVBJLCBzbyBpZGVudGljYWwgcmV3cml0ZXMgYXJlIHdhc3RlZCBidWRnZXQuXG4gICAgY29uc3QgY3VycmVudFVybCA9IGAke3dpbmRvdy5sb2NhdGlvbi5wYXRobmFtZX0ke3dpbmRvdy5sb2NhdGlvbi5zZWFyY2h9JHt3aW5kb3cubG9jYXRpb24uaGFzaH1gO1xuICAgIGlmICh1cmwgIT09IGN1cnJlbnRVcmwpIHtcbiAgICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsICcnLCB1cmwpO1xuICAgIH1cbiAgICByZXR1cm4gd3JpdHRlbjtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1c2VVcmxTeW5jKHsgc3luY1RvVXJsLCBleHRyYVVybFBhcmFtcyB9KSB7XG4gICAgLy8gT25lLXRpbWUgbW91bnQgc25hcHNob3QuIExhenkgcmVmIGluaXQgaXMgSURFTVBPVEVOVCwgc28gaXQgaXMgc2FmZSB1bmRlclxuICAgIC8vIFN0cmljdE1vZGUncyBkb3VibGUgcmVuZGVyIChhbiBpbXB1cmUgXCJmaXJzdCBydW5cIiBmbGFnIGluc2lkZSB1c2VNZW1vXG4gICAgLy8gd291bGQgcmV0dXJuIHRoZSB1bm1lcmdlZCB2YWx1ZSBvbiB0aGUgcmVwbGF5IGludm9jYXRpb24pLlxuICAgIGNvbnN0IHVybFBhcmFtc0F0TW91bnRSZWYgPSB1c2VSZWYobnVsbCk7XG4gICAgaWYgKHVybFBhcmFtc0F0TW91bnRSZWYuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgICB1cmxQYXJhbXNBdE1vdW50UmVmLmN1cnJlbnQgPSBzeW5jVG9VcmwgPyBnZXRVcmxQYXJhbXMoKSA6IHt9O1xuICAgIH1cbiAgICAvLyBUaGUgcm91dGUgdGhpcyBmb3JtIG1vdW50ZWQgb24uIEFsbCBkZWZlcnJlZCBVUkwgd3JpdGVzIGFyZSBndWFyZGVkIGJ5XG4gICAgLy8gaXQ6IGFuIG9uRmluaXNoIHRoYXQgTkFWSUdBVEVTIG11c3Qgbm90IGdldCB0aGUgb2xkIGZvcm0ncyBwYXJhbXNcbiAgICAvLyBzdGFtcGVkIG9udG8gdGhlIG5ldyByb3V0ZSdzIFVSTC4gVGhlIHBhdGhuYW1lIGNoZWNrIGNvdmVycyBwYXRoXG4gICAgLy8gcm91dGVyczsgdGhlIGFjdGl2ZVJlZiBjb3ZlcnMgYW55IG5hdmlnYXRpb24gdGhhdCBVTk1PVU5UUyB0aGUgZm9ybVxuICAgIC8vIChpbmNsdWRpbmcgaGFzaCByb3V0ZXJzLCB3aGVyZSB0aGUgcGF0aG5hbWUgbmV2ZXIgY2hhbmdlcykuXG4gICAgY29uc3QgbW91bnRQYXRobmFtZVJlZiA9IHVzZVJlZih0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/ICcnIDogd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICBjb25zdCBhY3RpdmVSZWYgPSB1c2VSZWYodHJ1ZSk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgYWN0aXZlUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgYWN0aXZlUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgfTtcbiAgICB9LCBbXSk7XG4gICAgY29uc3QgaXNXcml0YWJsZSA9ICgpID0+IGFjdGl2ZVJlZi5jdXJyZW50ICYmXG4gICAgICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSA9PT0gbW91bnRQYXRobmFtZVJlZi5jdXJyZW50O1xuICAgIC8vIEtleXMgdGhpcyBmb3JtIGhhcyBXUklUVEVOIHRvIHRoZSBVUkwg4oCUIHRoZSBvbmx5IGtleXMgc3VibWl0L3Jlc2V0IG1heSBjbGVhci5cbiAgICBjb25zdCBtYW5hZ2VkS2V5c1JlZiA9IHVzZVJlZihuZXcgU2V0KCkpO1xuICAgIC8vIEJvb2xlYW4tbW9kZSBvbmx5OiBVUkwgcGFyYW1zIG1lcmdlZCBpbnRvIGluaXRpYWxWYWx1ZXMgYnV0IE5PVCB5ZXRcbiAgICAvLyBjbGFpbWVkICh0aGV5IG1heSBiZWxvbmcgdG8gc29tZW9uZSBlbHNlLCBlLmcuIGA/dGFiPeKApmApLlxuICAgIGNvbnN0IHVybFNlZWRlZFJlZiA9IHVzZVJlZih7fSk7XG4gICAgY29uc3QgdXJsSW5pdGlhbFZhbHVlc1JlZiA9IHVzZVJlZihudWxsKTtcbiAgICBpZiAodXJsSW5pdGlhbFZhbHVlc1JlZi5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgIGlmICghc3luY1RvVXJsKSB7XG4gICAgICAgICAgICB1cmxJbml0aWFsVmFsdWVzUmVmLmN1cnJlbnQgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc3luY1RvVXJsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zdCBmcm9tVXJsID0gc3luY1RvVXJsKHVybFBhcmFtc0F0TW91bnRSZWYuY3VycmVudCwgJ2dldCcpO1xuICAgICAgICAgICAgLy8gSWRlbXBvdGVudCByZWYgd3JpdGVzIOKAlCBzYW1lIGlucHV0IG9uIGV2ZXJ5IGludm9jYXRpb24uXG4gICAgICAgICAgICBtYW5hZ2VkS2V5c1JlZi5jdXJyZW50ID0gbmV3IFNldChPYmplY3Qua2V5cyhmcm9tVXJsKSk7XG4gICAgICAgICAgICB1cmxJbml0aWFsVmFsdWVzUmVmLmN1cnJlbnQgPSBmcm9tVXJsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdXJsU2VlZGVkUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKHt9LCB1cmxQYXJhbXNBdE1vdW50UmVmLmN1cnJlbnQpO1xuICAgICAgICAgICAgdXJsSW5pdGlhbFZhbHVlc1JlZi5jdXJyZW50ID0gT2JqZWN0LmFzc2lnbih7fSwgdXJsUGFyYW1zQXRNb3VudFJlZi5jdXJyZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB3cml0ZVZhbHVlcyA9IHVzZU1lbW9pemVkRm4oKHZhbHVlcykgPT4ge1xuICAgICAgICBpZiAoIXN5bmNUb1VybCB8fCAhaXNXcml0YWJsZSgpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgdG9Xcml0ZTtcbiAgICAgICAgY29uc3QgdG9DbGVhciA9IG5ldyBTZXQobWFuYWdlZEtleXNSZWYuY3VycmVudCk7XG4gICAgICAgIGlmICh0eXBlb2Ygc3luY1RvVXJsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBleHRyYVVybFBhcmFtcyBieXBhc3MgdGhlIGNvbnN1bWVyJ3MgbWFwcGVyIChcImFsd2F5cyB3cml0dGVuXCIpOiB0aGV5XG4gICAgICAgICAgICAvLyBmb3JtIHRoZSBiYXNlIGFuZCB0aGUgbWFwcGVyJ3Mgb3V0cHV0IHdpbnMgb24ga2V5IGNvbGxpc2lvbnMuXG4gICAgICAgICAgICB0b1dyaXRlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBleHRyYVVybFBhcmFtcyksIHN5bmNUb1VybCh2YWx1ZXMsICdzZXQnKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBTa2lwIFVSTC1zZWVkZWQga2V5cyB3ZSBuZXZlciB3cm90ZSB3aG9zZSB2YWx1ZSBpcyB1bmNoYW5nZWQg4oCUIHRoZXlcbiAgICAgICAgICAgIC8vIG1heSBiZWxvbmcgdG8gc29tZW9uZSBlbHNlOyBsZWF2ZSB0aGVtIGluIHRoZSBVUkwgdW50b3VjaGVkLiBBIHNlZWRlZFxuICAgICAgICAgICAgLy8ga2V5IHdob3NlIHZhbHVlIERJRCBjaGFuZ2UgaXMgY2xhaW1lZCBmcm9tIG5vdyBvbi5cbiAgICAgICAgICAgIHRvV3JpdGUgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlcykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWVkZWQgPSB1cmxTZWVkZWRSZWYuY3VycmVudFtrZXldO1xuICAgICAgICAgICAgICAgIGlmIChzZWVkZWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAhbWFuYWdlZEtleXNSZWYuY3VycmVudC5oYXMoa2V5KSAmJlxuICAgICAgICAgICAgICAgICAgICBTdHJpbmcodmFsdWUpID09PSBzZWVkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbGV0ZSB1cmxTZWVkZWRSZWYuY3VycmVudFtrZXldO1xuICAgICAgICAgICAgICAgIHRvQ2xlYXIuYWRkKGtleSk7XG4gICAgICAgICAgICAgICAgdG9Xcml0ZVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTZWVkZWQga2V5cyBtaXNzaW5nIGZyb20gdGhlIHN1Ym1pdHRlZCB2YWx1ZXMgd2VyZSBjbGVhcmVkIGJ5IHRoZVxuICAgICAgICAgICAgLy8gdXNlciAob21pdE5pbCBzdHJpcHMgZW1wdHkgdmFsdWVzKSDigJQgY2xhaW0gdGhlbSBhbmQgcmVtb3ZlIHRoZWlyXG4gICAgICAgICAgICAvLyBzdGFsZSBwYXJhbXMgZnJvbSB0aGUgVVJMLlxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModXJsU2VlZGVkUmVmLmN1cnJlbnQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEoa2V5IGluIHZhbHVlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHVybFNlZWRlZFJlZi5jdXJyZW50W2tleV07XG4gICAgICAgICAgICAgICAgICAgIHRvQ2xlYXIuYWRkKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1hbmFnZWRLZXlzUmVmLmN1cnJlbnQgPSBzZXRVcmxQYXJhbXModG9Xcml0ZSwgdG9DbGVhcik7XG4gICAgfSk7XG4gICAgY29uc3Qgb25VcmxTeW5jRmluaXNoID0gdXNlTWVtb2l6ZWRGbigoZmluYWxWYWx1ZXMpID0+IHtcbiAgICAgICAgaWYgKCFzeW5jVG9VcmwpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIC8vIGV4dHJhVXJsUGFyYW1zIGFyZSBhcHBsaWVkIGV4YWN0bHkgb25jZSBwZXIgYnJhbmNoOiBwcmUtbWVyZ2VkIGhlcmUgZm9yXG4gICAgICAgIC8vIHRoZSBib29sZWFuIGZvcm0gKHZhbHVlcyB3aW4gb24gY29sbGlzaW9uKTsgdGhlIGZ1bmN0aW9uIGZvcm0gYXBwbGllc1xuICAgICAgICAvLyB0aGVtIEFGVEVSIHRoZSBjb25zdW1lcidzIG1hcHBlciBpbnNpZGUgd3JpdGVWYWx1ZXMsIHNvIHRoZSBtYXBwZXJcbiAgICAgICAgLy8gbmV2ZXIgc2VlcyBmb3JlaWduIGtleXMgaW4gaXRzIGlucHV0LlxuICAgICAgICBjb25zdCBzaG91bGRQcmVNZXJnZSA9IHR5cGVvZiBzeW5jVG9VcmwgIT09ICdmdW5jdGlvbicgJiYgZXh0cmFVcmxQYXJhbXM7XG4gICAgICAgIHdyaXRlVmFsdWVzKHNob3VsZFByZU1lcmdlID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBleHRyYVVybFBhcmFtcyksIGZpbmFsVmFsdWVzKSA6IGZpbmFsVmFsdWVzKTtcbiAgICB9KTtcbiAgICBjb25zdCBvblVybFN5bmNSZXNldCA9IHVzZU1lbW9pemVkRm4oKCkgPT4ge1xuICAgICAgICBpZiAoIXN5bmNUb1VybCB8fCAhaXNXcml0YWJsZSgpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAvLyBDbGVhciBldmVyeSBtYW5hZ2VkIGtleSwgdGhlbiByZS13cml0ZSBleHRyYVVybFBhcmFtcyAodGhleSBwZXJzaXN0KS5cbiAgICAgICAgbWFuYWdlZEtleXNSZWYuY3VycmVudCA9IHNldFVybFBhcmFtcyhPYmplY3QuYXNzaWduKHt9LCBleHRyYVVybFBhcmFtcyksIG1hbmFnZWRLZXlzUmVmLmN1cnJlbnQpO1xuICAgIH0pO1xuICAgIC8vIEtlZXAgZXh0cmFVcmxQYXJhbXMgaW4gdGhlIFVSTCBhcyB0aGV5IGNoYW5nZSAodmFsdWUtY29tcGFyZWQpLiBUaGVcbiAgICAvLyBwcmV2aW91c2x5LXdyaXR0ZW4gZXh0cmEga2V5cyBhcmUgdHJhY2tlZCBzbyBhIGtleSBSRU1PVkVEIGZyb21cbiAgICAvLyBleHRyYVVybFBhcmFtcyBpcyBhbHNvIHJlbW92ZWQgZnJvbSB0aGUgVVJMIOKAlCBub3QganVzdCBvdmVyd3JpdHRlbi5cbiAgICBjb25zdCBleHRyYUtleXNSZWYgPSB1c2VSZWYobmV3IFNldCgpKTtcbiAgICBjb25zdCBzZXJpYWxpemVkRXh0cmEgPSBzeW5jVG9VcmwgPyBzdGFibGVTZXJpYWxpemUoZXh0cmFVcmxQYXJhbXMpIDogJyc7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKCFzeW5jVG9VcmwgfHwgIWlzV3JpdGFibGUoKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgbmV4dCA9IGV4dHJhVXJsUGFyYW1zICE9PSBudWxsICYmIGV4dHJhVXJsUGFyYW1zICE9PSB2b2lkIDAgPyBleHRyYVVybFBhcmFtcyA6IHt9O1xuICAgICAgICBpZiAoZXh0cmFLZXlzUmVmLmN1cnJlbnQuc2l6ZSA9PT0gMCAmJiBPYmplY3Qua2V5cyhuZXh0KS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IHdyaXR0ZW4gPSBzZXRVcmxQYXJhbXMoT2JqZWN0LmFzc2lnbih7fSwgbmV4dCksIGV4dHJhS2V5c1JlZi5jdXJyZW50KTtcbiAgICAgICAgY29uc3QgbWVyZ2VkID0gbmV3IFNldChtYW5hZ2VkS2V5c1JlZi5jdXJyZW50KTtcbiAgICAgICAgZXh0cmFLZXlzUmVmLmN1cnJlbnQuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXdyaXR0ZW4uaGFzKGtleSkpXG4gICAgICAgICAgICAgICAgbWVyZ2VkLmRlbGV0ZShrZXkpO1xuICAgICAgICB9KTtcbiAgICAgICAgd3JpdHRlbi5mb3JFYWNoKChrZXkpID0+IG1lcmdlZC5hZGQoa2V5KSk7XG4gICAgICAgIG1hbmFnZWRLZXlzUmVmLmN1cnJlbnQgPSBtZXJnZWQ7XG4gICAgICAgIGV4dHJhS2V5c1JlZi5jdXJyZW50ID0gd3JpdHRlbjtcbiAgICB9LCBbc2VyaWFsaXplZEV4dHJhXSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdXJsSW5pdGlhbFZhbHVlczogdXJsSW5pdGlhbFZhbHVlc1JlZi5jdXJyZW50LFxuICAgICAgICBvblVybFN5bmNGaW5pc2gsXG4gICAgICAgIG9uVXJsU3luY1Jlc2V0LFxuICAgIH07XG59XG5leHBvcnQgZGVmYXVsdCB1c2VVcmxTeW5jOyJdLCJzb3VyY2VSb290IjoiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjIn0=