2020-03-10 15:16:08 -04:00
|
|
|
# encoding
|
|
|
|
|
|
|
|
Helper module for dealing with external data structures.
|
|
|
|
|
2020-07-14 14:26:49 -04:00
|
|
|
- [`ascii85`](#ascii85)
|
2020-03-10 15:16:08 -04:00
|
|
|
- [`base32`](#base32)
|
|
|
|
- [`binary`](#binary)
|
|
|
|
- [`csv`](#csv)
|
|
|
|
- [`toml`](#toml)
|
|
|
|
- [`yaml`](#yaml)
|
|
|
|
|
|
|
|
## Binary
|
|
|
|
|
|
|
|
Implements equivalent methods to Go's `encoding/binary` package.
|
|
|
|
|
|
|
|
Available Functions:
|
|
|
|
|
|
|
|
```typescript
|
|
|
|
sizeof(dataType: RawTypes): number
|
|
|
|
getNBytes(r: Deno.Reader, n: number): Promise<Uint8Array>
|
2020-04-28 12:40:43 -04:00
|
|
|
varnum(b: Uint8Array, o: VarnumOptions = {}): number | null
|
|
|
|
varbig(b: Uint8Array, o: VarbigOptions = {}): bigint | null
|
2020-03-10 15:16:08 -04:00
|
|
|
putVarnum(b: Uint8Array, x: number, o: VarnumOptions = {}): number
|
|
|
|
putVarbig(b: Uint8Array, x: bigint, o: VarbigOptions = {}): number
|
|
|
|
readVarnum(r: Deno.Reader, o: VarnumOptions = {}): Promise<number>
|
|
|
|
readVarbig(r: Deno.Reader, o: VarbigOptions = {}): Promise<bigint>
|
|
|
|
writeVarnum(w: Deno.Writer, x: number, o: VarnumOptions = {}): Promise<number>
|
|
|
|
writeVarbig(w: Deno.Writer, x: bigint, o: VarbigOptions = {}): Promise<number>
|
|
|
|
```
|
2019-05-30 09:50:29 -04:00
|
|
|
|
|
|
|
## CSV
|
|
|
|
|
2020-05-31 16:02:39 -04:00
|
|
|
### API
|
|
|
|
|
|
|
|
#### `readMatrix(reader: BufReader, opt: ReadOptions = { comma: ",", trimLeadingSpace: false, lazyQuotes: false }): Promise<string[][]>`
|
|
|
|
|
|
|
|
Parse the CSV from the `reader` with the options provided and return
|
|
|
|
`string[][]`.
|
|
|
|
|
|
|
|
#### `parse(input: string | BufReader, opt: ParseOptions = { header: false }): Promise<unknown[]>`:
|
|
|
|
|
|
|
|
Parse the CSV string/buffer with the options provided. The result of this
|
|
|
|
function is as follows:
|
|
|
|
|
|
|
|
- If you don't provide both `opt.header` and `opt.parse`, it returns
|
|
|
|
`string[][]`.
|
|
|
|
- If you provide `opt.header` but not `opt.parse`, it returns `object[]`.
|
|
|
|
- If you provide `opt.parse`, it returns an array where each element is the
|
|
|
|
value returned from `opt.parse`.
|
|
|
|
|
|
|
|
##### `ParseOptions`
|
|
|
|
|
|
|
|
- **`header: boolean | string[] | HeaderOptions[];`**: If a boolean is provided,
|
|
|
|
the first line will be used as Header definitions. If `string[]` or
|
|
|
|
`HeaderOptions[]` those names will be used for header definition.
|
|
|
|
- **`parse?: (input: unknown) => unknown;`**: Parse function for the row, which
|
|
|
|
will be executed after parsing of all columns. Therefore if you don't provide
|
|
|
|
header and parse function with headers, input will be `string[]`.
|
|
|
|
|
|
|
|
##### `HeaderOptions`
|
|
|
|
|
|
|
|
- **`name: string;`**: Name of the header to be used as property.
|
|
|
|
- **`parse?: (input: string) => unknown;`**: Parse function for the column. This
|
|
|
|
is executed on each entry of the header. This can be combined with the Parse
|
|
|
|
function of the rows.
|
|
|
|
|
|
|
|
##### `ReadOptions`
|
|
|
|
|
|
|
|
- **`comma?: string;`**: Character which separates values. Default: `','`
|
|
|
|
- **`comment?: string;`**: Character to start a comment. Default: `'#'`
|
|
|
|
- **`trimLeadingSpace?: boolean;`**: Flag to trim the leading space of the
|
|
|
|
value. Default: `false`
|
|
|
|
- **`lazyQuotes?: boolean;`**: Allow unquoted quote in a quoted field or non
|
|
|
|
double quoted quotes in quoted field. Default: 'false`
|
|
|
|
- **`fieldsPerRecord?`**: Enabling the check of fields for each row. If == 0,
|
|
|
|
first row is used as referral for the number of fields.
|
2019-05-30 09:50:29 -04:00
|
|
|
|
2019-12-20 15:21:30 -05:00
|
|
|
### Usage
|
2019-05-30 09:50:29 -04:00
|
|
|
|
|
|
|
```ts
|
2020-06-09 15:08:38 -04:00
|
|
|
import { parse } from "https://deno.land/std/encoding/csv.ts";
|
2019-12-20 15:21:30 -05:00
|
|
|
const string = "a,b,c\nd,e,f";
|
2019-05-30 09:50:29 -04:00
|
|
|
|
2019-12-20 15:21:30 -05:00
|
|
|
console.log(
|
2020-05-18 06:10:19 -04:00
|
|
|
await parse(string, {
|
2020-03-28 13:03:49 -04:00
|
|
|
header: false,
|
2020-07-14 15:24:17 -04:00
|
|
|
}),
|
2019-12-20 15:21:30 -05:00
|
|
|
);
|
2019-05-30 09:50:29 -04:00
|
|
|
// output:
|
2019-12-20 15:21:30 -05:00
|
|
|
// [["a", "b", "c"], ["d", "e", "f"]]
|
2019-05-30 09:50:29 -04:00
|
|
|
```
|
|
|
|
|
|
|
|
## TOML
|
2019-03-28 12:31:15 -04:00
|
|
|
|
|
|
|
This module parse TOML files. It follows as much as possible the
|
|
|
|
[TOML specs](https://github.com/toml-lang/toml). Be sure to read the supported
|
|
|
|
types as not every specs is supported at the moment and the handling in
|
|
|
|
TypeScript side is a bit different.
|
|
|
|
|
2019-05-30 09:50:29 -04:00
|
|
|
### Supported types and handling
|
2019-03-28 12:31:15 -04:00
|
|
|
|
|
|
|
- :heavy_check_mark: [Keys](https://github.com/toml-lang/toml#string)
|
|
|
|
- :exclamation: [String](https://github.com/toml-lang/toml#string)
|
|
|
|
- :heavy_check_mark:
|
|
|
|
[Multiline String](https://github.com/toml-lang/toml#string)
|
|
|
|
- :heavy_check_mark: [Literal String](https://github.com/toml-lang/toml#string)
|
|
|
|
- :exclamation: [Integer](https://github.com/toml-lang/toml#integer)
|
|
|
|
- :heavy_check_mark: [Float](https://github.com/toml-lang/toml#float)
|
|
|
|
- :heavy_check_mark: [Boolean](https://github.com/toml-lang/toml#boolean)
|
|
|
|
- :heavy_check_mark:
|
|
|
|
[Offset Date-time](https://github.com/toml-lang/toml#offset-date-time)
|
|
|
|
- :heavy_check_mark:
|
|
|
|
[Local Date-time](https://github.com/toml-lang/toml#local-date-time)
|
|
|
|
- :heavy_check_mark: [Local Date](https://github.com/toml-lang/toml#local-date)
|
|
|
|
- :exclamation: [Local Time](https://github.com/toml-lang/toml#local-time)
|
|
|
|
- :heavy_check_mark: [Table](https://github.com/toml-lang/toml#table)
|
2019-10-09 17:22:22 -04:00
|
|
|
- :heavy_check_mark:
|
|
|
|
[Inline Table](https://github.com/toml-lang/toml#inline-table)
|
|
|
|
- :exclamation:
|
|
|
|
[Array of Tables](https://github.com/toml-lang/toml#array-of-tables)
|
2019-03-28 12:31:15 -04:00
|
|
|
|
|
|
|
:exclamation: _Supported with warnings see [Warning](#Warning)._
|
|
|
|
|
2019-05-30 09:50:29 -04:00
|
|
|
#### :warning: Warning
|
2019-03-28 12:31:15 -04:00
|
|
|
|
2019-05-30 09:50:29 -04:00
|
|
|
##### String
|
2019-03-28 12:31:15 -04:00
|
|
|
|
2019-10-09 17:22:22 -04:00
|
|
|
- Regex : Due to the spec, there is no flag to detect regex properly in a TOML
|
|
|
|
declaration. So the regex is stored as string.
|
2019-03-28 12:31:15 -04:00
|
|
|
|
2019-05-30 09:50:29 -04:00
|
|
|
##### Integer
|
2019-03-28 12:31:15 -04:00
|
|
|
|
2019-10-09 17:22:22 -04:00
|
|
|
For **Binary** / **Octal** / **Hexadecimal** numbers, they are stored as string
|
|
|
|
to be not interpreted as Decimal.
|
2019-03-28 12:31:15 -04:00
|
|
|
|
2019-05-30 09:50:29 -04:00
|
|
|
##### Local Time
|
2019-03-28 12:31:15 -04:00
|
|
|
|
2019-10-09 17:22:22 -04:00
|
|
|
Because local time does not exist in JavaScript, the local time is stored as a
|
|
|
|
string.
|
2019-03-28 12:31:15 -04:00
|
|
|
|
2019-05-30 09:50:29 -04:00
|
|
|
##### Inline Table
|
2019-03-28 12:31:15 -04:00
|
|
|
|
2019-04-04 06:00:24 -04:00
|
|
|
Inline tables are supported. See below:
|
2019-03-28 12:31:15 -04:00
|
|
|
|
|
|
|
```toml
|
2019-04-04 06:00:24 -04:00
|
|
|
animal = { type = { name = "pug" } }
|
2019-05-30 09:50:29 -04:00
|
|
|
## Output
|
2019-03-28 12:31:15 -04:00
|
|
|
animal = { type.name = "pug" }
|
2019-05-30 09:50:29 -04:00
|
|
|
## Output { animal : { type : { name : "pug" } }
|
2019-04-04 06:00:24 -04:00
|
|
|
animal.as.leaders = "tosin"
|
2019-05-30 09:50:29 -04:00
|
|
|
## Output { animal: { as: { leaders: "tosin" } } }
|
2019-04-04 06:00:24 -04:00
|
|
|
"tosin.abasi" = "guitarist"
|
2019-05-30 09:50:29 -04:00
|
|
|
## Output
|
2019-04-04 06:00:24 -04:00
|
|
|
"tosin.abasi" : "guitarist"
|
2019-03-28 12:31:15 -04:00
|
|
|
```
|
|
|
|
|
2019-05-30 09:50:29 -04:00
|
|
|
##### Array of Tables
|
2019-03-28 12:31:15 -04:00
|
|
|
|
|
|
|
At the moment only simple declarations like below are supported:
|
|
|
|
|
|
|
|
```toml
|
|
|
|
[[bin]]
|
|
|
|
name = "deno"
|
|
|
|
path = "cli/main.rs"
|
|
|
|
|
|
|
|
[[bin]]
|
|
|
|
name = "deno_core"
|
|
|
|
path = "src/foo.rs"
|
|
|
|
|
|
|
|
[[nib]]
|
|
|
|
name = "node"
|
|
|
|
path = "not_found"
|
|
|
|
```
|
|
|
|
|
|
|
|
will output:
|
|
|
|
|
|
|
|
```json
|
|
|
|
{
|
|
|
|
"bin": [
|
|
|
|
{ "name": "deno", "path": "cli/main.rs" },
|
|
|
|
{ "name": "deno_core", "path": "src/foo.rs" }
|
|
|
|
],
|
|
|
|
"nib": [{ "name": "node", "path": "not_found" }]
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2020-06-09 15:08:38 -04:00
|
|
|
### Basic usage
|
2019-04-05 00:23:05 -04:00
|
|
|
|
|
|
|
```ts
|
2020-06-09 15:08:38 -04:00
|
|
|
import { parse, stringify } from "https://deno.land/std/encoding/toml.ts";
|
2019-04-05 00:23:05 -04:00
|
|
|
const obj = {
|
|
|
|
bin: [
|
|
|
|
{ name: "deno", path: "cli/main.rs" },
|
2020-03-28 13:03:49 -04:00
|
|
|
{ name: "deno_core", path: "src/foo.rs" },
|
2019-04-05 00:23:05 -04:00
|
|
|
],
|
2020-03-28 13:03:49 -04:00
|
|
|
nib: [{ name: "node", path: "not_found" }],
|
2019-04-05 00:23:05 -04:00
|
|
|
};
|
|
|
|
const tomlString = stringify(obj);
|
2020-06-09 15:08:38 -04:00
|
|
|
console.log(tomlString);
|
|
|
|
|
|
|
|
// =>
|
|
|
|
// [[bin]]
|
|
|
|
// name = "deno"
|
|
|
|
// path = "cli/main.rs"
|
|
|
|
|
|
|
|
// [[bin]]
|
|
|
|
// name = "deno_core"
|
|
|
|
// path = "src/foo.rs"
|
|
|
|
|
|
|
|
// [[nib]]
|
|
|
|
// name = "node"
|
|
|
|
// path = "not_found"
|
|
|
|
|
|
|
|
const tomlObject = parse(tomlString);
|
|
|
|
console.log(tomlObject);
|
|
|
|
|
|
|
|
// =>
|
|
|
|
// {
|
|
|
|
// bin: [
|
|
|
|
// { name: "deno", path: "cli/main.rs" },
|
|
|
|
// { name: "deno_core", path: "src/foo.rs" }
|
|
|
|
// ],
|
|
|
|
// nib: [ { name: "node", path: "not_found" } ]
|
|
|
|
// }
|
2019-04-05 00:23:05 -04:00
|
|
|
```
|
2019-11-18 09:39:32 -05:00
|
|
|
|
|
|
|
## YAML
|
|
|
|
|
|
|
|
YAML parser / dumper for Deno
|
|
|
|
|
|
|
|
Heavily inspired from [js-yaml]
|
|
|
|
|
2019-12-20 11:32:05 -05:00
|
|
|
### Basic usage
|
2019-11-18 09:39:32 -05:00
|
|
|
|
2019-12-20 11:32:05 -05:00
|
|
|
`parse` parses the yaml string, and `stringify` dumps the given object to YAML
|
|
|
|
string.
|
|
|
|
|
|
|
|
```ts
|
|
|
|
import { parse, stringify } from "https://deno.land/std/encoding/yaml.ts";
|
|
|
|
|
|
|
|
const data = parse(`
|
|
|
|
foo: bar
|
|
|
|
baz:
|
|
|
|
- qux
|
|
|
|
- quux
|
|
|
|
`);
|
|
|
|
console.log(data);
|
|
|
|
// => { foo: "bar", baz: [ "qux", "quux" ] }
|
|
|
|
|
|
|
|
const yaml = stringify({ foo: "bar", baz: ["qux", "quux"] });
|
|
|
|
console.log(yaml);
|
|
|
|
// =>
|
|
|
|
// foo: bar
|
|
|
|
// baz:
|
|
|
|
// - qux
|
|
|
|
// - quux
|
|
|
|
```
|
|
|
|
|
|
|
|
If your YAML contains multiple documents in it, you can use `parseAll` for
|
|
|
|
handling it.
|
|
|
|
|
|
|
|
```ts
|
|
|
|
import { parseAll } from "https://deno.land/std/encoding/yaml.ts";
|
|
|
|
|
|
|
|
const data = parseAll(`
|
|
|
|
---
|
|
|
|
id: 1
|
|
|
|
name: Alice
|
|
|
|
---
|
|
|
|
id: 2
|
|
|
|
name: Bob
|
|
|
|
---
|
|
|
|
id: 3
|
|
|
|
name: Eve
|
|
|
|
`);
|
|
|
|
console.log(data);
|
|
|
|
// => [ { id: 1, name: "Alice" }, { id: 2, name: "Bob" }, { id: 3, name: "Eve" } ]
|
|
|
|
```
|
|
|
|
|
|
|
|
### API
|
|
|
|
|
|
|
|
#### `parse(str: string, opts?: ParserOption): unknown`
|
|
|
|
|
|
|
|
Parses the YAML string with a single document.
|
|
|
|
|
|
|
|
#### `parseAll(str: string, iterator?: Function, opts?: ParserOption): unknown`
|
|
|
|
|
|
|
|
Parses the YAML string with multiple documents. If the iterator is given, it's
|
|
|
|
applied to every document instead of returning the array of parsed objects.
|
|
|
|
|
|
|
|
#### `stringify(obj: object, opts?: DumpOption): string`
|
|
|
|
|
|
|
|
Serializes `object` as a YAML document.
|
2019-11-18 09:39:32 -05:00
|
|
|
|
|
|
|
### :warning: Limitations
|
|
|
|
|
|
|
|
- `binary` type is currently not stable
|
|
|
|
- `function`, `regexp`, and `undefined` type are currently not supported
|
|
|
|
|
2019-12-20 11:32:05 -05:00
|
|
|
### More example
|
2019-11-18 09:39:32 -05:00
|
|
|
|
2020-05-09 08:34:47 -04:00
|
|
|
See https://github.com/nodeca/js-yaml.
|
2020-02-02 16:49:41 -05:00
|
|
|
|
|
|
|
## base32
|
|
|
|
|
|
|
|
[RFC4648 base32](https://tools.ietf.org/html/rfc4648#section-6) encoder/decoder
|
|
|
|
for Deno
|
|
|
|
|
|
|
|
### Basic usage
|
|
|
|
|
|
|
|
`encode` encodes a `Uint8Array` to RFC4648 base32 representation, and `decode`
|
|
|
|
decodes the given RFC4648 base32 representation to a `Uint8Array`.
|
|
|
|
|
|
|
|
```ts
|
|
|
|
import { encode, decode } from "https://deno.land/std/encoding/base32.ts";
|
|
|
|
|
|
|
|
const b32Repr = "RC2E6GA=";
|
|
|
|
|
|
|
|
const binaryData = decode(b32Repr);
|
|
|
|
console.log(binaryData);
|
|
|
|
// => Uint8Array [ 136, 180, 79, 24 ]
|
|
|
|
|
|
|
|
console.log(encode(binaryData));
|
|
|
|
// => RC2E6GA=
|
|
|
|
```
|
2020-07-14 14:26:49 -04:00
|
|
|
|
|
|
|
## ascii85
|
|
|
|
|
|
|
|
Ascii85/base85 encoder and decoder with support for multiple standards
|
|
|
|
|
|
|
|
### Basic usage
|
|
|
|
|
|
|
|
`encode` encodes a `Uint8Array` to a ascii85 representation, and `decode`
|
|
|
|
decodes the given ascii85 representation to a `Uint8Array`.
|
|
|
|
|
|
|
|
```ts
|
|
|
|
import { encode, decode } from "https://deno.land/std/encoding/ascii85.ts";
|
|
|
|
|
|
|
|
const a85Repr = "LpTqp";
|
|
|
|
|
|
|
|
const binaryData = decode(a85Repr);
|
|
|
|
console.log(binaryData);
|
|
|
|
// => Uint8Array [ 136, 180, 79, 24 ]
|
|
|
|
|
|
|
|
console.log(encode(binaryData));
|
|
|
|
// => LpTqp
|
|
|
|
```
|
|
|
|
|
|
|
|
### Specifying a standard and delimeter
|
|
|
|
|
|
|
|
By default all functions are using the most popular Adobe version of ascii85 and
|
|
|
|
not adding any delimeter. However, there are three more standards supported -
|
|
|
|
btoa (different delimeter and additional compression of 4 bytes equal to 32),
|
|
|
|
[Z85](https://rfc.zeromq.org/spec/32/) and
|
|
|
|
[RFC 1924](https://tools.ietf.org/html/rfc1924). It's possible to use a
|
|
|
|
different encoding by specifying it in `options` object as a second parameter.
|
|
|
|
|
|
|
|
Similarly, it's possible to make `encode` add a delimeter (`<~` and `~>` for
|
|
|
|
Adobe, `xbtoa Begin` and `xbtoa End` with newlines between the delimeters and
|
|
|
|
encoded data for btoa. Checksums for btoa are not supported. Delimeters are not
|
|
|
|
supported by other encodings.)
|
|
|
|
|
|
|
|
encoding examples:
|
|
|
|
|
|
|
|
```ts
|
|
|
|
import { encode, decode } from "https://deno.land/std/encoding/ascii85.ts";
|
|
|
|
const binaryData = new Uint8Array([136, 180, 79, 24]);
|
|
|
|
console.log(encode(binaryData));
|
|
|
|
// => LpTqp
|
|
|
|
console.log(encode(binaryData, { standard: "Adobe", delimeter: true }));
|
|
|
|
// => <~LpTqp~>
|
|
|
|
console.log(encode(binaryData, { standard: "btoa", delimeter: true }));
|
|
|
|
/* => xbtoa Begin
|
|
|
|
LpTqp
|
|
|
|
xbtoa End */
|
|
|
|
console.log(encode(binaryData, { standard: "RFC 1924" }));
|
|
|
|
// => h_p`_
|
|
|
|
console.log(encode(binaryData, { standard: "Z85" }));
|
|
|
|
// => H{P}{
|
|
|
|
```
|