Initial import with skill sheet working
This commit is contained in:
		
							
								
								
									
										214
									
								
								node_modules/level-transcoder/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										214
									
								
								node_modules/level-transcoder/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,214 @@ | ||||
| # level-transcoder | ||||
|  | ||||
| **Encode data with built-in or custom encodings.** The successor to [`level-codec`][level-codec] that transcodes encodings from and to internal data formats supported by a database. This allows a database to store data in a format of its choice (Buffer, Uint8Array or String) with zero-effort support of known encodings. That includes other encoding interfaces in the ecosystem like [`abstract-encoding`][abstract-enc] and [`multiformats`][blockcodec]. | ||||
|  | ||||
| [![level badge][level-badge]](https://github.com/Level/awesome) | ||||
| [](https://www.npmjs.com/package/level-transcoder) | ||||
| [](https://www.npmjs.com/package/level-transcoder) | ||||
| [](https://github.com/Level/transcoder/actions/workflows/test.yml) | ||||
| [](https://codecov.io/gh/Level/transcoder) | ||||
| [](https://standardjs.com) | ||||
| [](https://common-changelog.org) | ||||
| [](https://opencollective.com/level) | ||||
|  | ||||
| ## Usage | ||||
|  | ||||
| Create a transcoder, passing a desired format: | ||||
|  | ||||
| ```js | ||||
| const { Transcoder } = require('level-transcoder') | ||||
|  | ||||
| const transcoder1 = new Transcoder(['view']) | ||||
| const transcoder2 = new Transcoder(['buffer']) | ||||
| const transcoder3 = new Transcoder(['utf8']) | ||||
| ``` | ||||
|  | ||||
| Then select an encoding and encode some data: | ||||
|  | ||||
| ```js | ||||
| // Uint8Array(3) [ 49, 50, 51 ] | ||||
| console.log(transcoder1.encoding('json').encode(123)) | ||||
|  | ||||
| // <Buffer 31 32 33> | ||||
| console.log(transcoder2.encoding('json').encode(123)) | ||||
|  | ||||
| // '123' | ||||
| console.log(transcoder3.encoding('json').encode(123)) | ||||
| ``` | ||||
|  | ||||
| If the `Transcoder` constructor is given multiple formats then `Transcoder#encoding()` selects an encoding with the best fitting format. Consider a database like [`leveldown`][leveldown] which has the ability to return data as a Buffer or string. If an `encoding.decode(data)` function needs a string, we'll want to fetch that `data` from the database as a string. This avoids the cost of having to convert a Buffer to a string. So we'd use the following transcoder: | ||||
|  | ||||
| ```js | ||||
| const transcoder = new Transcoder(['buffer', 'utf8']) | ||||
| ``` | ||||
|  | ||||
| Then, knowing for example that the return value of `JSON.stringify(data)` is a UTF-8 string which matches one of the given formats, the `'json'` encoding will return a string here: | ||||
|  | ||||
| ```js | ||||
| // '123' | ||||
| console.log(transcoder.encoding('json').encode(123)) | ||||
| ``` | ||||
|  | ||||
| In contrast, data encoded as a `'view'` (for now that just means Uint8Array) would get transcoded into the `'buffer'` encoding. Copying of data is avoided where possible, like how the underlying ArrayBuffer of a view can be passed to `Buffer.from(..)` without a copy. | ||||
|  | ||||
| Lastly, encodings returned by `Transcoder#encoding()` have a `format` property to be used to forward information to an underlying store. For example: an input value of `{ x: 3 }` using the `'json'` encoding which has a `format` of `'utf8'`, can be forwarded as value `'{"x":3}'` with encoding `'utf8'`. Vice versa for output. | ||||
|  | ||||
| ## Encodings | ||||
|  | ||||
| ### Built-in Encodings | ||||
|  | ||||
| These encodings can be used out of the box and are to be selected by name. | ||||
|  | ||||
| In this table, the _input_ is what `encode()` accepts. The _format_ is what `encode()` returns as well as what `decode()` accepts. The _output_ is what `decode()` returns. The TypeScript typings of `level-transcoder` have generic type parameters with matching names: `TIn`, `TFormat` and `TOut`. | ||||
|  | ||||
| | Name                    | Input                      | Format     | Output          | | ||||
| | :---------------------- | :------------------------- | :--------- | :-------------- | | ||||
| | `'buffer'` <sup>1</sup> | Buffer, Uint8Array, String | `'buffer'` | Buffer          | | ||||
| | `'view'`                | Uint8Array, Buffer, String | `'view'`   | Uint8Array      | | ||||
| | `'utf8'`                | String, Buffer, Uint8Array | `'utf8'`   | String          | | ||||
| | `'json'`                | Any JSON type              | `'utf8'`   | As input        | | ||||
| | `'hex'`                 | String (hex), Buffer       | `'buffer'` | String (hex)    | | ||||
| | `'base64'`              | String (base64), Buffer    | `'buffer'` | String (base64) | | ||||
|  | ||||
| <sup>1</sup> Aliased as `'binary'`. Use of this alias does not affect the ability to transcode. | ||||
|  | ||||
| ### Transcoder Encodings | ||||
|  | ||||
| It's not necessary to use or reference the below encodings directly. They're listed here for implementation notes and to show how input and output is the same; it's the format that differs. | ||||
|  | ||||
| Custom encodings are transcoded in the same way and require no additional setup. For example: if a custom encoding has `{ name: 'example', format: 'utf8' }` then `level-transcoder` will create transcoder encodings on demand with names `'example+buffer'` and `'example+view'`. | ||||
|  | ||||
| | Name                         | Input                      | Format     | Output          | | ||||
| | :--------------------------- | :------------------------- | :--------- | :-------------- | | ||||
| | `'buffer+view'`              | Buffer, Uint8Array, String | `'view'`   | Buffer          | | ||||
| | `'view+buffer'`              | Uint8Array, Buffer, String | `'buffer'` | Uint8Array      | | ||||
| | `'utf8+view'`                | String, Buffer, Uint8Array | `'view'`   | String          | | ||||
| | `'utf8+buffer'`              | String, Buffer, Uint8Array | `'buffer'` | String          | | ||||
| | `'json+view'`                | Any JSON type              | `'view'`   | As input        | | ||||
| | `'json+buffer'`              | Any JSON type              | `'buffer'` | As input        | | ||||
| | `'hex+view'` <sup>1</sup>    | String (hex), Buffer       | `'view'`   | String (hex)    | | ||||
| | `'base64+view'` <sup>1</sup> | String (base64), Buffer    | `'view'`   | String (base64) | | ||||
|  | ||||
| <sup>1</sup> Unlike other encodings that transcode to `'view'`, these depend on Buffer at the moment and thus don't work in browsers if a [shim](https://github.com/feross/buffer) is not included by JavaScript bundlers like Webpack and Browserify. | ||||
|  | ||||
| ### Ecosystem Encodings | ||||
|  | ||||
| Various modules in the ecosystem, in and outside of Level, can be used with `level-transcoder` although they follow different interfaces. Common between the interfaces is that they have `encode()` and `decode()` methods. The terms "codec" and "encoding" are used interchangeably in the ecosystem. Passing these encodings through `Transcoder#encoding()` (which is done implicitly when used in an `abstract-level` database) results in normalized encoding objects as described further below. | ||||
|  | ||||
| | Module                                     | Format           | Interface                           | Named | | ||||
| | :----------------------------------------- | :--------------- | :---------------------------------- | :---- | | ||||
| | [`protocol-buffers`][protocol-buffers]     | `buffer`         | [`level-codec`][level-codec]        | ❌     | | ||||
| | [`charwise`][charwise]                     | `utf8`           | [`level-codec`][level-codec]        | ✅     | | ||||
| | [`bytewise`][bytewise]                     | `buffer`         | [`level-codec`][level-codec]        | ✅     | | ||||
| | [`lexicographic-integer-encoding`][lexint] | `buffer`, `utf8` | [`level-codec`][level-codec]        | ✅     | | ||||
| | [`abstract-encoding`][abstract-enc]        | `buffer`         | [`abstract-encoding`][abstract-enc] | ❌     | | ||||
| | [`multiformats`][js-multiformats]          | `view`           | [`multiformats`][blockcodec]        | ✅     | | ||||
|  | ||||
| Those marked as not named are modules that export or generate encodings that don't have a `name` property (or `type` as an alias). We call these _anonymous encodings_. They can only be used as objects and not by name. Passing an anonymous encoding through `Transcoder#encoding()` does give it a `name` property for compatibility, but the value of `name` is not deterministic. | ||||
|  | ||||
| ## API | ||||
|  | ||||
| ### `Transcoder` | ||||
|  | ||||
| #### `transcoder = new Transcoder(formats)` | ||||
|  | ||||
| Create a new transcoder, providing the formats that are supported by a database (or other). The `formats` argument must be an array containing one or more of `'buffer'`, `'view'`, `'utf8'`. The returned `transcoder` instance is stateful, in that it contains a set of cached encoding objects. | ||||
|  | ||||
| #### `encoding = transcoder.encoding(encoding)` | ||||
|  | ||||
| Returns the given `encoding` argument as a normalized encoding object that follows the `level-transcoder` encoding interface. The `encoding` argument may be: | ||||
|  | ||||
| - A string to select a known encoding by its name | ||||
| - An object that follows one of the following interfaces: [`level-transcoder`](#encoding-interface), [`level-codec`](https://github.com/Level/codec#encoding-format), [`abstract-encoding`][abstract-enc], [`multiformats`][blockcodec] | ||||
| - A previously normalized encoding, such that `encoding(x)` equals `encoding(encoding(x))`. | ||||
|  | ||||
| Results are cached. If the `encoding` argument is an object and it has a name then subsequent calls can refer to that encoding by name. | ||||
|  | ||||
| Depending on the `formats` provided to the `Transcoder` constructor, this method may return a _transcoder encoding_ that translates the desired encoding from / to a supported format. Its `encode()` and `decode()` methods will have respectively the same input and output types as a non-transcoded encoding, but its `name` property will differ. | ||||
|  | ||||
| #### `encodings = transcoder.encodings()` | ||||
|  | ||||
| Get an array of encoding objects. This includes: | ||||
|  | ||||
| - Encodings for the `formats` that were passed to the `Transcoder` constructor | ||||
| - Custom encodings that were passed to `transcoder.encoding()` | ||||
| - Transcoder encodings for either. | ||||
|  | ||||
| ### `Encoding` | ||||
|  | ||||
| #### `data = encoding.encode(data)` | ||||
|  | ||||
| Encode data. | ||||
|  | ||||
| #### `data = encoding.decode(data)` | ||||
|  | ||||
| Decode data. | ||||
|  | ||||
| #### `encoding.name` | ||||
|  | ||||
| Unique name. A string. | ||||
|  | ||||
| #### `encoding.commonName` | ||||
|  | ||||
| Common name, computed from `name`. If this encoding is a transcoder encoding, `name` will be for example `'json+view'` and `commonName` will be just `'json'`. Else `name` will equal `commonName`. | ||||
|  | ||||
| #### `encoding.format` | ||||
|  | ||||
| Name of the (lower-level) encoding used by the return value of `encode()`. One of `'buffer'`, `'view'`, `'utf8'`. If `name` equals `format` then the encoding can be assumed to be idempotent, such that `encode(x)` equals `encode(encode(x))`. | ||||
|  | ||||
| ## Encoding Interface | ||||
|  | ||||
| Custom encodings must follow the following interface: | ||||
|  | ||||
| ```ts | ||||
| interface IEncoding<TIn, TFormat, TOut> { | ||||
|   name: string | ||||
|   format: 'buffer' | 'view' | 'utf8' | ||||
|   encode: (data: TIn) => TFormat | ||||
|   decode: (data: TFormat) => TOut | ||||
| } | ||||
| ``` | ||||
|  | ||||
| ## Install | ||||
|  | ||||
| With [npm](https://npmjs.org) do: | ||||
|  | ||||
| ``` | ||||
| npm install level-transcoder | ||||
| ``` | ||||
|  | ||||
| ## Contributing | ||||
|  | ||||
| [`Level/transcoder`](https://github.com/Level/transcoder) is an **OPEN Open Source Project**. This means that: | ||||
|  | ||||
| > Individuals making significant and valuable contributions are given commit-access to the project to contribute as they see fit. This project is more like an open wiki than a standard guarded open source project. | ||||
|  | ||||
| See the [Contribution Guide](https://github.com/Level/community/blob/master/CONTRIBUTING.md) for more details. | ||||
|  | ||||
| ## Donate | ||||
|  | ||||
| Support us with a monthly donation on [Open Collective](https://opencollective.com/level) and help us continue our work. | ||||
|  | ||||
| ## License | ||||
|  | ||||
| [MIT](LICENSE) | ||||
|  | ||||
| [level-badge]: https://leveljs.org/img/badge.svg | ||||
|  | ||||
| [level-codec]: https://github.com/Level/codec | ||||
|  | ||||
| [leveldown]: https://github.com/Level/leveldown | ||||
|  | ||||
| [protocol-buffers]: https://github.com/mafintosh/protocol-buffers | ||||
|  | ||||
| [charwise]: https://github.com/dominictarr/charwise | ||||
|  | ||||
| [bytewise]: https://github.com/deanlandolt/bytewise | ||||
|  | ||||
| [lexint]: https://github.com/vweevers/lexicographic-integer-encoding | ||||
|  | ||||
| [abstract-enc]: https://github.com/mafintosh/abstract-encoding | ||||
|  | ||||
| [js-multiformats]: https://github.com/multiformats/js-multiformats | ||||
|  | ||||
| [blockcodec]: https://github.com/multiformats/js-multiformats/blob/master/src/codecs/interface.ts | ||||
		Reference in New Issue
	
	Block a user