@frontfriend/tailwind 4.0.18 → 4.0.21
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/browser.mjs +1 -1
- package/dist/browser.mjs.map +3 -3
- package/dist/cli.js +37 -36
- package/dist/component-recipes.d.ts +14 -0
- package/dist/components-config-schema.js +1 -1
- package/dist/components-config-schema.js.map +3 -3
- package/dist/ffdc.d.ts +11 -1
- package/dist/ffdc.js +1 -1
- package/dist/ffdc.js.map +4 -4
- package/dist/index.js +3 -3
- package/dist/index.js.map +4 -4
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +3 -3
- package/dist/lib/core/api-client.js +2 -2
- package/dist/lib/core/api-client.js.map +3 -3
- package/dist/lib/core/cache-manager.js +6 -4
- package/dist/lib/core/cached-components-config.js +2 -0
- package/dist/lib/core/cached-components-config.js.map +7 -0
- package/dist/lib/core/component-downloader.js +3 -3
- package/dist/lib/core/component-downloader.js.map +3 -3
- package/dist/lib/core/component-recipes.js +8 -0
- package/dist/lib/core/component-recipes.js.map +7 -0
- package/dist/lib/core/components-config-schema.js +1 -1
- package/dist/lib/core/components-config-schema.js.map +3 -3
- package/dist/lib/core/constants.js +1 -1
- package/dist/lib/core/constants.js.map +3 -3
- package/dist/lib/core/credentials.js +2 -2
- package/dist/lib/core/credentials.js.map +3 -3
- package/dist/next.js +1 -1
- package/dist/next.js.map +4 -4
- package/dist/runtime.js +1 -1
- package/dist/runtime.js.map +3 -3
- package/dist/types/index.d.ts +15 -1
- package/dist/vite.js +6 -19
- package/dist/vite.js.map +4 -4
- package/dist/vite.mjs +4 -4
- package/dist/vite.mjs.map +3 -3
- package/package.json +7 -1
- package/scripts/build.js +32 -9
- package/src/theme.css +3 -9
- package/dist/lib/core/default-config-data.js +0 -2
- package/dist/lib/core/default-config-data.js.map +0 -7
- package/dist/lib/core/default-config.js +0 -2
- package/dist/lib/core/default-config.js.map +0 -7
- package/scripts/master-components-config.json +0 -1678
- package/scripts/update-default-config-data.js +0 -891
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var
|
|
2
|
-
`);let r;for(;(r=
|
|
3
|
-
`),c=c.replace(/\\r/g,"\r")),n[f]=c}return n}function re(e){e=e||{};let n=C(e);e.path=n;let s=d.configDotenv(e);if(!s.parsed){let o=new Error(`MISSING_DATA: Cannot parse ${n} for an unknown reason`);throw o.code="MISSING_DATA",o}let r=V(e).split(","),f=r.length,c;for(let o=0;o<f;o++)try{let l=r[o].trim(),t=se(s,l);c=d.decrypt(t.ciphertext,t.key);break}catch(l){if(o+1>=f)throw l}return d.parse(c)}function oe(e){console.log(`[dotenv@${E}][WARN] ${e}`)}function h(e){console.log(`[dotenv@${E}][DEBUG] ${e}`)}function j(e){console.log(`[dotenv@${E}] ${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 se(e,n){let s;try{s=new URL(n)}catch(l){if(l.code==="ERR_INVALID_URL"){let t=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 t.code="INVALID_DOTENV_KEY",t}throw l}let r=s.password;if(!r){let l=new Error("INVALID_DOTENV_KEY: Missing key part");throw l.code="INVALID_DOTENV_KEY",l}let f=s.searchParams.get("environment");if(!f){let l=new Error("INVALID_DOTENV_KEY: Missing environment part");throw l.code="INVALID_DOTENV_KEY",l}let c=`DOTENV_VAULT_${f.toUpperCase()}`,o=e.parsed[c];if(!o){let l=new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${c} in your .env.vault file.`);throw l.code="NOT_FOUND_DOTENV_ENVIRONMENT",l}return{ciphertext:o,key:r}}function C(e){let n=null;if(e&&e.path&&e.path.length>0)if(Array.isArray(e.path))for(let s of e.path)_.existsSync(s)&&(n=s.endsWith(".vault")?s:`${s}.vault`);else n=e.path.endsWith(".vault")?e.path:`${e.path}.vault`;else n=b.resolve(process.cwd(),".env.vault");return _.existsSync(n)?n:null}function N(e){return e[0]==="~"?b.join(X.homedir(),e.slice(1)):e}function ie(e){let n=!!(e&&e.debug),s=e&&"quiet"in e?e.quiet:!0;(n||!s)&&j("Loading env from encrypted .env.vault");let r=d._parseVault(e),f=process.env;return e&&e.processEnv!=null&&(f=e.processEnv),d.populate(f,r,e),{parsed:r}}function ae(e){let n=b.resolve(process.cwd(),".env"),s="utf8",r=!!(e&&e.debug),f=e&&"quiet"in e?e.quiet:!0;e&&e.encoding?s=e.encoding:r&&h("No encoding is specified. UTF-8 is used by default");let c=[n];if(e&&e.path)if(!Array.isArray(e.path))c=[N(e.path)];else{c=[];for(let i of e.path)c.push(N(i))}let o,l={};for(let i of c)try{let a=d.parse(_.readFileSync(i,{encoding:s}));d.populate(l,a,e)}catch(a){r&&h(`Failed to load ${i} ${a.message}`),o=a}let t=process.env;if(e&&e.processEnv!=null&&(t=e.processEnv),d.populate(t,l,e),r||!f){let i=Object.keys(l).length,a=[];for(let u of c)try{let p=b.relative(process.cwd(),u);a.push(p)}catch(p){r&&h(`Failed to load ${u} ${p.message}`),o=p}j(`injecting env (${i}) from ${a.join(",")}`)}return o?{parsed:l,error:o}:{parsed:l}}function ce(e){if(V(e).length===0)return d.configDotenv(e);let n=C(e);return n?d._configVault(e):(oe(`You set DOTENV_KEY but you are missing a .env.vault file at ${n}. Did you forget to build it?`),d.configDotenv(e))}function le(e,n){let s=Buffer.from(n.slice(-64),"hex"),r=Buffer.from(e,"base64"),f=r.subarray(0,12),c=r.subarray(-16);r=r.subarray(12,-16);try{let o=Z.createDecipheriv("aes-256-gcm",s,f);return o.setAuthTag(c),`${o.update(r)}${o.final()}`}catch(o){let l=o instanceof RangeError,t=o.message==="Invalid key length",i=o.message==="Unsupported state or unable to authenticate data";if(l||t){let a=new Error("INVALID_DOTENV_KEY: It must be 64 characters long (or more)");throw a.code="INVALID_DOTENV_KEY",a}else if(i){let a=new Error("DECRYPTION_FAILED: Please check your DOTENV_KEY");throw a.code="DECRYPTION_FAILED",a}else throw o}}function fe(e,n,s={}){let r=!!(s&&s.debug),f=!!(s&&s.override);if(typeof n!="object"){let c=new Error("OBJECT_REQUIRED: Please check the processEnv argument being passed to populate");throw c.code="OBJECT_REQUIRED",c}for(let c of Object.keys(n))Object.prototype.hasOwnProperty.call(e,c)?(f===!0&&(e[c]=n[c]),r&&h(f===!0?`"${c}" is already defined and WAS overwritten`:`"${c}" is already defined and was NOT overwritten`)):e[c]=n[c]}var d={configDotenv:ae,_configVault:ie,_parseVault:re,config:ce,decrypt:le,parse:ne,populate:fe};g.exports.configDotenv=d.configDotenv;g.exports._configVault=d._configVault;g.exports._parseVault=d._parseVault;g.exports.config=d.config;g.exports.decrypt=d.decrypt;g.exports.parse=d.parse;g.exports.populate=d.populate;g.exports=d});var A=y((Se,I)=>{var ue=require("path"),{fileExists:de}=k();function pe(e=process.cwd()){let n=ue.join(e,".env.local");return de(n)?(T().config({path:n}),console.log("\u{1F4C4} Loaded .env.local"),!0):!1}function me(e,n=void 0){return process.env[e]||n}function ge(e){return process.env[e]==="true"}I.exports={loadEnvLocal:pe,getEnvVar:me,isEnvTrue:ge}});var P=y((ke,L)=>{var{componentsConfigSchema:ve,isCSSClassString:ye}=$();function F(e){if(!e)return{};if(typeof e!="object")throw new Error("Config must be an object");return e}F.componentsConfigSchema=ve;F.isCSSClassString=ye;L.exports=F});var he=require("tailwindcss/plugin"),{componentsConfigSchema:we,isCSSClassString:be}=$(),x;try{x=require("postcss")}catch{x=null}var v;if(typeof window>"u"&&typeof process<"u"&&process.versions&&process.versions.node){v=require("./lib/core/cache-manager");let{loadEnvLocal:e}=A();e()}function q(e){return Object.fromEntries(Object.entries(e).filter(([n])=>n!=="DEFAULT"))}var xe=he.withOptions(function(e={}){return function({addBase:n,addUtilities:s,theme:r,matchUtilities:f}){if(!v)return;let c=new v(process.cwd());if(!c.exists()){console.warn('[FrontFriend] No cache found. Please run "npx frontfriend init" first.');return}c.isValid()||console.warn('[FrontFriend] Cache is expired. Please run "npx frontfriend init" to refresh.');let o=c.load();if(!o){console.error("[FrontFriend] Failed to load cache.");return}let l={};if(o.variables)for(let[t,i]of Object.entries(o.variables))t.startsWith("--color-")&&!i.startsWith("hsl(")?l[t]=`hsl(${i})`:l[t]=i;if(o.semanticVariables)for(let[t,i]of Object.entries(o.semanticVariables))typeof i=="string"&&!i.startsWith("var(")&&!i.startsWith("hsl(")&&/^\d+\s+\d+%\s+\d+%/.test(i)?l[t]=`hsl(${i})`:l[t]=i;if(n({":root":l}),o.semanticDarkVariables&&Object.keys(o.semanticDarkVariables).length>0){let t={};for(let[i,a]of Object.entries(o.semanticDarkVariables))typeof a=="string"&&!a.startsWith("var(")&&!a.startsWith("hsl(")&&/^\d+\s+\d+%\s+\d+%/.test(a)?t[i]=`hsl(${a})`:t[i]=a;n({":root:not(.light)":t}),n({":root:not(.dark)":l})}if(o.semanticVariables){let t={};for(let[i]of Object.entries(o.semanticVariables)){let a=i.match(/^--(bg|text|border|layer|overlay|icon)-(.+)$/);if(a){let[,u,p]=a,w=`.${u}-${p}`;u==="bg"||u==="layer"||u==="overlay"?t[w]={backgroundColor:`var(${i})`}:u==="text"?t[w]={color:`var(${i})`}:u==="border"?t[w]={borderColor:`var(${i})`}:u==="icon"&&(t[`.text-${u}-${p}`]={color:`var(${i})`},t[`.fill-${u}-${p}`]={fill:`var(${i})`})}}s(t)}if(o.tokens){if(o.tokens.backgroundColor){let t={};for(let[i,a]of Object.entries(o.tokens.backgroundColor))t[`.bg-${i}`]={backgroundColor:a};s(t)}if(o.tokens.textColor){let t={};for(let[i,a]of Object.entries(o.tokens.textColor))t[`.text-${i}`]={color:a};s(t)}if(o.tokens.borderColor){let t={};for(let[i,a]of Object.entries(o.tokens.borderColor))t[`.border-${i}`]={borderColor:a};s(t)}if(o.tokens.fill){let t={},i={};for(let[a,u]of Object.entries(o.tokens.fill))t[`.fill-${a}`]={fill:u},a.startsWith("icon-")&&(i[`.text-${a}`]={color:u});s(t),s(i)}if(o.tokens.fontFamily){let t={};for(let[i,a]of Object.entries(o.tokens.fontFamily))t[`.font-${i}`]={fontFamily:a};s(t)}}if(o.fonts&&o.fonts.length>0&&o.fonts.forEach(t=>{n({"@font-face":t})}),s({"@keyframes enter":r("keyframes.enter"),"@keyframes exit":r("keyframes.exit"),".animate-in":{animationName:"enter",animationDuration:r("animationDuration.DEFAULT"),"--tw-enter-opacity":"initial","--tw-enter-scale":"initial","--tw-enter-rotate":"initial","--tw-enter-translate-x":"initial","--tw-enter-translate-y":"initial"},".animate-out":{animationName:"exit",animationDuration:r("animationDuration.DEFAULT"),"--tw-exit-opacity":"initial","--tw-exit-scale":"initial","--tw-exit-rotate":"initial","--tw-exit-translate-x":"initial","--tw-exit-translate-y":"initial"}}),f({"fade-in":t=>({"--tw-enter-opacity":t}),"fade-out":t=>({"--tw-exit-opacity":t})},{values:r("animationOpacity")}),f({"zoom-in":t=>({"--tw-enter-scale":t}),"zoom-out":t=>({"--tw-exit-scale":t})},{values:r("animationScale")}),f({"spin-in":t=>({"--tw-enter-rotate":t}),"spin-out":t=>({"--tw-exit-rotate":t})},{values:r("animationRotate")}),f({"slide-in-from-top":t=>({"--tw-enter-translate-y":`-${t}`}),"slide-in-from-bottom":t=>({"--tw-enter-translate-y":t}),"slide-in-from-left":t=>({"--tw-enter-translate-x":`-${t}`}),"slide-in-from-right":t=>({"--tw-enter-translate-x":t}),"slide-out-to-top":t=>({"--tw-exit-translate-y":`-${t}`}),"slide-out-to-bottom":t=>({"--tw-exit-translate-y":t}),"slide-out-to-left":t=>({"--tw-exit-translate-x":`-${t}`}),"slide-out-to-right":t=>({"--tw-exit-translate-x":t})},{values:r("animationTranslate")}),f({duration:t=>({animationDuration:t})},{values:q(r("animationDuration"))}),f({delay:t=>({animationDelay:t})},{values:r("animationDelay")}),f({ease:t=>({animationTimingFunction:t})},{values:q(r("animationTimingFunction"))}),s({".running":{animationPlayState:"running"},".paused":{animationPlayState:"paused"}}),s({".px-ff-main":{paddingLeft:"var(--ff-main-px)",paddingRight:"var(--ff-main-px)"},".py-ff-main":{paddingTop:"var(--ff-main-py)",paddingBottom:"var(--ff-main-py)"},".p-ff-main":{paddingLeft:"var(--ff-main-px)",paddingRight:"var(--ff-main-px)",paddingTop:"var(--ff-main-py)",paddingBottom:"var(--ff-main-py)"}}),f({"fill-mode":t=>({animationFillMode:t})},{values:r("animationFillMode")}),f({direction:t=>({animationDirection:t})},{values:r("animationDirection")}),f({repeat:t=>({animationIterationCount:t})},{values:r("animationRepeat")}),o.custom&&o.custom.raw&&typeof o.custom.raw=="string"){let t=o.custom.raw.trim();if(!t){e.verbose&&console.warn("[FrontFriend] Empty custom CSS");return}if(!x){console.warn("[FrontFriend] PostCSS not available - custom CSS will not be added");return}try{let i=x.parse(t),a=[],u=[];i.each(p=>{if(p.type==="atrule"){a.push(p);return}if(p.type==="rule"){typeof p.selector=="string"&&p.selector.trim().startsWith(".")?u.push(p):a.push(p);return}p.type!=="comment"&&a.push(p)}),a.length>0&&n(a),u.length>0&&s(u),e.verbose&&console.log(`[FrontFriend] Added custom CSS: ${a.length} base rules, ${u.length} utility classes`)}catch(i){console.error("[FrontFriend] Failed to parse custom CSS:",i.message)}}else if(!o.custom){let t=require("fs"),a=require("path").join(process.cwd(),"node_modules",".cache","frontfriend","custom.js");t.existsSync(a)&&(console.warn("[FrontFriend] custom.js file exists but failed to load. This may be due to a parsing error or BOM issue."),console.warn("[FrontFriend] Try deleting node_modules/.cache/frontfriend and running `npx frontfriend init` again."))}e.verbose&&(console.log("[FrontFriend] Plugin loaded successfully"),console.log(`[FrontFriend] Colors: ${Object.keys(o.variables||{}).length}`),console.log(`[FrontFriend] Semantic vars: ${Object.keys(o.semanticVariables||{}).length}`),console.log(`[FrontFriend] Fonts: ${(o.fonts||[]).length}`),console.log(`[FrontFriend] Safelist classes: ${Array.isArray(o.safelist)?o.safelist.length:0}`))}},function(e={}){let n=null;if(v){let r=new v(process.cwd());n=r.exists()?r.load():null}let s=["./pages/**/*.{js,ts,jsx,tsx}","./components/**/*.{js,ts,jsx,tsx}","./app/**/*.{js,ts,jsx,tsx}","./src/**/*.{js,ts,jsx,tsx}","./stories/**/*.{js,ts,jsx,tsx}"];return e.verbose&&n&&(console.log("[FrontFriend] Cache loaded successfully"),n.safelist&&Array.isArray(n.safelist)&&console.log(`[FrontFriend] Loading ${n.safelist.length} classes for safelist`)),{theme:{extend:{colors:e.extendColors||{},animation:e.extendAnimations||{},spacing:{18:"4.5rem",88:"22rem",128:"32rem"},boxShadow:{"top-sm":"0 -1px 1px 0 rgba(0, 0, 0, 0.05)"},borderRadius:{"2xl":"1rem"},animationDelay:({theme:r})=>({...r("transitionDelay")}),animationDuration:({theme:r})=>({0:"0ms",...r("transitionDuration")}),animationTimingFunction:({theme:r})=>({...r("transitionTimingFunction")}),animationFillMode:{none:"none",forwards:"forwards",backwards:"backwards",both:"both"},animationDirection:{normal:"normal",reverse:"reverse",alternate:"alternate","alternate-reverse":"alternate-reverse"},animationOpacity:({theme:r})=>({DEFAULT:0,...r("opacity")}),animationTranslate:({theme:r})=>({DEFAULT:"100%",...r("translate")}),animationScale:({theme:r})=>({DEFAULT:0,...r("scale")}),animationRotate:({theme:r})=>({DEFAULT:"30deg",...r("rotate")}),animationRepeat:{0:"0",1:"1",infinite:"infinite"},keyframes:{enter:{from:{opacity:"var(--tw-enter-opacity, 1)",transform:"translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))"}},exit:{to:{opacity:"var(--tw-exit-opacity, 1)",transform:"translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))"}}}}},safelist:[...((n==null?void 0:n.safelist)||[]).filter(r=>typeof r!="string"||!r.startsWith("file:")),{pattern:/(text|fill)-icon-(neutral|positive|negative|warning|info|highlight|interactive|brand|inverse|onpositive|onnegative|onwarning|oninfo|onhighlight|oninteractive|onbrand)-(mid|strong|subtle|low)(-(neutral|hover|active|selected|disabled))?$/},{pattern:/^(layer-(below|surface|raised|popover|dialog|control)|overlay-(mid|strong|subtle|low))$/}],content:e.content||s}});module.exports=xe;Object.defineProperty(module.exports,"config",{get:function(){if(typeof __FF_CONFIG__<"u")return __FF_CONFIG__;if(typeof window<"u"&&window.__FF_CONFIG__)return window.__FF_CONFIG__;if(v)try{let e=new v(process.cwd());if(e.exists()){let n=e.load();if(n)return n.componentsConfig||null}}catch{}return null}});Object.defineProperty(module.exports,"iconSet",{get:function(){if(typeof __FF_ICONS__<"u")return __FF_ICONS__;if(typeof window<"u"&&window.__FF_ICONS__)return window.__FF_ICONS__;if(v)try{let e=new v(process.cwd());if(e.exists()){let n=e.load();if(n)return n.icons||null}}catch{}return null}});module.exports.componentsConfigSchema=we;module.exports.isCSSClassString=be;module.exports.ffdc=P();
|
|
1
|
+
var v=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var _=v((Pe,N)=>{var Z={$id:"https://frontfriend.dev/schemas/components-config.v4.schema.json",type:"object",additionalProperties:{$ref:"#/$defs/componentConfig"},$defs:{componentConfig:{anyOf:[{$ref:"#/$defs/componentEnvelope"},{$ref:"#/$defs/legacyEntry"}]},legacyEntry:{type:"object",additionalProperties:!1,required:["legacy"],properties:{legacy:{}}},styleTree:{anyOf:[{type:"string"},{type:"object",additionalProperties:{$ref:"#/$defs/styleTree"}}]},behaviorTree:{anyOf:[{type:["string","number","boolean","null"]},{type:"array",items:{$ref:"#/$defs/behaviorTree"}},{type:"object",additionalProperties:{$ref:"#/$defs/behaviorTree"}}]},componentEnvelope:{type:"object",additionalProperties:!1,required:["styles"],properties:{styles:{type:"object",additionalProperties:{$ref:"#/$defs/styleTree"}},behavior:{type:"object",additionalProperties:{$ref:"#/$defs/behaviorTree"}}}}}};function ee(e){return typeof e=="string"&&e.trim().length>0}N.exports={componentsConfigSchema:Z,isCSSClassString:ee}});var A=v((qe,V)=>{var F='FrontFriend components configuration not found. Run "npx frontfriend init" or "npx frontfriend sync".',te="FrontFriend components configuration was not returned by the SaaS app. The cache was not updated.";function T(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function k(e,t=F){if(!T(e)||Object.keys(e).length===0)throw new Error(t);return e}function ne(e){if(!e.exists())throw new Error(F);let t=e.load();return{componentsConfig:k(t==null?void 0:t.componentsConfig),icons:T(t.icons)?t.icons:{}}}V.exports={CACHE_ERROR_MESSAGE:F,SAAS_ERROR_MESSAGE:te,assertComponentsConfig:k,loadCachedComponents:ne}});var R=v((Me,I)=>{var m=require("fs");function re(e){try{let t=m.readFileSync(e,"utf8");return JSON.parse(t)}catch(t){if(t.code==="ENOENT")return null;throw t}}function oe(e){try{return m.readFileSync(e,"utf8").replace(/^\uFEFF/,"")}catch(t){if(t.code==="ENOENT")return null;throw t}}function ie(e,t,o=2){let r=JSON.stringify(t,null,o);m.writeFileSync(e,r,"utf8")}function se(e,t){m.writeFileSync(e,t,"utf8")}function ae(e,t){if(t==null||typeof t=="object"&&Object.keys(t).length===0||Array.isArray(t)&&t.length===0){let r=`module.exports = ${Array.isArray(t)?"[]":"{}"};`;m.writeFileSync(e,r,"utf8")}else{let o=`module.exports = ${JSON.stringify(t,null,2)};`;m.writeFileSync(e,o,"utf8")}}function ce(e){return m.existsSync(e)}function le(e){m.mkdirSync(e,{recursive:!0})}function fe(e){m.rmSync(e,{recursive:!0,force:!0})}I.exports={readJsonFileSafe:re,readFileSafe:oe,writeJsonFile:ie,writeTextFile:se,writeModuleExportsFile:ae,fileExists:ce,ensureDirectoryExists:le,removeDirectory:fe}});var L=v((Ke,ue)=>{ue.exports={name:"dotenv",version:"16.6.1",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",pretest:"npm run lint && npm run dts-check",test:"tap run --allow-empty-coverage --disable-coverage --timeout=60000","test:coverage":"tap run --show-full-coverage --timeout=60000 --coverage-report=text --coverage-report=lcov",prerelease:"npm test",release:"standard-version"},repository:{type:"git",url:"git://github.com/motdotla/dotenv.git"},homepage:"https://github.com/motdotla/dotenv#readme",funding:"https://dotenvx.com",keywords:["dotenv","env",".env","environment","variables","config","settings"],readmeFilename:"README.md",license:"BSD-2-Clause",devDependencies:{"@types/node":"^18.11.3",decache:"^4.6.2",sinon:"^14.0.1",standard:"^17.0.0","standard-version":"^9.5.0",tap:"^19.2.0",typescript:"^4.8.4"},engines:{node:">=12"},browser:{fs:!1}}});var Y=v((Ye,y)=>{var $=require("fs"),x=require("path"),de=require("os"),pe=require("crypto"),me=L(),C=me.version,ye=/(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg;function ge(e){let t={},o=e.toString();o=o.replace(/\r\n?/mg,`
|
|
2
|
+
`);let r;for(;(r=ye.exec(o))!=null;){let c=r[1],l=r[2]||"";l=l.trim();let i=l[0];l=l.replace(/^(['"`])([\s\S]*)\1$/mg,"$2"),i==='"'&&(l=l.replace(/\\n/g,`
|
|
3
|
+
`),l=l.replace(/\\r/g,"\r")),t[c]=l}return t}function ve(e){e=e||{};let t=K(e);e.path=t;let o=d.configDotenv(e);if(!o.parsed){let i=new Error(`MISSING_DATA: Cannot parse ${t} for an unknown reason`);throw i.code="MISSING_DATA",i}let r=M(e).split(","),c=r.length,l;for(let i=0;i<c;i++)try{let f=r[i].trim(),n=be(o,f);l=d.decrypt(n.ciphertext,n.key);break}catch(f){if(i+1>=c)throw f}return d.parse(l)}function he(e){console.log(`[dotenv@${C}][WARN] ${e}`)}function b(e){console.log(`[dotenv@${C}][DEBUG] ${e}`)}function q(e){console.log(`[dotenv@${C}] ${e}`)}function M(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 be(e,t){let o;try{o=new URL(t)}catch(f){if(f.code==="ERR_INVALID_URL"){let n=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 n.code="INVALID_DOTENV_KEY",n}throw f}let r=o.password;if(!r){let f=new Error("INVALID_DOTENV_KEY: Missing key part");throw f.code="INVALID_DOTENV_KEY",f}let c=o.searchParams.get("environment");if(!c){let f=new Error("INVALID_DOTENV_KEY: Missing environment part");throw f.code="INVALID_DOTENV_KEY",f}let l=`DOTENV_VAULT_${c.toUpperCase()}`,i=e.parsed[l];if(!i){let f=new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${l} in your .env.vault file.`);throw f.code="NOT_FOUND_DOTENV_ENVIRONMENT",f}return{ciphertext:i,key:r}}function K(e){let t=null;if(e&&e.path&&e.path.length>0)if(Array.isArray(e.path))for(let o of e.path)$.existsSync(o)&&(t=o.endsWith(".vault")?o:`${o}.vault`);else t=e.path.endsWith(".vault")?e.path:`${e.path}.vault`;else t=x.resolve(process.cwd(),".env.vault");return $.existsSync(t)?t:null}function P(e){return e[0]==="~"?x.join(de.homedir(),e.slice(1)):e}function we(e){let t=!!(e&&e.debug),o=e&&"quiet"in e?e.quiet:!0;(t||!o)&&q("Loading env from encrypted .env.vault");let r=d._parseVault(e),c=process.env;return e&&e.processEnv!=null&&(c=e.processEnv),d.populate(c,r,e),{parsed:r}}function xe(e){let t=x.resolve(process.cwd(),".env"),o="utf8",r=!!(e&&e.debug),c=e&&"quiet"in e?e.quiet:!0;e&&e.encoding?o=e.encoding:r&&b("No encoding is specified. UTF-8 is used by default");let l=[t];if(e&&e.path)if(!Array.isArray(e.path))l=[P(e.path)];else{l=[];for(let s of e.path)l.push(P(s))}let i,f={};for(let s of l)try{let a=d.parse($.readFileSync(s,{encoding:o}));d.populate(f,a,e)}catch(a){r&&b(`Failed to load ${s} ${a.message}`),i=a}let n=process.env;if(e&&e.processEnv!=null&&(n=e.processEnv),d.populate(n,f,e),r||!c){let s=Object.keys(f).length,a=[];for(let u of l)try{let p=x.relative(process.cwd(),u);a.push(p)}catch(p){r&&b(`Failed to load ${u} ${p.message}`),i=p}q(`injecting env (${s}) from ${a.join(",")}`)}return i?{parsed:f,error:i}:{parsed:f}}function Ee(e){if(M(e).length===0)return d.configDotenv(e);let t=K(e);return t?d._configVault(e):(he(`You set DOTENV_KEY but you are missing a .env.vault file at ${t}. Did you forget to build it?`),d.configDotenv(e))}function _e(e,t){let o=Buffer.from(t.slice(-64),"hex"),r=Buffer.from(e,"base64"),c=r.subarray(0,12),l=r.subarray(-16);r=r.subarray(12,-16);try{let i=pe.createDecipheriv("aes-256-gcm",o,c);return i.setAuthTag(l),`${i.update(r)}${i.final()}`}catch(i){let f=i instanceof RangeError,n=i.message==="Invalid key length",s=i.message==="Unsupported state or unable to authenticate data";if(f||n){let a=new Error("INVALID_DOTENV_KEY: It must be 64 characters long (or more)");throw a.code="INVALID_DOTENV_KEY",a}else if(s){let a=new Error("DECRYPTION_FAILED: Please check your DOTENV_KEY");throw a.code="DECRYPTION_FAILED",a}else throw i}}function Fe(e,t,o={}){let r=!!(o&&o.debug),c=!!(o&&o.override);if(typeof t!="object"){let l=new Error("OBJECT_REQUIRED: Please check the processEnv argument being passed to populate");throw l.code="OBJECT_REQUIRED",l}for(let l of Object.keys(t))Object.prototype.hasOwnProperty.call(e,l)?(c===!0&&(e[l]=t[l]),r&&b(c===!0?`"${l}" is already defined and WAS overwritten`:`"${l}" is already defined and was NOT overwritten`)):e[l]=t[l]}var d={configDotenv:xe,_configVault:we,_parseVault:ve,config:Ee,decrypt:_e,parse:ge,populate:Fe};y.exports.configDotenv=d.configDotenv;y.exports._configVault=d._configVault;y.exports._parseVault=d._parseVault;y.exports.config=d.config;y.exports.decrypt=d.decrypt;y.exports.parse=d.parse;y.exports.populate=d.populate;y.exports=d});var B=v((We,W)=>{var $e=require("path"),{fileExists:Ce}=R();function De(e=process.cwd()){let t=$e.join(e,".env.local");return Ce(t)?(Y().config({path:t}),console.log("\u{1F4C4} Loaded .env.local"),!0):!1}function Oe(e,t=void 0){return process.env[e]||t}function Se(e){return process.env[e]==="true"}W.exports={loadEnvLocal:De,getEnvVar:Oe,isEnvTrue:Se}});var Q=v((Be,U)=>{function h(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function D(e,t){if(!h(e)||!h(t))return t===void 0?e:t;let o={...e};for(let[r,c]of Object.entries(t))o[r]=r in o?D(o[r],c):c;return o}function O(e,t,o=[],r=[]){if(e===void 0||t===void 0)return r;if(!h(e)||!h(t))return r.push(o.join(".")),r;for(let c of Object.keys(e))c in t&&O(e[c],t[c],[...o,c],r);return r}function G(e){return h(e)&&("styles"in e||"behavior"in e)}function J(e,t="component"){if(!G(e))return e;let o=O(e.styles,e.behavior,[t]);if(o.length>0)throw new Error(`Component config styles/behavior conflict at ${o.join(", ")}`);return D(e.styles||{},e.behavior||{})}function je(e){if(!h(e))return e;let t=!1,o={};for(let[r,c]of Object.entries(e))o[r]=J(c,r),o[r]!==c&&(t=!0);return t?o:e}U.exports={deepMerge:D,findTreeConflicts:O,isV4Envelope:G,toRuntimeComponentConfig:J,toRuntimeComponentsConfig:je}});var H=v((Ge,z)=>{var{componentsConfigSchema:Ne,isCSSClassString:Te}=_(),{toRuntimeComponentsConfig:ke}=Q();function S(e){if(!e)return{};if(typeof e!="object")throw new Error("Config must be an object");return ke(e)}S.componentsConfigSchema=Ne;S.isCSSClassString=Te;z.exports=S});var Ve=require("tailwindcss/plugin"),{componentsConfigSchema:Ae,isCSSClassString:Ie}=_(),E;try{E=require("postcss")}catch{E=null}var g,j;if(typeof window>"u"&&typeof process<"u"&&process.versions&&process.versions.node){g=require("./lib/core/cache-manager"),{loadCachedComponents:j}=A();let{loadEnvLocal:e}=B();e()}function X(e){return Object.fromEntries(Object.entries(e).filter(([t])=>t!=="DEFAULT"))}var Re=Ve.withOptions(function(e={}){return function({addBase:t,addUtilities:o,theme:r,matchUtilities:c}){if(!g)return;let l=new g(process.cwd());j(l),l.isValid()||console.warn('[FrontFriend] Cache is expired. Please run "npx frontfriend init" to refresh.');let i=l.load(),f={};if(i.variables)for(let[n,s]of Object.entries(i.variables))n.startsWith("--color-")&&!s.startsWith("hsl(")?f[n]=`hsl(${s})`:f[n]=s;if(i.semanticVariables)for(let[n,s]of Object.entries(i.semanticVariables))typeof s=="string"&&!s.startsWith("var(")&&!s.startsWith("hsl(")&&/^\d+\s+\d+%\s+\d+%/.test(s)?f[n]=`hsl(${s})`:f[n]=s;if(t({":root":f}),i.semanticDarkVariables&&Object.keys(i.semanticDarkVariables).length>0){let n={};for(let[s,a]of Object.entries(i.semanticDarkVariables))typeof a=="string"&&!a.startsWith("var(")&&!a.startsWith("hsl(")&&/^\d+\s+\d+%\s+\d+%/.test(a)?n[s]=`hsl(${a})`:n[s]=a;t({":root:not(.light)":n}),t({":root:not(.dark)":f})}if(i.semanticVariables){let n={};for(let[s]of Object.entries(i.semanticVariables)){let a=s.match(/^--(bg|text|border|layer|overlay|icon)-(.+)$/);if(a){let[,u,p]=a,w=`.${u}-${p}`;u==="bg"||u==="layer"||u==="overlay"?n[w]={backgroundColor:`var(${s})`}:u==="text"?n[w]={color:`var(${s})`}:u==="border"?n[w]={borderColor:`var(${s})`}:u==="icon"&&(n[`.text-${u}-${p}`]={color:`var(${s})`},n[`.fill-${u}-${p}`]={fill:`var(${s})`})}}o(n)}if(i.tokens){if(i.tokens.backgroundColor){let n={};for(let[s,a]of Object.entries(i.tokens.backgroundColor))n[`.bg-${s}`]={backgroundColor:a};o(n)}if(i.tokens.textColor){let n={};for(let[s,a]of Object.entries(i.tokens.textColor))n[`.text-${s}`]={color:a};o(n)}if(i.tokens.borderColor){let n={};for(let[s,a]of Object.entries(i.tokens.borderColor))n[`.border-${s}`]={borderColor:a};o(n)}if(i.tokens.fill){let n={},s={};for(let[a,u]of Object.entries(i.tokens.fill))n[`.fill-${a}`]={fill:u},a.startsWith("icon-")&&(s[`.text-${a}`]={color:u});o(n),o(s)}if(i.tokens.fontFamily){let n={};for(let[s,a]of Object.entries(i.tokens.fontFamily))n[`.font-${s}`]={fontFamily:a};o(n)}}if(i.fonts&&i.fonts.length>0&&i.fonts.forEach(n=>{t({"@font-face":n})}),o({"@keyframes enter":r("keyframes.enter"),"@keyframes exit":r("keyframes.exit"),".animate-in":{animationName:"enter",animationDuration:r("animationDuration.DEFAULT"),"--tw-enter-opacity":"initial","--tw-enter-scale":"initial","--tw-enter-rotate":"initial","--tw-enter-translate-x":"initial","--tw-enter-translate-y":"initial"},".animate-out":{animationName:"exit",animationDuration:r("animationDuration.DEFAULT"),"--tw-exit-opacity":"initial","--tw-exit-scale":"initial","--tw-exit-rotate":"initial","--tw-exit-translate-x":"initial","--tw-exit-translate-y":"initial"}}),c({"fade-in":n=>({"--tw-enter-opacity":n}),"fade-out":n=>({"--tw-exit-opacity":n})},{values:r("animationOpacity")}),c({"zoom-in":n=>({"--tw-enter-scale":n}),"zoom-out":n=>({"--tw-exit-scale":n})},{values:r("animationScale")}),c({"spin-in":n=>({"--tw-enter-rotate":n}),"spin-out":n=>({"--tw-exit-rotate":n})},{values:r("animationRotate")}),c({"slide-in-from-top":n=>({"--tw-enter-translate-y":`-${n}`}),"slide-in-from-bottom":n=>({"--tw-enter-translate-y":n}),"slide-in-from-left":n=>({"--tw-enter-translate-x":`-${n}`}),"slide-in-from-right":n=>({"--tw-enter-translate-x":n}),"slide-out-to-top":n=>({"--tw-exit-translate-y":`-${n}`}),"slide-out-to-bottom":n=>({"--tw-exit-translate-y":n}),"slide-out-to-left":n=>({"--tw-exit-translate-x":`-${n}`}),"slide-out-to-right":n=>({"--tw-exit-translate-x":n})},{values:r("animationTranslate")}),c({duration:n=>({animationDuration:n})},{values:X(r("animationDuration"))}),c({delay:n=>({animationDelay:n})},{values:r("animationDelay")}),c({ease:n=>({animationTimingFunction:n})},{values:X(r("animationTimingFunction"))}),o({".running":{animationPlayState:"running"},".paused":{animationPlayState:"paused"}}),o({".px-ff-main":{paddingLeft:"var(--ff-main-px)",paddingRight:"var(--ff-main-px)"},".py-ff-main":{paddingTop:"var(--ff-main-py)",paddingBottom:"var(--ff-main-py)"},".p-ff-main":{paddingLeft:"var(--ff-main-px)",paddingRight:"var(--ff-main-px)",paddingTop:"var(--ff-main-py)",paddingBottom:"var(--ff-main-py)"}}),c({"fill-mode":n=>({animationFillMode:n})},{values:r("animationFillMode")}),c({direction:n=>({animationDirection:n})},{values:r("animationDirection")}),c({repeat:n=>({animationIterationCount:n})},{values:r("animationRepeat")}),i.custom&&i.custom.raw&&typeof i.custom.raw=="string"){let n=i.custom.raw.trim();if(!n){e.verbose&&console.warn("[FrontFriend] Empty custom CSS");return}if(!E){console.warn("[FrontFriend] PostCSS not available - custom CSS will not be added");return}try{let s=E.parse(n),a=[],u=[];s.each(p=>{if(p.type==="atrule"){a.push(p);return}if(p.type==="rule"){typeof p.selector=="string"&&p.selector.trim().startsWith(".")?u.push(p):a.push(p);return}p.type!=="comment"&&a.push(p)}),a.length>0&&t(a),u.length>0&&o(u),e.verbose&&console.log(`[FrontFriend] Added custom CSS: ${a.length} base rules, ${u.length} utility classes`)}catch(s){console.error("[FrontFriend] Failed to parse custom CSS:",s.message)}}else if(!i.custom){let n=require("fs"),a=require("path").join(process.cwd(),"node_modules",".cache","frontfriend","custom.js");n.existsSync(a)&&(console.warn("[FrontFriend] custom.js file exists but failed to load. This may be due to a parsing error or BOM issue."),console.warn("[FrontFriend] Try deleting node_modules/.cache/frontfriend and running `npx frontfriend init` again."))}e.verbose&&(console.log("[FrontFriend] Plugin loaded successfully"),console.log(`[FrontFriend] Colors: ${Object.keys(i.variables||{}).length}`),console.log(`[FrontFriend] Semantic vars: ${Object.keys(i.semanticVariables||{}).length}`),console.log(`[FrontFriend] Fonts: ${(i.fonts||[]).length}`),console.log(`[FrontFriend] Safelist classes: ${Array.isArray(i.safelist)?i.safelist.length:0}`))}},function(e={}){let t=null;if(g){let r=new g(process.cwd());j(r),t=r.load()}let o=["./pages/**/*.{js,ts,jsx,tsx}","./components/**/*.{js,ts,jsx,tsx}","./app/**/*.{js,ts,jsx,tsx}","./src/**/*.{js,ts,jsx,tsx}","./stories/**/*.{js,ts,jsx,tsx}"];return e.verbose&&t&&(console.log("[FrontFriend] Cache loaded successfully"),t.safelist&&Array.isArray(t.safelist)&&console.log(`[FrontFriend] Loading ${t.safelist.length} classes for safelist`)),{theme:{extend:{colors:e.extendColors||{},animation:e.extendAnimations||{},spacing:{18:"4.5rem",88:"22rem",128:"32rem"},boxShadow:{"top-sm":"0 -1px 1px 0 rgba(0, 0, 0, 0.05)"},borderRadius:{"2xl":"1rem"},animationDelay:({theme:r})=>({...r("transitionDelay")}),animationDuration:({theme:r})=>({0:"0ms",...r("transitionDuration")}),animationTimingFunction:({theme:r})=>({...r("transitionTimingFunction")}),animationFillMode:{none:"none",forwards:"forwards",backwards:"backwards",both:"both"},animationDirection:{normal:"normal",reverse:"reverse",alternate:"alternate","alternate-reverse":"alternate-reverse"},animationOpacity:({theme:r})=>({DEFAULT:0,...r("opacity")}),animationTranslate:({theme:r})=>({DEFAULT:"100%",...r("translate")}),animationScale:({theme:r})=>({DEFAULT:0,...r("scale")}),animationRotate:({theme:r})=>({DEFAULT:"30deg",...r("rotate")}),animationRepeat:{0:"0",1:"1",infinite:"infinite"},keyframes:{enter:{from:{opacity:"var(--tw-enter-opacity, 1)",transform:"translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))"}},exit:{to:{opacity:"var(--tw-exit-opacity, 1)",transform:"translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))"}}}}},safelist:[...((t==null?void 0:t.safelist)||[]).filter(r=>typeof r!="string"||!r.startsWith("file:")),{pattern:/(text|fill)-icon-(neutral|positive|negative|warning|info|highlight|interactive|brand|inverse|onpositive|onnegative|onwarning|oninfo|onhighlight|oninteractive|onbrand)-(mid|strong|subtle|low)(-(neutral|hover|active|selected|disabled))?$/},{pattern:/^(layer-(below|surface|raised|popover|dialog|control)|overlay-(mid|strong|subtle|low))$/}],content:e.content||o}});module.exports=Re;Object.defineProperty(module.exports,"config",{get:function(){if(typeof __FF_CONFIG__<"u")return __FF_CONFIG__;if(typeof window<"u"&&window.__FF_CONFIG__)return window.__FF_CONFIG__;if(g)try{let e=new g(process.cwd());if(e.exists()){let t=e.load();if(t)return t.componentsConfig||null}}catch{}return null}});Object.defineProperty(module.exports,"iconSet",{get:function(){if(typeof __FF_ICONS__<"u")return __FF_ICONS__;if(typeof window<"u"&&window.__FF_ICONS__)return window.__FF_ICONS__;if(g)try{let e=new g(process.cwd());if(e.exists()){let t=e.load();if(t)return t.icons||null}}catch{}return null}});module.exports.componentsConfigSchema=Ae;module.exports.isCSSClassString=Ie;module.exports.ffdc=H();
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../lib/core/components-config-schema.js", "../lib/core/file-utils.js", "../../../node_modules/.pnpm/dotenv@16.6.1/node_modules/dotenv/package.json", "../../../node_modules/.pnpm/dotenv@16.6.1/node_modules/dotenv/lib/main.js", "../lib/core/env-utils.js", "../ffdc.js", "../index.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * Shared componentsConfig schema for FrontFriend tools.\n *\n * The schema defines the canonical per-component envelope used by ffdc,\n * validation scripts, migration tooling, and registry completeness checks.\n * Keep this file as the single source of truth; consumers should re-export it\n * instead of maintaining local schema copies.\n */\n\nconst classValueSchema = {\n anyOf: [\n { type: 'string' },\n { type: 'number' },\n { type: 'boolean' },\n { type: 'null' },\n ],\n};\n\nconst componentsConfigSchema = {\n $id: 'https://frontfriend.dev/schemas/components-config.schema.json',\n type: 'object',\n // A component is a bare class string (e.g. spinner: \"animate-spin\") or a\n // strict envelope.\n additionalProperties: {\n anyOf: [{ $ref: '#/$defs/classValue' }, { $ref: '#/$defs/componentEnvelope' }],\n },\n $defs: {\n classValue: classValueSchema,\n\n // Permissive recursive tree used INSIDE `slots` and for `root`: leaves are\n // class values, objects nest freely. Slot internals are NOT namespaced\n // again (slots live at the component top level only), so e.g.\n // `slots.trigger.icon` and `slots.list.line` stay as plain nested keys.\n slotValue: {\n anyOf: [\n { $ref: '#/$defs/classValue' },\n { type: 'object', additionalProperties: { $ref: '#/$defs/slotValue' } },\n ],\n },\n\n // Variant / prop buckets: a class-value leaf or a (possibly nested) map.\n reservedBucket: {\n anyOf: [\n { $ref: '#/$defs/classValue' },\n { type: 'object', additionalProperties: { $ref: '#/$defs/slotValue' } },\n ],\n },\n\n // STRICT canonical v4 envelope: a fixed set of reserved buckets plus a\n // single `slots` namespace holding every named child slot.\n // `additionalProperties: false` is what standardizes the shape \u2014 any stray\n // top-level key (a slot left outside `slots`, a typo) is rejected.\n componentEnvelope: {\n type: 'object',\n additionalProperties: false,\n properties: {\n // Root classes for the component. Usually a class string; some\n // components (e.g. sidebar) nest a sub-tree under root.\n root: { $ref: '#/$defs/slotValue' },\n\n // Canonical variant buckets (variants.variant, variants.size, \u2026) plus\n // the flat compatibility aliases.\n variants: { type: 'object', additionalProperties: { $ref: '#/$defs/reservedBucket' } },\n variant: { $ref: '#/$defs/reservedBucket' },\n size: { $ref: '#/$defs/reservedBucket' },\n sizes: { $ref: '#/$defs/reservedBucket' },\n iconPosition: { $ref: '#/$defs/reservedBucket' },\n icons: { $ref: '#/$defs/reservedBucket' },\n color: { $ref: '#/$defs/reservedBucket' },\n fullwidth: { $ref: '#/$defs/reservedBucket' },\n states: { $ref: '#/$defs/reservedBucket' },\n compoundVariants: { $ref: '#/$defs/reservedBucket' },\n defaultVariants: { $ref: '#/$defs/reservedBucket' },\n props: { $ref: '#/$defs/reservedBucket' },\n\n // All named child slots (item, trigger, content, icon, menu, \u2026) live\n // here. Top-level only \u2014 slot internals stay direct.\n slots: { type: 'object', additionalProperties: { $ref: '#/$defs/slotValue' } },\n },\n },\n },\n};\n\nfunction isCSSClassString(value) {\n if (typeof value !== 'string') return false;\n\n if (value.trim().length === 0) return false;\n\n if (/^[0-9]+(?:\\.[0-9]+)?$/.test(value)) return false;\n\n if (value === 'true' || value === 'false') return false;\n\n const hasSpaces = /\\s/.test(value);\n const hasTailwindSyntax = /[-:\\[\\]\\/]/.test(value);\n\n if (hasSpaces || hasTailwindSyntax) return true;\n\n return true;\n}\n\nmodule.exports = {\n componentsConfigSchema,\n isCSSClassString,\n};\n", "const fs = require('fs');\n\n/**\n * Read a JSON file safely, returning null if file doesn't exist\n * @param {string} filepath - Path to the JSON file\n * @returns {Object|null} Parsed JSON or null if file not found\n * @throws {Error} If JSON is invalid\n */\nfunction readJsonFileSafe(filepath) {\n try {\n const content = fs.readFileSync(filepath, 'utf8');\n return JSON.parse(content);\n } catch (error) {\n if (error.code === 'ENOENT') {\n return null; // File not found, return null like API would return 404\n }\n throw error;\n }\n}\n\n/**\n * Read a file safely, returning null if file doesn't exist\n * Strips UTF-8 BOM if present (fixes Windows compatibility)\n * @param {string} filepath - Path to the file\n * @returns {string|null} File content or null if file not found\n * @throws {Error} For other file system errors\n */\nfunction readFileSafe(filepath) {\n try {\n const content = fs.readFileSync(filepath, 'utf8');\n // Strip UTF-8 BOM if present (Windows compatibility)\n return content.replace(/^\\uFEFF/, '');\n } catch (error) {\n if (error.code === 'ENOENT') {\n return null; // File not found\n }\n throw error;\n }\n}\n\n/**\n * Write JSON data to a file with proper formatting\n * @param {string} filepath - Path to write the file\n * @param {Object} data - Data to write\n * @param {number} indent - Indentation level (default: 2)\n */\nfunction writeJsonFile(filepath, data, indent = 2) {\n const content = JSON.stringify(data, null, indent);\n fs.writeFileSync(filepath, content, 'utf8');\n}\n\n/**\n * Write plain text content to a file\n * @param {string} filepath - Path to write the file\n * @param {string} content - Text content to write\n */\nfunction writeTextFile(filepath, content) {\n fs.writeFileSync(filepath, content, 'utf8');\n}\n\n/**\n * Write module.exports file with JSON data\n * @param {string} filepath - Path to write the file\n * @param {Object} data - Data to export\n */\nfunction writeModuleExportsFile(filepath, data) {\n // Handle empty data cases\n if (data === null || data === undefined || \n (typeof data === 'object' && Object.keys(data).length === 0) ||\n (Array.isArray(data) && data.length === 0)) {\n const emptyContent = Array.isArray(data) ? '[]' : '{}';\n const content = `module.exports = ${emptyContent};`;\n fs.writeFileSync(filepath, content, 'utf8');\n } else {\n const content = `module.exports = ${JSON.stringify(data, null, 2)};`;\n fs.writeFileSync(filepath, content, 'utf8');\n }\n}\n\n/**\n * Check if a file exists\n * @param {string} filepath - Path to check\n * @returns {boolean} True if file exists\n */\nfunction fileExists(filepath) {\n return fs.existsSync(filepath);\n}\n\n/**\n * Create directory recursively\n * @param {string} dirpath - Directory path to create\n */\nfunction ensureDirectoryExists(dirpath) {\n fs.mkdirSync(dirpath, { recursive: true });\n}\n\n/**\n * Remove directory recursively\n * @param {string} dirpath - Directory path to remove\n */\nfunction removeDirectory(dirpath) {\n fs.rmSync(dirpath, { recursive: true, force: true });\n}\n\nmodule.exports = {\n readJsonFileSafe,\n readFileSafe,\n writeJsonFile,\n writeTextFile,\n writeModuleExportsFile,\n fileExists,\n ensureDirectoryExists,\n removeDirectory\n};\n", "{\n \"name\": \"dotenv\",\n \"version\": \"16.6.1\",\n \"description\": \"Loads environment variables from .env file\",\n \"main\": \"lib/main.js\",\n \"types\": \"lib/main.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./lib/main.d.ts\",\n \"require\": \"./lib/main.js\",\n \"default\": \"./lib/main.js\"\n },\n \"./config\": \"./config.js\",\n \"./config.js\": \"./config.js\",\n \"./lib/env-options\": \"./lib/env-options.js\",\n \"./lib/env-options.js\": \"./lib/env-options.js\",\n \"./lib/cli-options\": \"./lib/cli-options.js\",\n \"./lib/cli-options.js\": \"./lib/cli-options.js\",\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"dts-check\": \"tsc --project tests/types/tsconfig.json\",\n \"lint\": \"standard\",\n \"pretest\": \"npm run lint && npm run dts-check\",\n \"test\": \"tap run --allow-empty-coverage --disable-coverage --timeout=60000\",\n \"test:coverage\": \"tap run --show-full-coverage --timeout=60000 --coverage-report=text --coverage-report=lcov\",\n \"prerelease\": \"npm test\",\n \"release\": \"standard-version\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git://github.com/motdotla/dotenv.git\"\n },\n \"homepage\": \"https://github.com/motdotla/dotenv#readme\",\n \"funding\": \"https://dotenvx.com\",\n \"keywords\": [\n \"dotenv\",\n \"env\",\n \".env\",\n \"environment\",\n \"variables\",\n \"config\",\n \"settings\"\n ],\n \"readmeFilename\": \"README.md\",\n \"license\": \"BSD-2-Clause\",\n \"devDependencies\": {\n \"@types/node\": \"^18.11.3\",\n \"decache\": \"^4.6.2\",\n \"sinon\": \"^14.0.1\",\n \"standard\": \"^17.0.0\",\n \"standard-version\": \"^9.5.0\",\n \"tap\": \"^19.2.0\",\n \"typescript\": \"^4.8.4\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"browser\": {\n \"fs\": false\n }\n}\n", "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 options = options || {}\n\n const vaultPath = _vaultPath(options)\n options.path = vaultPath // parse .env.vault\n const result = DotenvModule.configDotenv(options)\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 _warn (message) {\n console.log(`[dotenv@${version}][WARN] ${message}`)\n}\n\nfunction _debug (message) {\n console.log(`[dotenv@${version}][DEBUG] ${message}`)\n}\n\nfunction _log (message) {\n console.log(`[dotenv@${version}] ${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 const debug = Boolean(options && options.debug)\n const quiet = options && 'quiet' in options ? options.quiet : true\n\n if (debug || !quiet) {\n _log('Loading env from encrypted .env.vault')\n }\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 const quiet = options && 'quiet' in options ? options.quiet : true\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 (debug || !quiet) {\n const keysCount = Object.keys(parsedAll).length\n const shortPaths = []\n for (const filePath of optionPaths) {\n try {\n const relative = path.relative(process.cwd(), filePath)\n shortPaths.push(relative)\n } catch (e) {\n if (debug) {\n _debug(`Failed to load ${filePath} ${e.message}`)\n }\n lastError = e\n }\n }\n\n _log(`injecting env (${keysCount}) from ${shortPaths.join(',')}`)\n }\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", "const path = require('path');\nconst { fileExists } = require('./file-utils');\n\n/**\n * Load .env.local file if it exists in the current working directory\n * @param {string} cwd - Current working directory (defaults to process.cwd())\n * @returns {boolean} True if .env.local was loaded\n */\nfunction loadEnvLocal(cwd = process.cwd()) {\n const envLocalPath = path.join(cwd, '.env.local');\n \n if (fileExists(envLocalPath)) {\n require('dotenv').config({ path: envLocalPath });\n console.log('\uD83D\uDCC4 Loaded .env.local');\n return true;\n }\n \n return false;\n}\n\n/**\n * Get an environment variable with optional default value\n * @param {string} name - Environment variable name\n * @param {string} defaultValue - Default value if not set\n * @returns {string|undefined} Environment variable value or default\n */\nfunction getEnvVar(name, defaultValue = undefined) {\n return process.env[name] || defaultValue;\n}\n\n/**\n * Check if an environment variable is set to 'true'\n * @param {string} name - Environment variable name\n * @returns {boolean} True if the env var is set to 'true'\n */\nfunction isEnvTrue(name) {\n return process.env[name] === 'true';\n}\n\nmodule.exports = {\n loadEnvLocal,\n getEnvVar,\n isEnvTrue\n};", "// ffdc.js - Simple config accessor\n// No base64 decoding, just returns the config object directly\n\nconst {\n componentsConfigSchema,\n isCSSClassString,\n} = require('./lib/core/components-config-schema');\n\nfunction ffdc(config) {\n if (!config) {\n return {};\n }\n\n if (typeof config !== 'object') {\n throw new Error('Config must be an object');\n }\n\n return config;\n}\n\nffdc.componentsConfigSchema = componentsConfigSchema;\nffdc.isCSSClassString = isCSSClassString;\n\nmodule.exports = ffdc;\n", "const plugin = require('tailwindcss/plugin');\nconst { componentsConfigSchema, isCSSClassString } = require('./lib/core/components-config-schema');\n\n// PostCSS is a peer dependency of Tailwind, so it should be available\n// We'll try to require it, but handle the case where it's not available\nlet postcss;\ntry {\n postcss = require('postcss');\n} catch (e) {\n // PostCSS not available - custom CSS parsing will be disabled\n postcss = null;\n}\n\nlet CacheManager;\nif (typeof window === 'undefined' && typeof process !== 'undefined' && process.versions && process.versions.node) {\n CacheManager = require('./lib/core/cache-manager');\n const { loadEnvLocal } = require('./lib/core/env-utils');\n // Load .env.local if it exists\n loadEnvLocal();\n}\n\nfunction filterDefault(values) {\n return Object.fromEntries(\n Object.entries(values).filter(([key]) => key !== \"DEFAULT\"),\n );\n}\n\nconst pluginExport = plugin.withOptions(\n function (options = {}) {\n return function ({ addBase, addUtilities, theme, matchUtilities }) {\n // 1. Load cache with CacheManager\n if (!CacheManager) {\n // should get cache in browser here\n return;\n }\n\n const cacheManager = new CacheManager(process.cwd());\n\n if (!cacheManager.exists()) {\n console.warn('[FrontFriend] No cache found. Please run \"npx frontfriend init\" first.');\n return;\n }\n\n if (!cacheManager.isValid()) {\n console.warn('[FrontFriend] Cache is expired. Please run \"npx frontfriend init\" to refresh.');\n }\n\n const cache = cacheManager.load();\n if (!cache) {\n console.error('[FrontFriend] Failed to load cache.');\n return;\n }\n\n // 2. Add CSS variables to :root\n const rootVars = {};\n\n // Add color variables\n if (cache.variables) {\n // Wrap HSL values in hsl() function\n for (const [key, value] of Object.entries(cache.variables)) {\n // Check if it's a color variable (contains HSL values)\n if (key.startsWith('--color-') && !value.startsWith('hsl(')) {\n rootVars[key] = `hsl(${value})`;\n } else {\n rootVars[key] = value;\n }\n }\n }\n\n // Add semantic variables (light mode)\n if (cache.semanticVariables) {\n for (const [key, value] of Object.entries(cache.semanticVariables)) {\n // Check if value contains HSL components (e.g., \"206 92% 5% / 0.9\")\n // These need to be wrapped in hsl() function\n if (typeof value === 'string' &&\n !value.startsWith('var(') &&\n !value.startsWith('hsl(') &&\n /^\\d+\\s+\\d+%\\s+\\d+%/.test(value)) {\n rootVars[key] = `hsl(${value})`;\n } else {\n // Semantic variables that point to other variables using var()\n // don't need wrapping\n rootVars[key] = value;\n }\n }\n }\n\n // Add root styles\n addBase({\n ':root': rootVars\n });\n\n // 3. Add dark mode support\n if (cache.semanticDarkVariables && Object.keys(cache.semanticDarkVariables).length > 0) {\n const darkVars = {};\n for (const [key, value] of Object.entries(cache.semanticDarkVariables)) {\n // Check if value contains HSL components\n if (typeof value === 'string' &&\n !value.startsWith('var(') &&\n !value.startsWith('hsl(') &&\n /^\\d+\\s+\\d+%\\s+\\d+%/.test(value)) {\n darkVars[key] = `hsl(${value})`;\n } else {\n darkVars[key] = value;\n }\n }\n\n addBase({\n ':root:not(.light)': darkVars\n });\n addBase({\n ':root:not(.dark)': rootVars\n });\n }\n\n\n // 4. Generate semantic color utilities from semantic variables\n if (cache.semanticVariables) {\n const semanticUtilities = {};\n\n // Process semantic variables into utility classes\n for (const [cssVar] of Object.entries(cache.semanticVariables)) {\n // Convert CSS variable to utility class name\n // --bg-brand-mid-default -> bg-brand-mid\n // --text-brand-strong -> text-brand-strong\n // --border-neutral-subtle-hover -> border-neutral-subtle-hover\n\n const match = cssVar.match(/^--(bg|text|border|layer|overlay|icon)-(.+)$/);\n if (match) {\n const [, prefix, name] = match;\n const className = `.${prefix}-${name}`;\n\n if (prefix === 'bg' || prefix === 'layer' || prefix === 'overlay') {\n semanticUtilities[className] = {\n backgroundColor: `var(${cssVar})`\n };\n } else if (prefix === 'text') {\n semanticUtilities[className] = {\n color: `var(${cssVar})`\n };\n } else if (prefix === 'border') {\n semanticUtilities[className] = {\n borderColor: `var(${cssVar})`\n };\n } else if (prefix === 'icon') {\n // Icon tokens map to both text color and fill\n semanticUtilities[`.text-${prefix}-${name}`] = {\n color: `var(${cssVar})`\n };\n semanticUtilities[`.fill-${prefix}-${name}`] = {\n fill: `var(${cssVar})`\n };\n }\n }\n }\n\n addUtilities(semanticUtilities);\n }\n\n // 5. Generate utilities from tokens (semantic-based utilities)\n if (cache.tokens) {\n // Background colors\n if (cache.tokens.backgroundColor) {\n const bgUtilities = {};\n for (const [name, value] of Object.entries(cache.tokens.backgroundColor)) {\n // The value already contains hsl() wrapper from the processor\n bgUtilities[`.bg-${name}`] = {\n backgroundColor: value\n };\n }\n addUtilities(bgUtilities);\n }\n\n // Text colors\n if (cache.tokens.textColor) {\n const textUtilities = {};\n for (const [name, value] of Object.entries(cache.tokens.textColor)) {\n textUtilities[`.text-${name}`] = {\n color: value\n };\n }\n addUtilities(textUtilities);\n }\n\n // Border colors\n if (cache.tokens.borderColor) {\n const borderUtilities = {};\n for (const [name, value] of Object.entries(cache.tokens.borderColor)) {\n borderUtilities[`.border-${name}`] = {\n borderColor: value\n };\n }\n addUtilities(borderUtilities);\n }\n\n // Fill colors (for SVG icons)\n if (cache.tokens.fill) {\n const fillUtilities = {};\n const textIconUtilities = {};\n for (const [name, value] of Object.entries(cache.tokens.fill)) {\n fillUtilities[`.fill-${name}`] = {\n fill: value\n };\n // Also create text-icon utilities for icon color classes\n if (name.startsWith('icon-')) {\n textIconUtilities[`.text-${name}`] = {\n color: value\n };\n }\n }\n addUtilities(fillUtilities);\n addUtilities(textIconUtilities);\n }\n\n // Font family utilities\n if (cache.tokens.fontFamily) {\n const fontUtilities = {};\n for (const [name, value] of Object.entries(cache.tokens.fontFamily)) {\n fontUtilities[`.font-${name}`] = {\n fontFamily: value\n };\n }\n addUtilities(fontUtilities);\n }\n }\n\n // 6. Add font faces\n if (cache.fonts && cache.fonts.length > 0) {\n // Convert font objects to Tailwind-compatible format\n cache.fonts.forEach(fontFace => {\n // Tailwind expects each @font-face as a separate rule\n addBase({\n '@font-face': fontFace\n });\n });\n }\n\n // 7. Add enter/exit animation utilities\n addUtilities({\n \"@keyframes enter\": theme(\"keyframes.enter\"),\n \"@keyframes exit\": theme(\"keyframes.exit\"),\n \".animate-in\": {\n animationName: \"enter\",\n animationDuration: theme(\"animationDuration.DEFAULT\"),\n \"--tw-enter-opacity\": \"initial\",\n \"--tw-enter-scale\": \"initial\",\n \"--tw-enter-rotate\": \"initial\",\n \"--tw-enter-translate-x\": \"initial\",\n \"--tw-enter-translate-y\": \"initial\",\n },\n \".animate-out\": {\n animationName: \"exit\",\n animationDuration: theme(\"animationDuration.DEFAULT\"),\n \"--tw-exit-opacity\": \"initial\",\n \"--tw-exit-scale\": \"initial\",\n \"--tw-exit-rotate\": \"initial\",\n \"--tw-exit-translate-x\": \"initial\",\n \"--tw-exit-translate-y\": \"initial\",\n },\n });\n\n // 10. Add animation match utilities\n matchUtilities(\n {\n \"fade-in\": (value) => ({ \"--tw-enter-opacity\": value }),\n \"fade-out\": (value) => ({ \"--tw-exit-opacity\": value }),\n },\n { values: theme(\"animationOpacity\") }\n );\n\n matchUtilities(\n {\n \"zoom-in\": (value) => ({ \"--tw-enter-scale\": value }),\n \"zoom-out\": (value) => ({ \"--tw-exit-scale\": value }),\n },\n { values: theme(\"animationScale\") }\n );\n\n matchUtilities(\n {\n \"spin-in\": (value) => ({ \"--tw-enter-rotate\": value }),\n \"spin-out\": (value) => ({ \"--tw-exit-rotate\": value }),\n },\n { values: theme(\"animationRotate\") }\n );\n\n matchUtilities(\n {\n \"slide-in-from-top\": (value) => ({\n \"--tw-enter-translate-y\": `-${value}`,\n }),\n \"slide-in-from-bottom\": (value) => ({\n \"--tw-enter-translate-y\": value,\n }),\n \"slide-in-from-left\": (value) => ({\n \"--tw-enter-translate-x\": `-${value}`,\n }),\n \"slide-in-from-right\": (value) => ({\n \"--tw-enter-translate-x\": value,\n }),\n \"slide-out-to-top\": (value) => ({\n \"--tw-exit-translate-y\": `-${value}`,\n }),\n \"slide-out-to-bottom\": (value) => ({\n \"--tw-exit-translate-y\": value,\n }),\n \"slide-out-to-left\": (value) => ({\n \"--tw-exit-translate-x\": `-${value}`,\n }),\n \"slide-out-to-right\": (value) => ({\n \"--tw-exit-translate-x\": value,\n }),\n },\n { values: theme(\"animationTranslate\") }\n );\n\n // 11. Add animation control utilities\n matchUtilities(\n { duration: (value) => ({ animationDuration: value }) },\n { values: filterDefault(theme(\"animationDuration\")) }\n );\n\n matchUtilities(\n { delay: (value) => ({ animationDelay: value }) },\n { values: theme(\"animationDelay\") }\n );\n\n matchUtilities(\n { ease: (value) => ({ animationTimingFunction: value }) },\n { values: filterDefault(theme(\"animationTimingFunction\")) }\n );\n\n addUtilities({\n \".running\": { animationPlayState: \"running\" },\n \".paused\": { animationPlayState: \"paused\" },\n });\n\n // Page main padding utilities (use CSS variables from project's custom.css)\n addUtilities({\n \".px-ff-main\": {\n paddingLeft: \"var(--ff-main-px)\",\n paddingRight: \"var(--ff-main-px)\",\n },\n \".py-ff-main\": {\n paddingTop: \"var(--ff-main-py)\",\n paddingBottom: \"var(--ff-main-py)\",\n },\n \".p-ff-main\": {\n paddingLeft: \"var(--ff-main-px)\",\n paddingRight: \"var(--ff-main-px)\",\n paddingTop: \"var(--ff-main-py)\",\n paddingBottom: \"var(--ff-main-py)\",\n },\n });\n\n matchUtilities(\n { \"fill-mode\": (value) => ({ animationFillMode: value }) },\n { values: theme(\"animationFillMode\") }\n );\n\n matchUtilities(\n { direction: (value) => ({ animationDirection: value }) },\n { values: theme(\"animationDirection\") }\n );\n\n matchUtilities(\n { repeat: (value) => ({ animationIterationCount: value }) },\n { values: theme(\"animationRepeat\") }\n );\n\n // 12. Add custom CSS\n if (cache.custom && cache.custom.raw && typeof cache.custom.raw === 'string') {\n const rawCss = cache.custom.raw.trim();\n\n if (!rawCss) {\n if (options.verbose) {\n console.warn('[FrontFriend] Empty custom CSS');\n }\n return;\n }\n\n // Check if PostCSS is available\n if (!postcss) {\n console.warn('[FrontFriend] PostCSS not available - custom CSS will not be added');\n return;\n }\n\n try {\n // Parse the CSS using PostCSS to get an AST\n const root = postcss.parse(rawCss);\n \n // Split nodes into base and utilities layers\n const baseNodes = [];\n const utilityNodes = [];\n \n root.each((node) => {\n // @keyframes, @font-face, @media, etc. go to base\n if (node.type === 'atrule') {\n // Special handling for @keyframes and other at-rules\n baseNodes.push(node);\n return;\n }\n \n // Regular rules\n if (node.type === 'rule') {\n // Class selectors starting with . go to utilities\n const isClassSelector = \n typeof node.selector === 'string' && \n node.selector.trim().startsWith('.');\n \n if (isClassSelector) {\n utilityNodes.push(node);\n } else {\n // Element selectors, IDs, attribute selectors, etc. go to base\n baseNodes.push(node);\n }\n return;\n }\n \n // Comments and other nodes go to base\n if (node.type !== 'comment') {\n baseNodes.push(node);\n }\n });\n \n // Add nodes to their respective layers\n // Tailwind accepts PostCSS nodes directly\n if (baseNodes.length > 0) {\n addBase(baseNodes);\n }\n \n if (utilityNodes.length > 0) {\n addUtilities(utilityNodes);\n }\n \n if (options.verbose) {\n console.log(`[FrontFriend] Added custom CSS: ${baseNodes.length} base rules, ${utilityNodes.length} utility classes`);\n }\n } catch (error) {\n console.error('[FrontFriend] Failed to parse custom CSS:', error.message);\n // Don't throw - just log the error and continue\n }\n } else if (!cache.custom) {\n // Check if custom.js file exists but failed to load\n const fs = require('fs');\n const path = require('path');\n const customJsPath = path.join(process.cwd(), 'node_modules', '.cache', 'frontfriend', 'custom.js');\n\n if (fs.existsSync(customJsPath)) {\n console.warn('[FrontFriend] custom.js file exists but failed to load. This may be due to a parsing error or BOM issue.');\n console.warn('[FrontFriend] Try deleting node_modules/.cache/frontfriend and running `npx frontfriend init` again.');\n }\n }\n\n // Log success\n if (options.verbose) {\n console.log('[FrontFriend] Plugin loaded successfully');\n console.log(`[FrontFriend] Colors: ${Object.keys(cache.variables || {}).length}`);\n console.log(`[FrontFriend] Semantic vars: ${Object.keys(cache.semanticVariables || {}).length}`);\n console.log(`[FrontFriend] Fonts: ${(cache.fonts || []).length}`);\n console.log(`[FrontFriend] Safelist classes: ${Array.isArray(cache.safelist) ? cache.safelist.length : 0}`);\n }\n };\n },\n function (options = {}) {\n // Return theme configuration\n let cache = null;\n if (CacheManager) {\n const cacheManager = new CacheManager(process.cwd());\n cache = cacheManager.exists() ? cacheManager.load() : null;\n }\n\n // Default content paths matching the current-plugin approach\n const defaultContent = [\n './pages/**/*.{js,ts,jsx,tsx}',\n './components/**/*.{js,ts,jsx,tsx}',\n './app/**/*.{js,ts,jsx,tsx}',\n './src/**/*.{js,ts,jsx,tsx}',\n './stories/**/*.{js,ts,jsx,tsx}'\n ];\n\n // Log cache loading\n if (options.verbose && cache) {\n console.log('[FrontFriend] Cache loaded successfully');\n if (cache.safelist && Array.isArray(cache.safelist)) {\n console.log(`[FrontFriend] Loading ${cache.safelist.length} classes for safelist`);\n }\n }\n\n return {\n theme: {\n extend: {\n // Extend colors if needed\n colors: options.extendColors || {},\n // Extend animations if needed\n animation: options.extendAnimations || {},\n // Add custom spacing values\n spacing: {\n '18': '4.5rem',\n '88': '22rem',\n '128': '32rem'\n },\n // Add custom box shadows\n boxShadow: {\n 'top-sm': '0 -1px 1px 0 rgba(0, 0, 0, 0.05)'\n },\n // Add border radius values\n borderRadius: {\n '2xl': '1rem'\n },\n // Animation extensions\n animationDelay: ({ theme }) => ({\n ...theme(\"transitionDelay\"),\n }),\n animationDuration: ({ theme }) => ({\n 0: \"0ms\",\n ...theme(\"transitionDuration\"),\n }),\n animationTimingFunction: ({ theme }) => ({\n ...theme(\"transitionTimingFunction\"),\n }),\n animationFillMode: {\n none: \"none\",\n forwards: \"forwards\",\n backwards: \"backwards\",\n both: \"both\",\n },\n animationDirection: {\n normal: \"normal\",\n reverse: \"reverse\",\n alternate: \"alternate\",\n \"alternate-reverse\": \"alternate-reverse\",\n },\n animationOpacity: ({ theme }) => ({\n DEFAULT: 0,\n ...theme(\"opacity\"),\n }),\n animationTranslate: ({ theme }) => ({\n DEFAULT: \"100%\",\n ...theme(\"translate\"),\n }),\n animationScale: ({ theme }) => ({\n DEFAULT: 0,\n ...theme(\"scale\"),\n }),\n animationRotate: ({ theme }) => ({\n DEFAULT: \"30deg\",\n ...theme(\"rotate\"),\n }),\n animationRepeat: {\n 0: \"0\",\n 1: \"1\",\n infinite: \"infinite\",\n },\n keyframes: {\n enter: {\n from: {\n opacity: \"var(--tw-enter-opacity, 1)\",\n transform:\n \"translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))\",\n },\n },\n exit: {\n to: {\n opacity: \"var(--tw-exit-opacity, 1)\",\n transform:\n \"translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))\",\n },\n },\n },\n }\n },\n // Include safelist from cache and additional classes\n // Filter out file: variant classes \u2014 chaining file-selector-button with other\n // pseudo-elements (e.g. ::placeholder) produces invalid CSS that crashes Turbopack.\n safelist: [\n ...(cache?.safelist || []).filter(s => typeof s !== 'string' || !s.startsWith('file:')),\n {\n pattern: /(text|fill)-icon-(neutral|positive|negative|warning|info|highlight|interactive|brand|inverse|onpositive|onnegative|onwarning|oninfo|onhighlight|oninteractive|onbrand)-(mid|strong|subtle|low)(-(neutral|hover|active|selected|disabled))?$/,\n },\n {\n pattern: /^(layer-(below|surface|raised|popover|dialog|control)|overlay-(mid|strong|subtle|low))$/,\n },\n ],\n // Set content paths - merge options with defaults\n content: options.content || defaultContent\n };\n }\n);\n\n// Default export is the plugin\nmodule.exports = pluginExport;\n\n// Export components config and icons with getter functions\n// This allows dynamic resolution at runtime\n\n// Create getter for config\nObject.defineProperty(module.exports, 'config', {\n get: function () {\n // Check for webpack-injected global variable\n if (typeof __FF_CONFIG__ !== 'undefined') {\n return __FF_CONFIG__;\n }\n\n // Check if we're in a browser environment\n if (typeof window !== 'undefined' && window.__FF_CONFIG__) {\n return window.__FF_CONFIG__;\n }\n\n // Node.js: load from cache\n if (CacheManager) {\n try {\n const cacheManager = new CacheManager(process.cwd());\n if (cacheManager.exists()) {\n const cache = cacheManager.load();\n if (cache) {\n return cache.componentsConfig || null;\n }\n }\n } catch (error) {\n // Config not available\n }\n }\n\n return null;\n }\n});\n\n// Create getter for iconSet\nObject.defineProperty(module.exports, 'iconSet', {\n get: function () {\n // Check for webpack-injected global variable\n if (typeof __FF_ICONS__ !== 'undefined') {\n return __FF_ICONS__;\n }\n\n // Check if we're in a browser environment\n if (typeof window !== 'undefined' && window.__FF_ICONS__) {\n return window.__FF_ICONS__;\n }\n\n // Node.js: load from cache\n if (CacheManager) {\n try {\n const cacheManager = new CacheManager(process.cwd());\n if (cacheManager.exists()) {\n const cache = cacheManager.load();\n if (cache) {\n return cache.icons || null;\n }\n }\n } catch (error) {\n // Icons not available\n }\n }\n\n return null;\n }\n});\n\n// Export shared componentsConfig schema utilities\nmodule.exports.componentsConfigSchema = componentsConfigSchema;\nmodule.exports.isCSSClassString = isCSSClassString;\n\n// Export ffdc utility\nmodule.exports.ffdc = require('./ffdc.js');"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["require_components_config_schema", "__commonJSMin", "exports", "module", "
|
|
3
|
+
"sources": ["../lib/core/components-config-schema.js", "../lib/core/cached-components-config.js", "../lib/core/file-utils.js", "../../../node_modules/.pnpm/dotenv@16.6.1/node_modules/dotenv/package.json", "../../../node_modules/.pnpm/dotenv@16.6.1/node_modules/dotenv/lib/main.js", "../lib/core/env-utils.js", "../lib/core/components-config-v4.js", "../ffdc.js", "../index.js"],
|
|
4
|
+
"sourcesContent": ["/**\n * Canonical Frontfriend v4 componentsConfig schema.\n *\n * Styling and runtime behavior are deliberately separate. Every string below\n * `styles` is a Tailwind class string; values below `behavior` are component\n * data and are never interpreted as CSS.\n */\n\nconst componentsConfigSchema = {\n $id: \"https://frontfriend.dev/schemas/components-config.v4.schema.json\",\n type: \"object\",\n additionalProperties: { $ref: \"#/$defs/componentConfig\" },\n $defs: {\n // A component config is either a fully-migrated v4 envelope OR an explicit\n // legacy/unresolved custom payload awaiting promotion (#512/#514). The\n // generic converter never guesses how custom fields map to styles/behavior;\n // it preserves the v3 payload verbatim under `legacy` until promotion.\n componentConfig: {\n anyOf: [\n { $ref: \"#/$defs/componentEnvelope\" },\n { $ref: \"#/$defs/legacyEntry\" },\n ],\n },\n legacyEntry: {\n type: \"object\",\n additionalProperties: false,\n required: [\"legacy\"],\n properties: { legacy: {} },\n },\n styleTree: {\n anyOf: [\n { type: \"string\" },\n { type: \"object\", additionalProperties: { $ref: \"#/$defs/styleTree\" } },\n ],\n },\n behaviorTree: {\n anyOf: [\n { type: [\"string\", \"number\", \"boolean\", \"null\"] },\n { type: \"array\", items: { $ref: \"#/$defs/behaviorTree\" } },\n {\n type: \"object\",\n additionalProperties: { $ref: \"#/$defs/behaviorTree\" },\n },\n ],\n },\n componentEnvelope: {\n type: \"object\",\n additionalProperties: false,\n required: [\"styles\"],\n properties: {\n styles: {\n type: \"object\",\n additionalProperties: { $ref: \"#/$defs/styleTree\" },\n },\n behavior: {\n type: \"object\",\n additionalProperties: { $ref: \"#/$defs/behaviorTree\" },\n },\n },\n },\n },\n};\n\nfunction isCSSClassString(value) {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nmodule.exports = {\n componentsConfigSchema,\n isCSSClassString,\n};\n", "const CACHE_ERROR_MESSAGE =\n 'FrontFriend components configuration not found. Run \"npx frontfriend init\" or \"npx frontfriend sync\".';\nconst SAAS_ERROR_MESSAGE =\n 'FrontFriend components configuration was not returned by the SaaS app. The cache was not updated.';\n\nfunction isPlainObject(value) {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction assertComponentsConfig(componentsConfig, message = CACHE_ERROR_MESSAGE) {\n if (!isPlainObject(componentsConfig) || Object.keys(componentsConfig).length === 0) {\n throw new Error(message);\n }\n\n return componentsConfig;\n}\n\nfunction loadCachedComponents(cacheManager) {\n if (!cacheManager.exists()) throw new Error(CACHE_ERROR_MESSAGE);\n\n const cache = cacheManager.load();\n const componentsConfig = assertComponentsConfig(cache?.componentsConfig);\n\n return {\n componentsConfig,\n icons: isPlainObject(cache.icons) ? cache.icons : {},\n };\n}\n\nmodule.exports = {\n CACHE_ERROR_MESSAGE,\n SAAS_ERROR_MESSAGE,\n assertComponentsConfig,\n loadCachedComponents,\n};\n", "const fs = require('fs');\n\n/**\n * Read a JSON file safely, returning null if file doesn't exist\n * @param {string} filepath - Path to the JSON file\n * @returns {Object|null} Parsed JSON or null if file not found\n * @throws {Error} If JSON is invalid\n */\nfunction readJsonFileSafe(filepath) {\n try {\n const content = fs.readFileSync(filepath, 'utf8');\n return JSON.parse(content);\n } catch (error) {\n if (error.code === 'ENOENT') {\n return null; // File not found, return null like API would return 404\n }\n throw error;\n }\n}\n\n/**\n * Read a file safely, returning null if file doesn't exist\n * Strips UTF-8 BOM if present (fixes Windows compatibility)\n * @param {string} filepath - Path to the file\n * @returns {string|null} File content or null if file not found\n * @throws {Error} For other file system errors\n */\nfunction readFileSafe(filepath) {\n try {\n const content = fs.readFileSync(filepath, 'utf8');\n // Strip UTF-8 BOM if present (Windows compatibility)\n return content.replace(/^\\uFEFF/, '');\n } catch (error) {\n if (error.code === 'ENOENT') {\n return null; // File not found\n }\n throw error;\n }\n}\n\n/**\n * Write JSON data to a file with proper formatting\n * @param {string} filepath - Path to write the file\n * @param {Object} data - Data to write\n * @param {number} indent - Indentation level (default: 2)\n */\nfunction writeJsonFile(filepath, data, indent = 2) {\n const content = JSON.stringify(data, null, indent);\n fs.writeFileSync(filepath, content, 'utf8');\n}\n\n/**\n * Write plain text content to a file\n * @param {string} filepath - Path to write the file\n * @param {string} content - Text content to write\n */\nfunction writeTextFile(filepath, content) {\n fs.writeFileSync(filepath, content, 'utf8');\n}\n\n/**\n * Write module.exports file with JSON data\n * @param {string} filepath - Path to write the file\n * @param {Object} data - Data to export\n */\nfunction writeModuleExportsFile(filepath, data) {\n // Handle empty data cases\n if (data === null || data === undefined || \n (typeof data === 'object' && Object.keys(data).length === 0) ||\n (Array.isArray(data) && data.length === 0)) {\n const emptyContent = Array.isArray(data) ? '[]' : '{}';\n const content = `module.exports = ${emptyContent};`;\n fs.writeFileSync(filepath, content, 'utf8');\n } else {\n const content = `module.exports = ${JSON.stringify(data, null, 2)};`;\n fs.writeFileSync(filepath, content, 'utf8');\n }\n}\n\n/**\n * Check if a file exists\n * @param {string} filepath - Path to check\n * @returns {boolean} True if file exists\n */\nfunction fileExists(filepath) {\n return fs.existsSync(filepath);\n}\n\n/**\n * Create directory recursively\n * @param {string} dirpath - Directory path to create\n */\nfunction ensureDirectoryExists(dirpath) {\n fs.mkdirSync(dirpath, { recursive: true });\n}\n\n/**\n * Remove directory recursively\n * @param {string} dirpath - Directory path to remove\n */\nfunction removeDirectory(dirpath) {\n fs.rmSync(dirpath, { recursive: true, force: true });\n}\n\nmodule.exports = {\n readJsonFileSafe,\n readFileSafe,\n writeJsonFile,\n writeTextFile,\n writeModuleExportsFile,\n fileExists,\n ensureDirectoryExists,\n removeDirectory\n};\n", "{\n \"name\": \"dotenv\",\n \"version\": \"16.6.1\",\n \"description\": \"Loads environment variables from .env file\",\n \"main\": \"lib/main.js\",\n \"types\": \"lib/main.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./lib/main.d.ts\",\n \"require\": \"./lib/main.js\",\n \"default\": \"./lib/main.js\"\n },\n \"./config\": \"./config.js\",\n \"./config.js\": \"./config.js\",\n \"./lib/env-options\": \"./lib/env-options.js\",\n \"./lib/env-options.js\": \"./lib/env-options.js\",\n \"./lib/cli-options\": \"./lib/cli-options.js\",\n \"./lib/cli-options.js\": \"./lib/cli-options.js\",\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"dts-check\": \"tsc --project tests/types/tsconfig.json\",\n \"lint\": \"standard\",\n \"pretest\": \"npm run lint && npm run dts-check\",\n \"test\": \"tap run --allow-empty-coverage --disable-coverage --timeout=60000\",\n \"test:coverage\": \"tap run --show-full-coverage --timeout=60000 --coverage-report=text --coverage-report=lcov\",\n \"prerelease\": \"npm test\",\n \"release\": \"standard-version\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git://github.com/motdotla/dotenv.git\"\n },\n \"homepage\": \"https://github.com/motdotla/dotenv#readme\",\n \"funding\": \"https://dotenvx.com\",\n \"keywords\": [\n \"dotenv\",\n \"env\",\n \".env\",\n \"environment\",\n \"variables\",\n \"config\",\n \"settings\"\n ],\n \"readmeFilename\": \"README.md\",\n \"license\": \"BSD-2-Clause\",\n \"devDependencies\": {\n \"@types/node\": \"^18.11.3\",\n \"decache\": \"^4.6.2\",\n \"sinon\": \"^14.0.1\",\n \"standard\": \"^17.0.0\",\n \"standard-version\": \"^9.5.0\",\n \"tap\": \"^19.2.0\",\n \"typescript\": \"^4.8.4\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"browser\": {\n \"fs\": false\n }\n}\n", "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 options = options || {}\n\n const vaultPath = _vaultPath(options)\n options.path = vaultPath // parse .env.vault\n const result = DotenvModule.configDotenv(options)\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 _warn (message) {\n console.log(`[dotenv@${version}][WARN] ${message}`)\n}\n\nfunction _debug (message) {\n console.log(`[dotenv@${version}][DEBUG] ${message}`)\n}\n\nfunction _log (message) {\n console.log(`[dotenv@${version}] ${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 const debug = Boolean(options && options.debug)\n const quiet = options && 'quiet' in options ? options.quiet : true\n\n if (debug || !quiet) {\n _log('Loading env from encrypted .env.vault')\n }\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 const quiet = options && 'quiet' in options ? options.quiet : true\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 (debug || !quiet) {\n const keysCount = Object.keys(parsedAll).length\n const shortPaths = []\n for (const filePath of optionPaths) {\n try {\n const relative = path.relative(process.cwd(), filePath)\n shortPaths.push(relative)\n } catch (e) {\n if (debug) {\n _debug(`Failed to load ${filePath} ${e.message}`)\n }\n lastError = e\n }\n }\n\n _log(`injecting env (${keysCount}) from ${shortPaths.join(',')}`)\n }\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", "const path = require('path');\nconst { fileExists } = require('./file-utils');\n\n/**\n * Load .env.local file if it exists in the current working directory\n * @param {string} cwd - Current working directory (defaults to process.cwd())\n * @returns {boolean} True if .env.local was loaded\n */\nfunction loadEnvLocal(cwd = process.cwd()) {\n const envLocalPath = path.join(cwd, '.env.local');\n \n if (fileExists(envLocalPath)) {\n require('dotenv').config({ path: envLocalPath });\n console.log('\uD83D\uDCC4 Loaded .env.local');\n return true;\n }\n \n return false;\n}\n\n/**\n * Get an environment variable with optional default value\n * @param {string} name - Environment variable name\n * @param {string} defaultValue - Default value if not set\n * @returns {string|undefined} Environment variable value or default\n */\nfunction getEnvVar(name, defaultValue = undefined) {\n return process.env[name] || defaultValue;\n}\n\n/**\n * Check if an environment variable is set to 'true'\n * @param {string} name - Environment variable name\n * @returns {boolean} True if the env var is set to 'true'\n */\nfunction isEnvTrue(name) {\n return process.env[name] === 'true';\n}\n\nmodule.exports = {\n loadEnvLocal,\n getEnvVar,\n isEnvTrue\n};", "function isPlainObject(value) {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction deepMerge(left, right) {\n if (!isPlainObject(left) || !isPlainObject(right))\n return right === undefined ? left : right;\n\n const result = { ...left };\n for (const [key, value] of Object.entries(right)) {\n result[key] = key in result ? deepMerge(result[key], value) : value;\n }\n return result;\n}\n\nfunction findTreeConflicts(left, right, path = [], conflicts = []) {\n if (left === undefined || right === undefined) return conflicts;\n if (!isPlainObject(left) || !isPlainObject(right)) {\n conflicts.push(path.join('.'));\n return conflicts;\n }\n\n for (const key of Object.keys(left)) {\n if (key in right) {\n findTreeConflicts(left[key], right[key], [...path, key], conflicts);\n }\n }\n return conflicts;\n}\n\nfunction isV4Envelope(value) {\n return isPlainObject(value) && (\"styles\" in value || \"behavior\" in value);\n}\n\nfunction toRuntimeComponentConfig(envelope, component = 'component') {\n if (!isV4Envelope(envelope)) return envelope;\n const conflicts = findTreeConflicts(envelope.styles, envelope.behavior, [component]);\n if (conflicts.length > 0) {\n throw new Error(`Component config styles/behavior conflict at ${conflicts.join(', ')}`);\n }\n return deepMerge(envelope.styles || {}, envelope.behavior || {});\n}\n\nfunction toRuntimeComponentsConfig(config) {\n if (!isPlainObject(config)) return config;\n\n let changed = false;\n const result = {};\n for (const [name, envelope] of Object.entries(config)) {\n result[name] = toRuntimeComponentConfig(envelope, name);\n if (result[name] !== envelope) changed = true;\n }\n return changed ? result : config;\n}\n\nmodule.exports = {\n deepMerge,\n findTreeConflicts,\n isV4Envelope,\n toRuntimeComponentConfig,\n toRuntimeComponentsConfig,\n};\n", "// ffdc.js - Simple config accessor\n// No base64 decoding, just returns the config object directly\n\nconst {\n componentsConfigSchema,\n isCSSClassString,\n} = require('./lib/core/components-config-schema');\nconst { toRuntimeComponentsConfig } = require('./lib/core/components-config-v4');\n\nfunction ffdc(config) {\n if (!config) {\n return {};\n }\n\n if (typeof config !== 'object') {\n throw new Error('Config must be an object');\n }\n\n return toRuntimeComponentsConfig(config);\n}\n\nffdc.componentsConfigSchema = componentsConfigSchema;\nffdc.isCSSClassString = isCSSClassString;\n\nmodule.exports = ffdc;\n", "const plugin = require('tailwindcss/plugin');\nconst { componentsConfigSchema, isCSSClassString } = require('./lib/core/components-config-schema');\n\n// PostCSS is a peer dependency of Tailwind, so it should be available\n// We'll try to require it, but handle the case where it's not available\nlet postcss;\ntry {\n postcss = require('postcss');\n} catch (e) {\n // PostCSS not available - custom CSS parsing will be disabled\n postcss = null;\n}\n\nlet CacheManager;\nlet loadCachedComponents;\nif (typeof window === 'undefined' && typeof process !== 'undefined' && process.versions && process.versions.node) {\n CacheManager = require('./lib/core/cache-manager');\n ({ loadCachedComponents } = require('./lib/core/cached-components-config'));\n const { loadEnvLocal } = require('./lib/core/env-utils');\n // Load .env.local if it exists\n loadEnvLocal();\n}\n\nfunction filterDefault(values) {\n return Object.fromEntries(\n Object.entries(values).filter(([key]) => key !== \"DEFAULT\"),\n );\n}\n\nconst pluginExport = plugin.withOptions(\n function (options = {}) {\n return function ({ addBase, addUtilities, theme, matchUtilities }) {\n // 1. Load cache with CacheManager\n if (!CacheManager) {\n // should get cache in browser here\n return;\n }\n\n const cacheManager = new CacheManager(process.cwd());\n loadCachedComponents(cacheManager);\n\n if (!cacheManager.isValid()) {\n console.warn('[FrontFriend] Cache is expired. Please run \"npx frontfriend init\" to refresh.');\n }\n\n const cache = cacheManager.load();\n\n // 2. Add CSS variables to :root\n const rootVars = {};\n\n // Add color variables\n if (cache.variables) {\n // Wrap HSL values in hsl() function\n for (const [key, value] of Object.entries(cache.variables)) {\n // Check if it's a color variable (contains HSL values)\n if (key.startsWith('--color-') && !value.startsWith('hsl(')) {\n rootVars[key] = `hsl(${value})`;\n } else {\n rootVars[key] = value;\n }\n }\n }\n\n // Add semantic variables (light mode)\n if (cache.semanticVariables) {\n for (const [key, value] of Object.entries(cache.semanticVariables)) {\n // Check if value contains HSL components (e.g., \"206 92% 5% / 0.9\")\n // These need to be wrapped in hsl() function\n if (typeof value === 'string' &&\n !value.startsWith('var(') &&\n !value.startsWith('hsl(') &&\n /^\\d+\\s+\\d+%\\s+\\d+%/.test(value)) {\n rootVars[key] = `hsl(${value})`;\n } else {\n // Semantic variables that point to other variables using var()\n // don't need wrapping\n rootVars[key] = value;\n }\n }\n }\n\n // Add root styles\n addBase({\n ':root': rootVars\n });\n\n // 3. Add dark mode support\n if (cache.semanticDarkVariables && Object.keys(cache.semanticDarkVariables).length > 0) {\n const darkVars = {};\n for (const [key, value] of Object.entries(cache.semanticDarkVariables)) {\n // Check if value contains HSL components\n if (typeof value === 'string' &&\n !value.startsWith('var(') &&\n !value.startsWith('hsl(') &&\n /^\\d+\\s+\\d+%\\s+\\d+%/.test(value)) {\n darkVars[key] = `hsl(${value})`;\n } else {\n darkVars[key] = value;\n }\n }\n\n addBase({\n ':root:not(.light)': darkVars\n });\n addBase({\n ':root:not(.dark)': rootVars\n });\n }\n\n\n // 4. Generate semantic color utilities from semantic variables\n if (cache.semanticVariables) {\n const semanticUtilities = {};\n\n // Process semantic variables into utility classes\n for (const [cssVar] of Object.entries(cache.semanticVariables)) {\n // Convert CSS variable to utility class name\n // --bg-brand-mid-default -> bg-brand-mid\n // --text-brand-strong -> text-brand-strong\n // --border-neutral-subtle-hover -> border-neutral-subtle-hover\n\n const match = cssVar.match(/^--(bg|text|border|layer|overlay|icon)-(.+)$/);\n if (match) {\n const [, prefix, name] = match;\n const className = `.${prefix}-${name}`;\n\n if (prefix === 'bg' || prefix === 'layer' || prefix === 'overlay') {\n semanticUtilities[className] = {\n backgroundColor: `var(${cssVar})`\n };\n } else if (prefix === 'text') {\n semanticUtilities[className] = {\n color: `var(${cssVar})`\n };\n } else if (prefix === 'border') {\n semanticUtilities[className] = {\n borderColor: `var(${cssVar})`\n };\n } else if (prefix === 'icon') {\n // Icon tokens map to both text color and fill\n semanticUtilities[`.text-${prefix}-${name}`] = {\n color: `var(${cssVar})`\n };\n semanticUtilities[`.fill-${prefix}-${name}`] = {\n fill: `var(${cssVar})`\n };\n }\n }\n }\n\n addUtilities(semanticUtilities);\n }\n\n // 5. Generate utilities from tokens (semantic-based utilities)\n if (cache.tokens) {\n // Background colors\n if (cache.tokens.backgroundColor) {\n const bgUtilities = {};\n for (const [name, value] of Object.entries(cache.tokens.backgroundColor)) {\n // The value already contains hsl() wrapper from the processor\n bgUtilities[`.bg-${name}`] = {\n backgroundColor: value\n };\n }\n addUtilities(bgUtilities);\n }\n\n // Text colors\n if (cache.tokens.textColor) {\n const textUtilities = {};\n for (const [name, value] of Object.entries(cache.tokens.textColor)) {\n textUtilities[`.text-${name}`] = {\n color: value\n };\n }\n addUtilities(textUtilities);\n }\n\n // Border colors\n if (cache.tokens.borderColor) {\n const borderUtilities = {};\n for (const [name, value] of Object.entries(cache.tokens.borderColor)) {\n borderUtilities[`.border-${name}`] = {\n borderColor: value\n };\n }\n addUtilities(borderUtilities);\n }\n\n // Fill colors (for SVG icons)\n if (cache.tokens.fill) {\n const fillUtilities = {};\n const textIconUtilities = {};\n for (const [name, value] of Object.entries(cache.tokens.fill)) {\n fillUtilities[`.fill-${name}`] = {\n fill: value\n };\n // Also create text-icon utilities for icon color classes\n if (name.startsWith('icon-')) {\n textIconUtilities[`.text-${name}`] = {\n color: value\n };\n }\n }\n addUtilities(fillUtilities);\n addUtilities(textIconUtilities);\n }\n\n // Font family utilities\n if (cache.tokens.fontFamily) {\n const fontUtilities = {};\n for (const [name, value] of Object.entries(cache.tokens.fontFamily)) {\n fontUtilities[`.font-${name}`] = {\n fontFamily: value\n };\n }\n addUtilities(fontUtilities);\n }\n }\n\n // 6. Add font faces\n if (cache.fonts && cache.fonts.length > 0) {\n // Convert font objects to Tailwind-compatible format\n cache.fonts.forEach(fontFace => {\n // Tailwind expects each @font-face as a separate rule\n addBase({\n '@font-face': fontFace\n });\n });\n }\n\n // 7. Add enter/exit animation utilities\n addUtilities({\n \"@keyframes enter\": theme(\"keyframes.enter\"),\n \"@keyframes exit\": theme(\"keyframes.exit\"),\n \".animate-in\": {\n animationName: \"enter\",\n animationDuration: theme(\"animationDuration.DEFAULT\"),\n \"--tw-enter-opacity\": \"initial\",\n \"--tw-enter-scale\": \"initial\",\n \"--tw-enter-rotate\": \"initial\",\n \"--tw-enter-translate-x\": \"initial\",\n \"--tw-enter-translate-y\": \"initial\",\n },\n \".animate-out\": {\n animationName: \"exit\",\n animationDuration: theme(\"animationDuration.DEFAULT\"),\n \"--tw-exit-opacity\": \"initial\",\n \"--tw-exit-scale\": \"initial\",\n \"--tw-exit-rotate\": \"initial\",\n \"--tw-exit-translate-x\": \"initial\",\n \"--tw-exit-translate-y\": \"initial\",\n },\n });\n\n // 10. Add animation match utilities\n matchUtilities(\n {\n \"fade-in\": (value) => ({ \"--tw-enter-opacity\": value }),\n \"fade-out\": (value) => ({ \"--tw-exit-opacity\": value }),\n },\n { values: theme(\"animationOpacity\") }\n );\n\n matchUtilities(\n {\n \"zoom-in\": (value) => ({ \"--tw-enter-scale\": value }),\n \"zoom-out\": (value) => ({ \"--tw-exit-scale\": value }),\n },\n { values: theme(\"animationScale\") }\n );\n\n matchUtilities(\n {\n \"spin-in\": (value) => ({ \"--tw-enter-rotate\": value }),\n \"spin-out\": (value) => ({ \"--tw-exit-rotate\": value }),\n },\n { values: theme(\"animationRotate\") }\n );\n\n matchUtilities(\n {\n \"slide-in-from-top\": (value) => ({\n \"--tw-enter-translate-y\": `-${value}`,\n }),\n \"slide-in-from-bottom\": (value) => ({\n \"--tw-enter-translate-y\": value,\n }),\n \"slide-in-from-left\": (value) => ({\n \"--tw-enter-translate-x\": `-${value}`,\n }),\n \"slide-in-from-right\": (value) => ({\n \"--tw-enter-translate-x\": value,\n }),\n \"slide-out-to-top\": (value) => ({\n \"--tw-exit-translate-y\": `-${value}`,\n }),\n \"slide-out-to-bottom\": (value) => ({\n \"--tw-exit-translate-y\": value,\n }),\n \"slide-out-to-left\": (value) => ({\n \"--tw-exit-translate-x\": `-${value}`,\n }),\n \"slide-out-to-right\": (value) => ({\n \"--tw-exit-translate-x\": value,\n }),\n },\n { values: theme(\"animationTranslate\") }\n );\n\n // 11. Add animation control utilities\n matchUtilities(\n { duration: (value) => ({ animationDuration: value }) },\n { values: filterDefault(theme(\"animationDuration\")) }\n );\n\n matchUtilities(\n { delay: (value) => ({ animationDelay: value }) },\n { values: theme(\"animationDelay\") }\n );\n\n matchUtilities(\n { ease: (value) => ({ animationTimingFunction: value }) },\n { values: filterDefault(theme(\"animationTimingFunction\")) }\n );\n\n addUtilities({\n \".running\": { animationPlayState: \"running\" },\n \".paused\": { animationPlayState: \"paused\" },\n });\n\n // Page main padding utilities (use CSS variables from project's custom.css)\n addUtilities({\n \".px-ff-main\": {\n paddingLeft: \"var(--ff-main-px)\",\n paddingRight: \"var(--ff-main-px)\",\n },\n \".py-ff-main\": {\n paddingTop: \"var(--ff-main-py)\",\n paddingBottom: \"var(--ff-main-py)\",\n },\n \".p-ff-main\": {\n paddingLeft: \"var(--ff-main-px)\",\n paddingRight: \"var(--ff-main-px)\",\n paddingTop: \"var(--ff-main-py)\",\n paddingBottom: \"var(--ff-main-py)\",\n },\n });\n\n matchUtilities(\n { \"fill-mode\": (value) => ({ animationFillMode: value }) },\n { values: theme(\"animationFillMode\") }\n );\n\n matchUtilities(\n { direction: (value) => ({ animationDirection: value }) },\n { values: theme(\"animationDirection\") }\n );\n\n matchUtilities(\n { repeat: (value) => ({ animationIterationCount: value }) },\n { values: theme(\"animationRepeat\") }\n );\n\n // 12. Add custom CSS\n if (cache.custom && cache.custom.raw && typeof cache.custom.raw === 'string') {\n const rawCss = cache.custom.raw.trim();\n\n if (!rawCss) {\n if (options.verbose) {\n console.warn('[FrontFriend] Empty custom CSS');\n }\n return;\n }\n\n // Check if PostCSS is available\n if (!postcss) {\n console.warn('[FrontFriend] PostCSS not available - custom CSS will not be added');\n return;\n }\n\n try {\n // Parse the CSS using PostCSS to get an AST\n const root = postcss.parse(rawCss);\n \n // Split nodes into base and utilities layers\n const baseNodes = [];\n const utilityNodes = [];\n \n root.each((node) => {\n // @keyframes, @font-face, @media, etc. go to base\n if (node.type === 'atrule') {\n // Special handling for @keyframes and other at-rules\n baseNodes.push(node);\n return;\n }\n \n // Regular rules\n if (node.type === 'rule') {\n // Class selectors starting with . go to utilities\n const isClassSelector = \n typeof node.selector === 'string' && \n node.selector.trim().startsWith('.');\n \n if (isClassSelector) {\n utilityNodes.push(node);\n } else {\n // Element selectors, IDs, attribute selectors, etc. go to base\n baseNodes.push(node);\n }\n return;\n }\n \n // Comments and other nodes go to base\n if (node.type !== 'comment') {\n baseNodes.push(node);\n }\n });\n \n // Add nodes to their respective layers\n // Tailwind accepts PostCSS nodes directly\n if (baseNodes.length > 0) {\n addBase(baseNodes);\n }\n \n if (utilityNodes.length > 0) {\n addUtilities(utilityNodes);\n }\n \n if (options.verbose) {\n console.log(`[FrontFriend] Added custom CSS: ${baseNodes.length} base rules, ${utilityNodes.length} utility classes`);\n }\n } catch (error) {\n console.error('[FrontFriend] Failed to parse custom CSS:', error.message);\n // Don't throw - just log the error and continue\n }\n } else if (!cache.custom) {\n // Check if custom.js file exists but failed to load\n const fs = require('fs');\n const path = require('path');\n const customJsPath = path.join(process.cwd(), 'node_modules', '.cache', 'frontfriend', 'custom.js');\n\n if (fs.existsSync(customJsPath)) {\n console.warn('[FrontFriend] custom.js file exists but failed to load. This may be due to a parsing error or BOM issue.');\n console.warn('[FrontFriend] Try deleting node_modules/.cache/frontfriend and running `npx frontfriend init` again.');\n }\n }\n\n // Log success\n if (options.verbose) {\n console.log('[FrontFriend] Plugin loaded successfully');\n console.log(`[FrontFriend] Colors: ${Object.keys(cache.variables || {}).length}`);\n console.log(`[FrontFriend] Semantic vars: ${Object.keys(cache.semanticVariables || {}).length}`);\n console.log(`[FrontFriend] Fonts: ${(cache.fonts || []).length}`);\n console.log(`[FrontFriend] Safelist classes: ${Array.isArray(cache.safelist) ? cache.safelist.length : 0}`);\n }\n };\n },\n function (options = {}) {\n // Return theme configuration\n let cache = null;\n if (CacheManager) {\n const cacheManager = new CacheManager(process.cwd());\n loadCachedComponents(cacheManager);\n cache = cacheManager.load();\n }\n\n // Default content paths matching the current-plugin approach\n const defaultContent = [\n './pages/**/*.{js,ts,jsx,tsx}',\n './components/**/*.{js,ts,jsx,tsx}',\n './app/**/*.{js,ts,jsx,tsx}',\n './src/**/*.{js,ts,jsx,tsx}',\n './stories/**/*.{js,ts,jsx,tsx}'\n ];\n\n // Log cache loading\n if (options.verbose && cache) {\n console.log('[FrontFriend] Cache loaded successfully');\n if (cache.safelist && Array.isArray(cache.safelist)) {\n console.log(`[FrontFriend] Loading ${cache.safelist.length} classes for safelist`);\n }\n }\n\n return {\n theme: {\n extend: {\n // Extend colors if needed\n colors: options.extendColors || {},\n // Extend animations if needed\n animation: options.extendAnimations || {},\n // Add custom spacing values\n spacing: {\n '18': '4.5rem',\n '88': '22rem',\n '128': '32rem'\n },\n // Add custom box shadows\n boxShadow: {\n 'top-sm': '0 -1px 1px 0 rgba(0, 0, 0, 0.05)'\n },\n // Add border radius values\n borderRadius: {\n '2xl': '1rem'\n },\n // Animation extensions\n animationDelay: ({ theme }) => ({\n ...theme(\"transitionDelay\"),\n }),\n animationDuration: ({ theme }) => ({\n 0: \"0ms\",\n ...theme(\"transitionDuration\"),\n }),\n animationTimingFunction: ({ theme }) => ({\n ...theme(\"transitionTimingFunction\"),\n }),\n animationFillMode: {\n none: \"none\",\n forwards: \"forwards\",\n backwards: \"backwards\",\n both: \"both\",\n },\n animationDirection: {\n normal: \"normal\",\n reverse: \"reverse\",\n alternate: \"alternate\",\n \"alternate-reverse\": \"alternate-reverse\",\n },\n animationOpacity: ({ theme }) => ({\n DEFAULT: 0,\n ...theme(\"opacity\"),\n }),\n animationTranslate: ({ theme }) => ({\n DEFAULT: \"100%\",\n ...theme(\"translate\"),\n }),\n animationScale: ({ theme }) => ({\n DEFAULT: 0,\n ...theme(\"scale\"),\n }),\n animationRotate: ({ theme }) => ({\n DEFAULT: \"30deg\",\n ...theme(\"rotate\"),\n }),\n animationRepeat: {\n 0: \"0\",\n 1: \"1\",\n infinite: \"infinite\",\n },\n keyframes: {\n enter: {\n from: {\n opacity: \"var(--tw-enter-opacity, 1)\",\n transform:\n \"translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))\",\n },\n },\n exit: {\n to: {\n opacity: \"var(--tw-exit-opacity, 1)\",\n transform:\n \"translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))\",\n },\n },\n },\n }\n },\n // Include safelist from cache and additional classes\n // Filter out file: variant classes \u2014 chaining file-selector-button with other\n // pseudo-elements (e.g. ::placeholder) produces invalid CSS that crashes Turbopack.\n safelist: [\n ...(cache?.safelist || []).filter(s => typeof s !== 'string' || !s.startsWith('file:')),\n {\n pattern: /(text|fill)-icon-(neutral|positive|negative|warning|info|highlight|interactive|brand|inverse|onpositive|onnegative|onwarning|oninfo|onhighlight|oninteractive|onbrand)-(mid|strong|subtle|low)(-(neutral|hover|active|selected|disabled))?$/,\n },\n {\n pattern: /^(layer-(below|surface|raised|popover|dialog|control)|overlay-(mid|strong|subtle|low))$/,\n },\n ],\n // Set content paths - merge options with defaults\n content: options.content || defaultContent\n };\n }\n);\n\n// Default export is the plugin\nmodule.exports = pluginExport;\n\n// Export components config and icons with getter functions\n// This allows dynamic resolution at runtime\n\n// Create getter for config\nObject.defineProperty(module.exports, 'config', {\n get: function () {\n // Check for webpack-injected global variable\n if (typeof __FF_CONFIG__ !== 'undefined') {\n return __FF_CONFIG__;\n }\n\n // Check if we're in a browser environment\n if (typeof window !== 'undefined' && window.__FF_CONFIG__) {\n return window.__FF_CONFIG__;\n }\n\n // Node.js: load from cache\n if (CacheManager) {\n try {\n const cacheManager = new CacheManager(process.cwd());\n if (cacheManager.exists()) {\n const cache = cacheManager.load();\n if (cache) {\n return cache.componentsConfig || null;\n }\n }\n } catch (error) {\n // Config not available\n }\n }\n\n return null;\n }\n});\n\n// Create getter for iconSet\nObject.defineProperty(module.exports, 'iconSet', {\n get: function () {\n // Check for webpack-injected global variable\n if (typeof __FF_ICONS__ !== 'undefined') {\n return __FF_ICONS__;\n }\n\n // Check if we're in a browser environment\n if (typeof window !== 'undefined' && window.__FF_ICONS__) {\n return window.__FF_ICONS__;\n }\n\n // Node.js: load from cache\n if (CacheManager) {\n try {\n const cacheManager = new CacheManager(process.cwd());\n if (cacheManager.exists()) {\n const cache = cacheManager.load();\n if (cache) {\n return cache.icons || null;\n }\n }\n } catch (error) {\n // Icons not available\n }\n }\n\n return null;\n }\n});\n\n// Export shared componentsConfig schema utilities\nmodule.exports.componentsConfigSchema = componentsConfigSchema;\nmodule.exports.isCSSClassString = isCSSClassString;\n\n// Export ffdc utility\nmodule.exports.ffdc = require('./ffdc.js');\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["require_components_config_schema", "__commonJSMin", "exports", "module", "componentsConfigSchema", "isCSSClassString", "value", "require_cached_components_config", "__commonJSMin", "exports", "module", "CACHE_ERROR_MESSAGE", "SAAS_ERROR_MESSAGE", "isPlainObject", "value", "assertComponentsConfig", "componentsConfig", "message", "loadCachedComponents", "cacheManager", "cache", "require_file_utils", "__commonJSMin", "exports", "module", "fs", "readJsonFileSafe", "filepath", "content", "error", "readFileSafe", "writeJsonFile", "data", "indent", "writeTextFile", "writeModuleExportsFile", "fileExists", "ensureDirectoryExists", "dirpath", "removeDirectory", "require_package", "__commonJSMin", "exports", "module", "require_main", "__commonJSMin", "exports", "module", "fs", "path", "os", "crypto", "packageJson", "version", "LINE", "parse", "src", "obj", "lines", "match", "key", "value", "maybeQuote", "_parseVault", "options", "vaultPath", "_vaultPath", "result", "DotenvModule", "err", "keys", "_dotenvKey", "length", "decrypted", "attrs", "_instructions", "error", "_warn", "message", "_debug", "_log", "dotenvKey", "uri", "environment", "environmentKey", "ciphertext", "possibleVaultPath", "filepath", "_resolveHome", "envPath", "_configVault", "debug", "quiet", "parsed", "processEnv", "configDotenv", "dotenvPath", "encoding", "optionPaths", "lastError", "parsedAll", "e", "keysCount", "shortPaths", "filePath", "relative", "config", "decrypt", "encrypted", "keyStr", "nonce", "authTag", "aesgcm", "isRange", "invalidKeyLength", "decryptionFailed", "populate", "override", "require_env_utils", "__commonJSMin", "exports", "module", "path", "fileExists", "loadEnvLocal", "cwd", "envLocalPath", "getEnvVar", "name", "defaultValue", "isEnvTrue", "require_components_config_v4", "__commonJSMin", "exports", "module", "isPlainObject", "value", "deepMerge", "left", "right", "result", "key", "findTreeConflicts", "path", "conflicts", "isV4Envelope", "toRuntimeComponentConfig", "envelope", "component", "toRuntimeComponentsConfig", "config", "changed", "name", "require_ffdc", "__commonJSMin", "exports", "module", "componentsConfigSchema", "isCSSClassString", "toRuntimeComponentsConfig", "ffdc", "config", "plugin", "componentsConfigSchema", "isCSSClassString", "postcss", "CacheManager", "loadCachedComponents", "loadEnvLocal", "filterDefault", "values", "key", "pluginExport", "options", "addBase", "addUtilities", "theme", "matchUtilities", "cacheManager", "cache", "rootVars", "value", "darkVars", "semanticUtilities", "cssVar", "match", "prefix", "name", "className", "bgUtilities", "textUtilities", "borderUtilities", "fillUtilities", "textIconUtilities", "fontUtilities", "fontFace", "rawCss", "root", "baseNodes", "utilityNodes", "node", "error", "fs", "customJsPath", "defaultContent", "s"]
|
|
7
7
|
}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createRequire as
|
|
1
|
+
import{createRequire as d}from"module";var f=d(import.meta.url),{componentsConfigSchema:S,isCSSClassString:O}=f("./lib/core/components-config-schema.js"),_=typeof window<"u"&&typeof window.document<"u",s=typeof process<"u"&&process.versions&&process.versions.node,i=null,y=s?function(...t){if(!i)try{i=f("module").createRequire(import.meta.url)("./index.js")}catch(e){return console.error("[FrontFriend] Failed to load plugin:",e),{}}return typeof i=="function"?i(...t):i}:function(){return _&&console.warn("[FrontFriend] The Tailwind plugin cannot be used directly in browser environments"),{}};function u(){let t=new Map,e={get(n,r){return r===Symbol.toPrimitive||r==="valueOf"?()=>"":r==="toString"||r===Symbol.toStringTag?()=>"":r==="constructor"?Object:(t.has(r)||t.set(r,u()),t.get(r))},has(n,r){return!(typeof r=="symbol"&&r.toString().includes("nodejs.util.inspect"))},ownKeys(n){return[]},getOwnPropertyDescriptor(n,r){return{enumerable:!0,configurable:!0}}};return new Proxy({},e)}function c(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function a(t,e){if(!c(t)||!c(e))return e===void 0?t:e;let n={...t};for(let[r,o]of Object.entries(e))n[r]=r in n?a(n[r],o):o;return n}function l(t,e,n=[],r=[]){if(t===void 0||e===void 0)return r;if(!c(t)||!c(e))return r.push(n.join(".")),r;for(let o of Object.keys(t))o in e&&l(t[o],e[o],[...n,o],r);return r}function F(t,e=[]){if(!c(t)||!("styles"in t||"behavior"in t))return t;let n=l(t.styles,t.behavior,e);if(n.length>0)throw new Error(`Component config styles/behavior conflict at ${n.join(", ")}`);return a(t.styles||{},t.behavior||{})}function g(t){let e=!1,n={};for(let[r,o]of Object.entries(t))n[r]=F(o,[r]),n[r]!==o&&(e=!0);return e?n:t}function h(t){return!t||typeof t!="object"?u():g(t)}var m=new Proxy({},{_cjsConfig:null,_proxyCache:new Map,get(t,e){if(e===Symbol.toPrimitive||e==="valueOf")return()=>"";if(e==="toString"||e===Symbol.toStringTag)return()=>"[object Object]";if(e==="constructor")return Object;if(s&&!this._cjsConfig&&i&&(this._cjsConfig=i.config),s&&this._cjsConfig&&e in this._cjsConfig)return this._cjsConfig[e];let n=null;if(typeof __FF_CONFIG__<"u")n=__FF_CONFIG__;else if(typeof process<"u"&&process.env){if(process.env.NEXT_PUBLIC_FF_CONFIG)try{n=JSON.parse(process.env.NEXT_PUBLIC_FF_CONFIG)}catch{console.warn("[FrontFriend] Failed to parse NEXT_PUBLIC_FF_CONFIG")}else if(process.env.__FF_CONFIG__)try{n=JSON.parse(process.env.__FF_CONFIG__)}catch{console.warn("[FrontFriend] Failed to parse __FF_CONFIG__")}}else _&&window.__FF_CONFIG__&&(n=window.__FF_CONFIG__);return n&&e in n?F(n[e],[String(e)]):(this._proxyCache.has(e)||this._proxyCache.set(e,u()),this._proxyCache.get(e))},has(t,e){return!0},ownKeys(t){return[]},getOwnPropertyDescriptor(t,e){return{enumerable:!0,configurable:!0}}}),w=new Proxy({},{_cjsIconSet:null,get(t,e){if(e===Symbol.toPrimitive||e==="valueOf")return()=>"";if(e==="toString"||e===Symbol.toStringTag)return()=>"[object Object]";if(e==="constructor")return Object;if(s&&!this._cjsIconSet&&i&&(this._cjsIconSet=i.iconSet),s&&this._cjsIconSet&&e in this._cjsIconSet)return this._cjsIconSet[e];let n=null;if(typeof __FF_ICONS__<"u")n=__FF_ICONS__;else if(typeof process<"u"&&process.env){if(process.env.NEXT_PUBLIC_FF_ICONS)try{n=JSON.parse(process.env.NEXT_PUBLIC_FF_ICONS)}catch{console.warn("[FrontFriend] Failed to parse NEXT_PUBLIC_FF_ICONS")}else if(process.env.__FF_ICONS__)try{n=JSON.parse(process.env.__FF_ICONS__)}catch{console.warn("[FrontFriend] Failed to parse __FF_ICONS__")}}else _&&window.__FF_ICONS__&&(n=window.__FF_ICONS__);return n&&e in n?n[e]:null},has(t,e){return!1},ownKeys(t){return[]},getOwnPropertyDescriptor(t,e){}});var I=y;export{S as componentsConfigSchema,m as config,I as default,h as ffdc,w as iconSet,O as isCSSClassString};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|