framework7-svelte 7.0.0-beta.2 → 7.0.0-beta.20

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 (130) hide show
  1. package/components/accordion-content.svelte +3 -3
  2. package/components/accordion-item.svelte +4 -4
  3. package/components/accordion-toggle.svelte +3 -3
  4. package/components/accordion.svelte +3 -3
  5. package/components/actions-button.svelte +4 -4
  6. package/components/actions-group.svelte +3 -3
  7. package/components/actions-label.svelte +3 -3
  8. package/components/actions.svelte +5 -5
  9. package/components/app.svelte +3 -3
  10. package/components/appbar.svelte +3 -3
  11. package/components/area-chart.svelte +3 -3
  12. package/components/badge.svelte +4 -4
  13. package/components/block-footer.svelte +3 -3
  14. package/components/block-header.svelte +3 -3
  15. package/components/block-title.svelte +3 -3
  16. package/components/block.svelte +4 -4
  17. package/components/breadcrumbs-collapsed.d.ts +17 -0
  18. package/components/breadcrumbs-collapsed.svelte +21 -0
  19. package/components/breadcrumbs-item.d.ts +18 -0
  20. package/components/breadcrumbs-item.svelte +15 -0
  21. package/components/breadcrumbs-separator.d.ts +17 -0
  22. package/components/breadcrumbs-separator.svelte +11 -0
  23. package/components/breadcrumbs.d.ts +17 -0
  24. package/components/breadcrumbs.svelte +13 -0
  25. package/components/button.svelte +6 -6
  26. package/components/card-content.svelte +3 -3
  27. package/components/card-footer.svelte +3 -3
  28. package/components/card-header.svelte +3 -3
  29. package/components/card.svelte +4 -4
  30. package/components/checkbox.svelte +5 -4
  31. package/components/chip.svelte +5 -5
  32. package/components/col.svelte +4 -4
  33. package/components/fab-backdrop.svelte +2 -2
  34. package/components/fab-button.svelte +5 -5
  35. package/components/fab-buttons.svelte +3 -3
  36. package/components/fab.svelte +5 -5
  37. package/components/gauge.svelte +16 -9
  38. package/components/icon.svelte +7 -6
  39. package/components/input.svelte +4 -4
  40. package/components/link.svelte +12 -8
  41. package/components/list-button.svelte +5 -5
  42. package/components/list-group.svelte +10 -7
  43. package/components/list-index.svelte +4 -4
  44. package/components/list-input.svelte +5 -5
  45. package/components/list-item-cell.svelte +3 -3
  46. package/components/list-item-row.svelte +3 -3
  47. package/components/list-item.svelte +8 -8
  48. package/components/list.d.ts +2 -1
  49. package/components/list.svelte +12 -6
  50. package/components/login-screen-title.svelte +3 -3
  51. package/components/login-screen.svelte +5 -5
  52. package/components/menu-dropdown-item.svelte +4 -4
  53. package/components/menu-dropdown.svelte +3 -3
  54. package/components/menu-item.svelte +7 -7
  55. package/components/menu.svelte +3 -3
  56. package/components/message.svelte +3 -3
  57. package/components/messagebar-attachment.svelte +4 -4
  58. package/components/messagebar-attachments.svelte +3 -3
  59. package/components/messagebar-sheet-image.svelte +3 -3
  60. package/components/messagebar-sheet-item.svelte +3 -3
  61. package/components/messagebar-sheet.svelte +3 -3
  62. package/components/messagebar.svelte +4 -4
  63. package/components/messages-title.svelte +3 -3
  64. package/components/messages.svelte +4 -4
  65. package/components/nav-left.svelte +4 -4
  66. package/components/nav-right.svelte +3 -3
  67. package/components/nav-title-large.svelte +3 -3
  68. package/components/nav-title.svelte +3 -3
  69. package/components/navbar.svelte +5 -5
  70. package/components/page-content.svelte +5 -5
  71. package/components/page.svelte +4 -4
  72. package/components/panel.svelte +5 -4
  73. package/components/photo-browser.svelte +2 -2
  74. package/components/pie-chart.svelte +3 -3
  75. package/components/popover.svelte +5 -5
  76. package/components/popup.svelte +5 -5
  77. package/components/preloader.svelte +4 -4
  78. package/components/progressbar.svelte +4 -4
  79. package/components/radio.svelte +5 -4
  80. package/components/range.svelte +4 -4
  81. package/components/routable-modals.svelte +1 -1
  82. package/components/row.svelte +4 -4
  83. package/components/searchbar.svelte +4 -4
  84. package/components/segmented.svelte +3 -3
  85. package/components/sheet.svelte +12 -5
  86. package/components/skeleton-avatar.d.ts +1 -0
  87. package/components/skeleton-avatar.js +1 -0
  88. package/components/skeleton-block.d.ts +1 -0
  89. package/components/skeleton-block.js +1 -0
  90. package/components/skeleton-image.d.ts +1 -0
  91. package/components/skeleton-image.js +1 -0
  92. package/components/skeleton-text.d.ts +1 -0
  93. package/components/skeleton-text.js +1 -0
  94. package/components/stepper.svelte +4 -4
  95. package/components/subnavbar.svelte +3 -3
  96. package/components/swipeout-actions.svelte +3 -3
  97. package/components/swipeout-button.svelte +5 -4
  98. package/components/swiper-slide.d.ts +1 -0
  99. package/components/swiper-slide.js +1 -0
  100. package/components/swiper.d.ts +1 -0
  101. package/components/swiper.js +1 -0
  102. package/components/tab.svelte +5 -5
  103. package/components/tabs.svelte +3 -3
  104. package/components/text-editor.svelte +4 -4
  105. package/components/toggle.svelte +5 -5
  106. package/components/toolbar.svelte +6 -6
  107. package/components/treeview-item.svelte +5 -5
  108. package/components/treeview.svelte +3 -3
  109. package/components/view.d.ts +1 -0
  110. package/components/view.svelte +9 -7
  111. package/components/views.svelte +3 -3
  112. package/framework7-svelte.d.ts +5 -1
  113. package/framework7-svelte.js +11 -7
  114. package/package.json +3 -1
  115. package/shared/components-router.js +30 -22
  116. package/shared/f7.js +31 -23
  117. package/shared/get-router-initial-component.js +1 -1
  118. package/shared/mixins.js +3 -3
  119. package/shared/modal-state-classes.js +5 -4
  120. package/shared/plugin.js +9 -4
  121. package/shared/rest-props.js +6 -2
  122. package/shared/router-open-in-component.svelte +41 -0
  123. package/shared/router-open-in.js +47 -0
  124. package/shared/use-icon.js +5 -1
  125. package/shared/use-smart-select.js +2 -2
  126. package/shared/use-store.js +10 -10
  127. package/shared/use-tab.js +1 -1
  128. package/shared/use-theme.js +1 -1
  129. package/shared/use-tooltip.js +6 -4
  130. package/shared/utils.js +11 -2
