移除多余文件, 改用esbuild打包;调整为esm语法
commit
8b7e7f50ae
|
@ -0,0 +1,7 @@
|
||||||
|
.nyc_output
|
||||||
|
doc/
|
||||||
|
node_modules/
|
||||||
|
dist/
|
||||||
|
*.log
|
||||||
|
package-lock.json
|
||||||
|
test.js
|
|
@ -0,0 +1,21 @@
|
||||||
|
(The MIT License)
|
||||||
|
|
||||||
|
Copyright (C) 2014-2017 by Vitaly Puzrin and Andrei Tuputcyn
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
|
@ -0,0 +1,31 @@
|
||||||
|
## @bytedo/gzip
|
||||||
|
> 浏览器端的gzip库, fork于pako, 仅调整语法为esm, 并只保留gzip的导出。
|
||||||
|
|
||||||
|
|
||||||
|
### 安装&使用
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @bytedo/gzip
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
或直接使用cdn地址:
|
||||||
|
|
||||||
|
```js
|
||||||
|
|
||||||
|
import { gzip , ungzip } from '@bytedo/gzip' // use importmap
|
||||||
|
// or
|
||||||
|
import { gzip , ungzip } from '//jscdn.ink/@bytedo/gzip/latest/index.js'
|
||||||
|
|
||||||
|
|
||||||
|
let res = gzip('hello world') // return Uint8Array object
|
||||||
|
|
||||||
|
let txt = ungzip(res) // hello world
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### 开源协议
|
||||||
|
|
||||||
|
- MIT - 除 `/lib/zlib` 目录以外的所有文件
|
||||||
|
- ZLIB - `/lib/zlib` 目录
|
|
@ -0,0 +1,2 @@
|
||||||
|
export { gzip } from './lib/deflate.js'
|
||||||
|
export { ungzip } from './lib/inflate.js'
|
|
@ -0,0 +1,363 @@
|
||||||
|
import zlib_deflate from './zlib/deflate.js'
|
||||||
|
import { flattenChunks } from './utils/common.js'
|
||||||
|
import { string2buf } from './utils/strings.js'
|
||||||
|
import msg from './zlib/messages.js'
|
||||||
|
import ZStream from './zlib/zstream.js'
|
||||||
|
|
||||||
|
const toString = Object.prototype.toString
|
||||||
|
|
||||||
|
/* Public constants ==========================================================*/
|
||||||
|
/* ===========================================================================*/
|
||||||
|
|
||||||
|
import {
|
||||||
|
Z_NO_FLUSH,
|
||||||
|
Z_SYNC_FLUSH,
|
||||||
|
Z_FULL_FLUSH,
|
||||||
|
Z_FINISH,
|
||||||
|
Z_OK,
|
||||||
|
Z_STREAM_END,
|
||||||
|
Z_DEFAULT_COMPRESSION,
|
||||||
|
Z_DEFAULT_STRATEGY,
|
||||||
|
Z_DEFLATED
|
||||||
|
} from './zlib/constants.js'
|
||||||
|
|
||||||
|
/* ===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* class Deflate
|
||||||
|
*
|
||||||
|
* Generic JS-style wrapper for zlib calls. If you don't need
|
||||||
|
* streaming behaviour - use more simple functions: [[deflate]],
|
||||||
|
* [[deflateRaw]] and [[gzip]].
|
||||||
|
**/
|
||||||
|
|
||||||
|
/* internal
|
||||||
|
* Deflate.chunks -> Array
|
||||||
|
*
|
||||||
|
* Chunks of output data, if [[Deflate#onData]] not overridden.
|
||||||
|
**/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deflate.result -> Uint8Array
|
||||||
|
*
|
||||||
|
* Compressed result, generated by default [[Deflate#onData]]
|
||||||
|
* and [[Deflate#onEnd]] handlers. Filled after you push last chunk
|
||||||
|
* (call [[Deflate#push]] with `Z_FINISH` / `true` param).
|
||||||
|
**/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deflate.err -> Number
|
||||||
|
*
|
||||||
|
* Error code after deflate finished. 0 (Z_OK) on success.
|
||||||
|
* You will not need it in real life, because deflate errors
|
||||||
|
* are possible only on wrong options or bad `onData` / `onEnd`
|
||||||
|
* custom handlers.
|
||||||
|
**/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deflate.msg -> String
|
||||||
|
*
|
||||||
|
* Error message, if [[Deflate.err]] != 0
|
||||||
|
**/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* new Deflate(options)
|
||||||
|
* - options (Object): zlib deflate options.
|
||||||
|
*
|
||||||
|
* Creates new deflator instance with specified params. Throws exception
|
||||||
|
* on bad params. Supported options:
|
||||||
|
*
|
||||||
|
* - `level`
|
||||||
|
* - `windowBits`
|
||||||
|
* - `memLevel`
|
||||||
|
* - `strategy`
|
||||||
|
* - `dictionary`
|
||||||
|
*
|
||||||
|
* [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
|
||||||
|
* for more information on these.
|
||||||
|
*
|
||||||
|
* Additional options, for internal needs:
|
||||||
|
*
|
||||||
|
* - `chunkSize` - size of generated data chunks (16K by default)
|
||||||
|
* - `raw` (Boolean) - do raw deflate
|
||||||
|
* - `gzip` (Boolean) - create gzip wrapper
|
||||||
|
* - `header` (Object) - custom header for gzip
|
||||||
|
* - `text` (Boolean) - true if compressed data believed to be text
|
||||||
|
* - `time` (Number) - modification time, unix timestamp
|
||||||
|
* - `os` (Number) - operation system code
|
||||||
|
* - `extra` (Array) - array of bytes with extra data (max 65536)
|
||||||
|
* - `name` (String) - file name (binary string)
|
||||||
|
* - `comment` (String) - comment (binary string)
|
||||||
|
* - `hcrc` (Boolean) - true if header crc should be added
|
||||||
|
*
|
||||||
|
* ##### Example:
|
||||||
|
*
|
||||||
|
* ```javascript
|
||||||
|
* const pako from 'pako')
|
||||||
|
* , chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])
|
||||||
|
* , chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);
|
||||||
|
*
|
||||||
|
* const deflate = new pako.Deflate({ level: 3});
|
||||||
|
*
|
||||||
|
* deflate.push(chunk1, false);
|
||||||
|
* deflate.push(chunk2, true); // true -> last chunk
|
||||||
|
*
|
||||||
|
* if (deflate.err) { throw new Error(deflate.err); }
|
||||||
|
*
|
||||||
|
* console.log(deflate.result);
|
||||||
|
* ```
|
||||||
|
**/
|
||||||
|
function Deflate(options) {
|
||||||
|
this.options = Object.assign(
|
||||||
|
{
|
||||||
|
level: Z_DEFAULT_COMPRESSION,
|
||||||
|
method: Z_DEFLATED,
|
||||||
|
chunkSize: 16384,
|
||||||
|
windowBits: 15,
|
||||||
|
memLevel: 8,
|
||||||
|
strategy: Z_DEFAULT_STRATEGY
|
||||||
|
},
|
||||||
|
options || {}
|
||||||
|
)
|
||||||
|
|
||||||
|
let opt = this.options
|
||||||
|
|
||||||
|
if (opt.raw && opt.windowBits > 0) {
|
||||||
|
opt.windowBits = -opt.windowBits
|
||||||
|
} else if (opt.gzip && opt.windowBits > 0 && opt.windowBits < 16) {
|
||||||
|
opt.windowBits += 16
|
||||||
|
}
|
||||||
|
|
||||||
|
this.err = 0 // error code, if happens (0 = Z_OK)
|
||||||
|
this.msg = '' // error message
|
||||||
|
this.ended = false // used to avoid multiple onEnd() calls
|
||||||
|
this.chunks = [] // chunks of compressed data
|
||||||
|
|
||||||
|
this.strm = new ZStream()
|
||||||
|
this.strm.avail_out = 0
|
||||||
|
|
||||||
|
let status = zlib_deflate.deflateInit2(
|
||||||
|
this.strm,
|
||||||
|
opt.level,
|
||||||
|
opt.method,
|
||||||
|
opt.windowBits,
|
||||||
|
opt.memLevel,
|
||||||
|
opt.strategy
|
||||||
|
)
|
||||||
|
|
||||||
|
if (status !== Z_OK) {
|
||||||
|
throw new Error(msg[status])
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt.header) {
|
||||||
|
zlib_deflate.deflateSetHeader(this.strm, opt.header)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt.dictionary) {
|
||||||
|
let dict
|
||||||
|
// Convert data if needed
|
||||||
|
if (typeof opt.dictionary === 'string') {
|
||||||
|
// If we need to compress text, change encoding to utf8.
|
||||||
|
dict = string2buf(opt.dictionary)
|
||||||
|
} else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {
|
||||||
|
dict = new Uint8Array(opt.dictionary)
|
||||||
|
} else {
|
||||||
|
dict = opt.dictionary
|
||||||
|
}
|
||||||
|
|
||||||
|
status = zlib_deflate.deflateSetDictionary(this.strm, dict)
|
||||||
|
|
||||||
|
if (status !== Z_OK) {
|
||||||
|
throw new Error(msg[status])
|
||||||
|
}
|
||||||
|
|
||||||
|
this._dict_set = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deflate#push(data[, flush_mode]) -> Boolean
|
||||||
|
* - data (Uint8Array|ArrayBuffer|String): input data. Strings will be
|
||||||
|
* converted to utf8 byte sequence.
|
||||||
|
* - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.
|
||||||
|
* See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.
|
||||||
|
*
|
||||||
|
* Sends input data to deflate pipe, generating [[Deflate#onData]] calls with
|
||||||
|
* new compressed chunks. Returns `true` on success. The last data block must
|
||||||
|
* have `flush_mode` Z_FINISH (or `true`). That will flush internal pending
|
||||||
|
* buffers and call [[Deflate#onEnd]].
|
||||||
|
*
|
||||||
|
* On fail call [[Deflate#onEnd]] with error code and return false.
|
||||||
|
*
|
||||||
|
* ##### Example
|
||||||
|
*
|
||||||
|
* ```javascript
|
||||||
|
* push(chunk, false); // push one of data chunks
|
||||||
|
* ...
|
||||||
|
* push(chunk, true); // push last chunk
|
||||||
|
* ```
|
||||||
|
**/
|
||||||
|
Deflate.prototype.push = function (data, flush_mode) {
|
||||||
|
const strm = this.strm
|
||||||
|
const chunkSize = this.options.chunkSize
|
||||||
|
let status, _flush_mode
|
||||||
|
|
||||||
|
if (this.ended) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flush_mode === ~~flush_mode) _flush_mode = flush_mode
|
||||||
|
else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH
|
||||||
|
|
||||||
|
// Convert data if needed
|
||||||
|
if (typeof data === 'string') {
|
||||||
|
// If we need to compress text, change encoding to utf8.
|
||||||
|
strm.input = string2buf(data)
|
||||||
|
} else if (toString.call(data) === '[object ArrayBuffer]') {
|
||||||
|
strm.input = new Uint8Array(data)
|
||||||
|
} else {
|
||||||
|
strm.input = data
|
||||||
|
}
|
||||||
|
|
||||||
|
strm.next_in = 0
|
||||||
|
strm.avail_in = strm.input.length
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
if (strm.avail_out === 0) {
|
||||||
|
strm.output = new Uint8Array(chunkSize)
|
||||||
|
strm.next_out = 0
|
||||||
|
strm.avail_out = chunkSize
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure avail_out > 6 to avoid repeating markers
|
||||||
|
if (
|
||||||
|
(_flush_mode === Z_SYNC_FLUSH || _flush_mode === Z_FULL_FLUSH) &&
|
||||||
|
strm.avail_out <= 6
|
||||||
|
) {
|
||||||
|
this.onData(strm.output.subarray(0, strm.next_out))
|
||||||
|
strm.avail_out = 0
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
status = zlib_deflate.deflate(strm, _flush_mode)
|
||||||
|
|
||||||
|
// Ended => flush and finish
|
||||||
|
if (status === Z_STREAM_END) {
|
||||||
|
if (strm.next_out > 0) {
|
||||||
|
this.onData(strm.output.subarray(0, strm.next_out))
|
||||||
|
}
|
||||||
|
status = zlib_deflate.deflateEnd(this.strm)
|
||||||
|
this.onEnd(status)
|
||||||
|
this.ended = true
|
||||||
|
return status === Z_OK
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flush if out buffer full
|
||||||
|
if (strm.avail_out === 0) {
|
||||||
|
this.onData(strm.output)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flush if requested and has data
|
||||||
|
if (_flush_mode > 0 && strm.next_out > 0) {
|
||||||
|
this.onData(strm.output.subarray(0, strm.next_out))
|
||||||
|
strm.avail_out = 0
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strm.avail_in === 0) break
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deflate#onData(chunk) -> Void
|
||||||
|
* - chunk (Uint8Array): output data.
|
||||||
|
*
|
||||||
|
* By default, stores data blocks in `chunks[]` property and glue
|
||||||
|
* those in `onEnd`. Override this handler, if you need another behaviour.
|
||||||
|
**/
|
||||||
|
Deflate.prototype.onData = function (chunk) {
|
||||||
|
this.chunks.push(chunk)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deflate#onEnd(status) -> Void
|
||||||
|
* - status (Number): deflate status. 0 (Z_OK) on success,
|
||||||
|
* other if not.
|
||||||
|
*
|
||||||
|
* Called once after you tell deflate that the input stream is
|
||||||
|
* complete (Z_FINISH). By default - join collected chunks,
|
||||||
|
* free memory and fill `results` / `err` properties.
|
||||||
|
**/
|
||||||
|
Deflate.prototype.onEnd = function (status) {
|
||||||
|
// On success - join
|
||||||
|
if (status === Z_OK) {
|
||||||
|
this.result = flattenChunks(this.chunks)
|
||||||
|
}
|
||||||
|
this.chunks = []
|
||||||
|
this.err = status
|
||||||
|
this.msg = this.strm.msg
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* deflate(data[, options]) -> Uint8Array
|
||||||
|
* - data (Uint8Array|ArrayBuffer|String): input data to compress.
|
||||||
|
* - options (Object): zlib deflate options.
|
||||||
|
*
|
||||||
|
* Compress `data` with deflate algorithm and `options`.
|
||||||
|
*
|
||||||
|
* Supported options are:
|
||||||
|
*
|
||||||
|
* - level
|
||||||
|
* - windowBits
|
||||||
|
* - memLevel
|
||||||
|
* - strategy
|
||||||
|
* - dictionary
|
||||||
|
*
|
||||||
|
* [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
|
||||||
|
* for more information on these.
|
||||||
|
*
|
||||||
|
* Sugar (options):
|
||||||
|
*
|
||||||
|
* - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
|
||||||
|
* negative windowBits implicitly.
|
||||||
|
*
|
||||||
|
* ##### Example:
|
||||||
|
*
|
||||||
|
* ```javascript
|
||||||
|
* const pako from 'pako')
|
||||||
|
* const data = new Uint8Array([1,2,3,4,5,6,7,8,9]);
|
||||||
|
*
|
||||||
|
* console.log(pako.deflate(data));
|
||||||
|
* ```
|
||||||
|
**/
|
||||||
|
function deflate(input, options) {
|
||||||
|
const deflator = new Deflate(options)
|
||||||
|
|
||||||
|
deflator.push(input, true)
|
||||||
|
|
||||||
|
// That will never happens, if you don't cheat with options :)
|
||||||
|
if (deflator.err) {
|
||||||
|
throw deflator.msg || msg[deflator.err]
|
||||||
|
}
|
||||||
|
|
||||||
|
return deflator.result
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gzip(data[, options]) -> Uint8Array
|
||||||
|
* - data (Uint8Array|ArrayBuffer|String): input data to compress.
|
||||||
|
* - options (Object): zlib deflate options.
|
||||||
|
*
|
||||||
|
* The same as [[deflate]], but create gzip wrapper instead of
|
||||||
|
* deflate one.
|
||||||
|
**/
|
||||||
|
function gzip(input, options) {
|
||||||
|
options = options || {}
|
||||||
|
options.gzip = true
|
||||||
|
return deflate(input, options)
|
||||||
|
}
|
||||||
|
|
||||||
|
export { gzip }
|
|
@ -0,0 +1,408 @@
|
||||||
|
import zlib_inflate from './zlib/inflate.js'
|
||||||
|
import { flattenChunks } from './utils/common.js'
|
||||||
|
import { string2buf, utf8border, buf2string } from './utils/strings.js'
|
||||||
|
import msg from './zlib/messages.js'
|
||||||
|
import ZStream from './zlib/zstream.js'
|
||||||
|
import GZheader from './zlib/gzheader.js'
|
||||||
|
|
||||||
|
const toString = Object.prototype.toString
|
||||||
|
|
||||||
|
/* Public constants ==========================================================*/
|
||||||
|
/* ===========================================================================*/
|
||||||
|
|
||||||
|
import {
|
||||||
|
Z_NO_FLUSH,
|
||||||
|
Z_FINISH,
|
||||||
|
Z_OK,
|
||||||
|
Z_STREAM_END,
|
||||||
|
Z_NEED_DICT,
|
||||||
|
Z_STREAM_ERROR,
|
||||||
|
Z_DATA_ERROR,
|
||||||
|
Z_MEM_ERROR
|
||||||
|
} from './zlib/constants.js'
|
||||||
|
|
||||||
|
/* ===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* class Inflate
|
||||||
|
*
|
||||||
|
* Generic JS-style wrapper for zlib calls. If you don't need
|
||||||
|
* streaming behaviour - use more simple functions: [[inflate]]
|
||||||
|
* and [[inflateRaw]].
|
||||||
|
**/
|
||||||
|
|
||||||
|
/* internal
|
||||||
|
* inflate.chunks -> Array
|
||||||
|
*
|
||||||
|
* Chunks of output data, if [[Inflate#onData]] not overridden.
|
||||||
|
**/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inflate.result -> Uint8Array|String
|
||||||
|
*
|
||||||
|
* Uncompressed result, generated by default [[Inflate#onData]]
|
||||||
|
* and [[Inflate#onEnd]] handlers. Filled after you push last chunk
|
||||||
|
* (call [[Inflate#push]] with `Z_FINISH` / `true` param).
|
||||||
|
**/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inflate.err -> Number
|
||||||
|
*
|
||||||
|
* Error code after inflate finished. 0 (Z_OK) on success.
|
||||||
|
* Should be checked if broken data possible.
|
||||||
|
**/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inflate.msg -> String
|
||||||
|
*
|
||||||
|
* Error message, if [[Inflate.err]] != 0
|
||||||
|
**/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* new Inflate(options)
|
||||||
|
* - options (Object): zlib inflate options.
|
||||||
|
*
|
||||||
|
* Creates new inflator instance with specified params. Throws exception
|
||||||
|
* on bad params. Supported options:
|
||||||
|
*
|
||||||
|
* - `windowBits`
|
||||||
|
* - `dictionary`
|
||||||
|
*
|
||||||
|
* [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
|
||||||
|
* for more information on these.
|
||||||
|
*
|
||||||
|
* Additional options, for internal needs:
|
||||||
|
*
|
||||||
|
* - `chunkSize` - size of generated data chunks (16K by default)
|
||||||
|
* - `raw` (Boolean) - do raw inflate
|
||||||
|
* - `to` (String) - if equal to 'string', then result will be converted
|
||||||
|
* from utf8 to utf16 (javascript) string. When string output requested,
|
||||||
|
* chunk length can differ from `chunkSize`, depending on content.
|
||||||
|
*
|
||||||
|
* By default, when no options set, autodetect deflate/gzip data format via
|
||||||
|
* wrapper header.
|
||||||
|
*
|
||||||
|
* ##### Example:
|
||||||
|
*
|
||||||
|
* ```javascript
|
||||||
|
* const pako from 'pako')
|
||||||
|
* const chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])
|
||||||
|
* const chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);
|
||||||
|
*
|
||||||
|
* const inflate = new pako.Inflate({ level: 3});
|
||||||
|
*
|
||||||
|
* inflate.push(chunk1, false);
|
||||||
|
* inflate.push(chunk2, true); // true -> last chunk
|
||||||
|
*
|
||||||
|
* if (inflate.err) { throw new Error(inflate.err); }
|
||||||
|
*
|
||||||
|
* console.log(inflate.result);
|
||||||
|
* ```
|
||||||
|
**/
|
||||||
|
function Inflate(options) {
|
||||||
|
this.options = Object.assign(
|
||||||
|
{
|
||||||
|
chunkSize: 1024 * 64,
|
||||||
|
windowBits: 15,
|
||||||
|
to: ''
|
||||||
|
},
|
||||||
|
options || {}
|
||||||
|
)
|
||||||
|
|
||||||
|
const opt = this.options
|
||||||
|
|
||||||
|
// Force window size for `raw` data, if not set directly,
|
||||||
|
// because we have no header for autodetect.
|
||||||
|
if (opt.raw && opt.windowBits >= 0 && opt.windowBits < 16) {
|
||||||
|
opt.windowBits = -opt.windowBits
|
||||||
|
if (opt.windowBits === 0) {
|
||||||
|
opt.windowBits = -15
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate
|
||||||
|
if (
|
||||||
|
opt.windowBits >= 0 &&
|
||||||
|
opt.windowBits < 16 &&
|
||||||
|
!(options && options.windowBits)
|
||||||
|
) {
|
||||||
|
opt.windowBits += 32
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gzip header has no info about windows size, we can do autodetect only
|
||||||
|
// for deflate. So, if window size not set, force it to max when gzip possible
|
||||||
|
if (opt.windowBits > 15 && opt.windowBits < 48) {
|
||||||
|
// bit 3 (16) -> gzipped data
|
||||||
|
// bit 4 (32) -> autodetect gzip/deflate
|
||||||
|
if ((opt.windowBits & 15) === 0) {
|
||||||
|
opt.windowBits |= 15
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.err = 0 // error code, if happens (0 = Z_OK)
|
||||||
|
this.msg = '' // error message
|
||||||
|
this.ended = false // used to avoid multiple onEnd() calls
|
||||||
|
this.chunks = [] // chunks of compressed data
|
||||||
|
|
||||||
|
this.strm = new ZStream()
|
||||||
|
this.strm.avail_out = 0
|
||||||
|
|
||||||
|
let status = zlib_inflate.inflateInit2(this.strm, opt.windowBits)
|
||||||
|
|
||||||
|
if (status !== Z_OK) {
|
||||||
|
throw new Error(msg[status])
|
||||||
|
}
|
||||||
|
|
||||||
|
this.header = new GZheader()
|
||||||
|
|
||||||
|
zlib_inflate.inflateGetHeader(this.strm, this.header)
|
||||||
|
|
||||||
|
// Setup dictionary
|
||||||
|
if (opt.dictionary) {
|
||||||
|
// Convert data if needed
|
||||||
|
if (typeof opt.dictionary === 'string') {
|
||||||
|
opt.dictionary = string2buf(opt.dictionary)
|
||||||
|
} else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {
|
||||||
|
opt.dictionary = new Uint8Array(opt.dictionary)
|
||||||
|
}
|
||||||
|
if (opt.raw) {
|
||||||
|
//In raw mode we need to set the dictionary early
|
||||||
|
status = zlib_inflate.inflateSetDictionary(this.strm, opt.dictionary)
|
||||||
|
if (status !== Z_OK) {
|
||||||
|
throw new Error(msg[status])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inflate#push(data[, flush_mode]) -> Boolean
|
||||||
|
* - data (Uint8Array|ArrayBuffer): input data
|
||||||
|
* - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE
|
||||||
|
* flush modes. See constants. Skipped or `false` means Z_NO_FLUSH,
|
||||||
|
* `true` means Z_FINISH.
|
||||||
|
*
|
||||||
|
* Sends input data to inflate pipe, generating [[Inflate#onData]] calls with
|
||||||
|
* new output chunks. Returns `true` on success. If end of stream detected,
|
||||||
|
* [[Inflate#onEnd]] will be called.
|
||||||
|
*
|
||||||
|
* `flush_mode` is not needed for normal operation, because end of stream
|
||||||
|
* detected automatically. You may try to use it for advanced things, but
|
||||||
|
* this functionality was not tested.
|
||||||
|
*
|
||||||
|
* On fail call [[Inflate#onEnd]] with error code and return false.
|
||||||
|
*
|
||||||
|
* ##### Example
|
||||||
|
*
|
||||||
|
* ```javascript
|
||||||
|
* push(chunk, false); // push one of data chunks
|
||||||
|
* ...
|
||||||
|
* push(chunk, true); // push last chunk
|
||||||
|
* ```
|
||||||
|
**/
|
||||||
|
Inflate.prototype.push = function (data, flush_mode) {
|
||||||
|
const strm = this.strm
|
||||||
|
const chunkSize = this.options.chunkSize
|
||||||
|
const dictionary = this.options.dictionary
|
||||||
|
let status, _flush_mode, last_avail_out
|
||||||
|
|
||||||
|
if (this.ended) return false
|
||||||
|
|
||||||
|
if (flush_mode === ~~flush_mode) _flush_mode = flush_mode
|
||||||
|
else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH
|
||||||
|
|
||||||
|
// Convert data if needed
|
||||||
|
if (toString.call(data) === '[object ArrayBuffer]') {
|
||||||
|
strm.input = new Uint8Array(data)
|
||||||
|
} else {
|
||||||
|
strm.input = data
|
||||||
|
}
|
||||||
|
|
||||||
|
strm.next_in = 0
|
||||||
|
strm.avail_in = strm.input.length
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
if (strm.avail_out === 0) {
|
||||||
|
strm.output = new Uint8Array(chunkSize)
|
||||||
|
strm.next_out = 0
|
||||||
|
strm.avail_out = chunkSize
|
||||||
|
}
|
||||||
|
|
||||||
|
status = zlib_inflate.inflate(strm, _flush_mode)
|
||||||
|
|
||||||
|
if (status === Z_NEED_DICT && dictionary) {
|
||||||
|
status = zlib_inflate.inflateSetDictionary(strm, dictionary)
|
||||||
|
|
||||||
|
if (status === Z_OK) {
|
||||||
|
status = zlib_inflate.inflate(strm, _flush_mode)
|
||||||
|
} else if (status === Z_DATA_ERROR) {
|
||||||
|
// Replace code with more verbose
|
||||||
|
status = Z_NEED_DICT
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Skip snyc markers if more data follows and not raw mode
|
||||||
|
while (
|
||||||
|
strm.avail_in > 0 &&
|
||||||
|
status === Z_STREAM_END &&
|
||||||
|
strm.state.wrap > 0 &&
|
||||||
|
data[strm.next_in] !== 0
|
||||||
|
) {
|
||||||
|
zlib_inflate.inflateReset(strm)
|
||||||
|
status = zlib_inflate.inflate(strm, _flush_mode)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (status) {
|
||||||
|
case Z_STREAM_ERROR:
|
||||||
|
case Z_DATA_ERROR:
|
||||||
|
case Z_NEED_DICT:
|
||||||
|
case Z_MEM_ERROR:
|
||||||
|
this.onEnd(status)
|
||||||
|
this.ended = true
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remember real `avail_out` value, because we may patch out buffer content
|
||||||
|
// to align utf8 strings boundaries.
|
||||||
|
last_avail_out = strm.avail_out
|
||||||
|
|
||||||
|
if (strm.next_out) {
|
||||||
|
if (strm.avail_out === 0 || status === Z_STREAM_END) {
|
||||||
|
if (this.options.to === 'string') {
|
||||||
|
let next_out_utf8 = utf8border(strm.output, strm.next_out)
|
||||||
|
|
||||||
|
let tail = strm.next_out - next_out_utf8
|
||||||
|
let utf8str = buf2string(strm.output, next_out_utf8)
|
||||||
|
|
||||||
|
// move tail & realign counters
|
||||||
|
strm.next_out = tail
|
||||||
|
strm.avail_out = chunkSize - tail
|
||||||
|
if (tail)
|
||||||
|
strm.output.set(
|
||||||
|
strm.output.subarray(next_out_utf8, next_out_utf8 + tail),
|
||||||
|
0
|
||||||
|
)
|
||||||
|
|
||||||
|
this.onData(utf8str)
|
||||||
|
} else {
|
||||||
|
this.onData(
|
||||||
|
strm.output.length === strm.next_out
|
||||||
|
? strm.output
|
||||||
|
: strm.output.subarray(0, strm.next_out)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Must repeat iteration if out buffer is full
|
||||||
|
if (status === Z_OK && last_avail_out === 0) continue
|
||||||
|
|
||||||
|
// Finalize if end of stream reached.
|
||||||
|
if (status === Z_STREAM_END) {
|
||||||
|
status = zlib_inflate.inflateEnd(this.strm)
|
||||||
|
this.onEnd(status)
|
||||||
|
this.ended = true
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strm.avail_in === 0) break
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inflate#onData(chunk) -> Void
|
||||||
|
* - chunk (Uint8Array|String): output data. When string output requested,
|
||||||
|
* each chunk will be string.
|
||||||
|
*
|
||||||
|
* By default, stores data blocks in `chunks[]` property and glue
|
||||||
|
* those in `onEnd`. Override this handler, if you need another behaviour.
|
||||||
|
**/
|
||||||
|
Inflate.prototype.onData = function (chunk) {
|
||||||
|
this.chunks.push(chunk)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inflate#onEnd(status) -> Void
|
||||||
|
* - status (Number): inflate status. 0 (Z_OK) on success,
|
||||||
|
* other if not.
|
||||||
|
*
|
||||||
|
* Called either after you tell inflate that the input stream is
|
||||||
|
* complete (Z_FINISH). By default - join collected chunks,
|
||||||
|
* free memory and fill `results` / `err` properties.
|
||||||
|
**/
|
||||||
|
Inflate.prototype.onEnd = function (status) {
|
||||||
|
// On success - join
|
||||||
|
if (status === Z_OK) {
|
||||||
|
if (this.options.to === 'string') {
|
||||||
|
this.result = this.chunks.join('')
|
||||||
|
} else {
|
||||||
|
this.result = flattenChunks(this.chunks)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.chunks = []
|
||||||
|
this.err = status
|
||||||
|
this.msg = this.strm.msg
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* inflate(data[, options]) -> Uint8Array|String
|
||||||
|
* - data (Uint8Array|ArrayBuffer): input data to decompress.
|
||||||
|
* - options (Object): zlib inflate options.
|
||||||
|
*
|
||||||
|
* Decompress `data` with inflate/ungzip and `options`. Autodetect
|
||||||
|
* format via wrapper header by default. That's why we don't provide
|
||||||
|
* separate `ungzip` method.
|
||||||
|
*
|
||||||
|
* Supported options are:
|
||||||
|
*
|
||||||
|
* - windowBits
|
||||||
|
*
|
||||||
|
* [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
|
||||||
|
* for more information.
|
||||||
|
*
|
||||||
|
* Sugar (options):
|
||||||
|
*
|
||||||
|
* - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
|
||||||
|
* negative windowBits implicitly.
|
||||||
|
* - `to` (String) - if equal to 'string', then result will be converted
|
||||||
|
* from utf8 to utf16 (javascript) string. When string output requested,
|
||||||
|
* chunk length can differ from `chunkSize`, depending on content.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* ##### Example:
|
||||||
|
*
|
||||||
|
* ```javascript
|
||||||
|
* const pako from 'pako');
|
||||||
|
* const input = pako.deflate(new Uint8Array([1,2,3,4,5,6,7,8,9]));
|
||||||
|
* let output;
|
||||||
|
*
|
||||||
|
* try {
|
||||||
|
* output = pako.inflate(input);
|
||||||
|
* } catch (err) {
|
||||||
|
* console.log(err);
|
||||||
|
* }
|
||||||
|
* ```
|
||||||
|
**/
|
||||||
|
function ungzip(input, options) {
|
||||||
|
const inflator = new Inflate(options)
|
||||||
|
|
||||||
|
inflator.push(input)
|
||||||
|
|
||||||
|
// That will never happens, if you don't cheat with options :)
|
||||||
|
if (inflator.err) throw inflator.msg || msg[inflator.err]
|
||||||
|
|
||||||
|
return inflator.result
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ungzip(data[, options]) -> Uint8Array|String
|
||||||
|
* - data (Uint8Array|ArrayBuffer): input data to decompress.
|
||||||
|
* - options (Object): zlib inflate options.
|
||||||
|
*
|
||||||
|
* Just shortcut to [[inflate]], because it autodetects format
|
||||||
|
* by header.content. Done for convenience.
|
||||||
|
**/
|
||||||
|
|
||||||
|
export { ungzip }
|
|
@ -0,0 +1,20 @@
|
||||||
|
// Join array of chunks to single array.
|
||||||
|
export function flattenChunks(chunks) {
|
||||||
|
// calculate data length
|
||||||
|
let len = 0
|
||||||
|
|
||||||
|
for (let i = 0, l = chunks.length; i < l; i++) {
|
||||||
|
len += chunks[i].length
|
||||||
|
}
|
||||||
|
|
||||||
|
// join chunks
|
||||||
|
const result = new Uint8Array(len)
|
||||||
|
|
||||||
|
for (let i = 0, pos = 0, l = chunks.length; i < l; i++) {
|
||||||
|
let chunk = chunks[i]
|
||||||
|
result.set(chunk, pos)
|
||||||
|
pos += chunk.length
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
|
@ -0,0 +1,197 @@
|
||||||
|
// Quick check if we can use fast array to bin string conversion
|
||||||
|
//
|
||||||
|
// - apply(Array) can fail on Android 2.2
|
||||||
|
// - apply(Uint8Array) can fail on iOS 5.1 Safari
|
||||||
|
//
|
||||||
|
let STR_APPLY_UIA_OK = true
|
||||||
|
|
||||||
|
try {
|
||||||
|
String.fromCharCode.apply(null, new Uint8Array(1))
|
||||||
|
} catch (__) {
|
||||||
|
STR_APPLY_UIA_OK = false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Table with utf8 lengths (calculated by first byte of sequence)
|
||||||
|
// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,
|
||||||
|
// because max possible codepoint is 0x10ffff
|
||||||
|
const _utf8len = new Uint8Array(256)
|
||||||
|
for (let q = 0; q < 256; q++) {
|
||||||
|
_utf8len[q] =
|
||||||
|
q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1
|
||||||
|
}
|
||||||
|
_utf8len[254] = _utf8len[254] = 1 // Invalid sequence start
|
||||||
|
|
||||||
|
// convert string to array (typed, when possible)
|
||||||
|
export const string2buf = str => {
|
||||||
|
if (typeof TextEncoder === 'function' && TextEncoder.prototype.encode) {
|
||||||
|
return new TextEncoder().encode(str)
|
||||||
|
}
|
||||||
|
|
||||||
|
let buf,
|
||||||
|
c,
|
||||||
|
c2,
|
||||||
|
m_pos,
|
||||||
|
i,
|
||||||
|
str_len = str.length,
|
||||||
|
buf_len = 0
|
||||||
|
|
||||||
|
// count binary size
|
||||||
|
for (m_pos = 0; m_pos < str_len; m_pos++) {
|
||||||
|
c = str.charCodeAt(m_pos)
|
||||||
|
if ((c & 0xfc00) === 0xd800 && m_pos + 1 < str_len) {
|
||||||
|
c2 = str.charCodeAt(m_pos + 1)
|
||||||
|
if ((c2 & 0xfc00) === 0xdc00) {
|
||||||
|
c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00)
|
||||||
|
m_pos++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4
|
||||||
|
}
|
||||||
|
|
||||||
|
// allocate buffer
|
||||||
|
buf = new Uint8Array(buf_len)
|
||||||
|
|
||||||
|
// convert
|
||||||
|
for (i = 0, m_pos = 0; i < buf_len; m_pos++) {
|
||||||
|
c = str.charCodeAt(m_pos)
|
||||||
|
if ((c & 0xfc00) === 0xd800 && m_pos + 1 < str_len) {
|
||||||
|
c2 = str.charCodeAt(m_pos + 1)
|
||||||
|
if ((c2 & 0xfc00) === 0xdc00) {
|
||||||
|
c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00)
|
||||||
|
m_pos++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (c < 0x80) {
|
||||||
|
/* one byte */
|
||||||
|
buf[i++] = c
|
||||||
|
} else if (c < 0x800) {
|
||||||
|
/* two bytes */
|
||||||
|
buf[i++] = 0xc0 | (c >>> 6)
|
||||||
|
buf[i++] = 0x80 | (c & 0x3f)
|
||||||
|
} else if (c < 0x10000) {
|
||||||
|
/* three bytes */
|
||||||
|
buf[i++] = 0xe0 | (c >>> 12)
|
||||||
|
buf[i++] = 0x80 | ((c >>> 6) & 0x3f)
|
||||||
|
buf[i++] = 0x80 | (c & 0x3f)
|
||||||
|
} else {
|
||||||
|
/* four bytes */
|
||||||
|
buf[i++] = 0xf0 | (c >>> 18)
|
||||||
|
buf[i++] = 0x80 | ((c >>> 12) & 0x3f)
|
||||||
|
buf[i++] = 0x80 | ((c >>> 6) & 0x3f)
|
||||||
|
buf[i++] = 0x80 | (c & 0x3f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper
|
||||||
|
const buf2binstring = (buf, len) => {
|
||||||
|
// On Chrome, the arguments in a function call that are allowed is `65534`.
|
||||||
|
// If the length of the buffer is smaller than that, we can use this optimization,
|
||||||
|
// otherwise we will take a slower path.
|
||||||
|
if (len < 65534) {
|
||||||
|
if (buf.subarray && STR_APPLY_UIA_OK) {
|
||||||
|
return String.fromCharCode.apply(
|
||||||
|
null,
|
||||||
|
buf.length === len ? buf : buf.subarray(0, len)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let result = ''
|
||||||
|
for (let i = 0; i < len; i++) {
|
||||||
|
result += String.fromCharCode(buf[i])
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// convert array to string
|
||||||
|
export const buf2string = (buf, max) => {
|
||||||
|
const len = max || buf.length
|
||||||
|
|
||||||
|
if (typeof TextDecoder === 'function' && TextDecoder.prototype.decode) {
|
||||||
|
return new TextDecoder().decode(buf.subarray(0, max))
|
||||||
|
}
|
||||||
|
|
||||||
|
let i, out
|
||||||
|
|
||||||
|
// Reserve max possible length (2 words per char)
|
||||||
|
// NB: by unknown reasons, Array is significantly faster for
|
||||||
|
// String.fromCharCode.apply than Uint16Array.
|
||||||
|
const utf16buf = new Array(len * 2)
|
||||||
|
|
||||||
|
for (out = 0, i = 0; i < len; ) {
|
||||||
|
let c = buf[i++]
|
||||||
|
// quick process ascii
|
||||||
|
if (c < 0x80) {
|
||||||
|
utf16buf[out++] = c
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
let c_len = _utf8len[c]
|
||||||
|
// skip 5 & 6 byte codes
|
||||||
|
if (c_len > 4) {
|
||||||
|
utf16buf[out++] = 0xfffd
|
||||||
|
i += c_len - 1
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// apply mask on first byte
|
||||||
|
c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07
|
||||||
|
// join the rest
|
||||||
|
while (c_len > 1 && i < len) {
|
||||||
|
c = (c << 6) | (buf[i++] & 0x3f)
|
||||||
|
c_len--
|
||||||
|
}
|
||||||
|
|
||||||
|
// terminated by end of string?
|
||||||
|
if (c_len > 1) {
|
||||||
|
utf16buf[out++] = 0xfffd
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c < 0x10000) {
|
||||||
|
utf16buf[out++] = c
|
||||||
|
} else {
|
||||||
|
c -= 0x10000
|
||||||
|
utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff)
|
||||||
|
utf16buf[out++] = 0xdc00 | (c & 0x3ff)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf2binstring(utf16buf, out)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate max possible position in utf8 buffer,
|
||||||
|
// that will not break sequence. If that's not possible
|
||||||
|
// - (very small limits) return max size as is.
|
||||||
|
//
|
||||||
|
// buf[] - utf8 bytes array
|
||||||
|
// max - length limit (mandatory);
|
||||||
|
export const utf8border = (buf, max) => {
|
||||||
|
max = max || buf.length
|
||||||
|
if (max > buf.length) {
|
||||||
|
max = buf.length
|
||||||
|
}
|
||||||
|
|
||||||
|
// go back from last position, until start of sequence found
|
||||||
|
let pos = max - 1
|
||||||
|
while (pos >= 0 && (buf[pos] & 0xc0) === 0x80) {
|
||||||
|
pos--
|
||||||
|
}
|
||||||
|
|
||||||
|
// Very small and broken sequence,
|
||||||
|
// return max, because we should return something anyway.
|
||||||
|
if (pos < 0) {
|
||||||
|
return max
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we came to start of buffer - that means buffer is too small,
|
||||||
|
// return max too.
|
||||||
|
if (pos === 0) {
|
||||||
|
return max
|
||||||
|
}
|
||||||
|
|
||||||
|
return pos + _utf8len[buf[pos]] > max ? pos : max
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
// Note: adler32 takes 12% for level 0 and 2% for level 6.
|
||||||
|
// It isn't worth it to make additional optimizations as in original.
|
||||||
|
// Small size is preferable.
|
||||||
|
|
||||||
|
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
|
||||||
|
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would be
|
||||||
|
// appreciated but is not required.
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
// misrepresented as being the original software.
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
const adler32 = (adler, buf, len, pos) => {
|
||||||
|
let s1 = (adler & 0xffff) | 0,
|
||||||
|
s2 = ((adler >>> 16) & 0xffff) | 0,
|
||||||
|
n = 0
|
||||||
|
|
||||||
|
while (len !== 0) {
|
||||||
|
// Set limit ~ twice less than 5552, to keep
|
||||||
|
// s2 in 31-bits, because we force signed ints.
|
||||||
|
// in other case %= will fail.
|
||||||
|
n = len > 2000 ? 2000 : len
|
||||||
|
len -= n
|
||||||
|
|
||||||
|
do {
|
||||||
|
s1 = (s1 + buf[pos++]) | 0
|
||||||
|
s2 = (s2 + s1) | 0
|
||||||
|
} while (--n)
|
||||||
|
|
||||||
|
s1 %= 65521
|
||||||
|
s2 %= 65521
|
||||||
|
}
|
||||||
|
|
||||||
|
return s1 | (s2 << 16) | 0
|
||||||
|
}
|
||||||
|
|
||||||
|
export default adler32
|
|
@ -0,0 +1,43 @@
|
||||||
|
/* Allowed flush values; see deflate() and inflate() below for details */
|
||||||
|
export const Z_NO_FLUSH = 0
|
||||||
|
export const Z_PARTIAL_FLUSH = 1
|
||||||
|
export const Z_SYNC_FLUSH = 2
|
||||||
|
export const Z_FULL_FLUSH = 3
|
||||||
|
export const Z_FINISH = 4
|
||||||
|
export const Z_BLOCK = 5
|
||||||
|
export const Z_TREES = 6
|
||||||
|
|
||||||
|
/* Return codes for the compression/decompression functions. Negative values
|
||||||
|
* are errors positive values are used for special but normal events.
|
||||||
|
*/
|
||||||
|
export const Z_OK = 0
|
||||||
|
export const Z_STREAM_END = 1
|
||||||
|
export const Z_NEED_DICT = 2
|
||||||
|
export const Z_ERRNO = -1
|
||||||
|
export const Z_STREAM_ERROR = -2
|
||||||
|
export const Z_DATA_ERROR = -3
|
||||||
|
export const Z_MEM_ERROR = -4
|
||||||
|
export const Z_BUF_ERROR = -5
|
||||||
|
//Z_VERSION_ERROR = -6
|
||||||
|
|
||||||
|
/* compression levels */
|
||||||
|
export const Z_NO_COMPRESSION = 0
|
||||||
|
export const Z_BEST_SPEED = 1
|
||||||
|
export const Z_BEST_COMPRESSION = 9
|
||||||
|
export const Z_DEFAULT_COMPRESSION = -1
|
||||||
|
|
||||||
|
export const Z_FILTERED = 1
|
||||||
|
export const Z_HUFFMAN_ONLY = 2
|
||||||
|
export const Z_RLE = 3
|
||||||
|
export const Z_FIXED = 4
|
||||||
|
export const Z_DEFAULT_STRATEGY = 0
|
||||||
|
|
||||||
|
/* Possible values of the data_type field (though see inflate()) */
|
||||||
|
export const Z_BINARY = 0
|
||||||
|
export const Z_TEXT = 1
|
||||||
|
//Z_ASCII = 1 // = Z_TEXT (deprecated)
|
||||||
|
export const Z_UNKNOWN = 2
|
||||||
|
|
||||||
|
/* The deflate compression method */
|
||||||
|
export const Z_DEFLATED = 8
|
||||||
|
//Z_NULL = null // Use -1 or null inline, depending on var type
|
|
@ -0,0 +1,58 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
// Note: we can't get significant speed boost here.
|
||||||
|
// So write code to minimize size - no pregenerated tables
|
||||||
|
// and array tools dependencies.
|
||||||
|
|
||||||
|
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
|
||||||
|
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would be
|
||||||
|
// appreciated but is not required.
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
// misrepresented as being the original software.
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
// Use ordinary array, since untyped makes no boost here
|
||||||
|
const makeTable = () => {
|
||||||
|
let c,
|
||||||
|
table = []
|
||||||
|
|
||||||
|
for (var n = 0; n < 256; n++) {
|
||||||
|
c = n
|
||||||
|
for (var k = 0; k < 8; k++) {
|
||||||
|
c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1
|
||||||
|
}
|
||||||
|
table[n] = c
|
||||||
|
}
|
||||||
|
|
||||||
|
return table
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create table on load. Just 255 signed longs. Not a problem.
|
||||||
|
const crcTable = new Uint32Array(makeTable())
|
||||||
|
|
||||||
|
const crc32 = (crc, buf, len, pos) => {
|
||||||
|
const t = crcTable
|
||||||
|
const end = pos + len
|
||||||
|
|
||||||
|
crc ^= -1
|
||||||
|
|
||||||
|
for (let i = pos; i < end; i++) {
|
||||||
|
crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xff]
|
||||||
|
}
|
||||||
|
|
||||||
|
return crc ^ -1 // >>> 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default crc32
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,58 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
|
||||||
|
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would be
|
||||||
|
// appreciated but is not required.
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
// misrepresented as being the original software.
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
function GZheader() {
|
||||||
|
/* true if compressed data believed to be text */
|
||||||
|
this.text = 0
|
||||||
|
/* modification time */
|
||||||
|
this.time = 0
|
||||||
|
/* extra flags (not used when writing a gzip file) */
|
||||||
|
this.xflags = 0
|
||||||
|
/* operating system */
|
||||||
|
this.os = 0
|
||||||
|
/* pointer to extra field or Z_NULL if none */
|
||||||
|
this.extra = null
|
||||||
|
/* extra field length (valid if extra != Z_NULL) */
|
||||||
|
this.extra_len = 0 // Actually, we don't need it in JS,
|
||||||
|
// but leave for few code modifications
|
||||||
|
|
||||||
|
//
|
||||||
|
// Setup limits is not necessary because in js we should not preallocate memory
|
||||||
|
// for inflate use constant limit in 65536 bytes
|
||||||
|
//
|
||||||
|
|
||||||
|
/* space at extra (only when reading header) */
|
||||||
|
// this.extra_max = 0;
|
||||||
|
/* pointer to zero-terminated file name or Z_NULL */
|
||||||
|
this.name = ''
|
||||||
|
/* space at name (only when reading header) */
|
||||||
|
// this.name_max = 0;
|
||||||
|
/* pointer to zero-terminated comment or Z_NULL */
|
||||||
|
this.comment = ''
|
||||||
|
/* space at comment (only when reading header) */
|
||||||
|
// this.comm_max = 0;
|
||||||
|
/* true if there was or will be a header crc */
|
||||||
|
this.hcrc = 0
|
||||||
|
/* true when done reading gzip header (not used when writing a gzip file) */
|
||||||
|
this.done = false
|
||||||
|
}
|
||||||
|
|
||||||
|
export default GZheader
|
|
@ -0,0 +1,348 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
|
||||||
|
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would be
|
||||||
|
// appreciated but is not required.
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
// misrepresented as being the original software.
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
// See state defs from inflate.js
|
||||||
|
const BAD = 16209 /* got a data error -- remain here until reset */
|
||||||
|
const TYPE = 16191 /* i: waiting for type bits, including last-flag bit */
|
||||||
|
|
||||||
|
/*
|
||||||
|
Decode literal, length, and distance codes and write out the resulting
|
||||||
|
literal and match bytes until either not enough input or output is
|
||||||
|
available, an end-of-block is encountered, or a data error is encountered.
|
||||||
|
When large enough input and output buffers are supplied to inflate(), for
|
||||||
|
example, a 16K input buffer and a 64K output buffer, more than 95% of the
|
||||||
|
inflate execution time is spent in this routine.
|
||||||
|
|
||||||
|
Entry assumptions:
|
||||||
|
|
||||||
|
state.mode === LEN
|
||||||
|
strm.avail_in >= 6
|
||||||
|
strm.avail_out >= 258
|
||||||
|
start >= strm.avail_out
|
||||||
|
state.bits < 8
|
||||||
|
|
||||||
|
On return, state.mode is one of:
|
||||||
|
|
||||||
|
LEN -- ran out of enough output space or enough available input
|
||||||
|
TYPE -- reached end of block code, inflate() to interpret next block
|
||||||
|
BAD -- error in block data
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
- The maximum input bits used by a length/distance pair is 15 bits for the
|
||||||
|
length code, 5 bits for the length extra, 15 bits for the distance code,
|
||||||
|
and 13 bits for the distance extra. This totals 48 bits, or six bytes.
|
||||||
|
Therefore if strm.avail_in >= 6, then there is enough input to avoid
|
||||||
|
checking for available input while decoding.
|
||||||
|
|
||||||
|
- The maximum bytes that a single length/distance pair can output is 258
|
||||||
|
bytes, which is the maximum length that can be coded. inflate_fast()
|
||||||
|
requires strm.avail_out >= 258 for each loop to avoid checking for
|
||||||
|
output space.
|
||||||
|
*/
|
||||||
|
export default function inflate_fast(strm, start) {
|
||||||
|
let _in /* local strm.input */
|
||||||
|
let last /* have enough input while in < last */
|
||||||
|
let _out /* local strm.output */
|
||||||
|
let beg /* inflate()'s initial strm.output */
|
||||||
|
let end /* while out < end, enough space available */
|
||||||
|
//#ifdef INFLATE_STRICT
|
||||||
|
let dmax /* maximum distance from zlib header */
|
||||||
|
//#endif
|
||||||
|
let wsize /* window size or zero if not using window */
|
||||||
|
let whave /* valid bytes in the window */
|
||||||
|
let wnext /* window write index */
|
||||||
|
// Use `s_window` instead `window`, avoid conflict with instrumentation tools
|
||||||
|
let s_window /* allocated sliding window, if wsize != 0 */
|
||||||
|
let hold /* local strm.hold */
|
||||||
|
let bits /* local strm.bits */
|
||||||
|
let lcode /* local strm.lencode */
|
||||||
|
let dcode /* local strm.distcode */
|
||||||
|
let lmask /* mask for first level of length codes */
|
||||||
|
let dmask /* mask for first level of distance codes */
|
||||||
|
let here /* retrieved table entry */
|
||||||
|
let op /* code bits, operation, extra bits, or */
|
||||||
|
/* window position, window bytes to copy */
|
||||||
|
let len /* match length, unused bytes */
|
||||||
|
let dist /* match distance */
|
||||||
|
let from /* where to copy match from */
|
||||||
|
let from_source
|
||||||
|
|
||||||
|
let input, output // JS specific, because we have no pointers
|
||||||
|
|
||||||
|
/* copy state to local variables */
|
||||||
|
const state = strm.state
|
||||||
|
//here = state.here;
|
||||||
|
_in = strm.next_in
|
||||||
|
input = strm.input
|
||||||
|
last = _in + (strm.avail_in - 5)
|
||||||
|
_out = strm.next_out
|
||||||
|
output = strm.output
|
||||||
|
beg = _out - (start - strm.avail_out)
|
||||||
|
end = _out + (strm.avail_out - 257)
|
||||||
|
//#ifdef INFLATE_STRICT
|
||||||
|
dmax = state.dmax
|
||||||
|
//#endif
|
||||||
|
wsize = state.wsize
|
||||||
|
whave = state.whave
|
||||||
|
wnext = state.wnext
|
||||||
|
s_window = state.window
|
||||||
|
hold = state.hold
|
||||||
|
bits = state.bits
|
||||||
|
lcode = state.lencode
|
||||||
|
dcode = state.distcode
|
||||||
|
lmask = (1 << state.lenbits) - 1
|
||||||
|
dmask = (1 << state.distbits) - 1
|
||||||
|
|
||||||
|
/* decode literals and length/distances until end-of-block or not enough
|
||||||
|
input data or output space */
|
||||||
|
|
||||||
|
top: do {
|
||||||
|
if (bits < 15) {
|
||||||
|
hold += input[_in++] << bits
|
||||||
|
bits += 8
|
||||||
|
hold += input[_in++] << bits
|
||||||
|
bits += 8
|
||||||
|
}
|
||||||
|
|
||||||
|
here = lcode[hold & lmask]
|
||||||
|
|
||||||
|
dolen: for (;;) {
|
||||||
|
// Goto emulation
|
||||||
|
op = here >>> 24 /*here.bits*/
|
||||||
|
hold >>>= op
|
||||||
|
bits -= op
|
||||||
|
op = (here >>> 16) & 0xff /*here.op*/
|
||||||
|
if (op === 0) {
|
||||||
|
/* literal */
|
||||||
|
//Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
|
||||||
|
// "inflate: literal '%c'\n" :
|
||||||
|
// "inflate: literal 0x%02x\n", here.val));
|
||||||
|
output[_out++] = here & 0xffff /*here.val*/
|
||||||
|
} else if (op & 16) {
|
||||||
|
/* length base */
|
||||||
|
len = here & 0xffff /*here.val*/
|
||||||
|
op &= 15 /* number of extra bits */
|
||||||
|
if (op) {
|
||||||
|
if (bits < op) {
|
||||||
|
hold += input[_in++] << bits
|
||||||
|
bits += 8
|
||||||
|
}
|
||||||
|
len += hold & ((1 << op) - 1)
|
||||||
|
hold >>>= op
|
||||||
|
bits -= op
|
||||||
|
}
|
||||||
|
//Tracevv((stderr, "inflate: length %u\n", len));
|
||||||
|
if (bits < 15) {
|
||||||
|
hold += input[_in++] << bits
|
||||||
|
bits += 8
|
||||||
|
hold += input[_in++] << bits
|
||||||
|
bits += 8
|
||||||
|
}
|
||||||
|
here = dcode[hold & dmask]
|
||||||
|
|
||||||
|
dodist: for (;;) {
|
||||||
|
// goto emulation
|
||||||
|
op = here >>> 24 /*here.bits*/
|
||||||
|
hold >>>= op
|
||||||
|
bits -= op
|
||||||
|
op = (here >>> 16) & 0xff /*here.op*/
|
||||||
|
|
||||||
|
if (op & 16) {
|
||||||
|
/* distance base */
|
||||||
|
dist = here & 0xffff /*here.val*/
|
||||||
|
op &= 15 /* number of extra bits */
|
||||||
|
if (bits < op) {
|
||||||
|
hold += input[_in++] << bits
|
||||||
|
bits += 8
|
||||||
|
if (bits < op) {
|
||||||
|
hold += input[_in++] << bits
|
||||||
|
bits += 8
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dist += hold & ((1 << op) - 1)
|
||||||
|
//#ifdef INFLATE_STRICT
|
||||||
|
if (dist > dmax) {
|
||||||
|
strm.msg = 'invalid distance too far back'
|
||||||
|
state.mode = BAD
|
||||||
|
break top
|
||||||
|
}
|
||||||
|
//#endif
|
||||||
|
hold >>>= op
|
||||||
|
bits -= op
|
||||||
|
//Tracevv((stderr, "inflate: distance %u\n", dist));
|
||||||
|
op = _out - beg /* max distance in output */
|
||||||
|
if (dist > op) {
|
||||||
|
/* see if copy from window */
|
||||||
|
op = dist - op /* distance back in window */
|
||||||
|
if (op > whave) {
|
||||||
|
if (state.sane) {
|
||||||
|
strm.msg = 'invalid distance too far back'
|
||||||
|
state.mode = BAD
|
||||||
|
break top
|
||||||
|
}
|
||||||
|
|
||||||
|
// (!) This block is disabled in zlib defaults,
|
||||||
|
// don't enable it for binary compatibility
|
||||||
|
//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
|
||||||
|
// if (len <= op - whave) {
|
||||||
|
// do {
|
||||||
|
// output[_out++] = 0;
|
||||||
|
// } while (--len);
|
||||||
|
// continue top;
|
||||||
|
// }
|
||||||
|
// len -= op - whave;
|
||||||
|
// do {
|
||||||
|
// output[_out++] = 0;
|
||||||
|
// } while (--op > whave);
|
||||||
|
// if (op === 0) {
|
||||||
|
// from = _out - dist;
|
||||||
|
// do {
|
||||||
|
// output[_out++] = output[from++];
|
||||||
|
// } while (--len);
|
||||||
|
// continue top;
|
||||||
|
// }
|
||||||
|
//#endif
|
||||||
|
}
|
||||||
|
from = 0 // window index
|
||||||
|
from_source = s_window
|
||||||
|
if (wnext === 0) {
|
||||||
|
/* very common case */
|
||||||
|
from += wsize - op
|
||||||
|
if (op < len) {
|
||||||
|
/* some from window */
|
||||||
|
len -= op
|
||||||
|
do {
|
||||||
|
output[_out++] = s_window[from++]
|
||||||
|
} while (--op)
|
||||||
|
from = _out - dist /* rest from output */
|
||||||
|
from_source = output
|
||||||
|
}
|
||||||
|
} else if (wnext < op) {
|
||||||
|
/* wrap around window */
|
||||||
|
from += wsize + wnext - op
|
||||||
|
op -= wnext
|
||||||
|
if (op < len) {
|
||||||
|
/* some from end of window */
|
||||||
|
len -= op
|
||||||
|
do {
|
||||||
|
output[_out++] = s_window[from++]
|
||||||
|
} while (--op)
|
||||||
|
from = 0
|
||||||
|
if (wnext < len) {
|
||||||
|
/* some from start of window */
|
||||||
|
op = wnext
|
||||||
|
len -= op
|
||||||
|
do {
|
||||||
|
output[_out++] = s_window[from++]
|
||||||
|
} while (--op)
|
||||||
|
from = _out - dist /* rest from output */
|
||||||
|
from_source = output
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* contiguous in window */
|
||||||
|
from += wnext - op
|
||||||
|
if (op < len) {
|
||||||
|
/* some from window */
|
||||||
|
len -= op
|
||||||
|
do {
|
||||||
|
output[_out++] = s_window[from++]
|
||||||
|
} while (--op)
|
||||||
|
from = _out - dist /* rest from output */
|
||||||
|
from_source = output
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (len > 2) {
|
||||||
|
output[_out++] = from_source[from++]
|
||||||
|
output[_out++] = from_source[from++]
|
||||||
|
output[_out++] = from_source[from++]
|
||||||
|
len -= 3
|
||||||
|
}
|
||||||
|
if (len) {
|
||||||
|
output[_out++] = from_source[from++]
|
||||||
|
if (len > 1) {
|
||||||
|
output[_out++] = from_source[from++]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
from = _out - dist /* copy direct from output */
|
||||||
|
do {
|
||||||
|
/* minimum length is three */
|
||||||
|
output[_out++] = output[from++]
|
||||||
|
output[_out++] = output[from++]
|
||||||
|
output[_out++] = output[from++]
|
||||||
|
len -= 3
|
||||||
|
} while (len > 2)
|
||||||
|
if (len) {
|
||||||
|
output[_out++] = output[from++]
|
||||||
|
if (len > 1) {
|
||||||
|
output[_out++] = output[from++]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if ((op & 64) === 0) {
|
||||||
|
/* 2nd level distance code */
|
||||||
|
here =
|
||||||
|
dcode[(here & 0xffff) /*here.val*/ + (hold & ((1 << op) - 1))]
|
||||||
|
continue dodist
|
||||||
|
} else {
|
||||||
|
strm.msg = 'invalid distance code'
|
||||||
|
state.mode = BAD
|
||||||
|
break top
|
||||||
|
}
|
||||||
|
|
||||||
|
break // need to emulate goto via "continue"
|
||||||
|
}
|
||||||
|
} else if ((op & 64) === 0) {
|
||||||
|
/* 2nd level length code */
|
||||||
|
here = lcode[(here & 0xffff) /*here.val*/ + (hold & ((1 << op) - 1))]
|
||||||
|
continue dolen
|
||||||
|
} else if (op & 32) {
|
||||||
|
/* end-of-block */
|
||||||
|
//Tracevv((stderr, "inflate: end of block\n"));
|
||||||
|
state.mode = TYPE
|
||||||
|
break top
|
||||||
|
} else {
|
||||||
|
strm.msg = 'invalid literal/length code'
|
||||||
|
state.mode = BAD
|
||||||
|
break top
|
||||||
|
}
|
||||||
|
|
||||||
|
break // need to emulate goto via "continue"
|
||||||
|
}
|
||||||
|
} while (_in < last && _out < end)
|
||||||
|
|
||||||
|
/* return unused bytes (on entry, bits < 8, so in won't go too far back) */
|
||||||
|
len = bits >> 3
|
||||||
|
_in -= len
|
||||||
|
bits -= len << 3
|
||||||
|
hold &= (1 << bits) - 1
|
||||||
|
|
||||||
|
/* update state and return */
|
||||||
|
strm.next_in = _in
|
||||||
|
strm.next_out = _out
|
||||||
|
strm.avail_in = _in < last ? 5 + (last - _in) : 5 - (_in - last)
|
||||||
|
strm.avail_out = _out < end ? 257 + (end - _out) : 257 - (_out - end)
|
||||||
|
state.hold = hold
|
||||||
|
state.bits = bits
|
||||||
|
return
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,358 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
|
||||||
|
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would be
|
||||||
|
// appreciated but is not required.
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
// misrepresented as being the original software.
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
const MAXBITS = 15
|
||||||
|
const ENOUGH_LENS = 852
|
||||||
|
const ENOUGH_DISTS = 592
|
||||||
|
//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);
|
||||||
|
|
||||||
|
const CODES = 0
|
||||||
|
const LENS = 1
|
||||||
|
const DISTS = 2
|
||||||
|
|
||||||
|
const lbase = new Uint16Array([
|
||||||
|
/* Length codes 257..285 base */ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19,
|
||||||
|
23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0
|
||||||
|
])
|
||||||
|
|
||||||
|
const lext = new Uint8Array([
|
||||||
|
/* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17,
|
||||||
|
17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78
|
||||||
|
])
|
||||||
|
|
||||||
|
const dbase = new Uint16Array([
|
||||||
|
/* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65,
|
||||||
|
97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193,
|
||||||
|
12289, 16385, 24577, 0, 0
|
||||||
|
])
|
||||||
|
|
||||||
|
const dext = new Uint8Array([
|
||||||
|
/* Distance codes 0..29 extra */ 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20,
|
||||||
|
20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29,
|
||||||
|
64, 64
|
||||||
|
])
|
||||||
|
|
||||||
|
const inflate_table = (
|
||||||
|
type,
|
||||||
|
lens,
|
||||||
|
lens_index,
|
||||||
|
codes,
|
||||||
|
table,
|
||||||
|
table_index,
|
||||||
|
work,
|
||||||
|
opts
|
||||||
|
) => {
|
||||||
|
const bits = opts.bits
|
||||||
|
//here = opts.here; /* table entry for duplication */
|
||||||
|
|
||||||
|
let len = 0 /* a code's length in bits */
|
||||||
|
let sym = 0 /* index of code symbols */
|
||||||
|
let min = 0,
|
||||||
|
max = 0 /* minimum and maximum code lengths */
|
||||||
|
let root = 0 /* number of index bits for root table */
|
||||||
|
let curr = 0 /* number of index bits for current table */
|
||||||
|
let drop = 0 /* code bits to drop for sub-table */
|
||||||
|
let left = 0 /* number of prefix codes available */
|
||||||
|
let used = 0 /* code entries in table used */
|
||||||
|
let huff = 0 /* Huffman code */
|
||||||
|
let incr /* for incrementing code, index */
|
||||||
|
let fill /* index for replicating entries */
|
||||||
|
let low /* low bits for current root entry */
|
||||||
|
let mask /* mask for low root bits */
|
||||||
|
let next /* next available space in table */
|
||||||
|
let base = null /* base value table to use */
|
||||||
|
// let shoextra; /* extra bits table to use */
|
||||||
|
let match /* use base and extra for symbol >= match */
|
||||||
|
const count = new Uint16Array(MAXBITS + 1) //[MAXBITS+1]; /* number of codes of each length */
|
||||||
|
const offs = new Uint16Array(MAXBITS + 1) //[MAXBITS+1]; /* offsets in table for each length */
|
||||||
|
let extra = null
|
||||||
|
|
||||||
|
let here_bits, here_op, here_val
|
||||||
|
|
||||||
|
/*
|
||||||
|
Process a set of code lengths to create a canonical Huffman code. The
|
||||||
|
code lengths are lens[0..codes-1]. Each length corresponds to the
|
||||||
|
symbols 0..codes-1. The Huffman code is generated by first sorting the
|
||||||
|
symbols by length from short to long, and retaining the symbol order
|
||||||
|
for codes with equal lengths. Then the code starts with all zero bits
|
||||||
|
for the first code of the shortest length, and the codes are integer
|
||||||
|
increments for the same length, and zeros are appended as the length
|
||||||
|
increases. For the deflate format, these bits are stored backwards
|
||||||
|
from their more natural integer increment ordering, and so when the
|
||||||
|
decoding tables are built in the large loop below, the integer codes
|
||||||
|
are incremented backwards.
|
||||||
|
|
||||||
|
This routine assumes, but does not check, that all of the entries in
|
||||||
|
lens[] are in the range 0..MAXBITS. The caller must assure this.
|
||||||
|
1..MAXBITS is interpreted as that code length. zero means that that
|
||||||
|
symbol does not occur in this code.
|
||||||
|
|
||||||
|
The codes are sorted by computing a count of codes for each length,
|
||||||
|
creating from that a table of starting indices for each length in the
|
||||||
|
sorted table, and then entering the symbols in order in the sorted
|
||||||
|
table. The sorted table is work[], with that space being provided by
|
||||||
|
the caller.
|
||||||
|
|
||||||
|
The length counts are used for other purposes as well, i.e. finding
|
||||||
|
the minimum and maximum length codes, determining if there are any
|
||||||
|
codes at all, checking for a valid set of lengths, and looking ahead
|
||||||
|
at length counts to determine sub-table sizes when building the
|
||||||
|
decoding tables.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
|
||||||
|
for (len = 0; len <= MAXBITS; len++) {
|
||||||
|
count[len] = 0
|
||||||
|
}
|
||||||
|
for (sym = 0; sym < codes; sym++) {
|
||||||
|
count[lens[lens_index + sym]]++
|
||||||
|
}
|
||||||
|
|
||||||
|
/* bound code lengths, force root to be within code lengths */
|
||||||
|
root = bits
|
||||||
|
for (max = MAXBITS; max >= 1; max--) {
|
||||||
|
if (count[max] !== 0) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (root > max) {
|
||||||
|
root = max
|
||||||
|
}
|
||||||
|
if (max === 0) {
|
||||||
|
/* no symbols to code at all */
|
||||||
|
//table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */
|
||||||
|
//table.bits[opts.table_index] = 1; //here.bits = (var char)1;
|
||||||
|
//table.val[opts.table_index++] = 0; //here.val = (var short)0;
|
||||||
|
table[table_index++] = (1 << 24) | (64 << 16) | 0
|
||||||
|
|
||||||
|
//table.op[opts.table_index] = 64;
|
||||||
|
//table.bits[opts.table_index] = 1;
|
||||||
|
//table.val[opts.table_index++] = 0;
|
||||||
|
table[table_index++] = (1 << 24) | (64 << 16) | 0
|
||||||
|
|
||||||
|
opts.bits = 1
|
||||||
|
return 0 /* no symbols, but wait for decoding to report error */
|
||||||
|
}
|
||||||
|
for (min = 1; min < max; min++) {
|
||||||
|
if (count[min] !== 0) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (root < min) {
|
||||||
|
root = min
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check for an over-subscribed or incomplete set of lengths */
|
||||||
|
left = 1
|
||||||
|
for (len = 1; len <= MAXBITS; len++) {
|
||||||
|
left <<= 1
|
||||||
|
left -= count[len]
|
||||||
|
if (left < 0) {
|
||||||
|
return -1
|
||||||
|
} /* over-subscribed */
|
||||||
|
}
|
||||||
|
if (left > 0 && (type === CODES || max !== 1)) {
|
||||||
|
return -1 /* incomplete set */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* generate offsets into symbol table for each length for sorting */
|
||||||
|
offs[1] = 0
|
||||||
|
for (len = 1; len < MAXBITS; len++) {
|
||||||
|
offs[len + 1] = offs[len] + count[len]
|
||||||
|
}
|
||||||
|
|
||||||
|
/* sort symbols by length, by symbol order within each length */
|
||||||
|
for (sym = 0; sym < codes; sym++) {
|
||||||
|
if (lens[lens_index + sym] !== 0) {
|
||||||
|
work[offs[lens[lens_index + sym]]++] = sym
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Create and fill in decoding tables. In this loop, the table being
|
||||||
|
filled is at next and has curr index bits. The code being used is huff
|
||||||
|
with length len. That code is converted to an index by dropping drop
|
||||||
|
bits off of the bottom. For codes where len is less than drop + curr,
|
||||||
|
those top drop + curr - len bits are incremented through all values to
|
||||||
|
fill the table with replicated entries.
|
||||||
|
|
||||||
|
root is the number of index bits for the root table. When len exceeds
|
||||||
|
root, sub-tables are created pointed to by the root entry with an index
|
||||||
|
of the low root bits of huff. This is saved in low to check for when a
|
||||||
|
new sub-table should be started. drop is zero when the root table is
|
||||||
|
being filled, and drop is root when sub-tables are being filled.
|
||||||
|
|
||||||
|
When a new sub-table is needed, it is necessary to look ahead in the
|
||||||
|
code lengths to determine what size sub-table is needed. The length
|
||||||
|
counts are used for this, and so count[] is decremented as codes are
|
||||||
|
entered in the tables.
|
||||||
|
|
||||||
|
used keeps track of how many table entries have been allocated from the
|
||||||
|
provided *table space. It is checked for LENS and DIST tables against
|
||||||
|
the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
|
||||||
|
the initial root table size constants. See the comments in inftrees.h
|
||||||
|
for more information.
|
||||||
|
|
||||||
|
sym increments through all symbols, and the loop terminates when
|
||||||
|
all codes of length max, i.e. all codes, have been processed. This
|
||||||
|
routine permits incomplete codes, so another loop after this one fills
|
||||||
|
in the rest of the decoding tables with invalid code markers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* set up for code type */
|
||||||
|
// poor man optimization - use if-else instead of switch,
|
||||||
|
// to avoid deopts in old v8
|
||||||
|
if (type === CODES) {
|
||||||
|
base = extra = work /* dummy value--not used */
|
||||||
|
match = 20
|
||||||
|
} else if (type === LENS) {
|
||||||
|
base = lbase
|
||||||
|
extra = lext
|
||||||
|
match = 257
|
||||||
|
} else {
|
||||||
|
/* DISTS */
|
||||||
|
base = dbase
|
||||||
|
extra = dext
|
||||||
|
match = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
/* initialize opts for loop */
|
||||||
|
huff = 0 /* starting code */
|
||||||
|
sym = 0 /* starting code symbol */
|
||||||
|
len = min /* starting code length */
|
||||||
|
next = table_index /* current table to fill in */
|
||||||
|
curr = root /* current table index bits */
|
||||||
|
drop = 0 /* current bits to drop from code for index */
|
||||||
|
low = -1 /* trigger new sub-table when len > root */
|
||||||
|
used = 1 << root /* use root table entries */
|
||||||
|
mask = used - 1 /* mask for comparing low */
|
||||||
|
|
||||||
|
/* check available table space */
|
||||||
|
if (
|
||||||
|
(type === LENS && used > ENOUGH_LENS) ||
|
||||||
|
(type === DISTS && used > ENOUGH_DISTS)
|
||||||
|
) {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
/* process all codes and make table entries */
|
||||||
|
for (;;) {
|
||||||
|
/* create table entry */
|
||||||
|
here_bits = len - drop
|
||||||
|
if (work[sym] + 1 < match) {
|
||||||
|
here_op = 0
|
||||||
|
here_val = work[sym]
|
||||||
|
} else if (work[sym] >= match) {
|
||||||
|
here_op = extra[work[sym] - match]
|
||||||
|
here_val = base[work[sym] - match]
|
||||||
|
} else {
|
||||||
|
here_op = 32 + 64 /* end of block */
|
||||||
|
here_val = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
/* replicate for those indices with low len bits equal to huff */
|
||||||
|
incr = 1 << (len - drop)
|
||||||
|
fill = 1 << curr
|
||||||
|
min = fill /* save offset to next table */
|
||||||
|
do {
|
||||||
|
fill -= incr
|
||||||
|
table[next + (huff >> drop) + fill] =
|
||||||
|
(here_bits << 24) | (here_op << 16) | here_val | 0
|
||||||
|
} while (fill !== 0)
|
||||||
|
|
||||||
|
/* backwards increment the len-bit code huff */
|
||||||
|
incr = 1 << (len - 1)
|
||||||
|
while (huff & incr) {
|
||||||
|
incr >>= 1
|
||||||
|
}
|
||||||
|
if (incr !== 0) {
|
||||||
|
huff &= incr - 1
|
||||||
|
huff += incr
|
||||||
|
} else {
|
||||||
|
huff = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
/* go to next symbol, update count, len */
|
||||||
|
sym++
|
||||||
|
if (--count[len] === 0) {
|
||||||
|
if (len === max) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
len = lens[lens_index + work[sym]]
|
||||||
|
}
|
||||||
|
|
||||||
|
/* create new sub-table if needed */
|
||||||
|
if (len > root && (huff & mask) !== low) {
|
||||||
|
/* if first time, transition to sub-tables */
|
||||||
|
if (drop === 0) {
|
||||||
|
drop = root
|
||||||
|
}
|
||||||
|
|
||||||
|
/* increment past last table */
|
||||||
|
next += min /* here min is 1 << curr */
|
||||||
|
|
||||||
|
/* determine length of next table */
|
||||||
|
curr = len - drop
|
||||||
|
left = 1 << curr
|
||||||
|
while (curr + drop < max) {
|
||||||
|
left -= count[curr + drop]
|
||||||
|
if (left <= 0) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
curr++
|
||||||
|
left <<= 1
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check for enough space */
|
||||||
|
used += 1 << curr
|
||||||
|
if (
|
||||||
|
(type === LENS && used > ENOUGH_LENS) ||
|
||||||
|
(type === DISTS && used > ENOUGH_DISTS)
|
||||||
|
) {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
/* point entry in root table to sub-table */
|
||||||
|
low = huff & mask
|
||||||
|
/*table.op[low] = curr;
|
||||||
|
table.bits[low] = root;
|
||||||
|
table.val[low] = next - opts.table_index;*/
|
||||||
|
table[low] = (root << 24) | (curr << 16) | (next - table_index) | 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* fill in remaining table entry if code is incomplete (guaranteed to have
|
||||||
|
at most one remaining entry, since if the code is incomplete, the
|
||||||
|
maximum code length that was allowed to get this far is one bit) */
|
||||||
|
if (huff !== 0) {
|
||||||
|
//table.op[next + huff] = 64; /* invalid code marker */
|
||||||
|
//table.bits[next + huff] = len - drop;
|
||||||
|
//table.val[next + huff] = 0;
|
||||||
|
table[next + huff] = ((len - drop) << 24) | (64 << 16) | 0
|
||||||
|
}
|
||||||
|
|
||||||
|
/* set return parameters */
|
||||||
|
//opts.table_index += used;
|
||||||
|
opts.bits = root
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
export default inflate_table
|
|
@ -0,0 +1,32 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
|
||||||
|
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would be
|
||||||
|
// appreciated but is not required.
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
// misrepresented as being the original software.
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
export default {
|
||||||
|
2: 'need dictionary' /* Z_NEED_DICT 2 */,
|
||||||
|
1: 'stream end' /* Z_STREAM_END 1 */,
|
||||||
|
0: '' /* Z_OK 0 */,
|
||||||
|
'-1': 'file error' /* Z_ERRNO (-1) */,
|
||||||
|
'-2': 'stream error' /* Z_STREAM_ERROR (-2) */,
|
||||||
|
'-3': 'data error' /* Z_DATA_ERROR (-3) */,
|
||||||
|
'-4': 'insufficient memory' /* Z_MEM_ERROR (-4) */,
|
||||||
|
'-5': 'buffer error' /* Z_BUF_ERROR (-5) */,
|
||||||
|
'-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,45 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
|
||||||
|
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would be
|
||||||
|
// appreciated but is not required.
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
// misrepresented as being the original software.
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
export default function ZStream() {
|
||||||
|
/* next input byte */
|
||||||
|
this.input = null // JS specific, because we have no pointers
|
||||||
|
this.next_in = 0
|
||||||
|
/* number of bytes available at input */
|
||||||
|
this.avail_in = 0
|
||||||
|
/* total number of input bytes read so far */
|
||||||
|
this.total_in = 0
|
||||||
|
/* next output byte should be put there */
|
||||||
|
this.output = null // JS specific, because we have no pointers
|
||||||
|
this.next_out = 0
|
||||||
|
/* remaining free space at output */
|
||||||
|
this.avail_out = 0
|
||||||
|
/* total number of bytes output so far */
|
||||||
|
this.total_out = 0
|
||||||
|
/* last error message, NULL if no error */
|
||||||
|
this.msg = '' /*Z_NULL*/
|
||||||
|
/* not visible by applications */
|
||||||
|
this.state = null
|
||||||
|
/* best guess about the data type: binary or text */
|
||||||
|
this.data_type = 2 /*Z_UNKNOWN*/
|
||||||
|
/* adler32 value of the uncompressed data */
|
||||||
|
this.adler = 0
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
"name": "@bytedo/gzip",
|
||||||
|
"type": "module",
|
||||||
|
"description": "zlib port to javascript - fast, modularized, with browser support",
|
||||||
|
"version": "2.1.0",
|
||||||
|
"keywords": [
|
||||||
|
"zlib",
|
||||||
|
"deflate",
|
||||||
|
"inflate",
|
||||||
|
"gzip"
|
||||||
|
],
|
||||||
|
"files": [
|
||||||
|
"dist/*"
|
||||||
|
],
|
||||||
|
"license": "(MIT AND Zlib)",
|
||||||
|
"repository": "bytedo/gzip",
|
||||||
|
"scripts": {
|
||||||
|
"build": "esbuild index.js --minify --bundle --format=esm --target=esnext --outfile=dist/index.js"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"esbuild": "^0.17.16"
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue