{"version":3,"sources":["../../src/manifests/v3/index.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC;AAM3B,OAAO,KAAK,MAAM,MAAM,YAAY,CAAC;AACrC,OAAO,KAAK,MAAM,qBAAqB;AACvC,OAAO,KAAK,GAAG,sBAAsB;AACrC,OAAO,KAAK,SAAS,mBAAgC;AA4RrD,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAyB;gBAE7B,QAAQ,EAAE,MAAM,CAAC,eAAe;IAI5C,IAAI,IAAI,GAAG,CAAC,OAAO;IAcnB,IAAI,WAAW,uBAEd;IAED,IAAI,OAAO,uBAEV;IAED,IAAI,eAAe,cAQlB;IAED,IAAI,IAAI;;;;;;;;;MAYP;IAED,IAAI,OAAO,QA2BV;IAED,IAAI,aAAa,qCAEhB;IAED,IAAI,SAAS,kBAEZ;IAED,IAAI,WAAW,oBAKd;IAED,IAAI,iBAAiB,QAUpB;CACF;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,OAAO,CAAc;gBAEjB,QAAQ,EAAE,GAAG,CAAC,OAAO;IAIjC,IAAI,IAAI,uBAEP;IAED,IAAI,OAAO,uBAEV;IAED,IAAI,IAAI,QA4BP;IAED,IAAI,OAAO,QAYV;IAED,IAAI,aAAa,yBAEhB;IAED,IAAI,SAAS,qBAEZ;IAED,IAAI,WAAW,uBAEd;IAED,IAAI,iBAAiB,QAUpB;IAED,KAAK,IAAI,MAAM,CAAC,eAAe;CAsBhC;AAED,QAAA,MAAM,EAAE;;qBAGW,MAAM;iBAEJ,MAAM;;CAG1B,CAAC;AAEF,OAAO,EAAE,EAAE,EAAE,CAAC;AAEd,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC;IACxE,WAAW,cAAmB;IAExB,IAAI,IAAI,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC;CAGzC","file":"index.d.ts","sourcesContent":["\n/**\n * @module \"ethpm/manifests/v3\"\n */\n\nimport * as t from 'io-ts';\n\nimport { URL } from 'url';\nimport stringify from 'json-stable-stringify';\n\nimport { lift } from 'ethpm/types';\nimport * as schema from 'ethpm-spec';\nimport * as config from 'ethpm/config';\nimport * as pkg from 'ethpm/package';\nimport * as manifests from 'ethpm/manifests/service';\n\nconst deepEqual = require('deep-equal');\n\nconst VERSION = 'ethpm/3';\n\nnamespace Fields {\n  export function readContractTypes(contractTypes: schema.ContractTypes): pkg.ContractTypes {\n    return Object.assign(\n      {},\n      ...Object.entries(contractTypes)\n        .map(\n          ([alias, contractType]) => ({\n            [alias]: readContractType(contractType, alias),\n          }),\n        ),\n    );\n  }\n\n  export function readDeployments(\n    deployments: schema.Deployments,\n    types: pkg.ContractTypes,\n  ): pkg.Deployments {\n    return new Map(\n      Object.entries(deployments)\n        .map(\n          ([chainURI, deployment]) => ([\n            new URL(chainURI),\n            readDeployment(deployment, types),\n          ] as [pkg.ChainURI, pkg.Deployment]),\n        ),\n    );\n  }\n\n  export function readContractType(\n    contractType: schema.ContractType,\n    alias: string,\n  ): pkg.ContractType {\n    return {\n      contractName: contractType.contractName || alias,\n      deploymentBytecode: lift(readBytecode)(contractType.deploymentBytecode),\n      runtimeBytecode: lift(readBytecode)(contractType.runtimeBytecode),\n      abi: contractType.abi,\n      userdoc: contractType.userdoc,\n      devdoc: contractType.devdoc,\n      sourceId: contractType.sourceId,\n    };\n  }\n\n  export function readCompilers(\n    compilers: schema.Compilers,\n  ): pkg.Compilers {\n    return compilers\n  }\n\n  export function readBytecode(\n    bytecode?: schema.BytecodeObject,\n    parent?: pkg.Bytecode,\n  ): pkg.Bytecode | undefined {\n    // bytecode of some kind is required\n    if (!bytecode) {\n      return undefined;\n    }\n\n    const bytestring = (bytecode.bytecode)\n      ? bytecode.bytecode\n      : parent && parent.bytecode;\n\n    // needs bytestring itself or from parent\n    if (!bytestring) {\n      return undefined;\n    }\n\n    return {\n      bytecode: bytestring,\n      linkReferences: [...(\n        (bytecode.linkReferences)\n          ? bytecode.linkReferences\n          : (parent && parent.linkReferences)\n            ? parent.linkReferences\n            : []\n      )],\n      linkDependencies: readLinkDependencies(bytecode.linkDependencies),\n    };\n  }\n\n  export function readLinkDependencies(\n    linkDependencies: schema.LinkDependencies,\n  ): Array<pkg.Link.Value> {\n    return [\n      ...(linkDependencies || [])\n        .map(\n          ({ offsets, value, type }) => ({\n            offsets,\n            value: (type === 'literal')\n              ? {\n                value: value as string,\n                type: type as 'literal',\n              }\n              : {\n                value: value as string,\n                type: type as 'reference',\n              },\n          }),\n        ),\n    ];\n  }\n\n  export function readCompiler(compiler: schema.CompilerInformation): pkg.Compiler {\n    return { name: compiler.name, version: compiler.version,\n      settings: compiler.settings || {},\n    };\n  }\n\n  export function readDeployment(\n    deployment: schema.Deployment,\n    types: pkg.ContractTypes,\n  ): pkg.Deployment {\n    return Object.assign(\n      {}, ...Object.entries(deployment).map(\n        ([name, instance]) => ({\n          [name]: readInstance(instance, types),\n        }),\n      ),\n    );\n  }\n\n  export function readInstance(\n    instance: schema.ContractInstance,\n    types: pkg.ContractTypes,\n  ): pkg.ContractInstance {\n    return {\n      contractType: instance.contractType,\n      address: instance.address,\n      transaction: instance.transaction,\n      block: instance.block,\n      runtimeBytecode: readBytecode(\n        instance.runtimeBytecode,\n        (types[instance.contractType] || {}).runtimeBytecode,\n      ),\n    };\n  }\n\n\n  export function writeContractTypes(contractTypes: pkg.ContractTypes): schema.ContractTypes {\n    return Object.assign(\n      {},\n      ...Object.entries(contractTypes)\n        .map(\n          ([alias, contractType]) => ({\n            [alias]: writeContractType(contractType, alias),\n          }),\n        ),\n    );\n  }\n\n  export function writeDeployments(\n    deployments: pkg.Deployments,\n    types: pkg.ContractTypes,\n  ): schema.Deployments {\n    return Object.assign({}, ...Array.from(deployments.entries())\n      .map(([chainURI, deployment]) => ({\n        [chainURI.href]: writeDeployment(deployment, types),\n      })));\n  }\n\n  export function writeContractType(\n    contractType: pkg.ContractType,\n    alias: pkg.ContractAlias,\n  ): schema.ContractType {\n    return {\n      deploymentBytecode: lift(writeBytecode)(contractType.deploymentBytecode),\n      runtimeBytecode: lift(writeBytecode)(contractType.runtimeBytecode),\n      abi: contractType.abi,\n      devdoc: contractType.devdoc,\n      userdoc: contractType.userdoc,\n      sourceId: contractType.sourceId,\n\n      ...((contractType.contractName != alias)\n        ? { contractName: contractType.contractName }\n        : {}),\n    };\n  }\n\n  export function writeCompilers(\n    compilers: pkg.Compilers\n  ): schema.Compilers {\n    return compilers\n  }\n\n  export function writeBytecode(\n    bytecode: pkg.Bytecode,\n    parent?: pkg.Bytecode,\n  ): schema.BytecodeObject {\n    return {\n\n      // possibly include bytecode\n      ...((!parent || bytecode.bytecode != parent.bytecode)\n        ? { bytecode: bytecode.bytecode }\n        : {}),\n\n      // possibly include linkReferences\n      ...((\n        bytecode.linkReferences.length > 0 && (\n          !parent || !deepEqual(bytecode.linkReferences, parent.linkReferences)\n        )\n      )\n        ? { linkReferences: [...bytecode.linkReferences] }\n        : {}),\n\n      // possibly include linkDependencies\n      ...((\n        bytecode.linkDependencies.length > 0 && (\n          !parent\n            || !deepEqual(bytecode.linkDependencies, parent.linkDependencies)\n        )\n      )\n        ? { linkDependencies: writeLinkDependencies(bytecode.linkDependencies) }\n        : {}),\n    };\n  }\n\n  export function writeLinkDependencies(\n    linkDependencies: Array<pkg.Link.Value>,\n  ): schema.LinkDependencies {\n    return [\n      ...(linkDependencies || [])\n        .map(\n          ({ offsets, value }) => ({\n            offsets,\n            ...('type' in value ? { type: value.type } : {}),\n            ...('value' in value ? { value: value.value } : {}),\n          }),\n        ),\n    ];\n  }\n\n  export function writeCompiler(compiler: pkg.Compiler): schema.CompilerInformation {\n    return {\n      name: compiler.name,\n      version: compiler.version,\n      settings: compiler.settings,\n    };\n  }\n\n  export function writeDeployment(\n    deployment: pkg.Deployment,\n    types: pkg.ContractTypes,\n  ): schema.Deployment {\n    return Object.assign(\n      {}, ...Object.entries(deployment).map(\n        ([name, instance]) => ({\n          [name]: writeInstance(instance, types),\n        }),\n      ),\n    );\n  }\n\n  export function writeInstance(\n    instance: pkg.ContractInstance,\n    types: pkg.ContractTypes,\n  ): schema.ContractInstance {\n    // type ignore b/c undefined case is handled on 295\n    // @ts-ignore\n    return {\n      contractType: instance.contractType,\n      address: instance.address as schema.Address,\n\n      ...((instance.runtimeBytecode)\n        ? {\n          runtimeBytecode: writeBytecode(\n            instance.runtimeBytecode,\n            (types[instance.contractType] || {}).runtimeBytecode,\n          ),\n        }\n        : {}),\n\n      ...(instance.transaction ? { transaction: instance.transaction } : {}),\n\n      ...(instance.block ? { block: instance.block } : {}),\n    };\n  }\n}\n\nexport class Reader {\n  private manifest: schema.PackageManifest;\n\n  constructor(manifest: schema.PackageManifest) {\n    this.manifest = manifest;\n  }\n\n  read(): pkg.Package {\n    return {\n      packageName: this.packageName,\n      version: this.version,\n      manifest: this.manifestVersion,\n      meta: this.meta,\n      sources: this.sources,\n      contractTypes: this.contractTypes,\n      compilers: this.compilers,\n      deployments: this.deployments,\n      buildDependencies: this.buildDependencies,\n    };\n  }\n\n  get packageName() {\n    return this.manifest.name;\n  }\n\n  get version() {\n    return this.manifest.version;\n  }\n\n  get manifestVersion() {\n    if (typeof this.manifest.manifest === 'undefined') {\n      return VERSION;\n    } else if (this.manifest.manifest !== VERSION) {\n      throw new Error(`Unsupported manifest version ${this.manifest.manifest}`);\n    } else {\n      return this.manifest.manifest;\n    }\n  }\n\n  get meta() {\n    const metadata = this.manifest.meta || {};\n\n    return {\n      authors: metadata.authors,\n      license: metadata.license,\n      description: metadata.description as pkg.Meta.Description,\n      keywords: metadata.keywords as Array<pkg.Meta.Keyword>,\n      links: Object.entries(metadata.links || {}).map(\n        ([resource, uri]) => ({ resource, uri }),\n      ),\n    };\n  }\n\n  get sources() {\n    const sources = this.manifest.sources || {};\n\n    return Object.assign(\n      {},\n      ...Object.entries(sources)\n        .map(([path, sourceObject]) => {\n          const installPath = path.startsWith(\"./\") ? path : `./${path}`\n          try {\n            return { \n              [path]: {\n                installPath: installPath,\n                type: \"solidity\",\n                urls: [new URL(sourceObject['urls'][0]) as pkg.ContentURI],\n              }\n            };\n          } catch (e) {\n            return { \n              [path]: {\n                installPath: installPath,\n                type: \"solidity\",\n                content: sourceObject['content'] as pkg.SourceString,\n              }\n            };\n          }\n        }),\n    );\n  }\n\n  get contractTypes() {\n    return Fields.readContractTypes(this.manifest.contractTypes || {});\n  }\n\n  get compilers() {\n    return Fields.readCompilers(this.manifest.compilers || []);\n  }\n\n  get deployments() {\n    return Fields.readDeployments(\n      this.manifest.deployments || {},\n      this.contractTypes,\n    );\n  }\n\n  get buildDependencies() {\n    return Object.assign(\n      {},\n      ...Object.entries(this.manifest.buildDependencies || {})\n        .map(\n          ([name, contentURI]) => ({\n            [name]: new URL(contentURI),\n          }),\n        ),\n    );\n  }\n}\n\nexport class Writer {\n  private package: pkg.Package;\n\n  constructor(package_: pkg.Package) {\n    this.package = package_;\n  }\n\n  get name() {\n    return this.package.packageName;\n  }\n\n  get version() {\n    return this.package.version;\n  }\n\n  get meta() {\n    const metadata = this.package.meta;\n\n    return Object.assign(\n      (metadata.authors && metadata.authors.length > 0)\n        ? { authors: metadata.authors }\n        : {},\n\n      (metadata.license)\n        ? { license: metadata.license }\n        : {},\n\n      (metadata.description)\n        ? { description: metadata.description }\n        : {},\n\n      (metadata.keywords && metadata.keywords.length > 0)\n        ? { keywords: metadata.keywords }\n        : {},\n\n      (metadata.links && metadata.links.length > 0)\n        ? {\n          links: Object.assign({}, ...metadata.links.map(\n            ({ resource, uri }) => ({ [resource]: uri }),\n          )),\n        }\n        : {},\n    );\n  }\n\n  get sources() {\n    const { sources } = this.package;\n\n    return Object.assign(\n      {},\n      ...Object.entries(sources)\n        .map(\n          ([path, source]) => ((source instanceof URL)\n            ? { [path]: source.href }\n            : { [path]: source }),\n        ),\n    );\n  }\n\n  get contractTypes() {\n    return Fields.writeContractTypes(this.package.contractTypes);\n  }\n\n  get compilers() {\n    return Fields.writeCompilers(this.package.compilers);\n  }\n\n  get deployments() {\n    return Fields.writeDeployments(this.package.deployments, this.package.contractTypes);\n  }\n\n  get buildDependencies() {\n    return Object.assign(\n      {},\n      ...Object.entries(this.package.buildDependencies)\n        .map(\n          ([name, contentURI]) => ({\n            [name]: contentURI.href,\n          }),\n        ),\n    );\n  }\n\n  write(): schema.PackageManifest {\n    return Object.assign(\n      {\n        manifest: VERSION,\n        name: this.name,\n        version: this.version,\n      },\n\n      ...Object.entries({\n        deployments: this.deployments,\n        contractTypes: this.contractTypes,\n        compilers: this.compilers,\n        sources: this.sources,\n        buildDependencies: this.buildDependencies,\n        meta: this.meta,\n      }).map(\n        ([field, obj]) => ((Object.keys(obj).length > 0)\n          ? { [field]: obj }\n          : {}),\n      ),\n    ) as schema.PackageManifest;\n  }\n}\n\nconst v3 = {\n  version: VERSION,\n\n  readSync: (json: string) => new Reader(JSON.parse(json) as schema.PackageManifest).read(),\n\n  read: async (json: string) => new Reader(JSON.parse(json) as schema.PackageManifest).read(),\n\n  write: async (pkg: pkg.Package) => stringify(await new Writer(pkg).write()),\n};\n\nexport { v3 };\n\nexport default class Connector extends config.Connector<manifests.Service> {\n  optionsType = t.interface({});\n\n  async init(): Promise<manifests.Service> {\n    return v3;\n  }\n}\n"]}