{
  "version": 3,
  "sources": ["../system.ts", "../index.browser.ts"],
  "sourcesContent": ["export abstract class FileSystem {\n  abstract readonly root: string\n  abstract readonly sep: string\n  abstract readonly type: 'zip' | 'path'\n  abstract readonly writeable: boolean\n\n  // base methods\n\n  abstract join(...paths: string[]): string\n\n  abstract isDirectory(name: string): Promise<boolean>\n  abstract existsFile(name: string): Promise<boolean>\n  abstract readFile(name: string, encoding: 'utf-8' | 'base64'): Promise<string>\n  abstract readFile(name: string, encoding: undefined): Promise<Uint8Array>\n  abstract readFile(name: string): Promise<Uint8Array>\n  abstract readFile(name: string, encoding?: 'utf-8' | 'base64'): Promise<Uint8Array | string>\n\n  /**\n     * Get the url for a file entry. If the system does not support get url. This should return an empty string.\n     */\n  getUrl(name: string): string { return '' }\n\n  abstract listFiles(name: string): Promise<string[]>\n\n  abstract cd(name: string): void\n\n  isClosed(): boolean { return false }\n  close(): void { }\n\n  // extension methods\n\n  async missingFile(name: string) {\n    return this.existsFile(name).then((v) => !v)\n  }\n\n  async walkFiles(target: string, walker: (path: string) => void | Promise<void>) {\n    if (await this.isDirectory(target)) {\n      const childs = await this.listFiles(target)\n      for (const child of childs) {\n        await this.walkFiles(this.join(target, child), walker)\n      }\n    } else {\n      const result = walker(this.join(target))\n      if (result instanceof Promise) {\n        await result\n      }\n    }\n  }\n}\n", "import { FileSystem } from './system'\nimport JSZip from 'jszip'\n\nclass JSZipFS extends FileSystem {\n  sep = '/'\n  type: 'zip' | 'path' = 'zip'\n  writeable = true\n  root = ''\n\n  protected normalizePath(path: string): string {\n    if (path.startsWith('/')) {\n      path = path.substring(1)\n    }\n    if (this.root !== '') {\n      path = [this.root, path].join('/')\n    }\n    return path\n  }\n\n  join(...paths: string[]): string {\n    return paths.join('/')\n  }\n\n  isDirectory(name: string): Promise<boolean> {\n    name = this.normalizePath(name)\n    name = name.endsWith('/') ? name : name + '/'\n    return Promise.resolve(Object.keys(this.zip.files).some((e) => e.startsWith(name)))\n  }\n\n  async writeFile(name: string, data: Uint8Array): Promise<void> {\n    name = this.normalizePath(name)\n    this.zip.file(name, data)\n  }\n\n  existsFile(name: string): Promise<boolean> {\n    name = this.normalizePath(name)\n    if (this.zip.files[name] !== undefined) { return Promise.resolve(true) }\n    return this.isDirectory(name)\n  }\n\n  readFile(name: any, encoding?: any): Promise<any> {\n    name = this.normalizePath(name)\n    if (!encoding) {\n      return this.zip.files[name].async('uint8array')\n    }\n    if (encoding === 'utf-8') {\n      return this.zip.files[name].async('text')\n    }\n    if (encoding === 'base64') {\n      return this.zip.files[name].async('base64')\n    }\n    throw new TypeError(`Expect encoding to be utf-8/base64 or empty. Got ${encoding}.`)\n  }\n\n  async listFiles(name: string): Promise<string[]> {\n    if (!await this.isDirectory(name)) { return Promise.reject(new TypeError('Require a directory!')) }\n    name = this.normalizePath(name)\n    return Promise.resolve(Object.keys(this.zip.files)\n      .filter((e) => e.startsWith(name))\n      .map((e) => e.substring(name.length))\n      .map((e) => e.startsWith('/') ? e.substring(1) : e)\n      .map((e) => e.split('/')[0]))\n  }\n\n  cd(name: string): void {\n    if (name.startsWith('/')) {\n      this.root = name.substring(1)\n      return\n    }\n    const paths = name.split('/')\n    for (const path of paths) {\n      if (path === '.') {\n        continue\n      } else if (path === '..') {\n        const sub = this.root.split('/')\n        if (sub.length > 0) {\n          sub.pop()\n          this.root = sub.join('/')\n        }\n      } else {\n        if (this.root === '') {\n          this.root = path\n        } else {\n          this.root += `/${path}`\n        }\n      }\n    }\n  }\n\n  constructor(private zip: JSZip) { super() }\n}\n\nexport async function openFileSystem(basePath: string | Uint8Array): Promise<FileSystem> {\n  if (typeof basePath === 'string') { throw new Error('Unsupported') }\n  return new JSZipFS(await JSZip.loadAsync(basePath))\n}\nexport function resolveFileSystem(base: string | Uint8Array | FileSystem): Promise<FileSystem> {\n  if (typeof base === 'string' || base instanceof Uint8Array) {\n    return openFileSystem(base)\n  } else {\n    return Promise.resolve(base)\n  }\n}\n\nexport * from './system'\n"],
  "mappings": ";;;;;;;;AAAO,IAAe,aAAf,MAA0B;AAAA;AAAA;AAAA;AAAA,EAoB/B,OAAO,MAAsB;AAAE,WAAO;AAAA,EAAG;AAAA,EAMzC,WAAoB;AAAE,WAAO;AAAA,EAAM;AAAA,EACnC,QAAc;AAAA,EAAE;AAAA;AAAA,EAIhB,MAAM,YAAY,MAAc;AAC9B,WAAO,KAAK,WAAW,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;AAAA,EAC7C;AAAA,EAEA,MAAM,UAAU,QAAgB,QAAgD;AAC9E,QAAI,MAAM,KAAK,YAAY,MAAM,GAAG;AAClC,YAAM,SAAS,MAAM,KAAK,UAAU,MAAM;AAC1C,iBAAW,SAAS,QAAQ;AAC1B,cAAM,KAAK,UAAU,KAAK,KAAK,QAAQ,KAAK,GAAG,MAAM;AAAA,MACvD;AAAA,IACF,OAAO;AACL,YAAM,SAAS,OAAO,KAAK,KAAK,MAAM,CAAC;AACvC,UAAI,kBAAkB,SAAS;AAC7B,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;;;AC/CA,OAAO,WAAW;AAElB,IAAM,UAAN,cAAsB,WAAW;AAAA,EAsF/B,YAAoB,KAAY;AAAE,UAAM;AAApB;AArFpB,+BAAM;AACN,gCAAuB;AACvB,qCAAY;AACZ,gCAAO;AAAA,EAkFmC;AAAA,EAhFhC,cAAc,MAAsB;AAC5C,QAAI,KAAK,WAAW,GAAG,GAAG;AACxB,aAAO,KAAK,UAAU,CAAC;AAAA,IACzB;AACA,QAAI,KAAK,SAAS,IAAI;AACpB,aAAO,CAAC,KAAK,MAAM,IAAI,EAAE,KAAK,GAAG;AAAA,IACnC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,OAAyB;AAC/B,WAAO,MAAM,KAAK,GAAG;AAAA,EACvB;AAAA,EAEA,YAAY,MAAgC;AAC1C,WAAO,KAAK,cAAc,IAAI;AAC9B,WAAO,KAAK,SAAS,GAAG,IAAI,OAAO,OAAO;AAC1C,WAAO,QAAQ,QAAQ,OAAO,KAAK,KAAK,IAAI,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,IAAI,CAAC,CAAC;AAAA,EACpF;AAAA,EAEA,MAAM,UAAU,MAAc,MAAiC;AAC7D,WAAO,KAAK,cAAc,IAAI;AAC9B,SAAK,IAAI,KAAK,MAAM,IAAI;AAAA,EAC1B;AAAA,EAEA,WAAW,MAAgC;AACzC,WAAO,KAAK,cAAc,IAAI;AAC9B,QAAI,KAAK,IAAI,MAAM,IAAI,MAAM,QAAW;AAAE,aAAO,QAAQ,QAAQ,IAAI;AAAA,IAAE;AACvE,WAAO,KAAK,YAAY,IAAI;AAAA,EAC9B;AAAA,EAEA,SAAS,MAAW,UAA8B;AAChD,WAAO,KAAK,cAAc,IAAI;AAC9B,QAAI,CAAC,UAAU;AACb,aAAO,KAAK,IAAI,MAAM,IAAI,EAAE,MAAM,YAAY;AAAA,IAChD;AACA,QAAI,aAAa,SAAS;AACxB,aAAO,KAAK,IAAI,MAAM,IAAI,EAAE,MAAM,MAAM;AAAA,IAC1C;AACA,QAAI,aAAa,UAAU;AACzB,aAAO,KAAK,IAAI,MAAM,IAAI,EAAE,MAAM,QAAQ;AAAA,IAC5C;AACA,UAAM,IAAI,UAAU,oDAAoD,WAAW;AAAA,EACrF;AAAA,EAEA,MAAM,UAAU,MAAiC;AAC/C,QAAI,CAAC,MAAM,KAAK,YAAY,IAAI,GAAG;AAAE,aAAO,QAAQ,OAAO,IAAI,UAAU,sBAAsB,CAAC;AAAA,IAAE;AAClG,WAAO,KAAK,cAAc,IAAI;AAC9B,WAAO,QAAQ,QAAQ,OAAO,KAAK,KAAK,IAAI,KAAK,EAC9C,OAAO,CAAC,MAAM,EAAE,WAAW,IAAI,CAAC,EAChC,IAAI,CAAC,MAAM,EAAE,UAAU,KAAK,MAAM,CAAC,EACnC,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,EACjD,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC;AAAA,EAChC;AAAA,EAEA,GAAG,MAAoB;AACrB,QAAI,KAAK,WAAW,GAAG,GAAG;AACxB,WAAK,OAAO,KAAK,UAAU,CAAC;AAC5B;AAAA,IACF;AACA,UAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,eAAW,QAAQ,OAAO;AACxB,UAAI,SAAS,KAAK;AAChB;AAAA,MACF,WAAW,SAAS,MAAM;AACxB,cAAM,MAAM,KAAK,KAAK,MAAM,GAAG;AAC/B,YAAI,IAAI,SAAS,GAAG;AAClB,cAAI,IAAI;AACR,eAAK,OAAO,IAAI,KAAK,GAAG;AAAA,QAC1B;AAAA,MACF,OAAO;AACL,YAAI,KAAK,SAAS,IAAI;AACpB,eAAK,OAAO;AAAA,QACd,OAAO;AACL,eAAK,QAAQ,IAAI;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGF;AAEA,eAAsB,eAAe,UAAoD;AACvF,MAAI,OAAO,aAAa,UAAU;AAAE,UAAM,IAAI,MAAM,aAAa;AAAA,EAAE;AACnE,SAAO,IAAI,QAAQ,MAAM,MAAM,UAAU,QAAQ,CAAC;AACpD;AACO,SAAS,kBAAkB,MAA6D;AAC7F,MAAI,OAAO,SAAS,YAAY,gBAAgB,YAAY;AAC1D,WAAO,eAAe,IAAI;AAAA,EAC5B,OAAO;AACL,WAAO,QAAQ,QAAQ,IAAI;AAAA,EAC7B;AACF;",
  "names": []
}
