{"version":3,"sources":["../src/loaders.ts","../src/utils.ts"],"names":[],"mappings":";;;;;;AASA,IAAI,aAAA,GAA4C,IAAA;AAChD,IAAI,YAAA,uBAAqD,GAAA,EAAI;AAG7D,SAAS,iBAAA,GAA6B;AACpC,EAAA,OAAO,OAAO,YAAY,WAAA,IACnB,OAAA,CAAQ,YAAY,IAAA,IACpB,OAAA,CAAQ,SAAS,IAAA,IAAQ,IAAA;AAClC;AAIA,eAAe,iBAAiB,UAAA,EAAkC;AAChE,EAAA,IAAI,CAAC,mBAAkB,EAAG;AACxB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,UAAU,CAAA,wCAAA,CAA0C,CAAA;AAAA,EAChF;AAIA,EAAA,QAAQ,UAAA;AAAY,IAClB,KAAK,IAAA;AACH,MAAA,OAAO;AAAA;AAAA,QAAiC;AAAA,OAAI;AAAA,IAC9C,KAAK,MAAA;AACH,MAAA,OAAO;AAAA;AAAA,QAAiC;AAAA,OAAM;AAAA,IAChD,KAAK,KAAA;AACH,MAAA,OAAO;AAAA;AAAA,QAAiC;AAAA,OAAK;AAAA,IAC/C;AACE,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,UAAU,CAAA,CAAE,CAAA;AAAA;AAEzD;AAGA,eAAe,SAAY,IAAA,EAA0B;AACnD,EAAA,IAAI;AAGF,IAAA,MAAM,SAAS,MAAM;AAAA;AAAA,MAA0B;AAAA,KAAA;AAC/C,IAAA,OAAO,MAAA,CAAO,OAAA;AAAA,EAChB,SAAS,KAAA,EAAO;AAEd,IAAA,IAAI,CAAC,mBAAkB,EAAG;AACxB,MAAA,MAAM,eAAe,IAAI,KAAA;AAAA,QACvB,CAAA;AAAA;AAAA;AAAA;AAAA,mGAAA;AAAA,OAOF;AACA,MAAA,MAAM,YAAA;AAAA,IACR;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,MAAM,gBAAA,CAAiB,IAAI,CAAA;AACtC,MAAA,MAAM,UAAA,GAAa,MAAM,gBAAA,CAAiB,MAAM,CAAA;AAChD,MAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,iBAAiB,KAAK,CAAA;AAGtD,MAAA,IAAI,QAAA;AACJ,MAAA,IAAI,OAAO,cAAc,WAAA,EAAa;AACpC,QAAA,QAAA,GAAW,SAAA;AAAA,MACb,CAAA,MAAO;AACL,QAAA,QAAA,GAAW,UAAA,CAAW,OAAA,CAAQ,aAAA,CAAc,2PAAe,CAAC,CAAA;AAAA,MAC9D;AAGA,MAAA,MAAM,aAAA,GAAgB;AAAA,QACpB,UAAA,CAAW,IAAA,CAAK,QAAA,EAAU,IAAI,CAAA;AAAA,QAC9B,UAAA,CAAW,IAAA,CAAK,QAAA,EAAU,IAAA,EAAM,IAAI,CAAA;AAAA;AAAA,QACpC,UAAA,CAAW,KAAK,OAAA,CAAQ,GAAA,IAAO,cAAA,EAAgB,mBAAA,EAAqB,WAAA,EAAa,MAAA,EAAQ,IAAI;AAAA;AAAA,OAC/F;AAEA,MAAA,IAAI,IAAA,GAAsB,IAAA;AAC1B,MAAA,IAAI,SAAA,GAAiB,IAAA;AAErB,MAAA,KAAA,MAAW,YAAY,aAAA,EAAe;AACpC,QAAA,IAAI;AACF,UAAA,IAAA,GAAO,EAAA,CAAG,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AACxC,UAAA;AAAA,QACF,SAAS,SAAA,EAAW;AAClB,UAAA,SAAA,GAAY,SAAA;AACZ,UAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,SAAS,IAAA,EAAM;AAEjB,QAAA,MAAM,GAAA,GAAW,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,IAAI,kBAAkB,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AACxG,QAAA,GAAA,CAAI,IAAA,GAAO,kBAAA;AACX,QAAA,GAAA,CAAI,aAAA,GAAgB,SAAA;AACpB,QAAA,MAAM,GAAA;AAAA,MACR;AAEA,MAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IACxB,SAAS,OAAA,EAAS;AAChB,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF;AAGA,eAAe,kBAAkB,WAAA,EAA6C;AAE5E,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,IAAI,CAAC,mBAAkB,EAAG;AACxB,MAAA,MAAM,IAAI,MAAM,6DAA6D,CAAA;AAAA,IAC/E;AAEA,IAAA,MAAM,EAAA,GAAK,MAAM,gBAAA,CAAiB,IAAI,CAAA;AACtC,IAAA,MAAM,UAAA,GAAa,MAAM,gBAAA,CAAiB,MAAM,CAAA;AAEhD,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,OAAO,cAAc,WAAA,EAAa;AACpC,MAAA,QAAA,GAAW,SAAA;AAAA,IACb,CAAA,MAAO;AACL,MAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,iBAAiB,KAAK,CAAA;AACtD,MAAA,QAAA,GAAW,UAAA,CAAW,OAAA,CAAQ,aAAA,CAAc,2PAAe,CAAC,CAAA;AAAA,IAC9D;AAEA,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,IAAA,CAAK,QAAA,EAAU,MAAM,CAAA;AAChD,IAAA,MAAM,IAAA,GAAO,GAAG,WAAA,CAAY,OAAA,EAAS,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA,CACzD,MAAA,CAAO,CAAC,CAAA,KAAW,CAAA,CAAE,aAAa,CAAA,CAClC,IAAI,CAAC,CAAA,KAAW,EAAE,IAAI,CAAA;AAEzB,IAAA,aAAA,uBAAoB,GAAA,EAAI;AACxB,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AAEtB,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAC3B,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACnC,MAAA,aAAA,CAAc,GAAA,CAAI,MAAM,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF;AAEA,EAAA,OAAO,aAAA,CAAc,GAAA,CAAI,WAAW,CAAA,IAAK,IAAA;AAC3C;AAGA,eAAe,eAAA,CAAgB,aAAqB,SAAA,EAA2C;AAC7F,EAAA,MAAM,UAAA,GAAa,MAAM,iBAAA,CAAkB,WAAW,CAAA;AACtD,EAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AAGxB,EAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,WAAW,CAAA,EAAG;AAClC,IAAA,IAAI,CAAC,mBAAkB,EAAG;AACxB,MAAA,MAAM,IAAI,MAAM,6DAA6D,CAAA;AAAA,IAC/E;AAEA,IAAA,MAAM,EAAA,GAAK,MAAM,gBAAA,CAAiB,IAAI,CAAA;AACtC,IAAA,MAAM,UAAA,GAAa,MAAM,gBAAA,CAAiB,MAAM,CAAA;AAEhD,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,OAAO,cAAc,WAAA,EAAa;AACpC,MAAA,QAAA,GAAW,SAAA;AAAA,IACb,CAAA,MAAO;AACL,MAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,iBAAiB,KAAK,CAAA;AACtD,MAAA,QAAA,GAAW,UAAA,CAAW,OAAA,CAAQ,aAAA,CAAc,2PAAe,CAAC,CAAA;AAAA,IAC9D;AAEA,IAAA,MAAM,WAAA,GAAc,UAAA,CAAW,IAAA,CAAK,QAAA,EAAU,QAAQ,UAAU,CAAA;AAChE,IAAA,MAAM,IAAA,GAAO,GAAG,WAAA,CAAY,WAAA,EAAa,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA,CAC7D,MAAA,CAAO,CAAC,CAAA,KAAW,CAAA,CAAE,aAAa,CAAA,CAClC,IAAI,CAAC,CAAA,KAAW,EAAE,IAAI,CAAA;AAEzB,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AAEtB,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAC3B,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACnC,MAAA,QAAA,CAAS,GAAA,CAAI,MAAM,GAAG,CAAA;AAAA,IACxB;AACA,IAAA,YAAA,CAAa,GAAA,CAAI,aAAa,QAAQ,CAAA;AAAA,EACxC;AAEA,EAAA,OAAO,aAAa,GAAA,CAAI,WAAW,CAAA,EAAG,GAAA,CAAI,SAAS,CAAA,IAAK,IAAA;AAC1D;AAOA,eAAsB,YAAA,GAAoC;AACxD,EAAA,OAAO,SAAqB,uBAAuB,CAAA;AACrD;AAQA,eAAsB,iBAAiB,WAAA,EAAmD;AACxF,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,MAAM,iBAAA,CAAkB,WAAW,CAAA;AACtD,IAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AACxB,IAAA,OAAO,MAAM,QAAA,CAAuB,CAAA,OAAA,EAAU,UAAU,CAAA,UAAA,CAAY,CAAA;AAAA,EACtE,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiB,KAAA,KAAU,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,IAAK,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,qBAAqB,CAAA,CAAA,EAAI;AAClH,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,6BAAA,EAAgC,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,IAC9D;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAQA,eAAsB,mBAAmB,WAAA,EAAwC;AAC/E,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,MAAM,iBAAA,CAAkB,WAAW,CAAA;AACtD,IAAA,IAAI,CAAC,UAAA,EAAY,OAAO,EAAC;AACzB,IAAA,OAAO,MAAM,QAAA,CAAmB,CAAA,OAAA,EAAU,UAAU,CAAA,YAAA,CAAc,CAAA;AAAA,EACpE,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiB,KAAA,KAAU,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,IAAK,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,qBAAqB,CAAA,CAAA,EAAI;AAClH,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,6BAAA,EAAgC,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,IAC9D;AAEA,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AASA,eAAsB,cAAA,CACpB,aACA,SAAA,EACwB;AACxB,EAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB,WAAW,CAAA;AACnD,EAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,SAAS,CAAA;AACrD,EAAA,OAAO,KAAA,IAAS,IAAA;AAClB;AASA,eAAsB,gBAAA,CACpB,aACA,SAAA,EACkB;AAClB,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,MAAM,iBAAA,CAAkB,WAAW,CAAA;AACtD,IAAA,IAAI,CAAC,UAAA,EAAY,OAAO,EAAC;AAEzB,IAAA,MAAM,QAAA,GAAW,MAAM,eAAA,CAAgB,WAAA,EAAa,SAAS,CAAA;AAC7D,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AAEvB,IAAA,OAAO,MAAM,QAAA,CAAkB,CAAA,OAAA,EAAU,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,YAAA,CAAc,CAAA;AAAA,EAC/E,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiB,KAAA,KAAU,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,IAAK,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,qBAAqB,CAAA,CAAA,EAAI;AAClH,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,6BAAA,EAAgC,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,IAC9D;AAEA,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AASA,eAAsB,sBAAsB,WAAA,EAAuC;AACjF,EAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB,WAAW,CAAA;AACnD,EAAA,MAAM,YAAqB,EAAC;AAG5B,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,WAAA,EAAa,MAAM,IAAI,CAAA;AAC7D,IAAA,SAAA,CAAU,IAAA,CAAK,GAAG,MAAM,CAAA;AAAA,EAC1B;AAEA,EAAA,OAAO,SAAA;AACT;AAQA,eAAsB,mBAAA,GAAwC;AAC5D,EAAA,MAAM,SAAA,GAAY,MAAM,YAAA,EAAa;AACrC,EAAA,MAAM,YAAqB,EAAC;AAG5B,EAAA,KAAA,MAAW,WAAW,SAAA,EAAW;AAC/B,IAAA,MAAM,MAAA,GAAS,MAAM,qBAAA,CAAsB,OAAA,CAAQ,IAAI,CAAA;AACvD,IAAA,SAAA,CAAU,IAAA,CAAK,GAAG,MAAM,CAAA;AAAA,EAC1B;AAEA,EAAA,OAAO,SAAA;AACT;AAUA,eAAsB,WAAA,CACpB,WAAA,EACA,SAAA,EACA,MAAA,EACuB;AACvB,EAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,WAAA,EAAa,SAAS,CAAA;AAC5D,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,MAAM,CAAA;AAC/C,EAAA,OAAO,IAAA,IAAQ,IAAA;AACjB;;;AClUA,eAAsB,mBAAmB,WAAA,EAAuC;AAC9E,EAAA,MAAM,SAAA,GAAY,MAAM,YAAA,EAAa;AACrC,EAAA,OAAO,UAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,WAAW,CAAA;AACrD;AAQA,eAAsB,gBAAA,CACpB,aACA,SAAA,EACkB;AAClB,EAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB,WAAW,CAAA;AACnD,EAAA,OAAO,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,SAAS,CAAA;AAChD;AAUA,eAAsB,kBAAA,CACpB,WAAA,EACA,SAAA,EACA,UAAA,EACkB;AAClB,EAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,WAAA,EAAa,SAAS,CAAA;AAC5D,EAAA,MAAM,eAAA,GAAkB,WAAW,WAAA,EAAY;AAC/C,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,KAAK,WAAA,EAAY,CAAE,QAAA,CAAS,eAAe,CAAC,CAAA;AAClF;AAOA,eAAsB,qBAAqB,WAAA,EAA6C;AACtF,EAAA,MAAM,SAAA,GAAY,MAAM,YAAA,EAAa;AACrC,EAAA,MAAM,UAAU,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,WAAW,CAAA;AAC5D,EAAA,OAAO,OAAA,GAAU,QAAQ,IAAA,GAAO,IAAA;AAClC;AAQA,eAAsB,kBAAA,CACpB,aACA,SAAA,EACwB;AACxB,EAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB,WAAW,CAAA;AACnD,EAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,SAAS,CAAA;AACrD,EAAA,OAAO,KAAA,GAAQ,MAAM,IAAA,GAAO,IAAA;AAC9B;AASA,eAAsB,kBAAA,CACpB,WAAA,EACA,SAAA,EACA,QAAA,EACwB;AACxB,EAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,WAAA,EAAa,SAAS,CAAA;AAC5D,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,QAAQ,CAAA;AACnD,EAAA,OAAO,IAAA,GAAO,KAAK,QAAA,GAAW,IAAA;AAChC;AAOA,eAAsB,oBAAoB,WAAA,EAAwC;AAChF,EAAA,MAAM,WAAA,GAAc,MAAM,gBAAA,CAAiB,WAAW,CAAA;AACtD,EAAA,IAAI,CAAC,WAAA,IAAe,CAAC,WAAA,CAAY,SAAA,EAAW;AAC1C,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,OAAO,YAAY,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,KAAO,GAAG,QAAQ,CAAA;AACtD","file":"index.cjs","sourcesContent":["/**\n * Dynamic data loaders for @world/countries\n * Uses dynamic import() to enable code-splitting and lazy loading\n * Falls back to fs.readFileSync for CommonJS environments\n */\n\nimport type { ICountry, ICountryMeta, IState, ICity } from './types';\n\n// Cache for country code to directory name mapping\nlet countryDirMap: Map<string, string> | null = null;\nlet stateDirMaps: Map<string, Map<string, string>> = new Map();\n\n// Helper to check if we're in a Node.js environment\nfunction isNodeEnvironment(): boolean {\n  return typeof process !== 'undefined' && \n         process.versions != null && \n         process.versions.node != null;\n}\n\n// Helper to conditionally import Node.js modules\n// Uses webpack magic comment to prevent bundling in client-side code\nasync function importNodeModule(moduleName: string): Promise<any> {\n  if (!isNodeEnvironment()) {\n    throw new Error(`Module ${moduleName} is not available in browser environment`);\n  }\n  \n  // The webpackIgnore magic comment tells webpack to not try to bundle this module\n  // This works because webpack will see it's a runtime variable and skip it\n  switch (moduleName) {\n    case 'fs':\n      return import(/* webpackIgnore: true */ 'fs');\n    case 'path':\n      return import(/* webpackIgnore: true */ 'path');\n    case 'url':\n      return import(/* webpackIgnore: true */ 'url');\n    default:\n      throw new Error(`Unsupported module: ${moduleName}`);\n  }\n}\n\n// Helper function to load JSON data\nasync function loadJSON<T>(path: string): Promise<T> {\n  try {\n    // Try dynamic import first (works in ESM and bundlers)\n    // @vite-ignore - Prevents Vite from analyzing this import\n    const module = await import(/* @vite-ignore */ path, { assert: { type: 'json' } } as any);\n    return module.default;\n  } catch (error) {\n    // Fallback to fs for CommonJS/Node environments only\n    if (!isNodeEnvironment()) {\n      const browserError = new Error(\n        `@countrystatecity/countries cannot load data in browser environments. ` +\n        `This package is designed for server-side use only. ` +\n        `Please use one of these approaches:\\n` +\n        `1. Create an API endpoint that calls this package on the server\\n` +\n        `2. Generate static JSON at build time\\n` +\n        `3. Use in SSR/SSG context only (e.g., SvelteKit load functions, Next.js server components)\\n` +\n        `See documentation at: https://github.com/dr5hn/countrystatecity/tree/main/packages/countries#readme`\n      );\n      throw browserError;\n    }\n    \n    try {\n      const fs = await importNodeModule('fs');\n      const pathModule = await importNodeModule('path');\n      const { fileURLToPath } = await importNodeModule('url');\n      \n      // Resolve path relative to this file\n      let basePath: string;\n      if (typeof __dirname !== 'undefined') {\n        basePath = __dirname;\n      } else {\n        basePath = pathModule.dirname(fileURLToPath(import.meta.url));\n      }\n      \n      // Try multiple path resolution strategies for different environments\n      const possiblePaths = [\n        pathModule.join(basePath, path),\n        pathModule.join(basePath, '..', path), // In case dist structure is different\n        pathModule.join(process.cwd(), 'node_modules', '@countrystatecity', 'countries', 'dist', path), // Vercel/serverless\n      ];\n      \n      let data: string | null = null;\n      let lastError: any = null;\n      \n      for (const fullPath of possiblePaths) {\n        try {\n          data = fs.readFileSync(fullPath, 'utf-8');\n          break;\n        } catch (readError) {\n          lastError = readError;\n          continue;\n        }\n      }\n      \n      if (data === null) {\n        // If all paths failed, throw the last error with helpful message\n        const err: any = new Error(`Failed to load JSON file: ${path}. Tried paths: ${possiblePaths.join(', ')}`);\n        err.code = 'MODULE_NOT_FOUND';\n        err.originalError = lastError;\n        throw err;\n      }\n      \n      return JSON.parse(data);\n    } catch (fsError) {\n      throw error; // Throw original error if fs also fails\n    }\n  }\n}\n\n// Helper to get country directory name from ISO2 code\nasync function getCountryDirName(countryCode: string): Promise<string | null> {\n  // Initialize map if not already done\n  if (!countryDirMap) {\n    if (!isNodeEnvironment()) {\n      throw new Error('Directory scanning is only available in Node.js environment');\n    }\n    \n    const fs = await importNodeModule('fs');\n    const pathModule = await importNodeModule('path');\n    \n    let basePath: string;\n    if (typeof __dirname !== 'undefined') {\n      basePath = __dirname;\n    } else {\n      const { fileURLToPath } = await importNodeModule('url');\n      basePath = pathModule.dirname(fileURLToPath(import.meta.url));\n    }\n    \n    const dataDir = pathModule.join(basePath, 'data');\n    const dirs = fs.readdirSync(dataDir, { withFileTypes: true })\n      .filter((d: any) => d.isDirectory())\n      .map((d: any) => d.name);\n    \n    countryDirMap = new Map();\n    for (const dir of dirs) {\n      // Extract ISO2 code from directory name (format: CountryName-ISO2)\n      const parts = dir.split('-');\n      const iso2 = parts[parts.length - 1];\n      countryDirMap.set(iso2, dir);\n    }\n  }\n  \n  return countryDirMap.get(countryCode) || null;\n}\n\n// Helper to get state directory name from state code\nasync function getStateDirName(countryCode: string, stateCode: string): Promise<string | null> {\n  const countryDir = await getCountryDirName(countryCode);\n  if (!countryDir) return null;\n  \n  // Check if we have cached state map for this country\n  if (!stateDirMaps.has(countryCode)) {\n    if (!isNodeEnvironment()) {\n      throw new Error('Directory scanning is only available in Node.js environment');\n    }\n    \n    const fs = await importNodeModule('fs');\n    const pathModule = await importNodeModule('path');\n    \n    let basePath: string;\n    if (typeof __dirname !== 'undefined') {\n      basePath = __dirname;\n    } else {\n      const { fileURLToPath } = await importNodeModule('url');\n      basePath = pathModule.dirname(fileURLToPath(import.meta.url));\n    }\n    \n    const countryPath = pathModule.join(basePath, 'data', countryDir);\n    const dirs = fs.readdirSync(countryPath, { withFileTypes: true })\n      .filter((d: any) => d.isDirectory())\n      .map((d: any) => d.name);\n    \n    const stateMap = new Map<string, string>();\n    for (const dir of dirs) {\n      // Extract state code from directory name (format: StateName-CODE)\n      const parts = dir.split('-');\n      const code = parts[parts.length - 1];\n      stateMap.set(code, dir);\n    }\n    stateDirMaps.set(countryCode, stateMap);\n  }\n  \n  return stateDirMaps.get(countryCode)?.get(stateCode) || null;\n}\n\n/**\n * Get lightweight list of all countries\n * @returns Promise with array of countries (basic info only)\n * @bundle ~5KB - Loads countries.json\n */\nexport async function getCountries(): Promise<ICountry[]> {\n  return loadJSON<ICountry[]>('./data/countries.json');\n}\n\n/**\n * Get full country metadata including timezones and translations\n * @param countryCode - ISO2 country code (e.g., 'US', 'IN')\n * @returns Promise with full country metadata or null if not found\n * @bundle ~5KB per country - Loads {Country-CODE}/meta.json\n */\nexport async function getCountryByCode(countryCode: string): Promise<ICountryMeta | null> {\n  try {\n    const countryDir = await getCountryDirName(countryCode);\n    if (!countryDir) return null;\n    return await loadJSON<ICountryMeta>(`./data/${countryDir}/meta.json`);\n  } catch (error) {\n    if (error instanceof Error && (error.message.includes('browser') || error.message.includes('Node.js environment'))) {\n      console.warn(`@countrystatecity/countries: ${error.message}`);\n    }\n    // Country not found or file doesn't exist\n    return null;\n  }\n}\n\n/**\n * Get all states/provinces for a specific country\n * @param countryCode - ISO2 country code\n * @returns Promise with array of states or empty array if not found\n * @bundle ~10-100KB depending on country - Loads {Country-CODE}/states.json\n */\nexport async function getStatesOfCountry(countryCode: string): Promise<IState[]> {\n  try {\n    const countryDir = await getCountryDirName(countryCode);\n    if (!countryDir) return [];\n    return await loadJSON<IState[]>(`./data/${countryDir}/states.json`);\n  } catch (error) {\n    if (error instanceof Error && (error.message.includes('browser') || error.message.includes('Node.js environment'))) {\n      console.warn(`@countrystatecity/countries: ${error.message}`);\n    }\n    // Country not found or has no states\n    return [];\n  }\n}\n\n/**\n * Get specific state by code\n * @param countryCode - ISO2 country code\n * @param stateCode - State code (e.g., 'CA', 'TX')\n * @returns Promise with state object or null if not found\n * @bundle Same as getStatesOfCountry - filters in memory\n */\nexport async function getStateByCode(\n  countryCode: string,\n  stateCode: string\n): Promise<IState | null> {\n  const states = await getStatesOfCountry(countryCode);\n  const state = states.find((s) => s.iso2 === stateCode);\n  return state || null;\n}\n\n/**\n * Get all cities in a specific state\n * @param countryCode - ISO2 country code\n * @param stateCode - State code\n * @returns Promise with array of cities or empty array if not found\n * @bundle ~5-200KB depending on state - Loads {Country-CODE}/{State-CODE}/cities.json\n */\nexport async function getCitiesOfState(\n  countryCode: string,\n  stateCode: string\n): Promise<ICity[]> {\n  try {\n    const countryDir = await getCountryDirName(countryCode);\n    if (!countryDir) return [];\n    \n    const stateDir = await getStateDirName(countryCode, stateCode);\n    if (!stateDir) return [];\n    \n    return await loadJSON<ICity[]>(`./data/${countryDir}/${stateDir}/cities.json`);\n  } catch (error) {\n    if (error instanceof Error && (error.message.includes('browser') || error.message.includes('Node.js environment'))) {\n      console.warn(`@countrystatecity/countries: ${error.message}`);\n    }\n    // State not found or has no cities\n    return [];\n  }\n}\n\n/**\n * Get ALL cities in an entire country\n * WARNING: Large data size - loads all state city files for the country\n * @param countryCode - ISO2 country code\n * @returns Promise with array of all cities in country\n * @bundle Large - loads multiple city files\n */\nexport async function getAllCitiesOfCountry(countryCode: string): Promise<ICity[]> {\n  const states = await getStatesOfCountry(countryCode);\n  const allCities: ICity[] = [];\n\n  // Load cities for each state\n  for (const state of states) {\n    const cities = await getCitiesOfState(countryCode, state.iso2);\n    allCities.push(...cities);\n  }\n\n  return allCities;\n}\n\n/**\n * Get every city globally\n * WARNING: MASSIVE data (8MB+) - rarely needed, use sparingly\n * @returns Promise with array of all cities worldwide\n * @bundle 8MB+ - loads ALL city files\n */\nexport async function getAllCitiesInWorld(): Promise<ICity[]> {\n  const countries = await getCountries();\n  const allCities: ICity[] = [];\n\n  // Load cities for each country\n  for (const country of countries) {\n    const cities = await getAllCitiesOfCountry(country.iso2);\n    allCities.push(...cities);\n  }\n\n  return allCities;\n}\n\n/**\n * Get specific city by ID\n * @param countryCode - ISO2 country code\n * @param stateCode - State code\n * @param cityId - Database city ID\n * @returns Promise with city object or null if not found\n * @bundle Same as getCitiesOfState - filters in memory\n */\nexport async function getCityById(\n  countryCode: string,\n  stateCode: string,\n  cityId: number\n): Promise<ICity | null> {\n  const cities = await getCitiesOfState(countryCode, stateCode);\n  const city = cities.find((c) => c.id === cityId);\n  return city || null;\n}\n","/**\n * Utility functions for @world/countries\n */\n\nimport type { ICity } from './types';\nimport { getCountries, getStatesOfCountry, getCitiesOfState, getCountryByCode } from './loaders';\n\n/**\n * Validate if a country code exists\n * @param countryCode - ISO2 country code\n * @returns Promise with boolean indicating if country exists\n */\nexport async function isValidCountryCode(countryCode: string): Promise<boolean> {\n  const countries = await getCountries();\n  return countries.some((c) => c.iso2 === countryCode);\n}\n\n/**\n * Validate if a state code exists in a country\n * @param countryCode - ISO2 country code\n * @param stateCode - State code\n * @returns Promise with boolean indicating if state exists\n */\nexport async function isValidStateCode(\n  countryCode: string,\n  stateCode: string\n): Promise<boolean> {\n  const states = await getStatesOfCountry(countryCode);\n  return states.some((s) => s.iso2 === stateCode);\n}\n\n/**\n * Search cities by name (partial match)\n * Note: This loads cities for the specified state only\n * @param countryCode - ISO2 country code\n * @param stateCode - State code\n * @param searchTerm - Search term (case-insensitive partial match)\n * @returns Promise with array of matching cities\n */\nexport async function searchCitiesByName(\n  countryCode: string,\n  stateCode: string,\n  searchTerm: string\n): Promise<ICity[]> {\n  const cities = await getCitiesOfState(countryCode, stateCode);\n  const lowerSearchTerm = searchTerm.toLowerCase();\n  return cities.filter((city) => city.name.toLowerCase().includes(lowerSearchTerm));\n}\n\n/**\n * Get country name from code\n * @param countryCode - ISO2 country code\n * @returns Promise with country name or null if not found\n */\nexport async function getCountryNameByCode(countryCode: string): Promise<string | null> {\n  const countries = await getCountries();\n  const country = countries.find((c) => c.iso2 === countryCode);\n  return country ? country.name : null;\n}\n\n/**\n * Get state name from code\n * @param countryCode - ISO2 country code\n * @param stateCode - State code\n * @returns Promise with state name or null if not found\n */\nexport async function getStateNameByCode(\n  countryCode: string,\n  stateCode: string\n): Promise<string | null> {\n  const states = await getStatesOfCountry(countryCode);\n  const state = states.find((s) => s.iso2 === stateCode);\n  return state ? state.name : null;\n}\n\n/**\n * Get timezone for specific city\n * @param countryCode - ISO2 country code\n * @param stateCode - State code\n * @param cityName - City name\n * @returns Promise with timezone string or null if not found\n */\nexport async function getTimezoneForCity(\n  countryCode: string,\n  stateCode: string,\n  cityName: string\n): Promise<string | null> {\n  const cities = await getCitiesOfState(countryCode, stateCode);\n  const city = cities.find((c) => c.name === cityName);\n  return city ? city.timezone : null;\n}\n\n/**\n * Get all timezones for country\n * @param countryCode - ISO2 country code\n * @returns Promise with array of timezone names\n */\nexport async function getCountryTimezones(countryCode: string): Promise<string[]> {\n  const countryMeta = await getCountryByCode(countryCode);\n  if (!countryMeta || !countryMeta.timezones) {\n    return [];\n  }\n  return countryMeta.timezones.map((tz) => tz.zoneName);\n}\n"]}