Files
mintel.me/cloned-websites/mintel_me/why-valueobjects-make-your-app-rock-solid/index.html
2026-02-01 00:47:50 +01:00

912 lines
84 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html><html lang="en-US" class="js lenis"><head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5"><title>Why I Fully Ditched Default Exports in TypeScript</title>
<style>img:is([sizes="auto" i], [sizes^="auto," i]) { contain-intrinsic-size: 3000px 1500px }</style>
<meta name="dc.title" content="Why I Fully Ditched Default Exports in TypeScript">
<meta name="dc.description" content="Discover why switching from default to named exports enhances clarity, refactoring, and IDE support in TypeScript development.">
<meta name="dc.relation" content="https://mintel.me/why-valueobjects-make-your-app-rock-solid/">
<meta name="dc.source" content="https://mintel.me/">
<meta name="dc.language" content="en_US">
<meta name="description" content="Discover why switching from default to named exports enhances clarity, refactoring, and IDE support in TypeScript development.">
<meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1">
<link rel="canonical" href="https://mintel.me/why-valueobjects-make-your-app-rock-solid/">
<meta property="og:url" content="https://mintel.me/why-valueobjects-make-your-app-rock-solid/">
<meta property="og:site_name" content="Marc Mintel">
<meta property="og:locale" content="en_US">
<meta property="og:type" content="article">
<meta property="og:title" content="Why I Fully Ditched Default Exports in TypeScript">
<meta property="og:description" content="Discover why switching from default to named exports enhances clarity, refactoring, and IDE support in TypeScript development.">
<meta property="og:image" content="../wp-content/uploads/2025/01/carbon-7.webp">
<meta property="og:image:secure_url" content="https://mintel.me/wp-content/uploads/2025/01/carbon-7.webp">
<meta property="og:image:width" content="1920">
<meta property="og:image:height" content="1505">
<meta property="fb:pages" content="">
<meta property="fb:admins" content="">
<meta property="fb:app_id" content="">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Why I Fully Ditched Default Exports in TypeScript">
<meta name="twitter:description" content="Discover why switching from default to named exports enhances clarity, refactoring, and IDE support in TypeScript development.">
<meta name="twitter:image" content="https://mintel.me/wp-content/uploads/2025/01/carbon-7-1024x803.webp">
<link rel="dns-prefetch" href="//fonts.googleapis.com">
<link rel="alternate" type="application/rss+xml" title="Marc Mintel » Feed" href="https://mintel.me/feed/">
<link rel="alternate" type="application/rss+xml" title="Marc Mintel » Comments Feed" href="https://mintel.me/comments/feed/">
<link rel="preload" href="https://mintel.me/wp-content/themes/salient/css/fonts/icomoon.woff?v=1.6" as="font" type="font/woff" crossorigin="anonymous"><link rel="stylesheet" id="device_wrapper-simplebar-css" href="../wp-content/plugins/device-wrapper/src/css/simplebar.css" type="text/css" media="all">
<link rel="stylesheet" id="device_wrapper-style-css-css" href="../wp-content/plugins/device-wrapper/dist/blocks.style.build.css" type="text/css" media="all">
<style id="wpseopress-local-business-style-inline-css" type="text/css">
span.wp-block-wpseopress-local-business-field{margin-right:8px}
</style>
<style id="filebird-block-filebird-gallery-style-inline-css" type="text/css">
ul.filebird-block-filebird-gallery{margin:auto!important;padding:0!important;width:100%}ul.filebird-block-filebird-gallery.layout-grid{display:grid;grid-gap:20px;align-items:stretch;grid-template-columns:repeat(var(--columns),1fr);justify-items:stretch}ul.filebird-block-filebird-gallery.layout-grid li img{border:1px solid #ccc;box-shadow:2px 2px 6px 0 rgba(0,0,0,.3);height:100%;max-width:100%;-o-object-fit:cover;object-fit:cover;width:100%}ul.filebird-block-filebird-gallery.layout-masonry{-moz-column-count:var(--columns);-moz-column-gap:var(--space);column-gap:var(--space);-moz-column-width:var(--min-width);columns:var(--min-width) var(--columns);display:block;overflow:auto}ul.filebird-block-filebird-gallery.layout-masonry li{margin-bottom:var(--space)}ul.filebird-block-filebird-gallery li{list-style:none}ul.filebird-block-filebird-gallery li figure{height:100%;margin:0;padding:0;position:relative;width:100%}ul.filebird-block-filebird-gallery li figure figcaption{background:linear-gradient(0deg,rgba(0,0,0,.7),rgba(0,0,0,.3) 70%,transparent);bottom:0;box-sizing:border-box;color:#fff;font-size:.8em;margin:0;max-height:100%;overflow:auto;padding:3em .77em .7em;position:absolute;text-align:center;width:100%;z-index:2}ul.filebird-block-filebird-gallery li figure figcaption a{color:inherit}
</style>
<style id="global-styles-inline-css" type="text/css">
:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:root { --wp--style--global--content-size: 1300px;--wp--style--global--wide-size: 1300px; }:where(body) { margin: 0; }.wp-site-blocks > .alignleft { float: left; margin-right: 2em; }.wp-site-blocks > .alignright { float: right; margin-left: 2em; }.wp-site-blocks > .aligncenter { justify-content: center; margin-left: auto; margin-right: auto; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}.is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}.is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}.is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}.is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}.is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;line-height: inherit;padding: calc(0.667em + 2px) calc(1.333em + 2px);text-decoration: none;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}
:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}
:root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;}
</style>
<link rel="stylesheet" id="salient-social-css" href="../wp-content/plugins/salient-social/css/style.css" type="text/css" media="all">
<style id="salient-social-inline-css" type="text/css">
.sharing-default-minimal .nectar-love.loved,
body .nectar-social[data-color-override="override"].fixed > a:before,
body .nectar-social[data-color-override="override"].fixed .nectar-social-inner a,
.sharing-default-minimal .nectar-social[data-color-override="override"] .nectar-social-inner a:hover,
.nectar-social.vertical[data-color-override="override"] .nectar-social-inner a:hover {
background-color: #111111;
}
.nectar-social.hover .nectar-love.loved,
.nectar-social.hover > .nectar-love-button a:hover,
.nectar-social[data-color-override="override"].hover > div a:hover,
#single-below-header .nectar-social[data-color-override="override"].hover > div a:hover,
.nectar-social[data-color-override="override"].hover .share-btn:hover,
.sharing-default-minimal .nectar-social[data-color-override="override"] .nectar-social-inner a {
border-color: #111111;
}
#single-below-header .nectar-social.hover .nectar-love.loved i,
#single-below-header .nectar-social.hover[data-color-override="override"] a:hover,
#single-below-header .nectar-social.hover[data-color-override="override"] a:hover i,
#single-below-header .nectar-social.hover .nectar-love-button a:hover i,
.nectar-love:hover i,
.hover .nectar-love:hover .total_loves,
.nectar-love.loved i,
.nectar-social.hover .nectar-love.loved .total_loves,
.nectar-social.hover .share-btn:hover,
.nectar-social[data-color-override="override"].hover .nectar-social-inner a:hover,
.nectar-social[data-color-override="override"].hover > div:hover span,
.sharing-default-minimal .nectar-social[data-color-override="override"] .nectar-social-inner a:not(:hover) i,
.sharing-default-minimal .nectar-social[data-color-override="override"] .nectar-social-inner a:not(:hover) {
color: #111111;
}
</style>
<link rel="stylesheet" id="vlp-public-css" href="../wp-content/plugins/visual-link-preview/dist/public.css" type="text/css" media="all">
<link rel="stylesheet" id="salient-grid-system-css" href="../wp-content/themes/salient/css/build/grid-system.css" type="text/css" media="all">
<link rel="stylesheet" id="main-styles-css" href="../wp-content/themes/salient/css/build/style.css" type="text/css" media="all">
<style id="main-styles-inline-css" type="text/css">
body[data-ajax-transitions="true"] #ajax-loading-screen[data-effect="standard"],body[data-ajax-transitions="true"] #ajax-loading-screen[data-effect="standard"] .loading-icon{transition:opacity 0.4s ease;}body[data-ajax-transitions="true"] #ajax-loading-screen[data-effect="standard"].loaded,body[data-ajax-transitions="true"] #ajax-loading-screen[data-effect="standard"].loaded .loading-icon{opacity:0;}@media only screen and (max-width:999px){#ajax-content-wrap .top-level .nectar-post-grid[data-animation*="fade"] .nectar-post-grid-item,#ajax-content-wrap .top-level .nectar-post-grid[data-animation="zoom-out-reveal"] .nectar-post-grid-item *:not(.content):not(.bg-overlay),#ajax-content-wrap .top-level .nectar-post-grid[data-animation="zoom-out-reveal"] .nectar-post-grid-item *:before{transform:none;opacity:1;clip-path:none;}#ajax-content-wrap .top-level .nectar-post-grid[data-animation="zoom-out-reveal"] .nectar-post-grid-item .nectar-el-parallax-scroll .nectar-post-grid-item-bg-wrap-inner{transform:scale(1.275);}}.wpb_row.vc_row.top-level .nectar-video-bg{opacity:1;height:100%;width:100%;object-fit:cover;object-position:center center;}body.using-mobile-browser .wpb_row.vc_row.top-level .nectar-video-wrap{left:0;}body.using-mobile-browser .wpb_row.vc_row.top-level.full-width-section .nectar-video-wrap:not(.column-video){left:50%;}body.using-mobile-browser #nectar_fullscreen_rows[data-mobile-disable="off"] .wpb_row.vc_row.top-level.full-width-section .nectar-video-wrap:not(.column-video){left:0;}.wpb_row.vc_row.top-level .nectar-video-wrap{opacity:1;width:100%;}body .wpb_row.parallax_section.top-level > .nectar-video-wrap video:not(.translate){opacity:1;}.top-level .portfolio-items[data-loading=lazy-load] .col .inner-wrap.animated .top-level-image{opacity:1;}.wpb_row.vc_row.top-level .column-image-bg-wrap[data-n-parallax-bg="true"] .column-image-bg,.wpb_row.vc_row.top-level + .wpb_row .column-image-bg-wrap[data-n-parallax-bg="true"] .column-image-bg,#portfolio-extra > .wpb_row.vc_row.parallax_section:first-child .row-bg{transform:none!important;height:100%!important;opacity:1;}#portfolio-extra > .wpb_row.vc_row.parallax_section .row-bg{background-attachment:scroll;}.scroll-down-wrap.hidden{transform:none;opacity:1;}#ajax-loading-screen[data-disable-mobile="0"]{display:none!important;}body[data-slide-out-widget-area-style="slide-out-from-right"].material .slide_out_area_close.hide_until_rendered{opacity:0;}
</style>
<link rel="stylesheet" id="nectar-header-layout-centered-menu-css" href="../wp-content/themes/salient/css/build/header/header-layout-centered-menu.css" type="text/css" media="all">
<link rel="stylesheet" id="nectar-header-perma-transparent-css" href="../wp-content/themes/salient/css/build/header/header-perma-transparent.css" type="text/css" media="all">
<link rel="stylesheet" id="nectar-single-styles-css" href="../wp-content/themes/salient/css/build/single.css" type="text/css" media="all">
<link rel="stylesheet" id="nectar-element-highlighted-text-css" href="../wp-content/themes/salient/css/build/elements/element-highlighted-text.css" type="text/css" media="all">
<link rel="stylesheet" id="nectar-element-post-grid-css" href="../wp-content/themes/salient/css/build/elements/element-post-grid.css" type="text/css" media="all">
<link rel="stylesheet" id="nectar-element-recent-posts-css" href="../wp-content/themes/salient/css/build/elements/element-recent-posts.css" type="text/css" media="all">
<link rel="stylesheet" id="nectar_default_font_open_sans-css" href="../_external/fonts.googleapis.com/css" type="text/css" media="all">
<link rel="stylesheet" id="responsive-css" href="../wp-content/themes/salient/css/build/responsive.css" type="text/css" media="all">
<link rel="stylesheet" id="skin-material-css" href="../wp-content/themes/salient/css/build/skin-material.css" type="text/css" media="all">
<link rel="stylesheet" id="salient-wp-menu-dynamic-css" href="../wp-content/uploads/salient/menu-dynamic.css" type="text/css" media="all">
<link rel="stylesheet" id="nectar-widget-posts-css" href="../wp-content/themes/salient/css/build/elements/widget-nectar-posts.css" type="text/css" media="all">
<link rel="stylesheet" id="js_composer_front-css" href="../wp-content/plugins/js_composer_salient/assets/css/js_composer.min.css" type="text/css" media="all">
<link rel="stylesheet" id="dynamic-css-css" href="../wp-content/themes/salient/css/salient-dynamic-styles.css" type="text/css" media="all">
<style id="dynamic-css-inline-css" type="text/css">
.single.single-post .container-wrap{padding-top:0;}.main-content .featured-media-under-header{padding:min(6vw,90px) 0;}.featured-media-under-header__featured-media:not([data-has-img="false"]){margin-top:min(6vw,90px);}.featured-media-under-header__featured-media:not([data-format="video"]):not([data-format="audio"]):not([data-has-img="false"]){overflow:hidden;position:relative;padding-bottom:50%;}.featured-media-under-header__meta-wrap{display:flex;flex-wrap:wrap;align-items:center;}.featured-media-under-header__meta-wrap .meta-author{display:inline-flex;align-items:center;}.featured-media-under-header__meta-wrap .meta-author img{margin-right:8px;width:28px;border-radius:100px;}.featured-media-under-header__featured-media .post-featured-img{display:block;line-height:0;top:auto;bottom:0;}.featured-media-under-header__featured-media[data-n-parallax-bg="true"] .post-featured-img{height:calc(100% + 75px);}.featured-media-under-header__featured-media .post-featured-img img{position:absolute;top:0;left:0;width:100%;height:100%;object-fit:cover;object-position:top;}@media only screen and (max-width:690px){.featured-media-under-header__featured-media[data-n-parallax-bg="true"] .post-featured-img{height:calc(100% + 45px);}.featured-media-under-header__meta-wrap{font-size:14px;}}.featured-media-under-header__featured-media[data-align="center"] .post-featured-img img{object-position:center;}.featured-media-under-header__featured-media[data-align="bottom"] .post-featured-img img{object-position:bottom;}.featured-media-under-header h1{margin:max(min(0.35em,35px),20px) 0 max(min(0.25em,25px),15px) 0;}.featured-media-under-header__cat-wrap .meta-category a{line-height:1;padding:7px 15px;margin-right:15px;}.featured-media-under-header__cat-wrap .meta-category a:not(:hover){background-color:rgba(0,0,0,0.05);}.featured-media-under-header__cat-wrap .meta-category a:hover{color:#fff;}.featured-media-under-header__meta-wrap a,.featured-media-under-header__cat-wrap a{color:inherit;}.featured-media-under-header__meta-wrap > span:not(:first-child):not(.rich-snippet-hidden):before{content:"&middot;";padding:0 .5em;}.featured-media-under-header__excerpt{margin:0 0 20px 0;}@media only screen and (min-width:691px){[data-animate="fade_in"] .featured-media-under-header__cat-wrap,[data-animate="fade_in"].featured-media-under-header .entry-title,[data-animate="fade_in"] .featured-media-under-header__meta-wrap,[data-animate="fade_in"] .featured-media-under-header__featured-media,[data-animate="fade_in"] .featured-media-under-header__excerpt,[data-animate="fade_in"].featured-media-under-header + .row .content-inner{opacity:0;transform:translateY(50px);animation:nectar_featured_media_load 1s cubic-bezier(0.25,1,0.5,1) forwards;}[data-animate="fade_in"] .featured-media-under-header__cat-wrap{animation-delay:0.1s;}[data-animate="fade_in"].featured-media-under-header .entry-title{animation-delay:0.2s;}[data-animate="fade_in"] .featured-media-under-header__excerpt{animation-delay:0.3s;}[data-animate="fade_in"] .featured-media-under-header__meta-wrap{animation-delay:0.3s;}[data-animate="fade_in"] .featured-media-under-header__featured-media{animation-delay:0.4s;}[data-animate="fade_in"].featured-media-under-header + .row .content-inner{animation-delay:0.5s;}}@keyframes nectar_featured_media_load{0%{transform:translateY(50px);opacity:0;}100%{transform:translateY(0px);opacity:1;}}.featured-media-under-header__content{display:flex;flex-direction:column;align-items:center;text-align:center;max-width:1000px;margin:0 auto;}@media only screen and (min-width:691px){.featured-media-under-header__excerpt{max-width:75%;}}.featured-media-under-header__meta-wrap .meta-author img{margin-right:15px;width:50px;}@media only screen and (max-width:690px){width:40px;}.featured-media-under-header__meta-wrap .meta-author > span{text-align:left;line-height:1.5;}.featured-media-under-header__meta-wrap .meta-author > span span:not(.rich-snippet-hidden){display:block;}.featured-media-under-header__meta-wrap .meta-date,.featured-media-under-header__meta-wrap .meta-reading-time{font-size:.85em;}#header-space{background-color:#0a0a0a}@media only screen and (min-width:1000px){body #ajax-content-wrap.no-scroll{min-height:calc(100vh - 90px);height:calc(100vh - 90px)!important;}}@media only screen and (min-width:1000px){#page-header-wrap.fullscreen-header,#page-header-wrap.fullscreen-header #page-header-bg,html:not(.nectar-box-roll-loaded) .nectar-box-roll > #page-header-bg.fullscreen-header,.nectar_fullscreen_zoom_recent_projects,#nectar_fullscreen_rows:not(.afterLoaded) > div{height:calc(100vh - 89px);}.wpb_row.vc_row-o-full-height.top-level,.wpb_row.vc_row-o-full-height.top-level > .col.span_12{min-height:calc(100vh - 89px);}html:not(.nectar-box-roll-loaded) .nectar-box-roll > #page-header-bg.fullscreen-header{top:90px;}.nectar-slider-wrap[data-fullscreen="true"]:not(.loaded),.nectar-slider-wrap[data-fullscreen="true"]:not(.loaded) .swiper-container{height:calc(100vh - 88px)!important;}.admin-bar .nectar-slider-wrap[data-fullscreen="true"]:not(.loaded),.admin-bar .nectar-slider-wrap[data-fullscreen="true"]:not(.loaded) .swiper-container{height:calc(100vh - 88px - 32px)!important;}}.admin-bar[class*="page-template-template-no-header"] .wpb_row.vc_row-o-full-height.top-level,.admin-bar[class*="page-template-template-no-header"] .wpb_row.vc_row-o-full-height.top-level > .col.span_12{min-height:calc(100vh - 32px);}body[class*="page-template-template-no-header"] .wpb_row.vc_row-o-full-height.top-level,body[class*="page-template-template-no-header"] .wpb_row.vc_row-o-full-height.top-level > .col.span_12{min-height:100vh;}@media only screen and (max-width:999px){.using-mobile-browser #nectar_fullscreen_rows:not(.afterLoaded):not([data-mobile-disable="on"]) > div{height:calc(100vh - 116px);}.using-mobile-browser .wpb_row.vc_row-o-full-height.top-level,.using-mobile-browser .wpb_row.vc_row-o-full-height.top-level > .col.span_12,[data-permanent-transparent="1"].using-mobile-browser .wpb_row.vc_row-o-full-height.top-level,[data-permanent-transparent="1"].using-mobile-browser .wpb_row.vc_row-o-full-height.top-level > .col.span_12{min-height:calc(100vh - 116px);}html:not(.nectar-box-roll-loaded) .nectar-box-roll > #page-header-bg.fullscreen-header,.nectar_fullscreen_zoom_recent_projects,.nectar-slider-wrap[data-fullscreen="true"]:not(.loaded),.nectar-slider-wrap[data-fullscreen="true"]:not(.loaded) .swiper-container,#nectar_fullscreen_rows:not(.afterLoaded):not([data-mobile-disable="on"]) > div{height:calc(100vh - 63px);}.wpb_row.vc_row-o-full-height.top-level,.wpb_row.vc_row-o-full-height.top-level > .col.span_12{min-height:calc(100vh - 63px);}body[data-transparent-header="false"] #ajax-content-wrap.no-scroll{min-height:calc(100vh - 63px);height:calc(100vh - 63px);}}#ajax-content-wrap .vc_row.top_margin_5pct{margin-top:5%;}#ajax-content-wrap .vc_row.bottom_margin_5pct{margin-bottom:5%;}.screen-reader-text,.nectar-skip-to-content:not(:focus){border:0;clip:rect(1px,1px,1px,1px);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute!important;width:1px;word-wrap:normal!important;}.row .col img:not([srcset]){width:auto;}.row .col img.img-with-animation.nectar-lazy:not([srcset]){width:100%;}
</style>
<link rel="stylesheet" id="salient-child-style-css" href="../wp-content/themes/salient-child/style.css" type="text/css" media="all">
<link rel="stylesheet" id="redux-google-fonts-salient_redux-css" href="../_external/fonts.googleapis.com/css" type="text/css" media="all">
<script type="text/javascript" id="asenha-public-js-extra">
/* <![CDATA[ */
var phpVars = {"externalPermalinksEnabled":"1"};
/* ]]> */
</script>
<script type="text/javascript" src="../wp-content/plugins/admin-site-enhancements-pro/assets/js/external-permalinks.js" id="asenha-public-js"></script>
<script type="text/javascript" id="breeze-prefetch-js-extra">
/* <![CDATA[ */
var breeze_prefetch = {"local_url":"https:\/\/mintel.me","ignore_remote_prefetch":"1","ignore_list":["wp-admin","wp-login.php"]};
/* ]]> */
</script>
<script type="text/javascript" src="../wp-content/plugins/breeze/assets/js/js-front-end/breeze-prefetch-links.min.js" id="breeze-prefetch-js"></script>
<script></script><link rel="https://api.w.org/" href="https://mintel.me/wp-json/"><link rel="alternate" title="JSON" type="application/json" href="https://mintel.me/wp-json/wp/v2/posts/967"><meta name="generator" content="WordPress 6.7.4">
<link rel="shortlink" href="https://mintel.me/?p=967">
<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://mintel.me/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fmintel.me%2Fwhy-valueobjects-make-your-app-rock-solid%2F">
<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://mintel.me/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fmintel.me%2Fwhy-valueobjects-make-your-app-rock-solid%2F&amp;format=xml">
<noscript>
<style>
/**
* Reinstate scrolling for non-JS clients
*/
.simplebar-content-wrapper {
scrollbar-width: auto;
-ms-overflow-style: auto;
}
.simplebar-content-wrapper::-webkit-scrollbar,
.simplebar-hide-scrollbar::-webkit-scrollbar {
display: initial;
width: initial;
height: initial;
}
</style>
</noscript>
<script type="javascript/text">
(function(){
window.device_wrapper.can_use_premium_code = ;
})();
</script>
<script type="text/javascript"> var root = document.getElementsByTagName( "html" )[0]; root.setAttribute( "class", "js" ); </script>
<style>
.client-logo {
width: auto !important;
height: 50px !important;
}
</style>
<meta name="generator" content="Powered by WPBakery Page Builder - drag and drop page builder for WordPress.">
<link rel="icon" href="../wp-content/uploads/2024/11/cropped-Favicon-2-100x100.png" sizes="32x32">
<link rel="icon" href="../wp-content/uploads/2024/11/cropped-Favicon-2-300x300.png" sizes="192x192">
<link rel="apple-touch-icon" href="../wp-content/uploads/2024/11/cropped-Favicon-2-300x300.png">
<meta name="msapplication-TileImage" content="https://mintel.me/wp-content/uploads/2024/11/cropped-Favicon-2-300x300.png">
<noscript><style> .wpb_animate_when_almost_visible { opacity: 1; }</style></noscript></head><body class="post-template-default single single-post postid-967 single-format-standard material wpb-js-composer js-comp-ver-7.8.1 vc_responsive" data-footer-reveal="false" data-footer-reveal-shadow="none" data-header-format="centered-menu" data-body-border="off" data-boxed-style="" data-header-breakpoint="1000" data-dropdown-style="minimal" data-cae="easeOutCubic" data-cad="1300" data-megamenu-width="contained" data-aie="none" data-ls="fancybox" data-apte="standard" data-hhun="1" data-fancy-form-rcs="default" data-form-style="default" data-form-submit="regular" data-is="minimal" data-button-style="rounded_shadow" data-user-account-button="false" data-flex-cols="true" data-col-gap="default" data-header-inherit-rc="false" data-header-search="false" data-animated-anchors="true" data-ajax-transitions="false" data-full-width-header="false" data-slide-out-widget-area="true" data-slide-out-widget-area-style="slide-out-from-right-hover" data-user-set-ocm="off" data-loading-animation="none" data-bg-header="false" data-responsive="1" data-ext-responsive="true" data-ext-padding="40" data-header-resize="0" data-header-color="custom" data-cart="false" data-remove-m-parallax="" data-remove-m-video-bgs="" data-m-animate="1" data-force-header-trans-color="light" data-smooth-scrolling="0" data-permanent-transparent="false" style="--scroll-bar-w: 0px">
<script type="text/javascript">
(function(window, document) {
if(navigator.userAgent.match(/(Android|iPod|iPhone|iPad|BlackBerry|IEMobile|Opera Mini)/)) {
document.body.className += " using-mobile-browser mobile ";
}
if(navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints && navigator.maxTouchPoints > 2) {
document.body.className += " using-ios-device ";
}
if( !("ontouchstart" in window) ) {
var body = document.querySelector("body");
var winW = window.innerWidth;
var bodyW = body.clientWidth;
if (winW > bodyW + 4) {
body.setAttribute("style", "--scroll-bar-w: " + (winW - bodyW - 4) + "px");
} else {
body.setAttribute("style", "--scroll-bar-w: 0px");
}
}
})(window, document);
</script><a href="#ajax-content-wrap" class="nectar-skip-to-content">Skip to main content</a><div class="ocm-effect-wrap"><div class="ocm-effect-wrap-inner">
<div id="header-space" data-header-mobile-fixed="1" style="height: 64px;"></div>
<div id="header-outer" data-has-menu="true" data-has-buttons="no" data-header-button_style="hover_scale" data-using-pr-menu="true" data-mobile-fixed="1" data-ptnm="false" data-lhe="text_reveal" data-user-set-bg="#000000" data-format="centered-menu" data-permanent-transparent="false" data-megamenu-rt="0" data-remove-fixed="0" data-header-resize="0" data-cart="false" data-transparency-option="" data-box-shadow="large" data-shrink-num="6" data-using-secondary="0" data-using-logo="1" data-logo-height="50" data-m-logo-height="40" data-padding="20" data-full-width="false" data-condense="false">
<div id="search-outer" class="nectar">
<div id="search">
<div class="container">
<div id="search-box">
<div class="inner-wrap">
<div class="col span_12">
<form role="search" action="https://mintel.me/" method="GET">
<input type="text" name="s" id="s" value="" aria-label="Search" placeholder="Type what you're looking for">
<span>Hit enter to search or ESC to close</span>
<input type="hidden" name="post_type" value="post"> </form>
</div><!--/span_12-->
</div><!--/inner-wrap-->
</div><!--/search-box-->
<div id="close"><a href="#"><span class="screen-reader-text">Close Search</span>
<span class="close-wrap"> <span class="close-line close-line1"></span> <span class="close-line close-line2"></span> </span> </a></div>
</div><!--/container-->
</div><!--/search-->
</div><!--/search-outer-->
<header id="top">
<div class="container">
<div class="row">
<div class="col span_3">
<ul class="left-aligned-ocm" data-user-set="off"><li class="slide-out-widget-area-toggle" data-icon-animation="simple-transform" data-custom-color="false"><div> <a href="#slide-out-widget-area" aria-label="Navigation Menu" aria-expanded="false" role="button" class="closed"> <span class="screen-reader-text">Menu</span><span aria-hidden="true"> <i class="lines-button x2" data-variant="even_lines"> <i class="lines"></i> </i> </span> </a> </div></li></ul> <a id="logo" href="../index.html" data-supplied-ml-starting-dark="false" data-supplied-ml-starting="false" data-supplied-ml="false">
<img class="stnd skip-lazy dark-version ls-is-cached br-loaded" src="../wp-content/uploads/2024/11/Logo-2-white.png" width="5102" height="1169" alt="Marc Mintel"> </a>
</div><!--/span_3-->
<div class="col span_9 col_last">
<div class="nectar-mobile-only mobile-header"><div class="inner"></div></div>
<div class="slide-out-widget-area-toggle mobile-icon slide-out-from-right-hover" data-custom-color="false" data-icon-animation="simple-transform">
<div> <a href="#slide-out-widget-area" role="button" aria-label="Navigation Menu" aria-expanded="false" class="closed">
<span class="screen-reader-text">Menu</span><span aria-hidden="true"> <i class="lines-button x2" data-variant="even_lines"> <i class="lines"></i> </i> </span> </a></div>
</div>
<nav aria-label="Main Menu">
<ul class="sf-menu">
<li id="menu-item-428" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home nectar-regular-menu-item menu-item-428"><a href="../index.html"><span class="menu-title-text"><span class="nectar-text-reveal-button"><span class="nectar-text-reveal-button__text" data-text="Home">Home</span></span></span></a></li>
<li id="menu-item-809" class="menu-item menu-item-type-post_type menu-item-object-page nectar-regular-menu-item menu-item-809"><a href="../blog/index.html"><span class="menu-title-text"><span class="nectar-text-reveal-button"><span class="nectar-text-reveal-button__text" data-text="Blog">Blog</span></span></span></a></li>
<li id="menu-item-561" class="menu-item menu-item-type-post_type menu-item-object-page nectar-regular-menu-item menu-item-561"><a href="../work/index.html"><span class="menu-title-text"><span class="nectar-text-reveal-button"><span class="nectar-text-reveal-button__text" data-text="Work">Work</span></span></span></a></li>
<li id="menu-item-498" class="menu-item menu-item-type-post_type menu-item-object-page nectar-regular-menu-item menu-item-498"><a href="../services/index.html"><span class="menu-title-text"><span class="nectar-text-reveal-button"><span class="nectar-text-reveal-button__text" data-text="Services">Services</span></span></span></a></li>
<li id="menu-item-552" class="menu-item menu-item-type-post_type menu-item-object-page nectar-regular-menu-item menu-item-552"><a href="../bio/index.html"><span class="menu-title-text"><span class="nectar-text-reveal-button"><span class="nectar-text-reveal-button__text" data-text="Bio">Bio</span></span></span></a></li>
</ul>
<ul class="buttons sf-menu" data-user-set-ocm="off">
<li id="menu-item-427" class="menu-item menu-item-type-custom menu-item-object-custom nectar-regular-menu-item menu-item-btn-style-button_extra-color-1 menu-item-hover-text-reveal menu-item-427"><a href="mailto:marc@mintel.me"><span class="menu-title-text"><span class="nectar-text-reveal-button"><span class="nectar-text-reveal-button__text" data-text="Contact Me">Contact Me</span></span></span></a></li>
</ul>
</nav>
<div class="logo-spacing" data-using-image="true"><img class="hidden-logo br-lazy" src="../wp-content/uploads/2024/11/Logo-2-white.png" alt="Marc Mintel" width="5102" height="1169"></div>
</div><!--/span_9-->
</div><!--/row-->
</div><!--/container-->
</header>
</div>
<div id="ajax-content-wrap">
<div class="container-wrap no-sidebar" data-midnight="dark" data-remove-post-date="0" data-remove-post-author="0" data-remove-post-comment-number="0">
<div class="container main-content" style="--nectar-sticky-top-distance: 114px;">
<div class="row featured-media-under-header" data-animate="fade_in">
<div class="featured-media-under-header__content">
<div class="featured-media-under-header__cat-wrap">
<span class="meta-category nectar-inherit-label">
<a class="nectar-inherit-border-radius nectar-bg-hover-accent-color development" href="../development/index.html">Development</a></span> </div>
<h1 class="entry-title">Why ValueObjects make your app rock solid (and how theyre the hidden gem of DDD)</h1>
<div class="featured-media-under-header__meta-wrap nectar-link-underline-effect">
<span class="meta-author vcard author"><img class="avatar avatar-40 photo ls-is-cached br-loaded" src="https://secure.gravatar.com/avatar/9995bf9c77ffc601663c67e2aa30cfd0?s=40&amp;d=mm&amp;r=g" alt="Marc" data-brsrcset="https://secure.gravatar.com/avatar/9995bf9c77ffc601663c67e2aa30cfd0?s=80&amp;d=mm&amp;r=g 2x" height="40" width="40" decoding="async" srcset="https://secure.gravatar.com/avatar/9995bf9c77ffc601663c67e2aa30cfd0?s=80&amp;d=mm&amp;r=g 2x"><span><span class="fn nectar-inherit-label"><a href="../author/5fc2b097d603989b/index.html" title="Posts by Marc" rel="author">Marc</a></span> <span class="meta-date date updated">January 22, 2025</span></span></span> </div>
</div>
<div class="featured-media-under-header__featured-media" data-has-img="true" data-align="center" data-format="default">
<span class="post-featured-img page-header-bg-image"><img class="attachment-full size-full wp-post-image ls-is-cached br-loaded" src="../wp-content/uploads/2025/01/carbon-7.webp" width="1920" height="1505" alt="" decoding="async" data-brsrcset="https://mintel.me/wp-content/uploads/2025/01/carbon-7.webp 1920w, https://mintel.me/wp-content/uploads/2025/01/carbon-7-300x235.webp 300w, https://mintel.me/wp-content/uploads/2025/01/carbon-7-1024x803.webp 1024w, https://mintel.me/wp-content/uploads/2025/01/carbon-7-768x602.webp 768w, https://mintel.me/wp-content/uploads/2025/01/carbon-7-1536x1204.webp 1536w" data-brsizes="(max-width: 1920px) 100vw, 1920px" sizes="(max-width: 1920px) 100vw, 1920px" srcset="../wp-content/uploads/2025/01/carbon-7.webp 1920w, ../wp-content/uploads/2025/01/carbon-7-300x235.webp 300w, ../wp-content/uploads/2025/01/carbon-7-1024x803.webp 1024w, ../wp-content/uploads/2025/01/carbon-7-768x602.webp 768w, ../wp-content/uploads/2025/01/carbon-7-1536x1204.webp 1536w"></span> </div>
</div>
<div class="row">
<div class="post-area col span_12 col_last" role="main">
<article id="post-967" class="post-967 post type-post status-publish format-standard has-post-thumbnail category-development">
<div class="inner-wrap">
<div class="post-content" data-hide-featured-media="0">
<div class="content-inner">
<div id="fws_697d5d9099fcb" data-column-margin="default" data-midnight="dark" class="wpb_row vc_row-fluid vc_row top_margin_5pct bottom_margin_5pct" style="padding-top: 0px; padding-bottom: 0px; "><div class="row-bg-wrap" data-bg-animation="none" data-bg-animation-delay="" data-bg-overlay="false"><div class="inner-wrap row-bg-layer"><div class="row-bg viewport-desktop" style=""></div></div></div><div class="row_col_wrap_12 col span_12 dark left">
<div class="vc_col-sm-12 wpb_column column_container vc_column_container col no-extra-padding inherit_tablet inherit_phone " data-padding-pos="all" data-has-bg-color="false" data-bg-color="" data-bg-opacity="1" data-animation="" data-delay="0">
<div class="vc_column-inner">
<div class="wpb_wrapper">
<div class="wpb_text_column wpb_content_element ">
<div class="wpb_wrapper">
<p data-pm-slice="1 1 []">If youre not using value objects in your codebase, youre missing out on one of the best ways to make your application rock solid and full of meaning. Im not exaggerating. Theyre that good. And heres the kicker: even if youre not doing Domain-Driven Design (DDD), you can (and should) still use them. Let me explain why.</p>
<h4>What Are Value Objects, Anyway?</h4>
<p>Value objects are simple. Theyre objects that:</p>
<ul data-spread="false">
<li>Represent a concept or value (think: email address, money, distance).</li>
<li>Are immutable.</li>
<li>Are equal based on their value, not their identity.</li>
</ul>
<p>Thats it. No crazy abstractions. No magic.</p>
<p>A value object ensures that data is valid and meaningful right at the core of your application. Instead of juggling raw strings and numbers and praying that “abc@not-an-email” never sneaks into your email validation, a value object wraps that logic in a neat little package. It says: “Either youre a valid email address, or you dont exist. Period.”</p>
<h4>Why Value Objects Are Amazing</h4>
<ol start="1" data-spread="true">
<li><strong>Rock-Solid Validation:</strong> Ever had a bug caused by “creative” input data? (Lets be honest, we all have.) Value objects let you centralize and enforce validation. If youve got an <code>Email</code> value object, no invalid email will ever sneak past it. You get instant peace of mind.</li>
<li><strong>Expressive Code:</strong> Compare this:
<pre><code>const email = new Email('marc@example.com');
user.setEmail(email);</code></pre>
<p>With this:</p>
<pre><code>user.setEmail('marc@example.com');</code></pre>
<p>In the first case, you <em>know</em> that <code>email</code> has been validated and carries meaning. In the second? Well, good luck tracing that string through your app.</p></li>
<li><strong>Immutable Goodness:</strong> Value objects cant change once created. If you need a different email address, you create a new <code>Email</code> object. This makes your code predictable and easier to reason about.</li>
<li><strong>Easy Testing:</strong> Because value objects encapsulate validation and logic, theyre ridiculously easy to test.</li>
<li><strong>Reuse Across Contexts:</strong> A value object like <code>Money</code> or <code>Email</code> isnt tied to a specific domain or framework. You can use it in any app, anywhere.</li>
</ol>
<h4>Using Value Objects Without DDD</h4>
<p>Heres the thing: while value objects are a core concept in DDD, you dont need to buy into the entire DDD philosophy to benefit from them. Theyre just <em>good design</em>.</p>
<p>Doing clean architecture? Value objects fit right in with your entities and use cases. Building a simple service? Value objects keep your business logic clean and your data consistent.</p>
<h4>Example: Email Value Object</h4>
<p>Heres a quick example in TypeScript to show how simple and powerful a value object can be:</p>
<pre><code>class Email {
private readonly value: string;
constructor(value: string) {
if (!this.isValid(value)) {
throw new Error(`${value} is not a valid email address.`);
}
this.value = value;
}
private isValid(email: string): boolean {
const emailRegex = /^[^@\s]+@[^@\s]+\.[^@\s]+$/;
return emailRegex.test(email);
}
toString(): string {
return this.value;
}
equals(other: Email): boolean {
return this.value === other.value;
}
}</code></pre>
<h4>How to Start Using Value Objects</h4>
<ul data-spread="false">
<li><strong>Identify Recurring Concepts:</strong> Look for patterns like “this field needs validation” or “this value gets passed around a lot.”</li>
<li><strong>Create Value Objects for Those Concepts:</strong> Build small, reusable classes to encapsulate the logic.</li>
<li><strong>Refactor Ruthlessly:</strong> Replace raw data with your shiny new value objects.</li>
</ul>
<h4>Conclusion</h4>
<p>Value objects are one of those rare tools that are simple in concept but profoundly impactful in practice. They make your code more meaningful, your logic more robust, and your life as a developer so much easier. Whether youre building the next DDD masterpiece or just trying to wrangle some clean architecture, value objects deserve a spot in your toolbox.</p>
<p>Go forth and make your app rock solid. 🎉</p>
</div>
</div>
</div>
</div>
</div>
</div></div>
</div>
</div><!--/post-content-->
</div><!--/inner-wrap-->
</article>
</div><!--/post-area-->
</div><!--/row-->
<div class="row">
<div data-n-parallax-bg="true" data-parallax-speed="subtle" data-post-header-style="image_under" class="blog_next_prev_buttons vc_row-fluid standard_section" data-style="parallax_next_only" data-midnight="light"> <div class="parallax-layer-wrap"><div class="parallax-layer"><div class="post-bg-img" style="background-image: url(https://mintel.me/wp-content/uploads/2025/01/web-application-developer-desk-2023-11-27-04-49-45-utc.webp);"></div></div></div>
<div class="col span_12 dark left">
<div class="inner">
<span><i class="next-prev-title nectar-blog-single-section-title nectar-inherit-h4">Next Post</i></span><a href="../i-created-my-first-native-app-and-now-i-know-what-i-hate-about-web-development/index.html" rel="prev"><h3>I created my first native app and now I know what I hate about web development</h3></a> </div>
</div>
<span class="bg-overlay"></span>
<span class="full-link"><a href="../i-created-my-first-native-app-and-now-i-know-what-i-hate-about-web-development/index.html" rel="prev">I created my first native app and now I know what I hate about web development</a></span>
</div>
<div class="row vc_row-fluid full-width-section related-post-wrap" data-using-post-pagination="true" data-midnight="dark"> <div class="row-bg-wrap"><div class="row-bg"></div></div> <h3 class="related-title nectar-blog-single-section-title nectar-inherit-h4 ">You May Also Like</h3><div class="row span_12 blog-recent related-posts columns-3" data-style="material" data-color-scheme="light">
<div class="col span_4">
<div class="inner-wrap post-826 post type-post status-publish format-standard has-post-thumbnail category-productivity">
<a href="../raycast-my-messy-but-glorious-breakup-with-spotlight/index.html" class="img-link"><span class="post-featured-img"><img class="nectar-lazy skip-lazy br-lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA2MDAgNDAzJz48L3N2Zz4=" data-breeze="https://mintel.me/wp-content/uploads/2025/01/CleanShot-2025-01-06-at-22.23.37@2x-600x403.webp" height="403" width="600" alt="" data-nectar-img-src="https://mintel.me/wp-content/uploads/2025/01/CleanShot-2025-01-06-at-22.23.37@2x-600x403.webp" http%3a%2f%2fwww.w3.org%2f2000%2fsvg'%20viewbox%3d'0%200%20600%20403'%2f%3e"=""></span></a>
<span class="meta-category"><a class="productivity" href="../productivity/index.html">Productivity</a></span>
<a class="entire-meta-link" href="../raycast-my-messy-but-glorious-breakup-with-spotlight/index.html"><span class="screen-reader-text">Raycast: my messy (but glorious) breakup with Spotlight</span></a>
<div class="article-content-wrap">
<div class="post-header">
<span class="meta">
</span>
<h3 class="title">Raycast: my messy (but glorious) breakup with Spotlight</h3>
</div><!--/post-header-->
<div class="grav-wrap"><img class="avatar avatar-70 photo br-lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA3MCA3MCc+PC9zdmc+" data-breeze="https://secure.gravatar.com/avatar/9995bf9c77ffc601663c67e2aa30cfd0?s=70&amp;d=mm&amp;r=g" alt="Marc" data-brsrcset="https://secure.gravatar.com/avatar/9995bf9c77ffc601663c67e2aa30cfd0?s=140&amp;d=mm&amp;r=g 2x" height="70" width="70" decoding="async"><div class="text"> <a href="../author/5fc2b097d603989b/index.html">Marc</a><span>January 6, 2025</span></div></div> </div>
</div>
</div>
<div class="col span_4">
<div class="inner-wrap post-906 post type-post status-publish format-standard has-post-thumbnail category-development">
<a href="../how-to-use-tdd-with-ai-to-save-money/index.html" class="img-link"><span class="post-featured-img"><img class="nectar-lazy skip-lazy br-lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA2MDAgNDAzJz48L3N2Zz4=" data-breeze="https://mintel.me/wp-content/uploads/2025/01/carbon-4-600x403.webp" height="403" width="600" alt="" data-nectar-img-src="https://mintel.me/wp-content/uploads/2025/01/carbon-4-600x403.webp" http%3a%2f%2fwww.w3.org%2f2000%2fsvg'%20viewbox%3d'0%200%20600%20403'%2f%3e"=""></span></a>
<span class="meta-category"><a class="development" href="../development/index.html">Development</a></span>
<a class="entire-meta-link" href="../how-to-use-tdd-with-ai-to-save-money/index.html"><span class="screen-reader-text">How to use TDD with AI to save money</span></a>
<div class="article-content-wrap">
<div class="post-header">
<span class="meta">
</span>
<h3 class="title">How to use TDD with AI to save money</h3>
</div><!--/post-header-->
<div class="grav-wrap"><img class="avatar avatar-70 photo br-lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA3MCA3MCc+PC9zdmc+" data-breeze="https://secure.gravatar.com/avatar/9995bf9c77ffc601663c67e2aa30cfd0?s=70&amp;d=mm&amp;r=g" alt="Marc" data-brsrcset="https://secure.gravatar.com/avatar/9995bf9c77ffc601663c67e2aa30cfd0?s=140&amp;d=mm&amp;r=g 2x" height="70" width="70" decoding="async"><div class="text"> <a href="../author/5fc2b097d603989b/index.html">Marc</a><span>January 30, 2025</span></div></div> </div>
</div>
</div>
<div class="col span_4">
<div class="inner-wrap post-903 post type-post status-publish format-standard has-post-thumbnail category-development">
<a href="../coding-with-ai-agents-why-using-cline-with-claude-3-5-sonnet-will-drain-your-wallet/index.html" class="img-link"><span class="post-featured-img"><img class="nectar-lazy skip-lazy br-lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA2MDAgNDAzJz48L3N2Zz4=" data-breeze="https://mintel.me/wp-content/uploads/2025/01/carbon-3-600x403.webp" height="403" width="600" alt="" data-nectar-img-src="https://mintel.me/wp-content/uploads/2025/01/carbon-3-600x403.webp" http%3a%2f%2fwww.w3.org%2f2000%2fsvg'%20viewbox%3d'0%200%20600%20403'%2f%3e"=""></span></a>
<span class="meta-category"><a class="development" href="../development/index.html">Development</a></span>
<a class="entire-meta-link" href="../coding-with-ai-agents-why-using-cline-with-claude-3-5-sonnet-will-drain-your-wallet/index.html"><span class="screen-reader-text">Coding with AI agents: why using Cline with Claude 3.5 Sonnet will drain your wallet</span></a>
<div class="article-content-wrap">
<div class="post-header">
<span class="meta">
</span>
<h3 class="title">Coding with AI agents: why using Cline with Claude 3.5 Sonnet will drain your wallet</h3>
</div><!--/post-header-->
<div class="grav-wrap"><img class="avatar avatar-70 photo br-lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA3MCA3MCc+PC9zdmc+" data-breeze="https://secure.gravatar.com/avatar/9995bf9c77ffc601663c67e2aa30cfd0?s=70&amp;d=mm&amp;r=g" alt="Marc" data-brsrcset="https://secure.gravatar.com/avatar/9995bf9c77ffc601663c67e2aa30cfd0?s=140&amp;d=mm&amp;r=g 2x" height="70" width="70" decoding="async"><div class="text"> <a href="../author/5fc2b097d603989b/index.html">Marc</a><span>January 22, 2025</span></div></div> </div>
</div>
</div>
</div></div>
<div class="comments-section" data-author-bio="false">
</div>
</div><!--/row-->
</div><!--/container main-content-->
</div><!--/container-wrap-->
<div class="nectar-social fixed" data-position="" data-rm-love="0" data-color-override="override"><a href="#"><i class="icon-default-style steadysets-icon-share"></i></a><div class="nectar-social-inner"><a class="facebook-share nectar-sharing" href="#" title="Share this"> <i class="fa fa-facebook"></i> <span class="social-text">Share</span> </a><a class="twitter-share nectar-sharing" href="#" title="Share this"> <i class="fa icon-salient-x-twitter"></i> <span class="social-text">Share</span> </a><a class="linkedin-share nectar-sharing" href="#" title="Share this"> <i class="fa fa-linkedin"></i> <span class="social-text">Share</span> </a><a class="pinterest-share nectar-sharing" href="#" title="Pin this"> <i class="fa fa-pinterest"></i> <span class="social-text">Pin</span> </a></div></div><style>
.nectar-shape-divider-wrap {
position: absolute;
top: auto;
bottom: 0;
left: 0;
right: 0;
width: 100%;
height: 150px;
z-index: 3;
transform: translateZ(0);
}
.post-area.span_9 .nectar-shape-divider-wrap {
overflow: hidden;
}
.nectar-shape-divider-wrap[data-front="true"] {
z-index: 50;
}
.nectar-shape-divider-wrap[data-style="waves_opacity"] svg path:first-child {
opacity: 0.6;
}
.nectar-shape-divider-wrap[data-style="curve_opacity"] svg path:nth-child(1),
.nectar-shape-divider-wrap[data-style="waves_opacity_alt"] svg path:nth-child(1) {
opacity: 0.15;
}
.nectar-shape-divider-wrap[data-style="curve_opacity"] svg path:nth-child(2),
.nectar-shape-divider-wrap[data-style="waves_opacity_alt"] svg path:nth-child(2) {
opacity: 0.3;
}
.nectar-shape-divider {
width: 100%;
left: 0;
bottom: -1px;
height: 100%;
position: absolute;
}
.nectar-shape-divider-wrap.no-color .nectar-shape-divider {
fill: #fff;
}
@media only screen and (max-width: 999px) {
.nectar-shape-divider-wrap:not([data-using-percent-val="true"]) .nectar-shape-divider {
height: 75%;
}
.nectar-shape-divider-wrap[data-style="clouds"]:not([data-using-percent-val="true"]) .nectar-shape-divider {
height: 55%;
}
}
@media only screen and (max-width: 690px) {
.nectar-shape-divider-wrap:not([data-using-percent-val="true"]) .nectar-shape-divider {
height: 33%;
}
.nectar-shape-divider-wrap[data-style="clouds"]:not([data-using-percent-val="true"]) .nectar-shape-divider {
height: 33%;
}
}
#ajax-content-wrap .nectar-shape-divider-wrap[data-height="1"] .nectar-shape-divider,
#ajax-content-wrap .nectar-shape-divider-wrap[data-height="1px"] .nectar-shape-divider {
height: 1px;
}.nectar-shape-divider-wrap[data-position="top"] {
top: -1px;
bottom: auto;
}
.nectar-shape-divider-wrap[data-position="top"] {
transform: rotate(180deg)
}#ajax-content-wrap .vc_row.inner_row.right_padding_20pct .row_col_wrap_12_inner,
.nectar-global-section .vc_row.inner_row.right_padding_20pct .row_col_wrap_12_inner {
padding-right: 20%;
} .wpb_column.border_style_solid > .vc_column-inner,
.wpb_column.border_style_solid > .n-sticky > .vc_column-inner {
border-style: solid;
}@media only screen and (min-width: 1000px) {
.nectar-highlighted-text.font_size_3vw h1,
.nectar-highlighted-text.font_size_3vw h2,
.nectar-highlighted-text.font_size_3vw h3,
.nectar-highlighted-text.font_size_3vw h4,
.nectar-highlighted-text.font_size_3vw h5,
.nectar-highlighted-text.font_size_3vw h6,
.nectar-highlighted-text.font_size_3vw p {
font-size: 3vw;
line-height: 1.1em;
}}
.nectar-highlighted-text[data-style="regular_underline"].font_size_3vw em:before,
.nectar-highlighted-text[data-style="half_text"].font_size_3vw em:before {
bottom: 0.07em;
}@keyframes nectarStrokeAnimation {
0% {
stroke-dashoffset: 1;
opacity: 0;
}
1% {
opacity: 1;
}
100% {
stroke-dashoffset: 0;
}
}.nectar-highlighted-text .nectar-scribble {
position: absolute;
left: 0;
top: 0;
z-index: -1;
}
.nectar-highlighted-text .nectar-scribble path {
stroke-dasharray: 1;
stroke-dashoffset: 1;
opacity: 0;
}
.nectar-highlighted-text em.animated .nectar-scribble path {
stroke-linecap: round;
opacity: 1;
animation: nectarStrokeAnimation 1.3s cubic-bezier(0.65,0,0.35,1) forwards;
}
.nectar-highlighted-text[data-style="scribble"] em {
background-image: none!important;
}body .nectar-scribble.circle {
width: 130%;
height: 140%;
top: -20%;
left: -15%;
}@media only screen and (max-width: 999px) {
.nectar-cta.display_tablet_inherit {
display: inherit;
}
}@media only screen and (max-width: 999px) { .vc_row.bottom_padding_tablet_20pct {
padding-bottom: 20%!important;
} }@media only screen and (max-width: 999px) { .vc_row.top_padding_tablet_10pct {
padding-top: 10%!important;
} }@media only screen and (max-width: 999px) { .vc_row.bottom_padding_tablet_10pct {
padding-bottom: 10%!important;
} }@media only screen and (max-width: 999px) { .vc_row.top_padding_tablet_20pct {
padding-top: 20%!important;
} }@media only screen and (max-width: 690px) {
.nectar-cta.display_phone_inherit {
display: inherit;
}
}</style><div class="nectar-global-section nectar_hook_global_section_footer"><div class="container normal-container row">
<div id="fws_697d5d90a1f05" data-column-margin="default" data-midnight="light" data-top-percent="10%" data-bottom-percent="5%" class="wpb_row vc_row-fluid vc_row full-width-section top_padding_tablet_20pct bottom_padding_tablet_10pct" style="padding-top: calc(100vw * 0.10); padding-bottom: calc(100vw * 0.05); "><div class="row-bg-wrap" data-bg-animation="none" data-bg-animation-delay="" data-bg-overlay="false"><div class="inner-wrap row-bg-layer"><div class="row-bg viewport-desktop using-bg-color" style="background-color: #000000; "></div></div></div><div class="row_col_wrap_12 col span_12 light left">
<div class="vc_col-sm-12 wpb_column column_container vc_column_container col no-extra-padding inherit_tablet inherit_phone " data-padding-pos="all" data-has-bg-color="false" data-bg-color="" data-bg-opacity="1" data-animation="" data-delay="0">
<div class="vc_column-inner">
<div class="wpb_wrapper">
<div id="fws_697d5d90a7a1b" data-midnight="" data-column-margin="default" class="wpb_row vc_row-fluid vc_row inner_row right_padding_20pct" style=""><div class="row-bg-wrap"> <div class="row-bg"></div> </div><div class="row_col_wrap_12_inner col span_12 left">
<div class="vc_col-sm-12 wpb_column column_container vc_column_container col child_column no-extra-padding inherit_tablet inherit_phone " data-padding-pos="all" data-has-bg-color="false" data-bg-color="" data-bg-opacity="1" data-animation="" data-delay="0">
<div class="vc_column-inner">
<div class="wpb_wrapper">
<div class="nectar-highlighted-text font_size_3vw " data-style="scribble" data-exp="default" data-using-custom-color="false" data-animation-delay="false" data-color="" data-color-gradient="" style=""><h2>Dont wait any longer, <em>transform<svg class="nectar-scribble circle" role="presentation" viewBox="0 0 800 350" preserveAspectRatio="none"><path style="animation-duration: 1.8s;" transform="matrix(0.9791300296783447,0,0,0.9791300296783447,400,179)" stroke-linejoin="miter" fill-opacity="0" pathLength="1" stroke-miterlimit="4" stroke="#2365ff" stroke-opacity="1" stroke-width="8" d=" M253,-161 C253,-161 -284.78900146484375,-201.4600067138672 -376,-21 C-469,163 67.62300109863281,174.2100067138672 256,121 C564,34 250.82899475097656,-141.6929931640625 19.10700035095215,-116.93599700927734"></path></svg></em> your product visuals now.</h2>
</div>
</div>
</div>
</div>
</div></div>
</div>
</div>
</div>
</div></div>
<div id="fws_697d5d90a95d9" data-column-margin="default" data-midnight="light" data-top-percent="5%" data-bottom-percent="10%" class="wpb_row vc_row-fluid vc_row full-width-section top_padding_tablet_10pct bottom_padding_tablet_20pct" style="padding-top: calc(100vw * 0.05); padding-bottom: calc(100vw * 0.10); "><div class="row-bg-wrap" data-bg-animation="none" data-bg-animation-delay="" data-bg-overlay="false"><div class="inner-wrap row-bg-layer"><div class="row-bg viewport-desktop using-bg-color" style="background-color: #000000; "></div></div></div><div class="nectar-shape-divider-wrap " style=" height:1px;" data-height="1" data-front="" data-style="straight_section" data-position="top"><svg class="nectar-shape-divider" aria-hidden="true" fill="#5b5b5b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 10" preserveAspectRatio="none"> <polygon points="104 10, 104 0, 0 0, 0 10"></polygon> </svg></div><div class="row_col_wrap_12 col span_12 light left">
<div class="vc_col-sm-12 wpb_column column_container vc_column_container col no-extra-padding inherit_tablet inherit_phone border_style_solid " data-padding-pos="all" data-has-bg-color="false" data-bg-color="" data-bg-opacity="1" data-animation="" data-delay="0">
<div class="vc_column-inner">
<div class="wpb_wrapper">
<div id="fws_697d5d90aa407" data-midnight="" data-column-margin="default" class="wpb_row vc_row-fluid vc_row inner_row vc_row-o-equal-height vc_row-flex vc_row-o-content-top" style=""><div class="row-bg-wrap"> <div class="row-bg"></div> </div><div class="row_col_wrap_12_inner col span_12 left">
<div class="vc_col-sm-6 vc_col-md-6 wpb_column column_container vc_column_container col child_column has-animation no-extra-padding inherit_tablet inherit_phone " data-t-w-inherits="small_desktop" data-padding-pos="all" data-has-bg-color="false" data-bg-color="" data-bg-opacity="1" data-animation="fade-in-from-bottom" data-delay="0">
<div class="vc_column-inner">
<div class="wpb_wrapper">
<div class="wpb_text_column wpb_content_element ">
<div class="wpb_wrapper">
<h5>Get in touch</h5>
</div>
</div>
<div class="nectar-cta alignment_tablet_default alignment_phone_default display_tablet_inherit display_phone_inherit " data-color="default" data-using-bg="false" data-display="block" data-style="underline" data-alignment="left" data-text-color="std"><h4> <span class="link_wrap"><a class="link_text" role="button" href="mailto:marc@mintel.me">marc@mintel.me</a></span></h4></div>
</div>
</div>
</div>
</div></div>
</div>
</div>
</div>
</div></div>
</div></div>
<div id="footer-outer" data-midnight="light" data-cols="4" data-custom-color="false" data-disable-copyright="true" data-matching-section-color="true" data-copyright-line="false" data-using-bg-img="false" data-bg-img-overlay="0.8" data-full-width="false" data-using-widget-area="false" data-link-hover="default">
</div><!--/footer-outer-->
<div id="slide-out-widget-area-bg" class="slide-out-from-right-hover dark">
</div>
<div id="slide-out-widget-area" class="slide-out-from-right-hover" data-dropdown-func="separate-dropdown-parent-link" data-back-txt="Back">
<div class="inner-wrap">
<div class="inner" data-prepend-menu-mobile="false">
<a class="slide_out_area_close" href="#"><span class="screen-reader-text">Close Menu</span>
<span class="close-wrap"> <span class="close-line close-line1"></span> <span class="close-line close-line2"></span> </span> </a>
<div class="off-canvas-menu-container" role="navigation">
<ul class="menu">
<li id="menu-item-483" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home menu-item-483"><a href="../index.html">Home</a></li>
<li id="menu-item-497" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-497"><a href="../services/index.html">Services</a></li>
</ul>
</div>
</div>
<div class="bottom-meta-wrap"><ul class="off-canvas-social-links"><li><a target="_blank" rel="noopener noreferrer" href="https://www.linkedin.com/in/marc-mintel-03b193134/"><span class="screen-reader-text">linkedin</span><i class="fa fa-linkedin"></i></a></li><li><a target="_blank" rel="noopener noreferrer" href="https://github.com/mmintel"><span class="screen-reader-text">github</span><i class="fa fa-github-alt"></i></a></li><li><a target="_blank" rel="noopener noreferrer" href="https://instagram.com/marcmintel"><span class="screen-reader-text">instagram</span><i class="fa fa-instagram"></i></a></li><li><a target="_blank" rel="noopener noreferrer" href="https://wa.me/491707777093?text=Hey%20there%2C%20got%20your%20number%20from%20your%20website.%20I%20just%20wanted%20to%20ask%20if..."><span class="screen-reader-text">whatsapp</span><i class="fa fa-whatsapp"></i></a></li><li><a target="_blank" rel="noopener noreferrer" href="mailto:marc@mintel.me"><span class="screen-reader-text">email</span><i class="fa fa-envelope"></i></a></li></ul></div><!--/bottom-meta-wrap--></div> <!--/inner-wrap-->
</div>
</div> <!--/ajax-content-wrap-->
</div></div><!--/ocm-effect-wrap--> <script>
(function () {
const isMatchingClass = (linkRule, href, classes) => {
return classes.includes(linkRule.value)
}
const isMatchingDomain = (linkRule, href, classes) => {
if(!URL.canParse(href)) {
return false
}
const url = new URL(href)
return linkRule.value === url.host
}
const isMatchingExtension = (linkRule, href, classes) => {
if(!URL.canParse(href)) {
return false
}
const url = new URL(href)
return url.pathname.endsWith('.' + linkRule.value)
}
const isMatchingSubdirectory = (linkRule, href, classes) => {
if(!URL.canParse(href)) {
return false
}
const url = new URL(href)
return url.pathname.startsWith('/' + linkRule.value + '/')
}
const isMatchingProtocol = (linkRule, href, classes) => {
if(!URL.canParse(href)) {
return false
}
const url = new URL(href)
return url.protocol === linkRule.value + ':'
}
const isMatch = (linkRule, href, classes) => {
switch (linkRule.type) {
case 'class':
return isMatchingClass(linkRule, href, classes)
case 'domain':
return isMatchingDomain(linkRule, href, classes)
case 'extension':
return isMatchingExtension(linkRule, href, classes)
case 'subdirectory':
return isMatchingSubdirectory(linkRule, href, classes)
case 'protocol':
return isMatchingProtocol(linkRule, href, classes)
default:
return false;
}
}
const track = (element) => {
const href = element.href ?? null
const classes = Array.from(element.classList)
const parentsToMatch = [
'li.menu-item', // Non-block menu item
'li.wp-block-navigation-item', // Block menu item
'div.wp-block-button', // Block button group
]
// When a WordPress menu or button allows a user customizable class, the class is
// placed on a parent element instead of the button/a. If the parent matches one
// of these elements, then it's classes should also be considered.
if(parentsToMatch.some((toMatch) => element.parentElement.matches(toMatch))) {
classes.push(...Array.from(element.parentElement.classList))
}
const linkRules = [{"type":"extension","value":"pdf"},{"type":"extension","value":"zip"},{"type":"protocol","value":"mailto"},{"type":"protocol","value":"tel"}]
if(linkRules.length === 0) {
return
}
const hasMatch = linkRules.some((linkRule) => {
return isMatch(linkRule, href, classes)
})
if(!hasMatch) {
return
} else {
}
const url = "https://mintel.me/wp-content/uploads/iawp-click-endpoint.php";
const body = {
href: href,
classes: classes.join(' '),
...{"payload":{"resource":"singular","singular_id":967,"page":1},"signature":"9c759b459cbc4c7ebfb0a0d90eeacc70"} };
if (navigator.sendBeacon) {
let blob = new Blob([JSON.stringify(body)], {
type: "application/json"
});
navigator.sendBeacon(url, blob);
} else {
const xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xhr.send(JSON.stringify(body))
}
}
document.addEventListener('mousedown', function (event) {
if (navigator.webdriver || /bot|crawler|spider|crawling|semrushbot|chrome-lighthouse/i.test(navigator.userAgent)) {
return;
}
const element = event.target.closest('a')
if(!element) {
return
}
const isPro = true
if(!isPro) {
return
}
// Don't track left clicks with this event. The click event is used for that.
if(event.button === 0) {
return
}
track(element)
})
document.addEventListener('click', function (event) {
if (navigator.webdriver || /bot|crawler|spider|crawling|semrushbot|chrome-lighthouse/i.test(navigator.userAgent)) {
return;
}
const element = event.target.closest('a, button')
if(!element) {
return
}
const isPro = true
if(!isPro) {
return
}
track(element)
})
document.addEventListener("DOMContentLoaded", function (e) {
if (document.hasOwnProperty("visibilityState") && document.visibilityState === "prerender") {
return;
}
if (navigator.webdriver || /bot|crawler|spider|crawling|semrushbot|chrome-lighthouse/i.test(navigator.userAgent)) {
return;
}
let referrer_url = null;
if (typeof document.referrer === 'string' && document.referrer.length > 0) {
referrer_url = document.referrer;
}
const params = location.search.slice(1).split('&').reduce((acc, s) => {
const [k, v] = s.split('=');
return Object.assign(acc, {[k]: v});
}, {});
const url = "https://mintel.me/wp-json/iawp/search";
const body = {
referrer_url,
utm_source: params.utm_source,
utm_medium: params.utm_medium,
utm_campaign: params.utm_campaign,
utm_term: params.utm_term,
utm_content: params.utm_content,
gclid: params.gclid,
...{"payload":{"resource":"singular","singular_id":967,"page":1},"signature":"9c759b459cbc4c7ebfb0a0d90eeacc70"} };
if (navigator.sendBeacon) {
let blob = new Blob([JSON.stringify(body)], {
type: "application/json"
});
navigator.sendBeacon(url, blob);
} else {
const xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xhr.send(JSON.stringify(body))
}
});
})();
</script>
<script type="text/html" id="wpb-modifications"> window.wpbCustomElement = 1; </script><link data-pagespeed-no-defer="" data-nowprocket="" data-wpacu-skip="" data-no-optimize="" data-noptimize="" rel="stylesheet" id="main-styles-non-critical-css" href="../wp-content/themes/salient/css/build/style-non-critical.css" type="text/css" media="all">
<link rel="stylesheet" id="font-awesome-css" href="../wp-content/themes/salient/css/font-awesome.min.css" type="text/css" media="all">
<link data-pagespeed-no-defer="" data-nowprocket="" data-wpacu-skip="" data-no-optimize="" data-noptimize="" rel="stylesheet" id="fancyBox-css" href="../wp-content/themes/salient/css/build/plugins/jquery.fancybox.css" type="text/css" media="all">
<link rel="stylesheet" id="nectar-smooth-scroll-css" href="../wp-content/themes/salient/css/build/plugins/lenis.css" type="text/css" media="all">
<link data-pagespeed-no-defer="" data-nowprocket="" data-wpacu-skip="" data-no-optimize="" data-noptimize="" rel="stylesheet" id="nectar-ocm-core-css" href="../wp-content/themes/salient/css/build/off-canvas/core.css" type="text/css" media="all">
<link data-pagespeed-no-defer="" data-nowprocket="" data-wpacu-skip="" data-no-optimize="" data-noptimize="" rel="stylesheet" id="nectar-ocm-slide-out-right-hover-css" href="../wp-content/themes/salient/css/build/off-canvas/slide-out-right-hover.css" type="text/css" media="all">
<script type="text/javascript" src="../wp-content/plugins/device-wrapper/src/js/simplebar.min.js" id="device_wrapper-simplebar-js"></script>
<script type="text/javascript" src="../wp-content/plugins/device-wrapper/src/js/dragscroll.js" id="device_wrapper-dragscroll-js"></script>
<script type="text/javascript" src="../wp-includes/js/jquery/jquery.min.js" id="jquery-core-js"></script>
<script type="text/javascript" src="../wp-includes/js/jquery/jquery-migrate.min.js" id="jquery-migrate-js"></script>
<script type="text/javascript" src="../wp-content/plugins/device-wrapper/dist/front.build.js" id="device_wrapper-front-js-js"></script>
<script type="text/javascript" id="salient-social-js-extra">
/* <![CDATA[ */
var nectarLove = {"ajaxurl":"https:\/\/mintel.me\/wp-admin\/admin-ajax.php","postID":"967","rooturl":"https:\/\/mintel.me","loveNonce":"a1146a4fb8"};
/* ]]> */
</script>
<script type="text/javascript" src="../wp-content/plugins/salient-social/js/salient-social.js" id="salient-social-js"></script>
<script data-pagespeed-no-defer="" data-nowprocket="" data-wpacu-skip="" data-no-optimize="" type="salientlazyscript" data-salient-lazy-type="text/javascript" src="../wp-content/themes/salient/js/build/third-party/jquery.easing.min.js" id="jquery-easing-js"></script>
<script data-pagespeed-no-defer="" data-nowprocket="" data-wpacu-skip="" data-no-optimize="" type="salientlazyscript" data-salient-lazy-type="text/javascript" src="../wp-content/themes/salient/js/build/third-party/jquery.mousewheel.min.js" id="jquery-mousewheel-js"></script>
<script type="text/javascript" src="../wp-content/themes/salient/js/build/priority.js" id="nectar_priority-js"></script>
<script type="text/javascript" src="../wp-content/themes/salient/js/build/third-party/transit.min.js" id="nectar-transit-js"></script>
<script data-pagespeed-no-defer="" data-nowprocket="" data-wpacu-skip="" data-no-optimize="" type="salientlazyscript" data-salient-lazy-type="text/javascript" src="../wp-content/themes/salient/js/build/third-party/waypoints.js" id="nectar-waypoints-js"></script>
<script type="text/javascript" src="../wp-content/plugins/salient-portfolio/js/third-party/imagesLoaded.min.js" id="imagesLoaded-js"></script>
<script data-pagespeed-no-defer="" data-nowprocket="" data-wpacu-skip="" data-no-optimize="" type="salientlazyscript" data-salient-lazy-type="text/javascript" src="../wp-content/themes/salient/js/build/third-party/hoverintent.min.js" id="hoverintent-js"></script>
<script type="text/javascript" src="../wp-content/themes/salient/js/build/third-party/jquery.fancybox.js" id="fancyBox-js"></script>
<script type="text/javascript" src="../wp-content/themes/salient/js/build/third-party/anime.min.js" id="anime-js"></script>
<script data-pagespeed-no-defer="" data-nowprocket="" data-wpacu-skip="" data-no-optimize="" type="salientlazyscript" data-salient-lazy-type="text/javascript" src="../wp-content/themes/salient/js/build/third-party/superfish.js" id="superfish-js"></script>
<script type="text/javascript" id="nectar-frontend-js-extra">
/* <![CDATA[ */
var nectarLove = {"ajaxurl":"https:\/\/mintel.me\/wp-admin\/admin-ajax.php","postID":"967","rooturl":"https:\/\/mintel.me","disqusComments":"false","loveNonce":"a1146a4fb8","mapApiKey":""};
var nectarOptions = {"delay_js":"1","smooth_scroll":"true","smooth_scroll_strength":"50","quick_search":"false","react_compat":"disabled","header_entrance":"false","body_border_func":"default","body_border_mobile":"0","dropdown_hover_intent":"default","simplify_ocm_mobile":"0","mobile_header_format":"centered-menu","ocm_btn_position":"left","left_header_dropdown_func":"default","ajax_add_to_cart":"0","ocm_remove_ext_menu_items":"remove_images","woo_product_filter_toggle":"0","woo_sidebar_toggles":"true","woo_sticky_sidebar":"0","woo_minimal_product_hover":"default","woo_minimal_product_effect":"default","woo_related_upsell_carousel":"false","woo_product_variable_select":"default","woo_using_cart_addons":"false","view_transitions_effect":"gradient-wipe"};
var nectar_front_i18n = {"menu":"Menu","next":"Next","previous":"Previous","close":"Close"};
/* ]]> */
</script>
<script data-pagespeed-no-defer="" data-nowprocket="" data-wpacu-skip="" data-no-optimize="" type="salientlazyscript" data-salient-lazy-type="text/javascript" src="../wp-content/themes/salient/js/build/init.js" id="nectar-frontend-js"></script>
<script type="text/javascript" src="../wp-content/themes/salient/js/build/nectar-smooth-scroll.js" id="nectar-smooth-scroll-js"></script>
<script data-pagespeed-no-defer="" data-nowprocket="" data-wpacu-skip="" data-no-optimize="" type="salientlazyscript" data-salient-lazy-type="text/javascript" src="../wp-content/plugins/salient-core/js/third-party/touchswipe.min.js" id="touchswipe-js"></script>
<script type="text/javascript" src="../wp-content/plugins/breeze/assets/js/js-front-end/breeze-lazy-load.min.js" id="breeze-lazy-js"></script>
<script type="text/javascript" id="breeze-lazy-js-after">
/* <![CDATA[ */
document.querySelectorAll('img[data-breeze]').forEach(img=>{if(img.getBoundingClientRect().top<=window.innerHeight){img.src=img.getAttribute('data-breeze');img.removeAttribute('data-breeze')}});
/* ]]> */
</script>
<script data-pagespeed-no-defer="" data-nowprocket="" data-wpacu-skip="" data-no-optimize="" type="salientlazyscript" data-salient-lazy-type="text/javascript" src="../wp-content/plugins/js_composer_salient/assets/js/dist/js_composer_front.min.js" id="wpb_composer_front_js-js"></script>
<script data-pagespeed-no-defer="" data-nowprocket="" data-wpacu-skip="" data-no-optimize="" type="text/javascript" src="../wp-content/themes/salient/js/build/nectar-delay-javascript.js" id="salient-delay-js-js"></script>
<script></script>
</body></html><!-- Cache served by breeze CACHE - Last modified: Sat, 31 Jan 2026 01:40:32 GMT -->