@anywayseo/tools 1.5.4 → 2.1.0

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 (61) hide show
  1. package/README.md +69 -62
  2. package/dist/components/base/center/index.d.ts +1 -3
  3. package/dist/components/{expert → base/expert}/bio/index.d.ts +1 -1
  4. package/dist/components/{expert → base/expert}/index.d.ts +1 -1
  5. package/dist/components/base/grid/index.d.ts +3 -11
  6. package/dist/components/base/index.d.ts +2 -0
  7. package/dist/components/base/link-button/index.d.ts +2 -2
  8. package/dist/components/base/pulse-button/index.d.ts +8 -0
  9. package/dist/components/bonus-card/index.d.ts +1 -3
  10. package/dist/components/contact-form/index.d.ts +3 -1
  11. package/dist/components/expert-tip/index.d.ts +2 -3
  12. package/dist/components/faq/index.d.ts +2 -4
  13. package/dist/components/feature-card/index.d.ts +5 -0
  14. package/dist/components/features/index.d.ts +2 -3
  15. package/dist/components/game-card/index.d.ts +1 -3
  16. package/dist/components/game-demo/index.d.ts +3 -4
  17. package/dist/components/game-demo/preview/index.d.ts +3 -3
  18. package/dist/components/how-to/index.d.ts +2 -3
  19. package/dist/components/index.cjs +4 -1
  20. package/dist/components/index.d.ts +1 -0
  21. package/dist/components/index.mjs +12 -9
  22. package/dist/components/layout/footer/navigation/index.d.ts +5 -1
  23. package/dist/components/layout/header/{navbar/navigation → navigation}/desktop/item/index.d.ts +1 -1
  24. package/dist/components/layout/header/{navbar/navigation → navigation}/mobile/item/index.d.ts +1 -1
  25. package/dist/components/layout/header/{navbar/navigation → navigation}/types.d.ts +1 -1
  26. package/dist/components/list/index.d.ts +1 -2
  27. package/dist/components/pros-cons/index.d.ts +2 -3
  28. package/dist/components/table/index.d.ts +0 -1
  29. package/dist/components/tabs/index.d.ts +1 -2
  30. package/dist/index-BNb-P8a6.mjs +17 -0
  31. package/dist/index-BhsXlbd8.js +16 -0
  32. package/dist/{index-jvxaXXE3.js → index-BrTxsE2A.js} +18 -0
  33. package/dist/{index-C95D6IAi.mjs → index-CHSIkTv7.mjs} +138 -140
  34. package/dist/index-CnohyDGd.js +965 -0
  35. package/dist/{index-CJvs4SfG.mjs → index-j8Vo42fz.mjs} +18 -0
  36. package/dist/index.cjs +9 -5
  37. package/dist/index.mjs +17 -13
  38. package/dist/providers/index.cjs +3 -3
  39. package/dist/providers/index.d.ts +1 -1
  40. package/dist/providers/index.mjs +3 -3
  41. package/dist/providers/site-provider/index.d.ts +11 -0
  42. package/dist/types/components/image/index.d.ts +2 -0
  43. package/dist/types/components/index.d.ts +1 -0
  44. package/dist/types/index.d.ts +1 -1
  45. package/dist/types/site/index.d.ts +32 -0
  46. package/dist/utils/animation/index.d.ts +8 -0
  47. package/dist/utils/index.cjs +2 -1
  48. package/dist/utils/index.d.ts +1 -0
  49. package/dist/utils/index.mjs +2 -1
  50. package/package.json +104 -105
  51. package/dist/components/layout/header/navbar/index.d.ts +0 -6
  52. package/dist/index-BbMf3hdf.js +0 -967
  53. package/dist/index-Bs4zA1wD.mjs +0 -17
  54. package/dist/index-D96zh94V.js +0 -16
  55. package/dist/providers/site-metadata-provider/index.d.ts +0 -14
  56. package/dist/types/site-metadata/index.d.ts +0 -10
  57. /package/dist/components/layout/header/{navbar/brand → brand}/index.d.ts +0 -0
  58. /package/dist/components/layout/header/{navbar/navigation → navigation}/desktop/index.d.ts +0 -0
  59. /package/dist/components/layout/header/{navbar/navigation → navigation}/index.d.ts +0 -0
  60. /package/dist/components/layout/header/{navbar/navigation → navigation}/mobile/index.d.ts +0 -0
  61. /package/dist/components/layout/header/{navbar/theme-toggler → theme-toggler}/index.d.ts +0 -0
