warnOnce package in Refine source code.
In this article, we will review a package named warn-once. You will learn
-
What is warn-once?
-
Warn once usage in Refine source code
-
warn-once code review

What is warn-once?
Print a warning exactly once during development. Suitable for deprecation warnings, warnings for missing setup etc.
Installation
Run the below command in your CLI to install this package
npm install warn-once
Usage
warn-once accepts 2 parameters, one is the condition and the other one is the message that gets printed to the CLI exactly once. warn-once has some underlying checks to ensure this logs only once in the CLI.
const warnOnce = require('warn-once'); // ... warnOnce(someCondition, 'This is a warning message');
Note: This warning is only shown only when NODE_ENV is not set to “production”
Warn once usage in Refine source code
So I found this package in the Refine codebase in a file named hooks/breadcrumbs/index.ts
if (action && action !== "list") { const key = `actions.${action}`; const actionLabel = translate(key); if (typeof i18nProvider !== "undefined" && actionLabel === key) { warnOnce( true, `[useBreadcrumb]: Breadcrumb missing translate key for the "${action}" action. Please add "actions.${action}" key to your translation file.\nFor more information, see https://refine.dev/docs/api-reference/core/hooks/useBreadcrumb/#i18n-support`, ); breadcrumbs.push({ label: translate( `buttons.${action}`, textTransformers.humanize(action), ), }); } else { breadcrumbs.push({ label: translate(key, textTransformers.humanize(action)), }); } }

As you can see there are other files too, where this warn-once is used but with different parameters.
warn-once code review
index.js in the warn-once repository contains the below code
const DEV = process.env.NODE_ENV !== "production"; const warnings = new Set(); function warnOnce(condition, ...rest) { if (DEV && condition) { const key = rest.join(" "); if (warnings.has(key)) { return; } warnings.add(key); console.warn(...rest); } } module.exports = warnOnce;
I also happened to create a Pull request with an example demonstrating the ability to pass n number of message strings as parameters.
Set is used and has check ensures the message gets logged only once.
About me:
Hey, my name is Ramu Narasinga. I study large open-source projects and create content about their codebase architecture and best practices, sharing it through articles, videos.
I am open to work on interesting projects. Send me an email at ramu.narasinga@gmail.com
My Github — https://github.com/ramu-narasinga
My website — https://ramunarasinga.com
My Youtube channel — https://www.youtube.com/@thinkthroo
Learning platform — https://thinkthroo.com
Codebase Architecture — https://app.thinkthroo.com/architecture
Best practices — https://app.thinkthroo.com/best-practices
Production-grade projects — https://app.thinkthroo.com/production-grade-projects