Skip to content

Commit cea9063

Browse files
vmxrvagg
authored andcommitted
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') ```
1 parent 5fccaba commit cea9063

16 files changed

+35
-75
lines changed

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ Library provides implementations for most basics and many others can be found in
99
## Interfaces
1010

1111
```js
12-
import CID from 'multiformats/cid'
13-
import json from 'multiformats/codecs/json'
12+
import { CID } from 'multiformats/cid'
13+
import * as json from 'multiformats/codecs/json'
1414
import { sha256 } from 'multiformats/hashes/sha2'
1515

1616
const bytes = json.encode({ hello: 'world' })

src/basics.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import * as base32 from './bases/base32.js'
44
import * as base58 from './bases/base58.js'
55
import * as sha2 from './hashes/sha2.js'
66

7-
import raw from './codecs/raw.js'
8-
import json from './codecs/json.js'
7+
import * as raw from './codecs/raw.js'
8+
import * as json from './codecs/json.js'
99

1010
import { CID, hasher, digest, varint, bytes } from './index.js'
1111

src/bytes.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ const equals = (aa, bb) => {
3333
}
3434

3535
/**
36-
* @param {ArrayBufferView|ArrayBuffer} o
36+
* @param {ArrayBufferView|ArrayBuffer|Uint8Array} o
37+
* @returns {Uint8Array}
3738
*/
3839
const coerce = o => {
3940
if (o instanceof Uint8Array && o.constructor.name === 'Uint8Array') return o

src/cid.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { coerce } from './bytes.js'
1818
* @typedef {import('./bases/interface').MultibaseDecoder<Prefix>} MultibaseDecoder
1919
*/
2020

21-
export default class CID {
21+
export class CID {
2222
/**
2323
* @param {0|1} version
2424
* @param {number} code

src/codecs/codec.js

+7-44
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,14 @@
1010
* @param {Code} options.code
1111
* @param {(data:T) => Uint8Array} options.encode
1212
* @param {(bytes:Uint8Array) => T} options.decode
13+
* @returns {import('./interface').BlockCodec<Code, T>}
1314
*/
14-
export const codec = ({ name, code, decode, encode }) =>
15-
new Codec(name, code, encode, decode)
15+
export const codec = ({ name, code, decode, encode }) => {
16+
const decoder = new Decoder(name, code, decode)
17+
const encoder = new Encoder(name, code, encode)
18+
19+
return { name, code, decode, encode, decoder, encoder }
20+
}
1621

1722
/**
1823
* @template {number} Code
@@ -64,45 +69,3 @@ export class Decoder {
6469
this.decode = decode
6570
}
6671
}
67-
68-
/**
69-
* @template {number} Code
70-
* @template T
71-
* @typedef {import('./interface').BlockCodec<Code, T>} BlockCodec
72-
*/
73-
74-
/**
75-
* @class
76-
* @template {string} Name
77-
* @template {number} Code
78-
* @template T
79-
* @implements {BlockCodec<Code, T>}
80-
*/
81-
export class Codec {
82-
/**
83-
* @param {Name} name
84-
* @param {Code} code
85-
* @param {(data:T) => Uint8Array} encode
86-
* @param {(bytes:Uint8Array) => T} decode
87-
*/
88-
constructor (name, code, encode, decode) {
89-
this.name = name
90-
this.code = code
91-
this.encode = encode
92-
this.decode = decode
93-
}
94-
95-
get decoder () {
96-
const { name, code, decode } = this
97-
const decoder = new Decoder(name, code, decode)
98-
Object.defineProperty(this, 'decoder', { value: decoder })
99-
return decoder
100-
}
101-
102-
get encoder () {
103-
const { name, code, encode } = this
104-
const encoder = new Encoder(name, code, encode)
105-
Object.defineProperty(this, 'encoder', { value: encoder })
106-
return encoder
107-
}
108-
}

src/codecs/interface.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ export interface BlockDecoder<Code extends number, T> {
2020
* separate those capabilties as sender requires encoder and receiver
2121
* requires decoder.
2222
*/
23-
export interface BlockCodec<Code extends number, T> extends BlockEncoder<Code, T>, BlockDecoder<Code, T> { }
23+
export interface BlockCodec<Code extends number, T> extends BlockEncoder<Code, T>, BlockDecoder<Code, T> {
24+
encoder: BlockEncoder<Code, T>,
25+
decoder: BlockDecoder<Code, T>
26+
}
2427

2528

2629
// This just a hack to retain type information abouth the data that

src/codecs/json.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import { codec } from './codec.js'
44

5-
export default codec({
5+
export const { name, code, decode, encode, decoder, encoder } = codec({
66
name: 'json',
77
code: 0x0200,
88
encode: json => new TextEncoder().encode(JSON.stringify(json)),

src/codecs/raw.js

+3-9
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,9 @@
33
import { coerce } from '../bytes.js'
44
import { codec } from './codec.js'
55

6-
/**
7-
* @param {Uint8Array} bytes
8-
* @returns {Uint8Array}
9-
*/
10-
const raw = (bytes) => coerce(bytes)
11-
12-
export default codec({
6+
export const { name, code, decode, encode, decoder, encoder } = codec({
137
name: 'raw',
148
code: 85,
15-
decode: raw,
16-
encode: raw
9+
decode: coerce,
10+
encode: coerce
1711
})

src/hashes/identity.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import { from } from './hasher.js'
44
import { coerce } from '../bytes.js'
55

6-
export default from({
6+
export const identity = from({
77
name: 'identity',
88
code: 0x0,
99
encode: (input) => coerce(input)

src/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import CID from './cid.js'
1+
import { CID } from './cid.js'
22
import * as varint from './varint.js'
33
import * as bytes from './bytes.js'
44
import * as hasher from './hashes/hasher.js'

src/legacy.js

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import OldCID from 'cids'
22
import * as bytes from './bytes.js'
33
import { Buffer } from 'buffer'
4-
import CID from './cid.js'
4+
import { CID } from './cid.js'
55

66
/**
77
* @template {number} Code
@@ -11,7 +11,7 @@ import CID from './cid.js'
1111
* @param {Object<string, MultihashHasher>} options.hashes
1212
*/
1313

14-
const legacy = (codec, { hashes }) => {
14+
export const legacy = (codec, { hashes }) => {
1515
/**
1616
* @param {*} obj
1717
*/
@@ -139,7 +139,6 @@ const legacy = (codec, { hashes }) => {
139139
return { defaultHashAlg, codec: codec.code, util, resolver }
140140
}
141141

142-
export default legacy
143142
/**
144143
* @typedef {import('./hashes/interface').MultihashHasher} MultihashHasher
145144
*/

test/test-block.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* globals describe, it */
2-
import codec from 'multiformats/codecs/json'
2+
import * as codec from 'multiformats/codecs/json'
33
import { sha256 as hasher } from 'multiformats/hashes/sha2'
44
import * as main from 'multiformats/block'
55
import { CID, bytes } from 'multiformats'

test/test-legacy.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
/* globals before, describe, it */
22
import { Buffer } from 'buffer'
33
import assert from 'assert'
4-
import legacy from 'multiformats/legacy'
5-
import rawCodec from 'multiformats/codecs/raw'
6-
import jsonCodec from 'multiformats/codecs/json'
4+
import { legacy } from 'multiformats/legacy'
5+
import * as rawCodec from 'multiformats/codecs/raw'
6+
import * as jsonCodec from 'multiformats/codecs/json'
77
import { sha256, sha512 } from 'multiformats/hashes/sha2'
88
import { codec } from 'multiformats/codecs/codec'
9-
import CID from 'multiformats/cid'
9+
import { CID } from 'multiformats/cid'
1010

1111
const same = assert.deepStrictEqual
1212
const test = it

test/test-multicodec.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
/* globals describe, it */
22
import * as bytes from '../src/bytes.js'
33
import assert from 'assert'
4-
import raw from 'multiformats/codecs/raw'
5-
import json from 'multiformats/codecs/json'
4+
import * as raw from 'multiformats/codecs/raw'
5+
import * as json from 'multiformats/codecs/json'
66
import { codec } from 'multiformats/codecs/codec'
77
const same = assert.deepStrictEqual
88
const test = it

test/test-multihash.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import valid from './fixtures/valid-multihash.js'
55
import invalid from './fixtures/invalid-multihash.js'
66
import crypto from 'crypto'
77
import { sha256, sha512, __browser } from 'multiformats/hashes/sha2'
8-
import identity from 'multiformats/hashes/identity'
8+
import { identity } from 'multiformats/hashes/identity'
99
import { decode as decodeDigest, create as createDigest } from 'multiformats/hashes/digest'
1010
const test = it
1111
const encode = name => data => coerce(crypto.createHash(name).update(data).digest())

test/ts-use/src/main.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as Block from 'multiformats/block'
22
import { sha256 } from 'multiformats/hashes/sha2'
3-
import json from 'multiformats/codecs/json'
3+
import * as json from 'multiformats/codecs/json'
44

55
const main = async () => {
66
const block = await Block.encode({

0 commit comments

Comments
 (0)