@@ -1,6 +1,7 @@
1
1
  /* eslint no-underscore-dangle: "off" */
2
- import { app } from './f7';
3
- import { extend, getComponentId } from './utils';
2
+ import { app } from './f7.js';
3
+ import { extend, getComponentId } from './utils.js';
4
+ import { routerOpenIn } from './router-open-in.js';
4
5
 
5
6
  const getChildrenArray = el => {
6
7
  const arr = [];
@@ -21,13 +22,18 @@ const hasSameChildren = (childrenBefore, childrenAfter) => {
21
22
 
22
23
  export default {
23
24
  proto: {
24
- pageComponentLoader({
25
- routerEl,
26
- component,
27
- options,
28
- resolve,
29
- reject
30
- }) {
25
+ openIn(router, navigateUrl, options) {
26
+ return routerOpenIn(router, navigateUrl, options);
27
+ },
28
+
29
+ pageComponentLoader(_ref) {
30
+ let {
31
+ routerEl,
32
+ component,
33
+ options,
34
+ resolve,
35
+ reject
36
+ } = _ref;
31
37
  const router = this;
32
38
  const routerId = router.id;
33
39
  const el = routerEl;
@@ -112,13 +118,14 @@ export default {
112
118
  }
113
119
  },
114
120
 
115
- tabComponentLoader({
116
- tabEl,
117
- component,
118
- options,
119
- resolve,
120
- reject
121
- } = {}) {
121
+ tabComponentLoader(_temp) {
122
+ let {
123
+ tabEl,
124
+ component,
125
+ options,
126
+ resolve,
127
+ reject
128
+ } = _temp === void 0 ? {} : _temp;
122
129
  const router = this;
123
130
  if (!tabEl) reject();
124
131
  let tabRouter;
@@ -174,12 +181,13 @@ export default {
174
181
  tabRouter.setTabContent(null);
175
182
  },
176
183
 
177
- modalComponentLoader({
178
- component,
179
- options,
180
- resolve,
181
- reject
182
- } = {}) {
184
+ modalComponentLoader(_temp2) {
185
+ let {
186
+ component,
187
+ options,
188
+ resolve,
189
+ reject
190
+ } = _temp2 === void 0 ? {} : _temp2;
183
191
  const router = this;
184
192
  const modalsRouter = app.f7routers.modals;
185
193
 
package/shared/f7.js CHANGED
@@ -1,27 +1,27 @@
1
1
  /* eslint-disable import/no-mutable-exports */
2
2
  // eslint-disable-next-line
3
- import Framework7 from 'framework7/lite';
4
- import { extend, unsetRouterIds } from './utils';
3
+ import { extend, unsetRouterIds } from './utils.js';
5
4
  let f7;
6
- const theme = {}; // eslint-disable-next-line
7
-
8
- if (!Framework7.__app__) {
9
- // eslint-disable-next-line
10
- Framework7.__app__ = {
11
- f7: undefined,
12
- f7events: undefined,
13
- theme: {},
14
- f7routers: {
15
- views: [],
16
- tabs: [],
17
- modals: null
18
- }
19
- };
5
+ const theme = {};
6
+ /* eslint-disable no-restricted-globals */
7
+
8
+ const app = typeof window !== 'undefined' && window.Framework7ComponentsApp ? window.Framework7ComponentsApp : {
9
+ Framework7: undefined,
10
+ f7: undefined,
11
+ f7events: undefined,
12
+ theme: {},
13
+ f7routers: {
14
+ views: [],
15
+ tabs: [],
16
+ modals: null
17
+ }
18
+ };
19
+
20
+ if (typeof window !== 'undefined') {
21
+ window.Framework7ComponentsApp = app;
20
22
  }
23
+ /* eslint-enable no-restricted-globals */
21
24
 
22
- const {
23
- __app__: app
24
- } = Framework7;
25
25
 
26
26
  app.setInstance = instance => {
27
27
  f7 = instance;
@@ -51,10 +51,18 @@ const cleanup = () => {
51
51
  };
52
52
 
53
53
  const f7initEvents = () => {
54
- app.f7events = new Framework7.Events();
54
+ app.f7events = new app.Framework7.Events();
55
55
  };
56
56
 
57
- const f7init = (rootEl, params = {}, init = true) => {
57
+ const f7init = function (rootEl, params, init) {
58
+ if (params === void 0) {
59
+ params = {};
60
+ }
61
+
62
+ if (init === void 0) {
63
+ init = true;
64
+ }
65
+
58
66
  const f7Params = extend({}, params, {
59
67
  el: rootEl,
60
68
  init
@@ -63,7 +71,7 @@ const f7init = (rootEl, params = {}, init = true) => {
63
71
  if (!f7Params.routes) f7Params.routes = [];
64
72
 
65
73
  if (f7Params.userAgent && (f7Params.theme === 'auto' || !f7Params.theme)) {
66
- const device = Framework7.getDevice({
74
+ const device = app.Framework7.getDevice({
67
75
  userAgent: f7Params.userAgent
68
76
  }, true);
69
77
  app.theme.ios = !!device.ios;
@@ -75,7 +83,7 @@ const f7init = (rootEl, params = {}, init = true) => {
75
83
  if (app.f7 && typeof window !== 'undefined') return; // eslint-disable-next-line
76
84
 
77
85
  if (typeof window === 'undefined') cleanup();
78
- const instance = new Framework7(f7Params);
86
+ const instance = new app.Framework7(f7Params);
79
87
  app.f7 = instance;
80
88
  f7 = instance;
81
89
  app.setInstance(instance);
@@ -1,4 +1,4 @@
1
- import { getComponentId } from './utils';
1
+ import { getComponentId } from './utils.js';
2
2
  export const getRouterInitialComponent = (router, initialComponent) => {
3
3
  let initialComponentData;
4
4
  const {
package/shared/mixins.js CHANGED
@@ -1,4 +1,4 @@
1
- import { isStringProp } from './utils';
1
+ import { isStringProp } from './utils.js';
2
2
  export function colorClasses(props) {
3
3
  const {
4
4
  color,
@@ -7,10 +7,10 @@ export function colorClasses(props) {
7
7
  bgColor,
8
8
  borderColor,
9
9
  rippleColor,
10
- themeDark
10
+ dark
11
11
  } = props;
12
12
  return {
13
- 'theme-dark': themeDark,
13
+ dark,
14
14
  [`color-${color}`]: color,
15
15
  [`color-theme-${colorTheme}`]: colorTheme,
16
16
  [`text-color-${textColor}`]: textColor,
@@ -1,7 +1,8 @@
1
- export const modalStateClasses = ({
2
- isOpened,
3
- isClosing
4
- } = {}) => {
1
+ export const modalStateClasses = function (_temp) {
2
+ let {
3
+ isOpened,
4
+ isClosing
5
+ } = _temp === void 0 ? {} : _temp;
5
6
  return {
6
7
  'modal-in': isOpened && !isClosing,
7
8
  'modal-out': isClosing
package/shared/plugin.js CHANGED
@@ -1,12 +1,17 @@
1
1
  // eslint-disable-next-line
2
- import Framework7 from 'framework7/lite';
3
- import componentsRouter from './components-router';
4
- import { f7ready, theme, app, f7initEvents, setTheme } from './f7';
2
+ import componentsRouter from './components-router.js';
3
+ import { f7ready, theme, app, f7initEvents, setTheme } from './f7.js';
5
4
  const Framework7Svelte = {
6
5
  name: 'sveltePlugin',
7
6
  installed: false,
8
7
 
9
- install(params = {}) {
8
+ install(params) {
9
+ if (params === void 0) {
10
+ params = {};
11
+ }
12
+
13
+ const Framework7 = this;
14
+ app.Framework7 = Framework7;
10
15
  if (Framework7Svelte.installed) return;
11
16
  Framework7Svelte.installed = true;
12
17
  f7initEvents();
@@ -1,5 +1,9 @@
1
- const ignoreProps = ['color', 'colorTheme', 'textColor', 'bgColor', 'borderColor', 'rippleColor', 'themeDark', 'force', 'reloadCurrent', 'reloadPrevious', 'reloadAll', 'reloadDetail', 'animate', 'ignoreCache', 'routeTabId', 'view', 'transition', 'openIn', 'back', 'linkBack', 'external', 'preventRouter', 'searchbarEnable', 'searchbarDisable', 'searchbarClear', 'searchbarToggle', 'panelOpen', 'panelClose', 'panelToggle', 'popupOpen', 'popupClose', 'actionsOpen', 'actionsClose', 'popoverOpen', 'popoverClose', 'loginScreenOpen', 'loginScreenClose', 'sheetOpen', 'sheetClose', 'sortableEnable', 'sortableDisable', 'sortableToggle', 'cardOpen', 'cardClose'];
2
- export function restProps(rest = {}) {
1
+ const ignoreProps = ['color', 'colorTheme', 'textColor', 'bgColor', 'borderColor', 'rippleColor', 'dark', 'force', 'reloadCurrent', 'reloadPrevious', 'reloadAll', 'reloadDetail', 'animate', 'ignoreCache', 'routeTabId', 'view', 'transition', 'openIn', 'back', 'linkBack', 'external', 'preventRouter', 'searchbarEnable', 'searchbarDisable', 'searchbarClear', 'searchbarToggle', 'panelOpen', 'panelClose', 'panelToggle', 'popupOpen', 'popupClose', 'actionsOpen', 'actionsClose', 'popoverOpen', 'popoverClose', 'loginScreenOpen', 'loginScreenClose', 'sheetOpen', 'sheetClose', 'sortableEnable', 'sortableDisable', 'sortableToggle', 'cardOpen', 'cardClose'];
2
+ export function restProps(rest) {
3
+ if (rest === void 0) {
4
+ rest = {};
5
+ }
6
+
3
7
  const props = {};
4
8
  Object.keys(rest).filter(prop => !ignoreProps.includes(prop)).forEach(key => {
5
9
  if (key.indexOf('on') !== 0) {
@@ -0,0 +1,41 @@
1
+ <script>
2
+ import Popup from '../components/popup.svelte';
3
+ import View from '../components/view.svelte';
4
+ import LoginScreen from '../components/login-screen.svelte';
5
+ import Sheet from '../components/sheet.svelte';
6
+ import Popover from '../components/popover.svelte';
7
+ import Panel from '../components/panel.svelte';
8
+
9
+ export let openIn;
10
+ export let url;
11
+ export let viewSelector;
12
+ export let targetEl;
13
+ export let side;
14
+ export let effect;
15
+ </script>
16
+
17
+ {#if openIn === 'popup'}
18
+ <Popup className="popup-router-open-in" data-url={url}>
19
+ <View linksView={viewSelector} {url} ignoreOpenIn />
20
+ </Popup>
21
+ {/if}
22
+ {#if openIn === 'loginScreen'}
23
+ <LoginScreen className="login-screen-router-open-in" data-url={url}>
24
+ <View linksView={viewSelector} {url} ignoreOpenIn />
25
+ </LoginScreen>
26
+ {/if}
27
+ {#if openIn === 'sheet'}
28
+ <Sheet className="sheet-modal-router-open-in" data-url={url}>
29
+ <View linksView={viewSelector} {url} ignoreOpenIn />
30
+ </Sheet>
31
+ {/if}
32
+ {#if openIn === 'popover'}
33
+ <Popover className="popover-router-open-in" {targetEl} data-url={url}>
34
+ <View linksView={viewSelector} {url} ignoreOpenIn />
35
+ </Popover>
36
+ {/if}
37
+ {#if openIn.indexOf('panel') === 0}
38
+ <Panel {side} {effect} className="panel-router-open-in" data-url={url}>
39
+ <View linksView={viewSelector} {url} ignoreOpenIn />
40
+ </Panel>
41
+ {/if}
@@ -0,0 +1,47 @@
1
+ import RouterOpenInComponent from './router-open-in-component.svelte';
2
+ export const routerOpenIn = (router, url, options) => {
3
+ const navigateOptions = {
4
+ url,
5
+ route: {
6
+ path: url,
7
+ options: { ...options,
8
+ openIn: undefined,
9
+ props: { ...(options.props || {}),
10
+ url,
11
+ openIn: options.openIn,
12
+ viewSelector: router.view.selector
13
+ }
14
+ }
15
+ }
16
+ };
17
+ const params = { ...options
18
+ };
19
+ params.component = RouterOpenInComponent;
20
+
21
+ if (options.openIn === 'popup') {
22
+ navigateOptions.route.popup = params;
23
+ }
24
+
25
+ if (options.openIn === 'loginScreen') {
26
+ navigateOptions.route.loginScreen = params;
27
+ }
28
+
29
+ if (options.openIn === 'sheet') {
30
+ navigateOptions.route.sheet = params;
31
+ }
32
+
33
+ if (options.openIn === 'popover') {
34
+ params.targetEl = options.clickedEl || options.targetEl;
35
+ navigateOptions.route.popover = params;
36
+ navigateOptions.route.options.props.targetEl = params.targetEl;
37
+ }
38
+
39
+ if (options.openIn.indexOf('panel') >= 0) {
40
+ const parts = options.openIn.split(':');
41
+ navigateOptions.route.options.props.side = parts[1] || 'left';
42
+ navigateOptions.route.options.props.effect = parts[2] || 'cover';
43
+ navigateOptions.route.panel = params;
44
+ }
45
+
46
+ return router.navigate(navigateOptions);
47
+ };
@@ -1,4 +1,8 @@
1
- export const useIcon = (props = {}) => {
1
+ export const useIcon = function (props) {
2
+ if (props === void 0) {
3
+ props = {};
4
+ }
5
+
2
6
  const {
3
7
  icon,
4
8
  iconMaterial,
@@ -1,7 +1,7 @@
1
1
  // eslint-disable-next-line
2
2
  import { onMount, onDestroy } from 'svelte';
3
- import { f7ready, app } from './f7';
4
- import { extend } from './utils';
3
+ import { f7ready, app } from './f7.js';
4
+ import { extend } from './utils.js';
5
5
  export const useSmartSelect = (props, setInstance, getEl) => {
6
6
  let f7SmartSelect;
7
7
  onMount(() => {
@@ -1,21 +1,21 @@
1
1
  // eslint-disable-next-line
2
2
  import { onDestroy } from 'svelte';
3
- import { f7 } from './f7';
4
- export const useStore = (...args) => {
3
+ import { f7 } from './f7.js';
4
+ export const useStore = function () {
5
5
  // (store, getter, callback)
6
- let store = args[0];
7
- let getter = args[1];
8
- let callback = args[2];
6
+ let store = arguments.length <= 0 ? undefined : arguments[0];
7
+ let getter = arguments.length <= 1 ? undefined : arguments[1];
8
+ let callback = arguments.length <= 2 ? undefined : arguments[2];
9
9
 
10
- if (args.length === 1) {
10
+ if (arguments.length === 1) {
11
11
  // (getter)
12
12
  store = f7.store;
13
- getter = args[0];
14
- } else if (args.length === 2 && typeof args[0] === 'string') {
13
+ getter = arguments.length <= 0 ? undefined : arguments[0];
14
+ } else if (arguments.length === 2 && typeof (arguments.length <= 0 ? undefined : arguments[0]) === 'string') {
15
15
  // (getter, callback)
16
16
  store = f7.store;
17
- getter = args[0];
18
- callback = args[1];
17
+ getter = arguments.length <= 0 ? undefined : arguments[0];
18
+ callback = arguments.length <= 1 ? undefined : arguments[1];
19
19
  } // eslint-disable-next-line
20
20
 
21
21
 
package/shared/use-tab.js CHANGED
@@ -1,6 +1,6 @@
1
1
  // eslint-disable-next-line
2
2
  import { onMount, onDestroy } from 'svelte';
3
- import { f7, f7ready } from './f7';
3
+ import { f7, f7ready } from './f7.js';
4
4
  export const useTab = (getEl, emit) => {
5
5
  const onTabShow = el => {
6
6
  if (getEl() !== el) return;
@@ -1,4 +1,4 @@
1
- import { f7ready, app } from './f7';
1
+ import { f7ready, app } from './f7.js';
2
2
  export const useTheme = set => {
3
3
  const t = app.f7 ? app.theme : null;
4
4
 
@@ -1,4 +1,4 @@
1
- import { app, f7ready } from './f7';
1
+ import { app, f7ready } from './f7.js';
2
2
  export const useTooltip = (el, props) => {
3
3
  let f7Tooltip = null;
4
4
  const {
@@ -17,9 +17,11 @@ export const useTooltip = (el, props) => {
17
17
  }
18
18
 
19
19
  return {
20
- update({
21
- tooltip: value
22
- } = {}) {
20
+ update(_temp) {
21
+ let {
22
+ tooltip: value
23
+ } = _temp === void 0 ? {} : _temp;
24
+
23
25
  if (!value && f7Tooltip) {
24
26
  f7Tooltip.destroy();
25
27
  f7Tooltip = null;
package/shared/utils.js CHANGED
@@ -14,11 +14,15 @@ export function isObject(o) {
14
14
  export function now() {
15
15
  return Date.now();
16
16
  }
17
- export function extend(...args) {
17
+ export function extend() {
18
18
  let deep = true;
19
19
  let to;
20
20
  let from;
21
21
 
22
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
23
+ args[_key] = arguments[_key];
24
+ }
25
+
22
26
  if (typeof args[0] === 'boolean') {
23
27
  [deep, to] = args;
24
28
  args.splice(0, 2);
@@ -57,8 +61,13 @@ export function extend(...args) {
57
61
 
58
62
  return to;
59
63
  }
60
- export function classNames(...args) {
64
+ export function classNames() {
61
65
  const classes = [];
66
+
67
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
68
+ args[_key2] = arguments[_key2];
69
+ }
70
+
62
71
  args.forEach(arg => {
63
72
  if (typeof arg === 'object' && arg.constructor === Object) {
64
73
  Object.keys(arg).forEach(key => {