From cea9063c7c2b3f76bfd7b69efd7ca5c54eb613be Mon Sep 17 00:00:00 2001 From: Volker Mische Date: Fri, 26 Mar 2021 12:21:19 +0100 Subject: [PATCH] feat!: named exports instead of default exports It also removes the `Codec` class and exports a plain object instead. This has consequences for imports. BREAKING CHANGE: Only use names exports as default exports don't play well with CommonJS + Typescript typing. This means that when you use ESM imports, e.g. the raw codec is no longer imported as ```js import raw from 'multiformats/codecs/raw' ``` but as ```js import * as raw from 'multiformats/codecs/raw' ``` The CJS import for codecs don't change, it's still `const raw = require('multiformats/codecs/raw`. Though other imports change, so ```js import CID from 'multiformats/cid' const CID = require('multiformats/cid') ``` is now ```js import { CID } from 'multiformats/cid' const { CID } = require ('multiformats/cid') ``` --- README.md | 4 ++-- src/basics.js | 4 ++-- src/bytes.js | 3 ++- src/cid.js | 2 +- src/codecs/codec.js | 51 ++++++----------------------------------- src/codecs/interface.ts | 5 +++- src/codecs/json.js | 2 +- src/codecs/raw.js | 12 +++------- src/hashes/identity.js | 2 +- src/index.js | 2 +- src/legacy.js | 5 ++-- test/test-block.js | 2 +- test/test-legacy.js | 8 +++---- test/test-multicodec.js | 4 ++-- test/test-multihash.js | 2 +- test/ts-use/src/main.ts | 2 +- 16 files changed, 35 insertions(+), 75 deletions(-) diff --git a/README.md b/README.md index 37ba16df..36c55794 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,8 @@ Library provides implementations for most basics and many others can be found in ## Interfaces ```js -import CID from 'multiformats/cid' -import json from 'multiformats/codecs/json' +import { CID } from 'multiformats/cid' +import * as json from 'multiformats/codecs/json' import { sha256 } from 'multiformats/hashes/sha2' const bytes = json.encode({ hello: 'world' }) diff --git a/src/basics.js b/src/basics.js index 66974a19..8c183b3d 100644 --- a/src/basics.js +++ b/src/basics.js @@ -4,8 +4,8 @@ import * as base32 from './bases/base32.js' import * as base58 from './bases/base58.js' import * as sha2 from './hashes/sha2.js' -import raw from './codecs/raw.js' -import json from './codecs/json.js' +import * as raw from './codecs/raw.js' +import * as json from './codecs/json.js' import { CID, hasher, digest, varint, bytes } from './index.js' diff --git a/src/bytes.js b/src/bytes.js index 6774d44a..a10ce3ec 100644 --- a/src/bytes.js +++ b/src/bytes.js @@ -33,7 +33,8 @@ const equals = (aa, bb) => { } /** - * @param {ArrayBufferView|ArrayBuffer} o + * @param {ArrayBufferView|ArrayBuffer|Uint8Array} o + * @returns {Uint8Array} */ const coerce = o => { if (o instanceof Uint8Array && o.constructor.name === 'Uint8Array') return o diff --git a/src/cid.js b/src/cid.js index cd5fbb54..57b47fa0 100644 --- a/src/cid.js +++ b/src/cid.js @@ -18,7 +18,7 @@ import { coerce } from './bytes.js' * @typedef {import('./bases/interface').MultibaseDecoder} MultibaseDecoder */ -export default class CID { +export class CID { /** * @param {0|1} version * @param {number} code diff --git a/src/codecs/codec.js b/src/codecs/codec.js index 5dd08675..c1bd94aa 100644 --- a/src/codecs/codec.js +++ b/src/codecs/codec.js @@ -10,9 +10,14 @@ * @param {Code} options.code * @param {(data:T) => Uint8Array} options.encode * @param {(bytes:Uint8Array) => T} options.decode + * @returns {import('./interface').BlockCodec} */ -export const codec = ({ name, code, decode, encode }) => - new Codec(name, code, encode, decode) +export const codec = ({ name, code, decode, encode }) => { + const decoder = new Decoder(name, code, decode) + const encoder = new Encoder(name, code, encode) + + return { name, code, decode, encode, decoder, encoder } +} /** * @template {number} Code @@ -64,45 +69,3 @@ export class Decoder { this.decode = decode } } - -/** - * @template {number} Code - * @template T - * @typedef {import('./interface').BlockCodec} BlockCodec - */ - -/** - * @class - * @template {string} Name - * @template {number} Code - * @template T - * @implements {BlockCodec} - */ -export class Codec { - /** - * @param {Name} name - * @param {Code} code - * @param {(data:T) => Uint8Array} encode - * @param {(bytes:Uint8Array) => T} decode - */ - constructor (name, code, encode, decode) { - this.name = name - this.code = code - this.encode = encode - this.decode = decode - } - - get decoder () { - const { name, code, decode } = this - const decoder = new Decoder(name, code, decode) - Object.defineProperty(this, 'decoder', { value: decoder }) - return decoder - } - - get encoder () { - const { name, code, encode } = this - const encoder = new Encoder(name, code, encode) - Object.defineProperty(this, 'encoder', { value: encoder }) - return encoder - } -} diff --git a/src/codecs/interface.ts b/src/codecs/interface.ts index 3474ff38..e7a98b52 100644 --- a/src/codecs/interface.ts +++ b/src/codecs/interface.ts @@ -20,7 +20,10 @@ export interface BlockDecoder { * separate those capabilties as sender requires encoder and receiver * requires decoder. */ -export interface BlockCodec extends BlockEncoder, BlockDecoder { } +export interface BlockCodec extends BlockEncoder, BlockDecoder { + encoder: BlockEncoder, + decoder: BlockDecoder +} // This just a hack to retain type information abouth the data that diff --git a/src/codecs/json.js b/src/codecs/json.js index c0bc11de..09ea2a09 100644 --- a/src/codecs/json.js +++ b/src/codecs/json.js @@ -2,7 +2,7 @@ import { codec } from './codec.js' -export default codec({ +export const { name, code, decode, encode, decoder, encoder } = codec({ name: 'json', code: 0x0200, encode: json => new TextEncoder().encode(JSON.stringify(json)), diff --git a/src/codecs/raw.js b/src/codecs/raw.js index b17fe69c..f2ee233f 100644 --- a/src/codecs/raw.js +++ b/src/codecs/raw.js @@ -3,15 +3,9 @@ import { coerce } from '../bytes.js' import { codec } from './codec.js' -/** - * @param {Uint8Array} bytes - * @returns {Uint8Array} - */ -const raw = (bytes) => coerce(bytes) - -export default codec({ +export const { name, code, decode, encode, decoder, encoder } = codec({ name: 'raw', code: 85, - decode: raw, - encode: raw + decode: coerce, + encode: coerce }) diff --git a/src/hashes/identity.js b/src/hashes/identity.js index 700cb7cc..1a928578 100644 --- a/src/hashes/identity.js +++ b/src/hashes/identity.js @@ -3,7 +3,7 @@ import { from } from './hasher.js' import { coerce } from '../bytes.js' -export default from({ +export const identity = from({ name: 'identity', code: 0x0, encode: (input) => coerce(input) diff --git a/src/index.js b/src/index.js index 989edc65..15931971 100644 --- a/src/index.js +++ b/src/index.js @@ -1,4 +1,4 @@ -import CID from './cid.js' +import { CID } from './cid.js' import * as varint from './varint.js' import * as bytes from './bytes.js' import * as hasher from './hashes/hasher.js' diff --git a/src/legacy.js b/src/legacy.js index c179e8e1..9ce81e4e 100644 --- a/src/legacy.js +++ b/src/legacy.js @@ -1,7 +1,7 @@ import OldCID from 'cids' import * as bytes from './bytes.js' import { Buffer } from 'buffer' -import CID from './cid.js' +import { CID } from './cid.js' /** * @template {number} Code @@ -11,7 +11,7 @@ import CID from './cid.js' * @param {Object} options.hashes */ -const legacy = (codec, { hashes }) => { +export const legacy = (codec, { hashes }) => { /** * @param {*} obj */ @@ -139,7 +139,6 @@ const legacy = (codec, { hashes }) => { return { defaultHashAlg, codec: codec.code, util, resolver } } -export default legacy /** * @typedef {import('./hashes/interface').MultihashHasher} MultihashHasher */ diff --git a/test/test-block.js b/test/test-block.js index 8521b170..a7be1999 100644 --- a/test/test-block.js +++ b/test/test-block.js @@ -1,5 +1,5 @@ /* globals describe, it */ -import codec from 'multiformats/codecs/json' +import * as codec from 'multiformats/codecs/json' import { sha256 as hasher } from 'multiformats/hashes/sha2' import * as main from 'multiformats/block' import { CID, bytes } from 'multiformats' diff --git a/test/test-legacy.js b/test/test-legacy.js index e856cbc8..4e0468d0 100644 --- a/test/test-legacy.js +++ b/test/test-legacy.js @@ -1,12 +1,12 @@ /* globals before, describe, it */ import { Buffer } from 'buffer' import assert from 'assert' -import legacy from 'multiformats/legacy' -import rawCodec from 'multiformats/codecs/raw' -import jsonCodec from 'multiformats/codecs/json' +import { legacy } from 'multiformats/legacy' +import * as rawCodec from 'multiformats/codecs/raw' +import * as jsonCodec from 'multiformats/codecs/json' import { sha256, sha512 } from 'multiformats/hashes/sha2' import { codec } from 'multiformats/codecs/codec' -import CID from 'multiformats/cid' +import { CID } from 'multiformats/cid' const same = assert.deepStrictEqual const test = it diff --git a/test/test-multicodec.js b/test/test-multicodec.js index 3ab9b44a..38668b69 100644 --- a/test/test-multicodec.js +++ b/test/test-multicodec.js @@ -1,8 +1,8 @@ /* globals describe, it */ import * as bytes from '../src/bytes.js' import assert from 'assert' -import raw from 'multiformats/codecs/raw' -import json from 'multiformats/codecs/json' +import * as raw from 'multiformats/codecs/raw' +import * as json from 'multiformats/codecs/json' import { codec } from 'multiformats/codecs/codec' const same = assert.deepStrictEqual const test = it diff --git a/test/test-multihash.js b/test/test-multihash.js index 6ebef024..f11c8135 100644 --- a/test/test-multihash.js +++ b/test/test-multihash.js @@ -5,7 +5,7 @@ import valid from './fixtures/valid-multihash.js' import invalid from './fixtures/invalid-multihash.js' import crypto from 'crypto' import { sha256, sha512, __browser } from 'multiformats/hashes/sha2' -import identity from 'multiformats/hashes/identity' +import { identity } from 'multiformats/hashes/identity' import { decode as decodeDigest, create as createDigest } from 'multiformats/hashes/digest' const test = it const encode = name => data => coerce(crypto.createHash(name).update(data).digest()) diff --git a/test/ts-use/src/main.ts b/test/ts-use/src/main.ts index cbb376e9..d57c5688 100644 --- a/test/ts-use/src/main.ts +++ b/test/ts-use/src/main.ts @@ -1,6 +1,6 @@ import * as Block from 'multiformats/block' import { sha256 } from 'multiformats/hashes/sha2' -import json from 'multiformats/codecs/json' +import * as json from 'multiformats/codecs/json' const main = async () => { const block = await Block.encode({