diff --git a/CHANGELOG.md b/CHANGELOG.md index 70506b2..1c43bd8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# Next + +- **[Breaking change]** Update to `swf-tree@0.7`. + # 0.5.4 (2019-05-20) - **[Feature]** Implement parser for `DefineFont2` ([#38](https://github.com/open-flash/swf-parser/issues/38)). diff --git a/rs/Cargo.lock b/rs/Cargo.lock index c263014..e1db582 100644 --- a/rs/Cargo.lock +++ b/rs/Cargo.lock @@ -13,6 +13,11 @@ dependencies = [ "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "autocfg" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "build_const" version = "0.2.1" @@ -103,8 +108,11 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "proc-macro2" @@ -124,7 +132,7 @@ dependencies = [ [[package]] name = "regex" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -204,19 +212,19 @@ dependencies = [ "lzma-rs 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json_v8 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "swf-fixed 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "swf-tree 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "swf-tree 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "test-generator 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "swf-tree" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -276,6 +284,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] "checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" "checksum aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e6f484ae0c99fec2e858eb6134949117399f222608d84cadb3f58c1f97c2364c" +"checksum autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6d640bee2da49f60a4068a7fae53acde8982514ab7bae8b8cea9e88cbcfd799" "checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" "checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" "checksum cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "11d43355396e872eefb45ce6342e4374ed7bc2b3a502d1b28e36d6e23c05d1f4" @@ -290,10 +299,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum lzma-rs 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9550ba35a4d6bb6be7f273bce93af3a3141c517bf7d7298763a7149e1bdb9af5" "checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" "checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" -"checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" +"checksum num-traits 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "d9c79c952a4a139f44a0fe205c4ee66ce239c0e6ce72cd935f5f7e2f717549dd" "checksum proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915" "checksum quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "cdd8e04bd9c52e0342b406469d494fcb033be4bdbe5c606016defbb1681411e1" -"checksum regex 1.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "559008764a17de49a3146b234641644ed37d118d1ef641a0bb573d146edc6ce0" +"checksum regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8f0a0bcab2fd7d1d7c54fa9eae6f43eddeb9ce2e7352f8518a814a4f65d60c58" "checksum regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "dcfd8681eebe297b81d98498869d4aae052137651ad7b96822f09ceb690d0a96" "checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7" "checksum serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)" = "aa5f7c20820475babd2c077c3ab5f8c77a31c15e16ea38687b4c02d3e48680f4" @@ -301,7 +310,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)" = "5a23aa71d4a4d43fdbfaac00eff68ba8a06a51759a89ac3304323e800c4dd40d" "checksum serde_json_v8 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "22de6b4971227e34df07cfa957decd3d40b0fcc4dde8c367779f98e4c08e3be0" "checksum swf-fixed 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3c575807f18641c5e079568b53630a46baf441da57caccd9ced9a9ee70f941" -"checksum swf-tree 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4176b789ee6dc0364726334b06b4d287689a618263496dc6e963fd00eb52ce48" +"checksum swf-tree 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c075cea0328cc5f6ee694bcd1c43534d1186a730d79258b10735f8f08e2f1baa" "checksum syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)" = "1825685f977249735d510a242a6727b46efe914bb67e38d30c071b1b72b1d5c2" "checksum test-generator 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9b26bb9ef026bbc1e5abab33e3299be7b31b73790c0980e225241d694ccd6f71" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" diff --git a/rs/Cargo.toml b/rs/Cargo.toml index 11afae5..cbe7570 100644 --- a/rs/Cargo.toml +++ b/rs/Cargo.toml @@ -26,10 +26,10 @@ lazy_static = "^1.3.0" lzma-rs = "^0.1.1" memchr = "^2.2.0" nom = "^4.2.3" -num-traits = "^0.2.6" -regex = "^1.1.5" +num-traits = "^0.2.7" +regex = "^1.1.6" serde_json = "^1.0.39" -swf-tree = "^0.6.0" +swf-tree = "^0.7.0" swf-fixed = "^0.1.4" [dev-dependencies] diff --git a/rs/src/parsers/tags.rs b/rs/src/parsers/tags.rs index 6de677a..8da040c 100644 --- a/rs/src/parsers/tags.rs +++ b/rs/src/parsers/tags.rs @@ -28,7 +28,7 @@ use crate::parsers::morph_shape::{MorphShapeVersion, parse_morph_shape}; use crate::parsers::movie::parse_tag_block_string; use crate::parsers::shape::{parse_shape, ShapeVersion}; use crate::parsers::sound::{audio_coding_format_from_id, is_uncompressed_audio_coding_format, parse_sound_info, sound_rate_from_id}; -use crate::parsers::text::{parse_csm_table_hint_bits, parse_font_alignment_zone, parse_font_layout, parse_grid_fitting_bits, parse_offset_glyphs, parse_text_alignment, parse_text_record_string, parse_text_renderer_bits}; +use crate::parsers::text::{parse_csm_table_hint_bits, parse_font_alignment_zone, parse_font_layout, parse_grid_fitting_bits, parse_offset_glyphs, parse_text_alignment, parse_text_record_string, parse_text_renderer_bits, FontVersion}; use crate::state::ParseState; fn parse_tag_header(input: &[u8]) -> IResult<&[u8], ast::TagHeader> { @@ -376,7 +376,7 @@ pub fn parse_define_edit_text(input: &[u8]) -> IResult<&[u8], ast::tags::DefineD font_size: font_size, color: color, max_length: max_length, - align: Some(align), + align: align, margin_left: margin_left, margin_right: margin_right, indent: indent, @@ -392,17 +392,15 @@ pub fn parse_define_font(_input: &[u8]) -> IResult<&[u8], ast::tags::DefineFont> } pub fn parse_define_font2(input: &[u8]) -> IResult<&[u8], ast::tags::DefineFont> { - // TODO: Add a flag to signal that this defineFont comes from `DefineFont2` (to support proper glyph scaling) - parse_define_font_any(input) + parse_define_font_any(input, FontVersion::Font2) } pub fn parse_define_font3(input: &[u8]) -> IResult<&[u8], ast::tags::DefineFont> { - // TODO: Add a flag to signal that this defineFont comes from `DefineFont3` (to support proper glyph scaling) - parse_define_font_any(input) + parse_define_font_any(input, FontVersion::Font3) } // https://github.com/mozilla/shumway/blob/16451d8836fa85f4b16eeda8b4bda2fa9e2b22b0/src/swf/parser/module.ts#L632 -pub fn parse_define_font_any(input: &[u8]) -> IResult<&[u8], ast::tags::DefineFont> { +fn parse_define_font_any(input: &[u8], version: FontVersion) -> IResult<&[u8], ast::tags::DefineFont> { do_parse!( input, id: parse_le_u16 >> @@ -415,6 +413,13 @@ pub fn parse_define_font_any(input: &[u8]) -> IResult<&[u8], ast::tags::DefineFo is_small: value!((flags & (1 << 5)) != 0) >> is_shift_jis: value!((flags & (1 << 6)) != 0) >> has_layout: value!((flags & (1 << 7)) != 0) >> + em_square_size: value!( + if version >= FontVersion::Font3 { + ast::text::EmSquareSize::EmSquareSize20480 + } else { + ast::text::EmSquareSize::EmSquareSize1024 + } + ) >> language: parse_language_code >> font_name: length_value!(parse_u8, parse_block_c_string) >> glyph_count: map!(parse_le_u16, |x| x as usize) >> @@ -425,6 +430,7 @@ pub fn parse_define_font_any(input: &[u8]) -> IResult<&[u8], ast::tags::DefineFo true => value!(ast::tags::DefineFont { id, font_name, is_bold, is_italic, is_ansi, is_small, is_shift_jis, + em_square_size, language, glyphs: Option::None, code_units: Option::None, @@ -443,6 +449,7 @@ pub fn parse_define_font_any(input: &[u8]) -> IResult<&[u8], ast::tags::DefineFo (ast::tags::DefineFont { id, font_name, is_bold, is_italic, is_ansi, is_small, is_shift_jis, + em_square_size, language, glyphs: Option::Some(glyphs), code_units: Option::Some(code_units), diff --git a/rs/src/parsers/text.rs b/rs/src/parsers/text.rs index e6c2bd8..1d50f82 100644 --- a/rs/src/parsers/text.rs +++ b/rs/src/parsers/text.rs @@ -11,6 +11,14 @@ use crate::parsers::basic_data_types::{ }; use crate::parsers::shape::parse_glyph; +#[derive(PartialEq, Eq, Clone, Copy, Ord, PartialOrd)] +pub enum FontVersion { + Font1, + Font2, + Font3, + Font4, +} + pub fn parse_grid_fitting_bits(input: (&[u8], usize)) -> IResult<(&[u8], usize), ast::text::GridFitting> { switch!( input, diff --git a/tests/movies b/tests/movies index eac68f0..3cbda7c 160000 --- a/tests/movies +++ b/tests/movies @@ -1 +1 @@ -Subproject commit eac68f05f3acaba3435a5eeac2e331e64a66a3b7 +Subproject commit 3cbda7c66ae9c1e8500c45ba53963123ea2cd106 diff --git a/tests/tags b/tests/tags index 7817fec..3e81bfd 160000 --- a/tests/tags +++ b/tests/tags @@ -1 +1 @@ -Subproject commit 7817fec602f4d80d9526ecb18045b1d772a9cf30 +Subproject commit 3e81bfd733f90fb857341c17634fa9fa4393dfcd diff --git a/ts/gulpfile.ts b/ts/gulpfile.ts index 571f40c..c8714ee 100755 --- a/ts/gulpfile.ts +++ b/ts/gulpfile.ts @@ -25,9 +25,9 @@ const project: Project = { configuration: { rules: { "whitespace": false, - } - } - } + }, + }, + }, }; const lib: LibTarget = { diff --git a/ts/package.json b/ts/package.json index 9d8dede..a76df07 100755 --- a/ts/package.json +++ b/ts/package.json @@ -35,7 +35,7 @@ "incident": "^3.2.0", "pako": "^1.0.10", "semantic-types": "^0.1.1", - "swf-tree": "^0.6.0" + "swf-tree": "^0.7.0" }, "devDependencies": { "@types/chai": "^4.1.7", @@ -45,7 +45,7 @@ "@types/node": "^11.13.10", "bson": "^4.0.1", "chai": "^4.2.0", - "gulp": "^4.0.1", + "gulp": "^4.0.2", "gulp-cli": "^2.2.0", "kryo": "^0.8.1", "minimist": "^1.2.0", diff --git a/ts/src/lib/parsers/tags.ts b/ts/src/lib/parsers/tags.ts index 099af86..ca729a1 100644 --- a/ts/src/lib/parsers/tags.ts +++ b/ts/src/lib/parsers/tags.ts @@ -35,6 +35,7 @@ import { SoundType } from "swf-tree/sound/sound-type"; import { SpriteTag } from "swf-tree/sprite-tag"; import { TagHeader } from "swf-tree/tag-header"; import { TextAlignment } from "swf-tree/text"; +import { EmSquareSize } from "swf-tree/text/em-square-size"; import { GlyphCountProvider, ParseContext } from "../parse-context"; import { parseBlockCString, @@ -67,6 +68,7 @@ import { parseSoundInfo, } from "./sound"; import { + FontVersion, parseCsmTableHintBits, parseFontAlignmentZone, parseFontLayout, @@ -82,7 +84,6 @@ import { * Read tags until the end of the stream or "end-of-tags". */ export function parseTagBlockString(byteStream: ReadableByteStream, context: ParseContext): Tag[] { - let old: UintSize = byteStream.bytePos; const tags: Tag[] = []; while (byteStream.available() >= 2) { // A null byte indicates the end-of-tags @@ -98,10 +99,6 @@ export function parseTagBlockString(byteStream: ReadableByteStream, context: Par } } const tag: Tag = parseTag(byteStream, context); - if (tag.type === TagType.DefineFont && tags.length === 3850) { - console.log(old, byteStream.bytePos); - } - old = byteStream.bytePos; tags.push(tag); } return tags; @@ -496,17 +493,15 @@ export function parseDefineFont(_byteStream: ReadableByteStream): tags.DefineFon } export function parseDefineFont2(byteStream: ReadableByteStream): tags.DefineFont { - // TODO: Add a flag to signal that this defineFont comes from `DefineFont2` (to support proper glyph scaling) - return parseDefineFontAny(byteStream); + return parseDefineFontAny(byteStream, FontVersion.Font2); } export function parseDefineFont3(byteStream: ReadableByteStream): tags.DefineFont { - // TODO: Add a flag to signal that this defineFont comes from `DefineFont3` (to support proper glyph scaling) - return parseDefineFontAny(byteStream); + return parseDefineFontAny(byteStream, FontVersion.Font3); } // https://github.com/mozilla/shumway/blob/16451d8836fa85f4b16eeda8b4bda2fa9e2b22b0/src/swf/parser/module.ts#L632 -export function parseDefineFontAny(byteStream: ReadableByteStream): tags.DefineFont { +function parseDefineFontAny(byteStream: ReadableByteStream, version: FontVersion): tags.DefineFont { const id: Uint16 = byteStream.readUint16LE(); const flags: Uint8 = byteStream.readUint8(); @@ -519,6 +514,8 @@ export function parseDefineFontAny(byteStream: ReadableByteStream): tags.DefineF const isShiftJis: boolean = (flags & (1 << 6)) !== 0; const hasLayout: boolean = (flags & (1 << 7)) !== 0; + const emSquareSize: EmSquareSize = version >= FontVersion.Font3 ? 20480 : 1024; + const language: LanguageCode = parseLanguageCode(byteStream); const fontNameLength: UintSize = byteStream.readUint8(); const fontName: string = parseBlockCString(byteStream, fontNameLength); @@ -539,6 +536,7 @@ export function parseDefineFontAny(byteStream: ReadableByteStream): tags.DefineF isAnsi, isSmall, isShiftJis, + emSquareSize, language, }; } @@ -558,6 +556,7 @@ export function parseDefineFontAny(byteStream: ReadableByteStream): tags.DefineF isAnsi, isSmall, isShiftJis, + emSquareSize, language, glyphs, codeUnits, diff --git a/ts/src/lib/parsers/text.ts b/ts/src/lib/parsers/text.ts index 8ed2f5c..ce651e3 100644 --- a/ts/src/lib/parsers/text.ts +++ b/ts/src/lib/parsers/text.ts @@ -5,6 +5,13 @@ import { Glyph, LanguageCode, Rect, StraightSRgba8, text } from "swf-tree"; import { parseRect, parseSRgb8, parseStraightSRgba8 } from "./basic-data-types"; import { parseGlyph } from "./shape"; +export enum FontVersion { + Font1 = 1, + Font2 = 2, + Font3 = 3, + Font4 = 4, +} + export function parseGridFittingBits(bitStream: ReadableBitStream): text.GridFitting { const code: UintSize = bitStream.readUint32Bits(3); switch (code) { diff --git a/ts/yarn.lock b/ts/yarn.lock index 56b09b9..d705ec2 100644 --- a/ts/yarn.lock +++ b/ts/yarn.lock @@ -52,10 +52,10 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.4.tgz#5977129431b8fe33471730d255ce8654ae1250b6" - integrity sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w== +"@babel/parser@^7.4.4", "@babel/parser@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872" + integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew== "@babel/template@^7.1.0": version "7.4.4" @@ -67,15 +67,15 @@ "@babel/types" "^7.4.4" "@babel/traverse@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.4.tgz#0776f038f6d78361860b6823887d4f3937133fe8" - integrity sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A== + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.5.tgz#4e92d1728fd2f1897dafdd321efbff92156c3216" + integrity sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A== dependencies: "@babel/code-frame" "^7.0.0" "@babel/generator" "^7.4.4" "@babel/helper-function-name" "^7.1.0" "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.4.4" + "@babel/parser" "^7.4.5" "@babel/types" "^7.4.4" debug "^4.1.0" globals "^11.1.0" @@ -1958,7 +1958,7 @@ gulp-typescript@^5.0.1: vinyl "^2.1.0" vinyl-fs "^3.0.3" -gulp@^4.0.1: +gulp@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/gulp/-/gulp-4.0.2.tgz#543651070fd0f6ab0a0650c6a3e6ff5a7cb09caa" integrity sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA== @@ -3999,10 +3999,10 @@ sver-compat@^1.5.0: es6-iterator "^2.0.1" es6-symbol "^3.1.1" -swf-tree@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/swf-tree/-/swf-tree-0.6.0.tgz#57362bdc070d4be1dd71ee6b43753fe33b1c275f" - integrity sha512-5ZAGao4LhVHQ74NieRZAYsMeabSpDkRQNLLQDCalmVMvzlCIAYQWzijm2DX9VZp8V4cjW97gEZxfPGpQ1N1ToQ== +swf-tree@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/swf-tree/-/swf-tree-0.7.0.tgz#76db2876b83832a761cfdf62130c3b764f0a82b1" + integrity sha512-kYOimbeZKTW6Bt/cfzLx1HnclWZjtgR5MCa+ulU1nQiXiFKRBNDQK0kr96OOTtbrI6DgzgG50+eE99qkr1DA5A== dependencies: incident "^3.2.0" kryo "^0.8.1" @@ -4304,9 +4304,9 @@ typescript@^3.5.0-dev.20190430: integrity sha512-8Os3bqTeHc6bf+bkPFL3O/pb09j8SbDa2LUBxTXWpZlcHUW9ziGuiEFiqMcArkbAjGLqEzshkl4zvxhb0gVPuQ== uglify-js@^3.1.4: - version "3.5.14" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.5.14.tgz#edf2a322c37fd7173a954fb35af199b52fb10946" - integrity sha512-dgyjIw8KFK6AyVl5vm2tEqPewv5TKGEiiVFLI1LbF+oHua/Njd8tZk3lIbF1AWU1rNdEg7scaceADb4zqCcWXg== + version "3.5.15" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.5.15.tgz#fe2b5378fd0b09e116864041437bff889105ce24" + integrity sha512-fe7aYFotptIddkwcm6YuA0HmknBZ52ZzOsUxZEdhhkSsz7RfjHDX2QDxwKTiv4JQ5t5NhfmpgAK+J7LiDhKSqg== dependencies: commander "~2.20.0" source-map "~0.6.1"