JavaScript code that can be used client-side in the browser and server-side in Node.js

Sample code as follows, read comments for more details 🙂

/**
 * Example of JavaScript code that can be used client-side in the browser and server-side in Node.js
 *
 * Usage in browser:
 *     <script src="shared.js"></script>
 *     <script>
 *         console.log(shared.STATUS_SUCCESS, shared.test()); // note that shared.getTimestamp() won't work
 *     </script>
 *
 * Usage in Node.js:
 *     const shared = require('./shared.js');
 *     console.log(shared.STATUS_SUCCESS, shared.test()); // note that shared.getTimestamp() won't work
 */
(function () { // wrap in Immediately Invoked Function Expression (IIFE) to prevent pollution of global namespace
    /** @type {object} Self reference - all public properties/methods are stored here & returned as public interface. */
    const self = {
        /** @property {string} Constant to refer to success status. See https://github.com/zionsg/status for more. */
        STATUS_SUCCESS: 'success',
    };

    /**
     * Test method
     *
     * @public
     * @returns {string}
     */
    self.test = function () {
        return ('Hello World at ' + getTimestamp() + ' (^ v ^)');
    };

    /**
     * Get current timestamp in ISO 8601 format
     *
     * @private
     * @returns {string}
     */
    function getTimestamp() {
        return (new Date()).toISOString();
    }

    // Return public interface of IIFE for use in browser and server
    // Adapted from https://caolan.uk/notes/2010-07-01_writing_for_node_and_the_browser.cm
    if ('undefined' === typeof exports) { // cannot use `typeof module?.exports` cos module is not defined
        // `this` refers to the window object, the key is the variable name for the script,
        // e.g. if there is a public method y() and this['x'] is used, `x.y()` would be used to call it in the browser.
        this['shared'] = self; // for client-side use in browser
    } else {
        // Cannot use `exports = self` as it is `module.exports` that will be returned in the end
        // See https://stackoverflow.com/a/26451885
        module.exports = self; // for server-side use in Node.js
    }
})();