@donotdev/core 0.0.45 → 0.0.46
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/empty.cjs +2 -2
- package/empty.js +5 -2
- package/functions/index.js +5 -5
- package/index.js +37 -37
- package/next/index.js +42 -42
- package/package.json +2 -2
- package/vite/index.js +31 -30
- package/i18n/locales/lazy/entityFormTemplate_ar.json +0 -85
- package/i18n/locales/lazy/entityFormTemplate_da.json +0 -85
- package/i18n/locales/lazy/entityFormTemplate_de.json +0 -85
- package/i18n/locales/lazy/entityFormTemplate_en.json +0 -85
- package/i18n/locales/lazy/entityFormTemplate_es.json +0 -85
- package/i18n/locales/lazy/entityFormTemplate_fr.json +0 -85
- package/i18n/locales/lazy/entityFormTemplate_it.json +0 -85
- package/i18n/locales/lazy/entityFormTemplate_ja.json +0 -85
- package/i18n/locales/lazy/entityFormTemplate_ko.json +0 -85
- package/i18n/locales/lazy/entityFormTemplate_nl.json +0 -85
- package/i18n/locales/lazy/loginTemplate_ar.json +0 -26
- package/i18n/locales/lazy/loginTemplate_da.json +0 -21
- package/i18n/locales/lazy/loginTemplate_de.json +0 -26
- package/i18n/locales/lazy/loginTemplate_en.json +0 -26
- package/i18n/locales/lazy/loginTemplate_es.json +0 -26
- package/i18n/locales/lazy/loginTemplate_fr.json +0 -26
- package/i18n/locales/lazy/loginTemplate_it.json +0 -26
- package/i18n/locales/lazy/loginTemplate_ja.json +0 -26
- package/i18n/locales/lazy/loginTemplate_ko.json +0 -26
- package/i18n/locales/lazy/loginTemplate_nl.json +0 -21
- package/i18n/locales/lazy/profileDBTemplate_ar.json +0 -73
- package/i18n/locales/lazy/profileDBTemplate_da.json +0 -73
- package/i18n/locales/lazy/profileDBTemplate_de.json +0 -73
- package/i18n/locales/lazy/profileDBTemplate_en.json +0 -73
- package/i18n/locales/lazy/profileDBTemplate_es.json +0 -73
- package/i18n/locales/lazy/profileDBTemplate_fr.json +0 -73
- package/i18n/locales/lazy/profileDBTemplate_it.json +0 -73
- package/i18n/locales/lazy/profileDBTemplate_ja.json +0 -73
- package/i18n/locales/lazy/profileDBTemplate_ko.json +0 -73
- package/i18n/locales/lazy/profileDBTemplate_nl.json +0 -73
- package/i18n/locales/lazy/profileTemplate_ar.json +0 -85
- package/i18n/locales/lazy/profileTemplate_da.json +0 -85
- package/i18n/locales/lazy/profileTemplate_de.json +0 -85
- package/i18n/locales/lazy/profileTemplate_en.json +0 -85
- package/i18n/locales/lazy/profileTemplate_es.json +0 -85
- package/i18n/locales/lazy/profileTemplate_fr.json +0 -85
- package/i18n/locales/lazy/profileTemplate_it.json +0 -85
- package/i18n/locales/lazy/profileTemplate_ja.json +0 -85
- package/i18n/locales/lazy/profileTemplate_ko.json +0 -85
- package/i18n/locales/lazy/profileTemplate_nl.json +0 -85
package/vite/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
var es=Object.defineProperty;var Ue=(n,e)=>()=>(n&&(e=n(n=0)),e);var ts=(n,e)=>{for(var t in e)es(n,t,{get:e[t],enumerable:!0})};function it(n,e=null){let t=se[n];if(!t)throw new Error(`Unknown pattern type: ${n}`);return e&&t.framework?{...t,framework:t.framework.map(s=>`${e}/${s}`)}:t}function Te(n){return nt[n]||nt.base}var Ge,M,V,j,Be,Ee,Oe,se,ye,at,Ve,He,Re,Je,nt,L=Ue(()=>{"use strict";Ge={HOMEPAGE_FILE:"HomePage.tsx",HOMEPAGE_PATH:"/",HOMEPAGE_COMPONENT:"HomePage"},M={routes:"virtual:routes",themes:"virtual:themes",i18n:"virtual:i18n-mapping",assets:"virtual:assets",env:"virtual:env"},V={routes:"routes",themes:"themes",i18n:"i18n",assets:"assets",env:"env"},j={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",configEnv:"src/config/dndev-config-env.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"}},Be={package:"@donotdev/ui",assetsPath:"packages/ui/assets",browserTargets:["> 1%","last 2 versions","Firefox ESR","not dead","not op_mini all"]},Ee={public:"public",fonts:"fonts",nodeModules:"node_modules",packages:"packages",core:"core",ui:"ui"},Oe={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"},se={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:[`${Oe.SOURCE_EAGER}/*_*.json`],lazy:[`${Oe.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/**"]},ye={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"],optionalFeatures:[],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"]},at=["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"],Ve=["@donotdev/core/functions","@donotdev/core/server"],He={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)/}},Re={Inter:"inter-latin","Space Grotesk":"space-grotesk-latin","Playfair Display":"playfair-display-latin","Press Start 2P":"press-start-2p-latin",Roboto:"roboto-latin"},Je=[{name:"light",displayName:"Light",icon:"Sun",isDark:!1}],nt={base:{absolute:!0,onlyFiles:!0,ignore:se.globalIgnore},css:{absolute:!0,onlyFiles:!0,ignore:[...se.globalIgnore,"**/*.test.css"]},routes:{absolute:!0,onlyFiles:!0,ignore:[...se.globalIgnore,"**/*.test.tsx","**/*.stories.tsx"]},i18n:{absolute:!0,onlyFiles:!0,ignore:se.globalIgnore},assets:{absolute:!0,onlyFiles:!0,ignore:se.globalIgnore}}});import*as E from"node:fs";import"node:fs";import{createRequire as ls}from"node:module";import{resolve as Fe,join as fe,dirname as be,relative as lt,normalize as cs,sep as ct,extname as us}from"node:path";import"node:url";import ps from"fast-glob";function ut(n,e){return n().catch(t=>{throw new Error(`${e}: ${t instanceof Error?t.message:String(t)}`)})}var we,U,pt,$,B=Ue(()=>{"use strict";L();we={getGlobOptionsFor:Te||void 0,SCAN_PATTERNS:se||void 0,getPatternsFor:it||void 0,I18N_PATHS:Oe||void 0},U={error:(n,e)=>{},warn:(n,e)=>{},info:n=>{}};pt={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"},$=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 cs(e).split(ct).join("/")}catch{return String(e).split(ct).join("/")}}getRelativePath(e){let t=this.getAppRoot(),s=lt(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(be(e)):""}resolvePackage(e,t=null){try{let s=t||this.getAppRoot(),o=ls(fe(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=Fe(t,e);return this.normalizePath(s)}resolveRepoPath(e){let t=this.getRepoRoot(),s=this.normalizePath(e),r=Fe(t,s);return this.normalizePath(r)}resolvePath(e,t){let s=this.normalizePath(t),r=this.normalizePath(e),o=Fe(s,r);return this.normalizePath(o)}createImportPath(e){return"./"+this.getRelativePath(e)}getFileInfo(e){try{let t=E.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:us(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 E.promises.readFile(e);let a=await E.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 E.readFileSync(e);let a=E.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(be(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 E.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 ut(async()=>(Buffer.isBuffer(g)?await E.promises.writeFile(l,g):await E.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(be(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{E.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)?E.writeFileSync(l,g):E.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(be(i));try{await E.promises.mkdir(u,{recursive:!0})}catch(c){if(c?.code!=="EEXIST")throw c}try{return await ut(async()=>(await E.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(be(i));try{E.mkdirSync(u,{recursive:!0})}catch(c){if(c?.code!=="EEXIST")throw c}try{return E.copyFileSync(e,i),a&&U.info(`${l?"Updated":"Created"} file: ${i}`),!0}catch{return!1}}pathExists(e,t=!1){try{return E.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 E.existsSync(t)||E.mkdirSync(t,{recursive:!0}),!0}catch{return!1}}readdirSync(e,t){try{return E.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 E.statSync(e)}catch(t){return this.options.debug&&U.warn(`Failed to stat file: ${e}`,t),null}}realpathSync(e){return E.realpathSync(e)}watch(e,t,s){return E.watch(e,t,s)}lstatSync(e){try{return E.lstatSync(e)}catch(t){return this.options.debug&&U.warn(`Failed to lstat file: ${e}`,t),null}}async ensureDir(e){try{await E.promises.mkdir(e,{recursive:!0})}catch(t){if(t?.code!=="EEXIST")throw t}}ensureDirSync(e){try{E.mkdirSync(e,{recursive:!0})}catch(t){if(t?.code!=="EEXIST")throw t}}async remove(e){await E.promises.rm(e,{recursive:!0,force:!0})}removeSync(e){E.rmSync(e,{recursive:!0,force:!0})}async readdir(e,t){return E.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=fe(this._repoRoot,"packages");return this.pathExists(e)}isWithinApp(e){let t=this.normalizePath(Fe(e)),s=this.getAppRoot(),r=lt(s,t),o=this.normalizePath(r);return!o.startsWith("../")&&!o.startsWith("/")}async findFiles(e,t,s={}){let r=this.normalizePath(fe(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:we.SCAN_PATTERNS?.globalIgnore||["**/node_modules/**","**/dist/**","**/build/**","**/.git/**"]};return await this._globWithNormalization([i],{...l,...s})}clearCache(){}async _resolveFrameworkI18nPattern(e){let t=we.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(fe(r,t.PUBLISHED_ROOT,s)),a=o.replace(/\/[^/]*\*.*$/,"");return this.pathExists(a),o}async _globWithNormalization(e,t){return(await ps(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=we.getGlobOptionsFor?we.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(!we.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=we.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(){return this.getEmptyCjsModulePath().replace(/\.cjs$/,".js")}getEmptyCjsModulePath(){let e=this.resolvePackage("@donotdev/core/empty");if(!e)throw new Error("Cannot resolve @donotdev/core/empty \u2014 package setup is broken");return e}_findRepoRoot(e){let t=this.normalizePath(e),s=0,r=this.options.maxLevels;for(;s<r;){let o=this.normalizePath(fe(t,pt.TOOLING)),a=this.normalizePath(fe(t,pt.CORE));if(this.pathExists(o)&&this.pathExists(a))return t;let i=fe(t,"apps");if(this.pathExists(i)&&this.statSync(i)?.isDirectory())return this.normalizePath(t);let l=this.normalizePath(fe(t,"package.json"));if(this.pathExists(l)&&this.normalizePath(be(t))===t)return t;let u=this.normalizePath(be(t));if(u===t)break;t=u,s++}return this.normalizePath(e)}}});var Kt={};ts(Kt,{createDndevPlugin:()=>xr});import{execSync as K,execFileSync as et,spawn as Js}from"node:child_process";function J(){return $.getInstance()}function Z(){return J().getRepoRoot()}function Ht(){return J().resolveRepoPath(".dndev")}function f(n,e,t=200){n.writeHead(t,{"Content-Type":"application/json"}),n.end(JSON.stringify(e))}function ge(n,e=qs){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 Ys(n){let e=n.lastIndexOf(".");return e===-1?"":n.slice(e).toLowerCase()}function Ks(){let n=J(),e=[],t=process.env.HOME||process.env.USERPROFILE||"";try{let r=process.platform==="win32"?"where node":"which node",o=K(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
|
|
1
|
+
var ns=Object.defineProperty;var Ge=(n,e)=>()=>(n&&(e=n(n=0)),e);var as=(n,e)=>{for(var t in e)ns(n,t,{get:e[t],enumerable:!0})};function pt(n,e=null){let t=ee[n];if(!t)throw new Error(`Unknown pattern type: ${n}`);return e&&t.framework?{...t,framework:t.framework.map(s=>`${e}/${s}`)}:t}function Me(n){return lt[n]||lt.base}var Ve,M,V,j,He,ke,Ce,ee,ye,ct,Je,qe,De,ut,Ye,lt,L=Ge(()=>{"use strict";Ve={HOMEPAGE_FILE:"HomePage.tsx",HOMEPAGE_PATH:"/",HOMEPAGE_COMPONENT:"HomePage"},M={routes:"virtual:routes",themes:"virtual:themes",i18n:"virtual:i18n-mapping",assets:"virtual:assets",env:"virtual:env"},V={routes:"routes",themes:"themes",i18n:"i18n",assets:"assets",env:"env"},j={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",configEnv:"src/config/dndev-config-env.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"}},He={package:"@donotdev/ui",assetsPath:"packages/ui/assets",browserTargets:["> 1%","last 2 versions","Firefox ESR","not dead","not op_mini all"]},ke={public:"public",fonts:"fonts",nodeModules:"node_modules",packages:"packages",core:"core",ui:"ui"},Ce={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"},ee={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:[`${Ce.SOURCE_EAGER}/*_*.json`],lazy:[`${Ce.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/**"]},ye={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"],optionalFeatures:[],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"]},ct=["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"],Je=["@donotdev/core/functions","@donotdev/core/server"],qe={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)/}},De={inter:[300,400,600,700],"playfair-display":[400,500,600,700],roboto:[400,700],"space-grotesk":[300,400,500,600,700],"press-start-2p":[400]},ut={en:["latin"],fr:["latin"],es:["latin"],de:["latin"],it:["latin"],pt:["latin"],nl:["latin"],da:["latin"],sv:["latin"],nb:["latin"],fi:["latin"],pl:["latin"],cs:["latin"],sk:["latin"],hr:["latin"],sl:["latin"],hu:["latin"],ro:["latin"],et:["latin"],lv:["latin"],lt:["latin"],mt:["latin"],ga:["latin"],ca:["latin"],eu:["latin"],gl:["latin"],af:["latin"],sw:["latin"],tr:["latin"],id:["latin"],ms:["latin"],tl:["latin"],vi:["latin","vietnamese"],ru:["latin","cyrillic"],bg:["latin","cyrillic"],uk:["latin","cyrillic"],sr:["latin","cyrillic"],mk:["latin","cyrillic"],be:["latin","cyrillic"],el:["latin","greek"],zh:[],ja:[],ko:[],ar:[],he:[],th:[],hi:[],bn:[],ta:[]},Ye=[{name:"light",displayName:"Light",icon:"Sun",isDark:!1}],lt={base:{absolute:!0,onlyFiles:!0,ignore:ee.globalIgnore},css:{absolute:!0,onlyFiles:!0,ignore:[...ee.globalIgnore,"**/*.test.css"]},routes:{absolute:!0,onlyFiles:!0,ignore:[...ee.globalIgnore,"**/*.test.tsx","**/*.stories.tsx"]},i18n:{absolute:!0,onlyFiles:!0,ignore:ee.globalIgnore},assets:{absolute:!0,onlyFiles:!0,ignore:ee.globalIgnore}}});import*as $ from"node:fs";import"node:fs";import{createRequire as ds}from"node:module";import{resolve as Ae,join as me,dirname as he,relative as gt,normalize as fs,sep as dt,extname as ms}from"node:path";import{fileURLToPath as hs}from"node:url";import vs from"fast-glob";function ft(n,e){return n().catch(t=>{throw new Error(`${e}: ${t instanceof Error?t.message:String(t)}`)})}var Se,U,mt,A,G=Ge(()=>{"use strict";L();Se={getGlobOptionsFor:Me||void 0,SCAN_PATTERNS:ee||void 0,getPatternsFor:pt||void 0,I18N_PATHS:Ce||void 0},U={error:(n,e)=>{},warn:(n,e)=>{},info:n=>{}};mt={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"},A=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 fs(e).split(dt).join("/")}catch{return String(e).split(dt).join("/")}}getRelativePath(e){let t=this.getAppRoot(),s=gt(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(he(e)):""}resolvePackage(e,t=null){try{let s=t||this.getAppRoot(),o=ds(me(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=$.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:ms(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 $.promises.readFile(e);let a=await $.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 $.readFileSync(e);let a=$.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(he(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 $.promises.mkdir(u,{recursive:!0})}catch(g){if(g?.code!=="EEXIST")throw g}let p=this._detectFormat(e,r),d;Buffer.isBuffer(t)?d=t:p==="json"&&typeof t=="object"?d=JSON.stringify(t,null,2):d=String(t);try{return await ft(async()=>(Buffer.isBuffer(d)?await $.promises.writeFile(l,d):await $.promises.writeFile(l,d,"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(he(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{$.mkdirSync(u,{recursive:!0})}catch(g){if(g?.code!=="EEXIST")throw g}let p=this._detectFormat(e,r),d;Buffer.isBuffer(t)?d=t:p==="json"&&typeof t=="object"?d=JSON.stringify(t,null,2):d=String(t);try{return Buffer.isBuffer(d)?$.writeFileSync(l,d):$.writeFileSync(l,d,"utf8"),i&&U.info(`${c?"Updated":"Created"} file: ${l}`),!0}catch(g){throw new Error(`Failed to write file: ${l}: ${g instanceof Error?g.message:String(g)}`)}}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(he(i));try{await $.promises.mkdir(u,{recursive:!0})}catch(c){if(c?.code!=="EEXIST")throw c}try{return await ft(async()=>(await $.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(he(i));try{$.mkdirSync(u,{recursive:!0})}catch(c){if(c?.code!=="EEXIST")throw c}try{return $.copyFileSync(e,i),a&&U.info(`${l?"Updated":"Created"} file: ${i}`),!0}catch{return!1}}pathExists(e,t=!1){try{return $.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 $.existsSync(t)||$.mkdirSync(t,{recursive:!0}),!0}catch{return!1}}readdirSync(e,t){try{return $.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 $.statSync(e)}catch(t){return this.options.debug&&U.warn(`Failed to stat file: ${e}`,t),null}}realpathSync(e){return $.realpathSync(e)}watch(e,t,s){return $.watch(e,t,s)}lstatSync(e){try{return $.lstatSync(e)}catch(t){return this.options.debug&&U.warn(`Failed to lstat file: ${e}`,t),null}}async ensureDir(e){try{await $.promises.mkdir(e,{recursive:!0})}catch(t){if(t?.code!=="EEXIST")throw t}}ensureDirSync(e){try{$.mkdirSync(e,{recursive:!0})}catch(t){if(t?.code!=="EEXIST")throw t}}async remove(e){await $.promises.rm(e,{recursive:!0,force:!0})}removeSync(e){$.rmSync(e,{recursive:!0,force:!0})}async readdir(e,t){return $.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=me(this._repoRoot,"packages");return this.pathExists(e)}isWithinApp(e){let t=this.normalizePath(Ae(e)),s=this.getAppRoot(),r=gt(s,t),o=this.normalizePath(r);return!o.startsWith("../")&&!o.startsWith("/")}async findFiles(e,t,s={}){let r=this.normalizePath(me(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:Se.SCAN_PATTERNS?.globalIgnore||["**/node_modules/**","**/dist/**","**/build/**","**/.git/**"]};return await this._globWithNormalization([i],{...l,...s})}clearCache(){}async _resolveFrameworkI18nPattern(e){let t=Se.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(me(r,t.PUBLISHED_ROOT,s)),a=o.replace(/\/[^/]*\*.*$/,"");return this.pathExists(a),o}async _globWithNormalization(e,t){return(await vs(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=Se.getGlobOptionsFor?Se.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(!Se.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=Se.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(){return this.getEmptyCjsModulePath().replace(/\.cjs$/,".js")}getEmptyFlagModulePath(){let e=he(hs(import.meta.url));return this.normalizePath(Ae(e,"emptyFlag.js"))}getEmptyCjsModulePath(){let e=this.resolvePackage("@donotdev/core/empty");if(!e)throw new Error("Cannot resolve @donotdev/core/empty \u2014 package setup is broken");return e}_findRepoRoot(e){let t=this.normalizePath(e),s=0,r=this.options.maxLevels;for(;s<r;){let o=this.normalizePath(me(t,mt.TOOLING)),a=this.normalizePath(me(t,mt.CORE));if(this.pathExists(o)&&this.pathExists(a))return t;let i=me(t,"apps");if(this.pathExists(i)&&this.statSync(i)?.isDirectory())return this.normalizePath(t);let l=this.normalizePath(me(t,"package.json"));if(this.pathExists(l)&&this.normalizePath(he(t))===t)return t;let u=this.normalizePath(he(t));if(u===t)break;t=u,s++}return this.normalizePath(e)}}});var ts={};as(ts,{createDndevPlugin:()=>$r});import{execSync as ue,execFileSync as Re,spawn as Qs}from"node:child_process";function J(){return A.getInstance()}function X(){return J().getRepoRoot()}function Zt(){return J().resolveRepoPath(".dndev")}function f(n,e,t=200){n.writeHead(t,{"Content-Type":"application/json"}),n.end(JSON.stringify(e))}function ge(n,e=er){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 tr(n){let e=n.lastIndexOf(".");return e===-1?"":n.slice(e).toLowerCase()}function sr(){let n=J(),e=[],t=process.env.HOME||process.env.USERPROFILE||"";try{let r=process.platform==="win32"?"where node":"which node",o=ue(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 Xt(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 rr(n){return n.includes("..")?!1:n.startsWith(".dndev/")||n.startsWith("docs/")||n.startsWith("guides/")}function Qt(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 nr(n,e){let s=new URL(n.url,`http://${n.headers.host}`).searchParams.get("path");if(!s)return f(e,{error:"path parameter required"},400);if(!Xt(s))return f(e,{error:"Access denied"},403);let r=Qt(s);if(!r)return f(e,{error:"Access denied"},403);let o=J();if(!o.pathExists(r))return f(e,{error:"File not found"},404);let a=tr(r);if(or.has(a)){let i=o.readSync(r,{format:"buffer"});return i?(e.writeHead(200,{"Content-Type":es[a]||"application/octet-stream","Content-Length":i.byteLength}),void e.end(Buffer.from(i))):f(e,{error:"Failed to read file"},500)}if(a===".json")try{let i=await o.read(r);return i===null?f(e,{error:"Failed to read file"},500):f(e,{path:s,content:i})}catch{return f(e,{error:"Invalid JSON"},500)}try{let i=await o.read(r,{format:"text"});if(i===null)return f(e,{error:"Failed to read file"},500);f(e,{path:s,content:i})}catch{f(e,{error:"Failed to read file"},500)}}function ar(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 d=r.readdirSync(c,{withFileTypes:!0});for(let g of d){let m=p?`${p}/${g.name}`:g.name;g.isDirectory()&&i.has(g.name)||(g.isDirectory()?(a.push({path:m,name:g.name,isDirectory:!0}),l(r.resolvePath(g.name,c),m)):g.name.endsWith(".md")&&a.push({path:m,name:g.name,isDirectory:!1}))}}catch{}}let u=[".dndev","docs","guides"];if(s){if(s.includes("..")||s.includes("\0"))return f(e,{error:"Access denied"},403);if(!u.includes(s)&&!u.some(g=>s.startsWith(g+"/")))return f(e,{error:"Directory not allowed"},403);let c=r.resolvePath(s,o),p=r.normalizePath(o);if(!r.normalizePath(c).startsWith(p+"/"))return f(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{}}f(e,{entries:a})}async function ir(n,e){let s=new URL(n.url,`http://${n.headers.host}`).searchParams.get("path");if(!s)return f(e,{error:"path parameter required"},400);if(!Xt(s))return f(e,{error:"Access denied"},403);if(!rr(s))return f(e,{error:"Write not allowed to this path"},403);let r=Qt(s);if(!r)return f(e,{error:"Access denied"},403);try{let o=await ge(n),{content:a}=JSON.parse(o);if(a===void 0)return f(e,{error:"content field required"},400);let i=typeof a=="string"?a:JSON.stringify(a,null,2);await J().write(r,i,{overwrite:!0}),f(e,{ok:!0})}catch{f(e,{error:"Failed to write file"},500)}}async function lr(n,e){try{let t=await ge(n),{line:s,checked:r}=JSON.parse(t);if(typeof s!="number")return f(e,{error:"line number required"},400);let o=J(),a=o.resolveRepoPath(".dndev/implementation.md");if(!o.pathExists(a))return f(e,{error:"implementation.md not found"},404);let i=await o.read(a,{format:"text"});if(i===null)return f(e,{error:"Failed to read file"},500);let l=i.split(`
|
|
3
3
|
`);if(s<0||s>=l.length)return f(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}),f(e,{ok:!0,line:l[s]})}catch{f(e,{error:"Failed to update progress"},500)}}async function
|
|
5
|
-
`))a.startsWith("worktree ")?(o.path&&r.push(o),o={path:a.slice(9)}):a.startsWith("HEAD ")?o.head=a.slice(5):a.startsWith("branch ")?(o.branch=a.slice(7),o.shortBranch=o.branch.replace("refs/heads/","")):a==="detached"&&(o.detached=!0);o.path&&r.push(o),f(e,{worktrees:r})}catch(t){f(e,{error:t.message},500)}}async function
|
|
6
|
-
`;a.writeSync(i,p)}let l=(c,p,
|
|
7
|
-
`;a.appendFile(i,
|
|
8
|
-
`)),{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:ms(),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?[]:[ds({include:["**/*.js","**/*.ts","**/*.tsx","**/*.jsx"],functions:["console.*","debugger"],labels:["debug"]})],...i?[(()=>{let g=$.getInstance(),d=g.getAppRoot(),h="dist",D=g.resolveAppPath(`${h}/stats.html`),O=()=>{try{let R=g.resolveAppPath(h);g.pathExists(R)||g.mkdir(R)}catch{}},y=fs({filename:D,open:!0,gzipSize:!0,brotliSize:!0,template:"treemap",sourcemap:o||a,projectRoot:d});if(y.buildStart){let R=y.buildStart.bind(y);y.buildStart=function(...b){O();let S=R.apply(this,b);return S&&typeof S.then=="function"?S.catch(v=>{}):S}}else y.buildStart=function(){O()};let k=["generateBundle","writeBundle","closeBundle"];for(let R of k)if(y[R]){let b=y[R];y[R]=function(...S){try{O();let v=b.apply(this,S);return v&&typeof v.then=="function"?v.catch(A=>{let T=A?.message||A?.toString()||String(A)||"Unknown error";u.warn(`Bundle visualizer warning in ${R}: ${T}`),R==="closeBundle"&&u.warn(`You can manually open ${D} to view the bundle analysis`)}):v}catch(v){let A=v?.message||v?.toString()||String(v)||"Unknown error";buildLogger.warn(`Bundle visualizer warning in ${R}: ${A}`),R==="closeBundle"&&buildLogger.warn(` You can manually open ${D} to view the bundle analysis`)}}}return y})()]:[]]}}}function ms(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 hs(){let n=!1,e=$.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 vs(n,e){if(n!==void 0)return n;let{isDocker:t,isWSL2:s,isBun:r}=hs();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 dt(n,e={},t){let s=$.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:(()=>{let h=vs(e?.watch?.usePolling,t);return{usePolling:h,interval:e?.watch?.interval??2e3,...h&&{awaitWriteFinish:{stabilityThreshold:300,pollInterval:100}},...e?.watch||{}}})(),hmr:{...p,...u},headers:{"Cross-Origin-Opener-Policy":"same-origin-allow-popups","Cross-Origin-Embedder-Policy":"unsafe-none"},middlewareMode:!1,...l}}function ft(n={}){let e=n.https===!0;return{...n,https:e}}L();var re={CONCATENATE_DEDUPE:"CONCATENATE_DEDUPE",SHALLOW_MERGE:"SHALLOW_MERGE",DEEP_MERGE:"DEEP_MERGE",REPLACE:"REPLACE"};function me(n,e,t,s={}){let{protectedKeys:r=[],onConflict:o}=s;if(e==null)return n;switch(t){case re.CONCATENATE_DEDUPE:{if(!Array.isArray(n)||!Array.isArray(e))return e;let a=[...n,...e];return[...new Set(a)]}case re.SHALLOW_MERGE:return typeof n!="object"||typeof e!="object"||n===null||e===null||Array.isArray(n)||Array.isArray(e)?e:{...n,...e};case re.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]=me(a[i],e[i],re.DEEP_MERGE,{protectedKeys:r,onConflict:o}):a[i]=e[i]}return a}case re.REPLACE:default:return e}}function mt(n,e,t=[],s){let r=[...n,...e||[]],o=[...new Set(r)];return[...new Set([...o,...t])]}var xe={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:[...ye.mandatoryIncludes],exclude:[...ye.buildTools,...Object.values(M)],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 ht(n={},e={}){let{onConflict:t}=e,s={...xe},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(k=>!k.startsWith("@donotdev/")),h=g.filter(k=>d.includes(k));if(h.length>0)for(let k of h)o("optimizeDeps.exclude",k,"excluded",`Framework requires ${k} to be included. It will be included despite your exclusion.`);let D=mt(u,p,d),O=me(c,g,re.CONCATENATE_DEDUPE),y=me(l?.esbuildOptions||{},i.esbuildOptions||{},re.DEEP_MERGE,{protectedKeys:["external"],onConflict:k=>o(`optimizeDeps.esbuildOptions.${k}`,l?.esbuildOptions?.[k],i.esbuildOptions?.[k],`Framework requires ${k} to remain as configured.`)});s[a]={...l,include:D,exclude:O,esbuildOptions:y,...Object.fromEntries(Object.entries(i).filter(([k])=>!["include","exclude","esbuildOptions"].includes(k)))};return}if(a==="css"&&typeof i=="object"&&i!==null){s[a]=me(l||{},i,re.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]=me(l||{},i,re.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]=me(l,i,re.CONCATENATE_DEDUPE):s[a]=i;return}if(typeof i=="object"&&i!==null&&typeof l=="object"&&l!==null&&!Array.isArray(l)){s[a]=me(l,i,re.SHALLOW_MERGE);return}s[a]=i}),s}function vt(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:D={},pluginFactory:O={},debug:y,verbose:k,base:R,define:b={},optimizeDeps:S={},plugins:v=[],css:A={},envDir:T,...X}=n,P=s!=="production",x=y||P,W=s==="production"&&(r.analyze??xe.build.analyze);return{mode:s,debug:y,verbose:k,isDev:P,isDebug:x,shouldAnalyze:W,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:D,pluginFactoryOptions:O,base:R,defineOptions:b,optimizeDepsOptions:S,pluginsOptions:v,cssOptions:A,envDir:T,restOptions:X}}B();import ys from"autoprefixer";import bs from"postcss-import";import ws from"postcss-nesting";function yt({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 bt(n={}){if(n.postcss)return n.postcss;let e=$.getInstance();return yt({postcssImport:bs,postcssNesting:ws,autoprefixer:ys,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 Ws from"@vitejs/plugin-basic-ssl";import Gs from"@vitejs/plugin-react";import Bs from"vite-tsconfig-paths";var H=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}
|
|
4
|
+
`),{overwrite:!0}),f(e,{ok:!0,line:l[s]})}catch{f(e,{error:"Failed to update progress"},500)}}async function cr(n,e){try{let t=await ge(n),{id:s,data:r}=JSON.parse(t);if(!s||!r)return f(e,{error:"id and data required"},400);if(!/^[\w-]+$/.test(s))return f(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}),f(e,{ok:!0,path:`.dndev/bugs/${s}.png`})}catch{f(e,{error:"Failed to save screenshot"},500)}}async function ur(n,e){try{let t=await ge(n),{action:s,phase:r}=JSON.parse(t);if(!s||typeof r!="number")return f(e,{error:"action and phase required"},400);let o=J(),a=Zt();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}),f(e,{ok:!0,protocol:l})}catch{f(e,{error:"Failed to update phase"},500)}}function pr(n,e){try{let t=X(),s=ue("git rev-parse --short HEAD",{cwd:t,encoding:"utf-8",timeout:5e3}).trim(),r=ue("git rev-parse --abbrev-ref HEAD",{cwd:t,encoding:"utf-8",timeout:5e3}).trim();f(e,{commit:s,branch:r})}catch{f(e,{commit:"unknown",branch:"unknown"})}}async function gr(n,e){try{let t=await ge(n),s=JSON.parse(t);if(!s.id||!s.type||!s.result)return f(e,{error:"id, type, and result required"},400);let r=J(),o=Zt();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}),f(e,{ok:!0})}catch{f(e,{error:"Failed to append action"},500)}}function dr(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}}});f(e,{apps:o})}catch{f(e,{apps:[]})}}function fr(n,e){try{let t=X(),s=ue("git worktree list --porcelain",{cwd:t,encoding:"utf-8",timeout:5e3}),r=[],o={};for(let a of s.split(`
|
|
5
|
+
`))a.startsWith("worktree ")?(o.path&&r.push(o),o={path:a.slice(9)}):a.startsWith("HEAD ")?o.head=a.slice(5):a.startsWith("branch ")?(o.branch=a.slice(7),o.shortBranch=o.branch.replace("refs/heads/","")):a==="detached"&&(o.detached=!0);o.path&&r.push(o),f(e,{worktrees:r})}catch(t){f(e,{error:t.message},500)}}async function mr(n,e){try{let t=await ge(n),{branch:s}=JSON.parse(t);if(!s||typeof s!="string")return f(e,{error:"branch required"},400);if(!/^[\w][\w./-]*$/.test(s))return f(e,{error:"Invalid branch name"},400);let r=X(),o=J(),a=o.resolvePath("..",r),i=o.getBasename(r),l=o.resolvePath(`${i}-${s.replace(/\//g,"-")}`,a);Re("git",["worktree","add",l,"-b",s],{cwd:r,encoding:"utf-8",timeout:3e4}),f(e,{ok:!0,path:l,branch:s})}catch(t){f(e,{error:t.message},500)}}async function hr(n,e){try{let t=await ge(n),{path:s}=JSON.parse(t);if(!s||typeof s!="string")return f(e,{error:"path required"},400);let r=X();Re("git",["worktree","remove",s,"--force"],{cwd:r,encoding:"utf-8",timeout:1e4}),f(e,{ok:!0})}catch(t){f(e,{error:t.message},500)}}function vr(n,e){try{let s=new URL(n.url,`http://${n.headers.host}`).searchParams.get("branch");if(!s)return f(e,{error:"branch required"},400);if(!/^[\w][\w./-]*$/.test(s))return f(e,{error:"Invalid branch name"},400);let r=X(),o=Re("git",["diff",`main...${s}`,"--stat"],{cwd:r,encoding:"utf-8",timeout:1e4}).trim(),a=Re("git",["diff",`main...${s}`],{cwd:r,encoding:"utf-8",timeout:3e4});f(e,{stat:o,diff:a})}catch(t){f(e,{error:t.message},500)}}async function yr(n,e){try{let t=await ge(n),{branch:s,title:r,bodyText:o}=JSON.parse(t);if(!s)return f(e,{error:"branch required"},400);let a=X(),i=["pr","create","--head",s];r&&i.push("--title",r),o&&i.push("--body",o);let l=Re("gh",i,{cwd:a,encoding:"utf-8",timeout:3e4}).trim();f(e,{ok:!0,url:l})}catch(t){f(e,{error:t.message},500)}}function br(n,e){try{let t=X(),s=ue("git remote get-url origin",{cwd:t,encoding:"utf-8",timeout:5e3}).trim(),r=null;s.includes("github.com")?r="github":s.includes("gitlab")&&(r="gitlab"),f(e,{platform:r,remoteUrl:s})}catch{f(e,{platform:null,remoteUrl:null})}}function wr(n,e){try{let t=X(),s=ue("gh pr list --json number,title,state,author,headRefName,url,isDraft,reviewDecision,statusCheckRollup --limit 50",{cwd:t,encoding:"utf-8",timeout:15e3});f(e,{prs:JSON.parse(s)})}catch(t){f(e,{prs:[],error:t.message})}}function xr(n,e){try{let t=X(),s=ue("gh issue list --json number,title,state,labels,assignees --limit 50",{cwd:t,encoding:"utf-8",timeout:15e3});f(e,{issues:JSON.parse(s)})}catch(t){f(e,{issues:[],error:t.message})}}function Sr(n,e){try{let s=new URL(n.url,`http://${n.headers.host}`).searchParams.get("number");if(!s||!/^\d+$/.test(s))return f(e,{error:"PR number required"},400);let r=X(),o=ue(`gh pr diff ${s}`,{cwd:r,encoding:"utf-8",timeout:3e4});f(e,{diff:o})}catch(t){f(e,{error:t.message},500)}}function Pr(n,e){try{let s=new URL(n.url,`http://${n.headers.host}`).searchParams.get("number");if(!s||!/^\d+$/.test(s))return f(e,{error:"PR number required"},400);let r=X(),o=ue(`gh pr checks ${s} --json name,state,status`,{cwd:r,encoding:"utf-8",timeout:15e3});f(e,{checks:JSON.parse(o)})}catch(t){f(e,{checks:[],error:t.message})}}async function Er(n,e){try{let t=await ge(n),{number:s,action:r,comment:o}=JSON.parse(t);if(!s||!r)return f(e,{error:"number and action required"},400);let a=["approve","request-changes","comment"];if(!a.includes(r))return f(e,{error:`Invalid action. Use: ${a.join(", ")}`},400);let i=X(),l=["pr","review",String(s),`--${r}`];o&&l.push("--body",o),Re("gh",l,{cwd:i,encoding:"utf-8",timeout:15e3}),f(e,{ok:!0})}catch(t){f(e,{error:t.message},500)}}function Rr(n){if(st)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=ue(`fuser ${Kt}/tcp 2>/dev/null`,{encoding:"utf8"}).trim();i&&process.kill(Number(i),"SIGKILL")}catch{}st=!0;let r=e.getRepoRoot(),o=sr(),a=Qs(o,[s],{cwd:r,stdio:["ignore","inherit","inherit","ipc"],env:{...process.env,TERMINAL_PORT:String(Kt),TERMINAL_CWD:r}});a.on("message",i=>{i.type}),a.on("exit",i=>{st=!1}),process.on("exit",()=>{a.kill()})}function _r(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}`;rt.has(c)||(rt.set(c,!0),setTimeout(()=>rt.delete(c),300),n.hot.send("dndev:file-changed",{path:u,timestamp:Date.now()}))});n.httpServer?.on("close",()=>a.close())}}function $r(n={}){return{name:"dndev",configureServer(e){let t=X();n.debug,e.middlewares.use((s,r,o)=>{let a=s.url;if(!a?.startsWith(Yt))return o();let l=new URL(a,`http://${s.headers.host}`).pathname.slice(Yt.length),u=s.method?.toUpperCase();if(u==="GET")return l==="/file"?void nr(s,r):l==="/tree"?void ar(s,r):l==="/git/head"?void pr(s,r):l==="/apps"?void dr(s,r):l==="/worktrees"?void fr(s,r):l==="/worktrees/diff"?void vr(s,r):l==="/git/platform"?void br(s,r):l==="/git/prs"?void wr(s,r):l==="/git/issues"?void xr(s,r):l==="/git/pr/diff"?void Sr(s,r):l==="/git/pr/checks"?void Pr(s,r):f(r,{error:"Not found"},404);if(u==="POST")return l==="/file"?void ir(s,r):l==="/progress/toggle"?void lr(s,r):l==="/bugs/screenshot"?void cr(s,r):l==="/phase"?void ur(s,r):l==="/actions/append"?void gr(s,r):l==="/worktrees/add"?void mr(s,r):l==="/worktrees/remove"?void hr(s,r):l==="/worktrees/pr"?void yr(s,r):l==="/git/pr/review"?void Er(s,r):f(r,{error:"Not found"},404);f(r,{error:"Method not allowed"},405)}),Rr(e),_r(e)}}}var Yt,er,es,or,Kt,st,rt,ss=Ge(()=>{"use strict";G();Yt="/api/dndev";er=5*1024*1024;es={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".ico":"image/x-icon",".svg":"image/svg+xml"},or=new Set(Object.keys(es));Kt=24681,st=!1;rt=new Map});import bs from"@rollup/plugin-strip";import{visualizer as ws}from"rollup-plugin-visualizer";var Be=["/react/","/react-dom/","/scheduler/","/react-router","/@radix-ui/","/react-day-picker/","/react-hook-form/","/react-i18next/","/clsx/","/class-variance-authority/"],is={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 ls(n){let e=n.match(/(?:^|\0)virtual:([^?]+)/);if(e)return e[1]}function nt(n){let e=n.replace(/\\/g,"/");if(e.includes("/node_modules/"))return e.split("?")[0]}function at(n,e=Be){return e.some(t=>n.includes(t))}function cs(n){for(let[e,t]of Object.entries(is))if(t.some(s=>n.includes(s)))return e}function us(n){let e=ls(n);if(e)return e==="i18n-mapping"?"virtual-i18n-mapping":e.startsWith("i18n-lazy-")?e:"virtual-modules";let t=nt(n);if(!t)return;if(at(t))return"react-core";let s=cs(t);if(s)return s}function ps(n=[]){let e=n.filter(s=>!Be.includes(s)),t=[...Be,...e];return function(s){let r=nt(s);if(r&&at(r,t))return"react-core"}}var ot={development:{manualChunks:void 0},production:{manualChunks:us}};function it(n,e={}){let t=ot[n]||ot.production,s=e.reactCore||[];return s.length>0?{manualChunks:ps(s)}:t}G();import*as Z from"@clack/prompts";var ae={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 ys(){return process.env.NO_COLOR?!1:process.platform==="win32"?!0:process.stdout.isTTY===!0}function le(n,e){return ys()?`${e}${n}${ae.reset}`:n}function I(n,e,t,s={}){let{logDir:r=".dndev-logs",fileLogging:o=!1}=s,a=A.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()} ===
|
|
6
|
+
`;a.writeSync(i,p)}let l=(c,p,d)=>{if(i){let g=new Date().toISOString(),m=d.length>0?" "+d.map(_=>typeof _=="object"?JSON.stringify(_,null,2):String(_)).join(" "):"",w=`${g} [${c}] ${p}${m}
|
|
7
|
+
`;a.appendFile(i,w)}},u=(c,p)=>{if(p.length===0)return c;let d=p.map(g=>typeof g=="object"?JSON.stringify(g,null,2):String(g)).join(" ");return`${c} ${d}`};return{debug:(c,...p)=>{e&&(o?l("DEBUG",c,p):Z.log.message(le(u(c,p),ae.gray)))},verbose:(c,...p)=>{t&&(o?l("VERBOSE",c,p):Z.log.message(u(c,p)))},info:(c,...p)=>{o?l("INFO",c,p):Z.log.info(le(u(c,p),ae.brightCyan))},warn:(c,...p)=>{e&&o?l("WARN",c,p):Z.log.warn(le(u(c,p),ae.brightYellow))},error:(c,...p)=>{e&&o?l("ERROR",c,p):Z.log.error(le(u(c,p),ae.brightRed))},success:(c,...p)=>{e&&o?l("SUCCESS",c,p):Z.log.success(le(u(c,p),ae.brightGreen))},when:(c,p="debug")=>(d,...g)=>{if(c){let m=u(d,g);switch(p){case"verbose":t&&(Z.log.message(m),l("VERBOSE",d,g));break;case"info":Z.log.info(le(m,ae.brightCyan)),l("INFO",d,g);break;case"warn":Z.log.warn(le(m,ae.brightYellow)),l("WARN",d,g);break;case"error":Z.log.error(le(m,ae.brightRed)),l("ERROR",d,g);break;case"success":Z.log.success(le(m,ae.brightGreen)),l("SUCCESS",d,g);break;default:e&&(Z.log.message(le(m,ae.gray)),l("DEBUG",d,g))}}},getLogFilePath:()=>i}}G();function ht(n={}){let{mode:e="development",chunkingOptions:t={},debug:s,verbose:r=!0,isDev:o,isDebug:a,shouldAnalyze:i,build:l={}}=n,u=I("build",s,r),c=it(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)
|
|
8
|
+
`)),{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:xs(),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(d,g){d.code!=="MODULE_LEVEL_DIRECTIVE"&&g(d)},plugins:[...a?[]:[bs({include:["**/*.js","**/*.ts","**/*.tsx","**/*.jsx"],functions:["console.*","debugger"],labels:["debug"]})],...i?[(()=>{let d=A.getInstance(),g=d.getAppRoot(),m="dist",w=d.resolveAppPath(`${m}/stats.html`),_=()=>{try{let D=d.resolveAppPath(m);d.pathExists(D)||d.mkdir(D)}catch{}},y=ws({filename:w,open:!0,gzipSize:!0,brotliSize:!0,template:"treemap",sourcemap:o||a,projectRoot:g});if(y.buildStart){let D=y.buildStart.bind(y);y.buildStart=function(...b){_();let R=D.apply(this,b);return R&&typeof R.then=="function"?R.catch(v=>{}):R}}else y.buildStart=function(){_()};let k=["generateBundle","writeBundle","closeBundle"];for(let D of k)if(y[D]){let b=y[D];y[D]=function(...R){try{_();let v=b.apply(this,R);return v&&typeof v.then=="function"?v.catch(N=>{let O=N?.message||N?.toString()||String(N)||"Unknown error";u.warn(`Bundle visualizer warning in ${D}: ${O}`),D==="closeBundle"&&u.warn(`You can manually open ${w} to view the bundle analysis`)}):v}catch(v){let N=v?.message||v?.toString()||String(v)||"Unknown error";buildLogger.warn(`Bundle visualizer warning in ${D}: ${N}`),D==="closeBundle"&&buildLogger.warn(` You can manually open ${w} to view the bundle analysis`)}}}return y})()]:[]]}}}function xs(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 Ss(){let n=!1,e=A.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 Ps(n,e){if(n!==void 0)return n;let{isDocker:t,isWSL2:s,isBun:r}=Ss();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 vt(n,e={},t){let s=A.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},d=i!==void 0?i:!0,g=l.https===!0;return{port:n,host:d,open:e.open!==void 0?e.open:!0,https:g,fs:{allow:[r,s.resolveRepoPath("packages"),s.resolveRepoPath("node_modules")],strict:!1},watch:(()=>{let m=Ps(e?.watch?.usePolling,t);return{usePolling:m,interval:e?.watch?.interval??2e3,...m&&{awaitWriteFinish:{stabilityThreshold:300,pollInterval:100}},...e?.watch||{}}})(),hmr:{...p,...u},headers:{"Cross-Origin-Opener-Policy":"same-origin-allow-popups","Cross-Origin-Embedder-Policy":"unsafe-none"},middlewareMode:!1,...l}}function yt(n={}){let e=n.https===!0;return{...n,https:e}}L();var te={CONCATENATE_DEDUPE:"CONCATENATE_DEDUPE",SHALLOW_MERGE:"SHALLOW_MERGE",DEEP_MERGE:"DEEP_MERGE",REPLACE:"REPLACE"};function ve(n,e,t,s={}){let{protectedKeys:r=[],onConflict:o}=s;if(e==null)return n;switch(t){case te.CONCATENATE_DEDUPE:{if(!Array.isArray(n)||!Array.isArray(e))return e;let a=[...n,...e];return[...new Set(a)]}case te.SHALLOW_MERGE:return typeof n!="object"||typeof e!="object"||n===null||e===null||Array.isArray(n)||Array.isArray(e)?e:{...n,...e};case te.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]=ve(a[i],e[i],te.DEEP_MERGE,{protectedKeys:r,onConflict:o}):a[i]=e[i]}return a}case te.REPLACE:default:return e}}function bt(n,e,t=[],s){let r=[...n,...e||[]],o=[...new Set(r)];return[...new Set([...o,...t])]}var Pe={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:[...ye.mandatoryIncludes],exclude:[...ye.buildTools,...Object.values(M)],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 wt(n={},e={}){let{onConflict:t}=e,s={...Pe},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||[],d=i.exclude||[],g=u.filter(k=>!k.startsWith("@donotdev/")),m=d.filter(k=>g.includes(k));if(m.length>0)for(let k of m)o("optimizeDeps.exclude",k,"excluded",`Framework requires ${k} to be included. It will be included despite your exclusion.`);let w=bt(u,p,g),_=ve(c,d,te.CONCATENATE_DEDUPE),y=ve(l?.esbuildOptions||{},i.esbuildOptions||{},te.DEEP_MERGE,{protectedKeys:["external"],onConflict:k=>o(`optimizeDeps.esbuildOptions.${k}`,l?.esbuildOptions?.[k],i.esbuildOptions?.[k],`Framework requires ${k} to remain as configured.`)});s[a]={...l,include:w,exclude:_,esbuildOptions:y,...Object.fromEntries(Object.entries(i).filter(([k])=>!["include","exclude","esbuildOptions"].includes(k)))};return}if(a==="css"&&typeof i=="object"&&i!==null){s[a]=ve(l||{},i,te.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]=ve(l||{},i,te.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]=ve(l,i,te.CONCATENATE_DEDUPE):s[a]=i;return}if(typeof i=="object"&&i!==null&&typeof l=="object"&&l!==null&&!Array.isArray(l)){s[a]=ve(l,i,te.SHALLOW_MERGE);return}s[a]=i}),s}function xt(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:d={},serverShim:g={},chunking:m={},discovery:w={},pluginFactory:_={},debug:y,verbose:k,base:D,define:b={},optimizeDeps:R={},plugins:v=[],css:N={},envDir:O,...B}=n,E=s!=="production",x=y||E,W=s==="production"&&(r.analyze??Pe.build.analyze);return{mode:s,debug:y,verbose:k,isDev:E,isDebug:x,shouldAnalyze:W,serverOptions:e,previewOptions:t,buildOverrides:r,resolveOptions:o,routeOptions:a,themeOptions:i,i18nOptions:l,assetOptions:u,featureOptions:c,seoOptions:p,pwaOptions:d,serverShimOptions:g,chunkingOptions:m,discoveryOptions:w,pluginFactoryOptions:_,base:D,defineOptions:b,optimizeDepsOptions:R,pluginsOptions:v,cssOptions:N,envDir:O,restOptions:B}}G();import Es from"autoprefixer";import Rs from"postcss-import";import _s from"postcss-nesting";function St({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 Pt(n={}){if(n.postcss)return n.postcss;let e=A.getInstance();return St({postcssImport:Rs,postcssNesting:_s,autoprefixer:Es,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 qs from"@vitejs/plugin-basic-ssl";import Ys from"@vitejs/plugin-react";import Ks from"vite-tsconfig-paths";var H=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}
|
|
9
9
|
// Generated by @donotdev/config discovery
|
|
10
10
|
// Version: 1.0.0
|
|
11
11
|
|
|
@@ -41,13 +41,13 @@ var es=Object.defineProperty;var Ue=(n,e)=>()=>(n&&(e=n(n=0)),e);var ts=(n,e)=>{
|
|
|
41
41
|
`);return`// Helper functions for ${e}
|
|
42
42
|
// Generated by @donotdev/config
|
|
43
43
|
|
|
44
|
-
${s}`}static validateTemplates(e){return["isEmpty","generateModule","generateEmpty","generateInspection"].every(s=>e[s]&&typeof e[s]=="function")}static createTemplateConfig(e,t){let{isEmpty:s=()=>!1,generateModule:r=()=>"",generateEmpty:o=()=>"",generateInspection:a=()=>"",generateManifest:i=()=>({}),logConfig:l=()=>{},logStats:u=()=>{},logManifest:c=()=>{}}=t;return{isEmpty:s,generateModule:r,generateEmpty:o,generateInspection:a,generateManifest:i,logConfig:l,logStats:u,logManifest:c,pluginName:e,version:"1.0.0",createdAt:new Date().toISOString()}}static getEmptyResultWithError(e,t){let s=t?.message||t||"Unknown error";if(e&&typeof e._getEmptyResult=="function")try{let r=e._getEmptyResult();return r.errors&&Array.isArray(r.errors)?r.errors.push(s):r.errors===void 0&&(r.errors=[s]),r.source==="empty"&&(r.source="error"),r}catch{return{errors:[s],source:"error"}}return{errors:[s],source:"error"}}};
|
|
44
|
+
${s}`}static validateTemplates(e){return["isEmpty","generateModule","generateEmpty","generateInspection"].every(s=>e[s]&&typeof e[s]=="function")}static createTemplateConfig(e,t){let{isEmpty:s=()=>!1,generateModule:r=()=>"",generateEmpty:o=()=>"",generateInspection:a=()=>"",generateManifest:i=()=>({}),logConfig:l=()=>{},logStats:u=()=>{},logManifest:c=()=>{}}=t;return{isEmpty:s,generateModule:r,generateEmpty:o,generateInspection:a,generateManifest:i,logConfig:l,logStats:u,logManifest:c,pluginName:e,version:"1.0.0",createdAt:new Date().toISOString()}}static getEmptyResultWithError(e,t){let s=t?.message||t||"Unknown error";if(e&&typeof e._getEmptyResult=="function")try{let r=e._getEmptyResult();return r.errors&&Array.isArray(r.errors)?r.errors.push(s):r.errors===void 0&&(r.errors=[s]),r.source==="empty"&&(r.source="error"),r}catch{return{errors:[s],source:"error"}}return{errors:[s],source:"error"}}};G();function ce(n){let{pluginName:e,icon:t,virtualModuleId:s,DiscoveryClass:r,discoveryMethod:o,filePatterns:a,templates:i,defaultInspectionPath:l,manifestFileName:u,createDiscovery:c,discoveryOptions:p={},configKey:d}=n;return function(m={}){let{debug:w,verbose:_,virtualModuleId:y=s,inspectionFilePath:k=l,hmrDebounceMs:D,hmrCacheTimeout:b,hmrSmartDetection:R,disableHmr:v,...N}=m;if(!H.validateTemplates(i))throw new Error(`Invalid templates for plugin ${e}`);let O={...Pe.discovery,...p,debug:w,verbose:_,...N},B=d||(()=>{let h=e.match(/dndev-vite-(\w+)-discovery/);return h?h[1]:null})(),E=I(e,w,_,{fileLogging:O.fileLogging,logDir:O.logDir}),x=A.getInstance(),W=()=>{let h=x.getAppRoot(),P=x.getRepoRoot();return h&&h!==P},we=Date.now(),K=c?c(x,O):new r(x,O),re="\0"+y,oe="",de=!1,fe=null,S=0,T=!1,F=null,C=!1,q=null,pe=!1;typeof global<"u"&&(global.__DNDEV_CLEAR_CACHE__=()=>(K.clearCache(),F=null,E.info("Discovery cache cleared manually"),"Cache cleared"));function xe(h){let z=H.generateVirtualModule(h,i,w,O,B).replace(/mode:\s*['"]development['"]/g,"mode: typeof process !== 'undefined' && process.env.NODE_ENV === 'production' ? 'production' : 'development'");return!v&&de&&(z+=`
|
|
45
45
|
|
|
46
46
|
// HMR boundary for ${e}
|
|
47
47
|
if (import.meta.hot) {
|
|
48
48
|
import.meta.hot.accept();
|
|
49
49
|
}
|
|
50
|
-
`),z}function Le(m){return H.generateInspection(m,i,_,T)}async function Pe(){if(_)try{let m=await Q[o](),w=Le(m),z=x.resolveAppPath(k);await x.write(z,w),P.debug(`Generated inspection file: ${x.getRelativePath(z)}`)}catch(m){P.error(`${e} failed to write inspection file (${k}): ${m.message}`),P.error(`Stack: ${m.stack||"No stack trace available"}`)}}function De(m){let w=m.replace(/\\/g,"/");if(v||w.includes("/node_modules/")||w.includes("/.git/")||w.includes("/dist/")||w.includes("/build/")||w.includes("/coverage/")||w.includes("/.vite/")||w.includes("/.turbo/")||w.endsWith(".d.ts")||w.endsWith(".tsbuildinfo")||w.endsWith(".map")||w.endsWith(".css.map")||w.endsWith(".generated.log")||/\.generated\.[a-z]+$/.test(w))return!1;let z=x.getRelativePath(w);if(z.startsWith("packages/"))return!1;let le=z.startsWith("src/")&&/\.(ts|tsx)$/.test(z);return le?Array.isArray(a)&&a.length>0?a.some(ne=>typeof ne=="function"?ne(w):typeof ne=="string"?ne.startsWith("**/")?w.endsWith(ne.slice(3)):w.endsWith(ne):!1):le:!1}function Ne(m){if(v)return P.debug("Virtual modules are static - HMR disabled"),[];let w=Date.now();return pe?(P.debug("HMR already in progress, skipping update"),[]):w-I<R?(ee||(ee=!0,C=setTimeout(()=>{ee=!1,I=Date.now(),Ae(m)},R)),[]):(I=w,Ae(m))}function Ae(m){let w=Date.now();if(de===m.file&&w-I<100)return P.debug(`Same file processed too recently: ${m.file}`),[];if(!De(m.file))return P.debug(`Skipping irrelevant file change: ${m.file}`),[];P.debug(`Relevant file changed: ${m.file}`),pe=!0,de=m.file;try{let z=Date.now()-(G?.timestamp||0);if(z<b&&G){P.debug(`Using cached discovery data (age: ${z}ms)`);let ne=m.server.moduleGraph.getModuleById(ie);return ne&&m.server.reloadModule(ne),[]}Q.clearCache();let le=m.server.moduleGraph.getModuleById(ie);return le&&m.server.reloadModule(le),C&&clearTimeout(C),C=setTimeout(()=>{Pe()},500),[]}finally{pe=!1,setTimeout(()=>{de===m.file&&(de=null)},200)}}return{name:e,enforce:"pre",configResolved(m){_=m.root,N=m.command==="serve",D&&P.debug(`${t} ${e} initialized`),N&&P.debug("\u{1F4A1} Dev mode: Press 'r' in terminal to restart, or use global.__DNDEV_CLEAR_CACHE__() in console"),i.logConfig&&i.logConfig(T)},config(m){return m.optimizeDeps||(m.optimizeDeps={}),m.optimizeDeps.exclude||(m.optimizeDeps.exclude=[]),m.optimizeDeps.exclude.includes(y)||m.optimizeDeps.exclude.push(y),m},resolveId(m){return m===y?(P.debug(`Resolving virtual module: ${m}`),{id:ie,moduleSideEffects:!0}):null},async load(m){if(m!==ie)return null;if(P.debug(`Loading virtual module: ${m}`),!W()){P.warn("\u26A0\uFE0F load() called before appRoot is set - waiting for config resolution");let w=0;for(;!W()&&w<100;)await new Promise(z=>setTimeout(z,10)),w++;if(!W())throw new Error("App root not set before discovery. Ensure configResolved hook has set appRoot.")}try{let w;return G?(P.debug("Using cached discovery data for virtual module"),w=G):(P.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.`),w=await Q[o](),G=w,P.debug("Discovery completed for virtual module")),je(w)}catch(w){return P.error(`${e} virtual module (${ie}) failed to load: ${w.message}`),P.error(`Stack: ${w.stack||"No stack trace available"}`),i.generateEmpty({},D,T,X)}},async buildStart(){if(ve=!1,!W()){P.warn("\u26A0\uFE0F buildStart() called before appRoot is set - waiting for config resolution");let m=0;for(;!W()&&m<100;)await new Promise(w=>setTimeout(w,10)),m++;if(!W())throw new Error("App root not set before discovery. Ensure configResolved hook has set appRoot.")}try{let m=await Q[o](!G);G=m,await Pe(),i.logStats&&i.logStats(m,t,P)}catch(m){P.error(`${e} discovery failed during file scanning: ${m.message}`),P.error(`Stack: ${m.stack||"No stack trace available"}`),G=H.getEmptyResultWithError(Q,m)}finally{ve=!0}},configureServer(){ve=!0},handleHotUpdate(m){return v?[]:ve?Ne(m):(P.debug("HMR disabled - discovery not complete yet"),[])},generateBundle(){if(!G){P.warn("No cached discovery data for manifest generation - skipping");return}try{let m=H.generateManifest(G,i.generateManifest);this.emitFile({type:"asset",fileName:u,source:JSON.stringify(m,null,2)}),O&&i.logManifest&&i.logManifest(G,e)}catch(m){P.error(`${e} manifest generation failed: ${m.message}`),P.error(`Stack: ${m.stack||"No stack trace available"}`)}},transform(m,w){return w===ie?{code:m,map:null}:null}}}}var no={generateGlobals:H.generateGlobals,generateExports:H.generateExports,generateDefaultExport:H.generateDefaultExport,wrapVirtualModule:H.wrapVirtualModule,generateInspectionHeader:H.generateInspectionHeader,validateTemplates:H.validateTemplates,createTemplateConfig:H.createTemplateConfig};L();var oe=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=F(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}};L();var Ie=class extends oe{constructor(e,t={}){super(e,{assets:se.assets.fallback,assetPatterns:se.assets.patterns,frameworkPackage:Be.package,assetsPath:Be.assetsPath,modernFormats:se.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(Ee.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(`${Ee.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(`${Ee.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(Ee.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}}}};B();var qe={data:null},xs={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`// ${M.assets} - Generated asset manifest
|
|
50
|
+
`),z}function _e(h){return H.generateInspection(h,i,oe,O)}async function $e(){if(oe)try{let h=await K[o](),P=_e(h),z=x.resolveAppPath(k);await x.write(z,P),E.debug(`Generated inspection file: ${x.getRelativePath(z)}`)}catch(h){E.error(`${e} failed to write inspection file (${k}): ${h.message}`),E.error(`Stack: ${h.stack||"No stack trace available"}`)}}function Te(h){let P=h.replace(/\\/g,"/");if(v||P.includes("/node_modules/")||P.includes("/.git/")||P.includes("/dist/")||P.includes("/build/")||P.includes("/coverage/")||P.includes("/.vite/")||P.includes("/.turbo/")||P.endsWith(".d.ts")||P.endsWith(".tsbuildinfo")||P.endsWith(".map")||P.endsWith(".css.map")||P.endsWith(".generated.log")||/\.generated\.[a-z]+$/.test(P))return!1;let z=x.getRelativePath(P);if(z.startsWith("packages/"))return!1;let ie=z.startsWith("src/")&&/\.(ts|tsx)$/.test(z);return ie?Array.isArray(a)&&a.length>0?a.some(ne=>typeof ne=="function"?ne(P):typeof ne=="string"?ne.startsWith("**/")?P.endsWith(ne.slice(3)):P.endsWith(ne):!1):ie:!1}function Fe(h){if(v)return E.debug("Virtual modules are static - HMR disabled"),[];let P=Date.now();return C?(E.debug("HMR already in progress, skipping update"),[]):P-S<D?(T||(T=!0,fe=setTimeout(()=>{T=!1,S=Date.now(),Ie(h)},D)),[]):(S=P,Ie(h))}function Ie(h){let P=Date.now();if(q===h.file&&P-S<100)return E.debug(`Same file processed too recently: ${h.file}`),[];if(!Te(h.file))return E.debug(`Skipping irrelevant file change: ${h.file}`),[];E.debug(`Relevant file changed: ${h.file}`),C=!0,q=h.file;try{let z=Date.now()-(F?.timestamp||0);if(z<b&&F){E.debug(`Using cached discovery data (age: ${z}ms)`);let ne=h.server.moduleGraph.getModuleById(re);return ne&&h.server.reloadModule(ne),[]}K.clearCache();let ie=h.server.moduleGraph.getModuleById(re);return ie&&h.server.reloadModule(ie),fe&&clearTimeout(fe),fe=setTimeout(()=>{$e()},500),[]}finally{C=!1,setTimeout(()=>{q===h.file&&(q=null)},200)}}return{name:e,enforce:"pre",configResolved(h){oe=h.root,de=h.command==="serve",w&&E.debug(`${t} ${e} initialized`),de&&E.debug("\u{1F4A1} Dev mode: Press 'r' in terminal to restart, or use global.__DNDEV_CLEAR_CACHE__() in console"),i.logConfig&&i.logConfig(O)},config(h){return h.optimizeDeps||(h.optimizeDeps={}),h.optimizeDeps.exclude||(h.optimizeDeps.exclude=[]),h.optimizeDeps.exclude.includes(y)||h.optimizeDeps.exclude.push(y),h},resolveId(h){return h===y?(E.debug(`Resolving virtual module: ${h}`),{id:re,moduleSideEffects:!0}):null},async load(h){if(h!==re)return null;if(E.debug(`Loading virtual module: ${h}`),!W()){E.warn("\u26A0\uFE0F load() called before appRoot is set - waiting for config resolution");let P=0;for(;!W()&&P<100;)await new Promise(z=>setTimeout(z,10)),P++;if(!W())throw new Error("App root not set before discovery. Ensure configResolved hook has set appRoot.")}try{let P;return F?(E.debug("Using cached discovery data for virtual module"),P=F):(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.`),P=await K[o](),F=P,E.debug("Discovery completed for virtual module")),xe(P)}catch(P){return E.error(`${e} virtual module (${re}) failed to load: ${P.message}`),E.error(`Stack: ${P.stack||"No stack trace available"}`),i.generateEmpty({},w,O,B)}},async buildStart(){if(pe=!1,!W()){E.warn("\u26A0\uFE0F buildStart() called before appRoot is set - waiting for config resolution");let h=0;for(;!W()&&h<100;)await new Promise(P=>setTimeout(P,10)),h++;if(!W())throw new Error("App root not set before discovery. Ensure configResolved hook has set appRoot.")}try{let h=await K[o](!F);F=h,await $e(),i.logStats&&i.logStats(h,t,E)}catch(h){E.error(`${e} discovery failed during file scanning: ${h.message}`),E.error(`Stack: ${h.stack||"No stack trace available"}`),F=H.getEmptyResultWithError(K,h)}finally{pe=!0}},configureServer(){pe=!0},handleHotUpdate(h){return v?[]:pe?Fe(h):(E.debug("HMR disabled - discovery not complete yet"),[])},generateBundle(){if(!F){E.warn("No cached discovery data for manifest generation - skipping");return}try{let h=H.generateManifest(F,i.generateManifest);this.emitFile({type:"asset",fileName:u,source:JSON.stringify(h,null,2)}),_&&i.logManifest&&i.logManifest(F,e)}catch(h){E.error(`${e} manifest generation failed: ${h.message}`),E.error(`Stack: ${h.stack||"No stack trace available"}`)}},transform(h,P){return P===re?{code:h,map:null}:null}}}}var uo={generateGlobals:H.generateGlobals,generateExports:H.generateExports,generateDefaultExport:H.generateDefaultExport,wrapVirtualModule:H.wrapVirtualModule,generateInspectionHeader:H.generateInspectionHeader,validateTemplates:H.validateTemplates,createTemplateConfig:H.createTemplateConfig};L();var se=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=I(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}};L();var ze=class extends se{constructor(e,t={}){super(e,{assets:ee.assets.fallback,assetPatterns:ee.assets.patterns,frameworkPackage:He.package,assetsPath:He.assetsPath,modernFormats:ee.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(ke.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(`${ke.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(`${ke.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(ke.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(d){this.logger.debug(`Failed to copy ${c.name}: ${d.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 d=u.default(t).resize(c.size,c.size,{fit:"contain",background:{r:255,g:255,b:255,alpha:0}}),g;c.format==="ico"?g=await d.toFormat("png").toBuffer():g=await d.toFormat(c.format).toBuffer(),await this.pathResolver.write(`public/${c.name}`,g),a.push(c.name)}catch(d){this.logger.debug(`Failed to generate ${c.name}: ${d.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}}}};G();var Ke={data:null},$s={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`// ${M.assets} - Generated asset manifest
|
|
51
51
|
const assetManifest = ${JSON.stringify(s,null,2)};
|
|
52
52
|
const assetStats = ${JSON.stringify(i,null,2)};
|
|
53
53
|
|
|
@@ -233,7 +233,7 @@ export const assetStats = {
|
|
|
233
233
|
};
|
|
234
234
|
|
|
235
235
|
export default discoveredAssets;
|
|
236
|
-
`},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`))}},
|
|
236
|
+
`},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`))}},ks=[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 Et(n={}){let e=ce({pluginName:"dndev-vite-asset-discovery",icon:"\u{1F3AF}",virtualModuleId:M.assets,DiscoveryClass:ze,discoveryMethod:"discoverAssets",filePatterns:ks,templates:$s,defaultInspectionPath:j.vite.assetInspection,manifestFileName:j.manifests.asset,configKey:"assets"})(n),t=A.getInstance(),s=I("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(j.vite.assetInspection);if(t.pathExists(i)){let l=t.readSync(i,{format:"json"});l&&(a=l,Ke.data=a)}}catch(i){s.debug(`Could not cache asset data: ${i.message}`)}},e}import{loadEnv as Ds}from"vite";L();var Rt={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 Rt.generateEmpty(n,e,void 0,t);let o={totalVars:Object.keys(s).length,mode:r,source:n.source,generatedAt:new Date().toISOString()};return`// ${M.env} - Generated environment variables
|
|
237
237
|
|
|
238
238
|
const envData = ${JSON.stringify(s,null,2)};
|
|
239
239
|
const envManifest = ${JSON.stringify(o,null,2)};
|
|
@@ -312,20 +312,20 @@ export const source = 'empty';
|
|
|
312
312
|
|
|
313
313
|
export default envData;
|
|
314
314
|
`},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(`
|
|
315
|
-
`)},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`)}},Ye=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={...Ps(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 St(n={}){return ue({pluginName:"dndev-vite-env-discovery",icon:"\u{1F510}",virtualModuleId:M.env,discoveryMethod:"discoverEnv",filePatterns:[],templates:xt,defaultInspectionPath:j.vite.envInspection,manifestFileName:j.manifests.env,configKey:"env",createDiscovery:(e,t)=>new Ye(e,{...t,mode:n.mode||t.mode||"development"})})({...n,disableHmr:!0})}L();L();var Pt=/--(?:font-family|font-headline)\s*:\s*(?:['"]([^'"]+)['"]|([^;]+?));/g,he=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:{...He.selectors,...this.options.customPatterns?.selectors},themes:{...He.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(Pt.lastIndex=0;(r=Pt.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||"")}};B();var Es=3,Ke="<!-- DNDEV_FONT_PRELOADS -->";function Et(n={}){let{debug:e=!1}=n,t=F("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=$.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=[Re.Inter],t.debug("Font preload: no consumer CSS, using default Inter");return}let c=new he(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(O=>p.add(O))}catch(h){t.debug(`Font preload: skip read ${d}: ${h?.message}`)}if(p.size===0){o=[Re.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=Re[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=[Re.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(D=>d.includes(D))){let D=u?`${u}/${p}`:`/${p}`;c.push(D)}}a=c.slice(0,Es)},writeBundle(){if(!a.length)return;let i=s||$.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(`
|
|
316
|
-
`);if(p.includes(
|
|
317
|
-
${
|
|
318
|
-
${
|
|
319
|
-
${R.join(`,
|
|
320
|
-
`)}
|
|
321
|
-
}`)}let O=D.length>0?`{
|
|
315
|
+
`)},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`)}},Ze=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={...Ds(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 _t(n={}){return ce({pluginName:"dndev-vite-env-discovery",icon:"\u{1F510}",virtualModuleId:M.env,discoveryMethod:"discoverEnv",filePatterns:[],templates:Rt,defaultInspectionPath:j.vite.envInspection,manifestFileName:j.manifests.env,configKey:"env",createDiscovery:(e,t)=>new Ze(e,{...t,mode:n.mode||t.mode||"development"})})({...n,disableHmr:!0})}L();L();function Xe(n){let e=new Set(Object.keys(De)),t=new Set(["latin"]);for(let o of n||[]){let a=ut[o];if(a)for(let i of a)t.add(i)}let s=[],r=new Set;for(let o of e){let a=De[o];for(let i of t)for(let l of a){let u=`@fontsource/${o}/${i}-${l}.css`,c=`${o}-${i}-${l}-normal`;s.push(u),r.add(c)}}return{imports:s,stems:r,subsets:t,fontStems:e}}function $t(n){return n.replace(/,\s*url\([^)]*\.woff\)\s*format\(['"]woff['"]\)/g,"")}L();G();L();function As(n){if(!n)return[];let e=A.getInstance(),t=new Set;try{let s=e.resolvePackage("@donotdev/core",n);if(!s)return[];let r=e.getDirname(e.getDirname(s)),o;try{o=e.readdirSync(r)}catch{return[]}for(let a of o)try{let i=e.resolvePath(`${a}/package.json`,r),l=e.readSync(i,{format:"json"});if(!l?.peerDependenciesMeta)continue;for(let[u,c]of Object.entries(l.peerDependenciesMeta))c?.optional&&t.add(u)}catch{}}catch{}return Array.from(t)}function Ns(n){if(!n)return[];let e=A.getInstance();try{let t=e.resolvePath("package.json",n),s=e.readSync(t,{format:"json"});if(!s)return[];let r=new Set;if(s.peerDependenciesMeta)for(let[o,a]of Object.entries(s.peerDependenciesMeta))a?.optional&&r.add(o);if(s.optionalDependencies)for(let o of Object.keys(s.optionalDependencies))r.add(o);return Array.from(r)}catch{return[]}}function Os(n){let e=ye.optionalFeatures||[],t=As(n),s=Ns(n);return[...new Set([...e,...t,...s])]}function Ts(n){let e=A.getInstance();try{let t=e.resolvePath("package.json",n),s=e.readSync(t,{format:"json"});return s?new Set([...Object.keys(s.dependencies||{}),...Object.keys(s.devDependencies||{})]):new Set}catch{return new Set}}function Fs(n,e,t){if(t.resolvePackage(n,e||void 0))return!0;let s=n.startsWith("@")?n.split("/").slice(0,2).join("/"):n.split("/")[0],r=e;for(let o=0;o<10;o++){let a=t.resolvePath(`node_modules/${s}`,r);if(t.pathExists(a))return!0;let i=t.getDirname(r);if(i===r)break;r=i}return!1}function Le(n){let e=Os(n),t=[],s=[],r=A.getInstance(),o=Ts(n);for(let a of e)a.startsWith("@donotdev/")?o.has(a)?s.push(a):t.push(a):o.has(a)&&Fs(a,n,r)?s.push(a):t.push(a);return{missing:t,installed:s}}var be=class n extends se{static LANGUAGE_FLAG_OVERRIDES={en:"gb","en-ca":"ca","es-ar":"ar","fr-be":"be",ar:"sa","ar-ma":"ma","ar-dz":"dz","ar-tn":"tn","ar-ly":"ly","ar-mr":"mr",hi:"in",sl:"si",uk:"ua",ga:"ie",gd:"gb-sct",br:"bzh",co:"fr-cor",am:"et",bn:"bd",gu:"in",kn:"in",ml:"in",mr:"in",ne:"np",pa:"pk",ta:"in",te:"in",ur:"pk",fa:"ir",kk:"kz",ky:"kg",tg:"tj",my:"mm",km:"kh",lo:"la",ka:"ge",hy:"am",be:"by",bs:"ba",sq:"al",ms:"my"};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=Me("i18n"),a=r.eager||[],i=r.lazy||[],l=(this.options.additionalPaths||[]).map(S=>{let T=S.endsWith(".json")?S:`${S}/*_*.json`;return this.pathResolver.resolveAppPath(T)});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),d=this.pathResolver.normalizePath(s),g=(S,T)=>{let F=this.pathResolver.normalizePath(S),C=this.pathResolver.normalizePath(T);return F.startsWith(C)?F.slice(C.length+1):F},m=a.map(S=>g(S,t)),_=[...i,...l].map(S=>g(S,t)),y=u.map(S=>g(S,s)),k=c.map(S=>g(S,s)),D={...o,onlyFiles:!0,absolute:!0,braceExpansion:!0,extglob:!0,globstar:!0,cwd:t},b=await this.pathResolver._globWithNormalization(m,D),R=await this.pathResolver._globWithNormalization(_,D),v={...o,onlyFiles:!0,absolute:!0,braceExpansion:!0,extglob:!0,globstar:!0,cwd:s,ignore:o.ignore?.filter(S=>S!=="**/node_modules/**")||[]};this.logger.debug(`\u{1F50D} Searching framework patterns with cwd: ${s}, ignore: ${JSON.stringify(v.ignore)}`);let N=await this.pathResolver._globWithNormalization(y,v),O=await this.pathResolver._globWithNormalization(k,v);this.logger.debug(`Found ${b.length} eager, ${R.length} lazy, ${N.length} framework eager, ${O.length} framework lazy files`),N.length>0?this.logger.debug(`Framework eager files (first 3): ${N.slice(0,3).join(", ")}`):this.logger.error(`\u274C NO framework eager files found! Patterns were: ${u.join(", ")}`),O.length>0?this.logger.debug(`Framework lazy files (first 3): ${O.slice(0,3).join(", ")}`):this.logger.error(`\u274C NO framework lazy files found! Patterns were: ${c.join(", ")}`);let B=[...new Set([...b,...R,...N,...O])],E=new Set([...b,...N]),x={mapping:{},content:{},eagerNamespaces:new Set,allNamespaces:new Set,supportedLanguages:new Set,files:[]},{missing:W}=Le(t),we=new Set(W.filter(S=>S.startsWith("@donotdev/")).map(S=>S.replace("@donotdev/","")));we.size>0&&this.logger.debug(`I18n namespace filter: excluding [${[...we].join(", ")}] (packages not installed)`);let K=new Map,re=[...N,...O];for(let S of re){let T=this._processTranslationFile(S,N.includes(S),t);if(T){if(we.has(T.namespace))continue;let F=`${T.namespace}_${T.language}`;K.set(F,T),x.allNamespaces.add(T.namespace),x.supportedLanguages.add(T.language),N.includes(S)&&x.eagerNamespaces.add(T.namespace)}}let oe=new Set;for(let S of B){if(re.includes(S))continue;let T=this._processTranslationFile(S,E.has(S),t);if(T){let{namespace:F,language:C,importPath:q,content:pe}=T,xe=`${T.namespace}_${T.language}`;if(K.has(xe)){let _e=K.get(xe);T.content=this._mergeTranslations(_e.content,pe)}x.allNamespaces.add(F),x.supportedLanguages.add(C),oe.add(C),E.has(S)&&x.eagerNamespaces.add(F),x.mapping[F]||(x.mapping[F]={}),x.mapping[F][C]=q,T.content&&(x.content[F]||(x.content[F]={}),x.content[F][C]=T.content),x.files.push({path:S,relativePath:this.pathResolver.getRelativePath(S),namespace:F,language:C,eager:E.has(S),size:T.content?JSON.stringify(T.content).length:0})}}for(let[S,T]of K){let F=S.lastIndexOf("_"),C=S.slice(0,F),q=S.slice(F+1);oe.size>0&&!oe.has(q)||(!x.mapping[C]||!x.mapping[C][q])&&(x.mapping[C]||(x.mapping[C]={}),x.mapping[C][q]=T.importPath,x.content[C]||(x.content[C]={}),x.content[C][q]=T.content,x.files.push({path:T.absolutePath,relativePath:this.pathResolver.getRelativePath(T.absolutePath),namespace:C,language:q,eager:x.eagerNamespaces.has(C),size:T.content?JSON.stringify(T.content).length:0}))}let de=oe.size>0?[...oe].sort():[this.options.fallbackLanguage],fe=[...new Set(de.map(S=>n.LANGUAGE_FLAG_OVERRIDES[S]||S))];return{mapping:x.mapping,content:x.content,eagerNamespaces:[...x.eagerNamespaces].sort(),allNamespaces:[...x.allNamespaces].sort(),supportedLanguages:de,fallbackLanguage:this.options.fallbackLanguage,flagCodes:fe,files:x.files}}_getEmptyResult(){return{mapping:{},content:{},eagerNamespaces:[],allNamespaces:["common"],supportedLanguages:[this.options.fallbackLanguage],fallbackLanguage:this.options.fallbackLanguage,flagCodes:[n.LANGUAGE_FLAG_OVERRIDES[this.options.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,absolutePath:e,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}};G();var Is=3,Qe="<!-- DNDEV_FONT_PRELOADS -->",et=Object.keys(De);function kt(n={}){let{debug:e=!1}=n,t=I("font-preload",e,!1),s,r={},o=new Set,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=A.getInstance()}catch(l){t.debug(`Font preload: PathResolver not ready: ${l?.message}`)}},async buildStart(){if(!(!s||!s.getAppRoot()))try{let l=["en"];try{let p=await new be(s,{fallbackLanguage:"en"}).discoverTranslations();p?.supportedLanguages?.length&&(l=p.supportedLanguages)}catch(c){t.debug(`Font preload: i18n discovery failed, using 'en': ${c?.message}`)}let u=Xe(l);o=u.stems,t.debug(`Font filter: ${u.fontStems.size} font(s), ${u.subsets.size} subset(s), ${o.size} allowed stem(s)`)}catch(l){t.debug(`Font preload: discovery failed, using defaults: ${l?.message}`),o=Xe(["en"]).stems}},generateBundle(i,l){if(o.size===0)return;let u=0,c=0;for(let g of Object.keys(l)){if(l[g].type!=="asset")continue;let w=g.toLowerCase();g.endsWith(".woff")?et.some(_=>w.includes(_))&&(delete l[g],u++):g.endsWith(".woff2")&&et.some(y=>w.includes(y))&&(Array.from(o).some(k=>w.includes(k))||(delete l[g],c++))}t.debug(`Font filter: deleted ${u} .woff + ${c} .woff2 from bundle`);for(let[g,m]of Object.entries(l)){if(m.type!=="asset"||!g.endsWith(".css")||typeof m.source!="string")continue;let w=m.source,_=w.replace(/@font-face\s*\{[\s\S]*?\}/g,y=>et.some(b=>y.includes(b))?Array.from(o).some(b=>y.includes(b))?$t(y):"":y);_!==w&&(m.source=_)}let p=r.base||"",d=[];for(let[g,m]of Object.entries(l)){if(m.type!=="asset"||!g.endsWith(".woff2"))continue;let w=g.toLowerCase();if(Array.from(o).some(_=>w.includes(_))){let _=p?`${p}/${g}`:`/${g}`;d.push(_)}}a=d.slice(0,Is)},writeBundle(){if(!a.length)return;let i=s||A.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"}),d=a.map(g=>`<link rel="preload" as="font" href="${g}" type="font/woff2" crossorigin="anonymous" />`).join(`
|
|
316
|
+
`);if(p.includes(Qe))p=p.replace(Qe,`${Qe}
|
|
317
|
+
${d}`);else{let g=p.indexOf("<!-- Fonts:"),m=g!==-1?p.indexOf("-->",g)+3:p.indexOf("</head>");m!==-1&&(p=p.slice(0,m)+`
|
|
318
|
+
${d}`+p.slice(m))}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}`)}}}}L();G();var Dt={isEmpty:n=>!n.mapping||Object.keys(n.mapping).length===0,generateModule:(n,e,t="i18n",s=!1)=>{let{mapping:r,eagerNamespaces:o,supportedLanguages:a,fallbackLanguage:i,stats:l,content:u={},files:c=[]}=n,p=s?Object.keys(u):o,d={};for(let y of p)u[y]&&(d[y]=u[y]);let g=[...new Set([...o,...Object.keys(u)])],m={mapping:r,languages:a,eager:s?g:o,fallback:i,content:d,storage:{type:"localStorage",prefix:"dndev_i18n_",ttl:1440*60*1e3,encryption:!1,maxSize:5*1024*1024},performance:{cacheSize:1e3,errorCacheTTL:300*1e3},manifest:{totalFiles:l?.totalFiles||0,totalNamespaces:l?.totalNamespaces||0,totalLanguages:l?.totalLanguages||0,eagerNamespaces:l?.eagerNamespaces||0,generatedAt:new Date().toISOString()},debug:e},w=[];if(!s)for(let[y,k]of Object.entries(r)){if(o.includes(y))continue;let D=[];for(let b of Object.keys(k))D.push(` '${b}': () => import('virtual:i18n-lazy-${y}-${b}')`);D.length>0&&w.push(` '${y}': {
|
|
322
319
|
${D.join(`,
|
|
320
|
+
`)}
|
|
321
|
+
}`)}let _=w.length>0?`{
|
|
322
|
+
${w.join(`,
|
|
323
323
|
`)}
|
|
324
324
|
}`:"{}";return`// ${M.i18n} - Generated by @donotdev/config
|
|
325
325
|
// Generated at: ${new Date().toISOString()}
|
|
326
326
|
|
|
327
327
|
// ===== STATIC EXPORTS =====
|
|
328
|
-
export const I18N_CONFIG = ${JSON.stringify(
|
|
328
|
+
export const I18N_CONFIG = ${JSON.stringify(m,null,2)};
|
|
329
329
|
export const LANGUAGES = ${JSON.stringify(a,null,2)};
|
|
330
330
|
export const FALLBACK_LANGUAGE = '${i}';
|
|
331
331
|
export const EAGER_NAMESPACES = ${JSON.stringify(o,null,2)};
|
|
@@ -334,7 +334,7 @@ const i18nPluginConfig = I18N_CONFIG;
|
|
|
334
334
|
|
|
335
335
|
// ===== LAZY LOADERS =====
|
|
336
336
|
// Static import() calls \u2014 Vite bundles each JSON as a separate async chunk
|
|
337
|
-
const _lazyLoaders = ${
|
|
337
|
+
const _lazyLoaders = ${_};
|
|
338
338
|
|
|
339
339
|
// ============================================================================
|
|
340
340
|
// INITIALIZE DnDev CONFIG FOUNDATION
|
|
@@ -566,7 +566,7 @@ export default {
|
|
|
566
566
|
files: translationFiles,
|
|
567
567
|
manifest: i18nManifest,
|
|
568
568
|
};
|
|
569
|
-
`},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`)}},
|
|
569
|
+
`},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`)}},Cs=[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 At(n={}){let e=!1,t=new Map,s=A.getInstance(),r={...Pe.discovery,fallbackLanguage:n.fallbackLanguage||"en",...n},o=new be(s,r);function a(p){t.clear();let{content:d,eagerNamespaces:g}=p;for(let[m,w]of Object.entries(d||{}))if(!g.includes(m))for(let[_,y]of Object.entries(w))t.set(`virtual:i18n-lazy-${m}-${_}`,y)}let i={...Dt,generateModule:(p,d,g)=>(e||a(p),Dt.generateModule(p,d,g,e))};return[ce({pluginName:"dndev-vite-i18n-discovery",icon:"\u{1F310}",virtualModuleId:M.i18n,DiscoveryClass:be,discoveryMethod:"discoverTranslations",filePatterns:Cs,templates:i,defaultInspectionPath:j.vite.i18nInspection,manifestFileName:j.manifests.i18n,configKey:"i18n",discoveryOptions:r})({...n,hmrSmartDetection:!1}),{name:"dndev-i18n-lazy-loader",enforce:"pre",configResolved(p){e=p.command==="serve"},async buildStart(){if(e)return;let p=()=>{let m=s.getAppRoot(),w=s.getRepoRoot();return m&&m!==w},d=0;for(;!p()&&d<100;)await new Promise(m=>setTimeout(m,10)),d++;if(!p())return;let g=await o.discoverTranslations();a(g)},resolveId(p){if(!e&&p.startsWith("virtual:i18n-lazy-"))return"\0"+p},load(p){if(!e&&p.startsWith("\0virtual:i18n-lazy-")){let d=p.slice(1),g=t.get(d);return`export default ${JSON.stringify(g||{})};`}}},{name:"dndev-i18n-flag-filter",enforce:"pre",async buildStart(){let p=()=>{let w=s.getAppRoot(),_=s.getRepoRoot();return w&&w!==_},d=0;for(;!p()&&d<100;)await new Promise(w=>setTimeout(w,10)),d++;if(!p())return;let m=(await o.discoverTranslations()).flagCodes||[];this._allowedFlags=new Set(m.map(w=>w.toUpperCase()))},resolveId(p,d){if(!d||!p.includes("flag"))return;let g=p.match(/flag([A-Z][A-Z0-9_-]*)\.(tsx|js)$/i);if(!g)return;let m=g[1].toUpperCase();if(m!=="BASE"&&!this._allowedFlags?.has(m))return"\0empty-flag"},load(p){if(p==="\0empty-flag")return"export default () => null;"}}]}G();function Nt(n,e){return e.some(t=>n===t||n.startsWith(t+"/"))}function Ot(n={}){let e=[],t="",s="";return{name:"dndev-optional-dep-resolver",enforce:"pre",config(r){let o={name:"dndev-optional-dep-esbuild",setup(i){i.onResolve({filter:/^[@a-z]/,namespace:"file"},l=>Nt(l.path,e)?{path:s,external:!1}:null)}};return{optimizeDeps:{esbuildOptions:{plugins:[...r.optimizeDeps?.esbuildOptions?.plugins||[],o]}}}},configResolved(r){let o=A.getInstance(),a=o.getAppRoot();if(e=Le(a).missing,t=o.getEmptyModulePath(),s=o.getEmptyCjsModulePath(),e.length>0){let l=r.optimizeDeps?.exclude||[];r.optimizeDeps.exclude=[...l,...e]}n.debug&&e.length>0},resolveId(r){return Nt(r,e)?{id:t,syntheticNamedExports:!0}:null}}}function tt(n){return!n||typeof n!="string"?null:n.startsWith("@")?n.split("/").slice(0,2).join("/"):n.split("/")[0]}function Ms(n){return!n||typeof n!="string"?!1:!n.startsWith(".")&&!n.startsWith("/")&&!n.startsWith("\\")&&!n.startsWith("\0")}function zs(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 Ls(n,e){if(!n||!e)return null;let t=tt(n);if(!t)return null;let s=e.resolveAppPath(`node_modules/${t}`);return e.pathExists(s)?e.resolveAppPath(`node_modules/${n}`):null}function Tt(n,e,t){return!Ms(n)||!zs(e,t)?null:Ls(n,t)}G();function Ft(n={}){let{debug:e=!1,verbose:t=!0}=n,s=I("peer-dependency-resolver",e,t);return{name:"dndev-peer-dependency-resolver",enforce:"pre",configResolved(r){let o=A.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(Tt(r,o,this.pathResolver)){let i=tt(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 js}from"vite-plugin-pwa";L();var je=class extends se{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(d=>d.type==="manifest"||d.type==="service-worker");o.push(...i);let l=a.filter(d=>d.type==="icon"),u=new Set(o.filter(d=>d.type==="icon").map(d=>d.path)),c=l.filter(d=>!u.has(d.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
|
|
570
570
|
// Generated at ${new Date().toISOString()}
|
|
571
571
|
|
|
572
572
|
importScripts('https://storage.googleapis.com/workbox-cdn/releases/7.0.0/workbox-sw.js');
|
|
@@ -634,7 +634,7 @@ registerRoute(
|
|
|
634
634
|
}),
|
|
635
635
|
'POST'
|
|
636
636
|
);
|
|
637
|
-
`}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()}};B();function Ot(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=F("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=$.getInstance(),r=qe.data;if(!r)try{let c=s.resolveAppPath(j.vite.assetInspection);s.pathExists(c)}catch{}let o=new Ce(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 Fs(u)}L();L();function Tt(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 _e=null,Ft=null;function Is(n){let t=(n.split("/").pop()?.replace(/\.tsx?$/,"")||"Component").replace(/[^a-zA-Z0-9]/g,"");return t.charAt(0).toUpperCase()+t.slice(1)}var Me=class extends oe{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(_e&&Ft===s)return this.logger.debug("Using cached route discovery results"),this.routes=_e.routes,this.errors=_e.errors,this.source=_e.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/"),_e={routes:this.routes,errors:this.errors,source:this.source},Ft=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=Is(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=Tt(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 Cs={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=>` {
|
|
637
|
+
`}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()}};G();function It(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=I("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=A.getInstance(),r=Ke.data;if(!r)try{let c=s.resolveAppPath(j.vite.assetInspection);s.pathExists(c)}catch{}let o=new je(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||{},d=(await o.discoverPWAAssets()).assets.filter(g=>g.type==="icon").map(g=>({src:`/${g.path}`,sizes:`${g.size.width}x${g.size.height}`,type:`image/${g.format}`,purpose:g.purpose}));return{name:c.name,short_name:c.shortName,description:c.description,start_url:"/",display:"standalone",background_color:"#ffffff",theme_color:"#000000",icons:d.length>0?d:[]}},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(d=>d.url==="/index.html"||d.url==="index.html");return p&&!c.find(d=>d.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 js(u)}L();L();function Ct(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 Ne=null,Mt=null;function Us(n){let t=(n.split("/").pop()?.replace(/\.tsx?$/,"")||"Component").replace(/[^a-zA-Z0-9]/g,"");return t.charAt(0).toUpperCase()+t.slice(1)}var Ue=class extends se{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(Ne&&Mt===s)return this.logger.debug("Using cached route discovery results"),this.routes=Ne.routes,this.errors=Ne.errors,this.source=Ne.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/"),Ne={routes:this.routes,errors:this.errors,source:this.source},Mt=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=Us(o),u=i===Ve.HOMEPAGE_COMPONENT?Ve.HOMEPAGE_PATH:this._resolveRoutePath(a,r,e.absolutePath),c=this._extractPageMeta(r,s),{entity:p,action:d,...g}=a||{};return{path:u,component:i,importPath:o,auth:a?.auth||!1,meta:{...c,...g,entity:c.entity,action:c.action},metaExport:a,file:r}}_extractMetaExport(e,t){try{let s=Ct(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 Ws={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=>` {
|
|
638
638
|
path: '${o.path}',
|
|
639
639
|
component: () => import('${o.importPath}'),
|
|
640
640
|
auth: ${JSON.stringify(o.auth,null,2).replace(/\n/g,`
|
|
@@ -761,7 +761,7 @@ export const routeManifest = {
|
|
|
761
761
|
};
|
|
762
762
|
|
|
763
763
|
export default discoveredRoutes;
|
|
764
|
-
`},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`:""}`)}},
|
|
764
|
+
`},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`:""}`)}},Gs=[n=>n.endsWith("Page.tsx")];function zt(n={}){return ce({pluginName:"dndev-vite-route-discovery",icon:"\u{1F6E3}\uFE0F",virtualModuleId:M.routes,DiscoveryClass:Ue,discoveryMethod:"discoverRoutes",filePatterns:Gs,templates:Ws,defaultInspectionPath:j.vite.routeInspection,manifestFileName:j.manifests.route,configKey:"routes"})({...n,disableHmr:n?.hmr===!1,hmrSmartDetection:!1})}import{loadEnv as Js}from"vite";G();import{readFileSync as Bs,readdirSync as Vs,existsSync as Hs}from"fs";import{join as Lt}from"path";var We=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=I("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(`
|
|
765
765
|
`)}generateSitemapContent(e){return`<?xml version="1.0" encoding="UTF-8"?>
|
|
766
766
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
767
767
|
${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>
|
|
@@ -769,7 +769,7 @@ ${i.join(`
|
|
|
769
769
|
`)}
|
|
770
770
|
</url>`}).join(`
|
|
771
771
|
`)}
|
|
772
|
-
</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=
|
|
772
|
+
</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=Lt(this.appRoot,"src","content","blog");try{if(!Hs(e))return[];let t=Vs(e).filter(r=>r.endsWith("_en.md"));if(t.length===0)return[];let s=[];for(let r of t){let o=Bs(Lt(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(`
|
|
773
773
|
`)){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>
|
|
774
774
|
<title><![CDATA[${a.title}]]></title>
|
|
775
775
|
<link>${this.options.baseUrl}/blog/${a.slug}</link>
|
|
@@ -789,7 +789,7 @@ ${i.join(`
|
|
|
789
789
|
<atom:link href="${this.options.baseUrl}/rss.xml" rel="self" type="application/rss+xml"/>
|
|
790
790
|
${r}
|
|
791
791
|
</channel>
|
|
792
|
-
</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
|
|
792
|
+
</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 jt(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=I("SEO Plugin",t,!0),d=A.getInstance(),g=null,m=null,w=!1;async function _(){try{let y=d.resolveAppPath("src/routes.generated.log"),k=d.readSync(y,{format:"text"});if(!k)return p.error(`SEO plugin: routes discovery file not found at ${y}`),p.error("This indicates route discovery failed or did not run. SEO files will be generated with empty routes."),{routes:[],errors:[`Routes file missing: ${y}`],source:"fallback"};let D=k.match(/export const discoveredRoutes = (\[[\s\S]*?\]);/);if(!D)return p.error(`SEO plugin: failed to parse routes from ${y}`),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: ${y}`],source:"fallback"};let b=D[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,"]"),R=Function(`"use strict"; return ${b}`)();return{routes:R,errors:[],source:"generated",totalFiles:R.length}}catch(y){return p.warn(`Error parsing generated routes: ${y.message}, falling back to empty routes`),{routes:[],errors:[],source:"fallback"}}}return{name:"vite-seo-plugin",enforce:"pre",configResolved(y){let k=d.getAppRoot(),D=y.mode||"production",R=Js(D,k,"VITE_").VITE_APP_URL||process.env.VITE_APP_URL||null;R&&t&&p.debug(`Using app URL from VITE_APP_URL: ${R}`),g=i||null,m=a||R||null,p.verbose(`Name: ${g||"Not found"}`),p.verbose(`URL: ${m||"Not found"}`),g&&p.debug(` - Site name from appConfig: "${g}"`);let v=[];if(m||v.push("baseUrl (VITE_APP_URL in .env)"),g||v.push("siteName (APP_NAME in src/config/app.ts)"),v.length>0){w=!0,p.warn("\u26A0\uFE0F SEO Plugin disabled - missing required configuration:"),v.forEach(N=>p.warn(` - ${N}`)),p.warn(""),p.warn(" To fix:"),m||p.warn(" 1. Add VITE_APP_URL=https://yourdomain.com to your .env file"),g||(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(!w)try{let y=new We({debug:t,generateRobotsTxt:s,generateSitemap:r,baseUrl:m,siteName:g,crawlDelay:l,routes:o,appRoot:d.getAppRoot(),...c}),k=await _(),D=async(v,N)=>{this.emitFile({type:"asset",fileName:v,source:N})},b=async v=>!1,R=await y.generateSEOFiles(k,D,b);R.robotsTxt&&!R.robotsTxt.skipped&&p.info(`\u{1F916} robots.txt: ${R.robotsTxt.disallowedPaths||0} disallowed paths`),R.sitemap&&!R.sitemap.skipped&&p.info(`\u{1F5FA}\uFE0F sitemap.xml: ${R.sitemap.publicRoutes||0} routes`),R.rss&&!R.rss.skipped&&p.info(`\u{1F4E1} rss.xml: ${R.rss.postCount||0} blog posts`),R.manifest&&!R.manifest.skipped&&p.info("\u{1F4C4} seo-manifest.json")}catch(y){p.error(`SEO plugin failed to generate files (robots.txt/sitemap.xml): ${y.message}`),p.error(`Stack: ${y.stack||"No stack trace available"}`)}}}}L();function Ut(n={}){let{debug:e}=n;return{name:"dndev-server-shim",enforce:"pre",resolveId(t,s){return t.startsWith("node:")?(I("server-shim",e,!0).warn(`Blocking Node.js built-in module import: ${t}${s?` from ${s}`:""}`),"\0virtual:empty-server-module"):Je.includes(t)||Je.some(r=>t.startsWith(`${r}/`))?(I("server-shim",e,!0).warn(`Blocking server-only subpath import: ${t}${s?` from ${s}`:""}`),"\0virtual:empty-server-module"):ct.includes(t)?(I("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"?`
|
|
793
793
|
// Node.js built-in modules shims for browser compatibility
|
|
794
794
|
export const URL = globalThis.URL;
|
|
795
795
|
export const URLSearchParams = globalThis.URLSearchParams;
|
|
@@ -1068,7 +1068,7 @@ ${r}
|
|
|
1068
1068
|
// Google Logging Utils shims
|
|
1069
1069
|
export const LoggingWinston = class LoggingWinston {};
|
|
1070
1070
|
export const LoggingBunyan = class LoggingBunyan {};
|
|
1071
|
-
`:null}}}L();L();var
|
|
1071
|
+
`:null}}}L();L();L();var Wt=/--(?:font-family|font-headline)\s*:\s*([^;]+);/g,Gt=/['"]([^'"]+)['"]/g,Ee=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:{...qe.selectors,...this.options.customPatterns?.selectors},themes:{...qe.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 d=c.match(this.patterns.themes.themeIcon),g=c.match(this.patterns.themes.themeIsDark),m={name:u,displayName:p,isDark:g?g[1]==="1":!1,meta:{icon:d?.[1]},source:this.pathResolver.getBasename(t)};this._debug(`Discovered theme: ${u} (${p})`),r.push(m),s.themes.set(u,{name:u,displayName:p,isDark:m.isDark,file:a,variables:new Set,meta:m.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(Wt.lastIndex=0;(r=Wt.exec(t))!==null;){let o=r[1],a;for(Gt.lastIndex=0;(a=Gt.exec(o))!==null;){let i=a[1].trim();i&&s.add(i)}}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||"")}};var Oe=class extends se{constructor(e,t,s={}){super(t,s),this.cssExtractor=e||new Ee(t,{debug:s.debug,logger:this.logger}),this.discovered={themes:new Map,variables:{framework:new Set,consumer:new Set},classes:new Set,keyframes:new Set},this._addEssentialThemes()}_getDiscoveryType(){return"Theme"}async _getPatterns(){return await this.pathResolver.resolvePatterns("css")}_getPatternType(){return"css"}async _processFiles(e){this.discovered={themes:new Map,variables:{framework:new Set,consumer:new Set},classes:new Set,keyframes:new Set},this._addEssentialThemes();let{frameworkFiles:t,consumerFiles:s}=e;this.logger.debug(`Scanning ${t.length} framework + ${s.length} consumer CSS files`),this.logger.debug("\u{1F50D} FILES DISCOVERED:"),this.logger.debug("Framework files:",t),this.logger.debug("Consumer files:",s),t.length>0?(this.logger.debug(`Framework files found: ${t.length}`),this.logger.debug("Framework files:",t)):this.logger.debug("No framework files found"),s.length>0?(this.logger.debug(`Consumer files found: ${s.length}`),this.logger.debug("Consumer files:",s)):this.logger.debug("No consumer files found"),await this._processFrameworkFiles(t),await this._processConsumerFiles(s);let r=this._serializeThemes();return this.logger.debug(`Discovered ${r.length} themes:`,r.map(o=>o.name)),{themes:r,variables:{framework:Array.from(this.discovered.variables.framework).sort(),consumer:Array.from(this.discovered.variables.consumer).sort(),all:[...Array.from(this.discovered.variables.framework),...Array.from(this.discovered.variables.consumer)].sort()},classes:Array.from(this.discovered.classes).sort(),keyframes:Array.from(this.discovered.keyframes).sort()}}_getEmptyResult(){let e=this._serializeThemes();return{themes:e.length>0?e:this._getEssentialThemesFallback(),variables:{framework:[],consumer:[],all:[]},classes:[],keyframes:[],timestamp:Date.now()}}_getEssentialThemesFallback(){return Ye.map(e=>({name:e.name,displayName:e.displayName,meta:{icon:e.icon,category:e.isDark?"dark":"light"},essential:!0,isDark:e.isDark,source:"built-in",variableCount:0}))}_getDiscoverySummary(){return""}async discoverThemes(e=!1){return await this.discover(e)}getThemes(){return this.cache?.themes||[]}getVariables(){return this.cache?.variables||{framework:[],consumer:[],all:[]}}getClasses(){return this.cache?.classes||[]}async _processFrameworkFiles(e){for(let t of e)try{let s=await this.pathResolver.read(t,{format:"text"}),r=this.pathResolver.normalizePath(t);this.cssExtractor.extractThemes(s,r,this.discovered),this.cssExtractor.extractClasses(s,this.discovered),this.cssExtractor.extractVariables(s,this.discovered,"framework"),this.cssExtractor.extractKeyframes(s,this.discovered),this.logger.debug(`\u2705 Processed framework: ${this.pathResolver.getRelativePath(r)}`)}catch(s){this.logger.debug(`Error scanning framework file ${t}: ${s.message}`)}}async _processConsumerFiles(e){for(let t of e)try{let s=await this.pathResolver.read(t,{format:"text"}),r=this.pathResolver.normalizePath(t);this.cssExtractor.extractThemes(s,r,this.discovered),this.cssExtractor.extractVariables(s,this.discovered,"consumer"),this.logger.debug(`\u2705 Processed consumer: ${this.pathResolver.getRelativePath(r)}`)}catch(s){this.logger.debug(`Error scanning consumer file ${t}: ${s.message}`)}}_addEssentialThemes(){Ye.forEach(e=>{this.discovered.themes.set(e.name,{name:e.name,displayName:e.displayName,meta:{icon:e.icon,category:e.isDark?"dark":"light"},essential:!0,isDark:e.isDark,source:"built-in",variables:new Set})})}_serializeThemes(){return Array.from(this.discovered.themes.values()).map(e=>({name:e.name,displayName:e.displayName,meta:e.meta,source:e.source,essential:e.essential||!1,isDark:e.isDark||!1,variableCount:e.variables?.size||0}))}};var Bt={isEmpty:n=>!n.themes||n.themes.length===0,generateModule:(n,e,t="themes")=>{let{themes:s}=n;if(!s||s.length===0)return Bt.generateEmpty(n,e,void 0,t);let r=s.find(a=>a.essential&&a.name==="light")||s[0],o={totalThemes:s.length,defaultTheme:r?.name||"light",hasCustomThemes:s.some(a=>!a.essential),timestamp:new Date().toISOString()};return`// Virtual module: ${M.themes}
|
|
1072
1072
|
// \u{1F680} STATIC INJECTION PATTERN - Zero Runtime Loading
|
|
1073
1073
|
// Generated by @donotdev/config at ${new Date().toISOString()}
|
|
1074
1074
|
|
|
@@ -1244,8 +1244,9 @@ export const themeManifest = {
|
|
|
1244
1244
|
};
|
|
1245
1245
|
|
|
1246
1246
|
export default discoveredThemes;
|
|
1247
|
-
`},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
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
${
|
|
1247
|
+
`},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 Vt(n={}){let e=Date.now();return I("theme-plugin",n.debug,n.verbose).debug("\u{1F3A8} Creating theme discovery plugin..."),ce({pluginName:"dndev-theme",icon:"\u{1F3A8}",virtualModuleId:M.themes,DiscoveryClass:Oe,discoveryMethod:"discoverThemes",filePatterns:["**/*.css"],templates:Bt,defaultInspectionPath:j.vite.themeInspection,manifestFileName:j.manifests.theme,configKey:"themes",createDiscovery:(r,o)=>{let a=new Ee(r,{debug:o.debug,logger:I("css-extractor",o.debug,o.verbose)});return new Oe(a,r,o)}})(n)}G();function Ht(n={}){let e=I("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:d={},serverShim:g={},pluginFactory:m={}}=n,w=i.debug??s,_=l.debug??s,y=u.debug??s,k=c.debug??s,D=g.debug??s,b=[];b.push(Ut({...g,debug:D}));let R;try{R=A.getInstance()}catch(v){throw new Error(`Failed to initialize PathResolver: ${v.message||v}`)}return b.push({name:"dndev-file-watcher-fix",enforce:"pre",configResolved(v){if(s){e.debug("\u{1F4CB} Vite resolved config (configResolved):");let O={root:v.root,mode:v.mode,envDir:v.envDir,base:v.base,build:v.build?{outDir:v.build.outDir,minify:v.build.minify}:void 0,server:v.server?{port:v.server.port,host:v.server.host}:void 0,plugins:v.plugins?{count:v.plugins.length,names:v.plugins.map(B=>B?.name||"unnamed").filter(Boolean)}:void 0};e.debug(JSON.stringify(O,null,2))}R.setAppRoot(v.root);let N=R.getAppRoot();if(o&&v.server?.port){let O=v.server.https?"https":"http";process.env.VITE_APP_URL=`${O}://localhost:${v.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 O=R.getRepoRoot();e.verbose(`Repo: ${O}`),e.verbose(`App: ${N}`)}catch(O){e.debug(`Could not log PathResolver values: ${O.message}`)}if(v.server){let O=E=>{let x=E.replace(/\\/g,"/"),W=N.replace(/\\/g,"/");return!x.startsWith(W)};v.server.watch||(v.server.watch={});let B=["**/node_modules/**","**/.git/**","**/dist/**","**/build/**","**/.next/**","**/.turbo/**","**/.vite/**","**/functions/**","**/.generated/**"];v.server.watch={...v.server.watch,ignored:[...v.server.watch.ignored||[],...B,O]},e.verbose(`Fixed file watcher to use app root: ${N}`)}}}),b.push(Ft({debug:s,verbose:r})),b.push(Ot({debug:s})),b.push(Ys({fastRefresh:!0,jsxRuntime:"automatic"})),b.push(Ks({ignoreConfigErrors:!0})),a.https!==!1&&b.push(qs()),b.push(zt({...m,...i,debug:w})),b.push(Vt({...m,...l,debug:_})),b.push(...At({...m,...u,debug:y})),b.push(Et({...m,...c,debug:k})),b.push(_t({...m,mode:t,debug:s,verbose:r})),b.push(jt({...p,debug:s,isDev:o})),d.enabled&&b.push(It({...d,debug:s})),b.push(kt({debug:s})),b.push({name:"dndev-build-summary",enforce:"post",closeBundle(){let v=R,N=v.resolveAppPath("dist/assets");if(v.pathExists(N))try{let O=v.readdirSync(N),B=O.filter(W=>W.endsWith(".js")),E=O.filter(W=>W.endsWith(".css")),x=O.length-B.length-E.length;e.info(`
|
|
1248
|
+
Build output: ${B.length} JS, ${E.length} CSS, ${x} other \u2014 ${O.length} files total`)}catch{}}}),b}catch(t){throw I("vite-plugins",!1,!0).error(`Failed to create Vite plugins: ${t.message}`),t}}L();G();function Zs(){let n=A.getInstance(),e=process.cwd(),t=n.resolvePath("/","/");for(;e!==t;){let s=n.resolvePath("node_modules/@donotdev",e);if(n.pathExists(s,!0))try{return n.readdirSync(s).filter(r=>!r.startsWith(".")).map(r=>`@donotdev/${r}`)}catch{return[]}e=n.resolvePath("..",e)}return[]}function Xs(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 Jt(n={}){let{alias:e,...t}=n,{conditions:s,...r}=t;return{alias:{"@":"/src",...Xs(e)},dedupe:["react","react-dom","react-router-dom"],preserveSymlinks:!1,conditions:["browser","module","import","vite-app",...s||[]],...r}}function qt(n={}){let{include:e=[],exclude:t=[],esbuildOptions:s={},...r}=n,o=Zs(),a=[...e,...ye.optionalFeatures,...o],i=[...new Set(a)],l=[...new Set(t)];return{include:i,exclude:l,esbuildOptions:s,...r}}function kr(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, ... })
|
|
1249
|
+
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,...d}=i,g=o?.app?{name:o.app.name,shortName:o.app.shortName,description:o.app.description}:void 0,{pwa:m={},...w}=d,_={...m,app:m.app||g},y={...l?{features:l}:{},...u?{seo:u}:{},...Object.keys(_).length>0?{pwa:_}:{},...w,mode:r},k;try{k=wt(y)}catch(Y){throw new Error(`mergeOptions failed: ${Y?.message||Y||"Unknown error"}`)}let D;try{D=xt(k)}catch(Y){throw new Error(`normalizeOptions failed: ${Y?.message||Y||"Unknown error"}`)}if(!D)throw new Error("normalizeOptions returned undefined");let{mode:b,debug:R,verbose:v,isDev:N,isDebug:O,shouldAnalyze:B,serverOptions:E,previewOptions:x,buildOverrides:W,resolveOptions:we,routeOptions:K,themeOptions:re,i18nOptions:oe,assetOptions:de,featureOptions:fe,seoOptions:S,pwaOptions:T,serverShimOptions:F,chunkingOptions:C,pluginFactoryOptions:q,base:pe,defineOptions:xe,optimizeDepsOptions:_e,pluginsOptions:$e,cssOptions:Te,envDir:Fe,restOptions:Ie}=D,h=I("vite-config",R,v);h.debug(`Mode: ${b}, Dev: ${N}`);let P=process.env.DNDEV_BUILD_ID,z;s==="build"?z=`Building for ${b}`:s==="serve"?z=`Development server (${b})`:s==="preview"?z=`Preview server (serving ${b} build)`:z=`Running ${s} (${b})`,h.info(`
|
|
1250
|
+
\u{1F3D7}\uFE0F DnDev Framework - ${z}${P?` [build:${P}]`:""}`),h.info(` Platform: Vite | Command: ${s} | Mode: ${b}
|
|
1251
|
+
`);let ie=Ht({mode:b,debug:R,verbose:v,isDev:N,routes:K,themes:re,i18n:oe,assets:de,features:fe,seo:S,pwa:T,serverShim:F,chunkingOptions:C,pluginFactory:q});if(!Array.isArray(ie))throw new Error(`createVitePlugins returned ${typeof ie}, expected array. Value: ${ie}`);let ne=ht({mode:b,chunkingOptions:C,debug:R,isDev:N,isDebug:O,shouldAnalyze:B}),rs=vt(E.port||3e3,E,h),os=yt(x);if(a)try{let{createDndevPlugin:Y}=await Promise.resolve().then(()=>(ss(),ts));$e.push(Y(typeof a=="object"?a:{}))}catch{}return{...pe&&{base:pe},plugins:[...ie,...$e],appType:"spa",assetsInclude:["**/*.woff","**/*.woff2","**/*.ttf","**/*.otf","**/*.eot"],...b==="production"&&{build:ne},...s==="serve"&&{server:rs},...s==="preview"&&{preview:os},...Fe&&{envDir:Fe},customLogger:b==="production"&&!R?(()=>{let Y={hasWarned:!1,_shouldSuppress(Q){return Q.includes("dist/")||Q.includes("kB")||Q.includes("\u2502")||Q.includes("gzip:")||Q.includes("\u2713 built in")||Q.match(/built in \d+\.\d+s/)},info(Q){Y._shouldSuppress(Q)},warn(Q){Y._shouldSuppress(Q)},error(Q){},warnOnce(Q){Y.hasWarned||(Y.hasWarned=!0)},clearScreen(){},hasErrorLogged(){return!1}};return Y})():void 0,css:{postcss:Pt(Te),...Te},optimizeDeps:qt(_e),resolve:Jt(we),define:{...xe,"process.env.NODE_ENV":JSON.stringify(r),__DEV__:JSON.stringify(N),__PROD__:JSON.stringify(!N)},...Ie}}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?`
|
|
1252
|
+
${o}`:""}`);throw a.stack=o||a.stack,a}}}export{kr as defineViteConfig};
|