@donotdev/core 0.0.32 → 0.0.34

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/vite/index.js CHANGED
@@ -1,10 +1,10 @@
1
- var Kt=Object.defineProperty;var je=(n,e)=>()=>(n&&(e=n(n=0)),e);var Zt=(n,e)=>{for(var t in e)Kt(n,t,{get:e[t],enumerable:!0})};function nt(n,e=null){let t=Q[n];if(!t)throw new Error(`Unknown pattern type: ${n}`);return e&&t.framework?{...t,framework:t.framework.map(s=>`${e}/${s}`)}:t}function ke(n){return rt[n]||rt.base}var Ge,C,B,z,We,we,De,Q,he,ot,Be,Ve,xe,He,rt,j=je(()=>{"use strict";Ge={HOMEPAGE_FILE:"HomePage.tsx",HOMEPAGE_PATH:"/",HOMEPAGE_COMPONENT:"HomePage"},C={routes:"virtual:routes",themes:"virtual:themes",i18n:"virtual:i18n-mapping",assets:"virtual:assets",env:"virtual:env"},B={routes:"routes",themes:"themes",i18n:"i18n",assets:"assets",env:"env"},z={next:{middleware:"middleware.ts",routeManifest:"public/route-manifest.json",assetManifest:"public/asset-manifest.json",utilities:"src/styles/utilities.generated.css",appPages:"src/app",appLayout:"src/app/layout.tsx",configRoute:"src/config/dndev-config-route.js",configTheme:"src/config/dndev-config-theme.js",configI18n:"src/config/dndev-config-i18n.js",configPwa:"src/config/dndev-config-pwa.js",configAsset:"src/config/dndev-config-asset.js",configSeo:"src/config/dndev-config-seo.js",configServer:"src/config/dndev-config-server.js"},vite:{routeInspection:"src/routes.generated.log",themeInspection:"src/themes.generated.log",i18nInspection:"src/i18n.generated.log",assetInspection:"src/assets.generated.log",envInspection:"src/env.generated.log"},manifests:{route:"route-manifest.json",theme:"theme-manifest.json",i18n:"i18n-manifest.json",asset:"asset-manifest.json",feature:"feature-manifest.json",env:"env-manifest.json"}},We={package:"@donotdev/ui",assetsPath:"packages/ui/assets",browserTargets:["> 1%","last 2 versions","Firefox ESR","not dead","not op_mini all"]},we={public:"public",fonts:"fonts",nodeModules:"node_modules",packages:"packages",core:"core",ui:"ui"},De={SOURCE_ROOT:"packages/core/i18n",SOURCE_LOCALES:"packages/core/i18n/locales",SOURCE_EAGER:"packages/core/i18n/locales/eager",SOURCE_LAZY:"packages/core/i18n/locales/lazy",PUBLISHED_ROOT:"i18n",PUBLISHED_LOCALES:"i18n/locales",PUBLISHED_EAGER:"i18n/locales/eager",PUBLISHED_LAZY:"i18n/locales/lazy"},Q={routes:{consumer:["src/**/*Page.tsx","src/pages/**/*Page.tsx"],exclude:["**/node_modules/**","**/dist/**","**/build/**","**/*.test.tsx","**/*.stories.tsx"],extensions:[".tsx"]},css:{consumer:["src/**/*.css"],themes:["src/**/*.css"],extensions:[".css",".scss",".sass"],framework:["packages/ui/src/**/*.css","packages/core/components/src/**/*.css","packages/core/templates/src/**/*.css"]},i18n:{eager:["src/locales/*_*.json"],lazy:["src/**/locales/*_*.json","!src/locales/*_*.json","../../entities/locales/*_*.json"],additional:[],framework:{eager:[`${De.SOURCE_EAGER}/*_*.json`],lazy:[`${De.SOURCE_LAZY}/*_*.json`]},extensions:[".json"]},assets:{consumer:["public/**/*"],fallback:["manifest.json"],modern:["logo.svg","favicon.svg","apple-touch-icon.png","android-chrome-192x192.png","android-chrome-512x512.png"],patterns:["favicon.svg","favicon.ico","favicon-*.png","logo.svg","logo.png","logo.webp","logo.avif","apple-touch-icon*.png","android-chrome-*.png","manifest.json"],fonts:["fonts/**/*.woff2","fonts/**/*.woff","fonts/**/*.ttf"],framework:["packages/ui/assets/**/*"]},pwa:{consumer:["public/manifest.json","public/service-worker.js","public/sw.js","public/icon-192x192.png","public/icon-512x512.png","public/favicon.ico","public/favicon.svg","public/apple-touch-icon.png","public/logo.svg"],exclude:["**/node_modules/**","**/dist/**","**/build/**"],extensions:[".json",".js",".png",".svg",".ico"],framework:["packages/ui/assets/**/*"]},globalIgnore:["**/node_modules/**","**/dist/**","**/build/**","**/.git/**","**/coverage/**","**/test/**"]},he={mandatoryIncludes:["react","react-dom","react-router-dom","zustand","lucide-react","valibot","i18next","i18next-browser-languagedetector","i18next-http-backend","react-i18next","@tanstack/react-query","react-helmet-async","@donotdev/core","@donotdev/components","@donotdev/ui","@donotdev/templates","@donotdev/firebase"],optionalFeatures:["@donotdev/components","@donotdev/auth","@donotdev/billing","@donotdev/crud","@donotdev/oauth","shiki","@tiptap/react","@tiptap/starter-kit","@tiptap/extension-placeholder"],coreBundled:["@donotdev/types","@donotdev/utils","@donotdev/stores","@donotdev/schemas","@donotdev/hooks","@donotdev/i18n","@donotdev/config"],componentsBundled:["class-variance-authority","clsx","lucide-react","react-day-picker"],radixUIPattern:"@radix-ui/",buildTools:["esbuild","@esbuild/win32-x64","@esbuild/darwin-x64","@esbuild/linux-x64","@esbuild/darwin-arm64","@esbuild/linux-arm64","vite","rollup","rollup-plugin-visualizer","@vitejs/plugin-react","vite-tsconfig-paths","vite-plugin-pwa","vite-plugin-compression2","vite-plugin-node-polyfills","fsevents","postcss","postcss-import","postcss-nesting","autoprefixer"],buildTimePackages:[],largeOptional:["@sentry/react","framer-motion","stripe","@tanstack/react-query","shiki","@tiptap/react","@tiptap/starter-kit","@tiptap/extension-placeholder","sharp","semver","file-type"]},ot=["firebase-admin","gcp-metadata","google-logging-utils","payload","undici","@fastify/busboy","image-size","@donotdev/tooling","fs","path","crypto","net","tls","http","https","child_process","os","util","stream","buffer","events","querystring","url","zlib","assert","constants","domain","punycode","string_decoder","timers","tty","vm","worker_threads","cluster","dgram","dns","http2","inspector","module","perf_hooks","process","readline","repl","trace_events","v8","wasi"],Be=["@donotdev/core/functions","@donotdev/core/server"],Ve={selectors:{class:/\.([a-zA-Z0-9-]+)/g,variable:/--[a-zA-Z0-9-]+/g,keyframe:/@keyframes\s+([a-zA-Z0-9-]+)/g},themes:{themeClass:/(?::root\.|\.)([a-z][a-z0-9-]+)\s*\{([\s\S]*?)\}/gim,themeLabel:/--theme-label\s*:\s*['"]([^'"]+)['"]/,themeIcon:/--theme-icon\s*:\s*['"]([^'"]+)['"]/,themeIsDark:/--theme-is-dark\s*:\s*(0|1)/}},xe={Inter:"inter-latin","Space Grotesk":"space-grotesk-latin","Playfair Display":"playfair-display-latin","Press Start 2P":"press-start-2p-latin",Roboto:"roboto-latin"},He=[{name:"light",displayName:"Light",icon:"Sun",isDark:!1}],rt={base:{absolute:!0,onlyFiles:!0,ignore:Q.globalIgnore},css:{absolute:!0,onlyFiles:!0,ignore:[...Q.globalIgnore,"**/*.test.css"]},routes:{absolute:!0,onlyFiles:!0,ignore:[...Q.globalIgnore,"**/*.test.tsx","**/*.stories.tsx"]},i18n:{absolute:!0,onlyFiles:!0,ignore:Q.globalIgnore},assets:{absolute:!0,onlyFiles:!0,ignore:Q.globalIgnore}}});import*as P from"node:fs";import"node:fs";import{createRequire as os}from"node:module";import{resolve as Ae,join as ce,dirname as pe,relative as at,normalize as ns,sep as it,extname as as}from"node:path";import{fileURLToPath as is}from"node:url";import ls from"fast-glob";function lt(n,e){return n().catch(t=>{throw new Error(`${e}: ${t instanceof Error?t.message:String(t)}`)})}var ve,U,ct,O,q=je(()=>{"use strict";j();ve={getGlobOptionsFor:ke||void 0,SCAN_PATTERNS:Q||void 0,getPatternsFor:nt||void 0,I18N_PATHS:De||void 0},U={error:(n,e)=>{},warn:(n,e)=>{},info:n=>{}};ct={CLI:"packages/cli",COMPONENTS:"packages/core/components",CONFIG:"packages/core/config",CORE:"packages/core",CRUD:"packages/core/crud",FEATURES:"packages/features",HOOKS:"packages/core/hooks",I18N:"packages/core/i18n",SCHEMAS:"packages/core/schemas",STORES:"packages/core/stores",TEMPLATES:"packages/templates",TOOLING:"packages/tooling",TYPES:"packages/core/types",UI:"packages/ui",UTILS:"packages/core/utils",AUTH:"packages/features/auth",BILLING:"packages/features/billing",OAUTH:"packages/features/oauth",FIREBASE:"packages/providers/firebase",FUNCTIONS:"packages/functions"},O=class n{static _instance=null;options;_repoRoot;_appRoot=null;static getInstance(e={}){return n._instance||(n._instance=new n(e)),n._instance}static _reset(){n._instance=null}constructor(e={}){if(n._instance)return n._instance;this.options={maxLevels:e.maxLevels??10,customMarkers:e.customMarkers||[],cache:e.cache??!1,debug:e.debug??!1};try{let t=process.cwd();if(!t)throw new Error("PathResolver: process.cwd() returned undefined. This should never happen.");this._repoRoot=this._findRepoRoot(t)}catch(t){throw new Error(`PathResolver constructor failed: ${t instanceof Error?t.message:String(t)}. cwd: ${process.cwd()}`)}this._appRoot=null,n._instance=this}normalizePath(e){if(!e)return"";try{return ns(e).split(it).join("/")}catch{return String(e).split(it).join("/")}}getRelativePath(e){let t=this.getAppRoot(),s=at(t,e);return this.normalizePath(s)}getBasename(e){if(!e)return"";let s=this.normalizePath(e).split("/");return s[s.length-1]||""}getDirname(e){return e?this.normalizePath(pe(e)):""}resolvePackage(e,t=null){try{let s=t||this.getAppRoot(),o=os(ce(s,"package.json")).resolve(e);return this.normalizePath(o)}catch{return null}}resolveFrameworkPackage(e,t=null){let s=this.resolvePackage(`${e}/package.json`,t);if(s)return this.getDirname(s);if(this.isMonorepo()&&e.startsWith("@donotdev/")){let a=e.replace("@donotdev/",""),i=this.resolveRepoPath(`packages/${a}`);if(this.pathExists(i))return i;if(["auth","billing","crud","oauth"].includes(a)){let l=this.resolveRepoPath(`packages/features/${a}`);if(this.pathExists(l))return l}if(a==="firebase"){let l=this.resolveRepoPath(`packages/providers/${a}`);if(this.pathExists(l))return l}}let r=this.resolveAppPath(`node_modules/${e}`);if(this.pathExists(r))return r;let o=this.resolveRepoPath(`node_modules/${e}`);return this.pathExists(o)?o:null}resolvePackageAsset(e,t=null){return this.resolvePackage(e,t)}resolveAppPath(e){let t=this.getAppRoot(),s=Ae(t,e);return this.normalizePath(s)}resolveRepoPath(e){let t=this.getRepoRoot(),s=this.normalizePath(e),r=Ae(t,s);return this.normalizePath(r)}resolvePath(e,t){let s=this.normalizePath(t),r=this.normalizePath(e),o=Ae(s,r);return this.normalizePath(o)}createImportPath(e){return"./"+this.getRelativePath(e)}getFileInfo(e){try{let t=P.statSync(e);return{absolutePath:this.normalizePath(e),relativePath:this.getRelativePath(e),importPath:this.createImportPath(e),size:t.size,isFile:t.isFile(),isDirectory:t.isDirectory()}}catch{return null}}_detectFormat(e,t){return t&&t!=="auto"?t:as(e).toLowerCase()===".json"?"json":"text"}async read(e,t={}){let{format:s="auto",encoding:r="utf8"}=t,o=this._detectFormat(e,s);try{if(o==="buffer")return await P.promises.readFile(e);let a=await P.promises.readFile(e,r),i=this.stripBom(a);return o==="json"?JSON.parse(i):i}catch(a){return this.options.debug&&U.warn(`Failed to read file: ${e}`,a),null}}readSync(e,t={}){let{format:s="auto",encoding:r="utf8"}=t,o=this._detectFormat(e,s);try{if(o==="buffer")return P.readFileSync(e);let a=P.readFileSync(e,r),i=this.stripBom(a);return o==="json"?JSON.parse(i):i}catch(a){return this.options.debug&&U.warn(`Failed to read file: ${e}`,a),null}}async write(e,t,s={}){let{format:r="auto",overwrite:o=!1,dryRun:a=!1,verbose:i=!1}=s,l=this.normalizePath(e),u=this.normalizePath(pe(l)),c=this.pathExists(l);if(c&&!o)return i&&U.info(`Skipping existing file: ${l}`),!1;if(a)return U.info(`[DRY RUN] Would write file: ${l}`),!0;try{await P.promises.mkdir(u,{recursive:!0})}catch(d){if(d?.code!=="EEXIST")throw d}let p=this._detectFormat(e,r),g;Buffer.isBuffer(t)?g=t:p==="json"&&typeof t=="object"?g=JSON.stringify(t,null,2):g=String(t);try{return await lt(async()=>(Buffer.isBuffer(g)?await P.promises.writeFile(l,g):await P.promises.writeFile(l,g,"utf8"),i&&U.info(`${c?"Updated":"Created"} file: ${l}`),!0),`Failed to write file: ${l}`)}catch{return!1}}writeSync(e,t,s={}){let{format:r="auto",overwrite:o=!1,dryRun:a=!1,verbose:i=!1}=s,l=this.normalizePath(e),u=this.normalizePath(pe(l)),c=this.pathExists(l);if(c&&!o)return i&&U.info(`Skipping existing file: ${l}`),!1;if(a)return U.info(`[DRY RUN] Would write file: ${l}`),!0;try{P.mkdirSync(u,{recursive:!0})}catch(d){if(d?.code!=="EEXIST")throw d}let p=this._detectFormat(e,r),g;Buffer.isBuffer(t)?g=t:p==="json"&&typeof t=="object"?g=JSON.stringify(t,null,2):g=String(t);try{return Buffer.isBuffer(g)?P.writeFileSync(l,g):P.writeFileSync(l,g,"utf8"),i&&U.info(`${c?"Updated":"Created"} file: ${l}`),!0}catch(d){throw new Error(`Failed to write file: ${l}: ${d instanceof Error?d.message:String(d)}`)}}async copy(e,t,s={}){let{overwrite:r=!1,dryRun:o=!1,verbose:a=!1}=s,i=this.normalizePath(t),l=this.pathExists(i);if(l&&!r)return a&&U.info(`Skipping existing file: ${i}`),!1;if(o)return U.info(`[DRY RUN] Would copy file: ${i}`),!0;let u=this.normalizePath(pe(i));try{await P.promises.mkdir(u,{recursive:!0})}catch(c){if(c?.code!=="EEXIST")throw c}try{return await lt(async()=>(await P.promises.copyFile(e,i),a&&U.info(`${l?"Updated":"Created"} file: ${i}`),!0),`Failed to copy file from ${e} to ${i}`)}catch{return!1}}copySync(e,t,s={}){let{overwrite:r=!1,dryRun:o=!1,verbose:a=!1}=s,i=this.normalizePath(t),l=this.pathExists(i);if(l&&!r)return a&&U.info(`Skipping existing file: ${i}`),!1;if(o)return U.info(`[DRY RUN] Would copy file: ${i}`),!0;let u=this.normalizePath(pe(i));try{P.mkdirSync(u,{recursive:!0})}catch(c){if(c?.code!=="EEXIST")throw c}try{return P.copyFileSync(e,i),a&&U.info(`${l?"Updated":"Created"} file: ${i}`),!0}catch{return!1}}pathExists(e,t=!1){try{return P.existsSync(e)}catch(s){return t||U.error(`Error checking path existence: ${e}`,s),!1}}mkdir(e){try{let t=e.startsWith("/")||e.match(/^[A-Z]:/)?this.normalizePath(e):this.resolveAppPath(e);return P.existsSync(t)||P.mkdirSync(t,{recursive:!0}),!0}catch{return!1}}readdirSync(e,t){try{return P.readdirSync(e,t)}catch(s){return this.options.debug&&U.warn(`Failed to read directory: ${e}`,s),t&&typeof t=="object"&&"withFileTypes"in t&&t.withFileTypes?[]:[]}}statSync(e){try{return P.statSync(e)}catch(t){return this.options.debug&&U.warn(`Failed to stat file: ${e}`,t),null}}lstatSync(e){try{return P.lstatSync(e)}catch(t){return this.options.debug&&U.warn(`Failed to lstat file: ${e}`,t),null}}async ensureDir(e){try{await P.promises.mkdir(e,{recursive:!0})}catch(t){if(t?.code!=="EEXIST")throw t}}ensureDirSync(e){try{P.mkdirSync(e,{recursive:!0})}catch(t){if(t?.code!=="EEXIST")throw t}}async remove(e){await P.promises.rm(e,{recursive:!0,force:!0})}removeSync(e){P.rmSync(e,{recursive:!0,force:!0})}async readdir(e,t){return P.promises.readdir(e,t)}stripBom(e){return e.charCodeAt(0)===65279?e.slice(1):e}getRepoRoot(){return this._repoRoot||process.cwd()}getAppRoot(){return this._appRoot?this._appRoot:this._repoRoot}setAppRoot(e){if(!e)throw new Error("PathResolver.setAppRoot: root cannot be undefined or null");this._appRoot=this.normalizePath(e)}isMonorepo(){let e=ce(this._repoRoot,"packages");return this.pathExists(e)}isWithinApp(e){let t=this.normalizePath(Ae(e)),s=this.getAppRoot(),r=at(s,t),o=this.normalizePath(r);return!o.startsWith("../")&&!o.startsWith("/")}async findFiles(e,t,s={}){let r=this.normalizePath(ce(e,t)),o=this.getAppRoot(),a=this.normalizePath(o),i=r.startsWith(a)?r.slice(a.length+1):r,l={absolute:!0,onlyFiles:!0,braceExpansion:!0,extglob:!0,globstar:!0,cwd:o,ignore:ve.SCAN_PATTERNS?.globalIgnore||["**/node_modules/**","**/dist/**","**/build/**","**/.git/**"]};return await this._globWithNormalization([i],{...l,...s})}clearCache(){}async _resolveFrameworkI18nPattern(e){let t=ve.I18N_PATHS;if(!t)return null;let s=e.replace(t.SOURCE_ROOT+"/",""),r=this.resolveFrameworkPackage("@donotdev/core");if(!r)return null;let o=this.normalizePath(ce(r,t.PUBLISHED_ROOT,s)),a=o.replace(/\/[^/]*\*.*$/,"");return this.pathExists(a),o}async _globWithNormalization(e,t){return(await ls(e,t)).map(r=>{let o=typeof r=="string"?r:r.path;return this.normalizePath(o)})}async resolveFiles(e,t="css"){if(!e||typeof e!="object")return{frameworkFiles:[],consumerFiles:[]};if(t==="i18n")return{frameworkFiles:[],consumerFiles:[]};if(Array.isArray(e.framework)||(e.framework=[]),!Array.isArray(e.consumer))return{frameworkFiles:[],consumerFiles:[]};let s=[...e.framework,...e.consumer];for(let c of s)if(typeof c!="string"||c.trim()==="")return{frameworkFiles:[],consumerFiles:[]};let r=this.getAppRoot(),o=ve.getGlobOptionsFor?ve.getGlobOptionsFor(t):{ignore:["**/node_modules/**","**/dist/**","**/build/**"]},a=this.normalizePath(r),i=e.framework.map(c=>{let p=this.normalizePath(c);return p.startsWith(a)?p.slice(a.length+1):p}),l=e.consumer.map(c=>{let p=this.normalizePath(c);return p.startsWith(a)?p.slice(a.length+1):p}),u={...o,onlyFiles:!0,absolute:!0,braceExpansion:!0,extglob:!0,globstar:!0,cwd:r};try{let c=i.length>0?await this._globWithNormalization(i,u):[],p=await this._globWithNormalization(l,u);return{frameworkFiles:c,consumerFiles:p}}catch{return this.options.debug,{frameworkFiles:[],consumerFiles:[]}}}async resolvePatterns(e){if(!ve.getPatternsFor)return{framework:[],consumer:[],all:[]};let t=this.getAppRoot(),s=this.getRepoRoot();if(e==="i18n"&&(!t||t===s))throw new Error(`Cannot resolve i18n patterns: appRoot not set (appRoot: ${t}, repoRoot: ${s}). Ensure configResolved hook has run before discovery.`);let r=ve.getPatternsFor(e),o=this.isMonorepo();if(e==="i18n"){let l=r,u={eager:l.eager.map(c=>c.startsWith("!")?"!"+this.resolveAppPath(c.slice(1)):this.resolveAppPath(c)),lazy:l.lazy.map(c=>c.startsWith("!")?"!"+this.resolveAppPath(c.slice(1)):this.resolveAppPath(c)),framework:{eager:o?(l.framework?.eager||[]).map(c=>this.resolveRepoPath(c)).filter(Boolean):await Promise.all((l.framework?.eager||[]).map(c=>this._resolveFrameworkI18nPattern(c))).then(c=>c.filter(Boolean)),lazy:o?(l.framework?.lazy||[]).map(c=>this.resolveRepoPath(c)).filter(Boolean):await Promise.all((l.framework?.lazy||[]).map(c=>this._resolveFrameworkI18nPattern(c))).then(c=>c.filter(Boolean))},all:[]};return u.all=[...u.eager,...u.lazy,...u.framework.eager,...u.framework.lazy],u}let a=r,i={framework:o?(a.framework||[]).map(l=>this.resolveRepoPath(l)).filter(Boolean):[],consumer:(a.consumer||[]).map(l=>this.resolveAppPath(l)),all:[]};return i.all=[...i.consumer,...i.framework],i}getEmptyModulePath(e=!1){if(e)return"@donotdev/core/empty";let t=this.resolvePackage("@donotdev/core/empty");if(t)return t;let s=pe(is(import.meta.url));return this.normalizePath(ce(s,"../empty.js"))}_findRepoRoot(e){let t=this.normalizePath(e),s=0,r=this.options.maxLevels;for(;s<r;){let o=this.normalizePath(ce(t,ct.TOOLING)),a=this.normalizePath(ce(t,ct.CORE));if(this.pathExists(o)&&this.pathExists(a))return t;let i=ce(t,"apps");if(this.pathExists(i)&&this.statSync(i)?.isDirectory())return this.normalizePath(t);let l=this.normalizePath(ce(t,"package.json"));if(this.pathExists(l)&&this.normalizePath(pe(t))===t)return t;let u=this.normalizePath(pe(t));if(u===t)break;t=u,s++}return this.normalizePath(e)}}});var Ht={};Zt(Ht,{createDndevPlugin:()=>nr});import{realpathSync as js,watch as Us}from"node:fs";import{execSync as Me,spawn as Gs}from"node:child_process";function J(){return O.getInstance()}function Ut(){return J().getRepoRoot()}function Gt(){return J().resolveRepoPath(".dndev")}function y(n,e,t=200){n.writeHead(t,{"Content-Type":"application/json"}),n.end(JSON.stringify(e))}function Pe(n,e=Ws){return new Promise((t,s)=>{let r="",o=0;n.on("data",a=>{if(o+=a.length,o>e){n.destroy(),s(new Error("Request body too large"));return}r+=a.toString()}),n.on("end",()=>t(r)),n.on("error",s)})}function Bs(n){let e=n.lastIndexOf(".");return e===-1?"":n.slice(e).toLowerCase()}function Vs(){let n=J(),e=[],t=process.env.HOME||process.env.USERPROFILE||"";try{let r=process.platform==="win32"?"where node":"which node",o=Me(r,{encoding:"utf8"}).trim().split(`
2
- `)[0];e.push(o)}catch{}let s=[process.env.NVM_DIR,n.resolvePath(".nvm",t)].filter(Boolean);for(let r of s)try{let o=n.resolvePath("versions/node",r),a=n.readdirSync(o).filter(i=>i.startsWith("v")).sort().reverse();for(let i of a)e.push(n.resolvePath(`${i}/bin/node`,o))}catch{}if(process.env.NVM_BIN&&e.push(n.resolvePath("node",process.env.NVM_BIN)),process.platform==="win32"){e.push("C:\\Program Files\\nodejs\\node.exe");let r=process.env.APPDATA||"";if(r)try{let o=n.resolvePath("nvm",r),a=n.readdirSync(o).filter(i=>i.startsWith("v")).sort().reverse();for(let i of a)e.push(n.resolvePath(`${i}/node.exe`,o))}catch{}}else e.push("/usr/local/bin/node","/usr/bin/node");for(let r of e)try{let o=js(r);if(o.includes("bun")||!n.pathExists(o))continue;return r}catch{continue}return"node"}function Wt(n){if(!n||typeof n!="string"||n.includes("\0"))return!1;let e=n.split(/[/\\]/).filter(Boolean);for(let t of e)if(t==="."||t===".."||t==="node_modules"||t===".git"||t.startsWith(".")&&t!==".dndev")return!1;return!0}function Hs(n){return n.includes("..")?!1:n.startsWith(".dndev/")||n.startsWith("docs/")||n.startsWith("guides/")}function Bt(n){let e=J(),t=e.getRepoRoot(),s=e.resolvePath(n,t),r=e.normalizePath(t),o=e.normalizePath(s);return!o.startsWith(r+"/")&&o!==r?null:s}async function qs(n,e){let s=new URL(n.url,`http://${n.headers.host}`).searchParams.get("path");if(!s)return y(e,{error:"path parameter required"},400);if(!Wt(s))return y(e,{error:"Access denied"},403);let r=Bt(s);if(!r)return y(e,{error:"Access denied"},403);let o=J();if(!o.pathExists(r))return y(e,{error:"File not found"},404);let a=Bs(r);if(Js.has(a)){let i=o.readSync(r,{format:"buffer"});return i?(e.writeHead(200,{"Content-Type":Vt[a]||"application/octet-stream","Content-Length":i.byteLength}),void e.end(Buffer.from(i))):y(e,{error:"Failed to read file"},500)}if(a===".json")try{let i=await o.read(r);return i===null?y(e,{error:"Failed to read file"},500):y(e,{path:s,content:i})}catch{return y(e,{error:"Invalid JSON"},500)}try{let i=await o.read(r,{format:"text"});if(i===null)return y(e,{error:"Failed to read file"},500);y(e,{path:s,content:i})}catch{y(e,{error:"Failed to read file"},500)}}function Ys(n,e){let s=new URL(n.url,`http://${n.headers.host}`).searchParams.get("dir"),r=J(),o=r.getRepoRoot(),a=[],i=new Set(["node_modules",".git","dist","build",".next",".expo"]);function l(c,p){try{let g=r.readdirSync(c,{withFileTypes:!0});for(let d of g){let h=p?`${p}/${d.name}`:d.name;d.isDirectory()&&i.has(d.name)||(d.isDirectory()?(a.push({path:h,name:d.name,isDirectory:!0}),l(r.resolvePath(d.name,c),h)):d.name.endsWith(".md")&&a.push({path:h,name:d.name,isDirectory:!1}))}}catch{}}let u=[".dndev","docs","guides"];if(s){if(s.includes("..")||s.includes("\0"))return y(e,{error:"Access denied"},403);if(!u.includes(s)&&!u.some(d=>s.startsWith(d+"/")))return y(e,{error:"Directory not allowed"},403);let c=r.resolvePath(s,o),p=r.normalizePath(o);if(!r.normalizePath(c).startsWith(p+"/"))return y(e,{error:"Access denied"},403);r.pathExists(c)&&(a.push({path:s,name:r.getBasename(s),isDirectory:!0}),l(c,s))}else{for(let c of u){let p=r.resolveRepoPath(c);r.pathExists(p)&&(a.push({path:c,name:c,isDirectory:!0}),l(p,c))}try{let c=r.readdirSync(o,{withFileTypes:!0});for(let p of c)!p.isDirectory()&&p.name.endsWith(".md")&&a.push({path:p.name,name:p.name,isDirectory:!1})}catch{}}y(e,{entries:a})}async function Ks(n,e){let s=new URL(n.url,`http://${n.headers.host}`).searchParams.get("path");if(!s)return y(e,{error:"path parameter required"},400);if(!Wt(s))return y(e,{error:"Access denied"},403);if(!Hs(s))return y(e,{error:"Write not allowed to this path"},403);let r=Bt(s);if(!r)return y(e,{error:"Access denied"},403);try{let o=await Pe(n),{content:a}=JSON.parse(o);if(a===void 0)return y(e,{error:"content field required"},400);let i=typeof a=="string"?a:JSON.stringify(a,null,2);await J().write(r,i,{overwrite:!0}),y(e,{ok:!0})}catch{y(e,{error:"Failed to write file"},500)}}async function Zs(n,e){try{let t=await Pe(n),{line:s,checked:r}=JSON.parse(t);if(typeof s!="number")return y(e,{error:"line number required"},400);let o=J(),a=o.resolveRepoPath(".dndev/implementation.md");if(!o.pathExists(a))return y(e,{error:"implementation.md not found"},404);let i=await o.read(a,{format:"text"});if(i===null)return y(e,{error:"Failed to read file"},500);let l=i.split(`
1
+ var Kt=Object.defineProperty;var je=(n,e)=>()=>(n&&(e=n(n=0)),e);var Zt=(n,e)=>{for(var t in e)Kt(n,t,{get:e[t],enumerable:!0})};function nt(n,e=null){let t=Q[n];if(!t)throw new Error(`Unknown pattern type: ${n}`);return e&&t.framework?{...t,framework:t.framework.map(s=>`${e}/${s}`)}:t}function ke(n){return rt[n]||rt.base}var Ge,C,B,z,We,we,De,Q,he,ot,Be,Ve,xe,He,rt,j=je(()=>{"use strict";Ge={HOMEPAGE_FILE:"HomePage.tsx",HOMEPAGE_PATH:"/",HOMEPAGE_COMPONENT:"HomePage"},C={routes:"virtual:routes",themes:"virtual:themes",i18n:"virtual:i18n-mapping",assets:"virtual:assets",env:"virtual:env"},B={routes:"routes",themes:"themes",i18n:"i18n",assets:"assets",env:"env"},z={next:{middleware:"middleware.ts",routeManifest:"public/route-manifest.json",assetManifest:"public/asset-manifest.json",utilities:"src/styles/utilities.generated.css",appPages:"src/app",appLayout:"src/app/layout.tsx",configRoute:"src/config/dndev-config-route.js",configTheme:"src/config/dndev-config-theme.js",configI18n:"src/config/dndev-config-i18n.js",configPwa:"src/config/dndev-config-pwa.js",configAsset:"src/config/dndev-config-asset.js",configSeo:"src/config/dndev-config-seo.js",configServer:"src/config/dndev-config-server.js"},vite:{routeInspection:"src/routes.generated.log",themeInspection:"src/themes.generated.log",i18nInspection:"src/i18n.generated.log",assetInspection:"src/assets.generated.log",envInspection:"src/env.generated.log"},manifests:{route:"route-manifest.json",theme:"theme-manifest.json",i18n:"i18n-manifest.json",asset:"asset-manifest.json",feature:"feature-manifest.json",env:"env-manifest.json"}},We={package:"@donotdev/ui",assetsPath:"packages/ui/assets",browserTargets:["> 1%","last 2 versions","Firefox ESR","not dead","not op_mini all"]},we={public:"public",fonts:"fonts",nodeModules:"node_modules",packages:"packages",core:"core",ui:"ui"},De={SOURCE_ROOT:"packages/core/i18n",SOURCE_LOCALES:"packages/core/i18n/locales",SOURCE_EAGER:"packages/core/i18n/locales/eager",SOURCE_LAZY:"packages/core/i18n/locales/lazy",PUBLISHED_ROOT:"i18n",PUBLISHED_LOCALES:"i18n/locales",PUBLISHED_EAGER:"i18n/locales/eager",PUBLISHED_LAZY:"i18n/locales/lazy"},Q={routes:{consumer:["src/**/*Page.tsx","src/pages/**/*Page.tsx"],exclude:["**/node_modules/**","**/dist/**","**/build/**","**/*.test.tsx","**/*.stories.tsx"],extensions:[".tsx"]},css:{consumer:["src/**/*.css"],themes:["src/**/*.css"],extensions:[".css",".scss",".sass"],framework:["packages/ui/src/**/*.css","packages/core/components/src/**/*.css","packages/core/templates/src/**/*.css"]},i18n:{eager:["src/locales/*_*.json"],lazy:["src/**/locales/*_*.json","!src/locales/*_*.json","../../entities/locales/*_*.json"],additional:[],framework:{eager:[`${De.SOURCE_EAGER}/*_*.json`],lazy:[`${De.SOURCE_LAZY}/*_*.json`]},extensions:[".json"]},assets:{consumer:["public/**/*"],fallback:["manifest.json"],modern:["logo.svg","favicon.svg","apple-touch-icon.png","android-chrome-192x192.png","android-chrome-512x512.png"],patterns:["favicon.svg","favicon.ico","favicon-*.png","logo.svg","logo.png","logo.webp","logo.avif","apple-touch-icon*.png","android-chrome-*.png","manifest.json"],fonts:["fonts/**/*.woff2","fonts/**/*.woff","fonts/**/*.ttf"],framework:["packages/ui/assets/**/*"]},pwa:{consumer:["public/manifest.json","public/service-worker.js","public/sw.js","public/icon-192x192.png","public/icon-512x512.png","public/favicon.ico","public/favicon.svg","public/apple-touch-icon.png","public/logo.svg"],exclude:["**/node_modules/**","**/dist/**","**/build/**"],extensions:[".json",".js",".png",".svg",".ico"],framework:["packages/ui/assets/**/*"]},globalIgnore:["**/node_modules/**","**/dist/**","**/build/**","**/.git/**","**/coverage/**","**/test/**"]},he={mandatoryIncludes:["react","react-dom","react-router-dom","zustand","lucide-react","valibot","i18next","i18next-browser-languagedetector","i18next-http-backend","react-i18next","@tanstack/react-query","react-helmet-async","@donotdev/core","@donotdev/components","@donotdev/ui","@donotdev/templates","@donotdev/firebase"],optionalFeatures:["@donotdev/components","@donotdev/auth","@donotdev/billing","@donotdev/crud","@donotdev/oauth","shiki","@tiptap/react","@tiptap/starter-kit","@tiptap/extension-placeholder"],coreBundled:["@donotdev/types","@donotdev/utils","@donotdev/stores","@donotdev/schemas","@donotdev/hooks","@donotdev/i18n","@donotdev/config"],componentsBundled:["class-variance-authority","clsx","lucide-react","react-day-picker"],radixUIPattern:"@radix-ui/",buildTools:["esbuild","@esbuild/win32-x64","@esbuild/darwin-x64","@esbuild/linux-x64","@esbuild/darwin-arm64","@esbuild/linux-arm64","vite","rollup","rollup-plugin-visualizer","@vitejs/plugin-react","vite-tsconfig-paths","vite-plugin-pwa","vite-plugin-compression2","vite-plugin-node-polyfills","fsevents","postcss","postcss-import","postcss-nesting","autoprefixer"],buildTimePackages:[],largeOptional:["@sentry/react","framer-motion","stripe","@tanstack/react-query","shiki","@tiptap/react","@tiptap/starter-kit","@tiptap/extension-placeholder","sharp","semver","file-type"]},ot=["firebase-admin","gcp-metadata","google-logging-utils","payload","undici","@fastify/busboy","image-size","@donotdev/tooling","fs","path","crypto","net","tls","http","https","child_process","os","util","stream","buffer","events","querystring","url","zlib","assert","constants","domain","punycode","string_decoder","timers","tty","vm","worker_threads","cluster","dgram","dns","http2","inspector","module","perf_hooks","process","readline","repl","trace_events","v8","wasi"],Be=["@donotdev/core/functions","@donotdev/core/server"],Ve={selectors:{class:/\.([a-zA-Z0-9-]+)/g,variable:/--[a-zA-Z0-9-]+/g,keyframe:/@keyframes\s+([a-zA-Z0-9-]+)/g},themes:{themeClass:/(?::root\.|\.)([a-z][a-z0-9-]+)\s*\{([\s\S]*?)\}/gim,themeLabel:/--theme-label\s*:\s*['"]([^'"]+)['"]/,themeIcon:/--theme-icon\s*:\s*['"]([^'"]+)['"]/,themeIsDark:/--theme-is-dark\s*:\s*(0|1)/}},xe={Inter:"inter-latin","Space Grotesk":"space-grotesk-latin","Playfair Display":"playfair-display-latin","Press Start 2P":"press-start-2p-latin",Roboto:"roboto-latin"},He=[{name:"light",displayName:"Light",icon:"Sun",isDark:!1}],rt={base:{absolute:!0,onlyFiles:!0,ignore:Q.globalIgnore},css:{absolute:!0,onlyFiles:!0,ignore:[...Q.globalIgnore,"**/*.test.css"]},routes:{absolute:!0,onlyFiles:!0,ignore:[...Q.globalIgnore,"**/*.test.tsx","**/*.stories.tsx"]},i18n:{absolute:!0,onlyFiles:!0,ignore:Q.globalIgnore},assets:{absolute:!0,onlyFiles:!0,ignore:Q.globalIgnore}}});import*as P from"node:fs";import"node:fs";import{createRequire as os}from"node:module";import{resolve as Ae,join as ce,dirname as pe,relative as at,normalize as ns,sep as it,extname as as}from"node:path";import{fileURLToPath as is}from"node:url";import ls from"fast-glob";function lt(n,e){return n().catch(t=>{throw new Error(`${e}: ${t instanceof Error?t.message:String(t)}`)})}var ve,U,ct,O,q=je(()=>{"use strict";j();ve={getGlobOptionsFor:ke||void 0,SCAN_PATTERNS:Q||void 0,getPatternsFor:nt||void 0,I18N_PATHS:De||void 0},U={error:(n,e)=>{},warn:(n,e)=>{},info:n=>{}};ct={CLI:"packages/cli",COMPONENTS:"packages/core/components",CONFIG:"packages/core/config",CORE:"packages/core",CRUD:"packages/core/crud",FEATURES:"packages/features",HOOKS:"packages/core/hooks",I18N:"packages/core/i18n",SCHEMAS:"packages/core/schemas",STORES:"packages/core/stores",TEMPLATES:"packages/templates",TOOLING:"packages/tooling",TYPES:"packages/core/types",UI:"packages/ui",UTILS:"packages/core/utils",AUTH:"packages/features/auth",BILLING:"packages/features/billing",OAUTH:"packages/features/oauth",FIREBASE:"packages/providers/firebase",FUNCTIONS:"packages/functions"},O=class n{static _instance=null;options;_repoRoot;_appRoot=null;static getInstance(e={}){return n._instance||(n._instance=new n(e)),n._instance}static _reset(){n._instance=null}constructor(e={}){if(n._instance)return n._instance;this.options={maxLevels:e.maxLevels??10,customMarkers:e.customMarkers||[],cache:e.cache??!1,debug:e.debug??!1};try{let t=process.cwd();if(!t)throw new Error("PathResolver: process.cwd() returned undefined. This should never happen.");this._repoRoot=this._findRepoRoot(t)}catch(t){throw new Error(`PathResolver constructor failed: ${t instanceof Error?t.message:String(t)}. cwd: ${process.cwd()}`)}this._appRoot=null,n._instance=this}normalizePath(e){if(!e)return"";try{return ns(e).split(it).join("/")}catch{return String(e).split(it).join("/")}}getRelativePath(e){let t=this.getAppRoot(),s=at(t,e);return this.normalizePath(s)}getBasename(e){if(!e)return"";let s=this.normalizePath(e).split("/");return s[s.length-1]||""}getDirname(e){return e?this.normalizePath(pe(e)):""}resolvePackage(e,t=null){try{let s=t||this.getAppRoot(),o=os(ce(s,"package.json")).resolve(e);return this.normalizePath(o)}catch{return null}}resolveFrameworkPackage(e,t=null){let s=this.resolvePackage(`${e}/package.json`,t);if(s)return this.getDirname(s);if(this.isMonorepo()&&e.startsWith("@donotdev/")){let a=e.replace("@donotdev/",""),i=this.resolveRepoPath(`packages/${a}`);if(this.pathExists(i))return i;if(["auth","billing","crud","oauth"].includes(a)){let l=this.resolveRepoPath(`packages/features/${a}`);if(this.pathExists(l))return l}if(a==="firebase"){let l=this.resolveRepoPath(`packages/providers/${a}`);if(this.pathExists(l))return l}}let r=this.resolveAppPath(`node_modules/${e}`);if(this.pathExists(r))return r;let o=this.resolveRepoPath(`node_modules/${e}`);return this.pathExists(o)?o:null}resolvePackageAsset(e,t=null){return this.resolvePackage(e,t)}resolveAppPath(e){let t=this.getAppRoot(),s=Ae(t,e);return this.normalizePath(s)}resolveRepoPath(e){let t=this.getRepoRoot(),s=this.normalizePath(e),r=Ae(t,s);return this.normalizePath(r)}resolvePath(e,t){let s=this.normalizePath(t),r=this.normalizePath(e),o=Ae(s,r);return this.normalizePath(o)}createImportPath(e){return"./"+this.getRelativePath(e)}getFileInfo(e){try{let t=P.statSync(e);return{absolutePath:this.normalizePath(e),relativePath:this.getRelativePath(e),importPath:this.createImportPath(e),size:t.size,isFile:t.isFile(),isDirectory:t.isDirectory()}}catch{return null}}_detectFormat(e,t){return t&&t!=="auto"?t:as(e).toLowerCase()===".json"?"json":"text"}async read(e,t={}){let{format:s="auto",encoding:r="utf8"}=t,o=this._detectFormat(e,s);try{if(o==="buffer")return await P.promises.readFile(e);let a=await P.promises.readFile(e,r),i=this.stripBom(a);return o==="json"?JSON.parse(i):i}catch(a){return this.options.debug&&U.warn(`Failed to read file: ${e}`,a),null}}readSync(e,t={}){let{format:s="auto",encoding:r="utf8"}=t,o=this._detectFormat(e,s);try{if(o==="buffer")return P.readFileSync(e);let a=P.readFileSync(e,r),i=this.stripBom(a);return o==="json"?JSON.parse(i):i}catch(a){return this.options.debug&&U.warn(`Failed to read file: ${e}`,a),null}}async write(e,t,s={}){let{format:r="auto",overwrite:o=!1,dryRun:a=!1,verbose:i=!1}=s,l=this.normalizePath(e),u=this.normalizePath(pe(l)),c=this.pathExists(l);if(c&&!o)return i&&U.info(`Skipping existing file: ${l}`),!1;if(a)return U.info(`[DRY RUN] Would write file: ${l}`),!0;try{await P.promises.mkdir(u,{recursive:!0})}catch(d){if(d?.code!=="EEXIST")throw d}let p=this._detectFormat(e,r),g;Buffer.isBuffer(t)?g=t:p==="json"&&typeof t=="object"?g=JSON.stringify(t,null,2):g=String(t);try{return await lt(async()=>(Buffer.isBuffer(g)?await P.promises.writeFile(l,g):await P.promises.writeFile(l,g,"utf8"),i&&U.info(`${c?"Updated":"Created"} file: ${l}`),!0),`Failed to write file: ${l}`)}catch{return!1}}writeSync(e,t,s={}){let{format:r="auto",overwrite:o=!1,dryRun:a=!1,verbose:i=!1}=s,l=this.normalizePath(e),u=this.normalizePath(pe(l)),c=this.pathExists(l);if(c&&!o)return i&&U.info(`Skipping existing file: ${l}`),!1;if(a)return U.info(`[DRY RUN] Would write file: ${l}`),!0;try{P.mkdirSync(u,{recursive:!0})}catch(d){if(d?.code!=="EEXIST")throw d}let p=this._detectFormat(e,r),g;Buffer.isBuffer(t)?g=t:p==="json"&&typeof t=="object"?g=JSON.stringify(t,null,2):g=String(t);try{return Buffer.isBuffer(g)?P.writeFileSync(l,g):P.writeFileSync(l,g,"utf8"),i&&U.info(`${c?"Updated":"Created"} file: ${l}`),!0}catch(d){throw new Error(`Failed to write file: ${l}: ${d instanceof Error?d.message:String(d)}`)}}async copy(e,t,s={}){let{overwrite:r=!1,dryRun:o=!1,verbose:a=!1}=s,i=this.normalizePath(t),l=this.pathExists(i);if(l&&!r)return a&&U.info(`Skipping existing file: ${i}`),!1;if(o)return U.info(`[DRY RUN] Would copy file: ${i}`),!0;let u=this.normalizePath(pe(i));try{await P.promises.mkdir(u,{recursive:!0})}catch(c){if(c?.code!=="EEXIST")throw c}try{return await lt(async()=>(await P.promises.copyFile(e,i),a&&U.info(`${l?"Updated":"Created"} file: ${i}`),!0),`Failed to copy file from ${e} to ${i}`)}catch{return!1}}copySync(e,t,s={}){let{overwrite:r=!1,dryRun:o=!1,verbose:a=!1}=s,i=this.normalizePath(t),l=this.pathExists(i);if(l&&!r)return a&&U.info(`Skipping existing file: ${i}`),!1;if(o)return U.info(`[DRY RUN] Would copy file: ${i}`),!0;let u=this.normalizePath(pe(i));try{P.mkdirSync(u,{recursive:!0})}catch(c){if(c?.code!=="EEXIST")throw c}try{return P.copyFileSync(e,i),a&&U.info(`${l?"Updated":"Created"} file: ${i}`),!0}catch{return!1}}pathExists(e,t=!1){try{return P.existsSync(e)}catch(s){return t||U.error(`Error checking path existence: ${e}`,s),!1}}mkdir(e){try{let t=e.startsWith("/")||e.match(/^[A-Z]:/)?this.normalizePath(e):this.resolveAppPath(e);return P.existsSync(t)||P.mkdirSync(t,{recursive:!0}),!0}catch{return!1}}readdirSync(e,t){try{return P.readdirSync(e,t)}catch(s){return this.options.debug&&U.warn(`Failed to read directory: ${e}`,s),t&&typeof t=="object"&&"withFileTypes"in t&&t.withFileTypes?[]:[]}}statSync(e){try{return P.statSync(e)}catch(t){return this.options.debug&&U.warn(`Failed to stat file: ${e}`,t),null}}realpathSync(e){return P.realpathSync(e)}watch(e,t,s){return P.watch(e,t,s)}lstatSync(e){try{return P.lstatSync(e)}catch(t){return this.options.debug&&U.warn(`Failed to lstat file: ${e}`,t),null}}async ensureDir(e){try{await P.promises.mkdir(e,{recursive:!0})}catch(t){if(t?.code!=="EEXIST")throw t}}ensureDirSync(e){try{P.mkdirSync(e,{recursive:!0})}catch(t){if(t?.code!=="EEXIST")throw t}}async remove(e){await P.promises.rm(e,{recursive:!0,force:!0})}removeSync(e){P.rmSync(e,{recursive:!0,force:!0})}async readdir(e,t){return P.promises.readdir(e,t)}stripBom(e){return e.charCodeAt(0)===65279?e.slice(1):e}getRepoRoot(){return this._repoRoot||process.cwd()}getAppRoot(){return this._appRoot?this._appRoot:this._repoRoot}setAppRoot(e){if(!e)throw new Error("PathResolver.setAppRoot: root cannot be undefined or null");this._appRoot=this.normalizePath(e)}isMonorepo(){let e=ce(this._repoRoot,"packages");return this.pathExists(e)}isWithinApp(e){let t=this.normalizePath(Ae(e)),s=this.getAppRoot(),r=at(s,t),o=this.normalizePath(r);return!o.startsWith("../")&&!o.startsWith("/")}async findFiles(e,t,s={}){let r=this.normalizePath(ce(e,t)),o=this.getAppRoot(),a=this.normalizePath(o),i=r.startsWith(a)?r.slice(a.length+1):r,l={absolute:!0,onlyFiles:!0,braceExpansion:!0,extglob:!0,globstar:!0,cwd:o,ignore:ve.SCAN_PATTERNS?.globalIgnore||["**/node_modules/**","**/dist/**","**/build/**","**/.git/**"]};return await this._globWithNormalization([i],{...l,...s})}clearCache(){}async _resolveFrameworkI18nPattern(e){let t=ve.I18N_PATHS;if(!t)return null;let s=e.replace(t.SOURCE_ROOT+"/",""),r=this.resolveFrameworkPackage("@donotdev/core");if(!r)return null;let o=this.normalizePath(ce(r,t.PUBLISHED_ROOT,s)),a=o.replace(/\/[^/]*\*.*$/,"");return this.pathExists(a),o}async _globWithNormalization(e,t){return(await ls(e,t)).map(r=>{let o=typeof r=="string"?r:r.path;return this.normalizePath(o)})}async resolveFiles(e,t="css"){if(!e||typeof e!="object")return{frameworkFiles:[],consumerFiles:[]};if(t==="i18n")return{frameworkFiles:[],consumerFiles:[]};if(Array.isArray(e.framework)||(e.framework=[]),!Array.isArray(e.consumer))return{frameworkFiles:[],consumerFiles:[]};let s=[...e.framework,...e.consumer];for(let c of s)if(typeof c!="string"||c.trim()==="")return{frameworkFiles:[],consumerFiles:[]};let r=this.getAppRoot(),o=ve.getGlobOptionsFor?ve.getGlobOptionsFor(t):{ignore:["**/node_modules/**","**/dist/**","**/build/**"]},a=this.normalizePath(r),i=e.framework.map(c=>{let p=this.normalizePath(c);return p.startsWith(a)?p.slice(a.length+1):p}),l=e.consumer.map(c=>{let p=this.normalizePath(c);return p.startsWith(a)?p.slice(a.length+1):p}),u={...o,onlyFiles:!0,absolute:!0,braceExpansion:!0,extglob:!0,globstar:!0,cwd:r};try{let c=i.length>0?await this._globWithNormalization(i,u):[],p=await this._globWithNormalization(l,u);return{frameworkFiles:c,consumerFiles:p}}catch{return this.options.debug,{frameworkFiles:[],consumerFiles:[]}}}async resolvePatterns(e){if(!ve.getPatternsFor)return{framework:[],consumer:[],all:[]};let t=this.getAppRoot(),s=this.getRepoRoot();if(e==="i18n"&&(!t||t===s))throw new Error(`Cannot resolve i18n patterns: appRoot not set (appRoot: ${t}, repoRoot: ${s}). Ensure configResolved hook has run before discovery.`);let r=ve.getPatternsFor(e),o=this.isMonorepo();if(e==="i18n"){let l=r,u={eager:l.eager.map(c=>c.startsWith("!")?"!"+this.resolveAppPath(c.slice(1)):this.resolveAppPath(c)),lazy:l.lazy.map(c=>c.startsWith("!")?"!"+this.resolveAppPath(c.slice(1)):this.resolveAppPath(c)),framework:{eager:o?(l.framework?.eager||[]).map(c=>this.resolveRepoPath(c)).filter(Boolean):await Promise.all((l.framework?.eager||[]).map(c=>this._resolveFrameworkI18nPattern(c))).then(c=>c.filter(Boolean)),lazy:o?(l.framework?.lazy||[]).map(c=>this.resolveRepoPath(c)).filter(Boolean):await Promise.all((l.framework?.lazy||[]).map(c=>this._resolveFrameworkI18nPattern(c))).then(c=>c.filter(Boolean))},all:[]};return u.all=[...u.eager,...u.lazy,...u.framework.eager,...u.framework.lazy],u}let a=r,i={framework:o?(a.framework||[]).map(l=>this.resolveRepoPath(l)).filter(Boolean):[],consumer:(a.consumer||[]).map(l=>this.resolveAppPath(l)),all:[]};return i.all=[...i.consumer,...i.framework],i}getEmptyModulePath(e=!1){if(e)return"@donotdev/core/empty";let t=this.resolvePackage("@donotdev/core/empty");if(t)return t;let s=pe(is(import.meta.url));return this.normalizePath(ce(s,"../empty.js"))}_findRepoRoot(e){let t=this.normalizePath(e),s=0,r=this.options.maxLevels;for(;s<r;){let o=this.normalizePath(ce(t,ct.TOOLING)),a=this.normalizePath(ce(t,ct.CORE));if(this.pathExists(o)&&this.pathExists(a))return t;let i=ce(t,"apps");if(this.pathExists(i)&&this.statSync(i)?.isDirectory())return this.normalizePath(t);let l=this.normalizePath(ce(t,"package.json"));if(this.pathExists(l)&&this.normalizePath(pe(t))===t)return t;let u=this.normalizePath(pe(t));if(u===t)break;t=u,s++}return this.normalizePath(e)}}});var Ht={};Zt(Ht,{createDndevPlugin:()=>sr});import{execSync as Me,spawn as zs}from"node:child_process";function J(){return O.getInstance()}function Ut(){return J().getRepoRoot()}function Gt(){return J().resolveRepoPath(".dndev")}function y(n,e,t=200){n.writeHead(t,{"Content-Type":"application/json"}),n.end(JSON.stringify(e))}function Pe(n,e=js){return new Promise((t,s)=>{let r="",o=0;n.on("data",a=>{if(o+=a.length,o>e){n.destroy(),s(new Error("Request body too large"));return}r+=a.toString()}),n.on("end",()=>t(r)),n.on("error",s)})}function Us(n){let e=n.lastIndexOf(".");return e===-1?"":n.slice(e).toLowerCase()}function Gs(){let n=J(),e=[],t=process.env.HOME||process.env.USERPROFILE||"";try{let r=process.platform==="win32"?"where node":"which node",o=Me(r,{encoding:"utf8"}).trim().split(`
2
+ `)[0];e.push(o)}catch{}let s=[process.env.NVM_DIR,n.resolvePath(".nvm",t)].filter(Boolean);for(let r of s)try{let o=n.resolvePath("versions/node",r),a=n.readdirSync(o).filter(i=>i.startsWith("v")).sort().reverse();for(let i of a)e.push(n.resolvePath(`${i}/bin/node`,o))}catch{}if(process.env.NVM_BIN&&e.push(n.resolvePath("node",process.env.NVM_BIN)),process.platform==="win32"){e.push("C:\\Program Files\\nodejs\\node.exe");let r=process.env.APPDATA||"";if(r)try{let o=n.resolvePath("nvm",r),a=n.readdirSync(o).filter(i=>i.startsWith("v")).sort().reverse();for(let i of a)e.push(n.resolvePath(`${i}/node.exe`,o))}catch{}}else e.push("/usr/local/bin/node","/usr/bin/node");for(let r of e)try{let o=n.realpathSync(r);if(o.includes("bun")||!n.pathExists(o))continue;return r}catch{continue}return"node"}function Wt(n){if(!n||typeof n!="string"||n.includes("\0"))return!1;let e=n.split(/[/\\]/).filter(Boolean);for(let t of e)if(t==="."||t===".."||t==="node_modules"||t===".git"||t.startsWith(".")&&t!==".dndev")return!1;return!0}function Ws(n){return n.includes("..")?!1:n.startsWith(".dndev/")||n.startsWith("docs/")||n.startsWith("guides/")}function Bt(n){let e=J(),t=e.getRepoRoot(),s=e.resolvePath(n,t),r=e.normalizePath(t),o=e.normalizePath(s);return!o.startsWith(r+"/")&&o!==r?null:s}async function Vs(n,e){let s=new URL(n.url,`http://${n.headers.host}`).searchParams.get("path");if(!s)return y(e,{error:"path parameter required"},400);if(!Wt(s))return y(e,{error:"Access denied"},403);let r=Bt(s);if(!r)return y(e,{error:"Access denied"},403);let o=J();if(!o.pathExists(r))return y(e,{error:"File not found"},404);let a=Us(r);if(Bs.has(a)){let i=o.readSync(r,{format:"buffer"});return i?(e.writeHead(200,{"Content-Type":Vt[a]||"application/octet-stream","Content-Length":i.byteLength}),void e.end(Buffer.from(i))):y(e,{error:"Failed to read file"},500)}if(a===".json")try{let i=await o.read(r);return i===null?y(e,{error:"Failed to read file"},500):y(e,{path:s,content:i})}catch{return y(e,{error:"Invalid JSON"},500)}try{let i=await o.read(r,{format:"text"});if(i===null)return y(e,{error:"Failed to read file"},500);y(e,{path:s,content:i})}catch{y(e,{error:"Failed to read file"},500)}}function Hs(n,e){let s=new URL(n.url,`http://${n.headers.host}`).searchParams.get("dir"),r=J(),o=r.getRepoRoot(),a=[],i=new Set(["node_modules",".git","dist","build",".next",".expo"]);function l(c,p){try{let g=r.readdirSync(c,{withFileTypes:!0});for(let d of g){let h=p?`${p}/${d.name}`:d.name;d.isDirectory()&&i.has(d.name)||(d.isDirectory()?(a.push({path:h,name:d.name,isDirectory:!0}),l(r.resolvePath(d.name,c),h)):d.name.endsWith(".md")&&a.push({path:h,name:d.name,isDirectory:!1}))}}catch{}}let u=[".dndev","docs","guides"];if(s){if(s.includes("..")||s.includes("\0"))return y(e,{error:"Access denied"},403);if(!u.includes(s)&&!u.some(d=>s.startsWith(d+"/")))return y(e,{error:"Directory not allowed"},403);let c=r.resolvePath(s,o),p=r.normalizePath(o);if(!r.normalizePath(c).startsWith(p+"/"))return y(e,{error:"Access denied"},403);r.pathExists(c)&&(a.push({path:s,name:r.getBasename(s),isDirectory:!0}),l(c,s))}else{for(let c of u){let p=r.resolveRepoPath(c);r.pathExists(p)&&(a.push({path:c,name:c,isDirectory:!0}),l(p,c))}try{let c=r.readdirSync(o,{withFileTypes:!0});for(let p of c)!p.isDirectory()&&p.name.endsWith(".md")&&a.push({path:p.name,name:p.name,isDirectory:!1})}catch{}}y(e,{entries:a})}async function Js(n,e){let s=new URL(n.url,`http://${n.headers.host}`).searchParams.get("path");if(!s)return y(e,{error:"path parameter required"},400);if(!Wt(s))return y(e,{error:"Access denied"},403);if(!Ws(s))return y(e,{error:"Write not allowed to this path"},403);let r=Bt(s);if(!r)return y(e,{error:"Access denied"},403);try{let o=await Pe(n),{content:a}=JSON.parse(o);if(a===void 0)return y(e,{error:"content field required"},400);let i=typeof a=="string"?a:JSON.stringify(a,null,2);await J().write(r,i,{overwrite:!0}),y(e,{ok:!0})}catch{y(e,{error:"Failed to write file"},500)}}async function qs(n,e){try{let t=await Pe(n),{line:s,checked:r}=JSON.parse(t);if(typeof s!="number")return y(e,{error:"line number required"},400);let o=J(),a=o.resolveRepoPath(".dndev/implementation.md");if(!o.pathExists(a))return y(e,{error:"implementation.md not found"},404);let i=await o.read(a,{format:"text"});if(i===null)return y(e,{error:"Failed to read file"},500);let l=i.split(`
3
3
  `);if(s<0||s>=l.length)return y(e,{error:"Line out of range"},400);let u=l[s];l[s]=r?u.replace("- [ ]","- [x]"):u.replace("- [x]","- [ ]"),await o.write(a,l.join(`
4
- `),{overwrite:!0}),y(e,{ok:!0,line:l[s]})}catch{y(e,{error:"Failed to update progress"},500)}}async function Xs(n,e){try{let t=await Pe(n),{id:s,data:r}=JSON.parse(t);if(!s||!r)return y(e,{error:"id and data required"},400);if(!/^[\w-]+$/.test(s))return y(e,{error:"Invalid screenshot ID"},400);let o=J(),a=o.resolveRepoPath(".dndev/bugs");o.ensureDirSync(a);let i=Buffer.from(r,"base64"),l=o.resolvePath(`${s}.png`,a);await o.write(l,i,{overwrite:!0}),y(e,{ok:!0,path:`.dndev/bugs/${s}.png`})}catch{y(e,{error:"Failed to save screenshot"},500)}}async function Qs(n,e){try{let t=await Pe(n),{action:s,phase:r}=JSON.parse(t);if(!s||typeof r!="number")return y(e,{error:"action and phase required"},400);let o=J(),a=Gt();o.ensureDirSync(a);let i=o.resolvePath("protocol.json",a),l={currentPhase:0,phases:{}};if(o.pathExists(i))try{let u=await o.read(i);u&&(l=u)}catch{}s==="start"?(l.currentPhase=r,l.phases[r]||(l.phases[r]={}),l.phases[r].status="active",l.phases[r].startedAt=new Date().toISOString()):s==="complete"&&(l.phases[r]||(l.phases[r]={}),l.phases[r].status="completed",l.phases[r].completedAt=new Date().toISOString()),await o.write(i,l,{overwrite:!0}),y(e,{ok:!0,protocol:l})}catch{y(e,{error:"Failed to update phase"},500)}}function er(n,e){try{let t=Ut(),s=Me("git rev-parse --short HEAD",{cwd:t,encoding:"utf-8",timeout:5e3}).trim(),r=Me("git rev-parse --abbrev-ref HEAD",{cwd:t,encoding:"utf-8",timeout:5e3}).trim();y(e,{commit:s,branch:r})}catch{y(e,{commit:"unknown",branch:"unknown"})}}async function tr(n,e){try{let t=await Pe(n),s=JSON.parse(t);if(!s.id||!s.type||!s.result)return y(e,{error:"id, type, and result required"},400);let r=J(),o=Gt();r.ensureDirSync(o);let a=r.resolvePath("health.json",o),i={actions:[]};if(r.pathExists(a))try{let u=await r.read(a);u&&(i=u)}catch{}Array.isArray(i.actions)||(i.actions=[]);let l=i.actions.findIndex(u=>u.id===s.id);l>=0?i.actions[l]={...i.actions[l],...s}:i.actions.unshift(s),await r.write(a,i,{overwrite:!0}),y(e,{ok:!0})}catch{y(e,{error:"Failed to append action"},500)}}function sr(n,e){let t=J(),s=t.resolveRepoPath("apps");try{let o=t.readdirSync(s).filter(a=>{if(a==="dndev")return!1;let i=t.resolvePath(a,s);return t.statSync(i)?.isDirectory()&&t.pathExists(t.resolvePath("package.json",i))}).map(a=>{try{let i=t.resolvePath(`${a}/package.json`,s),l=t.readSync(i);return{name:a,packageName:l?.name||a}}catch{return{name:a,packageName:a}}});y(e,{apps:o})}catch{y(e,{apps:[]})}}function rr(n){if(Ze)return;let e=J(),t=e.normalizePath(n.config.root),s=e.resolvePath("terminal-sidecar.cjs",t);if(!e.pathExists(s))return;try{let i=Me(`fuser ${jt}/tcp 2>/dev/null`,{encoding:"utf8"}).trim();i&&process.kill(Number(i),"SIGKILL")}catch{}Ze=!0;let r=e.getRepoRoot(),o=Vs(),a=Gs(o,[s],{cwd:r,stdio:["ignore","inherit","inherit","ipc"],env:{...process.env,TERMINAL_PORT:String(jt),TERMINAL_CWD:r}});a.on("message",i=>{i.type}),a.on("exit",i=>{Ze=!1}),process.on("exit",()=>{a.kill()})}function or(n){let e=J(),t=e.getRepoRoot(),s=[".dndev","docs","guides"];for(let r of s){let o=e.resolveRepoPath(r);if(!e.pathExists(o))continue;let a=Us(o,{recursive:!0},(i,l)=>{if(!l||l==="dashboard.json")return;let u=`${r}/${l}`,c=`change:${u}`;Xe.has(c)||(Xe.set(c,!0),setTimeout(()=>Xe.delete(c),300),n.hot.send("dndev:file-changed",{path:u,timestamp:Date.now()}))});n.httpServer?.on("close",()=>a.close())}}function nr(n={}){return{name:"dndev",configureServer(e){let t=Ut();n.debug,e.middlewares.use((s,r,o)=>{let a=s.url;if(!a?.startsWith(zt))return o();let l=new URL(a,`http://${s.headers.host}`).pathname.slice(zt.length),u=s.method?.toUpperCase();if(u==="GET")return l==="/file"?void qs(s,r):l==="/tree"?void Ys(s,r):l==="/git/head"?void er(s,r):l==="/apps"?void sr(s,r):y(r,{error:"Not found"},404);if(u==="POST")return l==="/file"?void Ks(s,r):l==="/progress/toggle"?void Zs(s,r):l==="/bugs/screenshot"?void Xs(s,r):l==="/phase"?void Qs(s,r):l==="/actions/append"?void tr(s,r):y(r,{error:"Not found"},404);y(r,{error:"Method not allowed"},405)}),rr(e),or(e)}}}var zt,Ws,Vt,Js,jt,Ze,Xe,Jt=je(()=>{"use strict";q();zt="/api/dndev";Ws=5*1024*1024;Vt={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".ico":"image/x-icon",".svg":"image/svg+xml"},Js=new Set(Object.keys(Vt));jt=24681,Ze=!1;Xe=new Map});import us from"@rollup/plugin-strip";import{visualizer as ps}from"rollup-plugin-visualizer";var Ue=["/react/","/react-dom/","/scheduler/","/react-router","/@radix-ui/","/react-day-picker/","/react-hook-form/","/react-i18next/","/clsx/","/class-variance-authority/"],Xt={valibot:["/valibot/"],firebase:["/firebase/","/@firebase/"],lucide:["/lucide-react/","/lucide/"],i18n:["/i18next/","/i18next-browser-languagedetector/","/i18next-http-backend/","/@donotdev/i18n/"],zustand:["/zustand/"],"tanstack-query":["/@tanstack/react-query/","/@tanstack/query-core/"]};function Qt(n){let e=n.match(/(?:^|\0)virtual:([^?]+)/);if(e)return e[1]}function et(n){let e=n.replace(/\\/g,"/");if(e.includes("/node_modules/"))return e.split("?")[0]}function tt(n,e=Ue){return e.some(t=>n.includes(t))}function es(n){for(let[e,t]of Object.entries(Xt))if(t.some(s=>n.includes(s)))return e}function ts(n){let e=Qt(n);if(e)return e==="i18n-mapping"?"virtual-i18n-mapping":"virtual-modules";let t=et(n);if(!t)return;if(tt(t))return"react-core";let s=es(t);if(s)return s}function ss(n=[]){let e=n.filter(s=>!Ue.includes(s)),t=[...Ue,...e];return function(s){let r=et(s);if(r&&tt(r,t))return"react-core"}}var Qe={development:{manualChunks:void 0},production:{manualChunks:ts}};function st(n,e={}){let t=Qe[n]||Qe.production,s=e.reactCore||[];return s.length>0?{manualChunks:ss(s)}:t}q();import*as Y from"@clack/prompts";var re={reset:"\x1B[0m",green:"\x1B[32m",brightGreen:"\x1B[92m",red:"\x1B[31m",brightRed:"\x1B[91m",yellow:"\x1B[33m",brightYellow:"\x1B[93m",blue:"\x1B[34m",cyan:"\x1B[36m",brightCyan:"\x1B[96m",gray:"\x1B[90m",white:"\x1B[37m"};function cs(){return process.env.NO_COLOR?!1:process.platform==="win32"?!0:process.stdout.isTTY===!0}function ae(n,e){return cs()?`${e}${n}${re.reset}`:n}function T(n,e,t,s={}){let{logDir:r=".dndev-logs",fileLogging:o=!1}=s,a=O.getInstance(),i=null;if(o){let c=a.resolveAppPath(r);a.pathExists(c)||a.mkdir(c),i=a.resolveAppPath(`${r}/${n.replace(/[^a-zA-Z0-9]/g,"-")}.log`);let p=`=== ${n} Log Started at ${new Date().toISOString()} ===
4
+ `),{overwrite:!0}),y(e,{ok:!0,line:l[s]})}catch{y(e,{error:"Failed to update progress"},500)}}async function Ys(n,e){try{let t=await Pe(n),{id:s,data:r}=JSON.parse(t);if(!s||!r)return y(e,{error:"id and data required"},400);if(!/^[\w-]+$/.test(s))return y(e,{error:"Invalid screenshot ID"},400);let o=J(),a=o.resolveRepoPath(".dndev/bugs");o.ensureDirSync(a);let i=Buffer.from(r,"base64"),l=o.resolvePath(`${s}.png`,a);await o.write(l,i,{overwrite:!0}),y(e,{ok:!0,path:`.dndev/bugs/${s}.png`})}catch{y(e,{error:"Failed to save screenshot"},500)}}async function Ks(n,e){try{let t=await Pe(n),{action:s,phase:r}=JSON.parse(t);if(!s||typeof r!="number")return y(e,{error:"action and phase required"},400);let o=J(),a=Gt();o.ensureDirSync(a);let i=o.resolvePath("protocol.json",a),l={currentPhase:0,phases:{}};if(o.pathExists(i))try{let u=await o.read(i);u&&(l=u)}catch{}s==="start"?(l.currentPhase=r,l.phases[r]||(l.phases[r]={}),l.phases[r].status="active",l.phases[r].startedAt=new Date().toISOString()):s==="complete"&&(l.phases[r]||(l.phases[r]={}),l.phases[r].status="completed",l.phases[r].completedAt=new Date().toISOString()),await o.write(i,l,{overwrite:!0}),y(e,{ok:!0,protocol:l})}catch{y(e,{error:"Failed to update phase"},500)}}function Zs(n,e){try{let t=Ut(),s=Me("git rev-parse --short HEAD",{cwd:t,encoding:"utf-8",timeout:5e3}).trim(),r=Me("git rev-parse --abbrev-ref HEAD",{cwd:t,encoding:"utf-8",timeout:5e3}).trim();y(e,{commit:s,branch:r})}catch{y(e,{commit:"unknown",branch:"unknown"})}}async function Xs(n,e){try{let t=await Pe(n),s=JSON.parse(t);if(!s.id||!s.type||!s.result)return y(e,{error:"id, type, and result required"},400);let r=J(),o=Gt();r.ensureDirSync(o);let a=r.resolvePath("health.json",o),i={actions:[]};if(r.pathExists(a))try{let u=await r.read(a);u&&(i=u)}catch{}Array.isArray(i.actions)||(i.actions=[]);let l=i.actions.findIndex(u=>u.id===s.id);l>=0?i.actions[l]={...i.actions[l],...s}:i.actions.unshift(s),await r.write(a,i,{overwrite:!0}),y(e,{ok:!0})}catch{y(e,{error:"Failed to append action"},500)}}function Qs(n,e){let t=J(),s=t.resolveRepoPath("apps");try{let o=t.readdirSync(s).filter(a=>{if(a==="dndev")return!1;let i=t.resolvePath(a,s);return t.statSync(i)?.isDirectory()&&t.pathExists(t.resolvePath("package.json",i))}).map(a=>{try{let i=t.resolvePath(`${a}/package.json`,s),l=t.readSync(i);return{name:a,packageName:l?.name||a}}catch{return{name:a,packageName:a}}});y(e,{apps:o})}catch{y(e,{apps:[]})}}function er(n){if(Ze)return;let e=J(),t=e.normalizePath(n.config.root),s=e.resolvePath("terminal-sidecar.cjs",t);if(!e.pathExists(s))return;try{let i=Me(`fuser ${jt}/tcp 2>/dev/null`,{encoding:"utf8"}).trim();i&&process.kill(Number(i),"SIGKILL")}catch{}Ze=!0;let r=e.getRepoRoot(),o=Gs(),a=zs(o,[s],{cwd:r,stdio:["ignore","inherit","inherit","ipc"],env:{...process.env,TERMINAL_PORT:String(jt),TERMINAL_CWD:r}});a.on("message",i=>{i.type}),a.on("exit",i=>{Ze=!1}),process.on("exit",()=>{a.kill()})}function tr(n){let e=J(),t=e.getRepoRoot(),s=[".dndev","docs","guides"];for(let r of s){let o=e.resolveRepoPath(r);if(!e.pathExists(o))continue;let a=e.watch(o,{recursive:!0},(i,l)=>{if(!l||l==="dashboard.json")return;let u=`${r}/${l}`,c=`change:${u}`;Xe.has(c)||(Xe.set(c,!0),setTimeout(()=>Xe.delete(c),300),n.hot.send("dndev:file-changed",{path:u,timestamp:Date.now()}))});n.httpServer?.on("close",()=>a.close())}}function sr(n={}){return{name:"dndev",configureServer(e){let t=Ut();n.debug,e.middlewares.use((s,r,o)=>{let a=s.url;if(!a?.startsWith(zt))return o();let l=new URL(a,`http://${s.headers.host}`).pathname.slice(zt.length),u=s.method?.toUpperCase();if(u==="GET")return l==="/file"?void Vs(s,r):l==="/tree"?void Hs(s,r):l==="/git/head"?void Zs(s,r):l==="/apps"?void Qs(s,r):y(r,{error:"Not found"},404);if(u==="POST")return l==="/file"?void Js(s,r):l==="/progress/toggle"?void qs(s,r):l==="/bugs/screenshot"?void Ys(s,r):l==="/phase"?void Ks(s,r):l==="/actions/append"?void Xs(s,r):y(r,{error:"Not found"},404);y(r,{error:"Method not allowed"},405)}),er(e),tr(e)}}}var zt,js,Vt,Bs,jt,Ze,Xe,Jt=je(()=>{"use strict";q();zt="/api/dndev";js=5*1024*1024;Vt={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".ico":"image/x-icon",".svg":"image/svg+xml"},Bs=new Set(Object.keys(Vt));jt=24681,Ze=!1;Xe=new Map});import us from"@rollup/plugin-strip";import{visualizer as ps}from"rollup-plugin-visualizer";var Ue=["/react/","/react-dom/","/scheduler/","/react-router","/@radix-ui/","/react-day-picker/","/react-hook-form/","/react-i18next/","/clsx/","/class-variance-authority/"],Xt={valibot:["/valibot/"],firebase:["/firebase/","/@firebase/"],lucide:["/lucide-react/","/lucide/"],i18n:["/i18next/","/i18next-browser-languagedetector/","/i18next-http-backend/","/@donotdev/i18n/"],zustand:["/zustand/"],"tanstack-query":["/@tanstack/react-query/","/@tanstack/query-core/"]};function Qt(n){let e=n.match(/(?:^|\0)virtual:([^?]+)/);if(e)return e[1]}function et(n){let e=n.replace(/\\/g,"/");if(e.includes("/node_modules/"))return e.split("?")[0]}function tt(n,e=Ue){return e.some(t=>n.includes(t))}function es(n){for(let[e,t]of Object.entries(Xt))if(t.some(s=>n.includes(s)))return e}function ts(n){let e=Qt(n);if(e)return e==="i18n-mapping"?"virtual-i18n-mapping":"virtual-modules";let t=et(n);if(!t)return;if(tt(t))return"react-core";let s=es(t);if(s)return s}function ss(n=[]){let e=n.filter(s=>!Ue.includes(s)),t=[...Ue,...e];return function(s){let r=et(s);if(r&&tt(r,t))return"react-core"}}var Qe={development:{manualChunks:void 0},production:{manualChunks:ts}};function st(n,e={}){let t=Qe[n]||Qe.production,s=e.reactCore||[];return s.length>0?{manualChunks:ss(s)}:t}q();import*as Y from"@clack/prompts";var re={reset:"\x1B[0m",green:"\x1B[32m",brightGreen:"\x1B[92m",red:"\x1B[31m",brightRed:"\x1B[91m",yellow:"\x1B[33m",brightYellow:"\x1B[93m",blue:"\x1B[34m",cyan:"\x1B[36m",brightCyan:"\x1B[96m",gray:"\x1B[90m",white:"\x1B[37m"};function cs(){return process.env.NO_COLOR?!1:process.platform==="win32"?!0:process.stdout.isTTY===!0}function ae(n,e){return cs()?`${e}${n}${re.reset}`:n}function T(n,e,t,s={}){let{logDir:r=".dndev-logs",fileLogging:o=!1}=s,a=O.getInstance(),i=null;if(o){let c=a.resolveAppPath(r);a.pathExists(c)||a.mkdir(c),i=a.resolveAppPath(`${r}/${n.replace(/[^a-zA-Z0-9]/g,"-")}.log`);let p=`=== ${n} Log Started at ${new Date().toISOString()} ===
5
5
  `;a.writeSync(i,p)}let l=(c,p,g)=>{if(i){let d=new Date().toISOString(),h=g.length>0?" "+g.map(I=>typeof I=="object"?JSON.stringify(I,null,2):String(I)).join(" "):"",F=`${d} [${c}] ${p}${h}
6
6
  `;a.appendFile(i,F)}},u=(c,p)=>{if(p.length===0)return c;let g=p.map(d=>typeof d=="object"?JSON.stringify(d,null,2):String(d)).join(" ");return`${c} ${g}`};return{debug:(c,...p)=>{e&&(o?l("DEBUG",c,p):Y.log.message(ae(u(c,p),re.gray)))},verbose:(c,...p)=>{t&&(o?l("VERBOSE",c,p):Y.log.message(u(c,p)))},info:(c,...p)=>{o?l("INFO",c,p):Y.log.info(ae(u(c,p),re.brightCyan))},warn:(c,...p)=>{e&&o?l("WARN",c,p):Y.log.warn(ae(u(c,p),re.brightYellow))},error:(c,...p)=>{e&&o?l("ERROR",c,p):Y.log.error(ae(u(c,p),re.brightRed))},success:(c,...p)=>{e&&o?l("SUCCESS",c,p):Y.log.success(ae(u(c,p),re.brightGreen))},when:(c,p="debug")=>(g,...d)=>{if(c){let h=u(g,d);switch(p){case"verbose":t&&(Y.log.message(h),l("VERBOSE",g,d));break;case"info":Y.log.info(ae(h,re.brightCyan)),l("INFO",g,d);break;case"warn":Y.log.warn(ae(h,re.brightYellow)),l("WARN",g,d);break;case"error":Y.log.error(ae(h,re.brightRed)),l("ERROR",g,d);break;case"success":Y.log.success(ae(h,re.brightGreen)),l("SUCCESS",g,d);break;default:e&&(Y.log.message(ae(h,re.gray)),l("DEBUG",g,d))}}},getLogFilePath:()=>i}}q();function ut(n={}){let{mode:e="development",chunkingOptions:t={},debug:s,verbose:r=!0,isDev:o,isDebug:a,shouldAnalyze:i,build:l={}}=n,u=T("build",s,r),c=st(e,t);return u.debug("\u{1F41B} DEBUG MODE ENABLED:"),u.debug(" - Minification: DISABLED"),u.debug(" - Sourcemaps: ENABLED"),u.debug(" - Console logs: PRESERVED"),u.debug(" - Debugger statements: PRESERVED"),i&&(u.info("\u{1F4CA} Bundle analysis enabled"),u.info(` Visual treemap will open after build (stats.html)
7
- `)),{outDir:"dist",sourcemap:o||a,cacheDir:"node_modules/.vite",target:"baseline-widely-available",minify:a?!1:"esbuild",reportCompressedSize:!1,chunkSizeWarningLimit:2048,assetsInlineLimit:0,esbuild:{format:"esm",drop:a?[]:["console","debugger"],legalComments:"none"},cssMinify:a?!1:"esbuild",cssCodeSplit:!0,rollupOptions:{external:gs(),output:{format:"es",entryFileNames:"assets/[name].[hash].js",chunkFileNames:"assets/[name].[hash].js",assetFileNames:"assets/[name].[hash][extname]",...c.manualChunks&&{manualChunks:c.manualChunks},compact:!0},onwarn(g,d){g.code!=="MODULE_LEVEL_DIRECTIVE"&&d(g)},plugins:[...a?[]:[us({include:["**/*.js","**/*.ts","**/*.tsx","**/*.jsx"],functions:["console.*","debugger"],labels:["debug"]})],...i?[(()=>{let g=O.getInstance(),d=g.getAppRoot(),h="dist",F=g.resolveAppPath(`${h}/stats.html`),I=()=>{try{let $=g.resolveAppPath(h);g.pathExists($)||g.mkdir($)}catch{}},S=ps({filename:F,open:!0,gzipSize:!0,brotliSize:!0,template:"treemap",sourcemap:o||a,projectRoot:d});if(S.buildStart){let $=S.buildStart.bind(S);S.buildStart=function(...b){I();let w=$.apply(this,b);return w&&typeof w.then=="function"?w.catch(m=>{}):w}}else S.buildStart=function(){I()};let _=["generateBundle","writeBundle","closeBundle"];for(let $ of _)if(S[$]){let b=S[$];S[$]=function(...w){try{I();let m=b.apply(this,w);return m&&typeof m.then=="function"?m.catch(D=>{let A=D?.message||D?.toString()||String(D)||"Unknown error";u.warn(`Bundle visualizer warning in ${$}: ${A}`),$==="closeBundle"&&u.warn(`You can manually open ${F} to view the bundle analysis`)}):m}catch(m){let D=m?.message||m?.toString()||String(m)||"Unknown error";buildLogger.warn(`Bundle visualizer warning in ${$}: ${D}`),$==="closeBundle"&&buildLogger.warn(` You can manually open ${F} to view the bundle analysis`)}}}return S})()]:[]]}}}function gs(n){return n?["firebase-admin","gcp-metadata","google-logging-utils","@google-cloud/firestore",/\.node$/,"esbuild",/@esbuild\/.*/]:["gcp-metadata","google-logging-utils","payload","file-type","firebase-admin","firebase-admin/app","firebase-admin/auth","firebase-admin/firestore","firebase-admin/functions","firebase-admin/credential","@google-cloud/firestore","google-auth-library","google-gax","googleapis-common"]}function ds(){let n=!1,e=O.getInstance();if((e.pathExists("/.dockerenv")||e.pathExists("/run/.containerenv"))&&(n=!0),!n&&(process.env.DOCKER_CONTAINER==="true"||process.env.IS_DOCKER==="true"||process.env.DOCKER_BUILDKIT==="1"||process.env.CI==="true"&&process.env.DOCKER==="true")&&(n=!0),!n&&process.env.DOCKER_HOST&&process.env.DOCKER_HOST.includes("docker")&&(n=!0),!n&&process.platform==="linux"&&e.pathExists("/proc/self/cgroup"))try{let r=e.readSync("/proc/self/cgroup");r&&(r.includes("docker")||r.includes("containerd"))&&(n=!0)}catch{}let t=!1;if((process.env.WSL_DISTRO_NAME||process.env.WSLENV)&&(t=!0),!t&&process.platform==="linux"&&e.pathExists("/proc/version"))try{let r=(e.readSync("/proc/version")||"").toLowerCase();t=r.includes("microsoft")||r.includes("wsl")}catch{}if(!t&&process.platform==="linux"&&e.pathExists("/proc/sys/kernel/osrelease"))try{let r=(e.readSync("/proc/sys/kernel/osrelease")||"").toLowerCase()||"";(r.includes("microsoft")||r.includes("wsl"))&&(t=!0)}catch{}if(!t&&process.platform==="win32"){let r=process.cwd();r&&(r.includes("\\wsl$")||r.includes("\\wsl.localhost"))&&(t=!0)}let s=typeof process.versions?.bun=="string";return{isDocker:n,isWSL2:t,isBun:s}}function fs(n,e){if(n!==void 0)return n;let{isDocker:t,isWSL2:s,isBun:r}=ds();if(t||s||r){let o=t?"Docker":s?"WSL2":"Bun";return e.info(`Detected ${o} environment - enabling polling mode for file watching`),!0}}function pt(n,e={},t){let s=O.getInstance(),r=s.getRepoRoot(),{watch:o,hmr:a,host:i,...l}=e||{},u=a||{},c=i===!0?"localhost":i||"localhost",p={...u.port&&{port:u.port},...u.clientPort&&{clientPort:u.clientPort},host:u.host??c,...u.protocol&&{protocol:u.protocol},overlay:u.overlay??!0,timeout:u.timeout??5e3},g=i!==void 0?i:!0,d=l.https===!0;return{port:n,host:g,open:e.open!==void 0?e.open:!0,https:d,fs:{allow:[r,s.resolveRepoPath("packages"),s.resolveRepoPath("node_modules")],strict:!1},watch:{usePolling:fs(e?.watch?.usePolling,t),interval:e?.watch?.interval??2e3,...e?.watch||{}},hmr:{...p,...u},headers:{"Cross-Origin-Opener-Policy":"same-origin-allow-popups","Cross-Origin-Embedder-Policy":"unsafe-none"},middlewareMode:!1,...l}}function gt(n={}){let e=n.https===!0;return{...n,https:e}}j();var ee={CONCATENATE_DEDUPE:"CONCATENATE_DEDUPE",SHALLOW_MERGE:"SHALLOW_MERGE",DEEP_MERGE:"DEEP_MERGE",REPLACE:"REPLACE"};function ge(n,e,t,s={}){let{protectedKeys:r=[],onConflict:o}=s;if(e==null)return n;switch(t){case ee.CONCATENATE_DEDUPE:{if(!Array.isArray(n)||!Array.isArray(e))return e;let a=[...n,...e];return[...new Set(a)]}case ee.SHALLOW_MERGE:return typeof n!="object"||typeof e!="object"||n===null||e===null||Array.isArray(n)||Array.isArray(e)?e:{...n,...e};case ee.DEEP_MERGE:{if(typeof n!="object"||typeof e!="object"||n===null||e===null||Array.isArray(n)||Array.isArray(e))return e;let a={...n};for(let i in e){if(r.includes(i)){o&&o(i,n[i],e[i]);continue}typeof a[i]=="object"&&typeof e[i]=="object"&&a[i]!==null&&e[i]!==null&&!Array.isArray(a[i])&&!Array.isArray(e[i])?a[i]=ge(a[i],e[i],ee.DEEP_MERGE,{protectedKeys:r,onConflict:o}):a[i]=e[i]}return a}case ee.REPLACE:default:return e}}function dt(n,e,t=[],s){let r=[...n,...e||[]],o=[...new Set(r)];return[...new Set([...o,...t])]}var Ne={base:"/",mode:process.env.NODE_ENV==="production"?"production":"development",debug:!1,verbose:process.env.CI!=="true",server:{port:3e3,strictPort:!0,host:!0,open:!0,cors:!0,https:!0,hmr:{overlay:!0,timeout:5e3,usePolling:void 0,interval:2e3},watch:{usePolling:void 0,interval:2e3}},build:{sourcemap:!0,target:"es2020",minify:"esbuild",cssMinify:"esbuild",analyze:!0},preview:{port:4173,strictPort:!0,host:!0,open:!1,cors:!0,https:!0},routes:{hmr:!0},themes:{},i18n:{},assets:{},features:{},pwa:{enabled:!1},seo:{disabled:!1,generateRobotsTxt:!0,generateSitemap:!0,crawlDelay:1},serverShim:{enabled:!0},chunking:{reactCore:[]},discovery:{verbose:!0,cacheTimeout:6e4,fileLogging:!1,logDir:".dndev-logs"},pluginFactory:{verbose:!0,disableHmr:!1,hmrSmartDetection:!0,hmrDebounceMs:500,hmrCacheTimeout:3e4},resolve:{alias:{"@":"/src"},preserveSymlinks:!1},define:{__DEV__:JSON.stringify(process.env.NODE_ENV==="development"),__PROD__:JSON.stringify(process.env.NODE_ENV==="production")},optimizeDeps:{include:[...he.mandatoryIncludes],exclude:[...he.buildTools,...Object.values(C)],esbuildOptions:{format:"esm",target:"es2020",platform:"browser",define:{"process.env.NODE_ENV":JSON.stringify(process.env.NODE_ENV||"development")},external:["next","next/*"]}},plugins:[],css:{},envDir:void 0};function ft(n={},e={}){let{onConflict:t}=e,s={...Ne},r=[],o=(a,i,l,u)=>{r.push({key:a,frameworkValue:i,userValue:l,reason:u}),t&&t(a,i,l,u)};return Object.keys(n).forEach(a=>{let i=n[a],l=s[a];if(a==="optimizeDeps"&&typeof i=="object"&&i!==null){let u=l?.include||[],c=l?.exclude||[],p=i.include||[],g=i.exclude||[],d=u.filter(_=>!_.startsWith("@donotdev/")),h=g.filter(_=>d.includes(_));if(h.length>0)for(let _ of h)o("optimizeDeps.exclude",_,"excluded",`Framework requires ${_} to be included. It will be included despite your exclusion.`);let F=dt(u,p,d),I=ge(c,g,ee.CONCATENATE_DEDUPE),S=ge(l?.esbuildOptions||{},i.esbuildOptions||{},ee.DEEP_MERGE,{protectedKeys:["external"],onConflict:_=>o(`optimizeDeps.esbuildOptions.${_}`,l?.esbuildOptions?.[_],i.esbuildOptions?.[_],`Framework requires ${_} to remain as configured.`)});s[a]={...l,include:F,exclude:I,esbuildOptions:S,...Object.fromEntries(Object.entries(i).filter(([_])=>!["include","exclude","esbuildOptions"].includes(_)))};return}if(a==="css"&&typeof i=="object"&&i!==null){s[a]=ge(l||{},i,ee.DEEP_MERGE,{protectedKeys:["postcss"],onConflict:()=>o("css.postcss","framework PostCSS config",i.postcss,"Framework PostCSS config is required and cannot be overridden. Your postcss config is ignored.")});return}if(a==="define"&&typeof i=="object"&&i!==null){s[a]=ge(l||{},i,ee.DEEP_MERGE,{protectedKeys:["__DEV__","__PROD__"],onConflict:u=>o(`define.${u}`,l?.[u],i[u],`Framework requires ${u} to remain as configured.`)});return}if(Array.isArray(i)){Array.isArray(l)?s[a]=ge(l,i,ee.CONCATENATE_DEDUPE):s[a]=i;return}if(typeof i=="object"&&i!==null&&typeof l=="object"&&l!==null&&!Array.isArray(l)){s[a]=ge(l,i,ee.SHALLOW_MERGE);return}s[a]=i}),s}function mt(n){let{server:e={},preview:t={},mode:s,build:r={},resolve:o={},routes:a={},themes:i={},i18n:l={},assets:u={},features:c={},seo:p={},pwa:g={},serverShim:d={},chunking:h={},discovery:F={},pluginFactory:I={},debug:S,verbose:_,base:$,define:b={},optimizeDeps:w={},plugins:m=[],css:D={},envDir:A,...K}=n,E=s!=="production",x=S||E,G=s==="production"&&(r.analyze??Ne.build.analyze);return{mode:s,debug:S,verbose:_,isDev:E,isDebug:x,shouldAnalyze:G,serverOptions:e,previewOptions:t,buildOverrides:r,resolveOptions:o,routeOptions:a,themeOptions:i,i18nOptions:l,assetOptions:u,featureOptions:c,seoOptions:p,pwaOptions:g,serverShimOptions:d,chunkingOptions:h,discoveryOptions:F,pluginFactoryOptions:I,base:$,defineOptions:b,optimizeDepsOptions:w,pluginsOptions:m,cssOptions:D,envDir:A,restOptions:K}}q();import{resolve as ms}from"node:path";import hs from"autoprefixer";import vs from"postcss-import";import ys from"postcss-nesting";function ht({postcssImport:n,postcssNesting:e,autoprefixer:t,resolve:s}){return{plugins:[s?n({resolve:s}):n,e,t({overrideBrowserslist:["> 1%","last 2 versions","Firefox ESR","not dead","not op_mini all"],grid:"autoplace"})]}}function vt(n={}){if(n.postcss)return n.postcss;let e=O.getInstance();return ht({postcssImport:vs,postcssNesting:ys,autoprefixer:hs,resolve:(s,r)=>{let o=e.resolvePackage(s,r);if(o)return o;if(s.startsWith("@donotdev/")){let a=s.split("/")[0]+"/"+s.split("/")[1],i=s.split("/").slice(2).join("/"),l=e.resolveFrameworkPackage(a,r);if(l&&i){let u=e.resolvePath(i,l);if(e.pathExists(u))return u}}return ms(r,s)}})}import Cs from"@vitejs/plugin-basic-ssl";import Ms from"@vitejs/plugin-react";import Ls from"vite-tsconfig-paths";var V=class{static generateVirtualModule(e,t,s=!1,r=void 0,o=void 0){return t.isEmpty(e)?t.generateEmpty(e,s,r,o):t.generateModule(e,s,o)}static generateInspection(e,t,s,r){return t.generateInspection.length>=3?t.generateInspection(e,s,r):t.generateInspection(e,s)}static wrapVirtualModule(e,t){return`// Virtual module: ${e}
7
+ `)),{outDir:"dist",sourcemap:o||a,cacheDir:"node_modules/.vite",target:"baseline-widely-available",minify:a?!1:"esbuild",reportCompressedSize:!1,chunkSizeWarningLimit:2048,assetsInlineLimit:0,esbuild:{format:"esm",drop:a?[]:["console","debugger"],legalComments:"none"},cssMinify:a?!1:"esbuild",cssCodeSplit:!0,rollupOptions:{external:gs(),output:{format:"es",entryFileNames:"assets/[name].[hash].js",chunkFileNames:"assets/[name].[hash].js",assetFileNames:"assets/[name].[hash][extname]",...c.manualChunks&&{manualChunks:c.manualChunks},compact:!0},onwarn(g,d){g.code!=="MODULE_LEVEL_DIRECTIVE"&&d(g)},plugins:[...a?[]:[us({include:["**/*.js","**/*.ts","**/*.tsx","**/*.jsx"],functions:["console.*","debugger"],labels:["debug"]})],...i?[(()=>{let g=O.getInstance(),d=g.getAppRoot(),h="dist",F=g.resolveAppPath(`${h}/stats.html`),I=()=>{try{let $=g.resolveAppPath(h);g.pathExists($)||g.mkdir($)}catch{}},S=ps({filename:F,open:!0,gzipSize:!0,brotliSize:!0,template:"treemap",sourcemap:o||a,projectRoot:d});if(S.buildStart){let $=S.buildStart.bind(S);S.buildStart=function(...b){I();let w=$.apply(this,b);return w&&typeof w.then=="function"?w.catch(m=>{}):w}}else S.buildStart=function(){I()};let _=["generateBundle","writeBundle","closeBundle"];for(let $ of _)if(S[$]){let b=S[$];S[$]=function(...w){try{I();let m=b.apply(this,w);return m&&typeof m.then=="function"?m.catch(D=>{let A=D?.message||D?.toString()||String(D)||"Unknown error";u.warn(`Bundle visualizer warning in ${$}: ${A}`),$==="closeBundle"&&u.warn(`You can manually open ${F} to view the bundle analysis`)}):m}catch(m){let D=m?.message||m?.toString()||String(m)||"Unknown error";buildLogger.warn(`Bundle visualizer warning in ${$}: ${D}`),$==="closeBundle"&&buildLogger.warn(` You can manually open ${F} to view the bundle analysis`)}}}return S})()]:[]]}}}function gs(n){return n?["firebase-admin","gcp-metadata","google-logging-utils","@google-cloud/firestore",/\.node$/,"esbuild",/@esbuild\/.*/]:["gcp-metadata","google-logging-utils","payload","file-type","firebase-admin","firebase-admin/app","firebase-admin/auth","firebase-admin/firestore","firebase-admin/functions","firebase-admin/credential","@google-cloud/firestore","google-auth-library","google-gax","googleapis-common"]}function ds(){let n=!1,e=O.getInstance();if((e.pathExists("/.dockerenv")||e.pathExists("/run/.containerenv"))&&(n=!0),!n&&(process.env.DOCKER_CONTAINER==="true"||process.env.IS_DOCKER==="true"||process.env.DOCKER_BUILDKIT==="1"||process.env.CI==="true"&&process.env.DOCKER==="true")&&(n=!0),!n&&process.env.DOCKER_HOST&&process.env.DOCKER_HOST.includes("docker")&&(n=!0),!n&&process.platform==="linux"&&e.pathExists("/proc/self/cgroup"))try{let r=e.readSync("/proc/self/cgroup");r&&(r.includes("docker")||r.includes("containerd"))&&(n=!0)}catch{}let t=!1;if((process.env.WSL_DISTRO_NAME||process.env.WSLENV)&&(t=!0),!t&&process.platform==="linux"&&e.pathExists("/proc/version"))try{let r=(e.readSync("/proc/version")||"").toLowerCase();t=r.includes("microsoft")||r.includes("wsl")}catch{}if(!t&&process.platform==="linux"&&e.pathExists("/proc/sys/kernel/osrelease"))try{let r=(e.readSync("/proc/sys/kernel/osrelease")||"").toLowerCase()||"";(r.includes("microsoft")||r.includes("wsl"))&&(t=!0)}catch{}if(!t&&process.platform==="win32"){let r=process.cwd();r&&(r.includes("\\wsl$")||r.includes("\\wsl.localhost"))&&(t=!0)}let s=typeof process.versions?.bun=="string";return{isDocker:n,isWSL2:t,isBun:s}}function fs(n,e){if(n!==void 0)return n;let{isDocker:t,isWSL2:s,isBun:r}=ds();if(t||s||r){let o=t?"Docker":s?"WSL2":"Bun";return e.info(`Detected ${o} environment - enabling polling mode for file watching`),!0}}function pt(n,e={},t){let s=O.getInstance(),r=s.getRepoRoot(),{watch:o,hmr:a,host:i,...l}=e||{},u=a||{},c=i===!0?"localhost":i||"localhost",p={...u.port&&{port:u.port},...u.clientPort&&{clientPort:u.clientPort},host:u.host??c,...u.protocol&&{protocol:u.protocol},overlay:u.overlay??!0,timeout:u.timeout??5e3},g=i!==void 0?i:!0,d=l.https===!0;return{port:n,host:g,open:e.open!==void 0?e.open:!0,https:d,fs:{allow:[r,s.resolveRepoPath("packages"),s.resolveRepoPath("node_modules")],strict:!1},watch:{usePolling:fs(e?.watch?.usePolling,t),interval:e?.watch?.interval??2e3,...e?.watch||{}},hmr:{...p,...u},headers:{"Cross-Origin-Opener-Policy":"same-origin-allow-popups","Cross-Origin-Embedder-Policy":"unsafe-none"},middlewareMode:!1,...l}}function gt(n={}){let e=n.https===!0;return{...n,https:e}}j();var ee={CONCATENATE_DEDUPE:"CONCATENATE_DEDUPE",SHALLOW_MERGE:"SHALLOW_MERGE",DEEP_MERGE:"DEEP_MERGE",REPLACE:"REPLACE"};function ge(n,e,t,s={}){let{protectedKeys:r=[],onConflict:o}=s;if(e==null)return n;switch(t){case ee.CONCATENATE_DEDUPE:{if(!Array.isArray(n)||!Array.isArray(e))return e;let a=[...n,...e];return[...new Set(a)]}case ee.SHALLOW_MERGE:return typeof n!="object"||typeof e!="object"||n===null||e===null||Array.isArray(n)||Array.isArray(e)?e:{...n,...e};case ee.DEEP_MERGE:{if(typeof n!="object"||typeof e!="object"||n===null||e===null||Array.isArray(n)||Array.isArray(e))return e;let a={...n};for(let i in e){if(r.includes(i)){o&&o(i,n[i],e[i]);continue}typeof a[i]=="object"&&typeof e[i]=="object"&&a[i]!==null&&e[i]!==null&&!Array.isArray(a[i])&&!Array.isArray(e[i])?a[i]=ge(a[i],e[i],ee.DEEP_MERGE,{protectedKeys:r,onConflict:o}):a[i]=e[i]}return a}case ee.REPLACE:default:return e}}function dt(n,e,t=[],s){let r=[...n,...e||[]],o=[...new Set(r)];return[...new Set([...o,...t])]}var Ne={base:"/",mode:process.env.NODE_ENV==="production"?"production":"development",debug:!1,verbose:process.env.CI!=="true",server:{port:3e3,strictPort:!0,host:!0,open:!0,cors:!0,https:!0,hmr:{overlay:!0,timeout:5e3,usePolling:void 0,interval:2e3},watch:{usePolling:void 0,interval:2e3}},build:{sourcemap:!0,target:"es2020",minify:"esbuild",cssMinify:"esbuild",analyze:!0},preview:{port:4173,strictPort:!0,host:!0,open:!1,cors:!0,https:!0},routes:{hmr:!0},themes:{},i18n:{},assets:{},features:{},pwa:{enabled:!1},seo:{disabled:!1,generateRobotsTxt:!0,generateSitemap:!0,crawlDelay:1},serverShim:{enabled:!0},chunking:{reactCore:[]},discovery:{verbose:!0,cacheTimeout:6e4,fileLogging:!1,logDir:".dndev-logs"},pluginFactory:{verbose:!0,disableHmr:!1,hmrSmartDetection:!0,hmrDebounceMs:500,hmrCacheTimeout:3e4},resolve:{alias:{"@":"/src"},preserveSymlinks:!1},define:{__DEV__:JSON.stringify(process.env.NODE_ENV==="development"),__PROD__:JSON.stringify(process.env.NODE_ENV==="production")},optimizeDeps:{include:[...he.mandatoryIncludes],exclude:[...he.buildTools,...Object.values(C)],esbuildOptions:{format:"esm",target:"es2020",platform:"browser",define:{"process.env.NODE_ENV":JSON.stringify(process.env.NODE_ENV||"development")},external:["next","next/*"]}},plugins:[],css:{},envDir:void 0};function ft(n={},e={}){let{onConflict:t}=e,s={...Ne},r=[],o=(a,i,l,u)=>{r.push({key:a,frameworkValue:i,userValue:l,reason:u}),t&&t(a,i,l,u)};return Object.keys(n).forEach(a=>{let i=n[a],l=s[a];if(a==="optimizeDeps"&&typeof i=="object"&&i!==null){let u=l?.include||[],c=l?.exclude||[],p=i.include||[],g=i.exclude||[],d=u.filter(_=>!_.startsWith("@donotdev/")),h=g.filter(_=>d.includes(_));if(h.length>0)for(let _ of h)o("optimizeDeps.exclude",_,"excluded",`Framework requires ${_} to be included. It will be included despite your exclusion.`);let F=dt(u,p,d),I=ge(c,g,ee.CONCATENATE_DEDUPE),S=ge(l?.esbuildOptions||{},i.esbuildOptions||{},ee.DEEP_MERGE,{protectedKeys:["external"],onConflict:_=>o(`optimizeDeps.esbuildOptions.${_}`,l?.esbuildOptions?.[_],i.esbuildOptions?.[_],`Framework requires ${_} to remain as configured.`)});s[a]={...l,include:F,exclude:I,esbuildOptions:S,...Object.fromEntries(Object.entries(i).filter(([_])=>!["include","exclude","esbuildOptions"].includes(_)))};return}if(a==="css"&&typeof i=="object"&&i!==null){s[a]=ge(l||{},i,ee.DEEP_MERGE,{protectedKeys:["postcss"],onConflict:()=>o("css.postcss","framework PostCSS config",i.postcss,"Framework PostCSS config is required and cannot be overridden. Your postcss config is ignored.")});return}if(a==="define"&&typeof i=="object"&&i!==null){s[a]=ge(l||{},i,ee.DEEP_MERGE,{protectedKeys:["__DEV__","__PROD__"],onConflict:u=>o(`define.${u}`,l?.[u],i[u],`Framework requires ${u} to remain as configured.`)});return}if(Array.isArray(i)){Array.isArray(l)?s[a]=ge(l,i,ee.CONCATENATE_DEDUPE):s[a]=i;return}if(typeof i=="object"&&i!==null&&typeof l=="object"&&l!==null&&!Array.isArray(l)){s[a]=ge(l,i,ee.SHALLOW_MERGE);return}s[a]=i}),s}function mt(n){let{server:e={},preview:t={},mode:s,build:r={},resolve:o={},routes:a={},themes:i={},i18n:l={},assets:u={},features:c={},seo:p={},pwa:g={},serverShim:d={},chunking:h={},discovery:F={},pluginFactory:I={},debug:S,verbose:_,base:$,define:b={},optimizeDeps:w={},plugins:m=[],css:D={},envDir:A,...K}=n,E=s!=="production",x=S||E,G=s==="production"&&(r.analyze??Ne.build.analyze);return{mode:s,debug:S,verbose:_,isDev:E,isDebug:x,shouldAnalyze:G,serverOptions:e,previewOptions:t,buildOverrides:r,resolveOptions:o,routeOptions:a,themeOptions:i,i18nOptions:l,assetOptions:u,featureOptions:c,seoOptions:p,pwaOptions:g,serverShimOptions:d,chunkingOptions:h,discoveryOptions:F,pluginFactoryOptions:I,base:$,defineOptions:b,optimizeDepsOptions:w,pluginsOptions:m,cssOptions:D,envDir:A,restOptions:K}}q();import ms from"autoprefixer";import hs from"postcss-import";import vs from"postcss-nesting";function ht({postcssImport:n,postcssNesting:e,autoprefixer:t,resolve:s}){return{plugins:[s?n({resolve:s}):n,e,t({overrideBrowserslist:["> 1%","last 2 versions","Firefox ESR","not dead","not op_mini all"],grid:"autoplace"})]}}function vt(n={}){if(n.postcss)return n.postcss;let e=O.getInstance();return ht({postcssImport:hs,postcssNesting:vs,autoprefixer:ms,resolve:(s,r)=>{let o=e.resolvePackage(s,r);if(o)return o;if(s.startsWith("@donotdev/")){let a=s.split("/")[0]+"/"+s.split("/")[1],i=s.split("/").slice(2).join("/"),l=e.resolveFrameworkPackage(a,r);if(l&&i){let u=e.resolvePath(i,l);if(e.pathExists(u))return u}}return e.resolvePath(s,r)}})}import Is from"@vitejs/plugin-basic-ssl";import Cs from"@vitejs/plugin-react";import Ms from"vite-tsconfig-paths";var V=class{static generateVirtualModule(e,t,s=!1,r=void 0,o=void 0){return t.isEmpty(e)?t.generateEmpty(e,s,r,o):t.generateModule(e,s,o)}static generateInspection(e,t,s,r){return t.generateInspection.length>=3?t.generateInspection(e,s,r):t.generateInspection(e,s)}static wrapVirtualModule(e,t){return`// Virtual module: ${e}
8
8
  // Generated by @donotdev/config discovery
9
9
  // Version: 1.0.0
10
10
 
@@ -46,7 +46,7 @@ var Kt=Object.defineProperty;var je=(n,e)=>()=>(n&&(e=n(n=0)),e);var Zt=(n,e)=>{
46
46
  if (import.meta.hot) {
47
47
  import.meta.hot.accept();
48
48
  }
49
- `),M}function ze(f){return V.generateInspection(f,i,R,A)}async function be(){if(R)try{let f=await Z[o](),v=ze(f),M=x.resolveAppPath(_);await x.write(M,v),E.debug(`Generated inspection file: ${x.getRelativePath(M)}`)}catch(f){E.error(`${e} failed to write inspection file (${_}): ${f.message}`),E.error(`Stack: ${f.stack||"No stack trace available"}`)}}function Re(f){let v=f.replace(/\\/g,"/");if(m||v.includes("/node_modules/")||v.includes("/.git/")||v.includes("/dist/")||v.includes("/build/")||v.includes("/coverage/")||v.includes("/.vite/")||v.includes("/.turbo/")||v.endsWith(".d.ts")||v.endsWith(".tsbuildinfo")||v.endsWith(".map")||v.endsWith(".css.map")||v.endsWith(".generated.log")||/\.generated\.[a-z]+$/.test(v))return!1;let M=x.getRelativePath(v);if(M.startsWith("packages/"))return!1;let ne=M.startsWith("src/")&&/\.(ts|tsx)$/.test(M);return ne?Array.isArray(a)&&a.length>0?a.some(se=>typeof se=="function"?se(v):typeof se=="string"?se.startsWith("**/")?v.endsWith(se.slice(3)):v.endsWith(se):!1):ne:!1}function _e(f){if(m)return E.debug("Virtual modules are static - HMR disabled"),[];let v=Date.now();return le?(E.debug("HMR already in progress, skipping update"),[]):v-L<$?(fe||(fe=!0,k=setTimeout(()=>{fe=!1,L=Date.now(),$e(f)},$)),[]):(L=v,$e(f))}function $e(f){let v=Date.now();if(ue===f.file&&v-L<100)return E.debug(`Same file processed too recently: ${f.file}`),[];if(!Re(f.file))return E.debug(`Skipping irrelevant file change: ${f.file}`),[];E.debug(`Relevant file changed: ${f.file}`),le=!0,ue=f.file;try{let M=Date.now()-(W?.timestamp||0);if(M<b&&W){E.debug(`Using cached discovery data (age: ${M}ms)`);let se=f.server.moduleGraph.getModuleById(oe);return se&&f.server.reloadModule(se),[]}Z.clearCache();let ne=f.server.moduleGraph.getModuleById(oe);return ne&&f.server.reloadModule(ne),k&&clearTimeout(k),k=setTimeout(()=>{be()},500),[]}finally{le=!1,setTimeout(()=>{ue===f.file&&(ue=null)},200)}}return{name:e,enforce:"pre",configResolved(f){R=f.root,N=f.command==="serve",F&&E.debug(`${t} ${e} initialized`),N&&E.debug("\u{1F4A1} Dev mode: Press 'r' in terminal to restart, or use global.__DNDEV_CLEAR_CACHE__() in console"),i.logConfig&&i.logConfig(A)},config(f){return f.optimizeDeps||(f.optimizeDeps={}),f.optimizeDeps.exclude||(f.optimizeDeps.exclude=[]),f.optimizeDeps.exclude.includes(S)||f.optimizeDeps.exclude.push(S),f},resolveId(f){return f===S?(E.debug(`Resolving virtual module: ${f}`),{id:oe,moduleSideEffects:!0}):null},async load(f){if(f!==oe)return null;if(E.debug(`Loading virtual module: ${f}`),!G()){E.warn("\u26A0\uFE0F load() called before appRoot is set - waiting for config resolution");let v=0;for(;!G()&&v<100;)await new Promise(M=>setTimeout(M,10)),v++;if(!G())throw new Error("App root not set before discovery. Ensure configResolved hook has set appRoot.")}try{let v;return W?(E.debug("Using cached discovery data for virtual module"),v=W):(E.warn(`\u26A0\uFE0F No cached discovery data found for ${e} - running discovery in load() hook. This may indicate buildStart() hook did not run or failed. Performance may be impacted.`),v=await Z[o](),W=v,E.debug("Discovery completed for virtual module")),Le(v)}catch(v){return E.error(`${e} virtual module (${oe}) failed to load: ${v.message}`),E.error(`Stack: ${v.stack||"No stack trace available"}`),i.generateEmpty({},F,A,K)}},async buildStart(){if(me=!1,!G()){E.warn("\u26A0\uFE0F buildStart() called before appRoot is set - waiting for config resolution");let f=0;for(;!G()&&f<100;)await new Promise(v=>setTimeout(v,10)),f++;if(!G())throw new Error("App root not set before discovery. Ensure configResolved hook has set appRoot.")}try{let f=await Z[o](!W);W=f,await be(),i.logStats&&i.logStats(f,t,E)}catch(f){E.error(`${e} discovery failed during file scanning: ${f.message}`),E.error(`Stack: ${f.stack||"No stack trace available"}`),W=V.getEmptyResultWithError(Z,f)}finally{me=!0}},configureServer(){me=!0},handleHotUpdate(f){return m?[]:me?_e(f):(E.debug("HMR disabled - discovery not complete yet"),[])},generateBundle(){if(!W){E.warn("No cached discovery data for manifest generation - skipping");return}try{let f=V.generateManifest(W,i.generateManifest);this.emitFile({type:"asset",fileName:u,source:JSON.stringify(f,null,2)}),I&&i.logManifest&&i.logManifest(W,e)}catch(f){E.error(`${e} manifest generation failed: ${f.message}`),E.error(`Stack: ${f.stack||"No stack trace available"}`)}},transform(f,v){return v===oe?{code:f,map:null}:null}}}}var Wr={generateGlobals:V.generateGlobals,generateExports:V.generateExports,generateDefaultExport:V.generateDefaultExport,wrapVirtualModule:V.wrapVirtualModule,generateInspectionHeader:V.generateInspectionHeader,validateTemplates:V.validateTemplates,createTemplateConfig:V.createTemplateConfig};j();var te=class n{constructor(e,t={}){if(this.constructor===n)throw new Error("BaseDiscovery is abstract and cannot be instantiated directly");this.pathResolver=e,this.options={...t},process.env.NODE_ENV==="development"&&(this.options.cacheTimeout=Math.max(this.options.cacheTimeout||6e4,3e5)),this.logger=T(this._getDiscoveryType(),this.options.debug,this.options.verbose,{fileLogging:this.options.fileLogging,logDir:this.options.logDir}),this.cache=null,this._lastDiscoveryTime=0}async discover(e=!1){if(!e&&this._isCacheValid())return this.logger.debug("Using cached results"),this.cache;let t=Date.now();try{let s=await this._getPatterns();this.options.verbose&&s&&(typeof s=="object"&&s.pattern?this.logger.verbose(`Pattern: ${s.pattern}`):typeof s=="string"&&this.logger.verbose(`Pattern: ${s}`),s.dirs&&this.logger.verbose(`Search directories: ${s.dirs.slice(0,3).join(", ")}${s.dirs.length>3?` (${s.dirs.length} total)`:""}`));let r=await this._scanFiles(s),o=await this._processFiles(r);this.cache={...o,timestamp:Date.now()};let a=Date.now()-t;return this.logger.debug(`Discovery completed in ${a}ms`),this._lastDiscoveryTime=Date.now(),this.cache}catch(s){return this.logger.error(`${this._getDiscoveryType()} discovery failed during file scanning: ${s.message}`),this.logger.error(`Stack: ${s.stack||"No stack trace available"}`),this._getEmptyResult()}}clearCache(){this.cache=null,this._lastDiscoveryTime=0,this.logger.debug("Cache cleared")}getCachedResults(){return this.cache}_getDiscoveryType(){throw new Error("_getDiscoveryType must be implemented by subclass")}_getPatterns(){throw new Error("_getPatterns must be implemented by subclass")}_getPatternType(){throw new Error("_getPatternType must be implemented by subclass")}async _processFiles(e){throw new Error("_processFiles must be implemented by subclass")}_getEmptyResult(){throw new Error("_getEmptyResult must be implemented by subclass")}_getDiscoverySummary(){throw new Error("_getDiscoverySummary must be implemented by subclass")}async _scanFiles(e){let t=this._getPatternType();return await this.pathResolver.resolveFiles(e,t)}_extractFileNameInfo(e){let t=e.split("/"),s=t[t.length-1],r=s.split(".")[0],o=s.split(".").pop();return{fileName:s,baseName:r,extension:o,directory:t.slice(0,-1).join("/")}}async _processSingleFile(e,t){try{let s=this.pathResolver.getFileInfo(e);return s?await t(s):(this.logger.debug(`Could not get file info: ${e}`),null)}catch(s){return this.logger.debug(`Error processing file ${e}: ${s.message}`),null}}async _batchProcessFiles(e,t){return(await Promise.all(e.map(r=>this._processSingleFile(r,t)))).filter(r=>r!==null)}_isCacheValid(){return this.cache?Date.now()-this.cache.timestamp<this.options.cacheTimeout:!1}};j();var Te=class extends te{constructor(e,t={}){super(e,{assets:Q.assets.fallback,assetPatterns:Q.assets.patterns,frameworkPackage:We.package,assetsPath:We.assetsPath,modernFormats:Q.assets.modern,...t}),this.hasRunForSession=!1}_getDiscoveryType(){return"Asset"}async _getPatterns(){return await this.pathResolver.resolvePatterns("assets")}_getPatternType(){return"assets"}async _processFiles(e){let t=this.pathResolver.getAppRoot(),s=await this._ensureDefaultAssets(t),r=this.pathResolver.resolveAppPath("public/logo.svg");this.pathResolver.pathExists(r)||this.logger.warn("logo.svg not found in public/. Add your logo.svg to generate PWA assets, or copy from node_modules/@donotdev/ui/assets/logo.svg");let a=[],i=this.pathResolver.resolveAppPath("public/logo.svg");this.pathResolver.pathExists(i)&&this.options.generateAssets!==!1&&(a=(await this._generateMissingAssets(t))?.generated||[]);let{consumerFiles:l}=e,u=await this._processAssetFiles(l),c=this._buildAssetManifest(u),p=await this._readLogoSvgContent("/logo.svg",t);return{assets:u,manifest:{...c,logoSvgContent:p},copiedAssets:s,generatedAssets:a,pwaIcons:this._extractPWAIcons(u)}}_extractPWAIcons(e){let t=[/icon-(\d+)x(\d+)\.(png|jpg|jpeg|webp|svg)/i,/apple-touch-icon/i,/android-chrome/i,/favicon\.(ico|svg)/i];return e.filter(s=>{let r=s.path.split("/").pop()||"";return t.some(o=>o.test(r))}).map(s=>{let r=s.path.split("/").pop()||"",o=r.match(/(\d+)x(\d+)/),a=o?{width:parseInt(o[1]),height:parseInt(o[2])}:this._getDefaultIconSize(r);return{type:"icon",path:s.path.replace(/^\/?public\//,""),size:a,format:s.format||this._getFormatFromPath(s.path),purpose:this._getIconPurpose(r)}})}_getDefaultIconSize(e){return e.includes("apple-touch-icon")?{width:180,height:180}:e.includes("favicon")?{width:32,height:32}:{width:192,height:192}}_getFormatFromPath(e){return e.split(".").pop()?.toLowerCase()||"png"}_getIconPurpose(e){return e.includes("maskable")||e.includes("mask")?"maskable":"any"}_getEmptyResult(){return{assets:[],manifest:this._getEmptyManifest(),copiedAssets:[],timestamp:Date.now()}}_getDiscoverySummary(){let e=this.cache?.assets?.length||0,t=this.cache?.copiedAssets?.length||0;return`${e} assets, ${t} copied`}async discoverAssets(e=!1){return await this.discover(e)}getAssets(){return this.cache?.assets||[]}getManifest(){return this.cache?.manifest||this._getEmptyManifest()}getOptimalAsset(e,t){let s=this.getAssets().map(o=>o.path),r=t||this.options.modernFormats;for(let o of r){let a=`/${e}.${o}`;if(s.includes(a))return a}return null}async _ensureDefaultAssets(e){this.logger.debug("Ensuring default assets with modern format support...");let t=[];try{let s=await this._resolveFrameworkAssetsDir(e);if(this.logger.debug(`Framework assets directory resolved to: ${s}`),!s)return this.logger.debug("Framework assets directory not found, skipping defaults"),t;let r=this.pathResolver.resolveAppPath(we.public);this.pathResolver.pathExists(r)||(this.pathResolver.mkdir(r),this.logger.debug(`Created public directory: ${r}`));for(let o of this.options.assets)await this._ensureAsset(o,r,s)&&t.push(o);t.length>0&&this.logger.debug(`Added ${t.length} default assets from DNDev framework`)}catch(s){this.logger.debug(`Failed to ensure default assets: ${s.message}`)}return t}async _ensureAsset(e,t,s){let r=this.pathResolver.resolveAppPath(`${we.public}/${e}`);if(this.pathResolver.pathExists(r))return this.logger.debug(`Asset exists: ${e}`),!1;let o=this.pathResolver.normalizePath(`${s}/${e}`);if(this.pathResolver.pathExists(o)){if(await this.pathResolver.copy(o,r))return this.logger.debug(`Copied framework asset: ${e}`),!0;this.logger.debug(`Failed to copy framework asset: ${e}`)}return!1}async _processAssetFiles(e){let t=[];for(let s of e)try{let r=this.pathResolver.getFileInfo(s);if(r&&r.isFile){let o=s.split("/").pop()||s.split("\\").pop(),a=this._analyzeAsset(o,r.size);a&&t.push(a)}}catch(r){this.logger.debug(`Error processing asset file ${s}: ${r.message}`)}return this.logger.debug(`Processed ${t.length} assets from ${e.length} files`),t}_analyzeAsset(e,t){let s=this._determineAssetType(e),r=this._determineAssetFormat(e);return this.options.assetPatterns.some(a=>this._matchesPattern(e,a))?{path:`/${e}`,name:e,type:s,format:r,size:t,sizeFormatted:this._formatBytes(t),isModern:this.options.modernFormats.includes(r)}:(this.logger.debug(`Asset ${e} does not match any pattern, skipping`),null)}_determineAssetType(e){let t=e.toLowerCase();if(t.includes("favicon"))return"favicon";if(t.includes("logo"))return"logo";if(t.includes("icon"))return"icon";if(t.includes("apple-touch"))return"apple-touch-icon";if(t.includes("android-chrome"))return"android-icon";if(t.includes("manifest"))return"manifest";let s=e.split(".").pop()?.toLowerCase();return["png","jpg","jpeg","gif","webp","avif","svg"].includes(s)?"image":["woff2","woff","ttf","otf"].includes(s)?"font":["json"].includes(s)?"json":["ico"].includes(s)?"icon":"unknown"}_determineAssetFormat(e){return e.split(".").pop()?.toLowerCase()||"unknown"}_formatBytes(e){if(e===0)return"0 Bytes";let t=1024,s=["Bytes","KB","MB","GB"],r=Math.floor(Math.log(e)/Math.log(t));return parseFloat((e/Math.pow(t,r)).toFixed(2))+" "+s[r]}_matchesPattern(e,t){let s=e.toLowerCase(),r=t.toLowerCase();return s.includes(r.replace("*",""))}_buildAssetManifest(e){let t=e.map(r=>r.path);return{logo:{optimal:this._getOptimalAsset("logo",t,this.options.modernFormats),fallback:this._getOptimalAsset("logo",t,["png","jpg","jpeg"])},favicon:{optimal:this._getOptimalAsset("favicon",t,["svg","ico"]),fallback:this._getOptimalAsset("favicon",t,["ico"])},appleTouchIcon:this._getOptimalAsset("apple-touch-icon",t,["png"]),androidChrome:{192:this._getOptimalAsset("android-chrome-192x192",t,["png"]),512:this._getOptimalAsset("android-chrome-512x512",t,["png"])},manifest:t.find(r=>r.includes("manifest.json"))||null,modernFormats:e.filter(r=>r.isModern).map(r=>r.path),fallbackFormats:e.filter(r=>!r.isModern).map(r=>r.path)}}_getOptimalAsset(e,t,s){for(let r of s){let o=`/${e}.${r}`;if(t.includes(o))return o}return null}async _resolveFrameworkAssetsDir(e){try{let t=this.pathResolver.getRepoRoot(),s=await this._resolvePackage("@donotdev/ui",t);if(!s)return this.logger.debug("@donotdev/ui package not found"),null;let r=this.pathResolver.normalizePath(`${s}/assets`);return this.pathResolver.pathExists(r)?(this.logger.debug(`Using framework assets from: ${r}`),r):(this.logger.debug(`Assets directory not found: ${r}`),null)}catch(t){return this.logger.debug(`Error resolving framework assets directory: ${t.message}`),null}}async _resolvePackage(e,t){try{let s=this.pathResolver.resolveFrameworkPackage(e,t);return s?(this.logger.debug(`Found package: ${s}`),s):(this.logger.debug(`Package ${e} not found`),null)}catch(s){return this.logger.debug(`Error resolving package ${e}: ${s.message}`),null}}_getEmptyManifest(){return{logo:{optimal:null,fallback:null},favicon:{optimal:null,fallback:null},appleTouchIcon:null,androidChrome:{192:null,512:null},manifest:null,modernFormats:[],fallbackFormats:[],logoSvgContent:null}}async _readLogoSvgContent(e,t){if(!e||!e.endsWith(".svg"))return null;try{let s=e.slice(1),r=this.pathResolver.resolveAppPath(`${we.public}/${s}`);return this.pathResolver.pathExists(r)&&await this.pathResolver.read(r,{format:"text"})||null}catch(s){return this.logger.debug(`Failed to read logo SVG content: ${s.message}`),null}}async _copyFrameworkLogo(e){try{let t=await this._resolveFrameworkAssetsDir(e);if(!t)return this.logger.debug("Framework assets directory not found"),!1;let s=this.pathResolver.normalizePath(`${t}/logo.svg`);if(!this.pathResolver.pathExists(s))return this.logger.debug("Framework logo.svg not found"),!1;let r=this.pathResolver.resolveAppPath(we.public);this.pathResolver.pathExists(r)||this.pathResolver.mkdir(r);let o=this.pathResolver.resolveAppPath("public/logo.svg");return await this.pathResolver.copy(s,o)}catch(t){return this.logger.debug(`Failed to copy framework logo: ${t.message}`),!1}}async _generateMissingAssets(e){let t=this.pathResolver.resolveAppPath("public/logo.svg"),s=this.pathResolver.resolveAppPath("public");if(!this.pathResolver.pathExists(t))return this.logger.debug("logo.svg not found in public/, skipping asset generation"),{generated:[],skipped:[],error:"logo.svg not found in public/"};let r=[{name:"favicon.ico",size:32,format:"ico"},{name:"apple-touch-icon.png",size:180,format:"png"},{name:"icon-192x192.png",size:192,format:"png"},{name:"icon-512x512.png",size:512,format:"png"}],o=[{name:"favicon.svg",format:"svg"}],a=[],i=[];try{let l=await this.pathResolver.read(t,{format:"text"});if(!l)return{generated:[],skipped:[...o,...r].map(c=>c.name),error:"Failed to read logo.svg"};for(let c of o){let p=`${s}/${c.name}`;if(this.pathResolver.pathExists(p)){i.push(c.name);continue}try{await this.pathResolver.write(`public/${c.name}`,l),a.push(c.name)}catch(g){this.logger.debug(`Failed to copy ${c.name}: ${g.message}`),i.push(c.name)}}let u=await import("sharp").catch(()=>null);if(!u)this.logger.debug("sharp not installed, skipping PNG/ICO generation"),i.push(...r.map(c=>c.name));else for(let c of r){let p=`${s}/${c.name}`;if(this.pathResolver.pathExists(p)){i.push(c.name);continue}try{let g=u.default(t).resize(c.size,c.size,{fit:"contain",background:{r:255,g:255,b:255,alpha:0}}),d;c.format==="ico"?d=await g.toFormat("png").toBuffer():d=await g.toFormat(c.format).toBuffer(),await this.pathResolver.write(`public/${c.name}`,d),a.push(c.name)}catch(g){this.logger.debug(`Failed to generate ${c.name}: ${g.message}`),i.push(c.name)}}return{generated:a,skipped:i,error:null}}catch(l){return this.logger.debug(`Asset generation failed: ${l.message}`),{generated:[],skipped:requiredAssets.map(u=>u.name),error:l.message}}}};q();var Je={data:null},bs={isEmpty:n=>!n.manifest||n.assets?.length===0,generateModule:(n,e,t="assets")=>{let{manifest:s,assets:r,copiedAssets:o}=n,a=s.logoSvgContent||null,i={totalAssets:r.length,copiedAssets:o.length,hasLogo:s.logo.optimal!==null,hasFavicon:s.favicon.optimal!==null,hasManifest:s.manifest!==null,timestamp:new Date().toISOString()};return`// ${C.assets} - Generated asset manifest
49
+ `),M}function ze(f){return V.generateInspection(f,i,R,A)}async function be(){if(R)try{let f=await Z[o](),v=ze(f),M=x.resolveAppPath(_);await x.write(M,v),E.debug(`Generated inspection file: ${x.getRelativePath(M)}`)}catch(f){E.error(`${e} failed to write inspection file (${_}): ${f.message}`),E.error(`Stack: ${f.stack||"No stack trace available"}`)}}function Re(f){let v=f.replace(/\\/g,"/");if(m||v.includes("/node_modules/")||v.includes("/.git/")||v.includes("/dist/")||v.includes("/build/")||v.includes("/coverage/")||v.includes("/.vite/")||v.includes("/.turbo/")||v.endsWith(".d.ts")||v.endsWith(".tsbuildinfo")||v.endsWith(".map")||v.endsWith(".css.map")||v.endsWith(".generated.log")||/\.generated\.[a-z]+$/.test(v))return!1;let M=x.getRelativePath(v);if(M.startsWith("packages/"))return!1;let ne=M.startsWith("src/")&&/\.(ts|tsx)$/.test(M);return ne?Array.isArray(a)&&a.length>0?a.some(se=>typeof se=="function"?se(v):typeof se=="string"?se.startsWith("**/")?v.endsWith(se.slice(3)):v.endsWith(se):!1):ne:!1}function _e(f){if(m)return E.debug("Virtual modules are static - HMR disabled"),[];let v=Date.now();return le?(E.debug("HMR already in progress, skipping update"),[]):v-L<$?(fe||(fe=!0,k=setTimeout(()=>{fe=!1,L=Date.now(),$e(f)},$)),[]):(L=v,$e(f))}function $e(f){let v=Date.now();if(ue===f.file&&v-L<100)return E.debug(`Same file processed too recently: ${f.file}`),[];if(!Re(f.file))return E.debug(`Skipping irrelevant file change: ${f.file}`),[];E.debug(`Relevant file changed: ${f.file}`),le=!0,ue=f.file;try{let M=Date.now()-(W?.timestamp||0);if(M<b&&W){E.debug(`Using cached discovery data (age: ${M}ms)`);let se=f.server.moduleGraph.getModuleById(oe);return se&&f.server.reloadModule(se),[]}Z.clearCache();let ne=f.server.moduleGraph.getModuleById(oe);return ne&&f.server.reloadModule(ne),k&&clearTimeout(k),k=setTimeout(()=>{be()},500),[]}finally{le=!1,setTimeout(()=>{ue===f.file&&(ue=null)},200)}}return{name:e,enforce:"pre",configResolved(f){R=f.root,N=f.command==="serve",F&&E.debug(`${t} ${e} initialized`),N&&E.debug("\u{1F4A1} Dev mode: Press 'r' in terminal to restart, or use global.__DNDEV_CLEAR_CACHE__() in console"),i.logConfig&&i.logConfig(A)},config(f){return f.optimizeDeps||(f.optimizeDeps={}),f.optimizeDeps.exclude||(f.optimizeDeps.exclude=[]),f.optimizeDeps.exclude.includes(S)||f.optimizeDeps.exclude.push(S),f},resolveId(f){return f===S?(E.debug(`Resolving virtual module: ${f}`),{id:oe,moduleSideEffects:!0}):null},async load(f){if(f!==oe)return null;if(E.debug(`Loading virtual module: ${f}`),!G()){E.warn("\u26A0\uFE0F load() called before appRoot is set - waiting for config resolution");let v=0;for(;!G()&&v<100;)await new Promise(M=>setTimeout(M,10)),v++;if(!G())throw new Error("App root not set before discovery. Ensure configResolved hook has set appRoot.")}try{let v;return W?(E.debug("Using cached discovery data for virtual module"),v=W):(E.warn(`\u26A0\uFE0F No cached discovery data found for ${e} - running discovery in load() hook. This may indicate buildStart() hook did not run or failed. Performance may be impacted.`),v=await Z[o](),W=v,E.debug("Discovery completed for virtual module")),Le(v)}catch(v){return E.error(`${e} virtual module (${oe}) failed to load: ${v.message}`),E.error(`Stack: ${v.stack||"No stack trace available"}`),i.generateEmpty({},F,A,K)}},async buildStart(){if(me=!1,!G()){E.warn("\u26A0\uFE0F buildStart() called before appRoot is set - waiting for config resolution");let f=0;for(;!G()&&f<100;)await new Promise(v=>setTimeout(v,10)),f++;if(!G())throw new Error("App root not set before discovery. Ensure configResolved hook has set appRoot.")}try{let f=await Z[o](!W);W=f,await be(),i.logStats&&i.logStats(f,t,E)}catch(f){E.error(`${e} discovery failed during file scanning: ${f.message}`),E.error(`Stack: ${f.stack||"No stack trace available"}`),W=V.getEmptyResultWithError(Z,f)}finally{me=!0}},configureServer(){me=!0},handleHotUpdate(f){return m?[]:me?_e(f):(E.debug("HMR disabled - discovery not complete yet"),[])},generateBundle(){if(!W){E.warn("No cached discovery data for manifest generation - skipping");return}try{let f=V.generateManifest(W,i.generateManifest);this.emitFile({type:"asset",fileName:u,source:JSON.stringify(f,null,2)}),I&&i.logManifest&&i.logManifest(W,e)}catch(f){E.error(`${e} manifest generation failed: ${f.message}`),E.error(`Stack: ${f.stack||"No stack trace available"}`)}},transform(f,v){return v===oe?{code:f,map:null}:null}}}}var zr={generateGlobals:V.generateGlobals,generateExports:V.generateExports,generateDefaultExport:V.generateDefaultExport,wrapVirtualModule:V.wrapVirtualModule,generateInspectionHeader:V.generateInspectionHeader,validateTemplates:V.validateTemplates,createTemplateConfig:V.createTemplateConfig};j();var te=class n{constructor(e,t={}){if(this.constructor===n)throw new Error("BaseDiscovery is abstract and cannot be instantiated directly");this.pathResolver=e,this.options={...t},process.env.NODE_ENV==="development"&&(this.options.cacheTimeout=Math.max(this.options.cacheTimeout||6e4,3e5)),this.logger=T(this._getDiscoveryType(),this.options.debug,this.options.verbose,{fileLogging:this.options.fileLogging,logDir:this.options.logDir}),this.cache=null,this._lastDiscoveryTime=0}async discover(e=!1){if(!e&&this._isCacheValid())return this.logger.debug("Using cached results"),this.cache;let t=Date.now();try{let s=await this._getPatterns();this.options.verbose&&s&&(typeof s=="object"&&s.pattern?this.logger.verbose(`Pattern: ${s.pattern}`):typeof s=="string"&&this.logger.verbose(`Pattern: ${s}`),s.dirs&&this.logger.verbose(`Search directories: ${s.dirs.slice(0,3).join(", ")}${s.dirs.length>3?` (${s.dirs.length} total)`:""}`));let r=await this._scanFiles(s),o=await this._processFiles(r);this.cache={...o,timestamp:Date.now()};let a=Date.now()-t;return this.logger.debug(`Discovery completed in ${a}ms`),this._lastDiscoveryTime=Date.now(),this.cache}catch(s){return this.logger.error(`${this._getDiscoveryType()} discovery failed during file scanning: ${s.message}`),this.logger.error(`Stack: ${s.stack||"No stack trace available"}`),this._getEmptyResult()}}clearCache(){this.cache=null,this._lastDiscoveryTime=0,this.logger.debug("Cache cleared")}getCachedResults(){return this.cache}_getDiscoveryType(){throw new Error("_getDiscoveryType must be implemented by subclass")}_getPatterns(){throw new Error("_getPatterns must be implemented by subclass")}_getPatternType(){throw new Error("_getPatternType must be implemented by subclass")}async _processFiles(e){throw new Error("_processFiles must be implemented by subclass")}_getEmptyResult(){throw new Error("_getEmptyResult must be implemented by subclass")}_getDiscoverySummary(){throw new Error("_getDiscoverySummary must be implemented by subclass")}async _scanFiles(e){let t=this._getPatternType();return await this.pathResolver.resolveFiles(e,t)}_extractFileNameInfo(e){let t=e.split("/"),s=t[t.length-1],r=s.split(".")[0],o=s.split(".").pop();return{fileName:s,baseName:r,extension:o,directory:t.slice(0,-1).join("/")}}async _processSingleFile(e,t){try{let s=this.pathResolver.getFileInfo(e);return s?await t(s):(this.logger.debug(`Could not get file info: ${e}`),null)}catch(s){return this.logger.debug(`Error processing file ${e}: ${s.message}`),null}}async _batchProcessFiles(e,t){return(await Promise.all(e.map(r=>this._processSingleFile(r,t)))).filter(r=>r!==null)}_isCacheValid(){return this.cache?Date.now()-this.cache.timestamp<this.options.cacheTimeout:!1}};j();var Te=class extends te{constructor(e,t={}){super(e,{assets:Q.assets.fallback,assetPatterns:Q.assets.patterns,frameworkPackage:We.package,assetsPath:We.assetsPath,modernFormats:Q.assets.modern,...t}),this.hasRunForSession=!1}_getDiscoveryType(){return"Asset"}async _getPatterns(){return await this.pathResolver.resolvePatterns("assets")}_getPatternType(){return"assets"}async _processFiles(e){let t=this.pathResolver.getAppRoot(),s=await this._ensureDefaultAssets(t),r=this.pathResolver.resolveAppPath("public/logo.svg");this.pathResolver.pathExists(r)||this.logger.warn("logo.svg not found in public/. Add your logo.svg to generate PWA assets, or copy from node_modules/@donotdev/ui/assets/logo.svg");let a=[],i=this.pathResolver.resolveAppPath("public/logo.svg");this.pathResolver.pathExists(i)&&this.options.generateAssets!==!1&&(a=(await this._generateMissingAssets(t))?.generated||[]);let{consumerFiles:l}=e,u=await this._processAssetFiles(l),c=this._buildAssetManifest(u),p=await this._readLogoSvgContent("/logo.svg",t);return{assets:u,manifest:{...c,logoSvgContent:p},copiedAssets:s,generatedAssets:a,pwaIcons:this._extractPWAIcons(u)}}_extractPWAIcons(e){let t=[/icon-(\d+)x(\d+)\.(png|jpg|jpeg|webp|svg)/i,/apple-touch-icon/i,/android-chrome/i,/favicon\.(ico|svg)/i];return e.filter(s=>{let r=s.path.split("/").pop()||"";return t.some(o=>o.test(r))}).map(s=>{let r=s.path.split("/").pop()||"",o=r.match(/(\d+)x(\d+)/),a=o?{width:parseInt(o[1]),height:parseInt(o[2])}:this._getDefaultIconSize(r);return{type:"icon",path:s.path.replace(/^\/?public\//,""),size:a,format:s.format||this._getFormatFromPath(s.path),purpose:this._getIconPurpose(r)}})}_getDefaultIconSize(e){return e.includes("apple-touch-icon")?{width:180,height:180}:e.includes("favicon")?{width:32,height:32}:{width:192,height:192}}_getFormatFromPath(e){return e.split(".").pop()?.toLowerCase()||"png"}_getIconPurpose(e){return e.includes("maskable")||e.includes("mask")?"maskable":"any"}_getEmptyResult(){return{assets:[],manifest:this._getEmptyManifest(),copiedAssets:[],timestamp:Date.now()}}_getDiscoverySummary(){let e=this.cache?.assets?.length||0,t=this.cache?.copiedAssets?.length||0;return`${e} assets, ${t} copied`}async discoverAssets(e=!1){return await this.discover(e)}getAssets(){return this.cache?.assets||[]}getManifest(){return this.cache?.manifest||this._getEmptyManifest()}getOptimalAsset(e,t){let s=this.getAssets().map(o=>o.path),r=t||this.options.modernFormats;for(let o of r){let a=`/${e}.${o}`;if(s.includes(a))return a}return null}async _ensureDefaultAssets(e){this.logger.debug("Ensuring default assets with modern format support...");let t=[];try{let s=await this._resolveFrameworkAssetsDir(e);if(this.logger.debug(`Framework assets directory resolved to: ${s}`),!s)return this.logger.debug("Framework assets directory not found, skipping defaults"),t;let r=this.pathResolver.resolveAppPath(we.public);this.pathResolver.pathExists(r)||(this.pathResolver.mkdir(r),this.logger.debug(`Created public directory: ${r}`));for(let o of this.options.assets)await this._ensureAsset(o,r,s)&&t.push(o);t.length>0&&this.logger.debug(`Added ${t.length} default assets from DNDev framework`)}catch(s){this.logger.debug(`Failed to ensure default assets: ${s.message}`)}return t}async _ensureAsset(e,t,s){let r=this.pathResolver.resolveAppPath(`${we.public}/${e}`);if(this.pathResolver.pathExists(r))return this.logger.debug(`Asset exists: ${e}`),!1;let o=this.pathResolver.normalizePath(`${s}/${e}`);if(this.pathResolver.pathExists(o)){if(await this.pathResolver.copy(o,r))return this.logger.debug(`Copied framework asset: ${e}`),!0;this.logger.debug(`Failed to copy framework asset: ${e}`)}return!1}async _processAssetFiles(e){let t=[];for(let s of e)try{let r=this.pathResolver.getFileInfo(s);if(r&&r.isFile){let o=s.split("/").pop()||s.split("\\").pop(),a=this._analyzeAsset(o,r.size);a&&t.push(a)}}catch(r){this.logger.debug(`Error processing asset file ${s}: ${r.message}`)}return this.logger.debug(`Processed ${t.length} assets from ${e.length} files`),t}_analyzeAsset(e,t){let s=this._determineAssetType(e),r=this._determineAssetFormat(e);return this.options.assetPatterns.some(a=>this._matchesPattern(e,a))?{path:`/${e}`,name:e,type:s,format:r,size:t,sizeFormatted:this._formatBytes(t),isModern:this.options.modernFormats.includes(r)}:(this.logger.debug(`Asset ${e} does not match any pattern, skipping`),null)}_determineAssetType(e){let t=e.toLowerCase();if(t.includes("favicon"))return"favicon";if(t.includes("logo"))return"logo";if(t.includes("icon"))return"icon";if(t.includes("apple-touch"))return"apple-touch-icon";if(t.includes("android-chrome"))return"android-icon";if(t.includes("manifest"))return"manifest";let s=e.split(".").pop()?.toLowerCase();return["png","jpg","jpeg","gif","webp","avif","svg"].includes(s)?"image":["woff2","woff","ttf","otf"].includes(s)?"font":["json"].includes(s)?"json":["ico"].includes(s)?"icon":"unknown"}_determineAssetFormat(e){return e.split(".").pop()?.toLowerCase()||"unknown"}_formatBytes(e){if(e===0)return"0 Bytes";let t=1024,s=["Bytes","KB","MB","GB"],r=Math.floor(Math.log(e)/Math.log(t));return parseFloat((e/Math.pow(t,r)).toFixed(2))+" "+s[r]}_matchesPattern(e,t){let s=e.toLowerCase(),r=t.toLowerCase();return s.includes(r.replace("*",""))}_buildAssetManifest(e){let t=e.map(r=>r.path);return{logo:{optimal:this._getOptimalAsset("logo",t,this.options.modernFormats),fallback:this._getOptimalAsset("logo",t,["png","jpg","jpeg"])},favicon:{optimal:this._getOptimalAsset("favicon",t,["svg","ico"]),fallback:this._getOptimalAsset("favicon",t,["ico"])},appleTouchIcon:this._getOptimalAsset("apple-touch-icon",t,["png"]),androidChrome:{192:this._getOptimalAsset("android-chrome-192x192",t,["png"]),512:this._getOptimalAsset("android-chrome-512x512",t,["png"])},manifest:t.find(r=>r.includes("manifest.json"))||null,modernFormats:e.filter(r=>r.isModern).map(r=>r.path),fallbackFormats:e.filter(r=>!r.isModern).map(r=>r.path)}}_getOptimalAsset(e,t,s){for(let r of s){let o=`/${e}.${r}`;if(t.includes(o))return o}return null}async _resolveFrameworkAssetsDir(e){try{let t=this.pathResolver.getRepoRoot(),s=await this._resolvePackage("@donotdev/ui",t);if(!s)return this.logger.debug("@donotdev/ui package not found"),null;let r=this.pathResolver.normalizePath(`${s}/assets`);return this.pathResolver.pathExists(r)?(this.logger.debug(`Using framework assets from: ${r}`),r):(this.logger.debug(`Assets directory not found: ${r}`),null)}catch(t){return this.logger.debug(`Error resolving framework assets directory: ${t.message}`),null}}async _resolvePackage(e,t){try{let s=this.pathResolver.resolveFrameworkPackage(e,t);return s?(this.logger.debug(`Found package: ${s}`),s):(this.logger.debug(`Package ${e} not found`),null)}catch(s){return this.logger.debug(`Error resolving package ${e}: ${s.message}`),null}}_getEmptyManifest(){return{logo:{optimal:null,fallback:null},favicon:{optimal:null,fallback:null},appleTouchIcon:null,androidChrome:{192:null,512:null},manifest:null,modernFormats:[],fallbackFormats:[],logoSvgContent:null}}async _readLogoSvgContent(e,t){if(!e||!e.endsWith(".svg"))return null;try{let s=e.slice(1),r=this.pathResolver.resolveAppPath(`${we.public}/${s}`);return this.pathResolver.pathExists(r)&&await this.pathResolver.read(r,{format:"text"})||null}catch(s){return this.logger.debug(`Failed to read logo SVG content: ${s.message}`),null}}async _copyFrameworkLogo(e){try{let t=await this._resolveFrameworkAssetsDir(e);if(!t)return this.logger.debug("Framework assets directory not found"),!1;let s=this.pathResolver.normalizePath(`${t}/logo.svg`);if(!this.pathResolver.pathExists(s))return this.logger.debug("Framework logo.svg not found"),!1;let r=this.pathResolver.resolveAppPath(we.public);this.pathResolver.pathExists(r)||this.pathResolver.mkdir(r);let o=this.pathResolver.resolveAppPath("public/logo.svg");return await this.pathResolver.copy(s,o)}catch(t){return this.logger.debug(`Failed to copy framework logo: ${t.message}`),!1}}async _generateMissingAssets(e){let t=this.pathResolver.resolveAppPath("public/logo.svg"),s=this.pathResolver.resolveAppPath("public");if(!this.pathResolver.pathExists(t))return this.logger.debug("logo.svg not found in public/, skipping asset generation"),{generated:[],skipped:[],error:"logo.svg not found in public/"};let r=[{name:"favicon.ico",size:32,format:"ico"},{name:"apple-touch-icon.png",size:180,format:"png"},{name:"icon-192x192.png",size:192,format:"png"},{name:"icon-512x512.png",size:512,format:"png"}],o=[{name:"favicon.svg",format:"svg"}],a=[],i=[];try{let l=await this.pathResolver.read(t,{format:"text"});if(!l)return{generated:[],skipped:[...o,...r].map(c=>c.name),error:"Failed to read logo.svg"};for(let c of o){let p=`${s}/${c.name}`;if(this.pathResolver.pathExists(p)){i.push(c.name);continue}try{await this.pathResolver.write(`public/${c.name}`,l),a.push(c.name)}catch(g){this.logger.debug(`Failed to copy ${c.name}: ${g.message}`),i.push(c.name)}}let u=await import("sharp").catch(()=>null);if(!u)this.logger.debug("sharp not installed, skipping PNG/ICO generation"),i.push(...r.map(c=>c.name));else for(let c of r){let p=`${s}/${c.name}`;if(this.pathResolver.pathExists(p)){i.push(c.name);continue}try{let g=u.default(t).resize(c.size,c.size,{fit:"contain",background:{r:255,g:255,b:255,alpha:0}}),d;c.format==="ico"?d=await g.toFormat("png").toBuffer():d=await g.toFormat(c.format).toBuffer(),await this.pathResolver.write(`public/${c.name}`,d),a.push(c.name)}catch(g){this.logger.debug(`Failed to generate ${c.name}: ${g.message}`),i.push(c.name)}}return{generated:a,skipped:i,error:null}}catch(l){return this.logger.debug(`Asset generation failed: ${l.message}`),{generated:[],skipped:requiredAssets.map(u=>u.name),error:l.message}}}};q();var Je={data:null},ys={isEmpty:n=>!n.manifest||n.assets?.length===0,generateModule:(n,e,t="assets")=>{let{manifest:s,assets:r,copiedAssets:o}=n,a=s.logoSvgContent||null,i={totalAssets:r.length,copiedAssets:o.length,hasLogo:s.logo.optimal!==null,hasFavicon:s.favicon.optimal!==null,hasManifest:s.manifest!==null,timestamp:new Date().toISOString()};return`// ${C.assets} - Generated asset manifest
50
50
  const assetManifest = ${JSON.stringify(s,null,2)};
51
51
  const assetStats = ${JSON.stringify(i,null,2)};
52
52
 
@@ -232,7 +232,7 @@ export const assetStats = {
232
232
  };
233
233
 
234
234
  export default discoveredAssets;
235
- `},generateManifest:n=>({assets:n.assets?.length||0,copied:n.copiedAssets?.length||0,timestamp:Date.now(),hasLogo:n.manifest?.logo?.optimal!==null,hasFavicon:n.manifest?.favicon?.optimal!==null}),logConfig:n=>{},logStats:(n,e,t)=>{let s=n.assets?.length||0,r=n.generatedAssets?.length||0;t&&(r>0?t.info(`${e} Assets: ${s} found, ${r} generated`):t.info(`${e} Assets: ${s} found`))}},ws=[n=>n.includes("/public/"),n=>n.endsWith(".png")||n.endsWith(".svg")||n.endsWith(".ico"),n=>n.includes("favicon")||n.includes("logo")||n.includes("manifest")];function yt(n={}){let e=ie({pluginName:"dndev-vite-asset-discovery",icon:"\u{1F3AF}",virtualModuleId:C.assets,DiscoveryClass:Te,discoveryMethod:"discoverAssets",filePatterns:ws,templates:bs,defaultInspectionPath:z.vite.assetInspection,manifestFileName:z.manifests.asset,configKey:"assets"})(n),t=O.getInstance(),s=T("asset-plugin",n.debug,n.verbose),r=e.buildStart;return e.buildStart=async function(...o){r&&await r.apply(this,o);let a=null;try{let i=t.resolveAppPath(z.vite.assetInspection);if(t.pathExists(i)){let l=t.readSync(i,{format:"json"});l&&(a=l,Je.data=a)}}catch(i){s.debug(`Could not cache asset data: ${i.message}`)}},e}import{loadEnv as xs}from"vite";j();var bt={isEmpty:n=>!n.env||Object.keys(n.env).length===0,generateModule:(n,e,t="env")=>{let{env:s,mode:r}=n;if(!s||Object.keys(s).length===0)return bt.generateEmpty(n,e,void 0,t);let o={totalVars:Object.keys(s).length,mode:r,source:n.source,generatedAt:new Date().toISOString()};return`// ${C.env} - Generated environment variables
235
+ `},generateManifest:n=>({assets:n.assets?.length||0,copied:n.copiedAssets?.length||0,timestamp:Date.now(),hasLogo:n.manifest?.logo?.optimal!==null,hasFavicon:n.manifest?.favicon?.optimal!==null}),logConfig:n=>{},logStats:(n,e,t)=>{let s=n.assets?.length||0,r=n.generatedAssets?.length||0;t&&(r>0?t.info(`${e} Assets: ${s} found, ${r} generated`):t.info(`${e} Assets: ${s} found`))}},bs=[n=>n.includes("/public/"),n=>n.endsWith(".png")||n.endsWith(".svg")||n.endsWith(".ico"),n=>n.includes("favicon")||n.includes("logo")||n.includes("manifest")];function yt(n={}){let e=ie({pluginName:"dndev-vite-asset-discovery",icon:"\u{1F3AF}",virtualModuleId:C.assets,DiscoveryClass:Te,discoveryMethod:"discoverAssets",filePatterns:bs,templates:ys,defaultInspectionPath:z.vite.assetInspection,manifestFileName:z.manifests.asset,configKey:"assets"})(n),t=O.getInstance(),s=T("asset-plugin",n.debug,n.verbose),r=e.buildStart;return e.buildStart=async function(...o){r&&await r.apply(this,o);let a=null;try{let i=t.resolveAppPath(z.vite.assetInspection);if(t.pathExists(i)){let l=t.readSync(i,{format:"json"});l&&(a=l,Je.data=a)}}catch(i){s.debug(`Could not cache asset data: ${i.message}`)}},e}import{loadEnv as ws}from"vite";j();var bt={isEmpty:n=>!n.env||Object.keys(n.env).length===0,generateModule:(n,e,t="env")=>{let{env:s,mode:r}=n;if(!s||Object.keys(s).length===0)return bt.generateEmpty(n,e,void 0,t);let o={totalVars:Object.keys(s).length,mode:r,source:n.source,generatedAt:new Date().toISOString()};return`// ${C.env} - Generated environment variables
236
236
 
237
237
  const envData = ${JSON.stringify(s,null,2)};
238
238
  const envManifest = ${JSON.stringify(o,null,2)};
@@ -311,10 +311,10 @@ export const source = 'empty';
311
311
 
312
312
  export default envData;
313
313
  `},generateInspection:n=>{let{env:e,mode:t}=n;return["/**"," * Generated Environment Variables",` * Mode: ${t}`,` * Generated at: ${new Date().toISOString()}`,` * Total variables: ${Object.keys(e).length}`," */","","```json",JSON.stringify(e,null,2),"```"].join(`
314
- `)},generateManifest:n=>({totalVars:Object.keys(n?.env||{}).length,mode:n?.mode||"development",variables:Object.keys(n?.env||{}),timestamp:Date.now()}),logStats:(n,e,t)=>{let s=Object.keys(n.env).length;t&&t.info(`${e} Env: ${s} VITE_* variables`)}},qe=class{constructor(e,t={}){this.pathResolver=e,this.options=t,this.mode=t.mode||"development",this.appRoot=null}async discoverEnv(){try{let e=this.pathResolver.getAppRoot();if(!e)throw new Error("App root not available in EnvDiscovery");let s={...xs(this.mode,e,"VITE_")};return this.mode==="production"&&(delete s.VITE_USE_FIREBASE_EMULATOR,delete s.VITE_FIREBASE_EMULATOR_HOST,delete s.VITE_FIREBASE_AUTH_EMULATOR_HOST,delete s.VITE_FIREBASE_FIRESTORE_EMULATOR_HOST,delete s.VITE_FIREBASE_FUNCTIONS_EMULATOR_PORT),s.MODE=this.mode,s.DEV=this.mode==="development",s.PROD=this.mode==="production",s.SSR=!1,{env:s,mode:this.mode,source:`${e}/.env`,errors:[]}}catch(e){return{env:{},mode:this.mode,source:"error",errors:[e.message]}}}};function wt(n={}){return ie({pluginName:"dndev-vite-env-discovery",icon:"\u{1F510}",virtualModuleId:C.env,discoveryMethod:"discoverEnv",filePatterns:[],templates:bt,defaultInspectionPath:z.vite.envInspection,manifestFileName:z.manifests.env,configKey:"env",createDiscovery:(e,t)=>new qe(e,{...t,mode:n.mode||t.mode||"development"})})({...n,disableHmr:!0})}q();j();var xt=/--(?:font-family|font-headline)\s*:\s*(?:['"]([^'"]+)['"]|([^;]+?));/g,de=class{constructor(e,t={}){if(!e)throw new Error("CSSExtractor requires PathResolver instance");this.pathResolver=e,this.options={debug:!1,customPatterns:{},...t},this.logger=t.logger||{debug:(s,...r)=>{this.options.debug}},this.patterns={selectors:{...Ve.selectors,...this.options.customPatterns?.selectors},themes:{...Ve.themes,...this.options.customPatterns?.themes}}}cssVarToJsIdentifier(e){if(!e||typeof e!="string")return this._debug(`Invalid CSS variable: ${e}`),null;let t=e.replace(/^--/,"");if(!t)return this._debug(`Empty CSS variable after removing --: ${e}`),null;let s=t.split("-").filter(a=>a.length>0);if(s.length===0)return this._debug(`No valid parts in CSS variable: ${e}`),null;let r=s.map((a,i)=>{let l=a.replace(/[^a-zA-Z0-9]/g,"");return l?i===0?l.toLowerCase():l.charAt(0).toUpperCase()+l.slice(1).toLowerCase():null}).filter(Boolean).join("");return!r||!/^[a-zA-Z][a-zA-Z0-9]*$/.test(r)?(this._debug(`Invalid JavaScript identifier generated from ${e}: ${r}`),null):["const","let","var","function","class","export","import","default","if","else","for","while"].includes(r)?`${r}Var`:r}_stripComments(e){return e.replace(/\/\*[\s\S]*?\*\//g,"")}extractThemes(e,t,s){let r=[],o,a=this.pathResolver.normalizePath(t),i=this._stripComments(e),l=/(?::root\.|\.)([a-z][a-z0-9-]*)\s*\{([^}]*--theme-label\s*:\s*['"]([^'"]+)['"][^}]*)\}/gim;for(;(o=l.exec(i))!==null;){let[,u,c,p]=o;if(!u||!p)continue;let g=c.match(this.patterns.themes.themeIcon),d=c.match(this.patterns.themes.themeIsDark),h={name:u,displayName:p,isDark:d?d[1]==="1":!1,meta:{icon:g?.[1]},source:this.pathResolver.getBasename(t)};this._debug(`Discovered theme: ${u} (${p})`),r.push(h),s.themes.set(u,{name:u,displayName:p,isDark:h.isDark,file:a,variables:new Set,meta:h.meta})}return r.length>0&&this._debug(`Extracted ${r.length} themes from ${a}`),r}extractClasses(e,t){(e.match(this.patterns.selectors.class)||[]).forEach(r=>{let o=r.slice(1);o.startsWith("_")||t.classes.add(o)})}extractVariables(e,t,s){(e.match(this.patterns.selectors.variable)||[]).forEach(o=>{o.startsWith("--")&&o.length>2?s==="framework"?t.variables.framework.add(o):t.variables.consumer.add(o):this._debug(`Skipping invalid CSS variable: ${o}`)})}extractFontFamilies(e){if(!e||typeof e!="string")return[];let t=this._stripComments(e),s=new Set,r;for(xt.lastIndex=0;(r=xt.exec(t))!==null;){let o=r[1];o&&o.trim()&&s.add(o.trim())}return Array.from(s)}extractKeyframes(e,t){(e.match(this.patterns.selectors.keyframe)||[]).forEach(r=>{let o=r.replace("@keyframes","").trim();o&&t.keyframes.add(o)})}validateCSS(e){let t=[],s=e.match(/--[a-zA-Z0-9-_]*[^a-zA-Z0-9-_:;\s]/g);return s&&s.forEach(o=>{t.push(`Possible malformed CSS variable: ${o}`)}),(e.match(/\.[a-z][a-z0-9-]+\s*\{[^}]*\}/gi)||[]).forEach(o=>{if(!o.includes("--theme-label")&&o.includes("--")){let a=o.match(/\.([a-z][a-z0-9-]+)/)?.[1];a&&t.push(`Theme class "${a}" missing --theme-label`)}}),t}extractAll(e,t,s="consumer"){let r={themes:new Map,classes:new Set,variables:{framework:new Set,consumer:new Set},keyframes:new Set},o=this.extractThemes(e,t,r);this.extractClasses(e,r),this.extractVariables(e,r,s),this.extractKeyframes(e,r);let a=this.validateCSS(e);return{themes:o,classes:Array.from(r.classes),variables:{framework:Array.from(r.variables.framework),consumer:Array.from(r.variables.consumer),all:[...Array.from(r.variables.framework),...Array.from(r.variables.consumer)].sort()},keyframes:Array.from(r.keyframes),warnings:a}}getPatterns(){return{...this.patterns}}setPatterns(e){this.patterns={...this.patterns,...e,selectors:{...this.patterns.selectors,...e.selectors},themes:{...this.patterns.themes,...e.themes}}}_debug(e,t){this.logger.debug(e,t||"")}};j();var Ss=3,Ye="<!-- DNDEV_FONT_PRELOADS -->";function St(n={}){let{debug:e=!1}=n,t=T("font-preload",e,!1),s,r={},o=[],a=[];return{name:"vite-font-preload-plugin",enforce:"post",configResolved(i){r={root:i.root,base:i.base&&i.base!=="/"?i.base.replace(/\/$/,""):"",outDir:i.build?.outDir??"dist"};try{s=O.getInstance()}catch(l){t.debug(`Font preload: PathResolver not ready: ${l?.message}`)}},async buildStart(){if(!(!s||!s.getAppRoot()))try{let l=await s.resolvePatterns("css"),{consumerFiles:u}=await s.resolveFiles(l,"css");if(!u?.length){o=[xe.Inter],t.debug("Font preload: no consumer CSS, using default Inter");return}let c=new de(s,{debug:e,logger:t}),p=new Set;for(let d of u)try{let h=await s.read(d,{format:"text"});h&&c.extractFontFamilies(h).forEach(I=>p.add(I))}catch(h){t.debug(`Font preload: skip read ${d}: ${h?.message}`)}if(p.size===0){o=[xe.Inter],t.debug("Font preload: no font families in CSS, using default Inter");return}let g=new Set;for(let d of p){let h=xe[d];h&&g.add(h)}o=Array.from(g),t.debug(`Font preload: stems ${o.join(", ")} from CSS`)}catch(l){t.debug(`Font preload: discovery failed, use Inter: ${l?.message}`),o=[xe.Inter]}},generateBundle(i,l){if(!o.length)return;let u=r.base||"",c=[];for(let[p,g]of Object.entries(l)){if(g.type!=="asset"||!p.endsWith(".woff2")&&!p.endsWith(".woff"))continue;let d=p.toLowerCase();if(o.some(F=>d.includes(F))){let F=u?`${u}/${p}`:`/${p}`;c.push(F)}}a=c.slice(0,Ss)},writeBundle(){if(!a.length)return;let i=s||O.getInstance(),l=r.root||process.cwd(),u=r.outDir||"dist",c=i.resolvePath(`${u}/index.html`,l);try{if(!i.pathExists(c)){t.debug(`Font preload: index.html not found at ${c}`);return}let p=i.readSync(c,{format:"text"}),g=a.map(d=>`<link rel="preload" as="font" href="${d}" type="font/woff2" crossorigin="anonymous" />`).join(`
314
+ `)},generateManifest:n=>({totalVars:Object.keys(n?.env||{}).length,mode:n?.mode||"development",variables:Object.keys(n?.env||{}),timestamp:Date.now()}),logStats:(n,e,t)=>{let s=Object.keys(n.env).length;t&&t.info(`${e} Env: ${s} VITE_* variables`)}},qe=class{constructor(e,t={}){this.pathResolver=e,this.options=t,this.mode=t.mode||"development",this.appRoot=null}async discoverEnv(){try{let e=this.pathResolver.getAppRoot();if(!e)throw new Error("App root not available in EnvDiscovery");let s={...ws(this.mode,e,"VITE_")};return this.mode==="production"&&(delete s.VITE_USE_FIREBASE_EMULATOR,delete s.VITE_FIREBASE_EMULATOR_HOST,delete s.VITE_FIREBASE_AUTH_EMULATOR_HOST,delete s.VITE_FIREBASE_FIRESTORE_EMULATOR_HOST,delete s.VITE_FIREBASE_FUNCTIONS_EMULATOR_PORT),s.MODE=this.mode,s.DEV=this.mode==="development",s.PROD=this.mode==="production",s.SSR=!1,{env:s,mode:this.mode,source:`${e}/.env`,errors:[]}}catch(e){return{env:{},mode:this.mode,source:"error",errors:[e.message]}}}};function wt(n={}){return ie({pluginName:"dndev-vite-env-discovery",icon:"\u{1F510}",virtualModuleId:C.env,discoveryMethod:"discoverEnv",filePatterns:[],templates:bt,defaultInspectionPath:z.vite.envInspection,manifestFileName:z.manifests.env,configKey:"env",createDiscovery:(e,t)=>new qe(e,{...t,mode:n.mode||t.mode||"development"})})({...n,disableHmr:!0})}q();j();var xt=/--(?:font-family|font-headline)\s*:\s*(?:['"]([^'"]+)['"]|([^;]+?));/g,de=class{constructor(e,t={}){if(!e)throw new Error("CSSExtractor requires PathResolver instance");this.pathResolver=e,this.options={debug:!1,customPatterns:{},...t},this.logger=t.logger||{debug:(s,...r)=>{this.options.debug}},this.patterns={selectors:{...Ve.selectors,...this.options.customPatterns?.selectors},themes:{...Ve.themes,...this.options.customPatterns?.themes}}}cssVarToJsIdentifier(e){if(!e||typeof e!="string")return this._debug(`Invalid CSS variable: ${e}`),null;let t=e.replace(/^--/,"");if(!t)return this._debug(`Empty CSS variable after removing --: ${e}`),null;let s=t.split("-").filter(a=>a.length>0);if(s.length===0)return this._debug(`No valid parts in CSS variable: ${e}`),null;let r=s.map((a,i)=>{let l=a.replace(/[^a-zA-Z0-9]/g,"");return l?i===0?l.toLowerCase():l.charAt(0).toUpperCase()+l.slice(1).toLowerCase():null}).filter(Boolean).join("");return!r||!/^[a-zA-Z][a-zA-Z0-9]*$/.test(r)?(this._debug(`Invalid JavaScript identifier generated from ${e}: ${r}`),null):["const","let","var","function","class","export","import","default","if","else","for","while"].includes(r)?`${r}Var`:r}_stripComments(e){return e.replace(/\/\*[\s\S]*?\*\//g,"")}extractThemes(e,t,s){let r=[],o,a=this.pathResolver.normalizePath(t),i=this._stripComments(e),l=/(?::root\.|\.)([a-z][a-z0-9-]*)\s*\{([^}]*--theme-label\s*:\s*['"]([^'"]+)['"][^}]*)\}/gim;for(;(o=l.exec(i))!==null;){let[,u,c,p]=o;if(!u||!p)continue;let g=c.match(this.patterns.themes.themeIcon),d=c.match(this.patterns.themes.themeIsDark),h={name:u,displayName:p,isDark:d?d[1]==="1":!1,meta:{icon:g?.[1]},source:this.pathResolver.getBasename(t)};this._debug(`Discovered theme: ${u} (${p})`),r.push(h),s.themes.set(u,{name:u,displayName:p,isDark:h.isDark,file:a,variables:new Set,meta:h.meta})}return r.length>0&&this._debug(`Extracted ${r.length} themes from ${a}`),r}extractClasses(e,t){(e.match(this.patterns.selectors.class)||[]).forEach(r=>{let o=r.slice(1);o.startsWith("_")||t.classes.add(o)})}extractVariables(e,t,s){(e.match(this.patterns.selectors.variable)||[]).forEach(o=>{o.startsWith("--")&&o.length>2?s==="framework"?t.variables.framework.add(o):t.variables.consumer.add(o):this._debug(`Skipping invalid CSS variable: ${o}`)})}extractFontFamilies(e){if(!e||typeof e!="string")return[];let t=this._stripComments(e),s=new Set,r;for(xt.lastIndex=0;(r=xt.exec(t))!==null;){let o=r[1];o&&o.trim()&&s.add(o.trim())}return Array.from(s)}extractKeyframes(e,t){(e.match(this.patterns.selectors.keyframe)||[]).forEach(r=>{let o=r.replace("@keyframes","").trim();o&&t.keyframes.add(o)})}validateCSS(e){let t=[],s=e.match(/--[a-zA-Z0-9-_]*[^a-zA-Z0-9-_:;\s]/g);return s&&s.forEach(o=>{t.push(`Possible malformed CSS variable: ${o}`)}),(e.match(/\.[a-z][a-z0-9-]+\s*\{[^}]*\}/gi)||[]).forEach(o=>{if(!o.includes("--theme-label")&&o.includes("--")){let a=o.match(/\.([a-z][a-z0-9-]+)/)?.[1];a&&t.push(`Theme class "${a}" missing --theme-label`)}}),t}extractAll(e,t,s="consumer"){let r={themes:new Map,classes:new Set,variables:{framework:new Set,consumer:new Set},keyframes:new Set},o=this.extractThemes(e,t,r);this.extractClasses(e,r),this.extractVariables(e,r,s),this.extractKeyframes(e,r);let a=this.validateCSS(e);return{themes:o,classes:Array.from(r.classes),variables:{framework:Array.from(r.variables.framework),consumer:Array.from(r.variables.consumer),all:[...Array.from(r.variables.framework),...Array.from(r.variables.consumer)].sort()},keyframes:Array.from(r.keyframes),warnings:a}}getPatterns(){return{...this.patterns}}setPatterns(e){this.patterns={...this.patterns,...e,selectors:{...this.patterns.selectors,...e.selectors},themes:{...this.patterns.themes,...e.themes}}}_debug(e,t){this.logger.debug(e,t||"")}};j();var xs=3,Ye="<!-- DNDEV_FONT_PRELOADS -->";function St(n={}){let{debug:e=!1}=n,t=T("font-preload",e,!1),s,r={},o=[],a=[];return{name:"vite-font-preload-plugin",enforce:"post",configResolved(i){r={root:i.root,base:i.base&&i.base!=="/"?i.base.replace(/\/$/,""):"",outDir:i.build?.outDir??"dist"};try{s=O.getInstance()}catch(l){t.debug(`Font preload: PathResolver not ready: ${l?.message}`)}},async buildStart(){if(!(!s||!s.getAppRoot()))try{let l=await s.resolvePatterns("css"),{consumerFiles:u}=await s.resolveFiles(l,"css");if(!u?.length){o=[xe.Inter],t.debug("Font preload: no consumer CSS, using default Inter");return}let c=new de(s,{debug:e,logger:t}),p=new Set;for(let d of u)try{let h=await s.read(d,{format:"text"});h&&c.extractFontFamilies(h).forEach(I=>p.add(I))}catch(h){t.debug(`Font preload: skip read ${d}: ${h?.message}`)}if(p.size===0){o=[xe.Inter],t.debug("Font preload: no font families in CSS, using default Inter");return}let g=new Set;for(let d of p){let h=xe[d];h&&g.add(h)}o=Array.from(g),t.debug(`Font preload: stems ${o.join(", ")} from CSS`)}catch(l){t.debug(`Font preload: discovery failed, use Inter: ${l?.message}`),o=[xe.Inter]}},generateBundle(i,l){if(!o.length)return;let u=r.base||"",c=[];for(let[p,g]of Object.entries(l)){if(g.type!=="asset"||!p.endsWith(".woff2")&&!p.endsWith(".woff"))continue;let d=p.toLowerCase();if(o.some(F=>d.includes(F))){let F=u?`${u}/${p}`:`/${p}`;c.push(F)}}a=c.slice(0,xs)},writeBundle(){if(!a.length)return;let i=s||O.getInstance(),l=r.root||process.cwd(),u=r.outDir||"dist",c=i.resolvePath(`${u}/index.html`,l);try{if(!i.pathExists(c)){t.debug(`Font preload: index.html not found at ${c}`);return}let p=i.readSync(c,{format:"text"}),g=a.map(d=>`<link rel="preload" as="font" href="${d}" type="font/woff2" crossorigin="anonymous" />`).join(`
315
315
  `);if(p.includes(Ye))p=p.replace(Ye,`${Ye}
316
316
  ${g}`);else{let d=p.indexOf("<!-- Fonts:"),h=d!==-1?p.indexOf("-->",d)+3:p.indexOf("</head>");h!==-1&&(p=p.slice(0,h)+`
317
- ${g}`+p.slice(h))}i.writeSync(c,p,{overwrite:!0}),t.debug(`Font preload: injected ${a.length} link(s)`)}catch(p){t.debug(`Font preload: write failed: ${p?.message}`)}}}}j();j();var Oe=class extends te{constructor(e,t={}){super(e,{fallbackLanguage:"en",additionalPaths:[],...t})}_getDiscoveryType(){return"I18n"}async _getPatterns(){return await this.pathResolver.resolvePatterns("i18n")}_getPatternType(){return"i18n"}async _processFiles(e){let t=this.pathResolver.getAppRoot(),s=this.pathResolver.getRepoRoot();if(!t||t===s)throw this.logger.error(`I18n discovery: appRoot not properly set (appRoot: ${t}, repoRoot: ${s})`),new Error("App root not set before i18n discovery. Ensure configResolved hook has run.");this.logger.debug(`I18n discovery: appRoot=${t}, repoRoot=${s}`);let r=await this._getPatterns();this.logger.debug(`I18n patterns - eager: ${r.eager.length}, lazy: ${r.lazy.length}, framework eager: ${r.framework?.eager?.length||0}, framework lazy: ${r.framework?.lazy?.length||0}`),this.logger.debug(`isMonorepo: ${this.pathResolver.isMonorepo()}, repoRoot: ${this.pathResolver.getRepoRoot()}`);let o=ke("i18n"),a=r.eager||[],i=r.lazy||[],l=(this.options.additionalPaths||[]).map(R=>{let N=R.endsWith(".json")?R:`${R}/*_*.json`;return this.pathResolver.resolveAppPath(N)});l.length>0&&this.logger.debug(`Additional i18n paths configured: ${l.join(", ")}`);let u=r.framework?.eager||[],c=r.framework?.lazy||[];this.logger.debug(`Resolved patterns - eager: ${a.join(", ")}, lazy: ${i.join(", ")}, framework eager: ${u.join(", ")}, framework lazy: ${c.join(", ")}`),u.length===0&&c.length===0&&this.logger.error(`\u26A0\uFE0F Framework i18n patterns are EMPTY! isMonorepo=${this.pathResolver.isMonorepo()}, repoRoot=${this.pathResolver.getRepoRoot()}`);let p=this.pathResolver.normalizePath(t),g=this.pathResolver.normalizePath(s),d=(R,N)=>{let k=this.pathResolver.normalizePath(R),L=this.pathResolver.normalizePath(N);return k.startsWith(L)?k.slice(L.length+1):k},h=a.map(R=>d(R,t)),I=[...i,...l].map(R=>d(R,t)),S=u.map(R=>d(R,s)),_=c.map(R=>d(R,s)),$={...o,onlyFiles:!0,absolute:!0,braceExpansion:!0,extglob:!0,globstar:!0,cwd:t},b=await this.pathResolver._globWithNormalization(h,$),w=await this.pathResolver._globWithNormalization(I,$),m={...o,onlyFiles:!0,absolute:!0,braceExpansion:!0,extglob:!0,globstar:!0,cwd:s,ignore:o.ignore?.filter(R=>R!=="**/node_modules/**")||[]};this.logger.debug(`\u{1F50D} Searching framework patterns with cwd: ${s}, ignore: ${JSON.stringify(m.ignore)}`);let D=await this.pathResolver._globWithNormalization(S,m),A=await this.pathResolver._globWithNormalization(_,m);this.logger.debug(`Found ${b.length} eager, ${w.length} lazy, ${D.length} framework eager, ${A.length} framework lazy files`),D.length>0?this.logger.debug(`Framework eager files (first 3): ${D.slice(0,3).join(", ")}`):this.logger.error(`\u274C NO framework eager files found! Patterns were: ${u.join(", ")}`),A.length>0?this.logger.debug(`Framework lazy files (first 3): ${A.slice(0,3).join(", ")}`):this.logger.error(`\u274C NO framework lazy files found! Patterns were: ${c.join(", ")}`);let K=[...new Set([...b,...w,...D,...A])],E=new Set([...b,...D]),x={mapping:{},content:{},eagerNamespaces:new Set,allNamespaces:new Set,supportedLanguages:new Set,files:[]},G=new Map,ye=[...D,...A];for(let R of ye){let N=this._processTranslationFile(R,D.includes(R),t);if(N){let k=`${N.namespace}_${N.language}`;G.set(k,N),x.allNamespaces.add(N.namespace),x.supportedLanguages.add(N.language),D.includes(R)&&x.eagerNamespaces.add(N.namespace)}}let Z=new Set;for(let R of K){if(ye.includes(R))continue;let N=this._processTranslationFile(R,E.has(R),t);if(N){let{namespace:k,language:L,importPath:fe,content:W}=N,le=`${N.namespace}_${N.language}`;if(G.has(le)){let ue=G.get(le);N.content=this._mergeTranslations(ue.content,W)}x.allNamespaces.add(k),x.supportedLanguages.add(L),Z.add(L),E.has(R)&&x.eagerNamespaces.add(k),x.mapping[k]||(x.mapping[k]={}),x.mapping[k][L]=fe,N.content&&(x.content[k]||(x.content[k]={}),x.content[k][L]=N.content),x.files.push({path:R,relativePath:this.pathResolver.getRelativePath(R),namespace:k,language:L,eager:E.has(R),size:N.content?JSON.stringify(N.content).length:0})}}for(let[R,N]of G){let[k,L]=R.split("_");(!x.mapping[k]||!x.mapping[k][L])&&(x.mapping[k]||(x.mapping[k]={}),x.mapping[k][L]=N.importPath,x.content[k]||(x.content[k]={}),x.content[k][L]=N.content)}let oe=Z.size>0?[...Z].sort():[this.options.fallbackLanguage];return{mapping:x.mapping,content:x.content,eagerNamespaces:[...x.eagerNamespaces].sort(),allNamespaces:[...x.allNamespaces].sort(),supportedLanguages:oe,fallbackLanguage:this.options.fallbackLanguage,files:x.files}}_getEmptyResult(){return{mapping:{},content:{},eagerNamespaces:[],allNamespaces:["common"],supportedLanguages:[this.options.fallbackLanguage],fallbackLanguage:this.options.fallbackLanguage,files:[],timestamp:Date.now()}}_getDiscoverySummary(){return`${this.cache?.allNamespaces?.length||0} namespaces, ${this.cache?.supportedLanguages?.length||0} languages`}async discover(e=!1){if(!e&&this._isCacheValid())return this.logger.debug("Using cached results"),this.cache;let t=Date.now();try{let s=await this._processFiles([]);this.cache={...s,timestamp:Date.now()};let r=Date.now()-t;return this.logger.debug(`Discovery completed in ${r}ms`),this._lastDiscoveryTime=Date.now(),this.cache}catch(s){throw this.logger.error(`I18n discovery failed: ${s.message}`),s}}async discoverTranslations(e=!1){return await this.discover(e)}getMapping(){return this.cache?.mapping||{}}getLanguages(){return this.cache?.supportedLanguages||[this.options.fallbackLanguage]}getNamespaces(){return this.cache?.allNamespaces||["common"]}getEagerNamespaces(){return this.cache?.eagerNamespaces||[]}_processTranslationFile(e,t,s){let r=e.split("/").pop()||e.split("\\").pop()||"",o,a,i=r.match(/^([^_]+)_([^.]+)\.json$/);if(!i)return this.logger.debug(`Invalid translation file name format: ${r}`),null;if([,o,a]=i,!o||!a)return this.logger.debug(`Invalid namespace or language in file: ${r}`),null;let u="./"+this.pathResolver.getRelativePath(e).replace(/\\/g,"/"),c;try{if(c=this.pathResolver.readSync(e,{format:"json"}),!c)return this.logger.debug(`Could not read file: ${e}`),null}catch(p){return this.logger.debug(`Error parsing JSON from ${e}: ${p.message}`),null}return{namespace:o,language:a,importPath:u,content:c}}_mergeTranslations(e,t){let s={...e};for(let[r,o]of Object.entries(t))typeof o=="object"&&o!==null&&!Array.isArray(o)?s[r]=this._mergeTranslations(s[r]||{},o):s[r]=o;return s}};var Es={isEmpty:n=>!n.mapping||Object.keys(n.mapping).length===0,generateModule:(n,e,t="i18n")=>{let{mapping:s,eagerNamespaces:r,supportedLanguages:o,fallbackLanguage:a,stats:i,content:l={}}=n,u={mapping:s,languages:o,eager:r,fallback:a,content:l,storage:{type:"localStorage",prefix:"dndev_i18n_",ttl:1440*60*1e3,encryption:!1,maxSize:5*1024*1024},performance:{cacheSize:1e3,errorCacheTTL:300*1e3},manifest:{totalFiles:i?.totalFiles||0,totalNamespaces:i?.totalNamespaces||0,totalLanguages:i?.totalLanguages||0,eagerNamespaces:i?.eagerNamespaces||0,generatedAt:new Date().toISOString()},debug:e};return`// ${C.i18n} - Generated by @donotdev/config
317
+ ${g}`+p.slice(h))}i.writeSync(c,p,{overwrite:!0}),t.debug(`Font preload: injected ${a.length} link(s)`)}catch(p){t.debug(`Font preload: write failed: ${p?.message}`)}}}}j();j();var Oe=class extends te{constructor(e,t={}){super(e,{fallbackLanguage:"en",additionalPaths:[],...t})}_getDiscoveryType(){return"I18n"}async _getPatterns(){return await this.pathResolver.resolvePatterns("i18n")}_getPatternType(){return"i18n"}async _processFiles(e){let t=this.pathResolver.getAppRoot(),s=this.pathResolver.getRepoRoot();if(!t||t===s)throw this.logger.error(`I18n discovery: appRoot not properly set (appRoot: ${t}, repoRoot: ${s})`),new Error("App root not set before i18n discovery. Ensure configResolved hook has run.");this.logger.debug(`I18n discovery: appRoot=${t}, repoRoot=${s}`);let r=await this._getPatterns();this.logger.debug(`I18n patterns - eager: ${r.eager.length}, lazy: ${r.lazy.length}, framework eager: ${r.framework?.eager?.length||0}, framework lazy: ${r.framework?.lazy?.length||0}`),this.logger.debug(`isMonorepo: ${this.pathResolver.isMonorepo()}, repoRoot: ${this.pathResolver.getRepoRoot()}`);let o=ke("i18n"),a=r.eager||[],i=r.lazy||[],l=(this.options.additionalPaths||[]).map(R=>{let N=R.endsWith(".json")?R:`${R}/*_*.json`;return this.pathResolver.resolveAppPath(N)});l.length>0&&this.logger.debug(`Additional i18n paths configured: ${l.join(", ")}`);let u=r.framework?.eager||[],c=r.framework?.lazy||[];this.logger.debug(`Resolved patterns - eager: ${a.join(", ")}, lazy: ${i.join(", ")}, framework eager: ${u.join(", ")}, framework lazy: ${c.join(", ")}`),u.length===0&&c.length===0&&this.logger.error(`\u26A0\uFE0F Framework i18n patterns are EMPTY! isMonorepo=${this.pathResolver.isMonorepo()}, repoRoot=${this.pathResolver.getRepoRoot()}`);let p=this.pathResolver.normalizePath(t),g=this.pathResolver.normalizePath(s),d=(R,N)=>{let k=this.pathResolver.normalizePath(R),L=this.pathResolver.normalizePath(N);return k.startsWith(L)?k.slice(L.length+1):k},h=a.map(R=>d(R,t)),I=[...i,...l].map(R=>d(R,t)),S=u.map(R=>d(R,s)),_=c.map(R=>d(R,s)),$={...o,onlyFiles:!0,absolute:!0,braceExpansion:!0,extglob:!0,globstar:!0,cwd:t},b=await this.pathResolver._globWithNormalization(h,$),w=await this.pathResolver._globWithNormalization(I,$),m={...o,onlyFiles:!0,absolute:!0,braceExpansion:!0,extglob:!0,globstar:!0,cwd:s,ignore:o.ignore?.filter(R=>R!=="**/node_modules/**")||[]};this.logger.debug(`\u{1F50D} Searching framework patterns with cwd: ${s}, ignore: ${JSON.stringify(m.ignore)}`);let D=await this.pathResolver._globWithNormalization(S,m),A=await this.pathResolver._globWithNormalization(_,m);this.logger.debug(`Found ${b.length} eager, ${w.length} lazy, ${D.length} framework eager, ${A.length} framework lazy files`),D.length>0?this.logger.debug(`Framework eager files (first 3): ${D.slice(0,3).join(", ")}`):this.logger.error(`\u274C NO framework eager files found! Patterns were: ${u.join(", ")}`),A.length>0?this.logger.debug(`Framework lazy files (first 3): ${A.slice(0,3).join(", ")}`):this.logger.error(`\u274C NO framework lazy files found! Patterns were: ${c.join(", ")}`);let K=[...new Set([...b,...w,...D,...A])],E=new Set([...b,...D]),x={mapping:{},content:{},eagerNamespaces:new Set,allNamespaces:new Set,supportedLanguages:new Set,files:[]},G=new Map,ye=[...D,...A];for(let R of ye){let N=this._processTranslationFile(R,D.includes(R),t);if(N){let k=`${N.namespace}_${N.language}`;G.set(k,N),x.allNamespaces.add(N.namespace),x.supportedLanguages.add(N.language),D.includes(R)&&x.eagerNamespaces.add(N.namespace)}}let Z=new Set;for(let R of K){if(ye.includes(R))continue;let N=this._processTranslationFile(R,E.has(R),t);if(N){let{namespace:k,language:L,importPath:fe,content:W}=N,le=`${N.namespace}_${N.language}`;if(G.has(le)){let ue=G.get(le);N.content=this._mergeTranslations(ue.content,W)}x.allNamespaces.add(k),x.supportedLanguages.add(L),Z.add(L),E.has(R)&&x.eagerNamespaces.add(k),x.mapping[k]||(x.mapping[k]={}),x.mapping[k][L]=fe,N.content&&(x.content[k]||(x.content[k]={}),x.content[k][L]=N.content),x.files.push({path:R,relativePath:this.pathResolver.getRelativePath(R),namespace:k,language:L,eager:E.has(R),size:N.content?JSON.stringify(N.content).length:0})}}for(let[R,N]of G){let[k,L]=R.split("_");(!x.mapping[k]||!x.mapping[k][L])&&(x.mapping[k]||(x.mapping[k]={}),x.mapping[k][L]=N.importPath,x.content[k]||(x.content[k]={}),x.content[k][L]=N.content)}let oe=Z.size>0?[...Z].sort():[this.options.fallbackLanguage];return{mapping:x.mapping,content:x.content,eagerNamespaces:[...x.eagerNamespaces].sort(),allNamespaces:[...x.allNamespaces].sort(),supportedLanguages:oe,fallbackLanguage:this.options.fallbackLanguage,files:x.files}}_getEmptyResult(){return{mapping:{},content:{},eagerNamespaces:[],allNamespaces:["common"],supportedLanguages:[this.options.fallbackLanguage],fallbackLanguage:this.options.fallbackLanguage,files:[],timestamp:Date.now()}}_getDiscoverySummary(){return`${this.cache?.allNamespaces?.length||0} namespaces, ${this.cache?.supportedLanguages?.length||0} languages`}async discover(e=!1){if(!e&&this._isCacheValid())return this.logger.debug("Using cached results"),this.cache;let t=Date.now();try{let s=await this._processFiles([]);this.cache={...s,timestamp:Date.now()};let r=Date.now()-t;return this.logger.debug(`Discovery completed in ${r}ms`),this._lastDiscoveryTime=Date.now(),this.cache}catch(s){throw this.logger.error(`I18n discovery failed: ${s.message}`),s}}async discoverTranslations(e=!1){return await this.discover(e)}getMapping(){return this.cache?.mapping||{}}getLanguages(){return this.cache?.supportedLanguages||[this.options.fallbackLanguage]}getNamespaces(){return this.cache?.allNamespaces||["common"]}getEagerNamespaces(){return this.cache?.eagerNamespaces||[]}_processTranslationFile(e,t,s){let r=e.split("/").pop()||e.split("\\").pop()||"",o,a,i=r.match(/^([^_]+)_([^.]+)\.json$/);if(!i)return this.logger.debug(`Invalid translation file name format: ${r}`),null;if([,o,a]=i,!o||!a)return this.logger.debug(`Invalid namespace or language in file: ${r}`),null;let u="./"+this.pathResolver.getRelativePath(e).replace(/\\/g,"/"),c;try{if(c=this.pathResolver.readSync(e,{format:"json"}),!c)return this.logger.debug(`Could not read file: ${e}`),null}catch(p){return this.logger.debug(`Error parsing JSON from ${e}: ${p.message}`),null}return{namespace:o,language:a,importPath:u,content:c}}_mergeTranslations(e,t){let s={...e};for(let[r,o]of Object.entries(t))typeof o=="object"&&o!==null&&!Array.isArray(o)?s[r]=this._mergeTranslations(s[r]||{},o):s[r]=o;return s}};var Ss={isEmpty:n=>!n.mapping||Object.keys(n.mapping).length===0,generateModule:(n,e,t="i18n")=>{let{mapping:s,eagerNamespaces:r,supportedLanguages:o,fallbackLanguage:a,stats:i,content:l={}}=n,u={mapping:s,languages:o,eager:r,fallback:a,content:l,storage:{type:"localStorage",prefix:"dndev_i18n_",ttl:1440*60*1e3,encryption:!1,maxSize:5*1024*1024},performance:{cacheSize:1e3,errorCacheTTL:300*1e3},manifest:{totalFiles:i?.totalFiles||0,totalNamespaces:i?.totalNamespaces||0,totalLanguages:i?.totalLanguages||0,eagerNamespaces:i?.eagerNamespaces||0,generatedAt:new Date().toISOString()},debug:e};return`// ${C.i18n} - Generated by @donotdev/config
318
318
  // \u{1F680} STATIC INJECTION PATTERN - Zero Runtime Loading
319
319
  // Generated at: ${new Date().toISOString()}
320
320
 
@@ -572,7 +572,7 @@ export default {
572
572
  files: translationFiles,
573
573
  manifest: i18nManifest,
574
574
  };
575
- `},generateManifest:n=>({namespaces:n.stats?.totalNamespaces||0,languages:n.stats?.totalLanguages||0,fallbackLanguage:n.fallbackLanguage,eagerNamespaces:n.stats?.eagerNamespaces||0,platform:"vite",timestamp:Date.now()}),logConfig:n=>{},logStats:(n,e,t)=>{let s=n.supportedLanguages||[],r=Object.keys(n.mapping||{}).filter(o=>o!=="default").length||0;t&&t.info(`${e} I18n: ${s.length} languages, ${r} namespaces`)}},Ps=[n=>n.endsWith(".json")&&n.includes("locale"),n=>/[a-z]+_[a-z]{2}\.json$/i.test(n),n=>n.includes("/locales/")&&n.endsWith(".json")];function Et(n={}){return ie({pluginName:"dndev-vite-i18n-discovery",icon:"\u{1F310}",virtualModuleId:C.i18n,DiscoveryClass:Oe,discoveryMethod:"discoverTranslations",filePatterns:Ps,templates:Es,defaultInspectionPath:z.vite.i18nInspection,manifestFileName:z.manifests.i18n,configKey:"i18n",discoveryOptions:{fallbackLanguage:n.fallbackLanguage||"en",...n}})({...n,hmrSmartDetection:!1})}j();q();function Pt(n={}){let e=[],t="";return{name:"dndev-optional-dep-resolver",enforce:"pre",configResolved(){let s=O.getInstance(),r=s.getAppRoot(),o=he.optionalFeatures||[];for(let a of o)s.resolvePackage(a,r)||e.push(a);t=s.getEmptyModulePath(),n.debug&&e.length>0},resolveId(s){return e.includes(s)?t:null}}}function Ke(n){return!n||typeof n!="string"?null:n.startsWith("@")?n.split("/").slice(0,2).join("/"):n.split("/")[0]}function Rs(n){return!n||typeof n!="string"?!1:!n.startsWith(".")&&!n.startsWith("/")&&!n.startsWith("\\")&&!n.startsWith("\0")}function _s(n,e){if(!n||!e||!e.getRepoRoot())return!1;let s=n;n.startsWith("@fs/")&&(s=n.slice(4));let r=e.resolveRepoPath("packages"),o=e.normalizePath(s);return r&&o.startsWith(r)}function $s(n,e){if(!n||!e)return null;let t=Ke(n);if(!t)return null;let s=e.resolveAppPath(`node_modules/${t}`);return e.pathExists(s)?e.resolveAppPath(`node_modules/${n}`):null}function Rt(n,e,t){return!Rs(n)||!_s(e,t)?null:$s(n,t)}q();function _t(n={}){let{debug:e=!1,verbose:t=!0}=n,s=T("peer-dependency-resolver",e,t);return{name:"dndev-peer-dependency-resolver",enforce:"pre",configResolved(r){let o=O.getInstance(),a=o.getAppRoot();if(!a){s.warn("App root not set, peer dependency resolution may fail");return}this.pathResolver=o,this.appRoot=a},resolveId(r,o){if(!o||!this.appRoot||!this.pathResolver)return null;if(Rt(r,o,this.pathResolver)){let i=Ke(r),l=this.pathResolver.resolveAppPath(`node_modules/${r}`),u=this.pathResolver.resolveAppPath(`node_modules/${i}`);return this.pathResolver.pathExists(u)?r===i?((e||t)&&s.debug(`[PeerDeps] Resolving bare import "${r}" from app's node_modules: ${u}`),u):((e||t)&&s.debug(`[PeerDeps] Resolving subpath "${r}" from app's node_modules: ${l}`),l):(e&&s.debug(`[PeerDeps] Package directory not found: ${u}, skipping resolution`),null)}return null}}}import{VitePWA as Ds}from"vite-plugin-pwa";j();var Fe=class extends te{constructor(e,t={}){super(e,{...t})}_getDiscoveryType(){return"PWA"}async _getPatterns(){return await this.pathResolver.resolvePatterns("pwa")}_getPatternType(){return"pwa"}async _processFiles(e){let{frameworkFiles:t,consumerFiles:s}=e,r=[...t,...s];this.logger.debug(`Processing ${r.length} PWA files`);let o=[];this.options.assetData?.pwaIcons&&(this.logger.debug(`Using ${this.options.assetData.pwaIcons.length} icons from AssetDiscovery`),o=[...this.options.assetData.pwaIcons]);let a=await this._analyzePWAFiles(r),i=a.filter(g=>g.type==="manifest"||g.type==="service-worker");o.push(...i);let l=a.filter(g=>g.type==="icon"),u=new Set(o.filter(g=>g.type==="icon").map(g=>g.path)),c=l.filter(g=>!u.has(g.path));o.push(...c);let p=this._generatePWAManifest(o);return{assets:o,manifest:p,totalFiles:r.length,timestamp:Date.now()}}_getEmptyResult(){return{assets:[],manifest:this._getDefaultManifest(),totalFiles:0,timestamp:Date.now()}}_getDiscoverySummary(){return`${this.cache?.assets?.length||0} PWA assets discovered`}async _analyzePWAFiles(e){let t=[];for(let s of e){let r=typeof s=="string"?{absolutePath:s,relativePath:this.pathResolver.getRelativePath(s),fileName:s.split("/").pop()||"",extension:(s.split(".").pop()||"").toLowerCase()}:s,o=await this._analyzePWAAsset(r);o&&t.push(o)}return t}async _analyzePWAAsset(e){let t=await this.pathResolver.read(e.absolutePath,{format:"text"});if(!t)return null;let s=e.relativePath,r=e.fileName;return r.includes("manifest.json")?this._parseManifestFile(t,s):r.includes("service-worker")||r.includes("sw.")?this._parseServiceWorkerFile(t,s):this._isPWAIcon(r)?this._parseIconFile(e,s):null}_parseManifestFile(e,t){try{let s=typeof e=="string"?JSON.parse(e):e;return{type:"manifest",path:t,content:s,size:typeof e=="string"?e.length:JSON.stringify(s).length}}catch(s){return this.logger.debug(`Failed to parse manifest: ${s.message}`),null}}_parseServiceWorkerFile(e,t){return{type:"service-worker",path:t,size:e.length,hasWorkbox:e.includes("workbox")}}_parseIconFile(e,t){let s=e.fileName,r=this._extractIconSize(s);return{type:"icon",path:t,size:r,format:e.extension,purpose:this._getIconPurpose(s)}}_isPWAIcon(e){return["icon","logo","apple-touch-icon","android-chrome","favicon"].some(s=>e.includes(s))}_extractIconSize(e){let t=e.match(/(\d+)x(\d+)/);return t?{width:parseInt(t[1]),height:parseInt(t[2])}:e.includes("favicon")?{width:32,height:32}:e.includes("apple-touch-icon")?{width:180,height:180}:e.includes("icon-192")?{width:192,height:192}:e.includes("icon-512")?{width:512,height:512}:{width:192,height:192}}_getIconPurpose(e){return e.includes("maskable")?"maskable":e.includes("apple-touch")?"apple-touch":e.includes("android-chrome")?"android":"any"}_generatePWAManifest(e){let t=e.filter(o=>o.type==="icon"),r=e.find(o=>o.type==="manifest")?.content||this._getDefaultManifest();return t.length>0&&(r.icons=t.map(o=>({src:`/${o.path}`,sizes:`${o.size.width}x${o.size.height}`,type:`image/${o.format}`,purpose:o.purpose}))),r}_getDefaultManifest(){let e=this.options?.app||{};return{name:e.name,short_name:e.shortName,description:e.description,start_url:"/",display:"standalone",background_color:"#ffffff",theme_color:"#000000",icons:[]}}generateManifestContent(e){let t=e.manifest||this._getDefaultManifest();return JSON.stringify(t,null,2)}generateServiceWorkerContent(e,t={}){let s=this._getWorkboxDefaults(t),r=t.backgroundSync!==!1&&t.backgroundSync,o=t.precacheManifest||[],a=JSON.stringify(o,null,2);return`// Generated by @donotdev/config - PWA Service Worker with Workbox
575
+ `},generateManifest:n=>({namespaces:n.stats?.totalNamespaces||0,languages:n.stats?.totalLanguages||0,fallbackLanguage:n.fallbackLanguage,eagerNamespaces:n.stats?.eagerNamespaces||0,platform:"vite",timestamp:Date.now()}),logConfig:n=>{},logStats:(n,e,t)=>{let s=n.supportedLanguages||[],r=Object.keys(n.mapping||{}).filter(o=>o!=="default").length||0;t&&t.info(`${e} I18n: ${s.length} languages, ${r} namespaces`)}},Es=[n=>n.endsWith(".json")&&n.includes("locale"),n=>/[a-z]+_[a-z]{2}\.json$/i.test(n),n=>n.includes("/locales/")&&n.endsWith(".json")];function Et(n={}){return ie({pluginName:"dndev-vite-i18n-discovery",icon:"\u{1F310}",virtualModuleId:C.i18n,DiscoveryClass:Oe,discoveryMethod:"discoverTranslations",filePatterns:Es,templates:Ss,defaultInspectionPath:z.vite.i18nInspection,manifestFileName:z.manifests.i18n,configKey:"i18n",discoveryOptions:{fallbackLanguage:n.fallbackLanguage||"en",...n}})({...n,hmrSmartDetection:!1})}j();q();function Pt(n={}){let e=[],t="";return{name:"dndev-optional-dep-resolver",enforce:"pre",configResolved(){let s=O.getInstance(),r=s.getAppRoot(),o=he.optionalFeatures||[];for(let a of o)s.resolvePackage(a,r)||e.push(a);t=s.getEmptyModulePath(),n.debug&&e.length>0},resolveId(s){return e.includes(s)?t:null}}}function Ke(n){return!n||typeof n!="string"?null:n.startsWith("@")?n.split("/").slice(0,2).join("/"):n.split("/")[0]}function Ps(n){return!n||typeof n!="string"?!1:!n.startsWith(".")&&!n.startsWith("/")&&!n.startsWith("\\")&&!n.startsWith("\0")}function Rs(n,e){if(!n||!e||!e.getRepoRoot())return!1;let s=n;n.startsWith("@fs/")&&(s=n.slice(4));let r=e.resolveRepoPath("packages"),o=e.normalizePath(s);return r&&o.startsWith(r)}function _s(n,e){if(!n||!e)return null;let t=Ke(n);if(!t)return null;let s=e.resolveAppPath(`node_modules/${t}`);return e.pathExists(s)?e.resolveAppPath(`node_modules/${n}`):null}function Rt(n,e,t){return!Ps(n)||!Rs(e,t)?null:_s(n,t)}q();function _t(n={}){let{debug:e=!1,verbose:t=!0}=n,s=T("peer-dependency-resolver",e,t);return{name:"dndev-peer-dependency-resolver",enforce:"pre",configResolved(r){let o=O.getInstance(),a=o.getAppRoot();if(!a){s.warn("App root not set, peer dependency resolution may fail");return}this.pathResolver=o,this.appRoot=a},resolveId(r,o){if(!o||!this.appRoot||!this.pathResolver)return null;if(Rt(r,o,this.pathResolver)){let i=Ke(r),l=this.pathResolver.resolveAppPath(`node_modules/${r}`),u=this.pathResolver.resolveAppPath(`node_modules/${i}`);return this.pathResolver.pathExists(u)?r===i?((e||t)&&s.debug(`[PeerDeps] Resolving bare import "${r}" from app's node_modules: ${u}`),u):((e||t)&&s.debug(`[PeerDeps] Resolving subpath "${r}" from app's node_modules: ${l}`),l):(e&&s.debug(`[PeerDeps] Package directory not found: ${u}, skipping resolution`),null)}return null}}}import{VitePWA as $s}from"vite-plugin-pwa";j();var Fe=class extends te{constructor(e,t={}){super(e,{...t})}_getDiscoveryType(){return"PWA"}async _getPatterns(){return await this.pathResolver.resolvePatterns("pwa")}_getPatternType(){return"pwa"}async _processFiles(e){let{frameworkFiles:t,consumerFiles:s}=e,r=[...t,...s];this.logger.debug(`Processing ${r.length} PWA files`);let o=[];this.options.assetData?.pwaIcons&&(this.logger.debug(`Using ${this.options.assetData.pwaIcons.length} icons from AssetDiscovery`),o=[...this.options.assetData.pwaIcons]);let a=await this._analyzePWAFiles(r),i=a.filter(g=>g.type==="manifest"||g.type==="service-worker");o.push(...i);let l=a.filter(g=>g.type==="icon"),u=new Set(o.filter(g=>g.type==="icon").map(g=>g.path)),c=l.filter(g=>!u.has(g.path));o.push(...c);let p=this._generatePWAManifest(o);return{assets:o,manifest:p,totalFiles:r.length,timestamp:Date.now()}}_getEmptyResult(){return{assets:[],manifest:this._getDefaultManifest(),totalFiles:0,timestamp:Date.now()}}_getDiscoverySummary(){return`${this.cache?.assets?.length||0} PWA assets discovered`}async _analyzePWAFiles(e){let t=[];for(let s of e){let r=typeof s=="string"?{absolutePath:s,relativePath:this.pathResolver.getRelativePath(s),fileName:s.split("/").pop()||"",extension:(s.split(".").pop()||"").toLowerCase()}:s,o=await this._analyzePWAAsset(r);o&&t.push(o)}return t}async _analyzePWAAsset(e){let t=await this.pathResolver.read(e.absolutePath,{format:"text"});if(!t)return null;let s=e.relativePath,r=e.fileName;return r.includes("manifest.json")?this._parseManifestFile(t,s):r.includes("service-worker")||r.includes("sw.")?this._parseServiceWorkerFile(t,s):this._isPWAIcon(r)?this._parseIconFile(e,s):null}_parseManifestFile(e,t){try{let s=typeof e=="string"?JSON.parse(e):e;return{type:"manifest",path:t,content:s,size:typeof e=="string"?e.length:JSON.stringify(s).length}}catch(s){return this.logger.debug(`Failed to parse manifest: ${s.message}`),null}}_parseServiceWorkerFile(e,t){return{type:"service-worker",path:t,size:e.length,hasWorkbox:e.includes("workbox")}}_parseIconFile(e,t){let s=e.fileName,r=this._extractIconSize(s);return{type:"icon",path:t,size:r,format:e.extension,purpose:this._getIconPurpose(s)}}_isPWAIcon(e){return["icon","logo","apple-touch-icon","android-chrome","favicon"].some(s=>e.includes(s))}_extractIconSize(e){let t=e.match(/(\d+)x(\d+)/);return t?{width:parseInt(t[1]),height:parseInt(t[2])}:e.includes("favicon")?{width:32,height:32}:e.includes("apple-touch-icon")?{width:180,height:180}:e.includes("icon-192")?{width:192,height:192}:e.includes("icon-512")?{width:512,height:512}:{width:192,height:192}}_getIconPurpose(e){return e.includes("maskable")?"maskable":e.includes("apple-touch")?"apple-touch":e.includes("android-chrome")?"android":"any"}_generatePWAManifest(e){let t=e.filter(o=>o.type==="icon"),r=e.find(o=>o.type==="manifest")?.content||this._getDefaultManifest();return t.length>0&&(r.icons=t.map(o=>({src:`/${o.path}`,sizes:`${o.size.width}x${o.size.height}`,type:`image/${o.format}`,purpose:o.purpose}))),r}_getDefaultManifest(){let e=this.options?.app||{};return{name:e.name,short_name:e.shortName,description:e.description,start_url:"/",display:"standalone",background_color:"#ffffff",theme_color:"#000000",icons:[]}}generateManifestContent(e){let t=e.manifest||this._getDefaultManifest();return JSON.stringify(t,null,2)}generateServiceWorkerContent(e,t={}){let s=this._getWorkboxDefaults(t),r=t.backgroundSync!==!1&&t.backgroundSync,o=t.precacheManifest||[],a=JSON.stringify(o,null,2);return`// Generated by @donotdev/config - PWA Service Worker with Workbox
576
576
  // Generated at ${new Date().toISOString()}
577
577
 
578
578
  importScripts('https://storage.googleapis.com/workbox-cdn/releases/7.0.0/workbox-sw.js');
@@ -640,7 +640,7 @@ registerRoute(
640
640
  }),
641
641
  'POST'
642
642
  );
643
- `}getPWAHeaders(){return[{source:"/manifest.json",headers:[{key:"Content-Type",value:"application/manifest+json"},{key:"Cache-Control",value:"public, max-age=3600"}]},{source:"/sw.js",headers:[{key:"Content-Type",value:"application/javascript"},{key:"Cache-Control",value:"no-cache"}]}]}getPWARewrites(){return{beforeFiles:[],afterFiles:[{source:"/sw.js",destination:"/sw.js"},{source:"/workbox-:path*",destination:"/workbox-:path*"}],fallback:[]}}async discoverNextBuildAssets(e=".next"){let t=this.pathResolver.resolveAppPath(`${e}/static`),s=this.pathResolver.resolveAppPath(`${e}/static/chunks`),r=this.pathResolver.resolveAppPath(`${e}/static/css`),o=[];try{let a=[`${t}/**/*.{js,css,woff2,woff,ttf,eot}`,`${s}/**/*.{js,css}`,`${r}/**/*.css`];for(let i of a){let l=await this.pathResolver.findFiles(this.pathResolver.getAppRoot(),i.replace(this.pathResolver.getAppRoot(),""),{onlyFiles:!0});for(let u of l){let c=this.pathResolver.getRelativePath(u);if(c.startsWith(`${e}/static/`)){let p=`/_next/${c.replace(`${e}/static/`,"")}`;o.push({url:p,revision:null})}}}}catch(a){this.logger?.warn(`Failed to discover Next.js build assets: ${a.message}`)}return o}generatePrecacheManifest(e=[],t=null){let s=e;return t&&typeof t=="function"&&(s=t(s)),s}async discoverPWAAssets(e=!1){return await this.discover(e)}getPWAAssets(){return this.cache?.assets||[]}getPWAManifest(){return this.cache?.manifest||this._getDefaultManifest()}};q();function $t(n={}){if(!n.enabled)return null;let e=n.app||{},t=[];if(e.name||t.push("name"),e.shortName||t.push("shortName"),e.description||t.push("description"),t.length>0){let c=T("PWA",n.debug,!0);c.warn(`\u26A0\uFE0F PWA is enabled but appConfig.app is missing required fields: ${t.join(", ")}`),c.warn(" Add these to your src/config/app.ts:"),c.warn(" export const appConfig: AppConfig = {"),c.warn(" app: {"),e.name||c.warn(' name: "Your App Name",'),e.shortName||c.warn(' shortName: "App",'),e.description||c.warn(' description: "Your app description",'),c.warn(" },"),c.warn(" // ... rest of config"),c.warn(" };"),c.warn("")}let s=O.getInstance(),r=Je.data;if(!r)try{let c=s.resolveAppPath(z.vite.assetInspection);s.pathExists(c)}catch{}let o=new Fe(s,{...n,assetData:r}),a=n.devEnabled===!0,i={registerType:n.registerType||"prompt",includeAssets:["favicon.ico","favicon.svg","apple-touch-icon.png"],manifest:async()=>{let c=n.app||{},g=(await o.discoverPWAAssets()).assets.filter(d=>d.type==="icon").map(d=>({src:`/${d.path}`,sizes:`${d.size.width}x${d.size.height}`,type:`image/${d.format}`,purpose:d.purpose}));return{name:c.name,short_name:c.shortName,description:c.description,start_url:"/",display:"standalone",background_color:"#ffffff",theme_color:"#000000",icons:g.length>0?g:[]}},workbox:{globPatterns:["**/*.{js,css,html,ico,png,svg,woff2}"],runtimeCaching:[{urlPattern:/^https:\/\/fonts\.googleapis\.com\/.*/i,handler:"CacheFirst",options:{cacheName:"google-fonts-cache",expiration:{maxEntries:10,maxAgeSeconds:3600*24*365},cacheableResponse:{statuses:[0,200]}}},{urlPattern:/^https:\/\/fonts\.gstatic\.com\/.*/i,handler:"CacheFirst",options:{cacheName:"gstatic-fonts-cache",expiration:{maxEntries:10,maxAgeSeconds:3600*24*365},cacheableResponse:{statuses:[0,200]}}},{urlPattern:/\.(?:png|jpg|jpeg|svg|gif|webp|avif)$/,handler:"StaleWhileRevalidate",options:{cacheName:"images-cache",expiration:{maxEntries:60,maxAgeSeconds:3600*24*30}}},{urlPattern:/\/api\/.*/i,handler:"NetworkFirst",options:{cacheName:"api-cache",expiration:{maxEntries:50,maxAgeSeconds:300},networkTimeoutSeconds:10}},{urlPattern:({request:c})=>c.destination==="document",handler:"NetworkFirst",options:{cacheName:"pages-cache",expiration:{maxEntries:32,maxAgeSeconds:3600*24},networkTimeoutSeconds:10}}],cleanupOutdatedCaches:!0,skipWaiting:!0,clientsClaim:!0,maximumFileSizeToCacheInBytes:5*1024*1024,navigateFallback:"/index.html",navigateFallbackDenylist:[/^\/api\/.*/],manifestTransforms:[c=>{let p=c.find(g=>g.url==="/index.html"||g.url==="index.html");return p&&!c.find(g=>g.url==="/")&&c.push({url:"/",revision:p.revision}),{manifest:c,warnings:[]}}]},devOptions:{enabled:a,type:"module"}},u={...i,manifest:async()=>{let c=await i.manifest();if(n.manifest){if(typeof n.manifest=="function"){let p=await n.manifest();return{...c,...p}}return{...c,...n.manifest}}return c},workbox:{...i.workbox,...n.workbox||{},runtimeCaching:[...i.workbox.runtimeCaching,...n.workbox?.runtimeCaching||[]],manifestTransforms:[...i.workbox.manifestTransforms||[],...n.workbox?.manifestTransforms||[]]}};return Ds(u)}j();j();function Dt(n,e="unknown"){try{let t=/export\s+const\s+meta\s*[^=]*=\s*(\{[\s\S]*?\});/,s=n.match(t);if(!s)return null;let r=s[1];r=r.replace(/icon:\s*<(\w+)[\s\/][^>]*\/?>/g,(l,u)=>`icon: '${u}'`);let o=/(?:export\s+)?const\s+(\w+)\s*=\s*['"]([^'"]+)['"]/g;return[...n.matchAll(o)].forEach(l=>{let u=l[1],c=l[2];r=r.replace(new RegExp(`\\b${u}\\b`,"g"),`'${c}'`)}),Function(`return ${r}`)()}catch{return null}}var Se=null,kt=null;function ks(n){let t=(n.split("/").pop()?.replace(/\.tsx?$/,"")||"Component").replace(/[^a-zA-Z0-9]/g,"");return t.charAt(0).toUpperCase()+t.slice(1)}var Ie=class extends te{constructor(e,t={}){super(e,{additionalPatterns:[],...t}),this.routes=[],this.errors=[],this.source="auto-discovery"}_getDiscoveryType(){return"Route"}async _getPatterns(){return await this.pathResolver.resolvePatterns("routes")}_getPatternType(){return"routes"}async _processFiles(e){let t=this.pathResolver.getAppRoot(),s=process.env.DNDEV_BUILD_ID;if(Se&&kt===s)return this.logger.debug("Using cached route discovery results"),this.routes=Se.routes,this.errors=Se.errors,this.source=Se.source,{routes:this.routes,errors:this.errors,source:this.source,totalFiles:this.routes.length};if(this.logger.debug("Route discovery mode: AUTO-DISCOVERY"),this.logger.debug(`App root: ${t}`),this.options.debug){let r=e?.consumerFiles?.length||0;this.logger.debug(`\u{1F50D} Route discovery: Scanning ${r} files in ${t}`);let o=await this._getPatterns();this.logger.debug(`Patterns: ${JSON.stringify(o)}`)}return await this._performAutoDiscovery(e,t),this.options.debug&&this.logger.debug(`\u{1F50D} Route discovery: Found ${this.routes.length} routes`),this.routes.length===0&&this.logger.warn("\u26A0\uFE0F No routes discovered! Check that pages exist in src/pages/"),Se={routes:this.routes,errors:this.errors,source:this.source},kt=process.env.DNDEV_BUILD_ID,{routes:this.routes,errors:this.errors,source:this.source,totalFiles:this.routes.length}}_getEmptyResult(){return{routes:[],errors:[],source:"empty",totalFiles:0,timestamp:Date.now()}}_getDiscoverySummary(){return`${this.cache?.routes?.length||0} routes discovered via ${this.cache?.source||"unknown"}`}async discoverRoutes(e=!1){return await this.discover(e)}getRoutes(){return this.cache?.routes||[]}async _performAutoDiscovery(e,t){let{consumerFiles:s}=e,r=await this._batchProcessFiles(s,u=>this._analyzePageFile(u,t)),o=await this._scanAdditionalPatterns(t),a=await this._batchProcessFiles(o,u=>this._analyzePageFile(u,t)),i=[...r,...a];this.logger.debug(`Auto-discovering from ${s.length} app + ${o.length} additional files`),this.routes=i.filter(u=>u.path==="home"||u.path==="/home"?(this.logger.debug(`Filtered reserved route: ${u.path} - Use root "/" instead (${u.file})`),!1):!0);let l=new Map;for(let u of this.routes){let c=u.path;if(l.has(c)){let p=l.get(c);throw new Error(`Route conflict: Multiple routes found for path '${c}'. Routes: ${p.file} and ${u.file}. Use PageMeta route override to specify unique paths. Example: export const meta: PageMeta = { route: '/custom-path' };`)}l.set(c,u)}this.logger.debug(`Auto-discovered ${this.routes.length} routes from ${s.length+o.length} files`)}async _scanAdditionalPatterns(e){let t=this.options.additionalPatterns.map(s=>this.pathResolver.resolveAppPath(s));if(t.length===0)return[];try{let{consumerFiles:s}=await this.pathResolver.resolveFiles({consumer:t,framework:[]},"routes");return s}catch(s){return this.logger.debug(`Error scanning additional patterns: ${s.message}`),[]}}async _analyzePageFile(e,t){let s=await this.pathResolver.read(e.absolutePath,{format:"text"});if(!s)return null;let r=e.relativePath,o="/src/"+r.replace(/\\/g,"/");o=o.replace(/src\/src\//g,"src/").replace(/src\/src\//g,"src/");let a=this._extractMetaExport(s,e.absolutePath),i=ks(o),u=i===Ge.HOMEPAGE_COMPONENT?Ge.HOMEPAGE_PATH:this._resolveRoutePath(a,r,e.absolutePath),c=this._extractPageMeta(r,s),{entity:p,action:g,...d}=a||{};return{path:u,component:i,importPath:o,auth:a?.auth||!1,meta:{...c,...d,entity:c.entity,action:c.action},metaExport:a,file:r}}_extractMetaExport(e,t){try{let s=Dt(e,t);return s?(this.logger.debug(`Extracted meta export from ${t}: ${JSON.stringify(s)}`),s):null}catch(s){return this.logger.debug(`Error parsing meta export from ${t}: ${s.message}`),null}}_generateRoutePath(e){let t=e.replace(/\.tsx$/,"").replace(/Page$/,"").replace(/^src\//,"").replace(/^pages\//,"").replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase();return(t.endsWith("/index")||t==="index")&&(t=t.replace(/\/index$/,"")||"/"),t==="/"?"/":"/"+t.replace(/\/+/g,"/")}_resolveRoutePath(e,t,s){if(!e?.route)return this._generateRoutePath(t);if(typeof e.route=="string"){let r=e.route.trim();return r==="/"?"/":(r=r.replace(/\/+/g,"/"),r.startsWith("/")||(r="/"+r),r)}if(typeof e.route=="object"&&e.route!==null){let r=this._generateRoutePath(t),o=e.route.params;if(Array.isArray(o)&&o.length>0){let a=o.map(i=>`:${i}`).join("/");return`${r}/${a}`}return r}return this.logger.warn(`Invalid route format in ${s}. Use string format: route: "/path/:param" or object format: route: { params: ['id'] }`),this.logger.debug(`Falling back to auto-generated path for ${s}`),this._generateRoutePath(t)}_extractPageMeta(e,t){let s=e.split("/").pop()?.replace(".tsx","")||"",r=s.replace(/Page$/,"");r=r.replace(/([A-Z])/g," $1").trim(),r=r.charAt(0).toUpperCase()+r.slice(1);let o=e.split("/"),a=null,i=null;return o.length>1&&(a=o[o.length-2],s.includes("List")?i="list":s.includes("Form")||s.includes("Create")||s.includes("Edit")?i="form":(s.includes("Detail")||s.includes("View"))&&(i="detail")),{title:r,entity:a,action:i,file:e}}};var As={isEmpty:n=>!n.routes||n.routes.length===0,generateModule:(n,e,t="routes")=>{let s={totalRoutes:n.routes.length,authRequired:n.routes.filter(o=>o.auth&&o.auth.required).length,publicRoutes:n.routes.filter(o=>!o.auth||o.auth===!1).length,source:n.source,generatedAt:new Date().toISOString(),errors:n.errors.length},r=n.routes.map(o=>` {
643
+ `}getPWAHeaders(){return[{source:"/manifest.json",headers:[{key:"Content-Type",value:"application/manifest+json"},{key:"Cache-Control",value:"public, max-age=3600"}]},{source:"/sw.js",headers:[{key:"Content-Type",value:"application/javascript"},{key:"Cache-Control",value:"no-cache"}]}]}getPWARewrites(){return{beforeFiles:[],afterFiles:[{source:"/sw.js",destination:"/sw.js"},{source:"/workbox-:path*",destination:"/workbox-:path*"}],fallback:[]}}async discoverNextBuildAssets(e=".next"){let t=this.pathResolver.resolveAppPath(`${e}/static`),s=this.pathResolver.resolveAppPath(`${e}/static/chunks`),r=this.pathResolver.resolveAppPath(`${e}/static/css`),o=[];try{let a=[`${t}/**/*.{js,css,woff2,woff,ttf,eot}`,`${s}/**/*.{js,css}`,`${r}/**/*.css`];for(let i of a){let l=await this.pathResolver.findFiles(this.pathResolver.getAppRoot(),i.replace(this.pathResolver.getAppRoot(),""),{onlyFiles:!0});for(let u of l){let c=this.pathResolver.getRelativePath(u);if(c.startsWith(`${e}/static/`)){let p=`/_next/${c.replace(`${e}/static/`,"")}`;o.push({url:p,revision:null})}}}}catch(a){this.logger?.warn(`Failed to discover Next.js build assets: ${a.message}`)}return o}generatePrecacheManifest(e=[],t=null){let s=e;return t&&typeof t=="function"&&(s=t(s)),s}async discoverPWAAssets(e=!1){return await this.discover(e)}getPWAAssets(){return this.cache?.assets||[]}getPWAManifest(){return this.cache?.manifest||this._getDefaultManifest()}};q();function $t(n={}){if(!n.enabled)return null;let e=n.app||{},t=[];if(e.name||t.push("name"),e.shortName||t.push("shortName"),e.description||t.push("description"),t.length>0){let c=T("PWA",n.debug,!0);c.warn(`\u26A0\uFE0F PWA is enabled but appConfig.app is missing required fields: ${t.join(", ")}`),c.warn(" Add these to your src/config/app.ts:"),c.warn(" export const appConfig: AppConfig = {"),c.warn(" app: {"),e.name||c.warn(' name: "Your App Name",'),e.shortName||c.warn(' shortName: "App",'),e.description||c.warn(' description: "Your app description",'),c.warn(" },"),c.warn(" // ... rest of config"),c.warn(" };"),c.warn("")}let s=O.getInstance(),r=Je.data;if(!r)try{let c=s.resolveAppPath(z.vite.assetInspection);s.pathExists(c)}catch{}let o=new Fe(s,{...n,assetData:r}),a=n.devEnabled===!0,i={registerType:n.registerType||"prompt",includeAssets:["favicon.ico","favicon.svg","apple-touch-icon.png"],manifest:async()=>{let c=n.app||{},g=(await o.discoverPWAAssets()).assets.filter(d=>d.type==="icon").map(d=>({src:`/${d.path}`,sizes:`${d.size.width}x${d.size.height}`,type:`image/${d.format}`,purpose:d.purpose}));return{name:c.name,short_name:c.shortName,description:c.description,start_url:"/",display:"standalone",background_color:"#ffffff",theme_color:"#000000",icons:g.length>0?g:[]}},workbox:{globPatterns:["**/*.{js,css,html,ico,png,svg,woff2}"],runtimeCaching:[{urlPattern:/^https:\/\/fonts\.googleapis\.com\/.*/i,handler:"CacheFirst",options:{cacheName:"google-fonts-cache",expiration:{maxEntries:10,maxAgeSeconds:3600*24*365},cacheableResponse:{statuses:[0,200]}}},{urlPattern:/^https:\/\/fonts\.gstatic\.com\/.*/i,handler:"CacheFirst",options:{cacheName:"gstatic-fonts-cache",expiration:{maxEntries:10,maxAgeSeconds:3600*24*365},cacheableResponse:{statuses:[0,200]}}},{urlPattern:/\.(?:png|jpg|jpeg|svg|gif|webp|avif)$/,handler:"StaleWhileRevalidate",options:{cacheName:"images-cache",expiration:{maxEntries:60,maxAgeSeconds:3600*24*30}}},{urlPattern:/\/api\/.*/i,handler:"NetworkFirst",options:{cacheName:"api-cache",expiration:{maxEntries:50,maxAgeSeconds:300},networkTimeoutSeconds:10}},{urlPattern:({request:c})=>c.destination==="document",handler:"NetworkFirst",options:{cacheName:"pages-cache",expiration:{maxEntries:32,maxAgeSeconds:3600*24},networkTimeoutSeconds:10}}],cleanupOutdatedCaches:!0,skipWaiting:!0,clientsClaim:!0,maximumFileSizeToCacheInBytes:5*1024*1024,navigateFallback:"/index.html",navigateFallbackDenylist:[/^\/api\/.*/],manifestTransforms:[c=>{let p=c.find(g=>g.url==="/index.html"||g.url==="index.html");return p&&!c.find(g=>g.url==="/")&&c.push({url:"/",revision:p.revision}),{manifest:c,warnings:[]}}]},devOptions:{enabled:a,type:"module"}},u={...i,manifest:async()=>{let c=await i.manifest();if(n.manifest){if(typeof n.manifest=="function"){let p=await n.manifest();return{...c,...p}}return{...c,...n.manifest}}return c},workbox:{...i.workbox,...n.workbox||{},runtimeCaching:[...i.workbox.runtimeCaching,...n.workbox?.runtimeCaching||[]],manifestTransforms:[...i.workbox.manifestTransforms||[],...n.workbox?.manifestTransforms||[]]}};return $s(u)}j();j();function Dt(n,e="unknown"){try{let t=/export\s+const\s+meta\s*[^=]*=\s*(\{[\s\S]*?\});/,s=n.match(t);if(!s)return null;let r=s[1];r=r.replace(/icon:\s*<(\w+)[\s\/][^>]*\/?>/g,(l,u)=>`icon: '${u}'`);let o=/(?:export\s+)?const\s+(\w+)\s*=\s*['"]([^'"]+)['"]/g;return[...n.matchAll(o)].forEach(l=>{let u=l[1],c=l[2];r=r.replace(new RegExp(`\\b${u}\\b`,"g"),`'${c}'`)}),Function(`return ${r}`)()}catch{return null}}var Se=null,kt=null;function Ds(n){let t=(n.split("/").pop()?.replace(/\.tsx?$/,"")||"Component").replace(/[^a-zA-Z0-9]/g,"");return t.charAt(0).toUpperCase()+t.slice(1)}var Ie=class extends te{constructor(e,t={}){super(e,{additionalPatterns:[],...t}),this.routes=[],this.errors=[],this.source="auto-discovery"}_getDiscoveryType(){return"Route"}async _getPatterns(){return await this.pathResolver.resolvePatterns("routes")}_getPatternType(){return"routes"}async _processFiles(e){let t=this.pathResolver.getAppRoot(),s=process.env.DNDEV_BUILD_ID;if(Se&&kt===s)return this.logger.debug("Using cached route discovery results"),this.routes=Se.routes,this.errors=Se.errors,this.source=Se.source,{routes:this.routes,errors:this.errors,source:this.source,totalFiles:this.routes.length};if(this.logger.debug("Route discovery mode: AUTO-DISCOVERY"),this.logger.debug(`App root: ${t}`),this.options.debug){let r=e?.consumerFiles?.length||0;this.logger.debug(`\u{1F50D} Route discovery: Scanning ${r} files in ${t}`);let o=await this._getPatterns();this.logger.debug(`Patterns: ${JSON.stringify(o)}`)}return await this._performAutoDiscovery(e,t),this.options.debug&&this.logger.debug(`\u{1F50D} Route discovery: Found ${this.routes.length} routes`),this.routes.length===0&&this.logger.warn("\u26A0\uFE0F No routes discovered! Check that pages exist in src/pages/"),Se={routes:this.routes,errors:this.errors,source:this.source},kt=process.env.DNDEV_BUILD_ID,{routes:this.routes,errors:this.errors,source:this.source,totalFiles:this.routes.length}}_getEmptyResult(){return{routes:[],errors:[],source:"empty",totalFiles:0,timestamp:Date.now()}}_getDiscoverySummary(){return`${this.cache?.routes?.length||0} routes discovered via ${this.cache?.source||"unknown"}`}async discoverRoutes(e=!1){return await this.discover(e)}getRoutes(){return this.cache?.routes||[]}async _performAutoDiscovery(e,t){let{consumerFiles:s}=e,r=await this._batchProcessFiles(s,u=>this._analyzePageFile(u,t)),o=await this._scanAdditionalPatterns(t),a=await this._batchProcessFiles(o,u=>this._analyzePageFile(u,t)),i=[...r,...a];this.logger.debug(`Auto-discovering from ${s.length} app + ${o.length} additional files`),this.routes=i.filter(u=>u.path==="home"||u.path==="/home"?(this.logger.debug(`Filtered reserved route: ${u.path} - Use root "/" instead (${u.file})`),!1):!0);let l=new Map;for(let u of this.routes){let c=u.path;if(l.has(c)){let p=l.get(c);throw new Error(`Route conflict: Multiple routes found for path '${c}'. Routes: ${p.file} and ${u.file}. Use PageMeta route override to specify unique paths. Example: export const meta: PageMeta = { route: '/custom-path' };`)}l.set(c,u)}this.logger.debug(`Auto-discovered ${this.routes.length} routes from ${s.length+o.length} files`)}async _scanAdditionalPatterns(e){let t=this.options.additionalPatterns.map(s=>this.pathResolver.resolveAppPath(s));if(t.length===0)return[];try{let{consumerFiles:s}=await this.pathResolver.resolveFiles({consumer:t,framework:[]},"routes");return s}catch(s){return this.logger.debug(`Error scanning additional patterns: ${s.message}`),[]}}async _analyzePageFile(e,t){let s=await this.pathResolver.read(e.absolutePath,{format:"text"});if(!s)return null;let r=e.relativePath,o="/src/"+r.replace(/\\/g,"/");o=o.replace(/src\/src\//g,"src/").replace(/src\/src\//g,"src/");let a=this._extractMetaExport(s,e.absolutePath),i=Ds(o),u=i===Ge.HOMEPAGE_COMPONENT?Ge.HOMEPAGE_PATH:this._resolveRoutePath(a,r,e.absolutePath),c=this._extractPageMeta(r,s),{entity:p,action:g,...d}=a||{};return{path:u,component:i,importPath:o,auth:a?.auth||!1,meta:{...c,...d,entity:c.entity,action:c.action},metaExport:a,file:r}}_extractMetaExport(e,t){try{let s=Dt(e,t);return s?(this.logger.debug(`Extracted meta export from ${t}: ${JSON.stringify(s)}`),s):null}catch(s){return this.logger.debug(`Error parsing meta export from ${t}: ${s.message}`),null}}_generateRoutePath(e){let t=e.replace(/\.tsx$/,"").replace(/Page$/,"").replace(/^src\//,"").replace(/^pages\//,"").replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase();return(t.endsWith("/index")||t==="index")&&(t=t.replace(/\/index$/,"")||"/"),t==="/"?"/":"/"+t.replace(/\/+/g,"/")}_resolveRoutePath(e,t,s){if(!e?.route)return this._generateRoutePath(t);if(typeof e.route=="string"){let r=e.route.trim();return r==="/"?"/":(r=r.replace(/\/+/g,"/"),r.startsWith("/")||(r="/"+r),r)}if(typeof e.route=="object"&&e.route!==null){let r=this._generateRoutePath(t),o=e.route.params;if(Array.isArray(o)&&o.length>0){let a=o.map(i=>`:${i}`).join("/");return`${r}/${a}`}return r}return this.logger.warn(`Invalid route format in ${s}. Use string format: route: "/path/:param" or object format: route: { params: ['id'] }`),this.logger.debug(`Falling back to auto-generated path for ${s}`),this._generateRoutePath(t)}_extractPageMeta(e,t){let s=e.split("/").pop()?.replace(".tsx","")||"",r=s.replace(/Page$/,"");r=r.replace(/([A-Z])/g," $1").trim(),r=r.charAt(0).toUpperCase()+r.slice(1);let o=e.split("/"),a=null,i=null;return o.length>1&&(a=o[o.length-2],s.includes("List")?i="list":s.includes("Form")||s.includes("Create")||s.includes("Edit")?i="form":(s.includes("Detail")||s.includes("View"))&&(i="detail")),{title:r,entity:a,action:i,file:e}}};var ks={isEmpty:n=>!n.routes||n.routes.length===0,generateModule:(n,e,t="routes")=>{let s={totalRoutes:n.routes.length,authRequired:n.routes.filter(o=>o.auth&&o.auth.required).length,publicRoutes:n.routes.filter(o=>!o.auth||o.auth===!1).length,source:n.source,generatedAt:new Date().toISOString(),errors:n.errors.length},r=n.routes.map(o=>` {
644
644
  path: '${o.path}',
645
645
  component: () => import('${o.importPath}'),
646
646
  auth: ${JSON.stringify(o.auth,null,2).replace(/\n/g,`
@@ -767,7 +767,7 @@ export const routeManifest = {
767
767
  };
768
768
 
769
769
  export default discoveredRoutes;
770
- `},generateManifest:n=>({routes:n?.routes?.length||0,source:n?.source||"unknown",timestamp:Date.now(),errors:n?.errors?.length||0}),logConfig:n=>{},logStats:(n,e,t)=>{let s=n.routes||[],r=s.filter(a=>a.auth&&a.auth.required).length,o=s.length;t&&t.info(`${e} Routes: ${o} found${r>0?`, ${r} are authguarded`:""}`)}},Ns=[n=>n.endsWith("Page.tsx")];function At(n={}){return ie({pluginName:"dndev-vite-route-discovery",icon:"\u{1F6E3}\uFE0F",virtualModuleId:C.routes,DiscoveryClass:Ie,discoveryMethod:"discoverRoutes",filePatterns:Ns,templates:As,defaultInspectionPath:z.vite.routeInspection,manifestFileName:z.manifests.route,configKey:"routes"})({...n,disableHmr:n?.hmr===!1,hmrSmartDetection:!1})}import{loadEnv as Is}from"vite";q();import{readFileSync as Ts,readdirSync as Os,existsSync as Fs}from"fs";import{join as Nt}from"path";var Ce=class{constructor(e={}){let{debug:t=!1,generateRobotsTxt:s=!0,generateSitemap:r=!0,baseUrl:o,siteName:a,crawlDelay:i=1,routes:l={},...u}=e;if(!o||!a)throw new Error("SEOGenerator requires baseUrl and siteName options");this.options={debug:t,generateRobotsTxt:s,generateSitemap:r,baseUrl:o,siteName:a,crawlDelay:i,routes:l,defaultImage:"/og-image.jpg",twitterHandle:"@donotdev",defaultAuthor:"DNDev Team",defaultLanguage:"en",staticTags:{},...u},this.appRoot=u.appRoot||null,this.logger=T("SEO Generator",e.debug,e.verbose)}async generateSEOFiles(e,t,s=null){try{let r=this.generateRouteMetaTags(e.routes||[]),o={routes:e.routes||[],routeMetaTags:r,baseUrl:this.options.baseUrl,siteName:this.options.siteName},a=this.discoverBlogPosts(),i={robotsTxt:null,sitemap:null,rss:null,manifest:null,totalRoutes:o.routes.length,publicRoutes:o.routes.filter(l=>!l.auth||l.auth===!1).length,protectedRoutes:o.routes.filter(l=>l.auth&&l.auth.required).length,blogPosts:a.length};return this.options.generateRobotsTxt&&(i.robotsTxt=await this.generateRobotsTxt(o,t,s)),this.options.generateSitemap&&(i.sitemap=await this.generateSitemap(o,t,s,a)),a.length>0&&(i.rss=await this.generateRSSFeed(a,t,s)),i.manifest=await this.generateManifest(o,t,s),i}catch(r){throw this.logger.error(`SEO generator failed to create files (robots.txt/sitemap.xml/manifest): ${r.message}`),this.logger.error(`Stack: ${r.stack||"No stack trace available"}`),r}}async generateRobotsTxt(e,t,s=null){if(s&&await s("robots.txt"))return this.logger.info("\u2705 robots.txt already exists, skipping generation"),{fileName:"robots.txt",skipped:!0};let r=[];(e.routes||[]).forEach(a=>{if(a.auth&&a.auth.required){let i=a.path.startsWith("/")?a.path:`/${a.path}`;r.push(i)}}),r.push("/admin","/api","/_next","/static");let o=this.generateRobotsTxtContent({disallowedPaths:[...new Set(r)],sitemap:`${this.options.baseUrl}/sitemap.xml`,crawlDelay:this.options.crawlDelay});return await t("robots.txt",o),{fileName:"robots.txt",content:o,disallowedPaths:r.length}}async generateSitemap(e,t,s=null,r=[]){if(s&&await s("sitemap.xml"))return this.logger.info("\u2705 sitemap.xml already exists, skipping generation"),{fileName:"sitemap.xml",skipped:!0};let a=(e.routes||[]).filter(l=>!l.auth||l.auth===!1).map(l=>({url:l.path,lastmod:new Date().toISOString().split("T")[0],changefreq:"weekly",priority:l.path==="/"?"1.0":"0.8"}));if(r.length>0){a.push({url:"/blog",lastmod:r[0]?.date||new Date().toISOString().split("T")[0],changefreq:"weekly",priority:"0.7"});for(let l of r)a.push({url:`/blog/${l.slug}`,lastmod:l.date,changefreq:"monthly",priority:"0.6"})}let i=this.generateSitemapContent(a);return await t("sitemap.xml",i),{fileName:"sitemap.xml",content:i,publicRoutes:a.length}}async generateManifest(e,t,s=null){if(s&&await s("seo-manifest.json"))return this.logger.info("\u2705 seo-manifest.json already exists, skipping generation"),{fileName:"seo-manifest.json",skipped:!0};let r={totalRoutes:e.routes?.length||0,publicRoutes:e.routes?.filter(a=>!a.auth||a.auth===!1).length||0,protectedRoutes:e.routes?.filter(a=>a.auth&&a.auth.required).length||0,baseUrl:this.options.baseUrl,siteName:this.options.siteName,generatedAt:new Date().toISOString(),routeMetaTags:e.routeMetaTags||[]},o=JSON.stringify(r,null,2);return await t("seo-manifest.json",o),{fileName:"seo-manifest.json",content:o,manifest:r}}generateRobotsTxtContent(e={}){let{allowedPaths:t=["/"],disallowedPaths:s=["/admin","/api"],sitemap:r,crawlDelay:o}=e,a=l=>l?l==="*"?"*":l.startsWith("/")?l:`/${l}`:"/",i=["User-agent: *",...s.map(l=>`Disallow: ${a(l)}`),...t.map(l=>`Allow: ${a(l)}`)];return o&&i.push(`Crawl-delay: ${o}`),r&&i.push(`Sitemap: ${r}`),i.join(`
770
+ `},generateManifest:n=>({routes:n?.routes?.length||0,source:n?.source||"unknown",timestamp:Date.now(),errors:n?.errors?.length||0}),logConfig:n=>{},logStats:(n,e,t)=>{let s=n.routes||[],r=s.filter(a=>a.auth&&a.auth.required).length,o=s.length;t&&t.info(`${e} Routes: ${o} found${r>0?`, ${r} are authguarded`:""}`)}},As=[n=>n.endsWith("Page.tsx")];function At(n={}){return ie({pluginName:"dndev-vite-route-discovery",icon:"\u{1F6E3}\uFE0F",virtualModuleId:C.routes,DiscoveryClass:Ie,discoveryMethod:"discoverRoutes",filePatterns:As,templates:ks,defaultInspectionPath:z.vite.routeInspection,manifestFileName:z.manifests.route,configKey:"routes"})({...n,disableHmr:n?.hmr===!1,hmrSmartDetection:!1})}import{loadEnv as Fs}from"vite";q();import{readFileSync as Ns,readdirSync as Ts,existsSync as Os}from"fs";import{join as Nt}from"path";var Ce=class{constructor(e={}){let{debug:t=!1,generateRobotsTxt:s=!0,generateSitemap:r=!0,baseUrl:o,siteName:a,crawlDelay:i=1,routes:l={},...u}=e;if(!o||!a)throw new Error("SEOGenerator requires baseUrl and siteName options");this.options={debug:t,generateRobotsTxt:s,generateSitemap:r,baseUrl:o,siteName:a,crawlDelay:i,routes:l,defaultImage:"/og-image.jpg",twitterHandle:"@donotdev",defaultAuthor:"DNDev Team",defaultLanguage:"en",staticTags:{},...u},this.appRoot=u.appRoot||null,this.logger=T("SEO Generator",e.debug,e.verbose)}async generateSEOFiles(e,t,s=null){try{let r=this.generateRouteMetaTags(e.routes||[]),o={routes:e.routes||[],routeMetaTags:r,baseUrl:this.options.baseUrl,siteName:this.options.siteName},a=this.discoverBlogPosts(),i={robotsTxt:null,sitemap:null,rss:null,manifest:null,totalRoutes:o.routes.length,publicRoutes:o.routes.filter(l=>!l.auth||l.auth===!1).length,protectedRoutes:o.routes.filter(l=>l.auth&&l.auth.required).length,blogPosts:a.length};return this.options.generateRobotsTxt&&(i.robotsTxt=await this.generateRobotsTxt(o,t,s)),this.options.generateSitemap&&(i.sitemap=await this.generateSitemap(o,t,s,a)),a.length>0&&(i.rss=await this.generateRSSFeed(a,t,s)),i.manifest=await this.generateManifest(o,t,s),i}catch(r){throw this.logger.error(`SEO generator failed to create files (robots.txt/sitemap.xml/manifest): ${r.message}`),this.logger.error(`Stack: ${r.stack||"No stack trace available"}`),r}}async generateRobotsTxt(e,t,s=null){if(s&&await s("robots.txt"))return this.logger.info("\u2705 robots.txt already exists, skipping generation"),{fileName:"robots.txt",skipped:!0};let r=[];(e.routes||[]).forEach(a=>{if(a.auth&&a.auth.required){let i=a.path.startsWith("/")?a.path:`/${a.path}`;r.push(i)}}),r.push("/admin","/api","/_next","/static");let o=this.generateRobotsTxtContent({disallowedPaths:[...new Set(r)],sitemap:`${this.options.baseUrl}/sitemap.xml`,crawlDelay:this.options.crawlDelay});return await t("robots.txt",o),{fileName:"robots.txt",content:o,disallowedPaths:r.length}}async generateSitemap(e,t,s=null,r=[]){if(s&&await s("sitemap.xml"))return this.logger.info("\u2705 sitemap.xml already exists, skipping generation"),{fileName:"sitemap.xml",skipped:!0};let a=(e.routes||[]).filter(l=>!l.auth||l.auth===!1).map(l=>({url:l.path,lastmod:new Date().toISOString().split("T")[0],changefreq:"weekly",priority:l.path==="/"?"1.0":"0.8"}));if(r.length>0){a.push({url:"/blog",lastmod:r[0]?.date||new Date().toISOString().split("T")[0],changefreq:"weekly",priority:"0.7"});for(let l of r)a.push({url:`/blog/${l.slug}`,lastmod:l.date,changefreq:"monthly",priority:"0.6"})}let i=this.generateSitemapContent(a);return await t("sitemap.xml",i),{fileName:"sitemap.xml",content:i,publicRoutes:a.length}}async generateManifest(e,t,s=null){if(s&&await s("seo-manifest.json"))return this.logger.info("\u2705 seo-manifest.json already exists, skipping generation"),{fileName:"seo-manifest.json",skipped:!0};let r={totalRoutes:e.routes?.length||0,publicRoutes:e.routes?.filter(a=>!a.auth||a.auth===!1).length||0,protectedRoutes:e.routes?.filter(a=>a.auth&&a.auth.required).length||0,baseUrl:this.options.baseUrl,siteName:this.options.siteName,generatedAt:new Date().toISOString(),routeMetaTags:e.routeMetaTags||[]},o=JSON.stringify(r,null,2);return await t("seo-manifest.json",o),{fileName:"seo-manifest.json",content:o,manifest:r}}generateRobotsTxtContent(e={}){let{allowedPaths:t=["/"],disallowedPaths:s=["/admin","/api"],sitemap:r,crawlDelay:o}=e,a=l=>l?l==="*"?"*":l.startsWith("/")?l:`/${l}`:"/",i=["User-agent: *",...s.map(l=>`Disallow: ${a(l)}`),...t.map(l=>`Allow: ${a(l)}`)];return o&&i.push(`Crawl-delay: ${o}`),r&&i.push(`Sitemap: ${r}`),i.join(`
771
771
  `)}generateSitemapContent(e){return`<?xml version="1.0" encoding="UTF-8"?>
772
772
  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
773
773
  ${e.map(({url:s,lastmod:r,changefreq:o,priority:a})=>{let i=[` <loc>${this.options.baseUrl}${s}</loc>`];return r&&i.push(` <lastmod>${r}</lastmod>`),o&&i.push(` <changefreq>${o}</changefreq>`),a&&i.push(` <priority>${a}</priority>`),` <url>
@@ -775,7 +775,7 @@ ${i.join(`
775
775
  `)}
776
776
  </url>`}).join(`
777
777
  `)}
778
- </urlset>`}generateRouteMetaTags(e){return e.map(t=>{let s=this.options.siteName;if(t.meta?.title)s=`${t.meta.title} - ${this.options.siteName}`;else if(t.path!=="/"){let o=t.path.split("/").filter(Boolean);o.length>0&&(s=`${o[o.length-1].split("-").map(l=>l.charAt(0).toUpperCase()+l.slice(1)).join(" ")} - ${this.options.siteName}`)}let r=`Welcome to ${this.options.siteName}`;if(t.meta?.description)r=t.meta.description;else if(t.meta?.entity&&t.meta?.action)r=`${t.meta.action} ${t.meta.entity} on ${this.options.siteName}`;else if(t.path!=="/"){let o=t.path.split("/").filter(Boolean);o.length>0&&(r=`Explore ${o[o.length-1].split("-").map(l=>l.charAt(0).toUpperCase()+l.slice(1)).join(" ").toLowerCase()} on ${this.options.siteName}`)}return{path:t.path,meta:{title:s,description:r,canonical:`${this.options.baseUrl}${t.path}`,robots:t.auth&&t.auth.required?"noindex, nofollow":"index, follow"}}})}discoverBlogPosts(){if(!this.appRoot)return[];let e=Nt(this.appRoot,"src","content","blog");try{if(!Fs(e))return[];let t=Os(e).filter(r=>r.endsWith("_en.md"));if(t.length===0)return[];let s=[];for(let r of t){let o=Ts(Nt(e,r),"utf-8"),a=r.replace(/_en\.md$/,""),i=o.match(/^---\r?\n([\s\S]*?)\r?\n---/),l={};if(i)for(let u of i[1].split(`
778
+ </urlset>`}generateRouteMetaTags(e){return e.map(t=>{let s=this.options.siteName;if(t.meta?.title)s=`${t.meta.title} - ${this.options.siteName}`;else if(t.path!=="/"){let o=t.path.split("/").filter(Boolean);o.length>0&&(s=`${o[o.length-1].split("-").map(l=>l.charAt(0).toUpperCase()+l.slice(1)).join(" ")} - ${this.options.siteName}`)}let r=`Welcome to ${this.options.siteName}`;if(t.meta?.description)r=t.meta.description;else if(t.meta?.entity&&t.meta?.action)r=`${t.meta.action} ${t.meta.entity} on ${this.options.siteName}`;else if(t.path!=="/"){let o=t.path.split("/").filter(Boolean);o.length>0&&(r=`Explore ${o[o.length-1].split("-").map(l=>l.charAt(0).toUpperCase()+l.slice(1)).join(" ").toLowerCase()} on ${this.options.siteName}`)}return{path:t.path,meta:{title:s,description:r,canonical:`${this.options.baseUrl}${t.path}`,robots:t.auth&&t.auth.required?"noindex, nofollow":"index, follow"}}})}discoverBlogPosts(){if(!this.appRoot)return[];let e=Nt(this.appRoot,"src","content","blog");try{if(!Os(e))return[];let t=Ts(e).filter(r=>r.endsWith("_en.md"));if(t.length===0)return[];let s=[];for(let r of t){let o=Ns(Nt(e,r),"utf-8"),a=r.replace(/_en\.md$/,""),i=o.match(/^---\r?\n([\s\S]*?)\r?\n---/),l={};if(i)for(let u of i[1].split(`
779
779
  `)){let c=u.indexOf(":");c!==-1&&(l[u.slice(0,c).trim()]=u.slice(c+1).trim())}s.push({slug:a,title:l.title||a,description:l.description||"",date:l.date||new Date().toISOString().split("T")[0],tags:l.tags?l.tags.split(",").map(u=>u.trim()):[],image:l.image||null})}return s.sort((r,o)=>o.date.localeCompare(r.date)),this.logger.info(`\u{1F4DD} Discovered ${s.length} blog post(s) in src/content/blog/`),s}catch(t){return this.logger.debug(`Blog content discovery skipped: ${t.message}`),[]}}async generateRSSFeed(e,t,s=null){if(s&&await s("rss.xml"))return this.logger.info("\u2705 rss.xml already exists, skipping generation"),{fileName:"rss.xml",skipped:!0};let r=e.map(a=>` <item>
780
780
  <title><![CDATA[${a.title}]]></title>
781
781
  <link>${this.options.baseUrl}/blog/${a.slug}</link>
@@ -795,7 +795,7 @@ ${i.join(`
795
795
  <atom:link href="${this.options.baseUrl}/rss.xml" rel="self" type="application/rss+xml"/>
796
796
  ${r}
797
797
  </channel>
798
- </rss>`;return await t("rss.xml",o),{fileName:"rss.xml",content:o,postCount:e.length}}getGenerationSummary(e){let t=e.routes?.length||0,s=e.routes?.filter(o=>!o.auth||o.auth===!1).length||0,r=e.routes?.filter(o=>o.auth&&o.auth.required).length||0;return`${t} routes (${s} public, ${r} protected)`}formatAPIResponse(e){return{totalRoutes:e.routes?.length||0,publicRoutes:e.routes?.filter(t=>!t.auth||t.auth===!1).length||0,protectedRoutes:e.routes?.filter(t=>t.auth&&t.auth.required).length||0,baseUrl:this.options.baseUrl,siteName:this.options.siteName,generatedAt:new Date().toISOString()}}};function Tt(n={}){let{disabled:e=!1,debug:t,generateRobotsTxt:s,generateSitemap:r,routes:o={},baseUrl:a,siteName:i,crawlDelay:l,isDev:u,...c}=n;if(e)return{name:"seo-disabled"};let p=T("SEO Plugin",t,!0),g=O.getInstance(),d=null,h=null,F=!1;async function I(){try{let S=g.resolveAppPath("src/routes.generated.log"),_=g.readSync(S,{format:"text"});if(!_)return p.error(`SEO plugin: routes discovery file not found at ${S}`),p.error("This indicates route discovery failed or did not run. SEO files will be generated with empty routes."),{routes:[],errors:[`Routes file missing: ${S}`],source:"fallback"};let $=_.match(/export const discoveredRoutes = (\[[\s\S]*?\]);/);if(!$)return p.error(`SEO plugin: failed to parse routes from ${S}`),p.error("Expected format: export const discoveredRoutes = [...];"),p.error("This indicates route discovery generated invalid output. SEO files will be generated with empty routes."),{routes:[],errors:[`Invalid routes file format: ${S}`],source:"fallback"};let b=$[1].replace(/component:\s*\(\)\s*=>\s*Promise\.resolve\(\{[^}]*\}\),?/g,"").replace(/component:\s*\(\)\s*=>\s*import\([^)]*\),?/g,"").replace(/component:\s*[^,}\n]+,?/g,"").replace(/,\s*,/g,",").replace(/,\s*}/g,"}").replace(/,\s*]/g,"]"),w=Function(`"use strict"; return ${b}`)();return{routes:w,errors:[],source:"generated",totalFiles:w.length}}catch(S){return p.warn(`Error parsing generated routes: ${S.message}, falling back to empty routes`),{routes:[],errors:[],source:"fallback"}}}return{name:"vite-seo-plugin",enforce:"pre",configResolved(S){let _=g.getAppRoot(),$=S.mode||"production",w=Is($,_,"VITE_").VITE_APP_URL||process.env.VITE_APP_URL||null;w&&t&&p.debug(`Using app URL from VITE_APP_URL: ${w}`),d=i||null,h=a||w||null,p.verbose(`Name: ${d||"Not found"}`),p.verbose(`URL: ${h||"Not found"}`),d&&p.debug(` - Site name from appConfig: "${d}"`);let m=[];if(h||m.push("baseUrl (VITE_APP_URL in .env)"),d||m.push("siteName (APP_NAME in src/config/app.ts)"),m.length>0){F=!0,p.warn("\u26A0\uFE0F SEO Plugin disabled - missing required configuration:"),m.forEach(D=>p.warn(` - ${D}`)),p.warn(""),p.warn(" To fix:"),h||p.warn(" 1. Add VITE_APP_URL=https://yourdomain.com to your .env file"),d||(p.warn(" 2. Add APP_NAME export to src/config/app.ts:"),p.warn(' export const APP_NAME = "Your App Name";')),p.warn(""),p.warn(" robots.txt and sitemap.xml will NOT be generated."),p.warn("");return}p.debug(`Generate robots.txt: ${s}`),p.debug(`Generate sitemap: ${r}`)},async generateBundle(){if(!F)try{let S=new Ce({debug:t,generateRobotsTxt:s,generateSitemap:r,baseUrl:h,siteName:d,crawlDelay:l,routes:o,appRoot:g.getAppRoot(),...c}),_=await I(),$=async(m,D)=>{this.emitFile({type:"asset",fileName:m,source:D})},b=async m=>!1,w=await S.generateSEOFiles(_,$,b);w.robotsTxt&&!w.robotsTxt.skipped&&p.info(`\u{1F916} robots.txt: ${w.robotsTxt.disallowedPaths||0} disallowed paths`),w.sitemap&&!w.sitemap.skipped&&p.info(`\u{1F5FA}\uFE0F sitemap.xml: ${w.sitemap.publicRoutes||0} routes`),w.rss&&!w.rss.skipped&&p.info(`\u{1F4E1} rss.xml: ${w.rss.postCount||0} blog posts`),w.manifest&&!w.manifest.skipped&&p.info("\u{1F4C4} seo-manifest.json")}catch(S){p.error(`SEO plugin failed to generate files (robots.txt/sitemap.xml): ${S.message}`),p.error(`Stack: ${S.stack||"No stack trace available"}`)}}}}j();function Ot(n={}){let{debug:e}=n;return{name:"dndev-server-shim",enforce:"pre",resolveId(t,s){return t.startsWith("node:")?(T("server-shim",e,!0).warn(`Blocking Node.js built-in module import: ${t}${s?` from ${s}`:""}`),"\0virtual:empty-server-module"):Be.includes(t)||Be.some(r=>t.startsWith(`${r}/`))?(T("server-shim",e,!0).warn(`Blocking server-only subpath import: ${t}${s?` from ${s}`:""}`),"\0virtual:empty-server-module"):ot.includes(t)?(T("server-shim",e,!0).warn(`Blocking server-only import: ${t}${s?` from ${s}`:""}`),"\0virtual:empty-server-module"):null},load(t){return t==="\0virtual:empty-server-module"?`
798
+ </rss>`;return await t("rss.xml",o),{fileName:"rss.xml",content:o,postCount:e.length}}getGenerationSummary(e){let t=e.routes?.length||0,s=e.routes?.filter(o=>!o.auth||o.auth===!1).length||0,r=e.routes?.filter(o=>o.auth&&o.auth.required).length||0;return`${t} routes (${s} public, ${r} protected)`}formatAPIResponse(e){return{totalRoutes:e.routes?.length||0,publicRoutes:e.routes?.filter(t=>!t.auth||t.auth===!1).length||0,protectedRoutes:e.routes?.filter(t=>t.auth&&t.auth.required).length||0,baseUrl:this.options.baseUrl,siteName:this.options.siteName,generatedAt:new Date().toISOString()}}};function Tt(n={}){let{disabled:e=!1,debug:t,generateRobotsTxt:s,generateSitemap:r,routes:o={},baseUrl:a,siteName:i,crawlDelay:l,isDev:u,...c}=n;if(e)return{name:"seo-disabled"};let p=T("SEO Plugin",t,!0),g=O.getInstance(),d=null,h=null,F=!1;async function I(){try{let S=g.resolveAppPath("src/routes.generated.log"),_=g.readSync(S,{format:"text"});if(!_)return p.error(`SEO plugin: routes discovery file not found at ${S}`),p.error("This indicates route discovery failed or did not run. SEO files will be generated with empty routes."),{routes:[],errors:[`Routes file missing: ${S}`],source:"fallback"};let $=_.match(/export const discoveredRoutes = (\[[\s\S]*?\]);/);if(!$)return p.error(`SEO plugin: failed to parse routes from ${S}`),p.error("Expected format: export const discoveredRoutes = [...];"),p.error("This indicates route discovery generated invalid output. SEO files will be generated with empty routes."),{routes:[],errors:[`Invalid routes file format: ${S}`],source:"fallback"};let b=$[1].replace(/component:\s*\(\)\s*=>\s*Promise\.resolve\(\{[^}]*\}\),?/g,"").replace(/component:\s*\(\)\s*=>\s*import\([^)]*\),?/g,"").replace(/component:\s*[^,}\n]+,?/g,"").replace(/,\s*,/g,",").replace(/,\s*}/g,"}").replace(/,\s*]/g,"]"),w=Function(`"use strict"; return ${b}`)();return{routes:w,errors:[],source:"generated",totalFiles:w.length}}catch(S){return p.warn(`Error parsing generated routes: ${S.message}, falling back to empty routes`),{routes:[],errors:[],source:"fallback"}}}return{name:"vite-seo-plugin",enforce:"pre",configResolved(S){let _=g.getAppRoot(),$=S.mode||"production",w=Fs($,_,"VITE_").VITE_APP_URL||process.env.VITE_APP_URL||null;w&&t&&p.debug(`Using app URL from VITE_APP_URL: ${w}`),d=i||null,h=a||w||null,p.verbose(`Name: ${d||"Not found"}`),p.verbose(`URL: ${h||"Not found"}`),d&&p.debug(` - Site name from appConfig: "${d}"`);let m=[];if(h||m.push("baseUrl (VITE_APP_URL in .env)"),d||m.push("siteName (APP_NAME in src/config/app.ts)"),m.length>0){F=!0,p.warn("\u26A0\uFE0F SEO Plugin disabled - missing required configuration:"),m.forEach(D=>p.warn(` - ${D}`)),p.warn(""),p.warn(" To fix:"),h||p.warn(" 1. Add VITE_APP_URL=https://yourdomain.com to your .env file"),d||(p.warn(" 2. Add APP_NAME export to src/config/app.ts:"),p.warn(' export const APP_NAME = "Your App Name";')),p.warn(""),p.warn(" robots.txt and sitemap.xml will NOT be generated."),p.warn("");return}p.debug(`Generate robots.txt: ${s}`),p.debug(`Generate sitemap: ${r}`)},async generateBundle(){if(!F)try{let S=new Ce({debug:t,generateRobotsTxt:s,generateSitemap:r,baseUrl:h,siteName:d,crawlDelay:l,routes:o,appRoot:g.getAppRoot(),...c}),_=await I(),$=async(m,D)=>{this.emitFile({type:"asset",fileName:m,source:D})},b=async m=>!1,w=await S.generateSEOFiles(_,$,b);w.robotsTxt&&!w.robotsTxt.skipped&&p.info(`\u{1F916} robots.txt: ${w.robotsTxt.disallowedPaths||0} disallowed paths`),w.sitemap&&!w.sitemap.skipped&&p.info(`\u{1F5FA}\uFE0F sitemap.xml: ${w.sitemap.publicRoutes||0} routes`),w.rss&&!w.rss.skipped&&p.info(`\u{1F4E1} rss.xml: ${w.rss.postCount||0} blog posts`),w.manifest&&!w.manifest.skipped&&p.info("\u{1F4C4} seo-manifest.json")}catch(S){p.error(`SEO plugin failed to generate files (robots.txt/sitemap.xml): ${S.message}`),p.error(`Stack: ${S.stack||"No stack trace available"}`)}}}}j();function Ot(n={}){let{debug:e}=n;return{name:"dndev-server-shim",enforce:"pre",resolveId(t,s){return t.startsWith("node:")?(T("server-shim",e,!0).warn(`Blocking Node.js built-in module import: ${t}${s?` from ${s}`:""}`),"\0virtual:empty-server-module"):Be.includes(t)||Be.some(r=>t.startsWith(`${r}/`))?(T("server-shim",e,!0).warn(`Blocking server-only subpath import: ${t}${s?` from ${s}`:""}`),"\0virtual:empty-server-module"):ot.includes(t)?(T("server-shim",e,!0).warn(`Blocking server-only import: ${t}${s?` from ${s}`:""}`),"\0virtual:empty-server-module"):null},load(t){return t==="\0virtual:empty-server-module"?`
799
799
  // Node.js built-in modules shims for browser compatibility
800
800
  export const URL = globalThis.URL;
801
801
  export const URLSearchParams = globalThis.URLSearchParams;
@@ -1250,8 +1250,8 @@ export const themeManifest = {
1250
1250
  };
1251
1251
 
1252
1252
  export default discoveredThemes;
1253
- `},generateManifest:n=>({themes:n.themes?.length||0,timestamp:Date.now(),hasCustomThemes:n.themes?.some(e=>!e.essential)||!1}),logConfig:n=>{},logStats:(n,e,t)=>{let s=n.themes||[],r=s.filter(a=>!a.essential).length,o=s.length;t&&(o===0?t.warn(`${e} No themes discovered - using framework essential themes fallback`):t.info(`${e} Themes: ${o} discovered${r>0?` (${r} custom)`:""}`))}};function It(n={}){let e=Date.now();return T("theme-plugin",n.debug,n.verbose).debug("\u{1F3A8} Creating theme discovery plugin..."),ie({pluginName:"dndev-theme",icon:"\u{1F3A8}",virtualModuleId:C.themes,DiscoveryClass:Ee,discoveryMethod:"discoverThemes",filePatterns:["**/*.css"],templates:Ft,defaultInspectionPath:z.vite.themeInspection,manifestFileName:z.manifests.theme,configKey:"themes",createDiscovery:(r,o)=>{let a=new de(r,{debug:o.debug,logger:T("css-extractor",o.debug,o.verbose)});return new Ee(a,r,o)}})(n)}q();function Ct(n={}){let e=T("vite-plugins",n.debug,n.verbose);try{let{mode:t,debug:s,verbose:r,isDev:o,server:a={},routes:i={},themes:l={},i18n:u={},assets:c={},seo:p={},pwa:g={},serverShim:d={},pluginFactory:h={}}=n,F=i.debug??s,I=l.debug??s,S=u.debug??s,_=c.debug??s,$=d.debug??s,b=[];b.push(Ot({...d,debug:$}));let w;try{w=O.getInstance()}catch(m){throw new Error(`Failed to initialize PathResolver: ${m.message||m}`)}return b.push({name:"dndev-file-watcher-fix",enforce:"pre",configResolved(m){if(s){e.debug("\u{1F4CB} Vite resolved config (configResolved):");let A={root:m.root,mode:m.mode,envDir:m.envDir,base:m.base,build:m.build?{outDir:m.build.outDir,minify:m.build.minify}:void 0,server:m.server?{port:m.server.port,host:m.server.host}:void 0,plugins:m.plugins?{count:m.plugins.length,names:m.plugins.map(K=>K?.name||"unnamed").filter(Boolean)}:void 0};e.debug(JSON.stringify(A,null,2))}w.setAppRoot(m.root);let D=w.getAppRoot();if(o&&m.server?.port){let A=m.server.https?"https":"http";process.env.VITE_APP_URL=`${A}://localhost:${m.server.port}`,(s||r)&&e.debug(`VITE_APP_URL set: ${process.env.VITE_APP_URL}`)}else o&&e.warn("VITE_APP_URL not set in dev mode. Server port not available.");try{let A=w.getRepoRoot();e.verbose(`Repo: ${A}`),e.verbose(`App: ${D}`)}catch(A){e.debug(`Could not log PathResolver values: ${A.message}`)}if(m.server){let A=E=>{let x=E.replace(/\\/g,"/"),G=D.replace(/\\/g,"/");return!x.startsWith(G)};m.server.watch||(m.server.watch={});let K=["**/node_modules/**","**/.git/**","**/dist/**","**/build/**","**/.next/**","**/.turbo/**","**/.vite/**","**/functions/**","**/.generated/**"];m.server.watch={...m.server.watch,ignored:[...m.server.watch.ignored||[],...K,A]},e.verbose(`Fixed file watcher to use app root: ${D}`)}}}),b.push(_t({debug:s,verbose:r})),b.push(Pt({debug:s})),b.push(Ms({fastRefresh:!0,jsxRuntime:"automatic"})),b.push(Ls({ignoreConfigErrors:!0})),a.https!==!1&&b.push(Cs()),b.push(At({...h,...i,debug:F})),b.push(It({...h,...l,debug:I})),b.push(Et({...h,...u,debug:S})),b.push(yt({...h,...c,debug:_})),b.push(wt({...h,mode:t,debug:s,verbose:r})),b.push(Tt({...p,debug:s,isDev:o})),g.enabled&&b.push($t({...g,debug:s})),b.push(St({debug:s})),b}catch(t){throw T("vite-plugins",!1,!0).error(`Failed to create Vite plugins: ${t.message}`),t}}j();function zs(n){if(!n)return{};let e={};return Array.isArray(n)?n.forEach(({find:t,replacement:s})=>{typeof t=="string"&&(e[t]=s)}):typeof n=="object"&&Object.assign(e,n),e}function Mt(n={}){let{alias:e,...t}=n,{conditions:s,...r}=t;return{alias:{"@":"/src",...zs(e)},dedupe:["react","react-dom","react-router-dom"],preserveSymlinks:!1,conditions:["browser","module","import","vite-app",...s||[]],...r}}function Lt(n={}){let{include:e=[],exclude:t=[],esbuildOptions:s={},...r}=n,o=[...e,...he.optionalFeatures],a=[...new Set(o)],i=[...new Set(t)];return{include:a,exclude:i,esbuildOptions:s,...r}}function ar(n={}){return n==null&&(n={}),async(e={})=>{e==null&&(e={});try{let t=process.env.CI==="true";process.env.DNDEV_BUILD_ID||(process.env.DNDEV_BUILD_ID=t?`ci-${Math.random().toString(36).slice(2,9)}`:Math.random().toString(36).slice(2,9));let s=e.command,r=e.mode,{appConfig:o,dndev:a,...i}=n;if(!o)throw new Error(`appConfig is required. Import appConfig from src/config/app.ts and pass it to defineViteConfig({ appConfig, ... })
1253
+ `},generateManifest:n=>({themes:n.themes?.length||0,timestamp:Date.now(),hasCustomThemes:n.themes?.some(e=>!e.essential)||!1}),logConfig:n=>{},logStats:(n,e,t)=>{let s=n.themes||[],r=s.filter(a=>!a.essential).length,o=s.length;t&&(o===0?t.warn(`${e} No themes discovered - using framework essential themes fallback`):t.info(`${e} Themes: ${o} discovered${r>0?` (${r} custom)`:""}`))}};function It(n={}){let e=Date.now();return T("theme-plugin",n.debug,n.verbose).debug("\u{1F3A8} Creating theme discovery plugin..."),ie({pluginName:"dndev-theme",icon:"\u{1F3A8}",virtualModuleId:C.themes,DiscoveryClass:Ee,discoveryMethod:"discoverThemes",filePatterns:["**/*.css"],templates:Ft,defaultInspectionPath:z.vite.themeInspection,manifestFileName:z.manifests.theme,configKey:"themes",createDiscovery:(r,o)=>{let a=new de(r,{debug:o.debug,logger:T("css-extractor",o.debug,o.verbose)});return new Ee(a,r,o)}})(n)}q();function Ct(n={}){let e=T("vite-plugins",n.debug,n.verbose);try{let{mode:t,debug:s,verbose:r,isDev:o,server:a={},routes:i={},themes:l={},i18n:u={},assets:c={},seo:p={},pwa:g={},serverShim:d={},pluginFactory:h={}}=n,F=i.debug??s,I=l.debug??s,S=u.debug??s,_=c.debug??s,$=d.debug??s,b=[];b.push(Ot({...d,debug:$}));let w;try{w=O.getInstance()}catch(m){throw new Error(`Failed to initialize PathResolver: ${m.message||m}`)}return b.push({name:"dndev-file-watcher-fix",enforce:"pre",configResolved(m){if(s){e.debug("\u{1F4CB} Vite resolved config (configResolved):");let A={root:m.root,mode:m.mode,envDir:m.envDir,base:m.base,build:m.build?{outDir:m.build.outDir,minify:m.build.minify}:void 0,server:m.server?{port:m.server.port,host:m.server.host}:void 0,plugins:m.plugins?{count:m.plugins.length,names:m.plugins.map(K=>K?.name||"unnamed").filter(Boolean)}:void 0};e.debug(JSON.stringify(A,null,2))}w.setAppRoot(m.root);let D=w.getAppRoot();if(o&&m.server?.port){let A=m.server.https?"https":"http";process.env.VITE_APP_URL=`${A}://localhost:${m.server.port}`,(s||r)&&e.debug(`VITE_APP_URL set: ${process.env.VITE_APP_URL}`)}else o&&e.warn("VITE_APP_URL not set in dev mode. Server port not available.");try{let A=w.getRepoRoot();e.verbose(`Repo: ${A}`),e.verbose(`App: ${D}`)}catch(A){e.debug(`Could not log PathResolver values: ${A.message}`)}if(m.server){let A=E=>{let x=E.replace(/\\/g,"/"),G=D.replace(/\\/g,"/");return!x.startsWith(G)};m.server.watch||(m.server.watch={});let K=["**/node_modules/**","**/.git/**","**/dist/**","**/build/**","**/.next/**","**/.turbo/**","**/.vite/**","**/functions/**","**/.generated/**"];m.server.watch={...m.server.watch,ignored:[...m.server.watch.ignored||[],...K,A]},e.verbose(`Fixed file watcher to use app root: ${D}`)}}}),b.push(_t({debug:s,verbose:r})),b.push(Pt({debug:s})),b.push(Cs({fastRefresh:!0,jsxRuntime:"automatic"})),b.push(Ms({ignoreConfigErrors:!0})),a.https!==!1&&b.push(Is()),b.push(At({...h,...i,debug:F})),b.push(It({...h,...l,debug:I})),b.push(Et({...h,...u,debug:S})),b.push(yt({...h,...c,debug:_})),b.push(wt({...h,mode:t,debug:s,verbose:r})),b.push(Tt({...p,debug:s,isDev:o})),g.enabled&&b.push($t({...g,debug:s})),b.push(St({debug:s})),b}catch(t){throw T("vite-plugins",!1,!0).error(`Failed to create Vite plugins: ${t.message}`),t}}j();function Ls(n){if(!n)return{};let e={};return Array.isArray(n)?n.forEach(({find:t,replacement:s})=>{typeof t=="string"&&(e[t]=s)}):typeof n=="object"&&Object.assign(e,n),e}function Mt(n={}){let{alias:e,...t}=n,{conditions:s,...r}=t;return{alias:{"@":"/src",...Ls(e)},dedupe:["react","react-dom","react-router-dom"],preserveSymlinks:!1,conditions:["browser","module","import","vite-app",...s||[]],...r}}function Lt(n={}){let{include:e=[],exclude:t=[],esbuildOptions:s={},...r}=n,o=[...e,...he.optionalFeatures],a=[...new Set(o)],i=[...new Set(t)];return{include:a,exclude:i,esbuildOptions:s,...r}}function rr(n={}){return n==null&&(n={}),async(e={})=>{e==null&&(e={});try{let t=process.env.CI==="true";process.env.DNDEV_BUILD_ID||(process.env.DNDEV_BUILD_ID=t?`ci-${Math.random().toString(36).slice(2,9)}`:Math.random().toString(36).slice(2,9));let s=e.command,r=e.mode,{appConfig:o,dndev:a,...i}=n;if(!o)throw new Error(`appConfig is required. Import appConfig from src/config/app.ts and pass it to defineViteConfig({ appConfig, ... })
1254
1254
  Make sure the import statement in vite.config.ts is: import { appConfig } from "./src/config/app";`);if(typeof o!="object"||o===null)throw new Error(`appConfig must be an object, but got ${typeof o}. Make sure you are exporting appConfig from src/config/app.ts correctly.`);let l=o?.features?{debug:o.features.debug}:void 0,u=o?.seo&&typeof o.seo!="boolean"?{...o.seo,siteName:o.seo.siteName||o.app?.name}:o?.app?.name?{siteName:o.app.name}:void 0,{features:c,seo:p,...g}=i,d=o?.app?{name:o.app.name,shortName:o.app.shortName,description:o.app.description}:void 0,{pwa:h={},...F}=g,I={...h,app:h.app||d},S={...l?{features:l}:{},...u?{seo:u}:{},...Object.keys(I).length>0?{pwa:I}:{},...F,mode:r},_;try{_=ft(S)}catch(H){throw new Error(`mergeOptions failed: ${H?.message||H||"Unknown error"}`)}let $;try{$=mt(_)}catch(H){throw new Error(`normalizeOptions failed: ${H?.message||H||"Unknown error"}`)}if(!$)throw new Error("normalizeOptions returned undefined");let{mode:b,debug:w,verbose:m,isDev:D,isDebug:A,shouldAnalyze:K,serverOptions:E,previewOptions:x,buildOverrides:G,resolveOptions:ye,routeOptions:Z,themeOptions:oe,i18nOptions:R,assetOptions:N,featureOptions:k,seoOptions:L,pwaOptions:fe,serverShimOptions:W,chunkingOptions:le,pluginFactoryOptions:ue,base:me,defineOptions:Le,optimizeDepsOptions:ze,pluginsOptions:be,cssOptions:Re,envDir:_e,restOptions:$e}=$,f=T("vite-config",w,m);f.debug(`Mode: ${b}, Dev: ${D}`);let v=process.env.DNDEV_BUILD_ID,M;s==="build"?M=`Building for ${b}`:s==="serve"?M=`Development server (${b})`:s==="preview"?M=`Preview server (serving ${b} build)`:M=`Running ${s} (${b})`,f.info(`
1255
1255
  \u{1F3D7}\uFE0F DnDev Framework - ${M}${v?` [build:${v}]`:""}`),f.info(` Platform: Vite | Command: ${s} | Mode: ${b}
1256
1256
  `);let ne=Ct({mode:b,debug:w,verbose:m,isDev:D,routes:Z,themes:oe,i18n:R,assets:N,features:k,seo:L,pwa:fe,serverShim:W,chunkingOptions:le,pluginFactory:ue});if(!Array.isArray(ne))throw new Error(`createVitePlugins returned ${typeof ne}, expected array. Value: ${ne}`);let se=ut({mode:b,chunkingOptions:le,debug:w,isDev:D,isDebug:A,shouldAnalyze:K}),qt=pt(E.port||3e3,E,f),Yt=gt(x);if(a)try{let{createDndevPlugin:H}=await Promise.resolve().then(()=>(Jt(),Ht));be.push(H(typeof a=="object"?a:{}))}catch{}return{...me&&{base:me},plugins:[...ne,...be],appType:"spa",assetsInclude:["**/*.woff","**/*.woff2","**/*.ttf","**/*.otf","**/*.eot"],...b==="production"&&{build:se},...s==="serve"&&{server:qt},...s==="preview"&&{preview:Yt},..._e&&{envDir:_e},customLogger:b==="production"&&!w?(()=>{let H={hasWarned:!1,_shouldSuppress(X){return X.includes("dist/")||X.includes("kB")||X.includes("\u2502")||X.includes("gzip:")||X.includes("\u2713 built in")||X.match(/built in \d+\.\d+s/)},info(X){H._shouldSuppress(X)},warn(X){H._shouldSuppress(X)},error(X){},warnOnce(X){H.hasWarned||(H.hasWarned=!0)},clearScreen(){},hasErrorLogged(){return!1}};return H})():void 0,css:{postcss:vt(Re),...Re},optimizeDeps:Lt(ze),resolve:Mt(ye),define:{...Le,"process.env.NODE_ENV":JSON.stringify(r),__DEV__:JSON.stringify(D),__PROD__:JSON.stringify(!D)},...$e}}catch(t){let s=t||new Error("Unknown error occurred"),r=s?.message||s?.toString()||String(s)||"Unknown error",o=s?.stack||"",a=new Error(`Failed to create Vite config: ${r}${o?`
1257
- ${o}`:""}`);throw a.stack=o||a.stack,a}}}export{ar as defineViteConfig};
1257
+ ${o}`:""}`);throw a.stack=o||a.stack,a}}}export{rr as defineViteConfig};