@vettvangur/vanilla 0.0.21 β†’ 0.0.22

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.
package/dist/index.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- import e from"node:path";import t from"node:process";import n from"fs";import o from"path";import r from"os";import s from"crypto";function a(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var c,i={exports:{}},l={name:"dotenv",version:"16.4.5",description:"Loads environment variables from .env file",main:"lib/main.js",types:"lib/main.d.ts",exports:{".":{types:"./lib/main.d.ts",require:"./lib/main.js",default:"./lib/main.js"},"./config":"./config.js","./config.js":"./config.js","./lib/env-options":"./lib/env-options.js","./lib/env-options.js":"./lib/env-options.js","./lib/cli-options":"./lib/cli-options.js","./lib/cli-options.js":"./lib/cli-options.js","./package.json":"./package.json"},scripts:{"dts-check":"tsc --project tests/types/tsconfig.json",lint:"standard","lint-readme":"standard-markdown",pretest:"npm run lint && npm run dts-check",test:"tap tests/*.js --100 -Rspec","test:coverage":"tap --coverage-report=lcov",prerelease:"npm test",release:"standard-version"},repository:{type:"git",url:"git://github.com/motdotla/dotenv.git"},funding:"https://dotenvx.com",keywords:["dotenv","env",".env","environment","variables","config","settings"],readmeFilename:"README.md",license:"BSD-2-Clause",devDependencies:{"@definitelytyped/dtslint":"^0.0.133","@types/node":"^18.11.3",decache:"^4.6.1",sinon:"^14.0.1",standard:"^17.0.0","standard-markdown":"^7.1.0","standard-version":"^9.5.0",tap:"^16.3.0",tar:"^6.1.11",typescript:"^4.8.4"},engines:{node:">=12"},browser:{fs:!1}};var u=function(){if(c)return i.exports;c=1;const e=n,t=o,a=r,u=s,p=l.version,d=/(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/gm;function f(e){console.log(`[dotenv@${p}][DEBUG] ${e}`)}function v(e){return e&&e.DOTENV_KEY&&e.DOTENV_KEY.length>0?e.DOTENV_KEY:process.env.DOTENV_KEY&&process.env.DOTENV_KEY.length>0?process.env.DOTENV_KEY:""}function E(e,t){let n;try{n=new URL(t)}catch(e){if("ERR_INVALID_URL"===e.code){const e=new Error("INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development");throw e.code="INVALID_DOTENV_KEY",e}throw e}const o=n.password;if(!o){const e=new Error("INVALID_DOTENV_KEY: Missing key part");throw e.code="INVALID_DOTENV_KEY",e}const r=n.searchParams.get("environment");if(!r){const e=new Error("INVALID_DOTENV_KEY: Missing environment part");throw e.code="INVALID_DOTENV_KEY",e}const s=`DOTENV_VAULT_${r.toUpperCase()}`,a=e.parsed[s];if(!a){const e=new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${s} in your .env.vault file.`);throw e.code="NOT_FOUND_DOTENV_ENVIRONMENT",e}return{ciphertext:a,key:o}}function h(n){let o=null;if(n&&n.path&&n.path.length>0)if(Array.isArray(n.path))for(const t of n.path)e.existsSync(t)&&(o=t.endsWith(".vault")?t:`${t}.vault`);else o=n.path.endsWith(".vault")?n.path:`${n.path}.vault`;else o=t.resolve(process.cwd(),".env.vault");return e.existsSync(o)?o:null}function m(e){return"~"===e[0]?t.join(a.homedir(),e.slice(1)):e}const g={configDotenv:function(n){const o=t.resolve(process.cwd(),".env");let r="utf8";const s=Boolean(n&&n.debug);n&&n.encoding?r=n.encoding:s&&f("No encoding is specified. UTF-8 is used by default");let a,c=[o];if(n&&n.path)if(Array.isArray(n.path)){c=[];for(const e of n.path)c.push(m(e))}else c=[m(n.path)];const i={};for(const t of c)try{const o=g.parse(e.readFileSync(t,{encoding:r}));g.populate(i,o,n)}catch(e){s&&f(`Failed to load ${t} ${e.message}`),a=e}let l=process.env;return n&&null!=n.processEnv&&(l=n.processEnv),g.populate(l,i,n),a?{parsed:i,error:a}:{parsed:i}},_configVault:function(e){var t;t="Loading env from encrypted .env.vault",console.log(`[dotenv@${p}][INFO] ${t}`);const n=g._parseVault(e);let o=process.env;return e&&null!=e.processEnv&&(o=e.processEnv),g.populate(o,n,e),{parsed:n}},_parseVault:function(e){const t=h(e),n=g.configDotenv({path:t});if(!n.parsed){const e=new Error(`MISSING_DATA: Cannot parse ${t} for an unknown reason`);throw e.code="MISSING_DATA",e}const o=v(e).split(","),r=o.length;let s;for(let e=0;e<r;e++)try{const t=E(n,o[e].trim());s=g.decrypt(t.ciphertext,t.key);break}catch(t){if(e+1>=r)throw t}return g.parse(s)},config:function(e){if(0===v(e).length)return g.configDotenv(e);const t=h(e);return t?g._configVault(e):(n=`You set DOTENV_KEY but you are missing a .env.vault file at ${t}. Did you forget to build it?`,console.log(`[dotenv@${p}][WARN] ${n}`),g.configDotenv(e));var n},decrypt:function(e,t){const n=Buffer.from(t.slice(-64),"hex");let o=Buffer.from(e,"base64");const r=o.subarray(0,12),s=o.subarray(-16);o=o.subarray(12,-16);try{const e=u.createDecipheriv("aes-256-gcm",n,r);return e.setAuthTag(s),`${e.update(o)}${e.final()}`}catch(e){const t=e instanceof RangeError,n="Invalid key length"===e.message,o="Unsupported state or unable to authenticate data"===e.message;if(t||n){const e=new Error("INVALID_DOTENV_KEY: It must be 64 characters long (or more)");throw e.code="INVALID_DOTENV_KEY",e}if(o){const e=new Error("DECRYPTION_FAILED: Please check your DOTENV_KEY");throw e.code="DECRYPTION_FAILED",e}throw e}},parse:function(e){const t={};let n,o=e.toString();for(o=o.replace(/\r\n?/gm,"\n");null!=(n=d.exec(o));){const e=n[1];let o=n[2]||"";o=o.trim();const r=o[0];o=o.replace(/^(['"`])([\s\S]*)\1$/gm,"$2"),'"'===r&&(o=o.replace(/\\n/g,"\n"),o=o.replace(/\\r/g,"\r")),t[e]=o}return t},populate:function(e,t,n={}){const o=Boolean(n&&n.debug),r=Boolean(n&&n.override);if("object"!=typeof t){const e=new Error("OBJECT_REQUIRED: Please check the processEnv argument being passed to populate");throw e.code="OBJECT_REQUIRED",e}for(const n of Object.keys(t))Object.prototype.hasOwnProperty.call(e,n)?(!0===r&&(e[n]=t[n]),o&&f(!0===r?`"${n}" is already defined and WAS overwritten`:`"${n}" is already defined and was NOT overwritten`)):e[n]=t[n]}};return i.exports.configDotenv=g.configDotenv,i.exports._configVault=g._configVault,i.exports._parseVault=g._parseVault,i.exports.config=g.config,i.exports.decrypt=g.decrypt,i.exports.parse=g.parse,i.exports.populate=g.populate,i.exports=g,i.exports}(),p=a(u);function d(e,t=!1){if(!e)return"";return e[0].toUpperCase()+(t?e.slice(1).toLowerCase():e.slice(1))}function f(e,t,n="is-IS"){const o="[Translation not found]";for(const s of t)if(s.itemKey===e){var r;return(null===(r=s.values.find((e=>e.language===n)))||void 0===r?void 0:r.value)||o}return o}async function v({url:e,options:t=null,throwOnError:n=!1}){const o=`[@vettvangur/vanilla :: fetcher] Error: ${e}`;try{const r=await fetch(e,t);if(!r.ok){const e=await r.text(),t=`${o} - Status: ${r.status}, ${r.statusText}, Details: ${e}`;if(console.error(t),n)throw new Error(t);return null}return await r.json()}catch(e){const t=`${o} - ${e}`;if(console.error(t),n)throw e;return null}}async function E(n=!0){const o=e.resolve(t.cwd(),".env"),r=p.config({path:o});r.error&&console.warn(`Warning: Failed to load environment variables from .env: ${r.error.message}`);const s=`.env.${t.env.NODE_ENV||"development"}`,a=p.config({path:e.resolve(t.cwd(),s)});if(a.error)throw new Error(`Failed to load environment variables from ${s}: ${a.error.message}`);n&&console.log(`Loaded environment variables from ${s}\n`)}function h(e){try{return new RegExp(e),!0}catch(e){return!1}}const m={test({value:e,pattern:t,flags:n="g"}){if(!e||!t||!h(t))return!1;return new RegExp(t,n).test(e)},match({value:e,pattern:t,flags:n="g"}){if(!e||!t||!h(t))return null;const o=new RegExp(t,n);return e.match(o)}},g=(e,t="")=>{try{return e&&"object"==typeof e?Object.keys(e).reduce(((n,o)=>{const r="DEFAULT"===o?t:t?`${t}-${o}`:o;return"object"==typeof e[o]&&"DEFAULT"!==o?Object.assign(n,g(e[o],r)):"string"==typeof e[o]?n[r]=e[o]:console.warn("! Skipping Invalid Key:",o,"Value:",e[o]),n}),{}):(console.error("❌ FLATTEN ERROR: Received invalid data:",e),{})}catch(e){return console.error("🚨 Flatten Function Error:",e),{}}};function y(e,t){const n=t[d(e)];return n||t.Subpage}function w(e,t){const n=t[d(e)];return n||null}function D(e){return""===e||null==e}function N(e){const t=new Map;return Object.entries(e).forEach((([e,n])=>{e.split(",").forEach((e=>{t.set(e.trim(),n)}))})),t}function b(){console.log("PRELOAD");const e=document.querySelector(".body");e&&(setTimeout((()=>e.classList.add("loaded")),100),setTimeout((()=>{e.classList.add("preload--hidden"),e.classList.remove("preload--transitions")}),400))}function T(e,t=document){const n=new IntersectionObserver((t=>{t.forEach((t=>{if(t.isIntersecting){const o=t.target,r=Array.from(e.entries()).filter((([e])=>o.matches(e))).map((([e,t])=>t));r.length>0&&Promise.allSettled(r.map((e=>e()))).then((e=>{e.forEach((e=>{var t;"fulfilled"===e.status&&null!==(t=e.value)&&void 0!==t&&null!==(t=t.default)&&void 0!==t&&t.init&&e.value.default.init(o)}))})).catch(console.error),n.unobserve(o)}}))}));e.forEach(((e,o)=>{t.querySelectorAll(o).forEach((e=>n.observe(e)))}))}function $(n=null){import(e.resolve(t.cwd(),"scripts","core","prefetch.ts")).then((e=>e.default.init())),import(e.resolve(t.cwd(),"scripts","core","recaptcha.ts")).then((e=>e.default.init())),n&&n()}function O(e,t,n=null){document.addEventListener("DOMContentLoaded",(o=>{b(),$(t),T(e),n&&n(o)}))}function _(e,t,n=null){window.addEventListener("popstate",(o=>{setTimeout((()=>{$(t),T(e),n&&n(o)}),0)}))}function A(e,t,n=null){window.addEventListener("pageshow",(o=>{setTimeout((()=>{$(t),T(e),n&&n(o)}),0)}))}function L(e=null){document.body.addEventListener("htmx:beforeSwap",(t=>{var n;null===(n=document.querySelectorAll(".button--loading"))||void 0===n||n.forEach((e=>e.classList.remove("button--loading"))),e&&e(t),setTimeout((()=>window.scrollTo({top:0,behavior:"smooth"})),100)}))}function I(e,t=null){document.body.addEventListener("htmx:afterSwap",(n=>{T(e),t&&t(n)}))}function V(e,t,n=null){document.body.addEventListener("htmx:afterSettle",(o=>{$(t),T(e),n&&n(o)}))}function S(e){document.addEventListener("click",(t=>{const n=t.target,o=document.querySelectorAll(".co-el");n.closest(".co-trigger")||(e(t),Array.prototype.forEach.call(o,(e=>{e.classList.contains("open")&&e.classList.remove("open")})))}),!1),document.addEventListener("keyup",(t=>{const n=document.querySelectorAll(".open");27===(t.keyCode||t.which)&&(e(t),Array.prototype.forEach.call(n,(e=>{e.classList.contains("open")&&e.classList.remove("open")})))}))}const R=Object.freeze({NODE:"node",CHILDREN:"children",DESCENDANTS:"descendants",ANCESTORS:"ancestors",EXTRA:"extra"});async function x({route:e,fetchType:n=R.NODE,options:o={},fetchOptions:r={}}){if(!Object.values(R).includes(n))throw new Error(`Invalid fetch type: ${n}`);const s=function(e,n,o={}){E();const r=o.skip||0,s=o.take||9999,a=o.fields||"properties[$all]",c=t.env.DELIVERYAPI,i=`${e}?field=${a}`,l=`${e}&skip=${r}&take=${s}&fields=${a}`;switch(n){case R.NODE:return`${c}/content/item/${i}`;case R.CHILDREN:return`${c}/?fetch=children:${l}`;case R.DESCENDANTS:return`${c}/?fetch=descendants:${l}`;case R.ANCESTORS:return`${c}/?fetch=ancestors:${l}`;case R.EXTRA:return`${c}/extra`;default:throw new Error(`Unsupported fetch type: ${n}. Available types: NODE, CHILDREN, DESCENDANTS, ANCESTORS, EXTRA`)}}(e,n,o);return await v({url:s,options:r})}function j(e,t){const n=t[e];if(n)return n;console.error(`[vettvangur-vanilla :: getTranslation] No translation for key ${e} found.`)}function k(e){const t=e.match(/^\/([a-z]{2})(\/|$)/i);return t?t[1].toLowerCase():null}export{R as Umbraco,d as capitalize,S as clickOutside,N as createModuleMap,w as default,f as dictionary,v as fetcher,g as flatten,w as getBlock,k as getCulture,y as getTemplate,j as getTranslation,x as getUmbracoData,$ as initCoreScripts,D as isEmpty,T as lazyModules,E as loadEnvFiles,O as onDomReady,V as onHtmxAfterSettle,I as onHtmxAfterSwap,L as onHtmxBeforeSwap,A as onPageShow,_ as onPopstate,b as preloadTimeout,m as regexr};
1
+ import e from"node:path";import t from"node:process";import n from"fs";import o from"path";import r from"os";import s from"crypto";function a(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var c,i={exports:{}},l={name:"dotenv",version:"16.4.5",description:"Loads environment variables from .env file",main:"lib/main.js",types:"lib/main.d.ts",exports:{".":{types:"./lib/main.d.ts",require:"./lib/main.js",default:"./lib/main.js"},"./config":"./config.js","./config.js":"./config.js","./lib/env-options":"./lib/env-options.js","./lib/env-options.js":"./lib/env-options.js","./lib/cli-options":"./lib/cli-options.js","./lib/cli-options.js":"./lib/cli-options.js","./package.json":"./package.json"},scripts:{"dts-check":"tsc --project tests/types/tsconfig.json",lint:"standard","lint-readme":"standard-markdown",pretest:"npm run lint && npm run dts-check",test:"tap tests/*.js --100 -Rspec","test:coverage":"tap --coverage-report=lcov",prerelease:"npm test",release:"standard-version"},repository:{type:"git",url:"git://github.com/motdotla/dotenv.git"},funding:"https://dotenvx.com",keywords:["dotenv","env",".env","environment","variables","config","settings"],readmeFilename:"README.md",license:"BSD-2-Clause",devDependencies:{"@definitelytyped/dtslint":"^0.0.133","@types/node":"^18.11.3",decache:"^4.6.1",sinon:"^14.0.1",standard:"^17.0.0","standard-markdown":"^7.1.0","standard-version":"^9.5.0",tap:"^16.3.0",tar:"^6.1.11",typescript:"^4.8.4"},engines:{node:">=12"},browser:{fs:!1}};var u=function(){if(c)return i.exports;c=1;const e=n,t=o,a=r,u=s,p=l.version,d=/(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/gm;function f(e){console.log(`[dotenv@${p}][DEBUG] ${e}`)}function v(e){return e&&e.DOTENV_KEY&&e.DOTENV_KEY.length>0?e.DOTENV_KEY:process.env.DOTENV_KEY&&process.env.DOTENV_KEY.length>0?process.env.DOTENV_KEY:""}function E(e,t){let n;try{n=new URL(t)}catch(e){if("ERR_INVALID_URL"===e.code){const e=new Error("INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development");throw e.code="INVALID_DOTENV_KEY",e}throw e}const o=n.password;if(!o){const e=new Error("INVALID_DOTENV_KEY: Missing key part");throw e.code="INVALID_DOTENV_KEY",e}const r=n.searchParams.get("environment");if(!r){const e=new Error("INVALID_DOTENV_KEY: Missing environment part");throw e.code="INVALID_DOTENV_KEY",e}const s=`DOTENV_VAULT_${r.toUpperCase()}`,a=e.parsed[s];if(!a){const e=new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${s} in your .env.vault file.`);throw e.code="NOT_FOUND_DOTENV_ENVIRONMENT",e}return{ciphertext:a,key:o}}function h(n){let o=null;if(n&&n.path&&n.path.length>0)if(Array.isArray(n.path))for(const t of n.path)e.existsSync(t)&&(o=t.endsWith(".vault")?t:`${t}.vault`);else o=n.path.endsWith(".vault")?n.path:`${n.path}.vault`;else o=t.resolve(process.cwd(),".env.vault");return e.existsSync(o)?o:null}function m(e){return"~"===e[0]?t.join(a.homedir(),e.slice(1)):e}const g={configDotenv:function(n){const o=t.resolve(process.cwd(),".env");let r="utf8";const s=Boolean(n&&n.debug);n&&n.encoding?r=n.encoding:s&&f("No encoding is specified. UTF-8 is used by default");let a,c=[o];if(n&&n.path)if(Array.isArray(n.path)){c=[];for(const e of n.path)c.push(m(e))}else c=[m(n.path)];const i={};for(const t of c)try{const o=g.parse(e.readFileSync(t,{encoding:r}));g.populate(i,o,n)}catch(e){s&&f(`Failed to load ${t} ${e.message}`),a=e}let l=process.env;return n&&null!=n.processEnv&&(l=n.processEnv),g.populate(l,i,n),a?{parsed:i,error:a}:{parsed:i}},_configVault:function(e){var t;t="Loading env from encrypted .env.vault",console.log(`[dotenv@${p}][INFO] ${t}`);const n=g._parseVault(e);let o=process.env;return e&&null!=e.processEnv&&(o=e.processEnv),g.populate(o,n,e),{parsed:n}},_parseVault:function(e){const t=h(e),n=g.configDotenv({path:t});if(!n.parsed){const e=new Error(`MISSING_DATA: Cannot parse ${t} for an unknown reason`);throw e.code="MISSING_DATA",e}const o=v(e).split(","),r=o.length;let s;for(let e=0;e<r;e++)try{const t=E(n,o[e].trim());s=g.decrypt(t.ciphertext,t.key);break}catch(t){if(e+1>=r)throw t}return g.parse(s)},config:function(e){if(0===v(e).length)return g.configDotenv(e);const t=h(e);return t?g._configVault(e):(n=`You set DOTENV_KEY but you are missing a .env.vault file at ${t}. Did you forget to build it?`,console.log(`[dotenv@${p}][WARN] ${n}`),g.configDotenv(e));var n},decrypt:function(e,t){const n=Buffer.from(t.slice(-64),"hex");let o=Buffer.from(e,"base64");const r=o.subarray(0,12),s=o.subarray(-16);o=o.subarray(12,-16);try{const e=u.createDecipheriv("aes-256-gcm",n,r);return e.setAuthTag(s),`${e.update(o)}${e.final()}`}catch(e){const t=e instanceof RangeError,n="Invalid key length"===e.message,o="Unsupported state or unable to authenticate data"===e.message;if(t||n){const e=new Error("INVALID_DOTENV_KEY: It must be 64 characters long (or more)");throw e.code="INVALID_DOTENV_KEY",e}if(o){const e=new Error("DECRYPTION_FAILED: Please check your DOTENV_KEY");throw e.code="DECRYPTION_FAILED",e}throw e}},parse:function(e){const t={};let n,o=e.toString();for(o=o.replace(/\r\n?/gm,"\n");null!=(n=d.exec(o));){const e=n[1];let o=n[2]||"";o=o.trim();const r=o[0];o=o.replace(/^(['"`])([\s\S]*)\1$/gm,"$2"),'"'===r&&(o=o.replace(/\\n/g,"\n"),o=o.replace(/\\r/g,"\r")),t[e]=o}return t},populate:function(e,t,n={}){const o=Boolean(n&&n.debug),r=Boolean(n&&n.override);if("object"!=typeof t){const e=new Error("OBJECT_REQUIRED: Please check the processEnv argument being passed to populate");throw e.code="OBJECT_REQUIRED",e}for(const n of Object.keys(t))Object.prototype.hasOwnProperty.call(e,n)?(!0===r&&(e[n]=t[n]),o&&f(!0===r?`"${n}" is already defined and WAS overwritten`:`"${n}" is already defined and was NOT overwritten`)):e[n]=t[n]}};return i.exports.configDotenv=g.configDotenv,i.exports._configVault=g._configVault,i.exports._parseVault=g._parseVault,i.exports.config=g.config,i.exports.decrypt=g.decrypt,i.exports.parse=g.parse,i.exports.populate=g.populate,i.exports=g,i.exports}(),p=a(u);function d(e,t=!1){if(!e)return"";return e[0].toUpperCase()+(t?e.slice(1).toLowerCase():e.slice(1))}function f(e,t,n="is-IS"){const o="[Translation not found]";for(const s of t)if(s.itemKey===e){var r;return(null===(r=s.values.find((e=>e.language===n)))||void 0===r?void 0:r.value)||o}return o}async function v({url:e,options:t=null,throwOnError:n=!1}){const o=`[@vettvangur/vanilla :: fetcher] Error: ${e}`;try{const r=await fetch(e,t);if(!r.ok){const e=await r.text(),t=`${o} - Status: ${r.status}, ${r.statusText}, Details: ${e}`;if(console.error(t),n)throw new Error(t);return null}return await r.json()}catch(e){const t=`${o} - ${e}`;if(console.error(t),n)throw e;return null}}async function E(n=!0){const o=e.resolve(t.cwd(),".env"),r=p.config({path:o});r.error&&console.warn(`Warning: Failed to load environment variables from .env: ${r.error.message}`);const s=`.env.${t.env.NODE_ENV||"development"}`,a=p.config({path:e.resolve(t.cwd(),s)});if(a.error)throw new Error(`Failed to load environment variables from ${s}: ${a.error.message}`);n&&console.log(`Loaded environment variables from ${s}\n`)}function h(e){try{return new RegExp(e),!0}catch(e){return!1}}const m={test({value:e,pattern:t,flags:n="g"}){if(!e||!t||!h(t))return!1;return new RegExp(t,n).test(e)},match({value:e,pattern:t,flags:n="g"}){if(!e||!t||!h(t))return null;const o=new RegExp(t,n);return e.match(o)}},g=(e,t="")=>{try{return e&&"object"==typeof e?Object.keys(e).reduce(((n,o)=>{const r="DEFAULT"===o?t:t?`${t}-${o}`:o;return"object"==typeof e[o]&&"DEFAULT"!==o?Object.assign(n,g(e[o],r)):"string"==typeof e[o]?n[r]=e[o]:console.warn("! Skipping Invalid Key:",o,"Value:",e[o]),n}),{}):(console.error("❌ FLATTEN ERROR: Received invalid data:",e),{})}catch(e){return console.error("🚨 Flatten Function Error:",e),{}}};function y(e,t){const n=t[d(e)];return n||t.Subpage}function w(e,t){const n=t[d(e)];return n||null}function D(e){return""===e||null==e}function N(e){const t=new Map;return Object.entries(e).forEach((([e,n])=>{e.split(",").forEach((e=>{t.set(e.trim(),n)}))})),t}function $(){console.log("PRELOAD");const e=document.querySelector(".body");e&&(setTimeout((()=>e.classList.add("loaded")),100),setTimeout((()=>{e.classList.add("preload--hidden"),e.classList.remove("preload--transitions")}),400))}function b(e,t=document){const n=new IntersectionObserver((t=>{t.forEach((t=>{if(t.isIntersecting){const o=t.target,r=Array.from(e.entries()).filter((([e])=>o.matches(e))).map((([e,t])=>t));r.length>0&&Promise.allSettled(r.map((e=>e()))).then((e=>{e.forEach((e=>{var t;"fulfilled"===e.status&&null!==(t=e.value)&&void 0!==t&&null!==(t=t.default)&&void 0!==t&&t.init&&e.value.default.init(o)}))})).catch(console.error),n.unobserve(o)}}))}));e.forEach(((e,o)=>{t.querySelectorAll(o).forEach((e=>n.observe(e)))}))}function T(n=null){import(e.resolve(t.cwd(),"scripts","core","prefetch.ts")).then((e=>e.default.init())),import(e.resolve(t.cwd(),"scripts","core","recaptcha.ts")).then((e=>e.default.init())),n&&n()}function O(e,t,n=null){document.addEventListener("DOMContentLoaded",(o=>{$(),T(t),b(e),n&&n(o)}))}function _(e,t,n=null){window.addEventListener("popstate",(o=>{setTimeout((()=>{T(t),b(e),n&&n(o)}),0)}))}function A(e,t,n=null){window.addEventListener("pageshow",(o=>{setTimeout((()=>{T(t),b(e),n&&n(o)}),0)}))}function L(e=null){document.body.addEventListener("htmx:beforeSwap",(t=>{var n;null===(n=document.querySelectorAll(".button--loading"))||void 0===n||n.forEach((e=>e.classList.remove("button--loading"))),e&&e(t),setTimeout((()=>window.scrollTo({top:0,behavior:"smooth"})),100)}))}function I(e,t=null){document.body.addEventListener("htmx:afterSwap",(n=>{b(e),t&&t(n)}))}function V(e,t,n=null){document.body.addEventListener("htmx:afterSettle",(o=>{T(t),b(e),n&&n(o)}))}function S(e){document.addEventListener("click",(t=>{const n=t.target,o=document.querySelectorAll(".co-el");n.closest(".co-trigger")||(e(t),Array.prototype.forEach.call(o,(e=>{e.classList.contains("open")&&e.classList.remove("open")})))}),!1),document.addEventListener("keyup",(t=>{const n=document.querySelectorAll(".open");27===(t.keyCode||t.which)&&(e(t),Array.prototype.forEach.call(n,(e=>{e.classList.contains("open")&&e.classList.remove("open")})))}))}const x=Object.freeze({NODE:"node",CHILDREN:"children",DESCENDANTS:"descendants",ANCESTORS:"ancestors",EXTRA:"extra"});async function R({route:e,fetchType:n=x.NODE,options:o={},fetchOptions:r={}}){if(!Object.values(x).includes(n))throw new Error(`Invalid fetch type: ${n}`);const s=function(e,n,o={}){E();const r=o.skip||0,s=o.take||9999,a=o.fields||"properties[$all]",c=o.expand?`&expand=${o.expand}`:"",i=t.env.DELIVERYAPI,l=`${e}?field=${a}${c}`,u=`${e}&skip=${r}&take=${s}&fields=${a}${c}`;switch(n){case x.NODE:return`${i}/content/item/${l}`;case x.CHILDREN:return`${i}/?fetch=children:${u}`;case x.DESCENDANTS:return`${i}/?fetch=descendants:${u}`;case x.ANCESTORS:return`${i}/?fetch=ancestors:${u}`;case x.EXTRA:return`${i}/extra`;default:throw new Error(`Unsupported fetch type: ${n}. Available types: NODE, CHILDREN, DESCENDANTS, ANCESTORS, EXTRA`)}}(e,n,o);return await v({url:s,options:r})}function j(e,t){const n=t[e];if(n)return n;console.error(`[vettvangur-vanilla :: getTranslation] No translation for key ${e} found.`)}function k(e){const t=e.match(/^\/([a-z]{2})(\/|$)/i);return t?t[1].toLowerCase():null}export{x as Umbraco,d as capitalize,S as clickOutside,N as createModuleMap,w as default,f as dictionary,v as fetcher,g as flatten,w as getBlock,k as getCulture,y as getTemplate,j as getTranslation,R as getUmbracoData,T as initCoreScripts,D as isEmpty,b as lazyModules,E as loadEnvFiles,O as onDomReady,V as onHtmxAfterSettle,I as onHtmxAfterSwap,L as onHtmxBeforeSwap,A as onPageShow,_ as onPopstate,$ as preloadTimeout,m as regexr};
2
2
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../../../../node_modules/.pnpm/dotenv@16.4.5/node_modules/dotenv/lib/main.js","../index.mjs"],"sourcesContent":["const fs = require('fs')\nconst path = require('path')\nconst os = require('os')\nconst crypto = require('crypto')\nconst packageJson = require('../package.json')\n\nconst version = packageJson.version\n\nconst LINE = /(?:^|^)\\s*(?:export\\s+)?([\\w.-]+)(?:\\s*=\\s*?|:\\s+?)(\\s*'(?:\\\\'|[^'])*'|\\s*\"(?:\\\\\"|[^\"])*\"|\\s*`(?:\\\\`|[^`])*`|[^#\\r\\n]+)?\\s*(?:#.*)?(?:$|$)/mg\n\n// Parse src into an Object\nfunction parse (src) {\n const obj = {}\n\n // Convert buffer to string\n let lines = src.toString()\n\n // Convert line breaks to same format\n lines = lines.replace(/\\r\\n?/mg, '\\n')\n\n let match\n while ((match = LINE.exec(lines)) != null) {\n const key = match[1]\n\n // Default undefined or null to empty string\n let value = (match[2] || '')\n\n // Remove whitespace\n value = value.trim()\n\n // Check if double quoted\n const maybeQuote = value[0]\n\n // Remove surrounding quotes\n value = value.replace(/^(['\"`])([\\s\\S]*)\\1$/mg, '$2')\n\n // Expand newlines if double quoted\n if (maybeQuote === '\"') {\n value = value.replace(/\\\\n/g, '\\n')\n value = value.replace(/\\\\r/g, '\\r')\n }\n\n // Add to object\n obj[key] = value\n }\n\n return obj\n}\n\nfunction _parseVault (options) {\n const vaultPath = _vaultPath(options)\n\n // Parse .env.vault\n const result = DotenvModule.configDotenv({ path: vaultPath })\n if (!result.parsed) {\n const err = new Error(`MISSING_DATA: Cannot parse ${vaultPath} for an unknown reason`)\n err.code = 'MISSING_DATA'\n throw err\n }\n\n // handle scenario for comma separated keys - for use with key rotation\n // example: DOTENV_KEY=\"dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=prod,dotenv://:key_7890@dotenvx.com/vault/.env.vault?environment=prod\"\n const keys = _dotenvKey(options).split(',')\n const length = keys.length\n\n let decrypted\n for (let i = 0; i < length; i++) {\n try {\n // Get full key\n const key = keys[i].trim()\n\n // Get instructions for decrypt\n const attrs = _instructions(result, key)\n\n // Decrypt\n decrypted = DotenvModule.decrypt(attrs.ciphertext, attrs.key)\n\n break\n } catch (error) {\n // last key\n if (i + 1 >= length) {\n throw error\n }\n // try next key\n }\n }\n\n // Parse decrypted .env string\n return DotenvModule.parse(decrypted)\n}\n\nfunction _log (message) {\n console.log(`[dotenv@${version}][INFO] ${message}`)\n}\n\nfunction _warn (message) {\n console.log(`[dotenv@${version}][WARN] ${message}`)\n}\n\nfunction _debug (message) {\n console.log(`[dotenv@${version}][DEBUG] ${message}`)\n}\n\nfunction _dotenvKey (options) {\n // prioritize developer directly setting options.DOTENV_KEY\n if (options && options.DOTENV_KEY && options.DOTENV_KEY.length > 0) {\n return options.DOTENV_KEY\n }\n\n // secondary infra already contains a DOTENV_KEY environment variable\n if (process.env.DOTENV_KEY && process.env.DOTENV_KEY.length > 0) {\n return process.env.DOTENV_KEY\n }\n\n // fallback to empty string\n return ''\n}\n\nfunction _instructions (result, dotenvKey) {\n // Parse DOTENV_KEY. Format is a URI\n let uri\n try {\n uri = new URL(dotenvKey)\n } catch (error) {\n if (error.code === 'ERR_INVALID_URL') {\n const err = new Error('INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n throw error\n }\n\n // Get decrypt key\n const key = uri.password\n if (!key) {\n const err = new Error('INVALID_DOTENV_KEY: Missing key part')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n // Get environment\n const environment = uri.searchParams.get('environment')\n if (!environment) {\n const err = new Error('INVALID_DOTENV_KEY: Missing environment part')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n // Get ciphertext payload\n const environmentKey = `DOTENV_VAULT_${environment.toUpperCase()}`\n const ciphertext = result.parsed[environmentKey] // DOTENV_VAULT_PRODUCTION\n if (!ciphertext) {\n const err = new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${environmentKey} in your .env.vault file.`)\n err.code = 'NOT_FOUND_DOTENV_ENVIRONMENT'\n throw err\n }\n\n return { ciphertext, key }\n}\n\nfunction _vaultPath (options) {\n let possibleVaultPath = null\n\n if (options && options.path && options.path.length > 0) {\n if (Array.isArray(options.path)) {\n for (const filepath of options.path) {\n if (fs.existsSync(filepath)) {\n possibleVaultPath = filepath.endsWith('.vault') ? filepath : `${filepath}.vault`\n }\n }\n } else {\n possibleVaultPath = options.path.endsWith('.vault') ? options.path : `${options.path}.vault`\n }\n } else {\n possibleVaultPath = path.resolve(process.cwd(), '.env.vault')\n }\n\n if (fs.existsSync(possibleVaultPath)) {\n return possibleVaultPath\n }\n\n return null\n}\n\nfunction _resolveHome (envPath) {\n return envPath[0] === '~' ? path.join(os.homedir(), envPath.slice(1)) : envPath\n}\n\nfunction _configVault (options) {\n _log('Loading env from encrypted .env.vault')\n\n const parsed = DotenvModule._parseVault(options)\n\n let processEnv = process.env\n if (options && options.processEnv != null) {\n processEnv = options.processEnv\n }\n\n DotenvModule.populate(processEnv, parsed, options)\n\n return { parsed }\n}\n\nfunction configDotenv (options) {\n const dotenvPath = path.resolve(process.cwd(), '.env')\n let encoding = 'utf8'\n const debug = Boolean(options && options.debug)\n\n if (options && options.encoding) {\n encoding = options.encoding\n } else {\n if (debug) {\n _debug('No encoding is specified. UTF-8 is used by default')\n }\n }\n\n let optionPaths = [dotenvPath] // default, look for .env\n if (options && options.path) {\n if (!Array.isArray(options.path)) {\n optionPaths = [_resolveHome(options.path)]\n } else {\n optionPaths = [] // reset default\n for (const filepath of options.path) {\n optionPaths.push(_resolveHome(filepath))\n }\n }\n }\n\n // Build the parsed data in a temporary object (because we need to return it). Once we have the final\n // parsed data, we will combine it with process.env (or options.processEnv if provided).\n let lastError\n const parsedAll = {}\n for (const path of optionPaths) {\n try {\n // Specifying an encoding returns a string instead of a buffer\n const parsed = DotenvModule.parse(fs.readFileSync(path, { encoding }))\n\n DotenvModule.populate(parsedAll, parsed, options)\n } catch (e) {\n if (debug) {\n _debug(`Failed to load ${path} ${e.message}`)\n }\n lastError = e\n }\n }\n\n let processEnv = process.env\n if (options && options.processEnv != null) {\n processEnv = options.processEnv\n }\n\n DotenvModule.populate(processEnv, parsedAll, options)\n\n if (lastError) {\n return { parsed: parsedAll, error: lastError }\n } else {\n return { parsed: parsedAll }\n }\n}\n\n// Populates process.env from .env file\nfunction config (options) {\n // fallback to original dotenv if DOTENV_KEY is not set\n if (_dotenvKey(options).length === 0) {\n return DotenvModule.configDotenv(options)\n }\n\n const vaultPath = _vaultPath(options)\n\n // dotenvKey exists but .env.vault file does not exist\n if (!vaultPath) {\n _warn(`You set DOTENV_KEY but you are missing a .env.vault file at ${vaultPath}. Did you forget to build it?`)\n\n return DotenvModule.configDotenv(options)\n }\n\n return DotenvModule._configVault(options)\n}\n\nfunction decrypt (encrypted, keyStr) {\n const key = Buffer.from(keyStr.slice(-64), 'hex')\n let ciphertext = Buffer.from(encrypted, 'base64')\n\n const nonce = ciphertext.subarray(0, 12)\n const authTag = ciphertext.subarray(-16)\n ciphertext = ciphertext.subarray(12, -16)\n\n try {\n const aesgcm = crypto.createDecipheriv('aes-256-gcm', key, nonce)\n aesgcm.setAuthTag(authTag)\n return `${aesgcm.update(ciphertext)}${aesgcm.final()}`\n } catch (error) {\n const isRange = error instanceof RangeError\n const invalidKeyLength = error.message === 'Invalid key length'\n const decryptionFailed = error.message === 'Unsupported state or unable to authenticate data'\n\n if (isRange || invalidKeyLength) {\n const err = new Error('INVALID_DOTENV_KEY: It must be 64 characters long (or more)')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n } else if (decryptionFailed) {\n const err = new Error('DECRYPTION_FAILED: Please check your DOTENV_KEY')\n err.code = 'DECRYPTION_FAILED'\n throw err\n } else {\n throw error\n }\n }\n}\n\n// Populate process.env with parsed values\nfunction populate (processEnv, parsed, options = {}) {\n const debug = Boolean(options && options.debug)\n const override = Boolean(options && options.override)\n\n if (typeof parsed !== 'object') {\n const err = new Error('OBJECT_REQUIRED: Please check the processEnv argument being passed to populate')\n err.code = 'OBJECT_REQUIRED'\n throw err\n }\n\n // Set process.env\n for (const key of Object.keys(parsed)) {\n if (Object.prototype.hasOwnProperty.call(processEnv, key)) {\n if (override === true) {\n processEnv[key] = parsed[key]\n }\n\n if (debug) {\n if (override === true) {\n _debug(`\"${key}\" is already defined and WAS overwritten`)\n } else {\n _debug(`\"${key}\" is already defined and was NOT overwritten`)\n }\n }\n } else {\n processEnv[key] = parsed[key]\n }\n }\n}\n\nconst DotenvModule = {\n configDotenv,\n _configVault,\n _parseVault,\n config,\n decrypt,\n parse,\n populate\n}\n\nmodule.exports.configDotenv = DotenvModule.configDotenv\nmodule.exports._configVault = DotenvModule._configVault\nmodule.exports._parseVault = DotenvModule._parseVault\nmodule.exports.config = DotenvModule.config\nmodule.exports.decrypt = DotenvModule.decrypt\nmodule.exports.parse = DotenvModule.parse\nmodule.exports.populate = DotenvModule.populate\n\nmodule.exports = DotenvModule\n","/**\r\n * @memberof @vettvangur/react\r\n */\r\n\r\nimport path from 'node:path'\r\nimport process from 'node:process'\r\nimport dotenv from 'dotenv'\r\n\r\n/**\r\n * Capitalizes the first letter of a given string.\r\n *\r\n * @function capitalize\r\n * @param {string|null|undefined} value - The string to capitalize. If null or undefined, returns an empty string.\r\n * @param {boolean} [lowerRest=false] - If true, converts the rest of the string to lowercase.\r\n * @returns {string} The capitalized string, or an empty string if the input is falsy.\r\n *\r\n * @example capitalize(string)\r\n */\r\nexport function capitalize(value, lowerRest = false) {\r\n if (!value) {\r\n return ''\r\n }\r\n\r\n const firstChar = value[0].toUpperCase()\r\n const rest = lowerRest ? value.slice(1).toLowerCase() : value.slice(1)\r\n\r\n return firstChar + rest\r\n}\r\n\r\n/**\r\n * Retrieves a translated string from a dictionary based on a given key and culture.\r\n *\r\n * @function dictionary\r\n * @param {string} key - The key for the translation.\r\n * @param {Array} data - The array of translation objects.\r\n * @param {string} [culture='is-IS'] - The language code to search for (default: 'is-IS').\r\n * @returns {string} The translated string if found, otherwise '[Translation not found]'.\r\n *\r\n * @example\r\n * dictionary(key)\r\n */\r\nexport function dictionary(key, data, culture = 'is-IS') {\r\n const notFound = '[Translation not found]'\r\n\r\n for (const item of data) {\r\n if (item.itemKey === key) {\r\n const translation = item.values.find((b) => b.language === culture)?.value\r\n return translation || notFound\r\n }\r\n }\r\n\r\n return notFound\r\n}\r\n\r\n/**\r\n * Fetches data from a given URL with customizable options and error handling.\r\n *\r\n * @async\r\n * @function fetcher\r\n * @param {Object} params - The parameters for the fetcher function.\r\n * @param {string} params.url - The URL to fetch data from.\r\n * @param {RequestInit|null} [params.options={}] - Fetch API options (headers, method, body, etc.).\r\n * @param {boolean} [params.throwOnError=false] - Whether to throw an error on non-OK HTTP responses.\r\n * @returns {Promise<Object|null>} The parsed JSON response or null if an error occurs.\r\n * @throws Will throw an error if `throwOnError` is true and the fetch fails or returns a non-OK status.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API\r\n *\r\n * @example\r\n * const getData = await fetcher({\r\n * url,\r\n * {\r\n * method: 'POST',\r\n * headers: {\r\n * 'Content-Type': 'application/json'\r\n * }\r\n * }\r\n * })\r\n */\r\n\r\nexport async function fetcher({ url, options = null, throwOnError = false }) {\r\n const errorMessage = `[@vettvangur/vanilla :: fetcher] Error: ${url}`\r\n\r\n try {\r\n const request = await fetch(url, options)\r\n\r\n if (!request.ok) {\r\n const errorDetails = await request.text()\r\n const fullErrorMessage = `${errorMessage} - Status: ${request.status}, ${request.statusText}, Details: ${errorDetails}`\r\n console.error(fullErrorMessage)\r\n\r\n if (throwOnError) {\r\n throw new Error(fullErrorMessage)\r\n }\r\n\r\n // Return null instead of undefined on error for predictable handling\r\n return null\r\n }\r\n\r\n return await request.json()\r\n } catch (error) {\r\n const fullErrorMessage = `${errorMessage} - ${error}`\r\n console.error(fullErrorMessage)\r\n\r\n if (throwOnError) {\r\n throw error\r\n }\r\n\r\n // Return null instead of undefined on error for predictable handling\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Loads environment variables from `.env` and `.env.[NODE_ENV]` files.\r\n *\r\n * This function first loads the base `.env` file, then loads an environment-specific file\r\n * based on `NODE_ENV` (e.g., `.env.production`, `.env.development`). If `NODE_ENV` is not set,\r\n * it defaults to `'development'`.\r\n *\r\n * @async\r\n * @function loadEnvFiles\r\n * @param {boolean} [showMessage=true] - Whether to log a message indicating which env file was loaded.\r\n * @throws {Error} Throws an error if loading the environment-specific file fails.\r\n * @returns {Promise<void>} Resolves when environment files are loaded.\r\n */\r\nexport async function loadEnvFiles(showMessage = true) {\r\n // Always load the .env file first\r\n const envFilePath = path.resolve(process.cwd(), '.env')\r\n const baseResult = dotenv.config({ path: envFilePath })\r\n\r\n if (baseResult.error) {\r\n console.warn(`Warning: Failed to load environment variables from .env: ${baseResult.error.message}`)\r\n }\r\n\r\n const env = process.env.NODE_ENV || 'development' // Default to 'development' if NODE_ENV is not set\r\n const envFile = `.env.${env}`\r\n\r\n // Load the specified environment file\r\n const result = dotenv.config({ path: path.resolve(process.cwd(), envFile) })\r\n\r\n if (result.error) {\r\n throw new Error(`Failed to load environment variables from ${envFile}: ${result.error.message}`)\r\n }\r\n\r\n if (showMessage) {\r\n console.log(`Loaded environment variables from ${envFile}\\n`)\r\n }\r\n}\r\n\r\n/**\r\n * Checks if a given string is a valid regular expression pattern.\r\n *\r\n * @ignore\r\n * @param {string} pattern - The regex pattern to validate.\r\n * @returns {boolean} Returns `true` if the pattern is a valid regex, otherwise `false`.\r\n */\r\nfunction isValidRegex(pattern) {\r\n try {\r\n new RegExp(pattern)\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\n/**\r\n * Utility object for regex operations.\r\n */\r\nexport const regexr = {\r\n /**\r\n * Tests whether a given value matches a regex pattern.\r\n *\r\n * @param {Object} params - Parameters for testing regex.\r\n * @param {string} params.value - The string to test against the regex.\r\n * @param {string} params.pattern - The regex pattern to match.\r\n * @param {string} [params.flags='g'] - Regex flags (default: 'g').\r\n * @returns {boolean} Returns `true` if the value matches the pattern, otherwise `false`.\r\n *\r\n * @example\r\n * const isMatch = regexr.match(pattern)\r\n * console.log(isMatch) // return true or false\r\n */\r\n test({ value, pattern, flags = 'g' }) {\r\n if (!value || !pattern || !isValidRegex(pattern)) {\r\n return false\r\n }\r\n\r\n const regexp = new RegExp(pattern, flags)\r\n return regexp.test(value)\r\n },\r\n\r\n /**\r\n * Matches a given value against a regex pattern and returns the matches.\r\n *\r\n * @param {Object} params - Parameters for matching regex.\r\n * @param {string} params.value - The string to match against the regex.\r\n * @param {string} params.pattern - The regex pattern to match.\r\n * @param {string} [params.flags='g'] - Regex flags (default: 'g').\r\n * @returns {Array<string>|null} Returns an array of matches, or `null` if no match is found.\r\n */\r\n match({ value, pattern, flags = 'g' }) {\r\n if (!value || !pattern || !isValidRegex(pattern)) {\r\n return null\r\n }\r\n\r\n const regexp = new RegExp(pattern, flags)\r\n return value.match(regexp)\r\n },\r\n}\r\n\r\n/**\r\n * Recursively flattens a nested object into a single-level object with prefixed keys.\r\n *\r\n * @param {Object} obj - The object to flatten.\r\n * @param {string} [prefix=''] - The prefix to append to keys for nested properties.\r\n * @returns {Object} A new object with flattened keys.\r\n *\r\n * @example\r\n * const nested = { sm: '640px', md: { base: '768px', xl: '1024px' } };\r\n * const result = flatten(nested);\r\n * console.log(result); // { sm: '640px', md-base: '768px', md-xl: '1024px' }\r\n */\r\nexport const flatten = (obj, prefix = '') => {\r\n try {\r\n if (!obj || typeof obj !== 'object') {\r\n console.error('❌ FLATTEN ERROR: Received invalid data:', obj)\r\n return {}\r\n }\r\n\r\n return Object.keys(obj).reduce((acc, key) => {\r\n const fullKey = key === 'DEFAULT' ? prefix : prefix ? `${prefix}-${key}` : key\r\n\r\n if (typeof obj[key] === 'object' && key !== 'DEFAULT') {\r\n Object.assign(acc, flatten(obj[key], fullKey))\r\n } else if (typeof obj[key] === 'string') {\r\n acc[fullKey] = obj[key]\r\n } else {\r\n console.warn('! Skipping Invalid Key:', key, 'Value:', obj[key])\r\n }\r\n\r\n return acc\r\n }, {})\r\n } catch (error) {\r\n console.error('🚨 Flatten Function Error:', error)\r\n return {} // Prevents Tailwind from crashing\r\n }\r\n}\r\n\r\n/**\r\n * Retrieves a template based on an alias, capitalizing the alias before lookup.\r\n *\r\n * @param {string} alias - The alias to search for in the templates object.\r\n * @param {Object} templates - An object containing templates indexed by alias.\r\n * @returns {*} - The matching template, or the 'Subpage' template if not found.\r\n *\r\n * @example\r\n * const template = getTemplate('name', templates);\r\n *\r\n */\r\nexport function getTemplate(alias, templates) {\r\n const template = templates[capitalize(alias)]\r\n\r\n if (!template) {\r\n return templates.Subpage\r\n }\r\n\r\n return template\r\n}\r\n\r\n/**\r\n * Retrieves a block based on an alias, capitalizing the alias before lookup.\r\n *\r\n * @param {string} alias - The alias to search for in the blocks object.\r\n * @param {Object} blocks - An object containing blocks indexed by alias.\r\n * @returns {*} - The matching template, or the 'Subpage' template if not found.\r\n *\r\n * @example\r\n * const block = getBlock('alias', blocks);\r\n *\r\n */\r\nexport function getBlock(alias, blocks) {\r\n const block = blocks[capitalize(alias)]\r\n\r\n if (!block) {\r\n return null\r\n }\r\n\r\n return block\r\n}\r\n\r\nexport default getBlock\r\n\r\n/**\r\n * Checks if a given value is empty (i.e., '', undefined, or null).\r\n *\r\n * @param {*} value - The value to check.\r\n * @returns {boolean} - Returns `true` if the value is empty, otherwise `false`.\r\n *\r\n * @example\r\n * console.log(isEmpty('')); // true\r\n * console.log(isEmpty(null)); // true\r\n * console.log(isEmpty('hello')); // false\r\n */\r\nexport function isEmpty(value) {\r\n if (value === '' || value === undefined || value === null) {\r\n return true\r\n }\r\n\r\n return false\r\n}\r\n/**\r\n * Compiles a module map, converting a selector-importer pair into a `Map` for efficient lookups.\r\n *\r\n * @function createModuleMap\r\n * @param {Object} moduleMap - The module map where selectors are keys and dynamic imports are values.\r\n * @returns {Map} A Map where selectors are keys and dynamic import functions are values.\r\n *\r\n * @example\r\n * const moduleMap = {\r\n * '.selector': () => import('components/component'),\r\n * '.selector-1, .selector-2, .selector-3': () => import('components/component')\r\n * };\r\n * const compiledMap = createModuleMap(moduleMap);\r\n */\r\nexport function createModuleMap(moduleMap) {\r\n const compiledModuleMap = new Map()\r\n\r\n Object.entries(moduleMap).forEach(([selector, importer]) => {\r\n selector.split(',').forEach((subSelector) => {\r\n compiledModuleMap.set(subSelector.trim(), importer)\r\n })\r\n })\r\n\r\n return compiledModuleMap\r\n}\r\n\r\n/**\r\n * Adds a preload class to the body element after a short delay.\r\n * Also hides the preload animation after another delay.\r\n *\r\n * @function preloadTimeout\r\n *\r\n * @example\r\n * preloadTimeout(); // Adds 'loaded' class after a short delay, hides preload animation after another delay.\r\n */\r\nexport function preloadTimeout() {\r\n console.log('PRELOAD')\r\n const body = document.querySelector('.body')\r\n if (!body) {\r\n return\r\n }\r\n\r\n setTimeout(() => body.classList.add('loaded'), 100)\r\n setTimeout(() => {\r\n body.classList.add('preload--hidden')\r\n body.classList.remove('preload--transitions')\r\n }, 400)\r\n}\r\n\r\n/**\r\n * Lazy loads modules based on a selector in the provided module map using the IntersectionObserver API.\r\n *\r\n * @function lazyModules\r\n * @param {Map} moduleMap - A map of selectors to dynamic import functions.\r\n * @param {Element} [root=document] - The root element to query for selectors (defaults to `document`).\r\n *\r\n * @example\r\n * const moduleMap = new Map([\r\n * ['.selector', () => import('components/component')],\r\n * ['.selector-1, .selector-2, .selector-3', () => import('components/compomnent')],\r\n * ]);\r\n * lazyModules(moduleMap); // Lazy load the components when their selectors are in view.\r\n */\r\n// @ts-ignore\r\nexport function lazyModules(moduleMap, root = document) {\r\n const observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.isIntersecting) {\r\n const target = entry.target\r\n const matchedImporters = Array.from(moduleMap.entries())\r\n .filter(([selector]) => target.matches(selector))\r\n .map(([_, importer]) => importer)\r\n\r\n if (matchedImporters.length > 0) {\r\n Promise.allSettled(matchedImporters.map((importer) => importer()))\r\n .then((results) => {\r\n results.forEach((result) => {\r\n if (result.status === 'fulfilled' && result.value?.default?.init) {\r\n result.value.default.init(target)\r\n }\r\n })\r\n })\r\n .catch(console.error)\r\n }\r\n\r\n observer.unobserve(target)\r\n }\r\n })\r\n })\r\n\r\n moduleMap.forEach((_, selector) => {\r\n root.querySelectorAll(selector).forEach((element) => observer.observe(element))\r\n })\r\n}\r\n\r\n/**\r\n * Initializes core scripts with an optional callback function.\r\n *\r\n * @function initCoreScripts\r\n * @param {Function} callback - The callback function to initialize core scripts.\r\n *\r\n * @example\r\n * initCoreScripts(() => { console.log('Core scripts initialized'); });\r\n */\r\nexport function initCoreScripts(callback = null) {\r\n import(path.resolve(process.cwd(), 'scripts', 'core', 'prefetch.ts')).then((module) => module.default.init())\r\n import(path.resolve(process.cwd(), 'scripts', 'core', 'recaptcha.ts')).then((module) => module.default.init())\r\n\r\n if (callback) {\r\n callback()\r\n }\r\n}\r\n\r\n/**\r\n * Handles the `DOMContentLoaded` event to initialize core scripts and lazy load modules.\r\n *\r\n * @function onDomReady\r\n * @param {Map} moduleMap - The compiled module map for lazy loading.\r\n * @param {Function} initCoreScriptsCallback - The callback function to initialize core scripts.\r\n * @param {Function} [callback] - An optional callback to execute during `DOMContentLoaded` event handling.\r\n *\r\n * @example\r\n * onDomReady(moduleMap, () => { console.log('Core scripts initialized'); }, () => { console.log('DOM content loaded'); });\r\n */\r\nexport function onDomReady(moduleMap, initCoreScriptsCallback, callback = null) {\r\n document.addEventListener('DOMContentLoaded', (e) => {\r\n preloadTimeout()\r\n initCoreScripts(initCoreScriptsCallback)\r\n lazyModules(moduleMap)\r\n\r\n if (callback) {\r\n callback(e)\r\n }\r\n })\r\n}\r\n\r\n/**\r\n * Handles the `popstate` event to initialize core scripts and lazy load modules.\r\n *\r\n * @function onPopstate\r\n * @param {Map} moduleMap - The compiled module map for lazy loading.\r\n * @param {Function} initCoreScriptsCallback - The callback function to initialize core scripts.\r\n * @param {Function} [callback] - An optional callback to execute during `popstate` event handling.\r\n *\r\n * @example\r\n * onPopstate(moduleMap, () => { console.log('Core scripts initialized'); }, () => { console.log('Popstate event triggered'); });\r\n */\r\nexport function onPopstate(moduleMap, initCoreScriptsCallback, callback = null) {\r\n window.addEventListener('popstate', (e) => {\r\n setTimeout(() => {\r\n initCoreScripts(initCoreScriptsCallback)\r\n lazyModules(moduleMap)\r\n\r\n if (callback) {\r\n callback(e)\r\n }\r\n }, 0)\r\n })\r\n}\r\n\r\n/**\r\n * Handles the \"pageshow\" event to initialize core scripts and lazy load modules.\r\n *\r\n * This function listens for the \"pageshow\" eventβ€”which fires when a page is loaded from the bfcache\r\n * or initially loaded. After a short delay, it calls the provided core scripts initialization callback\r\n * and lazy loads modules using the supplied module map. An optional callback is executed with the event object.\r\n *\r\n * @function onPageShow\r\n * @param {Map} moduleMap - The compiled module map for lazy loading.\r\n * @param {Function} initCoreScriptsCallback - The callback function used to initialize core scripts.\r\n * @param {Function} [callback] - An optional callback to execute during event handling.\r\n *\r\n * @example\r\n * onPageShow(moduleMap, () => { console.log('Core scripts initialized'); }, (e) => {\r\n * console.log('Pageshow event triggered', e);\r\n * });\r\n */\r\nexport function onPageShow(moduleMap, initCoreScriptsCallback, callback = null) {\r\n window.addEventListener('pageshow', (e) => {\r\n setTimeout(() => {\r\n initCoreScripts(initCoreScriptsCallback)\r\n lazyModules(moduleMap)\r\n\r\n if (callback) {\r\n callback(e)\r\n }\r\n }, 0)\r\n })\r\n}\r\n\r\n/**\r\n * Handles the `htmx:beforeSwap` event to perform actions before HTMX swaps.\r\n *\r\n * @function onHtmxBeforeSwap\r\n * @param {Function} callback - The callback function to execute during `htmx:beforeSwap` event handling.\r\n *\r\n * @example\r\n * onHtmxBeforeSwap((e) => { console.log('HTMX before swap:', e); });\r\n */\r\nexport function onHtmxBeforeSwap(callback = null) {\r\n document.body.addEventListener('htmx:beforeSwap', (e) => {\r\n document.querySelectorAll('.button--loading')?.forEach((btn) => btn.classList.remove('button--loading'))\r\n\r\n if (callback) {\r\n callback(e)\r\n }\r\n\r\n setTimeout(() => window.scrollTo({ top: 0, behavior: 'smooth' }), 100)\r\n })\r\n}\r\n\r\n/**\r\n * Handles the `htmx:afterSwap` event to initialize core scripts and lazy load modules.\r\n *\r\n * @function onHtmxAfterSwap\r\n * @param {Map} moduleMap - The compiled module map for lazy loading.\r\n * @param {Function} [callback] - An optional callback to execute during `htmx:afterSwap` event handling.\r\n *\r\n * @example\r\n * onHtmxAfterSwap(moduleMap, () => { console.log('HTMX after swap completed'); });\r\n */\r\nexport function onHtmxAfterSwap(moduleMap, callback = null) {\r\n document.body.addEventListener('htmx:afterSwap', (e) => {\r\n // TODO: is initCoreScripts needed here?\r\n // initCoreScripts()\r\n lazyModules(moduleMap)\r\n\r\n if (callback) {\r\n callback(e)\r\n }\r\n })\r\n}\r\n\r\n/**\r\n * Handles the `htmx:afterSettle` event to initialize core scripts and lazy load modules.\r\n *\r\n * @function onHtmxAfterSettle\r\n * @param {Map} moduleMap - The compiled module map for lazy loading.\r\n * @param {Function} initCoreScriptsCallback - The callback function to initialize core scripts.\r\n * @param {Function} [callback] - An optional callback to execute during `htmx:afterSettle` event handling.\r\n *\r\n * @example\r\n * onHtmxAfterSettle(moduleMap, () => { console.log('Core scripts initialized'); }, () => { console.log('HTMX settle completed'); });\r\n */\r\nexport function onHtmxAfterSettle(moduleMap, initCoreScriptsCallback, callback = null) {\r\n document.body.addEventListener('htmx:afterSettle', (e) => {\r\n initCoreScripts(initCoreScriptsCallback)\r\n lazyModules(moduleMap)\r\n\r\n if (callback) {\r\n callback(e)\r\n }\r\n })\r\n}\r\n\r\n// /**\r\n// * Handles the `htmx:responseErrnr` event to display error messages based on the HTTP status code.\r\n// *\r\n// * @function onHtmxResponseError\r\n// * @param {Function} [callback] - An optional callback function to execute during handling of the error.\r\n// * @ignore\r\n// * @example\r\n// * onHtmxResponseError(toaster, (e) => {\r\n// * console.log('Custom error handling:', e);\r\n// * });\r\n// */\r\n// export function onHtmxResponseError(callback) {\r\n// if (!toaster) {\r\n// console.error('[@vettvangur/vanilla | onHtmxResponseError | No toaster provided.')\r\n// return\r\n// }\r\n\r\n// document.addEventListener('htmx:responseError', (e) => {\r\n// e.stopImmediatePropagation()\r\n// // @ts-ignore\r\n// const statusCode = e?.detail?.xhr?.status\r\n\r\n// if (statusCode === 404) {\r\n// toaster.error('Page not found (404)')\r\n// } else if (statusCode === 500) {\r\n// toaster.error('Server error (500)')\r\n// } else {\r\n// toaster.error(`HTMX error with status code: ${statusCode}`)\r\n// }\r\n\r\n// e.stopPropagation()\r\n\r\n// if (callback) {\r\n// callback(e)\r\n// }\r\n// })\r\n// }\r\n\r\n/**\r\n * Handles click outside and ESC key events to trigger a callback and close open elements with the `open` class.\r\n *\r\n * @function clickOutside\r\n * @param {Function} callback - The callback function to be executed when a click outside or ESC key event occurs.\r\n * @description\r\n * This function listens for `click` events and `keyup` events:\r\n * - When a click outside of `.co-trigger` is detected, the provided callback is executed.\r\n * - When the `ESC` key is pressed, the provided callback is executed, and any open elements (with the `open` class) are closed.\r\n *\r\n * @example\r\n * ClickOutside(() => {\r\n * console.log('Click outside or ESC pressed!');\r\n * });\r\n */\r\nexport function clickOutside(callback) {\r\n // Clicks\r\n document.addEventListener(\r\n 'click',\r\n (e) => {\r\n const target = e.target\r\n const classTargets = document.querySelectorAll('.co-el')\r\n\r\n // Check if the click target is inside an element with class `.co-trigger`\r\n // @ts-ignore\r\n if (target.closest('.co-trigger')) {\r\n return\r\n }\r\n\r\n // Execute the callback function\r\n callback(e)\r\n\r\n // Close open elements\r\n Array.prototype.forEach.call(classTargets, (item) => {\r\n if (item.classList.contains('open')) {\r\n item.classList.remove('open')\r\n }\r\n })\r\n },\r\n false\r\n )\r\n\r\n // ESC key\r\n document.addEventListener('keyup', (e) => {\r\n const openElements = document.querySelectorAll('.open')\r\n const keys = e.keyCode || e.which\r\n\r\n // If ESC key (key code 27) is pressed\r\n if (keys === 27) {\r\n // Execute the callback function\r\n callback(e)\r\n\r\n // Close open elements\r\n Array.prototype.forEach.call(openElements, (item) => {\r\n if (item.classList.contains('open')) {\r\n item.classList.remove('open')\r\n }\r\n })\r\n }\r\n })\r\n}\r\n\r\n/**\r\n * Enumeration of fetch types for Umbraco content.\r\n * These types are used to determine the fetch behavior for content.\r\n *\r\n * @readonly\r\n * @enum {string}\r\n */\r\nexport const Umbraco = Object.freeze({\r\n NODE: 'node',\r\n CHILDREN: 'children',\r\n DESCENDANTS: 'descendants',\r\n ANCESTORS: 'ancestors',\r\n EXTRA: 'extra',\r\n})\r\n\r\n/**\r\n * Constructs the URL for fetching Umbraco content.\r\n *\r\n * @ignore\r\n * @function getUmbracoFetchUrl\r\n * @param {string} route - The base route or content identifier.\r\n * @param {string} fetchType - The type of fetch (e.g., NODE, CHILDREN, DESCENDANTS, ANCESTORS, EXTRA).\r\n * @param {Object} [options] - Additional options for the fetch.\r\n * @param {number} [options.skip=0] - Number of items to skip (pagination).\r\n * @param {number} [options.take=9999] - Number of items to take (pagination).\r\n * @param {string} [options.fields='properties[$all]'] - Fields to fetch from the API.\r\n * @returns {string} The constructed URL for fetching Umbraco content.\r\n * @throws Will throw an error if an unsupported fetch type is provided.\r\n */\r\nfunction getUmbracoFetchUrl(route, fetchType, options = {}) {\r\n loadEnvFiles()\r\n const params = {\r\n skip: options.skip || 0,\r\n take: options.take || 9999,\r\n fields: options.fields || 'properties[$all]',\r\n }\r\n\r\n const baseUrl = process.env.DELIVERYAPI\r\n const singular = `${route}?field=${params.fields}`\r\n const multiple = `${route}&skip=${params.skip}&take=${params.take}&fields=${params.fields}`\r\n\r\n switch (fetchType) {\r\n case Umbraco.NODE:\r\n return `${baseUrl}/content/item/${singular}`\r\n case Umbraco.CHILDREN:\r\n return `${baseUrl}/?fetch=children:${multiple}`\r\n case Umbraco.DESCENDANTS:\r\n return `${baseUrl}/?fetch=descendants:${multiple}`\r\n case Umbraco.ANCESTORS:\r\n return `${baseUrl}/?fetch=ancestors:${multiple}`\r\n case Umbraco.EXTRA:\r\n return `${baseUrl}/extra`\r\n default:\r\n throw new Error(\r\n `Unsupported fetch type: ${fetchType}. Available types: NODE, CHILDREN, DESCENDANTS, ANCESTORS, EXTRA`\r\n )\r\n }\r\n}\r\n\r\n/**\r\n * Fetches Umbraco content based on the specified route, fetch type, and options.\r\n *\r\n * @async\r\n * @function getUmbracoData\r\n * @param {Object} params - Parameters for fetching Umbraco content.\r\n * @param {string} params.route - The base route or content identifier.\r\n * @param {string} [params.fetchType=Umbraco.NODE] - The type of fetch (e.g., NODE, CHILDREN, DESCENDANTS, ANCESTORS).\r\n * @param {Object} [params.options={}] - Additional options for the fetch, such as pagination and fields.\r\n * @param {number} [params.options.skip=0] - Number of items to skip (pagination).\r\n * @param {number} [params.options.take=9999] - Number of items to take (pagination).\r\n * @param {string} [params.options.fields='properties[$all]'] - Fields to fetch from the API.\r\n * @param {RequestInit|null} [params.fetchOptions={}] - Fetch API options (headers, method, body, etc.).\r\n * @returns {Promise<Object|null>} The fetched Umbraco content or null if an error occurs.\r\n * @throws Will throw an error if an invalid fetch type is provided or the fetch fails.\r\n */\r\nexport async function getUmbracoData({ route, fetchType = Umbraco.NODE, options = {}, fetchOptions = {} }) {\r\n /** @type {string[]} */\r\n const validFetchTypes = Object.values(Umbraco)\r\n\r\n if (!validFetchTypes.includes(fetchType)) {\r\n throw new Error(`Invalid fetch type: ${fetchType}`)\r\n }\r\n\r\n const umbracofetchUrl = getUmbracoFetchUrl(route, fetchType, options)\r\n\r\n return await fetcher({ url: umbracofetchUrl, options: fetchOptions })\r\n}\r\n\r\n/**\r\n * Retrieves a translation string from a translations object by key.\r\n *\r\n * @function getTranslation\r\n * @param {string} key - The translation key to look up.\r\n * @param {Object.<string, string>} translations - An object containing translation key-value pairs.\r\n * @returns {string|undefined} The matchin:whetherg translation string, or `undefined` if not found.\r\n * @throws Logs an error to the console if the key does not exist in the translations object.\r\n */\r\nexport function getTranslation(key, translations) {\r\n const translation = translations[key]\r\n\r\n if (!translation) {\r\n console.error(`[vettvangur-vanilla :: getTranslation] No translation for key ${key} found.`)\r\n return\r\n }\r\n\r\n return translation\r\n}\r\n\r\n/**\r\n * Extracts the two-letter culture code from the beginning of the given path.\r\n *\r\n * @param {string|undefined} path - The URL path to extract the culture code from (e.g., \"/en/hello/world\").\r\n * @returns {string|null} The two-letter culture code (e.g., \"en\"), or null if not found.\r\n */\r\nexport function getCulture(path) {\r\n const match = path.match(/^\\/([a-z]{2})(\\/|$)/i)\r\n return match ? match[1].toLowerCase() : null\r\n}\r\n"],"names":["fs","require$$0","path","require$$1","os","require$$2","crypto","require$$3","version","require$$4","LINE","_debug","message","console","log","_dotenvKey","options","DOTENV_KEY","length","process","env","_instructions","result","dotenvKey","uri","URL","error","code","err","Error","key","password","environment","searchParams","get","environmentKey","toUpperCase","ciphertext","parsed","_vaultPath","possibleVaultPath","Array","isArray","filepath","existsSync","endsWith","resolve","cwd","_resolveHome","envPath","join","homedir","slice","DotenvModule","configDotenv","dotenvPath","encoding","debug","Boolean","lastError","optionPaths","push","parsedAll","parse","readFileSync","populate","e","processEnv","_configVault","_parseVault","vaultPath","keys","split","decrypted","i","attrs","trim","decrypt","config","encrypted","keyStr","Buffer","from","nonce","subarray","authTag","aesgcm","createDecipheriv","setAuthTag","update","final","isRange","RangeError","invalidKeyLength","decryptionFailed","src","obj","match","lines","toString","replace","exec","value","maybeQuote","override","Object","prototype","hasOwnProperty","call","mainModule","exports","capitalize","lowerRest","toLowerCase","dictionary","data","culture","notFound","item","itemKey","_item$values$find","values","find","b","language","async","fetcher","url","throwOnError","errorMessage","request","fetch","ok","errorDetails","text","fullErrorMessage","status","statusText","json","loadEnvFiles","showMessage","envFilePath","baseResult","dotenv","warn","envFile","NODE_ENV","isValidRegex","pattern","RegExp","_unused","regexr","test","flags","regexp","flatten","prefix","reduce","acc","fullKey","assign","getTemplate","alias","templates","template","Subpage","getBlock","blocks","block","isEmpty","createModuleMap","moduleMap","compiledModuleMap","Map","entries","forEach","selector","importer","subSelector","set","preloadTimeout","body","document","querySelector","setTimeout","classList","add","remove","lazyModules","root","observer","IntersectionObserver","entry","isIntersecting","target","matchedImporters","filter","matches","map","_","Promise","allSettled","then","results","_result$value","default","init","catch","unobserve","querySelectorAll","element","observe","initCoreScripts","callback","import","module","onDomReady","initCoreScriptsCallback","addEventListener","onPopstate","window","onPageShow","onHtmxBeforeSwap","_document$querySelect","btn","scrollTo","top","behavior","onHtmxAfterSwap","onHtmxAfterSettle","clickOutside","classTargets","closest","contains","openElements","keyCode","which","Umbraco","freeze","NODE","CHILDREN","DESCENDANTS","ANCESTORS","EXTRA","getUmbracoData","route","fetchType","fetchOptions","includes","umbracofetchUrl","params","skip","take","fields","baseUrl","DELIVERYAPI","singular","multiple","getUmbracoFetchUrl","getTranslation","translations","translation","getCulture"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"index.esm.js","sources":["../../../../node_modules/.pnpm/dotenv@16.4.5/node_modules/dotenv/lib/main.js","../index.mjs"],"sourcesContent":["const fs = require('fs')\nconst path = require('path')\nconst os = require('os')\nconst crypto = require('crypto')\nconst packageJson = require('../package.json')\n\nconst version = packageJson.version\n\nconst LINE = /(?:^|^)\\s*(?:export\\s+)?([\\w.-]+)(?:\\s*=\\s*?|:\\s+?)(\\s*'(?:\\\\'|[^'])*'|\\s*\"(?:\\\\\"|[^\"])*\"|\\s*`(?:\\\\`|[^`])*`|[^#\\r\\n]+)?\\s*(?:#.*)?(?:$|$)/mg\n\n// Parse src into an Object\nfunction parse (src) {\n const obj = {}\n\n // Convert buffer to string\n let lines = src.toString()\n\n // Convert line breaks to same format\n lines = lines.replace(/\\r\\n?/mg, '\\n')\n\n let match\n while ((match = LINE.exec(lines)) != null) {\n const key = match[1]\n\n // Default undefined or null to empty string\n let value = (match[2] || '')\n\n // Remove whitespace\n value = value.trim()\n\n // Check if double quoted\n const maybeQuote = value[0]\n\n // Remove surrounding quotes\n value = value.replace(/^(['\"`])([\\s\\S]*)\\1$/mg, '$2')\n\n // Expand newlines if double quoted\n if (maybeQuote === '\"') {\n value = value.replace(/\\\\n/g, '\\n')\n value = value.replace(/\\\\r/g, '\\r')\n }\n\n // Add to object\n obj[key] = value\n }\n\n return obj\n}\n\nfunction _parseVault (options) {\n const vaultPath = _vaultPath(options)\n\n // Parse .env.vault\n const result = DotenvModule.configDotenv({ path: vaultPath })\n if (!result.parsed) {\n const err = new Error(`MISSING_DATA: Cannot parse ${vaultPath} for an unknown reason`)\n err.code = 'MISSING_DATA'\n throw err\n }\n\n // handle scenario for comma separated keys - for use with key rotation\n // example: DOTENV_KEY=\"dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=prod,dotenv://:key_7890@dotenvx.com/vault/.env.vault?environment=prod\"\n const keys = _dotenvKey(options).split(',')\n const length = keys.length\n\n let decrypted\n for (let i = 0; i < length; i++) {\n try {\n // Get full key\n const key = keys[i].trim()\n\n // Get instructions for decrypt\n const attrs = _instructions(result, key)\n\n // Decrypt\n decrypted = DotenvModule.decrypt(attrs.ciphertext, attrs.key)\n\n break\n } catch (error) {\n // last key\n if (i + 1 >= length) {\n throw error\n }\n // try next key\n }\n }\n\n // Parse decrypted .env string\n return DotenvModule.parse(decrypted)\n}\n\nfunction _log (message) {\n console.log(`[dotenv@${version}][INFO] ${message}`)\n}\n\nfunction _warn (message) {\n console.log(`[dotenv@${version}][WARN] ${message}`)\n}\n\nfunction _debug (message) {\n console.log(`[dotenv@${version}][DEBUG] ${message}`)\n}\n\nfunction _dotenvKey (options) {\n // prioritize developer directly setting options.DOTENV_KEY\n if (options && options.DOTENV_KEY && options.DOTENV_KEY.length > 0) {\n return options.DOTENV_KEY\n }\n\n // secondary infra already contains a DOTENV_KEY environment variable\n if (process.env.DOTENV_KEY && process.env.DOTENV_KEY.length > 0) {\n return process.env.DOTENV_KEY\n }\n\n // fallback to empty string\n return ''\n}\n\nfunction _instructions (result, dotenvKey) {\n // Parse DOTENV_KEY. Format is a URI\n let uri\n try {\n uri = new URL(dotenvKey)\n } catch (error) {\n if (error.code === 'ERR_INVALID_URL') {\n const err = new Error('INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n throw error\n }\n\n // Get decrypt key\n const key = uri.password\n if (!key) {\n const err = new Error('INVALID_DOTENV_KEY: Missing key part')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n // Get environment\n const environment = uri.searchParams.get('environment')\n if (!environment) {\n const err = new Error('INVALID_DOTENV_KEY: Missing environment part')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n // Get ciphertext payload\n const environmentKey = `DOTENV_VAULT_${environment.toUpperCase()}`\n const ciphertext = result.parsed[environmentKey] // DOTENV_VAULT_PRODUCTION\n if (!ciphertext) {\n const err = new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${environmentKey} in your .env.vault file.`)\n err.code = 'NOT_FOUND_DOTENV_ENVIRONMENT'\n throw err\n }\n\n return { ciphertext, key }\n}\n\nfunction _vaultPath (options) {\n let possibleVaultPath = null\n\n if (options && options.path && options.path.length > 0) {\n if (Array.isArray(options.path)) {\n for (const filepath of options.path) {\n if (fs.existsSync(filepath)) {\n possibleVaultPath = filepath.endsWith('.vault') ? filepath : `${filepath}.vault`\n }\n }\n } else {\n possibleVaultPath = options.path.endsWith('.vault') ? options.path : `${options.path}.vault`\n }\n } else {\n possibleVaultPath = path.resolve(process.cwd(), '.env.vault')\n }\n\n if (fs.existsSync(possibleVaultPath)) {\n return possibleVaultPath\n }\n\n return null\n}\n\nfunction _resolveHome (envPath) {\n return envPath[0] === '~' ? path.join(os.homedir(), envPath.slice(1)) : envPath\n}\n\nfunction _configVault (options) {\n _log('Loading env from encrypted .env.vault')\n\n const parsed = DotenvModule._parseVault(options)\n\n let processEnv = process.env\n if (options && options.processEnv != null) {\n processEnv = options.processEnv\n }\n\n DotenvModule.populate(processEnv, parsed, options)\n\n return { parsed }\n}\n\nfunction configDotenv (options) {\n const dotenvPath = path.resolve(process.cwd(), '.env')\n let encoding = 'utf8'\n const debug = Boolean(options && options.debug)\n\n if (options && options.encoding) {\n encoding = options.encoding\n } else {\n if (debug) {\n _debug('No encoding is specified. UTF-8 is used by default')\n }\n }\n\n let optionPaths = [dotenvPath] // default, look for .env\n if (options && options.path) {\n if (!Array.isArray(options.path)) {\n optionPaths = [_resolveHome(options.path)]\n } else {\n optionPaths = [] // reset default\n for (const filepath of options.path) {\n optionPaths.push(_resolveHome(filepath))\n }\n }\n }\n\n // Build the parsed data in a temporary object (because we need to return it). Once we have the final\n // parsed data, we will combine it with process.env (or options.processEnv if provided).\n let lastError\n const parsedAll = {}\n for (const path of optionPaths) {\n try {\n // Specifying an encoding returns a string instead of a buffer\n const parsed = DotenvModule.parse(fs.readFileSync(path, { encoding }))\n\n DotenvModule.populate(parsedAll, parsed, options)\n } catch (e) {\n if (debug) {\n _debug(`Failed to load ${path} ${e.message}`)\n }\n lastError = e\n }\n }\n\n let processEnv = process.env\n if (options && options.processEnv != null) {\n processEnv = options.processEnv\n }\n\n DotenvModule.populate(processEnv, parsedAll, options)\n\n if (lastError) {\n return { parsed: parsedAll, error: lastError }\n } else {\n return { parsed: parsedAll }\n }\n}\n\n// Populates process.env from .env file\nfunction config (options) {\n // fallback to original dotenv if DOTENV_KEY is not set\n if (_dotenvKey(options).length === 0) {\n return DotenvModule.configDotenv(options)\n }\n\n const vaultPath = _vaultPath(options)\n\n // dotenvKey exists but .env.vault file does not exist\n if (!vaultPath) {\n _warn(`You set DOTENV_KEY but you are missing a .env.vault file at ${vaultPath}. Did you forget to build it?`)\n\n return DotenvModule.configDotenv(options)\n }\n\n return DotenvModule._configVault(options)\n}\n\nfunction decrypt (encrypted, keyStr) {\n const key = Buffer.from(keyStr.slice(-64), 'hex')\n let ciphertext = Buffer.from(encrypted, 'base64')\n\n const nonce = ciphertext.subarray(0, 12)\n const authTag = ciphertext.subarray(-16)\n ciphertext = ciphertext.subarray(12, -16)\n\n try {\n const aesgcm = crypto.createDecipheriv('aes-256-gcm', key, nonce)\n aesgcm.setAuthTag(authTag)\n return `${aesgcm.update(ciphertext)}${aesgcm.final()}`\n } catch (error) {\n const isRange = error instanceof RangeError\n const invalidKeyLength = error.message === 'Invalid key length'\n const decryptionFailed = error.message === 'Unsupported state or unable to authenticate data'\n\n if (isRange || invalidKeyLength) {\n const err = new Error('INVALID_DOTENV_KEY: It must be 64 characters long (or more)')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n } else if (decryptionFailed) {\n const err = new Error('DECRYPTION_FAILED: Please check your DOTENV_KEY')\n err.code = 'DECRYPTION_FAILED'\n throw err\n } else {\n throw error\n }\n }\n}\n\n// Populate process.env with parsed values\nfunction populate (processEnv, parsed, options = {}) {\n const debug = Boolean(options && options.debug)\n const override = Boolean(options && options.override)\n\n if (typeof parsed !== 'object') {\n const err = new Error('OBJECT_REQUIRED: Please check the processEnv argument being passed to populate')\n err.code = 'OBJECT_REQUIRED'\n throw err\n }\n\n // Set process.env\n for (const key of Object.keys(parsed)) {\n if (Object.prototype.hasOwnProperty.call(processEnv, key)) {\n if (override === true) {\n processEnv[key] = parsed[key]\n }\n\n if (debug) {\n if (override === true) {\n _debug(`\"${key}\" is already defined and WAS overwritten`)\n } else {\n _debug(`\"${key}\" is already defined and was NOT overwritten`)\n }\n }\n } else {\n processEnv[key] = parsed[key]\n }\n }\n}\n\nconst DotenvModule = {\n configDotenv,\n _configVault,\n _parseVault,\n config,\n decrypt,\n parse,\n populate\n}\n\nmodule.exports.configDotenv = DotenvModule.configDotenv\nmodule.exports._configVault = DotenvModule._configVault\nmodule.exports._parseVault = DotenvModule._parseVault\nmodule.exports.config = DotenvModule.config\nmodule.exports.decrypt = DotenvModule.decrypt\nmodule.exports.parse = DotenvModule.parse\nmodule.exports.populate = DotenvModule.populate\n\nmodule.exports = DotenvModule\n","/**\r\n * @memberof @vettvangur/react\r\n */\r\n\r\nimport path from 'node:path'\r\nimport process from 'node:process'\r\nimport dotenv from 'dotenv'\r\n\r\n/**\r\n * Capitalizes the first letter of a given string.\r\n *\r\n * @function capitalize\r\n * @param {string|null|undefined} value - The string to capitalize. If null or undefined, returns an empty string.\r\n * @param {boolean} [lowerRest=false] - If true, converts the rest of the string to lowercase.\r\n * @returns {string} The capitalized string, or an empty string if the input is falsy.\r\n *\r\n * @example capitalize(string)\r\n */\r\nexport function capitalize(value, lowerRest = false) {\r\n if (!value) {\r\n return ''\r\n }\r\n\r\n const firstChar = value[0].toUpperCase()\r\n const rest = lowerRest ? value.slice(1).toLowerCase() : value.slice(1)\r\n\r\n return firstChar + rest\r\n}\r\n\r\n/**\r\n * Retrieves a translated string from a dictionary based on a given key and culture.\r\n *\r\n * @function dictionary\r\n * @param {string} key - The key for the translation.\r\n * @param {Array} data - The array of translation objects.\r\n * @param {string} [culture='is-IS'] - The language code to search for (default: 'is-IS').\r\n * @returns {string} The translated string if found, otherwise '[Translation not found]'.\r\n *\r\n * @example\r\n * dictionary(key)\r\n */\r\nexport function dictionary(key, data, culture = 'is-IS') {\r\n const notFound = '[Translation not found]'\r\n\r\n for (const item of data) {\r\n if (item.itemKey === key) {\r\n const translation = item.values.find((b) => b.language === culture)?.value\r\n return translation || notFound\r\n }\r\n }\r\n\r\n return notFound\r\n}\r\n\r\n/**\r\n * Fetches data from a given URL with customizable options and error handling.\r\n *\r\n * @async\r\n * @function fetcher\r\n * @param {Object} params - The parameters for the fetcher function.\r\n * @param {string} params.url - The URL to fetch data from.\r\n * @param {RequestInit|null} [params.options={}] - Fetch API options (headers, method, body, etc.).\r\n * @param {boolean} [params.throwOnError=false] - Whether to throw an error on non-OK HTTP responses.\r\n * @returns {Promise<Object|null>} The parsed JSON response or null if an error occurs.\r\n * @throws Will throw an error if `throwOnError` is true and the fetch fails or returns a non-OK status.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API\r\n *\r\n * @example\r\n * const getData = await fetcher({\r\n * url,\r\n * {\r\n * method: 'POST',\r\n * headers: {\r\n * 'Content-Type': 'application/json'\r\n * }\r\n * }\r\n * })\r\n */\r\n\r\nexport async function fetcher({ url, options = null, throwOnError = false }) {\r\n const errorMessage = `[@vettvangur/vanilla :: fetcher] Error: ${url}`\r\n\r\n try {\r\n const request = await fetch(url, options)\r\n\r\n if (!request.ok) {\r\n const errorDetails = await request.text()\r\n const fullErrorMessage = `${errorMessage} - Status: ${request.status}, ${request.statusText}, Details: ${errorDetails}`\r\n console.error(fullErrorMessage)\r\n\r\n if (throwOnError) {\r\n throw new Error(fullErrorMessage)\r\n }\r\n\r\n // Return null instead of undefined on error for predictable handling\r\n return null\r\n }\r\n\r\n return await request.json()\r\n } catch (error) {\r\n const fullErrorMessage = `${errorMessage} - ${error}`\r\n console.error(fullErrorMessage)\r\n\r\n if (throwOnError) {\r\n throw error\r\n }\r\n\r\n // Return null instead of undefined on error for predictable handling\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Loads environment variables from `.env` and `.env.[NODE_ENV]` files.\r\n *\r\n * This function first loads the base `.env` file, then loads an environment-specific file\r\n * based on `NODE_ENV` (e.g., `.env.production`, `.env.development`). If `NODE_ENV` is not set,\r\n * it defaults to `'development'`.\r\n *\r\n * @async\r\n * @function loadEnvFiles\r\n * @param {boolean} [showMessage=true] - Whether to log a message indicating which env file was loaded.\r\n * @throws {Error} Throws an error if loading the environment-specific file fails.\r\n * @returns {Promise<void>} Resolves when environment files are loaded.\r\n */\r\nexport async function loadEnvFiles(showMessage = true) {\r\n // Always load the .env file first\r\n const envFilePath = path.resolve(process.cwd(), '.env')\r\n const baseResult = dotenv.config({ path: envFilePath })\r\n\r\n if (baseResult.error) {\r\n console.warn(`Warning: Failed to load environment variables from .env: ${baseResult.error.message}`)\r\n }\r\n\r\n const env = process.env.NODE_ENV || 'development' // Default to 'development' if NODE_ENV is not set\r\n const envFile = `.env.${env}`\r\n\r\n // Load the specified environment file\r\n const result = dotenv.config({ path: path.resolve(process.cwd(), envFile) })\r\n\r\n if (result.error) {\r\n throw new Error(`Failed to load environment variables from ${envFile}: ${result.error.message}`)\r\n }\r\n\r\n if (showMessage) {\r\n console.log(`Loaded environment variables from ${envFile}\\n`)\r\n }\r\n}\r\n\r\n/**\r\n * Checks if a given string is a valid regular expression pattern.\r\n *\r\n * @ignore\r\n * @param {string} pattern - The regex pattern to validate.\r\n * @returns {boolean} Returns `true` if the pattern is a valid regex, otherwise `false`.\r\n */\r\nfunction isValidRegex(pattern) {\r\n try {\r\n new RegExp(pattern)\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\n/**\r\n * Utility object for regex operations.\r\n */\r\nexport const regexr = {\r\n /**\r\n * Tests whether a given value matches a regex pattern.\r\n *\r\n * @param {Object} params - Parameters for testing regex.\r\n * @param {string} params.value - The string to test against the regex.\r\n * @param {string} params.pattern - The regex pattern to match.\r\n * @param {string} [params.flags='g'] - Regex flags (default: 'g').\r\n * @returns {boolean} Returns `true` if the value matches the pattern, otherwise `false`.\r\n *\r\n * @example\r\n * const isMatch = regexr.match(pattern)\r\n * console.log(isMatch) // return true or false\r\n */\r\n test({ value, pattern, flags = 'g' }) {\r\n if (!value || !pattern || !isValidRegex(pattern)) {\r\n return false\r\n }\r\n\r\n const regexp = new RegExp(pattern, flags)\r\n return regexp.test(value)\r\n },\r\n\r\n /**\r\n * Matches a given value against a regex pattern and returns the matches.\r\n *\r\n * @param {Object} params - Parameters for matching regex.\r\n * @param {string} params.value - The string to match against the regex.\r\n * @param {string} params.pattern - The regex pattern to match.\r\n * @param {string} [params.flags='g'] - Regex flags (default: 'g').\r\n * @returns {Array<string>|null} Returns an array of matches, or `null` if no match is found.\r\n */\r\n match({ value, pattern, flags = 'g' }) {\r\n if (!value || !pattern || !isValidRegex(pattern)) {\r\n return null\r\n }\r\n\r\n const regexp = new RegExp(pattern, flags)\r\n return value.match(regexp)\r\n },\r\n}\r\n\r\n/**\r\n * Recursively flattens a nested object into a single-level object with prefixed keys.\r\n *\r\n * @param {Object} obj - The object to flatten.\r\n * @param {string} [prefix=''] - The prefix to append to keys for nested properties.\r\n * @returns {Object} A new object with flattened keys.\r\n *\r\n * @example\r\n * const nested = { sm: '640px', md: { base: '768px', xl: '1024px' } };\r\n * const result = flatten(nested);\r\n * console.log(result); // { sm: '640px', md-base: '768px', md-xl: '1024px' }\r\n */\r\nexport const flatten = (obj, prefix = '') => {\r\n try {\r\n if (!obj || typeof obj !== 'object') {\r\n console.error('❌ FLATTEN ERROR: Received invalid data:', obj)\r\n return {}\r\n }\r\n\r\n return Object.keys(obj).reduce((acc, key) => {\r\n const fullKey = key === 'DEFAULT' ? prefix : prefix ? `${prefix}-${key}` : key\r\n\r\n if (typeof obj[key] === 'object' && key !== 'DEFAULT') {\r\n Object.assign(acc, flatten(obj[key], fullKey))\r\n } else if (typeof obj[key] === 'string') {\r\n acc[fullKey] = obj[key]\r\n } else {\r\n console.warn('! Skipping Invalid Key:', key, 'Value:', obj[key])\r\n }\r\n\r\n return acc\r\n }, {})\r\n } catch (error) {\r\n console.error('🚨 Flatten Function Error:', error)\r\n return {} // Prevents Tailwind from crashing\r\n }\r\n}\r\n\r\n/**\r\n * Retrieves a template based on an alias, capitalizing the alias before lookup.\r\n *\r\n * @param {string} alias - The alias to search for in the templates object.\r\n * @param {Object} templates - An object containing templates indexed by alias.\r\n * @returns {*} - The matching template, or the 'Subpage' template if not found.\r\n *\r\n * @example\r\n * const template = getTemplate('name', templates);\r\n *\r\n */\r\nexport function getTemplate(alias, templates) {\r\n const template = templates[capitalize(alias)]\r\n\r\n if (!template) {\r\n return templates.Subpage\r\n }\r\n\r\n return template\r\n}\r\n\r\n/**\r\n * Retrieves a block based on an alias, capitalizing the alias before lookup.\r\n *\r\n * @param {string} alias - The alias to search for in the blocks object.\r\n * @param {Object} blocks - An object containing blocks indexed by alias.\r\n * @returns {*} - The matching template, or the 'Subpage' template if not found.\r\n *\r\n * @example\r\n * const block = getBlock('alias', blocks);\r\n *\r\n */\r\nexport function getBlock(alias, blocks) {\r\n const block = blocks[capitalize(alias)]\r\n\r\n if (!block) {\r\n return null\r\n }\r\n\r\n return block\r\n}\r\n\r\nexport default getBlock\r\n\r\n/**\r\n * Checks if a given value is empty (i.e., '', undefined, or null).\r\n *\r\n * @param {*} value - The value to check.\r\n * @returns {boolean} - Returns `true` if the value is empty, otherwise `false`.\r\n *\r\n * @example\r\n * console.log(isEmpty('')); // true\r\n * console.log(isEmpty(null)); // true\r\n * console.log(isEmpty('hello')); // false\r\n */\r\nexport function isEmpty(value) {\r\n if (value === '' || value === undefined || value === null) {\r\n return true\r\n }\r\n\r\n return false\r\n}\r\n/**\r\n * Compiles a module map, converting a selector-importer pair into a `Map` for efficient lookups.\r\n *\r\n * @function createModuleMap\r\n * @param {Object} moduleMap - The module map where selectors are keys and dynamic imports are values.\r\n * @returns {Map} A Map where selectors are keys and dynamic import functions are values.\r\n *\r\n * @example\r\n * const moduleMap = {\r\n * '.selector': () => import('components/component'),\r\n * '.selector-1, .selector-2, .selector-3': () => import('components/component')\r\n * };\r\n * const compiledMap = createModuleMap(moduleMap);\r\n */\r\nexport function createModuleMap(moduleMap) {\r\n const compiledModuleMap = new Map()\r\n\r\n Object.entries(moduleMap).forEach(([selector, importer]) => {\r\n selector.split(',').forEach((subSelector) => {\r\n compiledModuleMap.set(subSelector.trim(), importer)\r\n })\r\n })\r\n\r\n return compiledModuleMap\r\n}\r\n\r\n/**\r\n * Adds a preload class to the body element after a short delay.\r\n * Also hides the preload animation after another delay.\r\n *\r\n * @function preloadTimeout\r\n *\r\n * @example\r\n * preloadTimeout(); // Adds 'loaded' class after a short delay, hides preload animation after another delay.\r\n */\r\nexport function preloadTimeout() {\r\n console.log('PRELOAD')\r\n const body = document.querySelector('.body')\r\n if (!body) {\r\n return\r\n }\r\n\r\n setTimeout(() => body.classList.add('loaded'), 100)\r\n setTimeout(() => {\r\n body.classList.add('preload--hidden')\r\n body.classList.remove('preload--transitions')\r\n }, 400)\r\n}\r\n\r\n/**\r\n * Lazy loads modules based on a selector in the provided module map using the IntersectionObserver API.\r\n *\r\n * @function lazyModules\r\n * @param {Map} moduleMap - A map of selectors to dynamic import functions.\r\n * @param {Element} [root=document] - The root element to query for selectors (defaults to `document`).\r\n *\r\n * @example\r\n * const moduleMap = new Map([\r\n * ['.selector', () => import('components/component')],\r\n * ['.selector-1, .selector-2, .selector-3', () => import('components/compomnent')],\r\n * ]);\r\n * lazyModules(moduleMap); // Lazy load the components when their selectors are in view.\r\n */\r\n// @ts-ignore\r\nexport function lazyModules(moduleMap, root = document) {\r\n const observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.isIntersecting) {\r\n const target = entry.target\r\n const matchedImporters = Array.from(moduleMap.entries())\r\n .filter(([selector]) => target.matches(selector))\r\n .map(([_, importer]) => importer)\r\n\r\n if (matchedImporters.length > 0) {\r\n Promise.allSettled(matchedImporters.map((importer) => importer()))\r\n .then((results) => {\r\n results.forEach((result) => {\r\n if (result.status === 'fulfilled' && result.value?.default?.init) {\r\n result.value.default.init(target)\r\n }\r\n })\r\n })\r\n .catch(console.error)\r\n }\r\n\r\n observer.unobserve(target)\r\n }\r\n })\r\n })\r\n\r\n moduleMap.forEach((_, selector) => {\r\n root.querySelectorAll(selector).forEach((element) => observer.observe(element))\r\n })\r\n}\r\n\r\n/**\r\n * Initializes core scripts with an optional callback function.\r\n *\r\n * @function initCoreScripts\r\n * @param {Function} callback - The callback function to initialize core scripts.\r\n *\r\n * @example\r\n * initCoreScripts(() => { console.log('Core scripts initialized'); });\r\n */\r\nexport function initCoreScripts(callback = null) {\r\n import(path.resolve(process.cwd(), 'scripts', 'core', 'prefetch.ts')).then((module) => module.default.init())\r\n import(path.resolve(process.cwd(), 'scripts', 'core', 'recaptcha.ts')).then((module) => module.default.init())\r\n\r\n if (callback) {\r\n callback()\r\n }\r\n}\r\n\r\n/**\r\n * Handles the `DOMContentLoaded` event to initialize core scripts and lazy load modules.\r\n *\r\n * @function onDomReady\r\n * @param {Map} moduleMap - The compiled module map for lazy loading.\r\n * @param {Function} initCoreScriptsCallback - The callback function to initialize core scripts.\r\n * @param {Function} [callback] - An optional callback to execute during `DOMContentLoaded` event handling.\r\n *\r\n * @example\r\n * onDomReady(moduleMap, () => { console.log('Core scripts initialized'); }, () => { console.log('DOM content loaded'); });\r\n */\r\nexport function onDomReady(moduleMap, initCoreScriptsCallback, callback = null) {\r\n document.addEventListener('DOMContentLoaded', (e) => {\r\n preloadTimeout()\r\n initCoreScripts(initCoreScriptsCallback)\r\n lazyModules(moduleMap)\r\n\r\n if (callback) {\r\n callback(e)\r\n }\r\n })\r\n}\r\n\r\n/**\r\n * Handles the `popstate` event to initialize core scripts and lazy load modules.\r\n *\r\n * @function onPopstate\r\n * @param {Map} moduleMap - The compiled module map for lazy loading.\r\n * @param {Function} initCoreScriptsCallback - The callback function to initialize core scripts.\r\n * @param {Function} [callback] - An optional callback to execute during `popstate` event handling.\r\n *\r\n * @example\r\n * onPopstate(moduleMap, () => { console.log('Core scripts initialized'); }, () => { console.log('Popstate event triggered'); });\r\n */\r\nexport function onPopstate(moduleMap, initCoreScriptsCallback, callback = null) {\r\n window.addEventListener('popstate', (e) => {\r\n setTimeout(() => {\r\n initCoreScripts(initCoreScriptsCallback)\r\n lazyModules(moduleMap)\r\n\r\n if (callback) {\r\n callback(e)\r\n }\r\n }, 0)\r\n })\r\n}\r\n\r\n/**\r\n * Handles the \"pageshow\" event to initialize core scripts and lazy load modules.\r\n *\r\n * This function listens for the \"pageshow\" eventβ€”which fires when a page is loaded from the bfcache\r\n * or initially loaded. After a short delay, it calls the provided core scripts initialization callback\r\n * and lazy loads modules using the supplied module map. An optional callback is executed with the event object.\r\n *\r\n * @function onPageShow\r\n * @param {Map} moduleMap - The compiled module map for lazy loading.\r\n * @param {Function} initCoreScriptsCallback - The callback function used to initialize core scripts.\r\n * @param {Function} [callback] - An optional callback to execute during event handling.\r\n *\r\n * @example\r\n * onPageShow(moduleMap, () => { console.log('Core scripts initialized'); }, (e) => {\r\n * console.log('Pageshow event triggered', e);\r\n * });\r\n */\r\nexport function onPageShow(moduleMap, initCoreScriptsCallback, callback = null) {\r\n window.addEventListener('pageshow', (e) => {\r\n setTimeout(() => {\r\n initCoreScripts(initCoreScriptsCallback)\r\n lazyModules(moduleMap)\r\n\r\n if (callback) {\r\n callback(e)\r\n }\r\n }, 0)\r\n })\r\n}\r\n\r\n/**\r\n * Handles the `htmx:beforeSwap` event to perform actions before HTMX swaps.\r\n *\r\n * @function onHtmxBeforeSwap\r\n * @param {Function} callback - The callback function to execute during `htmx:beforeSwap` event handling.\r\n *\r\n * @example\r\n * onHtmxBeforeSwap((e) => { console.log('HTMX before swap:', e); });\r\n */\r\nexport function onHtmxBeforeSwap(callback = null) {\r\n document.body.addEventListener('htmx:beforeSwap', (e) => {\r\n document.querySelectorAll('.button--loading')?.forEach((btn) => btn.classList.remove('button--loading'))\r\n\r\n if (callback) {\r\n callback(e)\r\n }\r\n\r\n setTimeout(() => window.scrollTo({ top: 0, behavior: 'smooth' }), 100)\r\n })\r\n}\r\n\r\n/**\r\n * Handles the `htmx:afterSwap` event to initialize core scripts and lazy load modules.\r\n *\r\n * @function onHtmxAfterSwap\r\n * @param {Map} moduleMap - The compiled module map for lazy loading.\r\n * @param {Function} [callback] - An optional callback to execute during `htmx:afterSwap` event handling.\r\n *\r\n * @example\r\n * onHtmxAfterSwap(moduleMap, () => { console.log('HTMX after swap completed'); });\r\n */\r\nexport function onHtmxAfterSwap(moduleMap, callback = null) {\r\n document.body.addEventListener('htmx:afterSwap', (e) => {\r\n // TODO: is initCoreScripts needed here?\r\n // initCoreScripts()\r\n lazyModules(moduleMap)\r\n\r\n if (callback) {\r\n callback(e)\r\n }\r\n })\r\n}\r\n\r\n/**\r\n * Handles the `htmx:afterSettle` event to initialize core scripts and lazy load modules.\r\n *\r\n * @function onHtmxAfterSettle\r\n * @param {Map} moduleMap - The compiled module map for lazy loading.\r\n * @param {Function} initCoreScriptsCallback - The callback function to initialize core scripts.\r\n * @param {Function} [callback] - An optional callback to execute during `htmx:afterSettle` event handling.\r\n *\r\n * @example\r\n * onHtmxAfterSettle(moduleMap, () => { console.log('Core scripts initialized'); }, () => { console.log('HTMX settle completed'); });\r\n */\r\nexport function onHtmxAfterSettle(moduleMap, initCoreScriptsCallback, callback = null) {\r\n document.body.addEventListener('htmx:afterSettle', (e) => {\r\n initCoreScripts(initCoreScriptsCallback)\r\n lazyModules(moduleMap)\r\n\r\n if (callback) {\r\n callback(e)\r\n }\r\n })\r\n}\r\n\r\n// /**\r\n// * Handles the `htmx:responseErrnr` event to display error messages based on the HTTP status code.\r\n// *\r\n// * @function onHtmxResponseError\r\n// * @param {Function} [callback] - An optional callback function to execute during handling of the error.\r\n// * @ignore\r\n// * @example\r\n// * onHtmxResponseError(toaster, (e) => {\r\n// * console.log('Custom error handling:', e);\r\n// * });\r\n// */\r\n// export function onHtmxResponseError(callback) {\r\n// if (!toaster) {\r\n// console.error('[@vettvangur/vanilla | onHtmxResponseError | No toaster provided.')\r\n// return\r\n// }\r\n\r\n// document.addEventListener('htmx:responseError', (e) => {\r\n// e.stopImmediatePropagation()\r\n// // @ts-ignore\r\n// const statusCode = e?.detail?.xhr?.status\r\n\r\n// if (statusCode === 404) {\r\n// toaster.error('Page not found (404)')\r\n// } else if (statusCode === 500) {\r\n// toaster.error('Server error (500)')\r\n// } else {\r\n// toaster.error(`HTMX error with status code: ${statusCode}`)\r\n// }\r\n\r\n// e.stopPropagation()\r\n\r\n// if (callback) {\r\n// callback(e)\r\n// }\r\n// })\r\n// }\r\n\r\n/**\r\n * Handles click outside and ESC key events to trigger a callback and close open elements with the `open` class.\r\n *\r\n * @function clickOutside\r\n * @param {Function} callback - The callback function to be executed when a click outside or ESC key event occurs.\r\n * @description\r\n * This function listens for `click` events and `keyup` events:\r\n * - When a click outside of `.co-trigger` is detected, the provided callback is executed.\r\n * - When the `ESC` key is pressed, the provided callback is executed, and any open elements (with the `open` class) are closed.\r\n *\r\n * @example\r\n * ClickOutside(() => {\r\n * console.log('Click outside or ESC pressed!');\r\n * });\r\n */\r\nexport function clickOutside(callback) {\r\n // Clicks\r\n document.addEventListener(\r\n 'click',\r\n (e) => {\r\n const target = e.target\r\n const classTargets = document.querySelectorAll('.co-el')\r\n\r\n // Check if the click target is inside an element with class `.co-trigger`\r\n // @ts-ignore\r\n if (target.closest('.co-trigger')) {\r\n return\r\n }\r\n\r\n // Execute the callback function\r\n callback(e)\r\n\r\n // Close open elements\r\n Array.prototype.forEach.call(classTargets, (item) => {\r\n if (item.classList.contains('open')) {\r\n item.classList.remove('open')\r\n }\r\n })\r\n },\r\n false\r\n )\r\n\r\n // ESC key\r\n document.addEventListener('keyup', (e) => {\r\n const openElements = document.querySelectorAll('.open')\r\n const keys = e.keyCode || e.which\r\n\r\n // If ESC key (key code 27) is pressed\r\n if (keys === 27) {\r\n // Execute the callback function\r\n callback(e)\r\n\r\n // Close open elements\r\n Array.prototype.forEach.call(openElements, (item) => {\r\n if (item.classList.contains('open')) {\r\n item.classList.remove('open')\r\n }\r\n })\r\n }\r\n })\r\n}\r\n\r\n/**\r\n * Enumeration of fetch types for Umbraco content.\r\n * These types are used to determine the fetch behavior for content.\r\n *\r\n * @readonly\r\n * @enum {string}\r\n */\r\nexport const Umbraco = Object.freeze({\r\n NODE: 'node',\r\n CHILDREN: 'children',\r\n DESCENDANTS: 'descendants',\r\n ANCESTORS: 'ancestors',\r\n EXTRA: 'extra',\r\n})\r\n\r\n/**\r\n * Constructs the URL for fetching Umbraco content.\r\n *\r\n * @ignore\r\n * @function getUmbracoFetchUrl\r\n * @param {string} route - The base route or content identifier.\r\n * @param {string} fetchType - The type of fetch (e.g., NODE, CHILDREN, DESCENDANTS, ANCESTORS, EXTRA).\r\n * @param {Object} [options] - Additional options for the fetch.\r\n * @param {number} [options.skip=0] - Number of items to skip (pagination).\r\n * @param {number} [options.take=9999] - Number of items to take (pagination).\r\n * @param {string} [options.fields='properties[$all]'] - Fields to fetch from the API.\r\n * @param {string} [options.expand=''] - Fields to expand.\r\n * @returns {string} The constructed URL for fetching Umbraco content.\r\n * @throws Will throw an error if an unsupported fetch type is provided.\r\n */\r\nfunction getUmbracoFetchUrl(route, fetchType, options = {}) {\r\n loadEnvFiles()\r\n const params = {\r\n skip: options.skip || 0,\r\n take: options.take || 9999,\r\n fields: options.fields || 'properties[$all]',\r\n expand: options.expand ? `&expand=${options.expand}` : '',\r\n }\r\n\r\n const baseUrl = process.env.DELIVERYAPI\r\n const singular = `${route}?field=${params.fields}${params.expand}`\r\n const multiple = `${route}&skip=${params.skip}&take=${params.take}&fields=${params.fields}${params.expand}`\r\n\r\n switch (fetchType) {\r\n case Umbraco.NODE:\r\n return `${baseUrl}/content/item/${singular}`\r\n case Umbraco.CHILDREN:\r\n return `${baseUrl}/?fetch=children:${multiple}`\r\n case Umbraco.DESCENDANTS:\r\n return `${baseUrl}/?fetch=descendants:${multiple}`\r\n case Umbraco.ANCESTORS:\r\n return `${baseUrl}/?fetch=ancestors:${multiple}`\r\n case Umbraco.EXTRA:\r\n return `${baseUrl}/extra`\r\n default:\r\n throw new Error(\r\n `Unsupported fetch type: ${fetchType}. Available types: NODE, CHILDREN, DESCENDANTS, ANCESTORS, EXTRA`\r\n )\r\n }\r\n}\r\n\r\n/**\r\n * Fetches Umbraco content based on the specified route, fetch type, and options.\r\n *\r\n * @async\r\n * @function getUmbracoData\r\n * @param {Object} params - Parameters for fetching Umbraco content.\r\n * @param {string} params.route - The base route or content identifier.\r\n * @param {string} [params.fetchType=Umbraco.NODE] - The type of fetch (e.g., NODE, CHILDREN, DESCENDANTS, ANCESTORS).\r\n * @param {Object} [params.options={}] - Additional options for the fetch, such as pagination and fields.\r\n * @param {number} [params.options.skip=0] - Number of items to skip (pagination).\r\n * @param {number} [params.options.take=9999] - Number of items to take (pagination).\r\n * @param {string} [params.options.fields='properties[$all]'] - Fields to fetch from the API.\r\n * @param {string} [params.options.expand=''] - Fields to expand.\r\n * @param {RequestInit|null} [params.fetchOptions={}] - Fetch API options (headers, method, body, etc.).\r\n * @returns {Promise<Object|null>} The fetched Umbraco content or null if an error occurs.\r\n * @throws Will throw an error if an invalid fetch type is provided or the fetch fails.\r\n */\r\nexport async function getUmbracoData({ route, fetchType = Umbraco.NODE, options = {}, fetchOptions = {} }) {\r\n /** @type {string[]} */\r\n const validFetchTypes = Object.values(Umbraco)\r\n\r\n if (!validFetchTypes.includes(fetchType)) {\r\n throw new Error(`Invalid fetch type: ${fetchType}`)\r\n }\r\n\r\n const umbracofetchUrl = getUmbracoFetchUrl(route, fetchType, options)\r\n\r\n return await fetcher({ url: umbracofetchUrl, options: fetchOptions })\r\n}\r\n\r\n/**\r\n * Retrieves a translation string from a translations object by key.\r\n *\r\n * @function getTranslation\r\n * @param {string} key - The translation key to look up.\r\n * @param {Object.<string, string>} translations - An object containing translation key-value pairs.\r\n * @returns {string|undefined} The matchin:whetherg translation string, or `undefined` if not found.\r\n * @throws Logs an error to the console if the key does not exist in the translations object.\r\n */\r\nexport function getTranslation(key, translations) {\r\n const translation = translations[key]\r\n\r\n if (!translation) {\r\n console.error(`[vettvangur-vanilla :: getTranslation] No translation for key ${key} found.`)\r\n return\r\n }\r\n\r\n return translation\r\n}\r\n\r\n/**\r\n * Extracts the two-letter culture code from the beginning of the given path.\r\n *\r\n * @param {string|undefined} path - The URL path to extract the culture code from (e.g., \"/en/hello/world\").\r\n * @returns {string|null} The two-letter culture code (e.g., \"en\"), or null if not found.\r\n */\r\nexport function getCulture(path) {\r\n const match = path.match(/^\\/([a-z]{2})(\\/|$)/i)\r\n return match ? match[1].toLowerCase() : null\r\n}\r\n"],"names":["fs","require$$0","path","require$$1","os","require$$2","crypto","require$$3","version","require$$4","LINE","_debug","message","console","log","_dotenvKey","options","DOTENV_KEY","length","process","env","_instructions","result","dotenvKey","uri","URL","error","code","err","Error","key","password","environment","searchParams","get","environmentKey","toUpperCase","ciphertext","parsed","_vaultPath","possibleVaultPath","Array","isArray","filepath","existsSync","endsWith","resolve","cwd","_resolveHome","envPath","join","homedir","slice","DotenvModule","configDotenv","dotenvPath","encoding","debug","Boolean","lastError","optionPaths","push","parsedAll","parse","readFileSync","populate","e","processEnv","_configVault","_parseVault","vaultPath","keys","split","decrypted","i","attrs","trim","decrypt","config","encrypted","keyStr","Buffer","from","nonce","subarray","authTag","aesgcm","createDecipheriv","setAuthTag","update","final","isRange","RangeError","invalidKeyLength","decryptionFailed","src","obj","match","lines","toString","replace","exec","value","maybeQuote","override","Object","prototype","hasOwnProperty","call","mainModule","exports","capitalize","lowerRest","toLowerCase","dictionary","data","culture","notFound","item","itemKey","_item$values$find","values","find","b","language","async","fetcher","url","throwOnError","errorMessage","request","fetch","ok","errorDetails","text","fullErrorMessage","status","statusText","json","loadEnvFiles","showMessage","envFilePath","baseResult","dotenv","warn","envFile","NODE_ENV","isValidRegex","pattern","RegExp","_unused","regexr","test","flags","regexp","flatten","prefix","reduce","acc","fullKey","assign","getTemplate","alias","templates","template","Subpage","getBlock","blocks","block","isEmpty","createModuleMap","moduleMap","compiledModuleMap","Map","entries","forEach","selector","importer","subSelector","set","preloadTimeout","body","document","querySelector","setTimeout","classList","add","remove","lazyModules","root","observer","IntersectionObserver","entry","isIntersecting","target","matchedImporters","filter","matches","map","_","Promise","allSettled","then","results","_result$value","default","init","catch","unobserve","querySelectorAll","element","observe","initCoreScripts","callback","import","module","onDomReady","initCoreScriptsCallback","addEventListener","onPopstate","window","onPageShow","onHtmxBeforeSwap","_document$querySelect","btn","scrollTo","top","behavior","onHtmxAfterSwap","onHtmxAfterSettle","clickOutside","classTargets","closest","contains","openElements","keyCode","which","Umbraco","freeze","NODE","CHILDREN","DESCENDANTS","ANCESTORS","EXTRA","getUmbracoData","route","fetchType","fetchOptions","includes","umbracofetchUrl","params","skip","take","fields","expand","baseUrl","DELIVERYAPI","singular","multiple","getUmbracoFetchUrl","getTranslation","translations","translation","getCulture"],"mappings":"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","x_google_ignoreList":[0]}
@@ -254,6 +254,7 @@ export function clickOutside(callback: Function): void;
254
254
  * @param {number} [params.options.skip=0] - Number of items to skip (pagination).
255
255
  * @param {number} [params.options.take=9999] - Number of items to take (pagination).
256
256
  * @param {string} [params.options.fields='properties[$all]'] - Fields to fetch from the API.
257
+ * @param {string} [params.options.expand=''] - Fields to expand.
257
258
  * @param {RequestInit|null} [params.fetchOptions={}] - Fetch API options (headers, method, body, etc.).
258
259
  * @returns {Promise<Object|null>} The fetched Umbraco content or null if an error occurs.
259
260
  * @throws Will throw an error if an invalid fetch type is provided or the fetch fails.
@@ -265,6 +266,7 @@ export function getUmbracoData({ route, fetchType, options, fetchOptions }: {
265
266
  skip?: number;
266
267
  take?: number;
267
268
  fields?: string;
269
+ expand?: string;
268
270
  };
269
271
  fetchOptions?: RequestInit | null;
270
272
  }): Promise<any | null>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vettvangur/vanilla",
3
- "version": "0.0.21",
3
+ "version": "0.0.22",
4
4
  "description": "Vettvangur | Vanilla JS Utility Library",
5
5
  "access": "private",
6
6
  "type": "module",