package/README.md CHANGED
@@ -1,62 +1,69 @@
1
- # Shared UI Components & Modules for Anywayseo projects
2
-
3
- A modular UI component library designed for Anywayseo blog sites, offering reusable React components and utilities to enhance development speed and consistency.
4
-
5
- ## Installation
6
-
7
- ```bash
8
- npm install @anywayseo/tools
9
- # or
10
- yarn add @anywayseo/tools
11
- ```
12
-
13
- ### Peer Dependencies
14
-
15
- This package requires the following peer dependencies:
16
-
17
- - "@chakra-ui/icons": "^2.0.0",
18
- - "@chakra-ui/react": "^2.0.0",
19
- - "@emotion/react": "^11.0.0",
20
- - "@emotion/styled": "^11.0.0",
21
- - "@mdx-js/react": "^2.0.0",
22
- - "framer-motion": "^12.0.6",
23
- - "gatsby": "^5.0.0",
24
- - "gatsby-plugin-image": "^3.0.0",
25
- - "i18next": "^24.0.0",
26
- - "react": "^18.3.1",
27
- - "react-dom": "^18.3.1",
28
- - "react-i18next": "^15.0.0"
29
-
30
- ## Usage
31
-
32
- Importing Components
33
-
34
- ```tsx
35
- import type { IAuthor } from '@anywayseo/tools';
36
- import { Author, getCurrentYear } from '@anywayseo/tools';
37
-
38
- const BlogPreview = ({ author }) => (
39
- <div>
40
- <Author author={author} />
41
- {getCurrentYear()}
42
- </div>
43
- );
44
- ```
45
-
46
- ## Available Modules:
47
-
48
- - Components
49
-
50
- - Hooks
51
-
52
- - i18n
53
-
54
- - Providers
55
-
56
- - Types
57
-
58
- - Utilities
59
-
60
- ## License
61
-
62
- MIT License © 2025 Anywayseo
1
+ # Shared UI Components & Modules for Anywayseo projects
2
+
3
+ A modular UI component library designed for Anywayseo blog sites, offering reusable React components and utilities to enhance development speed and consistency.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @anywayseo/tools
9
+ # or
10
+ yarn add @anywayseo/tools
11
+ ```
12
+
13
+ ### Peer Dependencies
14
+
15
+ This package requires the following peer dependencies:
16
+
17
+ - "@chakra-ui/icons": "^2.0.0",
18
+ - "@chakra-ui/react": "^2.0.0",
19
+ - "@emotion/react": "^11.0.0",
20
+ - "@emotion/styled": "^11.0.0",
21
+ - "@mdx-js/react": "^2.0.0",
22
+ - "framer-motion": "^12.0.6",
23
+ - "gatsby": "^5.0.0",
24
+ - "i18next": "^24.0.0",
25
+ - "react": "^18.3.1",
26
+ - "react-dom": "^18.3.1",
27
+ - "react-i18next": "^15.0.0"
28
+
29
+ ## Usage
30
+
31
+ ### Local Dev using Stand
32
+
33
+ ```bash
34
+ npm start
35
+ # or
36
+ yarn start
37
+ ```
38
+
39
+ ### Importing Components
40
+
41
+ ```tsx
42
+ import type { IAuthor } from '@anywayseo/tools';
43
+ import { Author, getCurrentYear } from '@anywayseo/tools';
44
+
45
+ const BlogPreview = ({ author }) => (
46
+ <div>
47
+ <Author author={author} />
48
+ {getCurrentYear()}
49
+ </div>
50
+ );
51
+ ```
52
+
53
+ ## Available Modules:
54
+
55
+ - Components
56
+
57
+ - Hooks
58
+
59
+ - i18n
60
+
61
+ - Providers
62
+
63
+ - Types
64
+
65
+ - Utilities
66
+
67
+ ## License
68
+
69
+ MIT License © 2025 Anywayseo
@@ -1,7 +1,5 @@
1
1
  import { FC, PropsWithChildren } from 'react';
2
2
  import { BoxPositionProps } from '../../../types';
3
- type CenterProps = PropsWithChildren<{
4
- className?: string;
5
- } & BoxPositionProps>;
3
+ type CenterProps = PropsWithChildren<BoxPositionProps>;
6
4
  declare const Center: FC<CenterProps>;
7
5
  export default Center;
@@ -1,5 +1,5 @@
1
1
  import { FC } from 'react';
2
- import { IAuthor } from '../../../types';
2
+ import { IAuthor } from '../../../../types';
3
3
  type BioProps = {
4
4
  content: IAuthor['bio'];
5
5
  maxLines?: number;
@@ -1,5 +1,5 @@
1
1
  import { FC } from 'react';
2
- import { IAuthor } from '../../types';
2
+ import { IAuthor } from '../../../types';
3
3
  type ExpertProps = {
4
4
  expert: IAuthor;
5
5
  variant: 'full' | 'short';
@@ -1,19 +1,11 @@
1
- import { Key } from 'react';
2
1
  import { BoxPositionProps, KeyGetter, RenderFunction } from '../../../types';
3
2
  import { ColumnsConfig, SpacingConfig } from './types';
4
- type GridGetKeyProp<T> = T extends {
5
- key: Key;
6
- } ? {
7
- getKey?: KeyGetter<T>;
8
- } : {
9
- getKey: KeyGetter<T>;
10
- };
11
3
  type GridProps<T> = {
12
4
  items: T[];
13
5
  columns?: ColumnsConfig;
14
6
  gap?: SpacingConfig;
15
- className?: string;
7
+ getKey?: KeyGetter<T>;
16
8
  render: RenderFunction<T>;
17
- } & GridGetKeyProp<T> & BoxPositionProps;
18
- declare const Grid: <T>({ items, columns, gap, render, getKey, className, ...boxProps }: GridProps<T>) => import("react/jsx-runtime").JSX.Element;
9
+ } & BoxPositionProps;
10
+ declare const Grid: <T>({ items, columns, gap, render, getKey, ...boxProps }: GridProps<T>) => import("react/jsx-runtime").JSX.Element;
19
11
  export default Grid;
@@ -1,3 +1,5 @@
1
1
  export { default as Center } from './center';
2
+ export { default as Expert } from './expert';
2
3
  export { default as Grid } from './grid';
3
4
  export { default as LinkButton } from './link-button';
5
+ export { default as PulseButton } from './pulse-button';
@@ -1,7 +1,7 @@
1
1
  import { FC } from 'react';
2
- import { ILink } from '../../../types';
2
+ import { BoxPositionProps, ILink } from '../../../types';
3
3
  type LinkButtonProps = ILink & {
4
4
  width?: 'auto' | 'full' | number;
5
- };
5
+ } & BoxPositionProps;
6
6
  declare const LinkButton: FC<LinkButtonProps>;
7
7
  export default LinkButton;
@@ -0,0 +1,8 @@
1
+ import { FC } from 'react';
2
+ import { BoxPositionProps } from '../../../types';
3
+ type PulseButtonProps = {
4
+ label: string;
5
+ onClick: VoidFunction;
6
+ } & BoxPositionProps;
7
+ declare const PulseButton: FC<PulseButtonProps>;
8
+ export default PulseButton;
@@ -1,7 +1,5 @@
1
1
  import { FC } from 'react';
2
2
  import { IBonusCard } from '../../types';
3
- type BonusCardProps = IBonusCard & {
4
- className?: string;
5
- };
3
+ type BonusCardProps = IBonusCard;
6
4
  declare const BonusCard: FC<BonusCardProps>;
7
5
  export default BonusCard;
@@ -1,3 +1,5 @@
1
1
  import { FC } from 'react';
2
- declare const ContactForm: FC;
2
+ import { BoxPositionProps } from '../../types';
3
+ type ContactFormProps = BoxPositionProps;
4
+ declare const ContactForm: FC<ContactFormProps>;
3
5
  export default ContactForm;
@@ -1,9 +1,8 @@
1
1
  import { FC } from 'react';
2
- import { BoxProps } from '@chakra-ui/react';
3
- import { IAuthor } from '../../types';
2
+ import { BoxPositionProps, IAuthor } from '../../types';
4
3
  type ExpertTipProps = {
5
4
  tip: string;
6
5
  expert?: IAuthor;
7
- } & BoxProps;
6
+ } & BoxPositionProps;
8
7
  declare const ExpertTip: FC<ExpertTipProps>;
9
8
  export default ExpertTip;
@@ -1,9 +1,7 @@
1
1
  import { FC } from 'react';
2
- import { BoxProps } from '@chakra-ui/react';
3
- import { IFaqItem } from '../../types';
2
+ import { BoxPositionProps, IFaqItem } from '../../types';
4
3
  type FaqProps = {
5
4
  items: IFaqItem[];
6
- mb?: BoxProps['mb'];
7
- };
5
+ } & BoxPositionProps;
8
6
  declare const Faq: FC<FaqProps>;
9
7
  export default Faq;
@@ -0,0 +1,5 @@
1
+ import { FC } from 'react';
2
+ import { IFeature } from '../../types';
3
+ type FeatureCardProps = IFeature;
4
+ declare const FeatureCard: FC<FeatureCardProps>;
5
+ export default FeatureCard;
@@ -1,8 +1,7 @@
1
1
  import { FC } from 'react';
2
- import { BoxProps } from '@chakra-ui/react';
3
- import { IFeature } from '../../types';
2
+ import { BoxPositionProps, IFeature } from '../../types';
4
3
  type FeaturesProps = {
5
4
  features: IFeature[];
6
- } & BoxProps;
5
+ } & BoxPositionProps;
7
6
  declare const Features: FC<FeaturesProps>;
8
7
  export default Features;
@@ -1,7 +1,5 @@
1
1
  import { FC } from 'react';
2
2
  import { IGameCard } from '../../types';
3
- type GameCardProps = IGameCard & {
4
- className?: string;
5
- };
3
+ type GameCardProps = IGameCard;
6
4
  declare const GameCard: FC<GameCardProps>;
7
5
  export default GameCard;
@@ -1,10 +1,9 @@
1
1
  import { FC } from 'react';
2
- import { BoxProps } from '@chakra-ui/react';
3
- import { GatsbyImageProps } from 'gatsby-plugin-image';
2
+ import { BoxPositionProps, ImageFit } from '../../types';
4
3
  type GameDemoProps = {
5
4
  name: string;
6
5
  src: string;
7
- previewImageFit?: GatsbyImageProps['objectFit'];
8
- } & BoxProps;
6
+ previewImageFit?: ImageFit;
7
+ } & BoxPositionProps;
9
8
  declare const GameDemo: FC<GameDemoProps>;
10
9
  export default GameDemo;
@@ -1,8 +1,8 @@
1
1
  import { FC } from 'react';
2
- import { GatsbyImageProps } from 'gatsby-plugin-image';
2
+ import { ImageFit } from '../../../types';
3
3
  type GameDemoPreviewProps = {
4
- gameName: string;
5
- previewImageFit?: GatsbyImageProps['objectFit'];
4
+ alt: string;
5
+ imageFit?: ImageFit;
6
6
  onPlay: VoidFunction;
7
7
  };
8
8
  declare const GameDemoPreview: FC<GameDemoPreviewProps>;
@@ -1,8 +1,7 @@
1
1
  import { FC } from 'react';
2
- import { IHowToStep } from '../../types';
3
- import { BoxProps } from '@chakra-ui/react';
2
+ import { BoxPositionProps, IHowToStep } from '../../types';
4
3
  type HowToProps = {
5
4
  steps: IHowToStep[];
6
- } & BoxProps;
5
+ } & BoxPositionProps;
7
6
  declare const HowTo: FC<HowToProps>;
8
7
  export default HowTo;
@@ -1,12 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const index = require("../index-BbMf3hdf.js");
3
+ const index = require("../index-CnohyDGd.js");
4
4
  exports.Author = index.Author;
5
5
  exports.BonusCard = index.BonusCard;
6
6
  exports.Center = index.Center;
7
7
  exports.ContactForm = index.ContactForm;
8
+ exports.Expert = index.Expert;
8
9
  exports.ExpertTip = index.ExpertTip;
9
10
  exports.Faq = index.Faq;
11
+ exports.FeatureCard = index.FeatureCard;
10
12
  exports.Features = index.Features;
11
13
  exports.GameCard = index.GameCard;
12
14
  exports.GameDemo = index.GameDemo;
@@ -17,6 +19,7 @@ exports.Layout = index.Layout;
17
19
  exports.LinkButton = index.LinkButton;
18
20
  exports.List = index.List;
19
21
  exports.ProsCons = index.ProsCons;
22
+ exports.PulseButton = index.PulseButton;
20
23
  exports.Seo = index.Seo;
21
24
  exports.Table = index.Table;
22
25
  exports.Tabs = index.Tabs;
@@ -4,6 +4,7 @@ export { default as BonusCard } from './bonus-card';
4
4
  export { default as ContactForm } from './contact-form';
5
5
  export { default as ExpertTip } from './expert-tip';
6
6
  export { default as Faq } from './faq';
7
+ export { default as FeatureCard } from './feature-card';
7
8
  export { default as Features } from './features';
8
9
  export { default as GameCard } from './game-card';
9
10
  export { default as GameDemo } from './game-demo';
@@ -1,22 +1,25 @@
1
- import { A, B, f, C, E, F, a, G, b, c, g, H, L, h, d, P, S, T, e } from "../index-C95D6IAi.mjs";
1
+ import { A, B, g, C, h, E, F, a, b, G, c, d, i, H, L, j, e, P, k, S, T, f } from "../index-CHSIkTv7.mjs";
2
2
  export {
3
3
  A as Author,
4
4
  B as BonusCard,
5
- f as Center,
5
+ g as Center,
6
6
  C as ContactForm,
7
+ h as Expert,
7
8
  E as ExpertTip,
8
9
  F as Faq,
9
- a as Features,
10
+ a as FeatureCard,
11
+ b as Features,
10
12
  G as GameCard,
11
- b as GameDemo,
12
- c as GameInfo,
13
- g as Grid,
13
+ c as GameDemo,
14
+ d as GameInfo,
15
+ i as Grid,
14
16
  H as HowTo,
15
17
  L as Layout,
16
- h as LinkButton,
17
- d as List,
18
+ j as LinkButton,
19
+ e as List,
18
20
  P as ProsCons,
21
+ k as PulseButton,
19
22
  S as Seo,
20
23
  T as Table,
21
- e as Tabs
24
+ f as Tabs
22
25
  };
@@ -1,3 +1,7 @@
1
1
  import { FC } from 'react';
2
- declare const Navigation: FC;
2
+ import { INavigationItem } from '../../../../types';
3
+ type NavigationProps = {
4
+ menu: INavigationItem[];
5
+ };
6
+ declare const Navigation: FC<NavigationProps>;
3
7
  export default Navigation;
@@ -1,5 +1,5 @@
1
1
  import { FC } from 'react';
2
- import { INavigationItem } from '../../../../../../../types';
2
+ import { INavigationItem } from '../../../../../../types';
3
3
  type DesktopNavItemProps = INavigationItem;
4
4
  declare const DesktopNavItem: FC<DesktopNavItemProps>;
5
5
  export default DesktopNavItem;
@@ -1,5 +1,5 @@
1
1
  import { FC } from 'react';
2
- import { INavigationItem } from '../../../../../../../types';
2
+ import { INavigationItem } from '../../../../../../types';
3
3
  type MobileNavItemProps = INavigationItem;
4
4
  declare const MobileNavItem: FC<MobileNavItemProps>;
5
5
  export default MobileNavItem;
@@ -1,4 +1,4 @@
1
- import { INavigationItem } from '../../../../../types';
1
+ import { INavigationItem } from '../../../../types';
2
2
  export type NavigationProps = {
3
3
  menu: INavigationItem[];
4
4
  };
@@ -7,7 +7,6 @@ type ListRenderProps<T> = T extends string ? {
7
7
  type ListProps<T = string> = {
8
8
  items: T[];
9
9
  bullet?: string;
10
- className?: string;
11
10
  } & ListRenderProps<T> & BoxPositionProps;
12
- declare const List: <T>({ items, bullet, render, className, ...boxProps }: ListProps<T>) => import("react/jsx-runtime").JSX.Element;
11
+ declare const List: <T>({ items, bullet, render, ...boxProps }: ListProps<T>) => import("react/jsx-runtime").JSX.Element;
13
12
  export default List;
@@ -1,8 +1,7 @@
1
1
  import { FC } from 'react';
2
- import { BoxProps } from '@chakra-ui/react';
3
- import { ProsConsItems } from '../../types';
2
+ import { BoxPositionProps, ProsConsItems } from '../../types';
4
3
  type ProsConsProps = {
5
4
  items: ProsConsItems;
6
- } & BoxProps;
5
+ } & BoxPositionProps;
7
6
  declare const ProsCons: FC<ProsConsProps>;
8
7
  export default ProsCons;
@@ -7,7 +7,6 @@ type TableProps = {
7
7
  bordered?: boolean;
8
8
  striped?: boolean;
9
9
  scrollable?: boolean;
10
- className?: string;
11
10
  } & BoxPositionProps;
12
11
  declare const Table: FC<TableProps>;
13
12
  export default Table;
@@ -1,8 +1,7 @@
1
1
  import { BoxPositionProps, ITabItem, RenderFunction } from '../../types';
2
2
  type TabsProps<T> = {
3
3
  items: ITabItem<T>[];
4
- className?: string;
5
4
  render: RenderFunction<T>;
6
5
  } & BoxPositionProps;
7
- declare const Tabs: <T>({ items, className, render, ...boxProps }: TabsProps<T>) => import("react/jsx-runtime").JSX.Element;
6
+ declare const Tabs: <T>({ items, render, ...boxProps }: TabsProps<T>) => import("react/jsx-runtime").JSX.Element;
8
7
  export default Tabs;
@@ -0,0 +1,17 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext } from "react";
3
+ const SiteContext = createContext(null);
4
+ const SiteProvider = ({ children, ...value }) => {
5
+ return /* @__PURE__ */ jsx(SiteContext.Provider, { value, children });
6
+ };
7
+ function useSiteContext() {
8
+ const context = useContext(SiteContext);
9
+ if (!context) {
10
+ throw new Error("useSiteContext must be used within SiteProvider");
11
+ }
12
+ return context;
13
+ }
14
+ export {
15
+ SiteProvider as S,
16
+ useSiteContext as u
17
+ };
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ const jsxRuntime = require("react/jsx-runtime");
3
+ const react = require("react");
4
+ const SiteContext = react.createContext(null);
5
+ const SiteProvider = ({ children, ...value }) => {
6
+ return /* @__PURE__ */ jsxRuntime.jsx(SiteContext.Provider, { value, children });
7
+ };
8
+ function useSiteContext() {
9
+ const context = react.useContext(SiteContext);
10
+ if (!context) {
11
+ throw new Error("useSiteContext must be used within SiteProvider");
12
+ }
13
+ return context;
14
+ }
15
+ exports.SiteProvider = SiteProvider;
16
+ exports.useSiteContext = useSiteContext;
@@ -1,6 +1,23 @@
1
1
  "use strict";
2
+ const react = require("@emotion/react");
2
3
  require("./index-DCIXk-YH.js");
3
4
  const i18n = require("i18next");
5
+ const pulse = react.keyframes`
6
+ 0% {
7
+ box-shadow: 0 0 0 0 var(--chakra-colors-brand-100);
8
+ }
9
+
10
+ 50% {
11
+ box-shadow: 0 0 0 0.8rem rgba(0, 0, 0, 0);
12
+ }
13
+
14
+ 100% {
15
+ box-shadow: 0 0 0 0 rgba(0, 0, 0, 0);
16
+ }
17
+ `;
18
+ const Animation = {
19
+ pulse
20
+ };
4
21
  function getCurrentYear() {
5
22
  const locale = i18n.language;
6
23
  const currentDate = /* @__PURE__ */ new Date();
@@ -78,6 +95,7 @@ const protocolRegex = /^https?:\/\//;
78
95
  function getDomain(url) {
79
96
  return url.replace(protocolRegex, "");
80
97
  }
98
+ exports.Animation = Animation;
81
99
  exports.formatDate = formatDate;
82
100
  exports.formatNumber = formatNumber;
83
101
  exports.getCurrencySymbol = getCurrencySymbol;