mirror of
https://github.com/GoogleChromeLabs/squoosh.git
synced 2025-11-12 16:57:26 +00:00
Compare commits
5 Commits
maudnals-c
...
no-inline-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
94157a3ef3 | ||
|
|
c24505230d | ||
|
|
2238d1abaf | ||
|
|
65ea02627b | ||
|
|
18b53e2b8a |
4
.gitattributes
vendored
4
.gitattributes
vendored
@@ -1,2 +1,2 @@
|
|||||||
/codecs/**/*.js linguist-generated=true
|
/codecs/**/*.js linguist-generated -diff
|
||||||
/codecs/*/pkg*/*.d.ts linguist-generated=true
|
/codecs/*/pkg*/*.d.ts linguist-generated
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
CODEC_URL = https://github.com/libjxl/libjxl.git
|
CODEC_URL = https://github.com/libjxl/libjxl.git
|
||||||
CODEC_VERSION = v0.5
|
CODEC_VERSION = 9f544641ec83f6abd9da598bdd08178ee8a003e0
|
||||||
CODEC_DIR = node_modules/jxl
|
CODEC_DIR = node_modules/jxl
|
||||||
CODEC_BUILD_ROOT := $(CODEC_DIR)/build
|
CODEC_BUILD_ROOT := $(CODEC_DIR)/build
|
||||||
CODEC_MT_BUILD_DIR := $(CODEC_BUILD_ROOT)/mt
|
CODEC_MT_BUILD_DIR := $(CODEC_BUILD_ROOT)/mt
|
||||||
@@ -75,6 +75,9 @@ $(CODEC_MT_SIMD_BUILD_DIR)/Makefile: CXXFLAGS+=-msimd128
|
|||||||
-DCMAKE_CROSSCOMPILING_EMULATOR=node \
|
-DCMAKE_CROSSCOMPILING_EMULATOR=node \
|
||||||
-B $(@D) \
|
-B $(@D) \
|
||||||
$(<D)
|
$(<D)
|
||||||
|
emcc -Wall -O3 -o $(CODEC_DIR)/third_party/skcms/skcms.cc.o -I$(CODEC_DIR)/third_party/skcms -c $(CODEC_DIR)/third_party/skcms/skcms.cc
|
||||||
|
llvm-ar rc $(CODEC_BUILD_DIR)/third_party/libskcms.a $(CODEC_DIR)/third_party/skcms/skcms.cc.o
|
||||||
|
rm $(CODEC_DIR)/third_party/skcms/skcms.cc.o
|
||||||
|
|
||||||
$(CODEC_DIR)/CMakeLists.txt:
|
$(CODEC_DIR)/CMakeLists.txt:
|
||||||
$(RM) -r $(@D)
|
$(RM) -r $(@D)
|
||||||
|
|||||||
2
codecs/jxl/dec/jxl_dec.js
generated
2
codecs/jxl/dec/jxl_dec.js
generated
File diff suppressed because one or more lines are too long
Binary file not shown.
2
codecs/jxl/dec/jxl_node_dec.js
generated
2
codecs/jxl/dec/jxl_node_dec.js
generated
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -4,6 +4,7 @@
|
|||||||
#include "lib/jxl/base/thread_pool_internal.h"
|
#include "lib/jxl/base/thread_pool_internal.h"
|
||||||
#include "lib/jxl/enc_external_image.h"
|
#include "lib/jxl/enc_external_image.h"
|
||||||
#include "lib/jxl/enc_file.h"
|
#include "lib/jxl/enc_file.h"
|
||||||
|
#include "lib/jxl/enc_color_management.h"
|
||||||
|
|
||||||
using namespace emscripten;
|
using namespace emscripten;
|
||||||
|
|
||||||
@@ -17,6 +18,7 @@ struct JXLOptions {
|
|||||||
bool lossyPalette;
|
bool lossyPalette;
|
||||||
size_t decodingSpeedTier;
|
size_t decodingSpeedTier;
|
||||||
float photonNoiseIso;
|
float photonNoiseIso;
|
||||||
|
bool lossyModular;
|
||||||
};
|
};
|
||||||
|
|
||||||
val encode(std::string image, int width, int height, JXLOptions options) {
|
val encode(std::string image, int width, int height, JXLOptions options) {
|
||||||
@@ -50,11 +52,16 @@ val encode(std::string image, int width, int height, JXLOptions options) {
|
|||||||
float quality = options.quality;
|
float quality = options.quality;
|
||||||
|
|
||||||
// Quality settings roughly match libjpeg qualities.
|
// Quality settings roughly match libjpeg qualities.
|
||||||
if (quality < 7 || quality == 100) {
|
if (options.lossyModular || quality == 100) {
|
||||||
cparams.modular_mode = true;
|
cparams.modular_mode = true;
|
||||||
// Internal modular quality to roughly match VarDCT size.
|
// Internal modular quality to roughly match VarDCT size.
|
||||||
cparams.quality_pair.first = cparams.quality_pair.second =
|
if (quality < 7) {
|
||||||
std::min(35 + (quality - 7) * 3.0f, 100.0f);
|
cparams.quality_pair.first = cparams.quality_pair.second =
|
||||||
|
std::min(35 + (quality - 7) * 3.0f, 100.0f);
|
||||||
|
} else {
|
||||||
|
cparams.quality_pair.first = cparams.quality_pair.second =
|
||||||
|
std::min(35 + (quality - 7) * 65.f / 93.f, 100.0f);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
cparams.modular_mode = false;
|
cparams.modular_mode = false;
|
||||||
if (quality >= 30) {
|
if (quality >= 30) {
|
||||||
@@ -91,14 +98,14 @@ val encode(std::string image, int width, int height, JXLOptions options) {
|
|||||||
jxl::Span<const uint8_t>(reinterpret_cast<const uint8_t*>(image.data()), image.size()), width,
|
jxl::Span<const uint8_t>(reinterpret_cast<const uint8_t*>(image.data()), image.size()), width,
|
||||||
height, jxl::ColorEncoding::SRGB(/*is_gray=*/false), /*has_alpha=*/true,
|
height, jxl::ColorEncoding::SRGB(/*is_gray=*/false), /*has_alpha=*/true,
|
||||||
/*alpha_is_premultiplied=*/false, /*bits_per_sample=*/8, /*endiannes=*/JXL_LITTLE_ENDIAN,
|
/*alpha_is_premultiplied=*/false, /*bits_per_sample=*/8, /*endiannes=*/JXL_LITTLE_ENDIAN,
|
||||||
/*flipped_y=*/false, pool_ptr, main);
|
/*flipped_y=*/false, pool_ptr, main, /*(only true if bits_per_sample==32) float_in=*/false);
|
||||||
|
|
||||||
if (!result) {
|
if (!result) {
|
||||||
return val::null();
|
return val::null();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto js_result = val::null();
|
auto js_result = val::null();
|
||||||
if (EncodeFile(cparams, &io, &passes_enc_state, &bytes, /*aux=*/nullptr, pool_ptr)) {
|
if (EncodeFile(cparams, &io, &passes_enc_state, &bytes, jxl::GetJxlCms(), /*aux=*/nullptr, pool_ptr)) {
|
||||||
js_result = Uint8Array.new_(typed_memory_view(bytes.size(), bytes.data()));
|
js_result = Uint8Array.new_(typed_memory_view(bytes.size(), bytes.data()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -113,6 +120,7 @@ EMSCRIPTEN_BINDINGS(my_module) {
|
|||||||
.field("lossyPalette", &JXLOptions::lossyPalette)
|
.field("lossyPalette", &JXLOptions::lossyPalette)
|
||||||
.field("decodingSpeedTier", &JXLOptions::decodingSpeedTier)
|
.field("decodingSpeedTier", &JXLOptions::decodingSpeedTier)
|
||||||
.field("photonNoiseIso", &JXLOptions::photonNoiseIso)
|
.field("photonNoiseIso", &JXLOptions::photonNoiseIso)
|
||||||
|
.field("lossyModular", &JXLOptions::lossyModular)
|
||||||
.field("epf", &JXLOptions::epf);
|
.field("epf", &JXLOptions::epf);
|
||||||
|
|
||||||
function("encode", &encode);
|
function("encode", &encode);
|
||||||
|
|||||||
1
codecs/jxl/enc/jxl_enc.d.ts
vendored
1
codecs/jxl/enc/jxl_enc.d.ts
vendored
@@ -6,6 +6,7 @@ export interface EncodeOptions {
|
|||||||
lossyPalette: boolean;
|
lossyPalette: boolean;
|
||||||
decodingSpeedTier: number;
|
decodingSpeedTier: number;
|
||||||
photonNoiseIso: number;
|
photonNoiseIso: number;
|
||||||
|
lossyModular: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface JXLModule extends EmscriptenWasm.Module {
|
export interface JXLModule extends EmscriptenWasm.Module {
|
||||||
|
|||||||
2
codecs/jxl/enc/jxl_enc.js
generated
2
codecs/jxl/enc/jxl_enc.js
generated
File diff suppressed because one or more lines are too long
Binary file not shown.
2
codecs/jxl/enc/jxl_enc_mt.js
generated
2
codecs/jxl/enc/jxl_enc_mt.js
generated
File diff suppressed because one or more lines are too long
Binary file not shown.
2
codecs/jxl/enc/jxl_enc_mt_simd.js
generated
2
codecs/jxl/enc/jxl_enc_mt_simd.js
generated
File diff suppressed because one or more lines are too long
Binary file not shown.
2
codecs/jxl/enc/jxl_node_enc.js
generated
2
codecs/jxl/enc/jxl_node_enc.js
generated
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -11,10 +11,23 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
import { promisify } from 'util';
|
import { promisify } from 'util';
|
||||||
|
import { promises as fsp, readFileSync } from 'fs';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import { posix } from 'path';
|
import { posix } from 'path';
|
||||||
import glob from 'glob';
|
import glob from 'glob';
|
||||||
|
import postcss from 'postcss';
|
||||||
|
import postCSSNested from 'postcss-nested';
|
||||||
|
import postCSSUrl from 'postcss-url';
|
||||||
|
import postCSSModules from 'postcss-modules';
|
||||||
|
import postCSSSimpleVars from 'postcss-simple-vars';
|
||||||
|
import cssNano from 'cssnano';
|
||||||
|
import {
|
||||||
|
parse as parsePath,
|
||||||
|
resolve as resolvePath,
|
||||||
|
dirname,
|
||||||
|
normalize as nomalizePath,
|
||||||
|
sep as pathSep,
|
||||||
|
} from 'path';
|
||||||
|
|
||||||
const globP = promisify(glob);
|
const globP = promisify(glob);
|
||||||
|
|
||||||
@@ -30,26 +43,72 @@ export default function initialCssPlugin() {
|
|||||||
async load(id) {
|
async load(id) {
|
||||||
if (id !== initialCssModule) return;
|
if (id !== initialCssModule) return;
|
||||||
|
|
||||||
const matches = await globP('shared/prerendered-app/**/*.css', {
|
const matches = (
|
||||||
nodir: true,
|
await globP('shared/prerendered-app/**/*.css', {
|
||||||
cwd: path.join(process.cwd(), 'src'),
|
nodir: true,
|
||||||
});
|
cwd: path.join(process.cwd(), 'src'),
|
||||||
|
absolute: true,
|
||||||
|
})
|
||||||
|
).map((cssPath) =>
|
||||||
|
// glob() returns windows paths with a forward slash. Normalise it:
|
||||||
|
path.normalize(cssPath),
|
||||||
|
);
|
||||||
|
|
||||||
// Sort the matches so the parentmost items appear first.
|
// Sort the matches so the parentmost items appear first.
|
||||||
// This is a bit of a hack, but it means the util stuff appears in the cascade first.
|
// This is a bit of a hack, but it means the util stuff appears in the cascade first.
|
||||||
const sortedMatches = matches
|
const sortedMatches = matches
|
||||||
.map((match) => path.normalize(match).split(path.sep))
|
.map((match) => path.normalize(match).split(path.sep))
|
||||||
.sort((a, b) => a.length - b.length)
|
.sort((a, b) => a.length - b.length)
|
||||||
.map((match) => posix.join(...match));
|
.map((match) => '/' + posix.join(...match));
|
||||||
|
|
||||||
const imports = sortedMatches
|
const cssSources = await Promise.all(
|
||||||
.map((id, i) => `import css${i} from 'css:${id}';\n`)
|
sortedMatches.map(async (path) => {
|
||||||
.join('');
|
this.addWatchFile(path);
|
||||||
|
const file = await fsp.readFile(path);
|
||||||
|
|
||||||
return (
|
const cssResult = await postcss([
|
||||||
imports +
|
postCSSNested,
|
||||||
`export default ${sortedMatches.map((_, i) => `css${i}`).join(' + ')};`
|
postCSSSimpleVars(),
|
||||||
|
postCSSModules({
|
||||||
|
root: '',
|
||||||
|
}),
|
||||||
|
postCSSUrl({
|
||||||
|
url: ({ relativePath, url }) => {
|
||||||
|
if (/^((https?|data):|#)/.test(url)) return url;
|
||||||
|
const parsedPath = parsePath(relativePath);
|
||||||
|
const source = readFileSync(
|
||||||
|
resolvePath(dirname(path), relativePath),
|
||||||
|
);
|
||||||
|
const fileId = this.emitFile({
|
||||||
|
type: 'asset',
|
||||||
|
name: parsedPath.base,
|
||||||
|
source,
|
||||||
|
});
|
||||||
|
const hash = createHash('md5');
|
||||||
|
hash.update(source);
|
||||||
|
const md5 = hash.digest('hex');
|
||||||
|
hashToId.set(md5, fileId);
|
||||||
|
return `/fake/path/to/asset/${md5}/`;
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
cssNano,
|
||||||
|
]).process(file, {
|
||||||
|
from: path,
|
||||||
|
});
|
||||||
|
|
||||||
|
return cssResult.css;
|
||||||
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const css = cssSources.join('\n');
|
||||||
|
|
||||||
|
const fileId = this.emitFile({
|
||||||
|
type: 'asset',
|
||||||
|
source: css,
|
||||||
|
name: 'initial.css',
|
||||||
|
});
|
||||||
|
|
||||||
|
return `export default import.meta.ROLLUP_FILE_URL_${fileId};`;
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,19 +43,15 @@ The returned `image` object is a representation of the original image, that you
|
|||||||
When an image has been ingested, you can start preprocessing it and encoding it to other formats. This example will resize the image and then encode it to a `.jpg` and `.jxl` image:
|
When an image has been ingested, you can start preprocessing it and encoding it to other formats. This example will resize the image and then encode it to a `.jpg` and `.jxl` image:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
await image.decoded; //Wait until the image is decoded before running preprocessors.
|
|
||||||
|
|
||||||
const preprocessOptions = {
|
const preprocessOptions = {
|
||||||
//When both width and height are specified, the image resized to specified size.
|
//When both width and height are specified, the image resized to specified size.
|
||||||
resize: {
|
resize: {
|
||||||
enabled: true,
|
|
||||||
width: 100,
|
width: 100,
|
||||||
height: 50,
|
height: 50,
|
||||||
},
|
},
|
||||||
/*
|
/*
|
||||||
//When either width or height is specified, the image resized to specified size keeping aspect ratio.
|
//When either width or height is specified, the image resized to specified size keeping aspect ratio.
|
||||||
resize: {
|
resize: {
|
||||||
enabled: true,
|
|
||||||
width: 100,
|
width: 100,
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
@@ -68,7 +64,7 @@ const encodeOptions = {
|
|||||||
quality: 90,
|
quality: 90,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
await image.encode(encodeOptions);
|
const result = await image.encode(encodeOptions);
|
||||||
```
|
```
|
||||||
|
|
||||||
The default values for each option can be found in the [`codecs.ts`][codecs.ts] file under `defaultEncoderOptions`. Every unspecified value will use the default value specified there. _Better documentation is needed here._
|
The default values for each option can be found in the [`codecs.ts`][codecs.ts] file under `defaultEncoderOptions`. Every unspecified value will use the default value specified there. _Better documentation is needed here._
|
||||||
@@ -92,7 +88,7 @@ When you have encoded an image, you normally want to write it to a file.
|
|||||||
This example takes an image that has been encoded as a `jpg` and writes it to a file:
|
This example takes an image that has been encoded as a `jpg` and writes it to a file:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
const rawEncodedImage = (await image.encodedWith.mozjpeg).binary;
|
const rawEncodedImage = image.encodedWith.mozjpeg.binary;
|
||||||
|
|
||||||
fs.writeFile('/path/to/new/image.jpg', rawEncodedImage);
|
fs.writeFile('/path/to/new/image.jpg', rawEncodedImage);
|
||||||
```
|
```
|
||||||
@@ -103,10 +99,7 @@ This example iterates through all encoded versions of the image and writes them
|
|||||||
const newImagePath = '/path/to/image.'; //extension is added automatically
|
const newImagePath = '/path/to/image.'; //extension is added automatically
|
||||||
|
|
||||||
for (const encodedImage of Object.values(image.encodedWith)) {
|
for (const encodedImage of Object.values(image.encodedWith)) {
|
||||||
fs.writeFile(
|
fs.writeFile(newImagePath + encodedImage.extension, encodedImage.binary);
|
||||||
newImagePath + (await encodedImage).extension,
|
|
||||||
(await encodedImage).binary,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -135,7 +128,7 @@ console.log(await image.decoded);
|
|||||||
Information about an encoded image can be found at `Image.encodedWith[encoderName]`. It looks something like this:
|
Information about an encoded image can be found at `Image.encodedWith[encoderName]`. It looks something like this:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
console.log(await image.encodedWith.jxl);
|
console.log(image.encodedWith.jxl);
|
||||||
// Returns:
|
// Returns:
|
||||||
{
|
{
|
||||||
optionsUsed: {
|
optionsUsed: {
|
||||||
|
|||||||
26
libsquoosh/lib/move-d-ts.js
Normal file
26
libsquoosh/lib/move-d-ts.js
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
const fs = require('fs');
|
||||||
|
const del = require('del');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
const tsOutputDir = path.resolve('..', '.tmp', 'ts', 'libsquoosh');
|
||||||
|
const tsOutputSourceDir = path.join(tsOutputDir, 'src');
|
||||||
|
const buildDir = path.resolve('build');
|
||||||
|
|
||||||
|
(async () => {
|
||||||
|
await del(path.join(buildDir, '*.d.ts'));
|
||||||
|
const files = await fs.promises.readdir(tsOutputSourceDir);
|
||||||
|
|
||||||
|
const movePromises = [];
|
||||||
|
for (const file of files) {
|
||||||
|
if (file.endsWith('d.ts') || file.endsWith('d.ts.map')) {
|
||||||
|
movePromises.push(
|
||||||
|
fs.promises.rename(
|
||||||
|
path.join(tsOutputSourceDir, file),
|
||||||
|
path.join(buildDir, file),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// We need to remove `tsconfig.tsbuildinfo` otherwise TS does not emit unchanged `.d.ts` files
|
||||||
|
await del([path.join(tsOutputDir, 'tsconfig.tsbuildinfo')], { force: true });
|
||||||
|
})();
|
||||||
@@ -1,14 +1,15 @@
|
|||||||
{
|
{
|
||||||
"name": "@squoosh/lib",
|
"name": "@squoosh/lib",
|
||||||
"version": "0.4.0",
|
"version": "0.5.0",
|
||||||
"description": "A Node library for Squoosh",
|
"description": "A Node library for Squoosh",
|
||||||
"public": true,
|
"public": true,
|
||||||
"main": "./build/index.js",
|
"main": "./build/index.js",
|
||||||
|
"types": "./build/index.d.ts",
|
||||||
"files": [
|
"files": [
|
||||||
"/build/*"
|
"/build/*"
|
||||||
],
|
],
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "rollup -c"
|
"build": "rollup -c && node lib/move-d-ts.js"
|
||||||
},
|
},
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
"author": "Google Chrome Developers <chromium-dev@google.com>",
|
"author": "Google Chrome Developers <chromium-dev@google.com>",
|
||||||
|
|||||||
@@ -419,6 +419,7 @@ export const codecs = {
|
|||||||
lossyPalette: false,
|
lossyPalette: false,
|
||||||
decodingSpeedTier: 0,
|
decodingSpeedTier: 0,
|
||||||
photonNoiseIso: 0,
|
photonNoiseIso: 0,
|
||||||
|
lossyModular: false,
|
||||||
},
|
},
|
||||||
autoOptimize: {
|
autoOptimize: {
|
||||||
option: 'quality',
|
option: 'quality',
|
||||||
|
|||||||
@@ -22,9 +22,10 @@ type EncoderKey = keyof typeof encoders;
|
|||||||
type PreprocessorKey = keyof typeof preprocessors;
|
type PreprocessorKey = keyof typeof preprocessors;
|
||||||
|
|
||||||
type PreprocessOptions = {
|
type PreprocessOptions = {
|
||||||
resize?: ResizeOptions;
|
resize?: Partial<Omit<ResizeOptions, 'width' | 'height'>> &
|
||||||
quant?: QuantOptions;
|
(Pick<ResizeOptions, 'width'> | Pick<ResizeOptions, 'height'>);
|
||||||
rotate?: RotateOptions;
|
quant?: Partial<QuantOptions>;
|
||||||
|
rotate?: Partial<RotateOptions>;
|
||||||
};
|
};
|
||||||
type EncodeResult = {
|
type EncodeResult = {
|
||||||
optionsUsed: object;
|
optionsUsed: object;
|
||||||
|
|||||||
@@ -3,7 +3,8 @@
|
|||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"lib": ["esnext"],
|
"lib": ["esnext"],
|
||||||
"types": ["node"],
|
"types": ["node"],
|
||||||
"allowJs": true
|
"allowJs": true,
|
||||||
|
"declaration": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*", "../codecs/**/*"]
|
"include": ["src/**/*", "../codecs/**/*"]
|
||||||
}
|
}
|
||||||
|
|||||||
451
package-lock.json
generated
451
package-lock.json
generated
@@ -5,11 +5,9 @@
|
|||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "squoosh",
|
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"license": "apache-2.0",
|
"license": "apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"strict-csp": "^1.0.4",
|
|
||||||
"wasm-feature-detect": "^1.2.11"
|
"wasm-feature-detect": "^1.2.11"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@@ -288,14 +286,6 @@
|
|||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@types/cheerio": {
|
|
||||||
"version": "0.22.30",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.30.tgz",
|
|
||||||
"integrity": "sha512-t7ZVArWZlq3dFa9Yt33qFBQIK4CQd1Q3UJp0V+UhP6vgLWLM6Qug7vZuRSGXg45zXeB1Fm5X2vmBkEX58LV2Tw==",
|
|
||||||
"dependencies": {
|
|
||||||
"@types/node": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@types/color-name": {
|
"node_modules/@types/color-name": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
|
||||||
@@ -339,7 +329,8 @@
|
|||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "16.11.1",
|
"version": "16.11.1",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.1.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.1.tgz",
|
||||||
"integrity": "sha512-PYGcJHL9mwl1Ek3PLiYgyEKtwTMmkMw4vbiyz/ps3pfdRYLVv+SN7qHVAImrjdAXxgluDEw6Ph4lyv+m9UpRmA=="
|
"integrity": "sha512-PYGcJHL9mwl1Ek3PLiYgyEKtwTMmkMw4vbiyz/ps3pfdRYLVv+SN7qHVAImrjdAXxgluDEw6Ph4lyv+m9UpRmA==",
|
||||||
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/parse-json": {
|
"node_modules/@types/parse-json": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
@@ -603,7 +594,8 @@
|
|||||||
"node_modules/boolbase": {
|
"node_modules/boolbase": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
|
||||||
"integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
|
"integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
|
||||||
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/boxen": {
|
"node_modules/boxen": {
|
||||||
"version": "1.3.0",
|
"version": "1.3.0",
|
||||||
@@ -874,144 +866,6 @@
|
|||||||
"node": ">=4"
|
"node": ">=4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/cheerio": {
|
|
||||||
"version": "1.0.0-rc.10",
|
|
||||||
"resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz",
|
|
||||||
"integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==",
|
|
||||||
"dependencies": {
|
|
||||||
"cheerio-select": "^1.5.0",
|
|
||||||
"dom-serializer": "^1.3.2",
|
|
||||||
"domhandler": "^4.2.0",
|
|
||||||
"htmlparser2": "^6.1.0",
|
|
||||||
"parse5": "^6.0.1",
|
|
||||||
"parse5-htmlparser2-tree-adapter": "^6.0.1",
|
|
||||||
"tslib": "^2.2.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 6"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/cheeriojs/cheerio?sponsor=1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/cheerio-select": {
|
|
||||||
"version": "1.5.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz",
|
|
||||||
"integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==",
|
|
||||||
"dependencies": {
|
|
||||||
"css-select": "^4.1.3",
|
|
||||||
"css-what": "^5.0.1",
|
|
||||||
"domelementtype": "^2.2.0",
|
|
||||||
"domhandler": "^4.2.0",
|
|
||||||
"domutils": "^2.7.0"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/sponsors/fb55"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/cheerio-select/node_modules/css-select": {
|
|
||||||
"version": "4.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.0.tgz",
|
|
||||||
"integrity": "sha512-6YVG6hsH9yIb/si3Th/is8Pex7qnVHO6t7q7U6TIUnkQASGbS8tnUDBftnPynLNnuUl/r2+PTd0ekiiq7R0zJw==",
|
|
||||||
"dependencies": {
|
|
||||||
"boolbase": "^1.0.0",
|
|
||||||
"css-what": "^5.1.0",
|
|
||||||
"domhandler": "^4.3.0",
|
|
||||||
"domutils": "^2.8.0",
|
|
||||||
"nth-check": "^2.0.1"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/sponsors/fb55"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/cheerio-select/node_modules/css-what": {
|
|
||||||
"version": "5.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz",
|
|
||||||
"integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==",
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 6"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/sponsors/fb55"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/cheerio-select/node_modules/dom-serializer": {
|
|
||||||
"version": "1.3.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
|
|
||||||
"integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
|
|
||||||
"dependencies": {
|
|
||||||
"domelementtype": "^2.0.1",
|
|
||||||
"domhandler": "^4.2.0",
|
|
||||||
"entities": "^2.0.0"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/cheerio-select/node_modules/domelementtype": {
|
|
||||||
"version": "2.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
|
|
||||||
"integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
|
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"type": "github",
|
|
||||||
"url": "https://github.com/sponsors/fb55"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"node_modules/cheerio-select/node_modules/domutils": {
|
|
||||||
"version": "2.8.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
|
|
||||||
"integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
|
|
||||||
"dependencies": {
|
|
||||||
"dom-serializer": "^1.0.1",
|
|
||||||
"domelementtype": "^2.2.0",
|
|
||||||
"domhandler": "^4.2.0"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/fb55/domutils?sponsor=1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/cheerio-select/node_modules/nth-check": {
|
|
||||||
"version": "2.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz",
|
|
||||||
"integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==",
|
|
||||||
"dependencies": {
|
|
||||||
"boolbase": "^1.0.0"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/fb55/nth-check?sponsor=1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/cheerio/node_modules/dom-serializer": {
|
|
||||||
"version": "1.3.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
|
|
||||||
"integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
|
|
||||||
"dependencies": {
|
|
||||||
"domelementtype": "^2.0.1",
|
|
||||||
"domhandler": "^4.2.0",
|
|
||||||
"entities": "^2.0.0"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/cheerio/node_modules/domelementtype": {
|
|
||||||
"version": "2.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
|
|
||||||
"integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
|
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"type": "github",
|
|
||||||
"url": "https://github.com/sponsors/fb55"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"node_modules/cheerio/node_modules/tslib": {
|
|
||||||
"version": "2.3.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
|
|
||||||
"integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
|
|
||||||
},
|
|
||||||
"node_modules/clean-stack": {
|
"node_modules/clean-stack": {
|
||||||
"version": "2.2.0",
|
"version": "2.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
|
||||||
@@ -2121,31 +1975,6 @@
|
|||||||
"integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
|
"integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/domhandler": {
|
|
||||||
"version": "4.3.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz",
|
|
||||||
"integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==",
|
|
||||||
"dependencies": {
|
|
||||||
"domelementtype": "^2.2.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 4"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/fb55/domhandler?sponsor=1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/domhandler/node_modules/domelementtype": {
|
|
||||||
"version": "2.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
|
|
||||||
"integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
|
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"type": "github",
|
|
||||||
"url": "https://github.com/sponsors/fb55"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"node_modules/domutils": {
|
"node_modules/domutils": {
|
||||||
"version": "1.7.0",
|
"version": "1.7.0",
|
||||||
"resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
|
"resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
|
||||||
@@ -2237,7 +2066,8 @@
|
|||||||
"node_modules/entities": {
|
"node_modules/entities": {
|
||||||
"version": "2.0.3",
|
"version": "2.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz",
|
||||||
"integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ=="
|
"integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==",
|
||||||
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/error-ex": {
|
"node_modules/error-ex": {
|
||||||
"version": "1.3.2",
|
"version": "1.3.2",
|
||||||
@@ -2608,61 +2438,6 @@
|
|||||||
"integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==",
|
"integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/htmlparser2": {
|
|
||||||
"version": "6.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
|
|
||||||
"integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
|
|
||||||
"funding": [
|
|
||||||
"https://github.com/fb55/htmlparser2?sponsor=1",
|
|
||||||
{
|
|
||||||
"type": "github",
|
|
||||||
"url": "https://github.com/sponsors/fb55"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"dependencies": {
|
|
||||||
"domelementtype": "^2.0.1",
|
|
||||||
"domhandler": "^4.0.0",
|
|
||||||
"domutils": "^2.5.2",
|
|
||||||
"entities": "^2.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/htmlparser2/node_modules/dom-serializer": {
|
|
||||||
"version": "1.3.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
|
|
||||||
"integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
|
|
||||||
"dependencies": {
|
|
||||||
"domelementtype": "^2.0.1",
|
|
||||||
"domhandler": "^4.2.0",
|
|
||||||
"entities": "^2.0.0"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/htmlparser2/node_modules/domelementtype": {
|
|
||||||
"version": "2.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
|
|
||||||
"integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
|
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"type": "github",
|
|
||||||
"url": "https://github.com/sponsors/fb55"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"node_modules/htmlparser2/node_modules/domutils": {
|
|
||||||
"version": "2.8.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
|
|
||||||
"integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
|
|
||||||
"dependencies": {
|
|
||||||
"dom-serializer": "^1.0.1",
|
|
||||||
"domelementtype": "^2.2.0",
|
|
||||||
"domhandler": "^4.2.0"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/fb55/domutils?sponsor=1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/human-signals": {
|
"node_modules/human-signals": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
|
||||||
@@ -3903,19 +3678,6 @@
|
|||||||
"node": ">=4"
|
"node": ">=4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/parse5": {
|
|
||||||
"version": "6.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
|
|
||||||
"integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="
|
|
||||||
},
|
|
||||||
"node_modules/parse5-htmlparser2-tree-adapter": {
|
|
||||||
"version": "6.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
|
|
||||||
"integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==",
|
|
||||||
"dependencies": {
|
|
||||||
"parse5": "^6.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/path-is-absolute": {
|
"node_modules/path-is-absolute": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
|
||||||
@@ -8192,15 +7954,6 @@
|
|||||||
"integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
|
"integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/strict-csp": {
|
|
||||||
"version": "1.0.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/strict-csp/-/strict-csp-1.0.4.tgz",
|
|
||||||
"integrity": "sha512-CDAq0Zpg3XtJtUxjuOgKK2UgBnW03HDIFyb0rwpxNuQdYC8JquMfnGGhNZcbq22iYzVg6eCgqBScebA6MtwRdg==",
|
|
||||||
"dependencies": {
|
|
||||||
"@types/cheerio": "^0.22.23",
|
|
||||||
"cheerio": "^1.0.0-rc.5"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/string-argv": {
|
"node_modules/string-argv": {
|
||||||
"version": "0.3.1",
|
"version": "0.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz",
|
||||||
@@ -9121,14 +8874,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@types/cheerio": {
|
|
||||||
"version": "0.22.30",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.30.tgz",
|
|
||||||
"integrity": "sha512-t7ZVArWZlq3dFa9Yt33qFBQIK4CQd1Q3UJp0V+UhP6vgLWLM6Qug7vZuRSGXg45zXeB1Fm5X2vmBkEX58LV2Tw==",
|
|
||||||
"requires": {
|
|
||||||
"@types/node": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@types/color-name": {
|
"@types/color-name": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
|
||||||
@@ -9172,7 +8917,8 @@
|
|||||||
"@types/node": {
|
"@types/node": {
|
||||||
"version": "16.11.1",
|
"version": "16.11.1",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.1.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.1.tgz",
|
||||||
"integrity": "sha512-PYGcJHL9mwl1Ek3PLiYgyEKtwTMmkMw4vbiyz/ps3pfdRYLVv+SN7qHVAImrjdAXxgluDEw6Ph4lyv+m9UpRmA=="
|
"integrity": "sha512-PYGcJHL9mwl1Ek3PLiYgyEKtwTMmkMw4vbiyz/ps3pfdRYLVv+SN7qHVAImrjdAXxgluDEw6Ph4lyv+m9UpRmA==",
|
||||||
|
"dev": true
|
||||||
},
|
},
|
||||||
"@types/parse-json": {
|
"@types/parse-json": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
@@ -9395,7 +9141,8 @@
|
|||||||
"boolbase": {
|
"boolbase": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
|
||||||
"integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
|
"integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
|
||||||
|
"dev": true
|
||||||
},
|
},
|
||||||
"boxen": {
|
"boxen": {
|
||||||
"version": "1.3.0",
|
"version": "1.3.0",
|
||||||
@@ -9610,106 +9357,6 @@
|
|||||||
"supports-color": "^7.1.0"
|
"supports-color": "^7.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"cheerio": {
|
|
||||||
"version": "1.0.0-rc.10",
|
|
||||||
"resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz",
|
|
||||||
"integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==",
|
|
||||||
"requires": {
|
|
||||||
"cheerio-select": "^1.5.0",
|
|
||||||
"dom-serializer": "^1.3.2",
|
|
||||||
"domhandler": "^4.2.0",
|
|
||||||
"htmlparser2": "^6.1.0",
|
|
||||||
"parse5": "^6.0.1",
|
|
||||||
"parse5-htmlparser2-tree-adapter": "^6.0.1",
|
|
||||||
"tslib": "^2.2.0"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"dom-serializer": {
|
|
||||||
"version": "1.3.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
|
|
||||||
"integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
|
|
||||||
"requires": {
|
|
||||||
"domelementtype": "^2.0.1",
|
|
||||||
"domhandler": "^4.2.0",
|
|
||||||
"entities": "^2.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"domelementtype": {
|
|
||||||
"version": "2.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
|
|
||||||
"integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A=="
|
|
||||||
},
|
|
||||||
"tslib": {
|
|
||||||
"version": "2.3.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
|
|
||||||
"integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"cheerio-select": {
|
|
||||||
"version": "1.5.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz",
|
|
||||||
"integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==",
|
|
||||||
"requires": {
|
|
||||||
"css-select": "^4.1.3",
|
|
||||||
"css-what": "^5.0.1",
|
|
||||||
"domelementtype": "^2.2.0",
|
|
||||||
"domhandler": "^4.2.0",
|
|
||||||
"domutils": "^2.7.0"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"css-select": {
|
|
||||||
"version": "4.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.0.tgz",
|
|
||||||
"integrity": "sha512-6YVG6hsH9yIb/si3Th/is8Pex7qnVHO6t7q7U6TIUnkQASGbS8tnUDBftnPynLNnuUl/r2+PTd0ekiiq7R0zJw==",
|
|
||||||
"requires": {
|
|
||||||
"boolbase": "^1.0.0",
|
|
||||||
"css-what": "^5.1.0",
|
|
||||||
"domhandler": "^4.3.0",
|
|
||||||
"domutils": "^2.8.0",
|
|
||||||
"nth-check": "^2.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"css-what": {
|
|
||||||
"version": "5.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz",
|
|
||||||
"integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw=="
|
|
||||||
},
|
|
||||||
"dom-serializer": {
|
|
||||||
"version": "1.3.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
|
|
||||||
"integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
|
|
||||||
"requires": {
|
|
||||||
"domelementtype": "^2.0.1",
|
|
||||||
"domhandler": "^4.2.0",
|
|
||||||
"entities": "^2.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"domelementtype": {
|
|
||||||
"version": "2.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
|
|
||||||
"integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A=="
|
|
||||||
},
|
|
||||||
"domutils": {
|
|
||||||
"version": "2.8.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
|
|
||||||
"integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
|
|
||||||
"requires": {
|
|
||||||
"dom-serializer": "^1.0.1",
|
|
||||||
"domelementtype": "^2.2.0",
|
|
||||||
"domhandler": "^4.2.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"nth-check": {
|
|
||||||
"version": "2.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz",
|
|
||||||
"integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==",
|
|
||||||
"requires": {
|
|
||||||
"boolbase": "^1.0.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"clean-stack": {
|
"clean-stack": {
|
||||||
"version": "2.2.0",
|
"version": "2.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
|
||||||
@@ -10631,21 +10278,6 @@
|
|||||||
"integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
|
"integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"domhandler": {
|
|
||||||
"version": "4.3.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz",
|
|
||||||
"integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==",
|
|
||||||
"requires": {
|
|
||||||
"domelementtype": "^2.2.0"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"domelementtype": {
|
|
||||||
"version": "2.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
|
|
||||||
"integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A=="
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"domutils": {
|
"domutils": {
|
||||||
"version": "1.7.0",
|
"version": "1.7.0",
|
||||||
"resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
|
"resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
|
||||||
@@ -10721,7 +10353,8 @@
|
|||||||
"entities": {
|
"entities": {
|
||||||
"version": "2.0.3",
|
"version": "2.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz",
|
||||||
"integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ=="
|
"integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==",
|
||||||
|
"dev": true
|
||||||
},
|
},
|
||||||
"error-ex": {
|
"error-ex": {
|
||||||
"version": "1.3.2",
|
"version": "1.3.2",
|
||||||
@@ -11033,44 +10666,6 @@
|
|||||||
"integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==",
|
"integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"htmlparser2": {
|
|
||||||
"version": "6.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
|
|
||||||
"integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
|
|
||||||
"requires": {
|
|
||||||
"domelementtype": "^2.0.1",
|
|
||||||
"domhandler": "^4.0.0",
|
|
||||||
"domutils": "^2.5.2",
|
|
||||||
"entities": "^2.0.0"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"dom-serializer": {
|
|
||||||
"version": "1.3.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
|
|
||||||
"integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
|
|
||||||
"requires": {
|
|
||||||
"domelementtype": "^2.0.1",
|
|
||||||
"domhandler": "^4.2.0",
|
|
||||||
"entities": "^2.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"domelementtype": {
|
|
||||||
"version": "2.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
|
|
||||||
"integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A=="
|
|
||||||
},
|
|
||||||
"domutils": {
|
|
||||||
"version": "2.8.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
|
|
||||||
"integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
|
|
||||||
"requires": {
|
|
||||||
"dom-serializer": "^1.0.1",
|
|
||||||
"domelementtype": "^2.2.0",
|
|
||||||
"domhandler": "^4.2.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"human-signals": {
|
"human-signals": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
|
||||||
@@ -12067,19 +11662,6 @@
|
|||||||
"lines-and-columns": "^1.1.6"
|
"lines-and-columns": "^1.1.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"parse5": {
|
|
||||||
"version": "6.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
|
|
||||||
"integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="
|
|
||||||
},
|
|
||||||
"parse5-htmlparser2-tree-adapter": {
|
|
||||||
"version": "6.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
|
|
||||||
"integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==",
|
|
||||||
"requires": {
|
|
||||||
"parse5": "^6.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"path-is-absolute": {
|
"path-is-absolute": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
|
||||||
@@ -15679,15 +15261,6 @@
|
|||||||
"integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
|
"integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"strict-csp": {
|
|
||||||
"version": "1.0.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/strict-csp/-/strict-csp-1.0.4.tgz",
|
|
||||||
"integrity": "sha512-CDAq0Zpg3XtJtUxjuOgKK2UgBnW03HDIFyb0rwpxNuQdYC8JquMfnGGhNZcbq22iYzVg6eCgqBScebA6MtwRdg==",
|
|
||||||
"requires": {
|
|
||||||
"@types/cheerio": "^0.22.23",
|
|
||||||
"cheerio": "^1.0.0-rc.5"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"string-argv": {
|
"string-argv": {
|
||||||
"version": "0.3.1",
|
"version": "0.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz",
|
||||||
|
|||||||
@@ -54,7 +54,6 @@
|
|||||||
"*.rs": "rustfmt"
|
"*.rs": "rustfmt"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"strict-csp": "^1.0.4",
|
|
||||||
"wasm-feature-detect": "^1.2.11"
|
"wasm-feature-detect": "^1.2.11"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,11 @@ export default class Checkbox extends Component<Props, State> {
|
|||||||
return (
|
return (
|
||||||
<div class={style.checkbox}>
|
<div class={style.checkbox}>
|
||||||
{props.checked ? (
|
{props.checked ? (
|
||||||
<CheckedIcon class={`${style.icon} ${style.checked}`} />
|
props.disabled ? (
|
||||||
|
<CheckedIcon class={`${style.icon} ${style.disabled}`} />
|
||||||
|
) : (
|
||||||
|
<CheckedIcon class={`${style.icon} ${style.checked}`} />
|
||||||
|
)
|
||||||
) : (
|
) : (
|
||||||
<UncheckedIcon class={style.icon} />
|
<UncheckedIcon class={style.icon} />
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -20,3 +20,7 @@
|
|||||||
.checked {
|
.checked {
|
||||||
fill: var(--main-theme-color);
|
fill: var(--main-theme-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.disabled {
|
||||||
|
fill: var(--dark-gray);
|
||||||
|
}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ interface State {
|
|||||||
autoEdgePreservingFilter: boolean;
|
autoEdgePreservingFilter: boolean;
|
||||||
decodingSpeedTier: number;
|
decodingSpeedTier: number;
|
||||||
photonNoiseIso: number;
|
photonNoiseIso: number;
|
||||||
|
alternativeLossy: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Options extends Component<Props, State> {
|
export class Options extends Component<Props, State> {
|
||||||
@@ -55,6 +56,7 @@ export class Options extends Component<Props, State> {
|
|||||||
autoEdgePreservingFilter: options.epf === -1,
|
autoEdgePreservingFilter: options.epf === -1,
|
||||||
decodingSpeedTier: options.decodingSpeedTier,
|
decodingSpeedTier: options.decodingSpeedTier,
|
||||||
photonNoiseIso: options.photonNoiseIso,
|
photonNoiseIso: options.photonNoiseIso,
|
||||||
|
alternativeLossy: options.lossyModular,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,6 +98,7 @@ export class Options extends Component<Props, State> {
|
|||||||
lossyPalette: optionState.lossless ? optionState.slightLoss : false,
|
lossyPalette: optionState.lossless ? optionState.slightLoss : false,
|
||||||
decodingSpeedTier: optionState.decodingSpeedTier,
|
decodingSpeedTier: optionState.decodingSpeedTier,
|
||||||
photonNoiseIso: optionState.photonNoiseIso,
|
photonNoiseIso: optionState.photonNoiseIso,
|
||||||
|
lossyModular: optionState.quality < 7 ? true : optionState.alternativeLossy,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Updating options, so we don't recalculate in getDerivedStateFromProps.
|
// Updating options, so we don't recalculate in getDerivedStateFromProps.
|
||||||
@@ -122,6 +125,7 @@ export class Options extends Component<Props, State> {
|
|||||||
autoEdgePreservingFilter,
|
autoEdgePreservingFilter,
|
||||||
decodingSpeedTier,
|
decodingSpeedTier,
|
||||||
photonNoiseIso,
|
photonNoiseIso,
|
||||||
|
alternativeLossy,
|
||||||
}: State,
|
}: State,
|
||||||
) {
|
) {
|
||||||
// I'm rendering both lossy and lossless forms, as it becomes much easier when
|
// I'm rendering both lossy and lossless forms, as it becomes much easier when
|
||||||
@@ -162,6 +166,14 @@ export class Options extends Component<Props, State> {
|
|||||||
Quality:
|
Quality:
|
||||||
</Range>
|
</Range>
|
||||||
</div>
|
</div>
|
||||||
|
<label class={style.optionToggle}>
|
||||||
|
Alternative lossy mode
|
||||||
|
<Checkbox
|
||||||
|
checked={quality < 7 ? true : alternativeLossy}
|
||||||
|
disabled={quality < 7}
|
||||||
|
onChange={this._inputChange('alternativeLossy', 'boolean')}
|
||||||
|
/>
|
||||||
|
</label>
|
||||||
<label class={style.optionToggle}>
|
<label class={style.optionToggle}>
|
||||||
Auto edge filter
|
Auto edge filter
|
||||||
<Checkbox
|
<Checkbox
|
||||||
@@ -223,7 +235,7 @@ export class Options extends Component<Props, State> {
|
|||||||
</label>
|
</label>
|
||||||
<div class={style.optionOneCell}>
|
<div class={style.optionOneCell}>
|
||||||
<Range
|
<Range
|
||||||
min="3"
|
min="1"
|
||||||
max="9"
|
max="9"
|
||||||
value={effort}
|
value={effort}
|
||||||
onInput={this._inputChange('effort', 'number')}
|
onInput={this._inputChange('effort', 'number')}
|
||||||
|
|||||||
@@ -25,4 +25,5 @@ export const defaultOptions: EncodeOptions = {
|
|||||||
lossyPalette: false,
|
lossyPalette: false,
|
||||||
decodingSpeedTier: 0,
|
decodingSpeedTier: 0,
|
||||||
photonNoiseIso: 0,
|
photonNoiseIso: 0,
|
||||||
|
lossyModular: false,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -64,11 +64,7 @@ const Index: FunctionalComponent<Props> = () => (
|
|||||||
<style
|
<style
|
||||||
dangerouslySetInnerHTML={{ __html: escapeStyleScriptContent(baseCss) }}
|
dangerouslySetInnerHTML={{ __html: escapeStyleScriptContent(baseCss) }}
|
||||||
/>
|
/>
|
||||||
<style
|
<link rel="stylesheet" href={initialCss} />
|
||||||
dangerouslySetInnerHTML={{
|
|
||||||
__html: escapeStyleScriptContent(initialCss),
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="app">
|
<div id="app">
|
||||||
|
|||||||
@@ -16,35 +16,8 @@ import { join as joinPath } from 'path';
|
|||||||
import render from 'preact-render-to-string';
|
import render from 'preact-render-to-string';
|
||||||
import { VNode } from 'preact';
|
import { VNode } from 'preact';
|
||||||
|
|
||||||
import { StrictCsp } from 'strict-csp';
|
|
||||||
|
|
||||||
export function renderPage(vnode: VNode) {
|
export function renderPage(vnode: VNode) {
|
||||||
const htmlString = '<!DOCTYPE html>' + render(vnode);
|
return '<!DOCTYPE html>' + render(vnode);
|
||||||
const htmlStringWithCsp = addCspAsMetaTag(htmlString);
|
|
||||||
return htmlStringWithCsp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add to the html string a strict Content-Security-Policy (CSP), as a meta tag.
|
|
||||||
* Details at https://web.dev/strict-csp/
|
|
||||||
*/
|
|
||||||
function addCspAsMetaTag(htmlString: string) {
|
|
||||||
const s = new StrictCsp(htmlString);
|
|
||||||
// Refactor sourced scripts so that we can set a strict CSP
|
|
||||||
s.refactorSourcedScriptsForHashBasedCsp();
|
|
||||||
// Hash inline scripts from this html file, if there are any
|
|
||||||
const scriptHashes = s.hashAllInlineScripts();
|
|
||||||
// Generate a strict CSP as a string
|
|
||||||
// enableUnsafeEval is set to true, to accomodate for uses of eval by emscripten. This makes the CSP a bit less secure
|
|
||||||
const strictCsp = StrictCsp.getStrictCsp(scriptHashes, {
|
|
||||||
enableBrowserFallbacks: true,
|
|
||||||
enableTrustedTypes: false,
|
|
||||||
enableUnsafeEval: true,
|
|
||||||
});
|
|
||||||
// Set this CSP via a meta tag
|
|
||||||
s.addMetaTag(strictCsp);
|
|
||||||
const htmlStringWithCsp = s.serializeDom();
|
|
||||||
return htmlStringWithCsp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
interface OutputMap {
|
interface OutputMap {
|
||||||
|
|||||||
Reference in New Issue
Block a user