@wavemaker/react-runtime 11.14.3-rc.6401 → 11.15.0-1.246
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/actions/base-action.js +5 -7
- package/actions/login-action.js +7 -8
- package/actions/logout-action.js +5 -7
- package/actions/navigation-action.js +73 -18
- package/actions/notification-action.js +22 -8
- package/actions/timer-action.js +13 -15
- package/actions/toast.js +4 -2
- package/actions/toast.service.js +1 -2
- package/components/advanced/carousel/index.js +1 -1
- package/components/advanced/carousel/template.js +1 -1
- package/components/basic/anchor/index.js +31 -11
- package/components/basic/html/index.js +115 -24
- package/components/basic/icon/index.js +2 -1
- package/components/basic/iframe/index.js +2 -1
- package/components/basic/label/index.js +12 -9
- package/components/basic/message/index.js +12 -3
- package/components/basic/picture/index.js +11 -4
- package/components/basic/progress-bar/index.js +4 -1
- package/components/basic/progress-circle/index.js +34 -28
- package/components/basic/progress-circle/props.js +10 -2
- package/components/basic/richtexteditor/index.js +95 -94
- package/components/basic/search/index.js +401 -156
- package/components/basic/search/providers.js +126 -61
- package/components/basic/spinner/index.js +2 -1
- package/components/basic/tree/index.js +34 -34
- package/components/basic/tree/utils.js +10 -4
- package/components/chart/components/barColumnChart/index.js +36 -33
- package/components/chart/components/bubbleChart/index.js +35 -25
- package/components/chart/components/chartLegend/utils.js +2 -1
- package/components/chart/components/cumulativeLineChart/index.js +30 -26
- package/components/chart/components/lineAreaChart/index.js +50 -32
- package/components/chart/components/pieDonutChart/index.js +13 -4
- package/components/chart/hooks/useXAxisConfig.js +15 -8
- package/components/chart/index.js +223 -53
- package/components/chart/utils.js +12 -1
- package/components/constants.js +5 -2
- package/components/container/accordion/accordion-pane/index.js +17 -12
- package/components/container/accordion/index.js +9 -4
- package/components/container/alignment-utils.js +56 -1
- package/components/container/index.js +49 -20
- package/components/container/panel/components/panel-header/index.js +3 -4
- package/components/container/panel/index.js +15 -10
- package/components/container/repeat-template/index.js +33 -0
- package/components/container/tabs/index.js +83 -14
- package/components/container/tabs/tab-pane/index.js +33 -10
- package/components/container/tabs/utils.js +51 -0
- package/components/container/wizard/components/StepComponents.js +2 -1
- package/components/container/wizard/components/WizardStep.js +2 -1
- package/components/container/wizard/index.js +64 -35
- package/components/container/wizard/utils.js +46 -1
- package/components/container/wizard/wizard-step/index.js +11 -1
- package/components/data/card/card-content/index.js +1 -1
- package/components/data/form/base-form/index.js +985 -183
- package/components/data/form/base-form/props.js +3 -1
- package/components/data/form/base-form/utils.js +159 -1
- package/components/data/form/dynamic-fields/constant.js +53 -0
- package/components/data/form/dynamic-fields/index.js +10 -45
- package/components/data/form/dynamic-fields/utils.js +37 -2
- package/components/data/form/form-action/index.js +5 -4
- package/components/data/form/form-context.js +5 -1
- package/components/data/form/form-controller/utils.js +84 -0
- package/components/data/form/form-controller/validation-contrustor.js +402 -189
- package/components/data/form/form-controller/withFormController.js +191 -52
- package/components/data/form/form-field/base-field.js +67 -45
- package/components/data/form/form-field/index.js +28 -5
- package/components/data/form/form-header/index.js +3 -4
- package/components/data/form/index.js +20 -1
- package/components/data/list/components/ListDND.js +2 -1
- package/components/data/list/components/ListItem.js +6 -2
- package/components/data/list/components/ListItemWithTemplate.js +46 -2
- package/components/data/list/components/ListItems.js +17 -26
- package/components/data/list/components/ListPagination.js +3 -3
- package/components/data/list/components/StandardListItems.js +3 -4
- package/components/data/list/hooks/useListEffects.js +55 -14
- package/components/data/list/hooks/useListEventHandlers.js +3 -1
- package/components/data/list/hooks/useListState.js +3 -1
- package/components/data/list/hooks/usePaginatedGroupedData.js +18 -5
- package/components/data/list/index.js +74 -55
- package/components/data/list/utils/list-helpers.js +73 -35
- package/components/data/list/utils/list-widget-methods.js +138 -95
- package/components/data/live-filter/index.js +26 -15
- package/components/data/live-form/index.js +51 -18
- package/components/data/live-form/props.js +1 -1
- package/components/data/pagination/components/BasicPagination.js +71 -16
- package/components/data/pagination/components/PageSizeSelector.js +8 -3
- package/components/data/pagination/components/TotalRecords.js +1 -5
- package/components/data/pagination/hooks/usePagination.js +349 -66
- package/components/data/pagination/index.js +137 -19
- package/components/data/table/components/AddNewRow.js +5 -1
- package/components/data/table/components/EditableCell.js +2 -2
- package/components/data/table/components/RowCells.js +64 -0
- package/components/data/table/components/RowExpansionButton.js +2 -2
- package/components/data/table/components/SummaryCell.js +111 -0
- package/components/data/table/components/SummaryRow.js +54 -0
- package/components/data/table/components/SummaryRowFooter.js +46 -0
- package/components/data/table/components/TableBody.js +61 -59
- package/components/data/table/components/TableDataRow.js +109 -0
- package/components/data/table/components/TableFilters.js +225 -121
- package/components/data/table/components/TableHeader.js +291 -23
- package/components/data/table/components/TablePanelHeading.js +139 -8
- package/components/data/table/components/index.js +22 -1
- package/components/data/table/hooks/use-edited-rows.js +141 -0
- package/components/data/table/hooks/useCellState.js +5 -12
- package/components/data/table/hooks/useFormWidget.js +58 -52
- package/components/data/table/hooks/usePaginationState.js +45 -24
- package/components/data/table/hooks/usePanelStructure.js +4 -4
- package/components/data/table/hooks/useRowHandlers.js +39 -5
- package/components/data/table/hooks/useRowSelection.js +244 -50
- package/components/data/table/hooks/useServerSideSorting.js +81 -37
- package/components/data/table/hooks/useTableColumns.js +211 -118
- package/components/data/table/hooks/useTableData.js +54 -9
- package/components/data/table/hooks/useTableEdit.js +272 -97
- package/components/data/table/hooks/useTableEffects.js +31 -13
- package/components/data/table/hooks/useTableFilter.js +1 -1
- package/components/data/table/hooks/useTableInitialization.js +23 -22
- package/components/data/table/hooks/useTableState.js +11 -5
- package/components/data/table/hooks/useTableStateManager.js +140 -65
- package/components/data/table/index.js +637 -274
- package/components/data/table/live-table/index.js +54 -22
- package/components/data/table/table-action/index.js +1 -1
- package/components/data/table/table-group/index.js +26 -0
- package/components/data/table/table-row-action/index.js +32 -18
- package/components/data/table/utils/buildSelectionColumns.js +12 -21
- package/components/data/table/utils/columnBuilder.js +29 -14
- package/components/data/table/utils/columnProxy.js +68 -1
- package/components/data/table/utils/constants.js +6 -2
- package/components/data/table/utils/crud-handlers.js +68 -63
- package/components/data/table/utils/groupHeaderUtils.js +102 -0
- package/components/data/table/utils/index.js +210 -21
- package/components/data/table/utils/renderDisplayCell.js +6 -6
- package/components/data/table/utils/selectionUtils.js +25 -26
- package/components/data/table/utils/validation.js +1 -0
- package/components/data/utils/filter-field-util.js +3 -3
- package/components/dialogs/alert-dialog/index.js +1 -1
- package/components/dialogs/confirm-dialog/index.js +1 -1
- package/components/dialogs/dialog/index.js +4 -1
- package/components/dialogs/dialog-content/index.js +3 -1
- package/components/dialogs/dialog-header/index.js +2 -2
- package/components/dialogs/iframe-dialog/index.js +11 -5
- package/components/dialogs/index.js +1 -1
- package/components/dialogs/login-dialog/index.js +1 -1
- package/components/dialogs/page-dialog/index.js +1 -1
- package/components/form/button/index.js +33 -7
- package/components/input/calendar/index.js +18 -6
- package/components/input/chips/index.js +99 -28
- package/components/input/chips/utils.js +34 -4
- package/components/input/color-picker/index.js +74 -25
- package/components/input/composite/index.js +3 -3
- package/components/input/currency/index.js +35 -49
- package/components/input/default/checkbox/index.js +23 -28
- package/components/input/default/checkboxset/index.js +38 -18
- package/components/input/default/checkboxset/utils.js +30 -0
- package/components/input/default/radioset/index.js +36 -39
- package/components/input/default/switch/index.js +30 -13
- package/components/input/epoch/date/index.js +130 -69
- package/components/input/epoch/date/utils.js +94 -1
- package/components/input/epoch/datetime/index.js +72 -22
- package/components/input/epoch/datetime/utils.js +49 -10
- package/components/input/epoch/time/index.js +68 -19
- package/components/input/epoch/time/utils.js +62 -14
- package/components/input/fileupload/Utils.js +12 -7
- package/components/input/fileupload/components/MultiUpload.js +2 -6
- package/components/input/fileupload/components/SingleUpload.js +3 -7
- package/components/input/fileupload/index.js +6 -10
- package/components/input/fileupload/useFileUpload.js +16 -5
- package/components/input/number/index.js +158 -43
- package/components/input/rating/index.js +90 -7
- package/components/input/select/index.js +209 -72
- package/components/input/slider/index.js +84 -26
- package/components/input/text/index.js +38 -18
- package/components/input/text/util.js +283 -130
- package/components/input/textarea/index.js +13 -10
- package/components/input/upload/index.js +124 -0
- package/components/input/upload/props.js +5 -0
- package/components/input/util/index.js +11 -0
- package/components/navbar/index.js +51 -3
- package/components/navbar/nav/index.js +46 -16
- package/components/navbar/nav-item/index.js +11 -5
- package/components/navigation/menu/components/ListItems.js +3 -0
- package/components/navigation/menu/constants.js +2 -1
- package/components/navigation/menu/hooks/useHoverState.hook.js +48 -0
- package/components/navigation/menu/hooks/useKeyboardMovements.hook.js +37 -0
- package/components/navigation/menu/hooks/useTransformedDataset.hook.js +15 -0
- package/components/navigation/menu/index.js +326 -188
- package/components/navigation/menu/utils/action-task.js +14 -0
- package/components/navigation/menu/utils/role-filter.js +76 -0
- package/components/navigation/popover/index.js +105 -32
- package/components/page/partial-container/index.js +34 -5
- package/components/prefab/index.js +2 -4
- package/context/PrefabContext.js +10 -6
- package/context/WidgetProvider.js +30 -31
- package/core/app.service.js +1 -1
- package/core/constants/events.js +57 -1
- package/core/dialog.service.js +1 -2
- package/core/event-notifier.js +1 -2
- package/core/formatter/array-formatters.js +33 -0
- package/core/formatter/date-formatters.js +2 -4
- package/core/formatter/index.js +2 -1
- package/core/formatter/number-formatters.js +5 -10
- package/core/formatter/security-formatters.js +2 -4
- package/core/formatter/string-formatters.js +3 -6
- package/core/proxy-service.js +85 -13
- package/core/script-registry.js +108 -48
- package/core/util/common.js +4 -4
- package/core/util/compare.js +30 -0
- package/core/util/dom.js +8 -8
- package/core/util/index.js +16 -6
- package/core/util/safe-is-equal.js +156 -0
- package/core/util/security.js +1 -2
- package/core/util/utils.js +16 -7
- package/higherOrder/BaseApp.js +108 -65
- package/higherOrder/BaseDateTime.js +31 -13
- package/higherOrder/BasePage.js +268 -144
- package/higherOrder/BasePartial.js +1 -1
- package/higherOrder/BasePrefab.js +33 -15
- package/higherOrder/DataNav.js +99 -16
- package/higherOrder/helper.js +41 -3
- package/higherOrder/withBaseWrapper.js +41 -28
- package/hooks/useAuth.js +11 -5
- package/hooks/useHttp.js +280 -94
- package/mui-config/theme-provider.js +1 -1
- package/mui-config/theme.js +1 -1
- package/package-lock.json +307 -266
- package/package.json +8 -8
- package/store/bindActions/i18nActions.js +18 -0
- package/store/index.js +3 -1
- package/store/slices/appConfigSlice.js +2 -2
- package/store/slices/authSlice.js +31 -28
- package/store/slices/i18nSlice.js +2 -2
- package/store/slices/navigationSlice.js +35 -0
- package/store/viewport.service.js +255 -0
- package/utils/attr.js +35 -0
- package/utils/dataset-util.js +1 -2
- package/utils/form-state.util.js +43 -12
- package/utils/form-utils.js +47 -2
- package/utils/format-util.js +28 -13
- package/utils/page-params-util.js +33 -1
- package/utils/state-persistance.js +72 -13
- package/utils/transformedDataset-utils.js +35 -24
- package/variables/base-variable.js +12 -14
- package/variables/crud-variable.js +225 -0
- package/variables/live-variable.js +56 -20
- package/variables/metadata.service.js +123 -0
- package/variables/model-variable.js +21 -15
- package/variables/service-variable.js +88 -83
package/core/script-registry.js
CHANGED
|
@@ -1,63 +1,123 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
3
4
|
Object.defineProperty(exports, "__esModule", {
|
|
4
5
|
value: true
|
|
5
6
|
});
|
|
6
|
-
exports.
|
|
7
|
-
exports.
|
|
8
|
-
exports.
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
exports.widgetIdOverriddenProps = void 0;
|
|
13
|
-
// Global registry to track overridden properties
|
|
14
|
-
var overriddenProps = exports.overriddenProps = {};
|
|
15
|
-
|
|
16
|
-
// New: Widget-ID specific overrides
|
|
17
|
-
var widgetIdOverriddenProps = exports.widgetIdOverriddenProps = {};
|
|
7
|
+
exports.OverriddenPropsRegistry = void 0;
|
|
8
|
+
exports.createOverriddenPropsRegistry = createOverriddenPropsRegistry;
|
|
9
|
+
exports.withSuspendedTracking = withSuspendedTracking;
|
|
10
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
11
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
12
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
18
13
|
var IGNORED_PROPERTIES = ["name", "activePane", "activePaneIndex", "activeTab"];
|
|
19
14
|
|
|
20
|
-
//
|
|
21
|
-
|
|
22
|
-
|
|
15
|
+
// Per-page registry instance class
|
|
16
|
+
var OverriddenPropsRegistry = exports.OverriddenPropsRegistry = /*#__PURE__*/function () {
|
|
17
|
+
function OverriddenPropsRegistry() {
|
|
18
|
+
(0, _classCallCheck2["default"])(this, OverriddenPropsRegistry);
|
|
19
|
+
(0, _defineProperty2["default"])(this, "overriddenProps", {});
|
|
20
|
+
(0, _defineProperty2["default"])(this, "widgetIdOverriddenProps", {});
|
|
21
|
+
(0, _defineProperty2["default"])(this, "_trackingSuspended", false);
|
|
22
|
+
}
|
|
23
|
+
return (0, _createClass2["default"])(OverriddenPropsRegistry, [{
|
|
24
|
+
key: "suspendTracking",
|
|
25
|
+
value:
|
|
26
|
+
// Suspend tracking (used during internal state updates like updateWidgetState)
|
|
27
|
+
function suspendTracking() {
|
|
28
|
+
this._trackingSuspended = true;
|
|
29
|
+
}
|
|
23
30
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
31
|
+
// Resume tracking
|
|
32
|
+
}, {
|
|
33
|
+
key: "resumeTracking",
|
|
34
|
+
value: function resumeTracking() {
|
|
35
|
+
this._trackingSuspended = false;
|
|
28
36
|
}
|
|
29
|
-
|
|
30
|
-
|
|
37
|
+
|
|
38
|
+
// Check if tracking is currently suspended
|
|
39
|
+
}, {
|
|
40
|
+
key: "isTrackingSuspended",
|
|
41
|
+
value: function isTrackingSuspended() {
|
|
42
|
+
return this._trackingSuspended;
|
|
31
43
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
44
|
+
|
|
45
|
+
// Add a property to the registry
|
|
46
|
+
}, {
|
|
47
|
+
key: "trackOverriddenProps",
|
|
48
|
+
value: function trackOverriddenProps(widgetName, propName, value, widgetId) {
|
|
49
|
+
if (this._trackingSuspended) return;
|
|
50
|
+
if (IGNORED_PROPERTIES.includes(propName)) return;
|
|
51
|
+
|
|
52
|
+
// If widget-id is provided, use widget-id specific tracking
|
|
53
|
+
if (widgetId) {
|
|
54
|
+
if (!this.widgetIdOverriddenProps[widgetName]) {
|
|
55
|
+
this.widgetIdOverriddenProps[widgetName] = {};
|
|
56
|
+
}
|
|
57
|
+
if (!this.widgetIdOverriddenProps[widgetName][widgetId]) {
|
|
58
|
+
this.widgetIdOverriddenProps[widgetName][widgetId] = {};
|
|
59
|
+
}
|
|
60
|
+
this.widgetIdOverriddenProps[widgetName][widgetId][propName] = value;
|
|
61
|
+
} else {
|
|
62
|
+
// Fallback to global registry for backward compatibility
|
|
63
|
+
if (!this.overriddenProps[widgetName]) {
|
|
64
|
+
this.overriddenProps[widgetName] = {};
|
|
65
|
+
}
|
|
66
|
+
this.overriddenProps[widgetName][propName] = value;
|
|
67
|
+
}
|
|
37
68
|
}
|
|
38
|
-
overriddenProps[widgetName][propName] = value;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
69
|
|
|
42
|
-
// Check if a property has been script-modified
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
70
|
+
// Check if a property has been script-modified
|
|
71
|
+
}, {
|
|
72
|
+
key: "isPropOverridden",
|
|
73
|
+
value: function isPropOverridden(widgetName, propName, widgetId) {
|
|
74
|
+
var _this$widgetIdOverrid, _this$overriddenProps, _this$overriddenProps2;
|
|
75
|
+
var overriddenItem = ((_this$widgetIdOverrid = this.widgetIdOverriddenProps[widgetName]) === null || _this$widgetIdOverrid === void 0 || (_this$widgetIdOverrid = _this$widgetIdOverrid[widgetId]) === null || _this$widgetIdOverrid === void 0 ? void 0 : _this$widgetIdOverrid[propName]) || (((_this$overriddenProps = this.overriddenProps[widgetName]) === null || _this$overriddenProps === void 0 ? void 0 : _this$overriddenProps[propName]) != undefined ? (_this$overriddenProps2 = this.overriddenProps[widgetName]) === null || _this$overriddenProps2 === void 0 ? void 0 : _this$overriddenProps2[propName] : false);
|
|
76
|
+
return overriddenItem !== undefined;
|
|
77
|
+
}
|
|
78
|
+
}, {
|
|
79
|
+
key: "isWidgetOverridden",
|
|
80
|
+
value: function isWidgetOverridden(widgetName, widgetId) {
|
|
81
|
+
var _this$widgetIdOverrid2;
|
|
82
|
+
var overriddenItem = ((_this$widgetIdOverrid2 = this.widgetIdOverriddenProps[widgetName]) === null || _this$widgetIdOverrid2 === void 0 ? void 0 : _this$widgetIdOverrid2[widgetId]) || this.overriddenProps[widgetName];
|
|
83
|
+
return overriddenItem !== undefined;
|
|
84
|
+
}
|
|
53
85
|
|
|
54
|
-
// Get widget-id specific overrides
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
86
|
+
// Get widget-id specific overrides
|
|
87
|
+
}, {
|
|
88
|
+
key: "getWidgetOverrides",
|
|
89
|
+
value: function getWidgetOverrides(widgetName, widgetId) {
|
|
90
|
+
var _this$widgetIdOverrid3;
|
|
91
|
+
var overriddenItem = ((_this$widgetIdOverrid3 = this.widgetIdOverriddenProps[widgetName]) === null || _this$widgetIdOverrid3 === void 0 ? void 0 : _this$widgetIdOverrid3[widgetId]) || this.overriddenProps[widgetName];
|
|
92
|
+
return overriddenItem || {};
|
|
93
|
+
}
|
|
94
|
+
}, {
|
|
95
|
+
key: "clear",
|
|
96
|
+
value: function clear() {
|
|
97
|
+
this.overriddenProps = {};
|
|
98
|
+
this.widgetIdOverriddenProps = {};
|
|
99
|
+
}
|
|
100
|
+
}, {
|
|
101
|
+
key: "destroy",
|
|
102
|
+
value: function destroy(widgetName) {
|
|
103
|
+
delete this.overriddenProps[widgetName];
|
|
104
|
+
delete this.widgetIdOverriddenProps[widgetName];
|
|
105
|
+
}
|
|
106
|
+
}]);
|
|
107
|
+
}(); // Factory function to create a new registry instance
|
|
108
|
+
function createOverriddenPropsRegistry() {
|
|
109
|
+
return new OverriddenPropsRegistry();
|
|
59
110
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Utility to execute a callback with tracking suspended.
|
|
114
|
+
* Ensures tracking is always resumed even if the callback throws.
|
|
115
|
+
*/
|
|
116
|
+
function withSuspendedTracking(registry, callback) {
|
|
117
|
+
registry === null || registry === void 0 || registry.suspendTracking();
|
|
118
|
+
try {
|
|
119
|
+
return callback();
|
|
120
|
+
} finally {
|
|
121
|
+
registry === null || registry === void 0 || registry.resumeTracking();
|
|
122
|
+
}
|
|
63
123
|
}
|
package/core/util/common.js
CHANGED
|
@@ -7,7 +7,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
exports.deepCopy = void 0;
|
|
8
8
|
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
9
9
|
var _lodashEs = require("lodash-es");
|
|
10
|
-
var
|
|
10
|
+
var _deepCopy2 = function _deepCopy(o1) {
|
|
11
11
|
for (var _len = arguments.length, o2 = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
12
12
|
o2[_key - 1] = arguments[_key];
|
|
13
13
|
}
|
|
@@ -16,9 +16,9 @@ var _deepCopy = function _deepCopy(o1) {
|
|
|
16
16
|
Object.keys(o).forEach(function (k) {
|
|
17
17
|
var v = o[k];
|
|
18
18
|
if (v && !(0, _lodashEs.isString)(v) && !(0, _lodashEs.isArray)(v) && (0, _typeof2["default"])(v) === "object") {
|
|
19
|
-
o1[k] =
|
|
19
|
+
o1[k] = _deepCopy2(o1[k] || {}, o[k]);
|
|
20
20
|
} else {
|
|
21
|
-
o1[k] =
|
|
21
|
+
o1[k] = _deepCopy2(v);
|
|
22
22
|
}
|
|
23
23
|
});
|
|
24
24
|
}
|
|
@@ -29,5 +29,5 @@ var deepCopy = exports.deepCopy = function deepCopy() {
|
|
|
29
29
|
for (var _len2 = arguments.length, objects = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
30
30
|
objects[_key2] = arguments[_key2];
|
|
31
31
|
}
|
|
32
|
-
return
|
|
32
|
+
return _deepCopy2.apply(void 0, [{}].concat(objects));
|
|
33
33
|
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports["default"] = compare;
|
|
8
|
+
var _isEqual = _interopRequireDefault(require("lodash-es/isEqual"));
|
|
9
|
+
function compare(prev, next) {
|
|
10
|
+
// Handle null/undefined cases
|
|
11
|
+
if (prev === next) {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
if (!prev || !next) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
var keys = Object.keys(next);
|
|
18
|
+
return keys.every(function (key) {
|
|
19
|
+
var prevValue = prev[key];
|
|
20
|
+
var nextValue = next[key];
|
|
21
|
+
|
|
22
|
+
// If prev doesn't have this key but next does, they're different
|
|
23
|
+
if (!(key in prev) && nextValue !== undefined) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Use isEqual for deep comparison
|
|
28
|
+
return (0, _isEqual["default"])(prevValue, nextValue);
|
|
29
|
+
});
|
|
30
|
+
}
|
package/core/util/dom.js
CHANGED
|
@@ -48,19 +48,19 @@ var isDOMElement = exports.isDOMElement = function isDOMElement(obj) {
|
|
|
48
48
|
};
|
|
49
49
|
|
|
50
50
|
// Create empty wrapper for when elements are not found (like empty jQuery object)
|
|
51
|
-
var
|
|
51
|
+
var _createEmptyWrapper = function createEmptyWrapper() {
|
|
52
52
|
return {
|
|
53
53
|
0: null,
|
|
54
54
|
length: 0,
|
|
55
55
|
// Empty wrapper methods that do nothing (jQuery-like behavior)
|
|
56
56
|
find: function find() {
|
|
57
|
-
return
|
|
57
|
+
return _createEmptyWrapper();
|
|
58
58
|
},
|
|
59
59
|
attr: function attr() {
|
|
60
|
-
return
|
|
60
|
+
return _createEmptyWrapper();
|
|
61
61
|
},
|
|
62
62
|
removeAttr: function removeAttr() {
|
|
63
|
-
return
|
|
63
|
+
return _createEmptyWrapper();
|
|
64
64
|
},
|
|
65
65
|
get: function get() {
|
|
66
66
|
return null;
|
|
@@ -69,9 +69,9 @@ var createEmptyWrapper = function createEmptyWrapper() {
|
|
|
69
69
|
};
|
|
70
70
|
|
|
71
71
|
// Minimal wrapper with essential jQuery methods that are actually used
|
|
72
|
-
var
|
|
72
|
+
var _wrapWithNativeDOM = exports.wrapWithNativeDOM = function wrapWithNativeDOM(element) {
|
|
73
73
|
if (!element || !isDOMElement(element)) {
|
|
74
|
-
return
|
|
74
|
+
return _createEmptyWrapper();
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
// Create wrapper object with essential jQuery methods
|
|
@@ -82,7 +82,7 @@ var wrapWithNativeDOM = exports.wrapWithNativeDOM = function wrapWithNativeDOM(e
|
|
|
82
82
|
// Essential jQuery methods using native DOM
|
|
83
83
|
find: function find(selector) {
|
|
84
84
|
var found = element.querySelector(selector);
|
|
85
|
-
return found ?
|
|
85
|
+
return found ? _wrapWithNativeDOM(found) : _createEmptyWrapper();
|
|
86
86
|
},
|
|
87
87
|
attr: function attr(name, value) {
|
|
88
88
|
if (value === undefined) {
|
|
@@ -104,4 +104,4 @@ var wrapWithNativeDOM = exports.wrapWithNativeDOM = function wrapWithNativeDOM(e
|
|
|
104
104
|
};
|
|
105
105
|
|
|
106
106
|
// Backward compatibility alias
|
|
107
|
-
var wrapWithJQuery = exports.wrapWithJQuery =
|
|
107
|
+
var wrapWithJQuery = exports.wrapWithJQuery = _wrapWithNativeDOM;
|
package/core/util/index.js
CHANGED
|
@@ -6,9 +6,9 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.formatMessage = exports.deepCopy = exports.checkPublicAccess = exports._get = exports.VALIDATOR = exports.MONTHNAMES = exports.MATCH_MODES = void 0;
|
|
8
8
|
exports.getCurrentMonth = getCurrentMonth;
|
|
9
|
-
exports.isDefined = exports.getValidJSON = exports.getSessionStorageItem = void 0;
|
|
9
|
+
exports.isDefined = exports.getValidJSON = exports.getTimezone = exports.getSessionStorageItem = void 0;
|
|
10
10
|
exports.reload = reload;
|
|
11
|
-
exports.toNumber = exports.setSessionStorageItem = exports.replace = void 0;
|
|
11
|
+
exports.toNumber = exports.toBoolean = exports.setSessionStorageItem = exports.replace = void 0;
|
|
12
12
|
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
13
13
|
var _get2 = _interopRequireDefault(require("lodash-es/get"));
|
|
14
14
|
var _store = require("@wavemaker/react-runtime/store");
|
|
@@ -63,6 +63,13 @@ var getSessionStorageItem = exports.getSessionStorageItem = function getSessionS
|
|
|
63
63
|
return item[key];
|
|
64
64
|
}
|
|
65
65
|
};
|
|
66
|
+
var getTimezone = exports.getTimezone = function getTimezone() {
|
|
67
|
+
var timezone = _store.store.getState().i18n.timezone;
|
|
68
|
+
if ((0, _typeof2["default"])(timezone) === "object" && timezone !== null && "timezone" in timezone) {
|
|
69
|
+
return timezone["timezone"];
|
|
70
|
+
}
|
|
71
|
+
return timezone || "UTC";
|
|
72
|
+
};
|
|
66
73
|
var formatMessage = exports.formatMessage = function formatMessage(fragment, expression) {
|
|
67
74
|
return (0, _get2["default"])(fragment, "appLocale.".concat(expression), expression);
|
|
68
75
|
};
|
|
@@ -78,7 +85,7 @@ var toNumber = exports.toNumber = function toNumber(value) {
|
|
|
78
85
|
return Number(value);
|
|
79
86
|
};
|
|
80
87
|
var _get = exports._get = _get2["default"];
|
|
81
|
-
var
|
|
88
|
+
var _deepCopy2 = function _deepCopy(o1) {
|
|
82
89
|
for (var _len = arguments.length, o2 = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
83
90
|
o2[_key - 1] = arguments[_key];
|
|
84
91
|
}
|
|
@@ -87,9 +94,9 @@ var _deepCopy = function _deepCopy(o1) {
|
|
|
87
94
|
Object.keys(o).forEach(function (k) {
|
|
88
95
|
var v = o[k];
|
|
89
96
|
if (v && !(0, _lodashEs.isString)(v) && !(0, _lodashEs.isArray)(v) && (0, _typeof2["default"])(v) === "object") {
|
|
90
|
-
o1[k] =
|
|
97
|
+
o1[k] = _deepCopy2(o1[k] || {}, o[k]);
|
|
91
98
|
} else {
|
|
92
|
-
o1[k] =
|
|
99
|
+
o1[k] = _deepCopy2(v);
|
|
93
100
|
}
|
|
94
101
|
});
|
|
95
102
|
}
|
|
@@ -100,7 +107,7 @@ var deepCopy = exports.deepCopy = function deepCopy() {
|
|
|
100
107
|
for (var _len2 = arguments.length, objects = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
101
108
|
objects[_key2] = arguments[_key2];
|
|
102
109
|
}
|
|
103
|
-
return
|
|
110
|
+
return _deepCopy2.apply(void 0, [{}].concat(objects));
|
|
104
111
|
};
|
|
105
112
|
var getValidJSON = exports.getValidJSON = function getValidJSON(content) {
|
|
106
113
|
if (!content) {
|
|
@@ -116,6 +123,9 @@ var getValidJSON = exports.getValidJSON = function getValidJSON(content) {
|
|
|
116
123
|
var isDefined = exports.isDefined = function isDefined(v) {
|
|
117
124
|
return typeof v !== "undefined";
|
|
118
125
|
};
|
|
126
|
+
var toBoolean = exports.toBoolean = function toBoolean(v) {
|
|
127
|
+
return v === true || v === "true";
|
|
128
|
+
};
|
|
119
129
|
var replace = exports.replace = function replace(template, map, parseError) {
|
|
120
130
|
var regEx = /\$\{([^\}]+)\}/g;
|
|
121
131
|
if (!template) {
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.safeIsEqual = void 0;
|
|
8
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
9
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
10
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
11
|
+
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
12
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
13
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
14
|
+
var isObjectLike = function isObjectLike(value) {
|
|
15
|
+
return (0, _typeof2["default"])(value) === "object" && value !== null;
|
|
16
|
+
};
|
|
17
|
+
var getComparableKeys = function getComparableKeys(value, ignored) {
|
|
18
|
+
return Object.keys(value).filter(function (key) {
|
|
19
|
+
return !ignored.has(key);
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
var safeIsEqual = exports.safeIsEqual = function safeIsEqual(value1, value2) {
|
|
23
|
+
var depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 5;
|
|
24
|
+
var ignoreKeys = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ["listener"];
|
|
25
|
+
var ignoredKeys = new Set(ignoreKeys);
|
|
26
|
+
var visited = new WeakMap();
|
|
27
|
+
var hasVisitedPair = function hasVisitedPair(a, b) {
|
|
28
|
+
var _visited$get, _visited$get2;
|
|
29
|
+
return !!((_visited$get = visited.get(a)) !== null && _visited$get !== void 0 && _visited$get.get(b)) || !!((_visited$get2 = visited.get(b)) !== null && _visited$get2 !== void 0 && _visited$get2.get(a));
|
|
30
|
+
};
|
|
31
|
+
var markVisitedPair = function markVisitedPair(a, b) {
|
|
32
|
+
if (!visited.has(a)) {
|
|
33
|
+
visited.set(a, new WeakMap());
|
|
34
|
+
}
|
|
35
|
+
if (!visited.has(b)) {
|
|
36
|
+
visited.set(b, new WeakMap());
|
|
37
|
+
}
|
|
38
|
+
visited.get(a).set(b, true);
|
|
39
|
+
visited.get(b).set(a, true);
|
|
40
|
+
};
|
|
41
|
+
var _compare = function compare(a, b, currentDepth) {
|
|
42
|
+
if (Object.is(a, b)) {
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
if (currentDepth <= 0) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
if (!isObjectLike(a) || !isObjectLike(b)) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
if (hasVisitedPair(a, b)) {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
markVisitedPair(a, b);
|
|
55
|
+
var aIsArray = Array.isArray(a);
|
|
56
|
+
var bIsArray = Array.isArray(b);
|
|
57
|
+
if (aIsArray || bIsArray) {
|
|
58
|
+
if (!(aIsArray && bIsArray)) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
if (a.length !== b.length) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
for (var i = 0; i < a.length; i += 1) {
|
|
65
|
+
if (!_compare(a[i], b[i], currentDepth - 1)) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
if (a instanceof Date && b instanceof Date) {
|
|
72
|
+
return a.getTime() === b.getTime();
|
|
73
|
+
}
|
|
74
|
+
if (a instanceof RegExp && b instanceof RegExp) {
|
|
75
|
+
return a.source === b.source && a.flags === b.flags;
|
|
76
|
+
}
|
|
77
|
+
if (a instanceof Map && b instanceof Map) {
|
|
78
|
+
if (a.size !== b.size) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
var _iterator = _createForOfIteratorHelper(a.entries()),
|
|
82
|
+
_step;
|
|
83
|
+
try {
|
|
84
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
85
|
+
var _step$value = (0, _slicedToArray2["default"])(_step.value, 2),
|
|
86
|
+
key = _step$value[0],
|
|
87
|
+
val = _step$value[1];
|
|
88
|
+
if (!b.has(key)) {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
if (!_compare(val, b.get(key), currentDepth - 1)) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
} catch (err) {
|
|
96
|
+
_iterator.e(err);
|
|
97
|
+
} finally {
|
|
98
|
+
_iterator.f();
|
|
99
|
+
}
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
if (a instanceof Set && b instanceof Set) {
|
|
103
|
+
if (a.size !== b.size) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
var _iterator2 = _createForOfIteratorHelper(a.values()),
|
|
107
|
+
_step2;
|
|
108
|
+
try {
|
|
109
|
+
var _loop = function _loop() {
|
|
110
|
+
var val = _step2.value;
|
|
111
|
+
if (!(0, _toConsumableArray2["default"])(b).some(function (item) {
|
|
112
|
+
return _compare(val, item, currentDepth - 1);
|
|
113
|
+
})) {
|
|
114
|
+
return {
|
|
115
|
+
v: false
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
_ret;
|
|
120
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
121
|
+
_ret = _loop();
|
|
122
|
+
if (_ret) return _ret.v;
|
|
123
|
+
}
|
|
124
|
+
} catch (err) {
|
|
125
|
+
_iterator2.e(err);
|
|
126
|
+
} finally {
|
|
127
|
+
_iterator2.f();
|
|
128
|
+
}
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
var keysA = getComparableKeys(a, ignoredKeys);
|
|
132
|
+
var keysB = getComparableKeys(b, ignoredKeys);
|
|
133
|
+
if (keysA.length !== keysB.length) {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
var _iterator3 = _createForOfIteratorHelper(keysA),
|
|
137
|
+
_step3;
|
|
138
|
+
try {
|
|
139
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
140
|
+
var _key = _step3.value;
|
|
141
|
+
if (!Object.prototype.hasOwnProperty.call(b, _key)) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
if (!_compare(a[_key], b[_key], currentDepth - 1)) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
} catch (err) {
|
|
149
|
+
_iterator3.e(err);
|
|
150
|
+
} finally {
|
|
151
|
+
_iterator3.f();
|
|
152
|
+
}
|
|
153
|
+
return true;
|
|
154
|
+
};
|
|
155
|
+
return _compare(value1, value2, Math.max(0, depth));
|
|
156
|
+
};
|
package/core/util/security.js
CHANGED
|
@@ -30,7 +30,7 @@ var SecurityService = exports.SecurityService = /*#__PURE__*/function () {
|
|
|
30
30
|
function SecurityService() {
|
|
31
31
|
(0, _classCallCheck2["default"])(this, SecurityService);
|
|
32
32
|
} // Private constructor to enforce singleton
|
|
33
|
-
(0, _createClass2["default"])(SecurityService, [{
|
|
33
|
+
return (0, _createClass2["default"])(SecurityService, [{
|
|
34
34
|
key: "sanitizeHtml",
|
|
35
35
|
value:
|
|
36
36
|
/**
|
|
@@ -131,7 +131,6 @@ var SecurityService = exports.SecurityService = /*#__PURE__*/function () {
|
|
|
131
131
|
return SecurityService.instance;
|
|
132
132
|
}
|
|
133
133
|
}]);
|
|
134
|
-
return SecurityService;
|
|
135
134
|
}(); // Create hooks for easy use in React components
|
|
136
135
|
_SecurityService = SecurityService;
|
|
137
136
|
(0, _defineProperty2["default"])(SecurityService, "instance", void 0);
|
package/core/util/utils.js
CHANGED
|
@@ -4,7 +4,9 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.
|
|
7
|
+
exports.getUrlParams = exports.getRouteNameFromLink = exports.getItemLink = exports.getCurrentPath = exports.Utils = void 0;
|
|
8
|
+
exports.hasOwnObjectProperty = hasOwnObjectProperty;
|
|
9
|
+
exports.triggerItemAction = exports.openLink = exports.isJQueryError = exports.isInsecureContentRequest = void 0;
|
|
8
10
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
9
11
|
var _navigationMiddleware = require("@wavemaker/react-runtime/store/middleware/navigationMiddleware");
|
|
10
12
|
var _constants = require("../constants");
|
|
@@ -161,12 +163,12 @@ var triggerItemAction = exports.triggerItemAction = function triggerItemAction(i
|
|
|
161
163
|
var router = (0, _navigationMiddleware.getRouterInstance)();
|
|
162
164
|
var originalLink = item === null || item === void 0 ? void 0 : item.link;
|
|
163
165
|
var linkTarget = item === null || item === void 0 ? void 0 : item.target;
|
|
164
|
-
if (!originalLink || originalLink === "#" || originalLink === "javascript:void(0)") {
|
|
166
|
+
if (typeof originalLink === "function" || !originalLink || originalLink === "#" || originalLink === "javascript:void(0)") {
|
|
165
167
|
return; // No navigation needed
|
|
166
168
|
}
|
|
167
169
|
|
|
168
170
|
// Check if it's an internal navigation link (starts with # but not external)
|
|
169
|
-
if (originalLink.startsWith("#") && (!linkTarget || linkTarget === "_self")) {
|
|
171
|
+
if (originalLink !== null && originalLink !== void 0 && originalLink.startsWith("#") && (!linkTarget || linkTarget === "_self")) {
|
|
170
172
|
// Internal navigation - handle both "#/page" and "#page" formats
|
|
171
173
|
var queryParams = getUrlParams(originalLink);
|
|
172
174
|
var routeName = getRouteNameFromLink(originalLink);
|
|
@@ -192,10 +194,10 @@ var triggerItemAction = exports.triggerItemAction = function triggerItemAction(i
|
|
|
192
194
|
} else {
|
|
193
195
|
router === null || router === void 0 || router.push(routeName);
|
|
194
196
|
}
|
|
195
|
-
} else {
|
|
197
|
+
} else if (linkTarget || originalLink) {
|
|
196
198
|
// External link or link with different target
|
|
197
199
|
// For external links, use as-is (don't apply hyperLinkMofify)
|
|
198
|
-
openLink(originalLink, linkTarget);
|
|
200
|
+
openLink(originalLink, linkTarget || "");
|
|
199
201
|
}
|
|
200
202
|
};
|
|
201
203
|
var getCurrentPath = exports.getCurrentPath = function getCurrentPath() {
|
|
@@ -204,5 +206,12 @@ var getCurrentPath = exports.getCurrentPath = function getCurrentPath() {
|
|
|
204
206
|
};
|
|
205
207
|
var getItemLink = exports.getItemLink = function getItemLink(item, props) {
|
|
206
208
|
var linkProperty = props.itemlink || "link";
|
|
207
|
-
|
|
208
|
-
|
|
209
|
+
if (typeof item[linkProperty] === "function") {
|
|
210
|
+
return item[linkProperty]();
|
|
211
|
+
} else {
|
|
212
|
+
return item[linkProperty];
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
function hasOwnObjectProperty(obj, prop) {
|
|
216
|
+
return Object.prototype.hasOwnProperty.call(obj, prop);
|
|
217
|
+
}
|